Merge "[510682] Adds check for Dynamic Web facet before version check "
diff --git a/.gitignore b/.gitignore
index 18530b3..9e1ed33 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,12 @@
+
+bin
+bin/
+*.class
+# Compiled Java Files #
+# Compiler Output Folder #
+*.ear
+*.jar
 # maven
+# Package Files #
 target/
+*.war
diff --git a/docs/org.eclipse.jst.ejb.doc.user/.cvsignore b/docs/org.eclipse.jst.ejb.doc.user/.cvsignore
new file mode 100644
index 0000000..758f3e3
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/.cvsignore
@@ -0,0 +1,3 @@
+build.xml
+org.eclipse.jst.ejb.doc.user_1.0.0.jar
+temp
\ No newline at end of file
diff --git a/docs/org.eclipse.jst.ejb.doc.user/.project b/docs/org.eclipse.jst.ejb.doc.user/.project
new file mode 100644
index 0000000..8435ece
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/.project
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.jst.ejb.doc.user</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<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>
+	</natures>
+</projectDescription>
diff --git a/docs/org.eclipse.jst.ejb.doc.user/DocBuild.xml b/docs/org.eclipse.jst.ejb.doc.user/DocBuild.xml
new file mode 100644
index 0000000..931daff
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/DocBuild.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!-- 
+
+	This script build the Help plug-in by transforming the DITA source files into HTML.
+	
+	To use this script, you must install DITA-OT on your machine in the directory
+	defined by the dita.ot.dir property.
+	
+	Run the default target after you edit the DITA source files to regenerate the HTML.
+	
+	To customize this script for other Help plug-ins, modify the value of the args.input property
+	to be the DITA map file for the plug-in.
+	
+	NOTE: This script assumes that links to sibling Help plug-ins have scope="peer", otherwise the
+	output directory structure will be shifted incorrectly.
+	
+	NOTE: This script assumes that you hand code your plugin.xml file in myplugin.xml. This file
+	will be copied over the generated plugin.xml which is currently not being generated correctly
+	by DITA-OT.
+	
+	ChangeLog:
+	2006-04-05 Arthur Ryman <ryman@ca.ibm.com>
+	- Created.
+	2008-01-09 Kate Price <katep@ca.ibm.com>
+	- modified for new DITA-OT version
+	2008-05-05 Kate Price <katep@ca.ibm.com>
+	- modified to add generation of pre-built help index. 
+	- Must delete /index folder before running build
+-->
+<project name="eclipsehelp" default="all">
+
+	<property name="dita.ot.dir" location="C:/DITA-OT1.2.2" />
+
+	<path id="dost.class.path">
+		<pathelement location="${dita.ot.dir}${file.separator}lib${file.separator}dost.jar" />
+	</path>
+
+	<taskdef name="integrate" classname="org.dita.dost.platform.IntegratorTask">
+		<classpath refid="dost.class.path" />
+	</taskdef>
+	<target name="all" depends="integrate, eclipsehelp">
+	</target>
+	<target name="integrate">
+		<integrate ditadir="${dita.ot.dir}" />
+	</target>
+
+	<!-- revise below here -->
+	<target name="eclipsehelp">
+		<ant antfile="${dita.ot.dir}${file.separator}conductor.xml" target="init" dir="${dita.ot.dir}">
+			<property name="args.copycss" value="no" />
+			<property name="args.csspath" value="../org.eclipse.wst.doc.user" />
+			<property name="args.eclipse.provider" value="Eclipse.org" />
+			<property name="args.eclipse.version" value="3.6.0" />
+			<property name="args.input" location="ejb_toc.ditamap" /> 
+			<property name="clean.temp" value="true" />
+			<property name="dita.extname" value=".dita" />
+			<property name="dita.temp.dir" location="temp" />
+			<property name="output.dir" location="" />
+			<property name="transtype" value="eclipsehelp" />
+		</ant>
+		<copy file="myplugin.xml" tofile="plugin.xml" overwrite="yes" />
+	</target>
+	<target name="build.index" description="Builds search index for the plug-in" if="eclipse.running">
+	     <help.buildHelpIndex manifest="plugin.xml" destination="."/>
+	</target>
+
+</project>
diff --git a/docs/org.eclipse.jst.ejb.doc.user/META-INF/MANIFEST.MF b/docs/org.eclipse.jst.ejb.doc.user/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..7667d3b
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/META-INF/MANIFEST.MF
@@ -0,0 +1,8 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Plugin.name
+Bundle-SymbolicName: org.eclipse.jst.ejb.doc.user; singleton:=true
+Bundle-Version: 1.1.301.qualifier
+Bundle-Vendor: %Bundle-Vendor
+Bundle-Localization: plugin
+Bundle-ActivationPolicy: lazy
diff --git a/docs/org.eclipse.wst.web.ui.infopop/about.html b/docs/org.eclipse.jst.ejb.doc.user/about.html
similarity index 100%
copy from docs/org.eclipse.wst.web.ui.infopop/about.html
copy to docs/org.eclipse.jst.ejb.doc.user/about.html
diff --git a/docs/org.eclipse.jst.ejb.doc.user/build.properties b/docs/org.eclipse.jst.ejb.doc.user/build.properties
new file mode 100644
index 0000000..356e8f3
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/build.properties
@@ -0,0 +1,15 @@
+bin.includes = ejb_toc.xml,\
+			   org.eclipse.jst.ejb.doc.userindex.xml,\
+               images/,\
+               plugin.xml,\
+               topics/*.htm*,\
+               about.html,\
+               index/,\
+               META-INF/,\
+               plugin.properties
+src.includes = *.maplist,\
+               *.ditamap,\
+               topics/*.dita
+bin.excludes = DocBuild.xml,\
+               myPlugin*.xml
+               
\ No newline at end of file
diff --git a/docs/org.eclipse.jst.ejb.doc.user/ejb_toc.ditamap b/docs/org.eclipse.jst.ejb.doc.user/ejb_toc.ditamap
new file mode 100644
index 0000000..abe1414
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/ejb_toc.ditamap
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>

+<!--Arbortext, Inc., 1988-2006, v.4002-->

+<!DOCTYPE map PUBLIC "-//OASIS//DTD DITA Map//EN"

+ "map.dtd">

+<map id="ejbtoc" title="Developing EJB applications">

+<topicref href="topics/ceover.dita" locktitle="yes" navtitle="Developing EJB applications">

+<topicref href="topics/ejbarch.dita" navtitle="EJB 3.0 architecture" type="concept">

+<topicref href="topics/cpojosandee5.dita" navtitle="POJOs (Plain old Java objects)">

+</topicref>

+<topicref href="topics/cejb3vejb21.dita" navtitle="EJB 3.0 versus EJB 2.1">

+</topicref>

+</topicref>

+<topicref href="topics/cejb3.dita" navtitle="Developing EJB 3.0 Applications">

+<topicref href="topics/tecrtpro.dita" navtitle="Creating EJB projects">

+<topicref href="topics/tcreatingsessbeans3.dita" navtitle="Creating a session bean">

+</topicref>

+<topicref href="topics/tcreatinmessbeans3.dita" navtitle="Creating a message-driven bean">

+</topicref>

+</topicref>

+<topicref href="topics/ccontentassist3.dita" navtitle="Content assist and EJB 3.0">

+</topicref>

+</topicref>

+<topicref href="topics/cearch.dita" navtitle="EJB 2.x architecture" type="concept">

+</topicref>

+<topicref href="topics/ceresrc.dita" navtitle="EJB 2.x development resources"

+type="concept">

+<topicref href="topics/tecrtpro.dita" navtitle="Creating EJB projects" type="task">

+</topicref>

+<topicref href="topics/ceclientjars.dita" navtitle="EJB 2.x client JAR projects"

+type="concept"></topicref>

+<topicref href="topics/teimp.dita" navtitle="Importing EJB 2.x JAR files"

+type="task"></topicref>

+<topicref href="topics/teexp.dita" navtitle="Exporting EJB 2.x projects to EJB JAR files"

+type="task"></topicref>

+</topicref>

+<topicref href="topics/tecrte.dita" navtitle="Creating enterprise beans with XDoclet annotation support"

+type="task">

+<topicref href="topics/tesessb.dita" navtitle="Creating session beans with XDoclet annotation support">

+</topicref>

+<topicref href="topics/teentityb.dita" navtitle="Creating CMP entity beans with XDoclet annotation support">

+</topicref>

+<topicref href="topics/temessb.dita" navtitle="Creating message-driven beans with XDoclet annotation support"

+type="task"></topicref>

+<topicref href="topics/txdocletconf.dita" navtitle="Configuring XDoclet annotation support"

+type="task"></topicref>

+</topicref>

+</topicref>

+</map>

diff --git a/docs/org.eclipse.jst.ejb.doc.user/ejb_toc.xml b/docs/org.eclipse.jst.ejb.doc.user/ejb_toc.xml
new file mode 100644
index 0000000..e4595b9
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/ejb_toc.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<?NLS TYPE="org.eclipse.help.toc"?>
+
+<toc label="Developing EJB applications" topic="topics/ceover.html">
+<topic label="Developing EJB applications" href="topics/ceover.html">
+<topic label="EJB 3.0 architecture" href="topics/ejbarch.html">
+<topic label="POJOs (Plain old Java objects)" href="topics/cpojosandee5.html"/>
+<topic label="EJB 3.0 versus EJB 2.1" href="topics/cejb3vejb21.html"/>
+</topic>
+<topic label="Developing EJB 3.0 Applications" href="topics/cejb3.html">
+<topic label="Creating EJB projects" href="topics/tecrtpro.html">
+<topic label="Creating a session bean" href="topics/tcreatingsessbeans3.html"/>
+<topic label="Creating a message-driven bean" href="topics/tcreatinmessbeans3.html"/>
+</topic>
+<topic label="Content assist and EJB 3.0" href="topics/ccontentassist3.html"/>
+</topic>
+<topic label="EJB 2.x architecture" href="topics/cearch.html"/>
+<topic label="EJB 2.x development resources" href="topics/ceresrc.html">
+<topic label="Creating EJB projects" href="topics/tecrtpro.html"/>
+<topic label="EJB 2.x client JAR projects" href="topics/ceclientjars.html"/>
+<topic label="Importing EJB 2.x JAR files" href="topics/teimp.html"/>
+<topic label="Exporting EJB 2.x projects to EJB JAR files" href="topics/teexp.html"/>
+</topic>
+<topic label="Creating enterprise beans with XDoclet annotation support" href="topics/tecrte.html">
+<topic label="Creating session beans with XDoclet annotation support" href="topics/tesessb.html"/>
+<topic label="Creating CMP entity beans with XDoclet annotation support" href="topics/teentityb.html"/>
+<topic label="Creating message-driven beans with XDoclet annotation support" href="topics/temessb.html"/>
+<topic label="Configuring XDoclet annotation support" href="topics/txdocletconf.html"/>
+</topic>
+</topic>
+</toc>
diff --git a/docs/org.eclipse.jst.ejb.doc.user/images/contentAssist.gif b/docs/org.eclipse.jst.ejb.doc.user/images/contentAssist.gif
new file mode 100644
index 0000000..b960d06
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/images/contentAssist.gif
Binary files differ
diff --git a/docs/org.eclipse.jst.ejb.doc.user/images/errorquickfix.gif b/docs/org.eclipse.jst.ejb.doc.user/images/errorquickfix.gif
new file mode 100644
index 0000000..c51d5a5
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/images/errorquickfix.gif
Binary files differ
diff --git a/docs/org.eclipse.jst.ejb.doc.user/images/ycwin.gif b/docs/org.eclipse.jst.ejb.doc.user/images/ycwin.gif
new file mode 100644
index 0000000..895f9ca
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/images/ycwin.gif
Binary files differ
diff --git a/docs/org.eclipse.jst.ejb.doc.user/index/_k.cfs b/docs/org.eclipse.jst.ejb.doc.user/index/_k.cfs
new file mode 100644
index 0000000..5045ef2
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/index/_k.cfs
Binary files differ
diff --git a/docs/org.eclipse.jst.ejb.doc.user/index/deletable b/docs/org.eclipse.jst.ejb.doc.user/index/deletable
new file mode 100644
index 0000000..593f470
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/index/deletable
Binary files differ
diff --git a/docs/org.eclipse.jst.ejb.doc.user/index/indexed_contributions b/docs/org.eclipse.jst.ejb.doc.user/index/indexed_contributions
new file mode 100644
index 0000000..d3f5c45
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/index/indexed_contributions
@@ -0,0 +1,3 @@
+#This is a generated file; do not edit.

+#Wed Oct 08 16:00:22 EDT 2008

+org.eclipse.jst.ejb.doc.user=org.eclipse.jst.ejb.doc.user\n1.1.0.qualifier

diff --git a/docs/org.eclipse.jst.ejb.doc.user/index/indexed_dependencies b/docs/org.eclipse.jst.ejb.doc.user/index/indexed_dependencies
new file mode 100644
index 0000000..6964a6e
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/index/indexed_dependencies
@@ -0,0 +1,4 @@
+#This is a generated file; do not edit.

+#Wed Oct 08 16:00:22 EDT 2008

+lucene=1.9.1.v200803061811

+analyzer=org.eclipse.help.base\#3.3.100.v20080425?locale\=en

diff --git a/docs/org.eclipse.jst.ejb.doc.user/index/indexed_docs b/docs/org.eclipse.jst.ejb.doc.user/index/indexed_docs
new file mode 100644
index 0000000..2d14615
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/index/indexed_docs
@@ -0,0 +1,21 @@
+#This is a generated file; do not edit.

+#Wed Oct 08 16:00:22 EDT 2008

+/org.eclipse.jst.ejb.doc.user/topics/ceover.html=0

+/org.eclipse.jst.ejb.doc.user/topics/cejb3.html=0

+/org.eclipse.jst.ejb.doc.user/topics/cpojosandee5.html=0

+/org.eclipse.jst.ejb.doc.user/topics/cearch.html=0

+/org.eclipse.jst.ejb.doc.user/topics/tcreatingsessbeans3.html=0

+/org.eclipse.jst.ejb.doc.user/topics/tesessb.html=0

+/org.eclipse.jst.ejb.doc.user/topics/temessb.html=0

+/org.eclipse.jst.ejb.doc.user/topics/tcreatinmessbeans3.html=0

+/org.eclipse.jst.ejb.doc.user/topics/teexp.html=0

+/org.eclipse.jst.ejb.doc.user/topics/cejb3vejb21.html=0

+/org.eclipse.jst.ejb.doc.user/topics/ejbarch.html=0

+/org.eclipse.jst.ejb.doc.user/topics/teimp.html=0

+/org.eclipse.jst.ejb.doc.user/topics/txdocletconf.html=0

+/org.eclipse.jst.ejb.doc.user/topics/teentityb.html=0

+/org.eclipse.jst.ejb.doc.user/topics/tecrtpro.html=0

+/org.eclipse.jst.ejb.doc.user/topics/ceresrc.html=0

+/org.eclipse.jst.ejb.doc.user/topics/tecrte.html=0

+/org.eclipse.jst.ejb.doc.user/topics/ccontentassist3.html=0

+/org.eclipse.jst.ejb.doc.user/topics/ceclientjars.html=0

diff --git a/docs/org.eclipse.jst.ejb.doc.user/index/segments b/docs/org.eclipse.jst.ejb.doc.user/index/segments
new file mode 100644
index 0000000..b2cef8c
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/index/segments
Binary files differ
diff --git a/docs/org.eclipse.jst.ejb.doc.user/myplugin.xml b/docs/org.eclipse.jst.ejb.doc.user/myplugin.xml
new file mode 100644
index 0000000..dff811c
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/myplugin.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.6"?>
+<?NLS TYPE="org.eclipse.help.contexts"?>
+<!-- /*******************************************************************************
+ * Copyright (c) 2000, 2011 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/ -->
+
+
+<plugin>
+
+   <extension point="org.eclipse.help.toc">
+       <toc file="ejb_toc.xml" />
+       <index path="index/"/>
+   </extension>
+
+   <extension point="org.eclipse.help.index">
+		<index file="org.eclipse.jst.ejb.doc.userindex.xml"/>
+	</extension>
+ 
+</plugin>
\ No newline at end of file
diff --git a/docs/org.eclipse.jst.ejb.doc.user/org.eclipse.jst.ejb.doc.user.maplist b/docs/org.eclipse.jst.ejb.doc.user/org.eclipse.jst.ejb.doc.user.maplist
new file mode 100644
index 0000000..4085950
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/org.eclipse.jst.ejb.doc.user.maplist
@@ -0,0 +1,8 @@
+<maplist version="3.6.2">

+  <nav>

+    <map file="ejb_toc.ditamap"/>

+  </nav>

+  <link>

+    <map file="ejb_toc.ditamap"/>

+  </link>

+</maplist>

diff --git a/docs/org.eclipse.jst.ejb.doc.user/org.eclipse.jst.ejb.doc.userindex.xml b/docs/org.eclipse.jst.ejb.doc.user/org.eclipse.jst.ejb.doc.userindex.xml
new file mode 100644
index 0000000..b128bc2
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/org.eclipse.jst.ejb.doc.userindex.xml
@@ -0,0 +1,165 @@
+<?xml version="1.0" encoding="utf-8"?>
+<index>
+  <entry keyword="architecture">
+    <entry keyword="EJB 3.0">
+      <topic href="topics/ejbarch.html#ejbarch" title="EJB 3.0 architecture"/>
+    </entry>
+    <entry keyword="EJB 2.x">
+      <topic href="topics/cearch.html#cearch" title="EJB 2.x architecture"/>
+    </entry>
+  </entry>
+  <entry keyword="EJB 3.0">
+    <entry keyword="architecture">
+      <entry keyword="3.0">
+        <topic href="topics/ejbarch.html#ejbarch" title="EJB 3.0 architecture"/>
+      </entry>
+    </entry>
+    <entry keyword="entity bean">
+      <entry keyword="creating">
+        <topic href="topics/tcreatingentitybeans3.html#tcreateejbproj" title="Creating an EJB 3.0 entity bean"/>
+      </entry>
+    </entry>
+    <entry keyword="session bean">
+      <entry keyword="creating">
+        <topic href="topics/tcreatingsessbeans3.html#tsessbeanwiz" title="Creating a, EJB 3.0 session bean using the wizard"/>
+      </entry>
+    </entry>
+    <entry keyword="message-driven bean">
+      <entry keyword="creating">
+        <topic href="topics/tcreatinmessbeans3.html#tcreatingsessionbean" title="Creating a message-driven bean using the wizard"/>
+      </entry>
+    </entry>
+    <entry keyword="content assist">
+      <topic href="topics/ccontentassist3.html#cejb3" title="Content assist and EJB 3.0"/>
+    </entry>
+  </entry>
+  <entry keyword="Enterprise JavaBeans 3.0">
+    <topic href="topics/cpojosandee5.html#cejb3" title="Plain old Java objects"/>
+    <topic href="topics/cejb3vejb21.html#compareejb2" title="Differences between EJB 3.0 and EJB 2.1"/>
+    <topic href="topics/cejb3.html#cejb3" title="Developing EJB 3.0 Applications"/>
+  </entry>
+  <entry keyword="EJB">
+    <entry keyword="projects">
+      <entry keyword="creating">
+        <topic href="topics/tecrtpro.html#tecrtpro" title="Creating EJB projects"/>
+      </entry>
+    </entry>
+    <entry keyword="developing">
+      <entry keyword="applications">
+        <topic href="topics/ceover.html#ceover" title="EJB 2.x application development"/>
+      </entry>
+      <entry keyword="resources">
+        <topic href="topics/ceresrc.html#ceresrc" title="EJB 2.x development resources"/>
+      </entry>
+    </entry>
+    <entry keyword="architecture">
+      <entry keyword="2.x">
+        <topic href="topics/cearch.html#cearch" title="EJB 2.x architecture"/>
+      </entry>
+    </entry>
+    <entry keyword="client JAR projects">
+      <topic href="topics/ceclientjars.html#ceclientjars" title="EJB 2.x client JAR projects"/>
+    </entry>
+    <entry keyword="importing JAR files">
+      <topic href="topics/teimp.html#teimp" title="Importing EJB 2.x JAR files"/>
+    </entry>
+    <entry keyword="JAR files">
+      <entry keyword="exporting projects">
+        <topic href="topics/teexp.html#teexp" title="Exporting EJB 2.x projects to EJB JAR files"/>
+      </entry>
+    </entry>
+    <entry keyword="exporting projects">
+      <topic href="topics/teexp.html#teexp" title="Exporting EJB 2.x projects to EJB JAR files"/>
+    </entry>
+    <entry keyword="XDoclet annotation support">
+      <topic href="topics/tecrte.html#tecrte" title="Creating enterprise beans with XDoclet annotation support"/>
+    </entry>
+  </entry>
+  <entry keyword="Entity bean">
+    <entry keyword="EJB 3.0">
+      <entry keyword="creating">
+        <topic href="topics/tcreatingentitybeans3.html#tcreateejbproj" title="Creating an EJB 3.0 entity bean"/>
+      </entry>
+    </entry>
+  </entry>
+  <entry keyword="Session bean">
+    <entry keyword="EJB 3.0">
+      <entry keyword="creating">
+        <topic href="topics/tcreatingsessbeans3.html#tsessbeanwiz" title="Creating a, EJB 3.0 session bean using the wizard"/>
+      </entry>
+    </entry>
+  </entry>
+  <entry keyword="Message-driven bean">
+    <entry keyword="EJB 3.0">
+      <entry keyword="creating">
+        <topic href="topics/tcreatinmessbeans3.html#tcreatingsessionbean" title="Creating a message-driven bean using the wizard"/>
+      </entry>
+    </entry>
+  </entry>
+  <entry keyword="content assist">
+    <entry keyword="EJB 3.0">
+      <entry keyword="enhancements">
+        <topic href="topics/ccontentassist3.html#cejb3" title="Content assist and EJB 3.0"/>
+      </entry>
+    </entry>
+  </entry>
+  <entry keyword="Java EE 5">
+    <entry keyword="EJB 3.0">
+      <entry keyword="content assist">
+        <topic href="topics/ccontentassist3.html#cejb3" title="Content assist and EJB 3.0"/>
+      </entry>
+    </entry>
+  </entry>
+  <entry keyword="applications">
+    <entry keyword="EJB development">
+      <topic href="topics/ceover.html#ceover" title="EJB 2.x application development"/>
+    </entry>
+  </entry>
+  <entry keyword="resources">
+    <entry keyword="EJB development">
+      <topic href="topics/ceresrc.html#ceresrc" title="EJB 2.x development resources"/>
+    </entry>
+  </entry>
+  <entry keyword="JAR files">
+    <entry keyword="importing EJB">
+      <topic href="topics/teimp.html#teimp" title="Importing EJB 2.x JAR files"/>
+    </entry>
+  </entry>
+  <entry keyword="XDoclet annotation support">
+    <entry keyword="EJBs">
+      <topic href="topics/tecrte.html#tecrte" title="Creating enterprise beans with XDoclet annotation support"/>
+    </entry>
+    <entry keyword="session beans">
+      <topic href="topics/tesessb.html#tesessb" title="Creating session beans with XDoclet annotation support"/>
+    </entry>
+    <entry keyword="entity beans">
+      <topic href="topics/teentityb.html#temessb" title="Creating container-managed persistence (CMP) entity beans with XDoclet annotation support"/>
+    </entry>
+    <entry keyword="message-driven beans">
+      <topic href="topics/temessb.html#temessb" title="Creating message-driven beans with XDoclet annotation support"/>
+    </entry>
+    <entry keyword="configuring">
+      <topic href="topics/txdocletconf.html#configuringxdocletannotationsupport" title="Configuring XDoclet annotation support"/>
+    </entry>
+  </entry>
+  <entry keyword="session beans">
+    <entry keyword="XDoclet annotation support">
+      <topic href="topics/tesessb.html#tesessb" title="Creating session beans with XDoclet annotation support"/>
+    </entry>
+  </entry>
+  <entry keyword="CMP entity beans">
+    <entry keyword="XDoclet annotation support">
+      <topic href="topics/teentityb.html#temessb" title="Creating container-managed persistence (CMP) entity beans with XDoclet annotation support"/>
+    </entry>
+  </entry>
+  <entry keyword="message-driven beans">
+    <entry keyword="XDoclet annotation support">
+      <topic href="topics/temessb.html#temessb" title="Creating message-driven beans with XDoclet annotation support"/>
+    </entry>
+  </entry>
+  <entry keyword="Java annotation">
+    <entry keyword="XDoclet annotation support">
+      <topic href="topics/txdocletconf.html#configuringxdocletannotationsupport" title="Configuring XDoclet annotation support"/>
+    </entry>
+  </entry>
+</index>
\ No newline at end of file
diff --git a/docs/org.eclipse.jst.ejb.doc.user/plugin.properties b/docs/org.eclipse.jst.ejb.doc.user/plugin.properties
new file mode 100644
index 0000000..14ef51c
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/plugin.properties
@@ -0,0 +1,7 @@
+# NLS_MESSAGEFORMAT_VAR
+# ==============================================================================
+# Translation Instruction: section to be translated
+# ==============================================================================
+Plugin.name = EJB docs
+
+Bundle-Vendor = Eclipse Web Tools Platform
\ No newline at end of file
diff --git a/docs/org.eclipse.jst.ejb.doc.user/plugin.xml b/docs/org.eclipse.jst.ejb.doc.user/plugin.xml
new file mode 100644
index 0000000..dff811c
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/plugin.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.6"?>
+<?NLS TYPE="org.eclipse.help.contexts"?>
+<!-- /*******************************************************************************
+ * Copyright (c) 2000, 2011 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/ -->
+
+
+<plugin>
+
+   <extension point="org.eclipse.help.toc">
+       <toc file="ejb_toc.xml" />
+       <index path="index/"/>
+   </extension>
+
+   <extension point="org.eclipse.help.index">
+		<index file="org.eclipse.jst.ejb.doc.userindex.xml"/>
+	</extension>
+ 
+</plugin>
\ No newline at end of file
diff --git a/docs/org.eclipse.jst.ejb.doc.user/pom.xml b/docs/org.eclipse.jst.ejb.doc.user/pom.xml
new file mode 100644
index 0000000..75808fe
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/pom.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Copyright (c) 2012, 2013 Eclipse Foundation and others.
+  All rights reserved. This program and the accompanying materials
+  are made available under the terms of the Eclipse Distribution License v1.0
+  which accompanies this distribution, and is available at
+  http://www.eclipse.org/org/documents/edl-v10.php
+ 
+  Contributors:
+    Thanh Ha (Eclipse Foundation) - initial implementation
+-->
+
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.eclipse.webtools.javaee</groupId>
+    <artifactId>javaee.docs</artifactId>
+    <version>3.6.0-SNAPSHOT</version>
+  </parent>
+
+  <groupId>org.eclipse.webtools.ejb</groupId>
+  <artifactId>org.eclipse.jst.ejb.doc.user</artifactId>
+  <version>1.1.301-SNAPSHOT</version>
+  <packaging>eclipse-plugin</packaging>
+</project>
diff --git a/docs/org.eclipse.jst.ejb.doc.user/topics/ccontentassist3.dita b/docs/org.eclipse.jst.ejb.doc.user/topics/ccontentassist3.dita
new file mode 100644
index 0000000..2b0c692
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/topics/ccontentassist3.dita
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<!--Arbortext, Inc., 1988-2009, v.4002-->

+<!DOCTYPE concept PUBLIC "-//OASIS//DTD DITA Concept//EN"

+ "concept.dtd">

+<concept id="cejb3" xml:lang="en-us">

+<title>Content assist and EJB 3.1</title><?Pub Caret -1?>

+<shortdesc>The content assist tool is a feature of the workbench.

+You can type code in your <tm tmclass="special"

+tmowner="Sun Microsystems, Inc." tmtype="tm" trademark="Java">Java</tm> editor

+and the content assist tool recommends possibilities to complete your

+code.</shortdesc>

+<prolog><metadata>

+<keywords><indexterm>content assist<indexterm>EJB 3.0<indexterm>enhancements</indexterm></indexterm></indexterm>

+<indexterm>EJB 3.0<indexterm>content assist</indexterm></indexterm>

+<indexterm>Java EE 5<indexterm>EJB 3.0<indexterm>content assist</indexterm></indexterm></indexterm>

+</keywords>

+</metadata></prolog>

+<conbody>

+<p>With the introduction of <tm tmclass="special"

+tmowner="Sun Microsystems, Inc." tmtype="tm" trademark="Java">Java</tm> EE

+5, the content assist tool in the application development workbench

+has been enhanced. Content assist now recognizes EJB 3.0 structures,

+providing content assist content when the project targets a server

+that supports EJB 3.0 structures.</p>

+<p>Content assist template support also exists for some of the EJB

+3.0 annotations, such as @Resource, to provide an annotation with

+initial attribute values.</p>

+<fig><title>Content assist for an @Stateless</title>

+<image href="../images/contentAssist.gif" placement="break"></image>

+</fig>

+</conbody>

+</concept>

+<?Pub *0000001576?>

diff --git a/docs/org.eclipse.jst.ejb.doc.user/topics/ccontentassist3.html b/docs/org.eclipse.jst.ejb.doc.user/topics/ccontentassist3.html
new file mode 100644
index 0000000..0223f6c
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/topics/ccontentassist3.html
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html lang="en-us" xml:lang="en-us">
+<head>
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+<meta name="copyright" content="Copyright (c) 2000, 2011 IBM 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: IBM Corporation - initial API and implementation" />
+<meta name="DC.rights.owner" content="(C) Copyright 2000, 2011" />
+<meta content="public" name="security" />
+<meta content="index,follow" name="Robots" />
+<meta http-equiv="PICS-Label" content='(PICS-1.1 "http://www.icra.org/ratingsv02.html" l gen true r (cz 1 lz 1 nz 1 oz 1 vz 1) "http://www.rsac.org/ratingsv01.html" l gen true r (n 0 s 0 v 0 l 0) "http://www.classify.org/safesurf/" l gen true r (SS~~000 1))' />
+<meta content="concept" name="DC.Type" />
+<meta name="DC.Title" content="Content assist and EJB 3.1" />
+<meta name="abstract" content="The content assist tool is a feature of the workbench. You can type code in your Java editor and the content assist tool recommends possibilities to complete your code." />
+<meta name="description" content="The content assist tool is a feature of the workbench. You can type code in your Java editor and the content assist tool recommends possibilities to complete your code." />
+<meta content="content assist, EJB 3.0, enhancements, Java EE 5" name="DC.subject" />
+<meta content="content assist, EJB 3.0, enhancements, Java EE 5" name="keywords" />
+<meta scheme="URI" name="DC.Relation" content="../topics/cejb3.html" />
+<meta content="XHTML" name="DC.Format" />
+<meta content="cejb3" name="DC.Identifier" />
+<meta content="en-us" name="DC.Language" />
+<link href="../../org.eclipse.wst.doc.user/common.css" type="text/css" rel="stylesheet" />
+<title>Content assist and EJB 3.1</title>
+</head>
+<body id="cejb3"><a name="cejb3"><!-- --></a>
+
+
+<h1 class="topictitle1">Content assist and EJB 3.1</h1>
+
+
+
+<div><p>The content assist tool is a feature of the workbench.
+You can type code in your Java™ editor
+and the content assist tool recommends possibilities to complete your
+code.</p>
+
+<p>With the introduction of Java EE
+5, the content assist tool in the application development workbench
+has been enhanced. Content assist now recognizes EJB 3.0 structures,
+providing content assist content when the project targets a server
+that supports EJB 3.0 structures.</p>
+
+<p>Content assist template support also exists for some of the EJB
+3.0 annotations, such as @Resource, to provide an annotation with
+initial attribute values.</p>
+
+<div class="fignone"><span class="figcap">Figure 1. Content assist for an @Stateless</span>
+<br /><img src="../images/contentAssist.gif" /><br />
+</div>
+
+</div>
+
+<div>
+<div class="familylinks">
+<div class="parentlink"><strong>Parent topic:</strong> <a href="../topics/cejb3.html" title="You can use the workbench to develop and test enterprise beans that conform to the distributed component architecture defined in the Sun Microsystems Enterprise JavaBeans (EJB) 3.10 specification.">Developing EJB 3.1 Applications</a></div>
+</div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/org.eclipse.jst.ejb.doc.user/topics/cearch.dita b/docs/org.eclipse.jst.ejb.doc.user/topics/cearch.dita
new file mode 100644
index 0000000..32e6180
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/topics/cearch.dita
@@ -0,0 +1,154 @@
+<?xml version="1.0" encoding="utf-8"?>

+<!--Arbortext, Inc., 1988-2006, v.4002-->

+<!DOCTYPE concept PUBLIC "-//OASIS//DTD DITA Concept//EN"

+ "concept.dtd">

+<concept id="cearch" xml:lang="en-us">

+<title>EJB 2.x architecture</title>

+<shortdesc>This topic provides a high-level overview of the distributed component

+architecture defined in the Sun Microsystems Enterprise <tm tmclass="special"

+tmowner="Sun Microsystems, Inc." tmtype="tm" trademark="JavaBeans">JavaBeans</tm> (EJB)

+version 2.x architecture specification.</shortdesc>

+<prolog><metadata>

+<keywords><indexterm>architecture<indexterm>EJB 2.x</indexterm></indexterm>

+<indexterm>EJB<indexterm>architecture<indexterm>2.x</indexterm></indexterm></indexterm>

+</keywords>

+</metadata></prolog>

+<conbody>

+<p>The complete Enterprise <tm tmclass="special" tmowner="Sun Microsystems, Inc."

+tmtype="tm" trademark="JavaBeans">JavaBeans</tm> specifications and descriptions

+of the technology are available from the <xref format="html" href="http://java.sun.com/products/ejb/docs.html#specs"

+scope="external">java.sun.com<desc></desc></xref> Web site.</p>

+<p>Enterprise beans provide several benefits for application developers. They

+do the following: </p>

+<ul>

+<li>Allow you to build distributed applications by combining components developed

+using tools from different vendors. </li>

+<li>Make it easy to write applications. You do not have to deal with low-level

+details of transaction and state management, multithreading, resource pooling,

+and other complex low-level APIs. However, if necessary, expert programmers

+can still gain direct access to the low-level APIs.</li>

+<li>Are developed once and then deployed on multiple platforms without recompilation

+or source code modification. </li>

+<li>Offer compatibility between the EJB specification that governs the use

+of enterprise beans and other <tm tmclass="special" tmowner="Sun Microsystems, Inc."

+tmtype="tm" trademark="Java">Java</tm> APIs and CORBA. This also provides

+for interoperability between enterprise beans and non-Java applications.</li>

+</ul>

+<dl><dlentry>

+<dt><b>Enterprise beans</b></dt>

+<dd>An enterprise bean is a non-visual component of a distributed, transaction-oriented

+enterprise application. Enterprise beans are typically deployed in EJB containers

+and run on EJB servers. You can customize them by changing their deployment

+descriptors and you can assemble them with other beans to create new applications.

+There are three types of enterprise beans: session beans, entity beans, and

+message-driven beans. Session beans and message-driven beans are coarse-grained

+components designed to model business process while entity beans are used

+to model fine-grained data objects.<p> <ul>

+<li><b>Session beans</b>: Session beans are non-persistent enterprise beans.

+They can be stateful or stateless.<ul>

+<li><b>Stateful session beans</b>:  Act on behalf of a single client and maintain

+client-specific session information (called conversational state) across multiple

+method calls and transactions. They exist for the duration of a single client/server

+session.</li>

+<li><b>Stateless session beans</b>: Do not maintain any conversational state

+and are pooled by their container to handle multiple requests from multiple

+clients.</li>

+</ul></li>

+<li><b>Entity beans</b>: Entity beans are enterprise beans that contain persistent

+data and that can be saved in various persistent data stores. Each entity

+bean carries its own identity. Entity beans that manage their own persistence

+are called bean-managed persistence (BMP) entity beans. Entity beans that

+delegate their persistence to their EJB container are called container-managed

+persistence (CMP) entity beans.</li>

+<li><b>Message-driven beans</b>: Message-driven beans are enterprise beans

+that receive and process JMS messages. Unlike session or entity beans, message-driven

+beans have no interfaces. They can be accessed only through messaging and

+they do not maintain any conversational state.  Message-driven beans allow

+asynchronous communication between the queue and the listener, and provide

+separation between message processing and business logic.</li>

+</ul></p></dd>

+</dlentry></dl>

+<dl><dlentry>

+<dt><b>Remote client view</b></dt>

+<dd>The remote client view specification became available beginning with EJB

+1.1. The remote client view of an enterprise bean is location independent.

+A client running in the same JVM as a bean instance uses the same API to access

+the bean as a client running in a different JVM on the same or different machine.

+The remote client view consists of two interfaces<ul>

+<li><b>Remote interface</b>: The remote interface specifies the remote business

+methods that a client can call on an enterprise bean.</li>

+<li><b>Remote home interface</b>: The remote home interface specifies the

+methods used by remote clients for locating, creating, and removing instances

+of enterprise bean classes.</li>

+</ul></dd>

+</dlentry></dl>

+<dl><dlentry>

+<dt><b>Local client view</b></dt>

+<dd>The local client view specification is available in EJB 2.0 or later.

+Unlike the remote client view, the local client view of a bean is location

+dependent. Local client view access to an enterprise bean requires both the

+local client and the enterprise bean that provides the local client view to

+be in the same JVM. The local client view therefore does not provide the location

+transparency provided by the remote client view. Local interfaces and local

+home interfaces provide support for lightweight access from enterprise beans

+that are local clients. Session and entity beans can be tightly coupled with

+their clients, allowing access without the overhead typically associated with

+remote method calls. The local client view consists of two interfaces:<ul>

+<li><b>Local interface</b>: The local interface is a lightweight version of

+the remote interface, but for local clients. It includes business logic methods

+that can be called by a local client.</li>

+<li><b>Local home interface</b>: The local home interface specifies the methods

+used by local clients for locating, creating, and removing instances of enterprise

+bean classes.</li>

+</ul></dd>

+</dlentry><dlentry>

+<dt><b>Web service client view</b></dt>

+<dd>In the EJB 2.1 specification, the EJB architecture introduced the support

+for Web services. A client for a session bean can be a Web service client.

+A Web service client can make use of the Web service client view of a stateless

+session bean, which has a corresponding service endpoint interface.<dl><dlentry>

+<dt><b>Service endpoint interface</b></dt>

+<dd>The service endpoint interface for a stateless session bean exposes the

+functionality of the session bean as a Web service endpoint. The Web Service

+Description Language (WSDL) document for a Web service describes the Web service

+as a set of endpoints operating on messages. A WSDL document can include the

+service endpoint interface of a stateless session bean as one of its endpoints.

+An existing stateless session bean can be modified to include a Web service

+client view, or a service endpoint interface can be mapped from an existing

+WSDL to provide the correct interface.<p>A Web service client view is independent

+of location and can be accessed through remote calls.</p></dd>

+</dlentry></dl></dd>

+</dlentry></dl>

+<dl><dlentry>

+<dt><b>EJB client JAR file</b></dt>

+<dd>An EJB client JAR file is an optional JAR file that can contain the client

+interfaces that a client program needs to use and the client views of the

+enterprise beans that are contained in the EJB JAR file. If you decide not

+to create an EJB client JAR file for an EJB module, all of the client interface

+classes will be in the EJB JAR file. By default, the workbench creates EJB

+client JAR projects for each corresponding EJB project.</dd>

+</dlentry></dl>

+<dl><dlentry>

+<dt><b>EJB container</b></dt>

+<dd>An EJB container is a runtime environment that manages one or more enterprise

+beans. The EJB container manages the life cycles of enterprise bean objects,

+coordinates distributed transactions, and implements object security. Generally,

+each EJB container is provided by an EJB server and contains a set of enterprise

+beans that run on the server.</dd>

+</dlentry><dlentry>

+<dt><b>Deployment descriptor</b></dt>

+<dd>A deployment descriptor is an XML file packaged with the enterprise beans

+in an EJB JAR file or an EAR file. It contains metadata describing the contents

+and structure of the enterprise beans, and runtime transaction and security

+information for the EJB container.</dd>

+</dlentry><dlentry>

+<dt><b>EJB server</b></dt>

+<dd>An EJB server is a high-level process or application that provides a runtime

+environment to support the execution of server applications that use enterprise

+beans. An EJB server provides a JNDI-accessible naming service, manages and

+coordinates the allocation of resources to client applications, provides access

+to system resources, and provides a transaction service. An EJB server could

+be provided by, for example, a database or application server.</dd>

+</dlentry></dl>

+</conbody>

+</concept>

diff --git a/docs/org.eclipse.jst.ejb.doc.user/topics/cearch.html b/docs/org.eclipse.jst.ejb.doc.user/topics/cearch.html
new file mode 100644
index 0000000..0ce84cb
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/topics/cearch.html
@@ -0,0 +1,222 @@
+<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html lang="en-us" xml:lang="en-us">
+<head>
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+<meta name="copyright" content="Copyright (c) 2000, 2011 IBM 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: IBM Corporation - initial API and implementation" />
+<meta name="DC.rights.owner" content="(C) Copyright 2000, 2011" />
+<meta content="public" name="security" />
+<meta content="index,follow" name="Robots" />
+<meta http-equiv="PICS-Label" content='(PICS-1.1 "http://www.icra.org/ratingsv02.html" l gen true r (cz 1 lz 1 nz 1 oz 1 vz 1) "http://www.rsac.org/ratingsv01.html" l gen true r (n 0 s 0 v 0 l 0) "http://www.classify.org/safesurf/" l gen true r (SS~~000 1))' />
+<meta content="concept" name="DC.Type" />
+<meta name="DC.Title" content="EJB 2.x architecture" />
+<meta name="abstract" content="This topic provides a high-level overview of the distributed component architecture defined in the Sun Microsystems Enterprise JavaBeans (EJB) version 2.x architecture specification." />
+<meta name="description" content="This topic provides a high-level overview of the distributed component architecture defined in the Sun Microsystems Enterprise JavaBeans (EJB) version 2.x architecture specification." />
+<meta content="architecture, EJB 2.x, EJB, 2.x" name="DC.subject" />
+<meta content="architecture, EJB 2.x, EJB, 2.x" name="keywords" />
+<meta scheme="URI" name="DC.Relation" content="../topics/ceover.html" />
+<meta content="XHTML" name="DC.Format" />
+<meta content="cearch" name="DC.Identifier" />
+<meta content="en-us" name="DC.Language" />
+<link href="../../org.eclipse.wst.doc.user/common.css" type="text/css" rel="stylesheet" />
+<title>EJB 2.x architecture</title>
+</head>
+<body id="cearch"><a name="cearch"><!-- --></a>
+
+
+<h1 class="topictitle1">EJB 2.x architecture</h1>
+
+
+
+<div><p>This topic provides a high-level overview of the distributed component
+architecture defined in the Sun Microsystems Enterprise JavaBeans™ (EJB)
+version 2.x architecture specification.</p>
+
+<p>The complete Enterprise JavaBeans specifications and descriptions
+of the technology are available from the <a href="http://java.sun.com/products/ejb/docs.html#specs" target="_blank" title="">java.sun.com</a> Web site.</p>
+
+<p>Enterprise beans provide several benefits for application developers. They
+do the following: </p>
+
+<ul>
+<li>Allow you to build distributed applications by combining components developed
+using tools from different vendors. </li>
+
+<li>Make it easy to write applications. You do not have to deal with low-level
+details of transaction and state management, multithreading, resource pooling,
+and other complex low-level APIs. However, if necessary, expert programmers
+can still gain direct access to the low-level APIs.</li>
+
+<li>Are developed once and then deployed on multiple platforms without recompilation
+or source code modification. </li>
+
+<li>Offer compatibility between the EJB specification that governs the use
+of enterprise beans and other Java™ APIs and CORBA. This also provides
+for interoperability between enterprise beans and non-Java applications.</li>
+
+</ul>
+
+<dl>
+<dt class="dlterm"><strong>Enterprise beans</strong></dt>
+
+<dd>An enterprise bean is a non-visual component of a distributed, transaction-oriented
+enterprise application. Enterprise beans are typically deployed in EJB containers
+and run on EJB servers. You can customize them by changing their deployment
+descriptors and you can assemble them with other beans to create new applications.
+There are three types of enterprise beans: session beans, entity beans, and
+message-driven beans. Session beans and message-driven beans are coarse-grained
+components designed to model business process while entity beans are used
+to model fine-grained data objects.<div class="p"> <ul>
+<li><strong>Session beans</strong>: Session beans are non-persistent enterprise beans.
+They can be stateful or stateless.<ul>
+<li><strong>Stateful session beans</strong>:  Act on behalf of a single client and maintain
+client-specific session information (called conversational state) across multiple
+method calls and transactions. They exist for the duration of a single client/server
+session.</li>
+
+<li><strong>Stateless session beans</strong>: Do not maintain any conversational state
+and are pooled by their container to handle multiple requests from multiple
+clients.</li>
+
+</ul>
+</li>
+
+<li><strong>Entity beans</strong>: Entity beans are enterprise beans that contain persistent
+data and that can be saved in various persistent data stores. Each entity
+bean carries its own identity. Entity beans that manage their own persistence
+are called bean-managed persistence (BMP) entity beans. Entity beans that
+delegate their persistence to their EJB container are called container-managed
+persistence (CMP) entity beans.</li>
+
+<li><strong>Message-driven beans</strong>: Message-driven beans are enterprise beans
+that receive and process JMS messages. Unlike session or entity beans, message-driven
+beans have no interfaces. They can be accessed only through messaging and
+they do not maintain any conversational state.  Message-driven beans allow
+asynchronous communication between the queue and the listener, and provide
+separation between message processing and business logic.</li>
+
+</ul>
+</div>
+</dd>
+
+</dl>
+
+<dl>
+<dt class="dlterm"><strong>Remote client view</strong></dt>
+
+<dd>The remote client view specification became available beginning with EJB
+1.1. The remote client view of an enterprise bean is location independent.
+A client running in the same JVM as a bean instance uses the same API to access
+the bean as a client running in a different JVM on the same or different machine.
+The remote client view consists of two interfaces<ul>
+<li><strong>Remote interface</strong>: The remote interface specifies the remote business
+methods that a client can call on an enterprise bean.</li>
+
+<li><strong>Remote home interface</strong>: The remote home interface specifies the
+methods used by remote clients for locating, creating, and removing instances
+of enterprise bean classes.</li>
+
+</ul>
+</dd>
+
+</dl>
+
+<dl>
+<dt class="dlterm"><strong>Local client view</strong></dt>
+
+<dd>The local client view specification is available in EJB 2.0 or later.
+Unlike the remote client view, the local client view of a bean is location
+dependent. Local client view access to an enterprise bean requires both the
+local client and the enterprise bean that provides the local client view to
+be in the same JVM. The local client view therefore does not provide the location
+transparency provided by the remote client view. Local interfaces and local
+home interfaces provide support for lightweight access from enterprise beans
+that are local clients. Session and entity beans can be tightly coupled with
+their clients, allowing access without the overhead typically associated with
+remote method calls. The local client view consists of two interfaces:<ul>
+<li><strong>Local interface</strong>: The local interface is a lightweight version of
+the remote interface, but for local clients. It includes business logic methods
+that can be called by a local client.</li>
+
+<li><strong>Local home interface</strong>: The local home interface specifies the methods
+used by local clients for locating, creating, and removing instances of enterprise
+bean classes.</li>
+
+</ul>
+</dd>
+
+
+<dt class="dlterm"><strong>Web service client view</strong></dt>
+
+<dd>In the EJB 2.1 specification, the EJB architecture introduced the support
+for Web services. A client for a session bean can be a Web service client.
+A Web service client can make use of the Web service client view of a stateless
+session bean, which has a corresponding service endpoint interface.<dl>
+<dt class="dlterm"><strong>Service endpoint interface</strong></dt>
+
+<dd>The service endpoint interface for a stateless session bean exposes the
+functionality of the session bean as a Web service endpoint. The Web Service
+Description Language (WSDL) document for a Web service describes the Web service
+as a set of endpoints operating on messages. A WSDL document can include the
+service endpoint interface of a stateless session bean as one of its endpoints.
+An existing stateless session bean can be modified to include a Web service
+client view, or a service endpoint interface can be mapped from an existing
+WSDL to provide the correct interface.<p>A Web service client view is independent
+of location and can be accessed through remote calls.</p>
+</dd>
+
+</dl>
+</dd>
+
+</dl>
+
+<dl>
+<dt class="dlterm"><strong>EJB client JAR file</strong></dt>
+
+<dd>An EJB client JAR file is an optional JAR file that can contain the client
+interfaces that a client program needs to use and the client views of the
+enterprise beans that are contained in the EJB JAR file. If you decide not
+to create an EJB client JAR file for an EJB module, all of the client interface
+classes will be in the EJB JAR file. By default, the workbench creates EJB
+client JAR projects for each corresponding EJB project.</dd>
+
+</dl>
+
+<dl>
+<dt class="dlterm"><strong>EJB container</strong></dt>
+
+<dd>An EJB container is a runtime environment that manages one or more enterprise
+beans. The EJB container manages the life cycles of enterprise bean objects,
+coordinates distributed transactions, and implements object security. Generally,
+each EJB container is provided by an EJB server and contains a set of enterprise
+beans that run on the server.</dd>
+
+
+<dt class="dlterm"><strong>Deployment descriptor</strong></dt>
+
+<dd>A deployment descriptor is an XML file packaged with the enterprise beans
+in an EJB JAR file or an EAR file. It contains metadata describing the contents
+and structure of the enterprise beans, and runtime transaction and security
+information for the EJB container.</dd>
+
+
+<dt class="dlterm"><strong>EJB server</strong></dt>
+
+<dd>An EJB server is a high-level process or application that provides a runtime
+environment to support the execution of server applications that use enterprise
+beans. An EJB server provides a JNDI-accessible naming service, manages and
+coordinates the allocation of resources to client applications, provides access
+to system resources, and provides a transaction service. An EJB server could
+be provided by, for example, a database or application server.</dd>
+
+</dl>
+
+</div>
+
+<div>
+<div class="familylinks">
+<div class="parentlink"><strong>Parent topic:</strong> <a href="../topics/ceover.html" title="The workbench provides a specialized environment that you can use to develop and test enterprise beans that conform to the distributed component architecture defined in the Sun Microsystems Enterprise JavaBeans (EJB) version specification. This product supports the Enterprise JavaBeans 1.1, 2.0, 2.1, and 3.0 specification levels.">EJB 2.x application development</a></div>
+</div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/org.eclipse.jst.ejb.doc.user/topics/ceclientjars.dita b/docs/org.eclipse.jst.ejb.doc.user/topics/ceclientjars.dita
new file mode 100644
index 0000000..ced90d2
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/topics/ceclientjars.dita
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>

+<!--Arbortext, Inc., 1988-2006, v.4002-->

+<!DOCTYPE concept PUBLIC "-//OASIS//DTD DITA Concept//EN"

+ "concept.dtd">

+<concept id="ceclientjars" xml:lang="en-us">

+<title>EJB 2.x client JAR projects</title>

+<shortdesc>An EJB client JAR project contains all the class files that a client

+program needs to use the client view of the enterprise beans that are contained

+in the EJB module.</shortdesc>

+<prolog><metadata>

+<keywords><indexterm>EJB<indexterm>client JAR projects</indexterm></indexterm>

+</keywords>

+</metadata></prolog>

+<conbody>

+<p>With the EJB tooling, you can create an EJB project with a corresponding

+EJB client JAR project. The EJB project will depend on the EJB client JAR

+project. The EJB client JAR project contains all necessary classes for a client

+of the enterprise beans, including all interface classes, key classes, and

+supporting classes. Because these classes are not duplicated in the EJB project,

+the EJB project depends on its EJB client JAR project. Any project that has

+a reference to an enterprise bean in the EJB project will need a reference

+to the EJB client JAR project. If the EJB client JAR project is in another

+enterprise application, the EJB client JAR file must be added to the referencing

+EAR file as a utility JAR file. </p>

+<p>After the EJB client JAR project is created, it is up to you to add any

+necessary value objects to this project that are needed by the home or component

+interfaces. If the objects are not present, compilation errors will result. </p>

+<p><b>EJB client JAR files</b></p>

+<p>EJB client projects are exported as EJB client JAR files when the application

+is exported. The EJB client JAR file is specified in the deployment descriptor

+of the EJB JAR file using the optional <codeph>ejb-client-jar</codeph> element.

+The value of the <codeph>ejb-client-jar</codeph> element is the path name

+specifying the location of the EJB client JAR file in the containing Java

+EE Enterprise Application Archive (.ear) file. The value of the path name

+is a URI relative to the EJB JAR file within the application. <note>The relative

+URI path for the EJB client JAR file should be the same in all applications

+that the EJB project belongs to.</note></p>

+<p>When you create an EJB client JAR project for an EJB project, the EJB client

+JAR file is added to the containing enterprise application as a project utility

+JAR. The reference to this EJB client JAR file cannot be removed from the

+enterprise application as long as the EJB project is defined as a module for

+the application.</p>

+<note conref="teexp.dita#teexp/exportEJBClientJAR"></note>

+</conbody>

+</concept>

diff --git a/docs/org.eclipse.jst.ejb.doc.user/topics/ceclientjars.html b/docs/org.eclipse.jst.ejb.doc.user/topics/ceclientjars.html
new file mode 100644
index 0000000..9142e44
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/topics/ceclientjars.html
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html lang="en-us" xml:lang="en-us">
+<head>
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+<meta name="copyright" content="Copyright (c) 2000, 2011 IBM 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: IBM Corporation - initial API and implementation" />
+<meta name="DC.rights.owner" content="(C) Copyright 2000, 2011" />
+<meta content="public" name="security" />
+<meta content="index,follow" name="Robots" />
+<meta http-equiv="PICS-Label" content='(PICS-1.1 "http://www.icra.org/ratingsv02.html" l gen true r (cz 1 lz 1 nz 1 oz 1 vz 1) "http://www.rsac.org/ratingsv01.html" l gen true r (n 0 s 0 v 0 l 0) "http://www.classify.org/safesurf/" l gen true r (SS~~000 1))' />
+<meta content="concept" name="DC.Type" />
+<meta name="DC.Title" content="EJB 2.x client JAR projects" />
+<meta name="abstract" content="An EJB client JAR project contains all the class files that a client program needs to use the client view of the enterprise beans that are contained in the EJB module." />
+<meta name="description" content="An EJB client JAR project contains all the class files that a client program needs to use the client view of the enterprise beans that are contained in the EJB module." />
+<meta content="EJB, client JAR projects" name="DC.subject" />
+<meta content="EJB, client JAR projects" name="keywords" />
+<meta scheme="URI" name="DC.Relation" content="../topics/ceresrc.html" />
+<meta content="XHTML" name="DC.Format" />
+<meta content="ceclientjars" name="DC.Identifier" />
+<meta content="en-us" name="DC.Language" />
+<link href="../../org.eclipse.wst.doc.user/common.css" type="text/css" rel="stylesheet" />
+<title>EJB 2.x client JAR projects</title>
+</head>
+<body id="ceclientjars"><a name="ceclientjars"><!-- --></a>
+
+
+<h1 class="topictitle1">EJB 2.x client JAR projects</h1>
+
+
+
+<div><p>An EJB client JAR project contains all the class files that a client
+program needs to use the client view of the enterprise beans that are contained
+in the EJB module.</p>
+
+<p>With the EJB tooling, you can create an EJB project with a corresponding
+EJB client JAR project. The EJB project will depend on the EJB client JAR
+project. The EJB client JAR project contains all necessary classes for a client
+of the enterprise beans, including all interface classes, key classes, and
+supporting classes. Because these classes are not duplicated in the EJB project,
+the EJB project depends on its EJB client JAR project. Any project that has
+a reference to an enterprise bean in the EJB project will need a reference
+to the EJB client JAR project. If the EJB client JAR project is in another
+enterprise application, the EJB client JAR file must be added to the referencing
+EAR file as a utility JAR file. </p>
+
+<p>After the EJB client JAR project is created, it is up to you to add any
+necessary value objects to this project that are needed by the home or component
+interfaces. If the objects are not present, compilation errors will result. </p>
+
+<p><strong>EJB client JAR files</strong></p>
+
+<div class="p">EJB client projects are exported as EJB client JAR files when the application
+is exported. The EJB client JAR file is specified in the deployment descriptor
+of the EJB JAR file using the optional <samp class="codeph">ejb-client-jar</samp> element.
+The value of the <samp class="codeph">ejb-client-jar</samp> element is the path name
+specifying the location of the EJB client JAR file in the containing Java
+EE Enterprise Application Archive (.ear) file. The value of the path name
+is a URI relative to the EJB JAR file within the application. <div class="note"><span class="notetitle">Note:</span> The relative
+URI path for the EJB client JAR file should be the same in all applications
+that the EJB project belongs to.</div>
+</div>
+
+<p>When you create an EJB client JAR project for an EJB project, the EJB client
+JAR file is added to the containing enterprise application as a project utility
+JAR. The reference to this EJB client JAR file cannot be removed from the
+enterprise application as long as the EJB project is defined as a module for
+the application.</p>
+
+<div class="important"><span class="importanttitle">Important:</span> If
+you use the Export EJB JAR file wizard to export an EJB project, the export
+wizard does not include an EJB project's associated EJB client JAR project.
+To include the EJB client JAR file, it is recommended that you export the
+enterprise application EAR file that contains the EJB project. The resulting
+EAR file will include any dependent EJB client JAR files as utility JAR files.
+Alternatively, you can export the EJB client JAR project separately as a JAR
+file.</div>
+
+</div>
+
+<div>
+<div class="familylinks">
+<div class="parentlink"><strong>Parent topic:</strong> <a href="../topics/ceresrc.html" title="This topic describes resources and development tools that are commonly used in EJB version 2.x development.">EJB 2.x development resources</a></div>
+</div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/org.eclipse.jst.ejb.doc.user/topics/cejb3.dita b/docs/org.eclipse.jst.ejb.doc.user/topics/cejb3.dita
new file mode 100644
index 0000000..076e9a7
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/topics/cejb3.dita
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<!--Arbortext, Inc., 1988-2009, v.4002-->

+<!DOCTYPE concept PUBLIC "-//OASIS//DTD DITA Concept//EN"

+ "concept.dtd">

+<?Pub Sty _display FontColor="red"?>

+<concept id="cejb3" xml:lang="en-us">

+<title>Developing EJB 3.1 Applications</title>

+<shortdesc>You can use the workbench to develop and test enterprise

+beans that conform to the distributed component architecture defined

+in the Sun Microsystems Enterprise JavaBeans (EJB) 3.10 specification.</shortdesc>

+<prolog><metadata>

+<keywords><indexterm>Enterprise JavaBeans 3.0</indexterm></keywords>

+</metadata></prolog>

+<conbody>

+<p> Using this specification, you can develop beans more simply than

+in the 2.1 standard. You can annotate your Java source code to provide

+information that was previously contained in XML deployment descriptors.

+Using <tm tmclass="special" tmowner="Sun Microsystems, Inc." tmtype="tm"

+trademark="Java">Java</tm> annotations allows you to create EJBs and <tm

+tmclass="special" tmowner="Sun Microsystems, Inc." tmtype="tm"

+trademark="Java">Java</tm> Persistence Architecture (JPA) beans quickly

+and easily from “plain old <tm tmclass="special"

+tmowner="Sun Microsystems, Inc." tmtype="tm" trademark="Java">Java</tm> objects

+(POJOs).  For EJBs, these can be created without implementing EnterpriseBean

+interfaces. </p>

+<p>This product supports the Enterprise JavaBeans 2.1 and 3.0 specification

+levels.  All of the EJB tools in the product are accessible from the <tm

+tmclass="special" tmowner="Sun Microsystems, Inc." tmtype="tm"

+trademark="Java">Java</tm> EE perspective in the workbench. You can

+create session beans (stateful or stateless) or message-driven beans,

+by simply specifying the component defining annotation in your POJO.

+ Additional configuration for your bean can be done by specifying

+additional annotations in the <tm tmclass="special"

+tmowner="Sun Microsystems, Inc." tmtype="tm" trademark="Java">Java</tm> class.

+The <tm tmclass="special" tmowner="Sun Microsystems, Inc." tmtype="tm"

+trademark="Java">Java</tm> editor provides validation, content assistance

+and QuickFixes for your EJB 3.0 annotations, as well as support for

+refactoring beans. For richer assistance with the EJB 3.0 annotations,

+you can use the Annotations view to add or delete annotations, and

+to modify the attribute values of annotations. Deployment descriptors

+for your EJB 3.0 modules are optional, but can be created for additional

+configuration.</p>

+<p><b>New in EJB 3.1 (JSR 318)</b></p>

+<p><ul>

+<li>Singleton beans (@Singleton)<ul>

+<li>Before EJB 3.1, there was no easy way to share data throughout

+the application; the EJB 3.1 Singleton is an application-wide singleton.</li>

+<li> Concurrency can be managed either by the container or by the

+Bean Developer</li>

+</ul></li>

+</ul></p>

+<p>Java EE 5 streamlines EJB development in the following ways: <ul>

+<li>Fewer required classes and interfaces<ul>

+<li>Home and object interfaces are no longer required – you need the

+business interface only</li>

+<li>No need to implement javax.ejb.SessionBean</li>

+<li>No need to declare checked exceptions</li>

+</ul></li>

+<li>Optional deployment descriptors<ul>

+<li>Annotations provide component definition and dependency injection</li>

+</ul></li>

+<li>Simple lookups<ul>

+<li>new EJBContext() interface method replaces JNDI calls</li>

+</ul></li>

+<li>Lightweight persistence for object-relational mapping<ul>

+<li>Entities are POJOs that provide an object-oriented view of the

+data stored in relational database</li>

+</ul></li>

+<li>New Interceptors class (new in Java EE 5)<ul>

+<li>Interceptors are objects that can intercept a call to a business

+method (to handle security for example)</li>

+<li>Similar in purpose and action to servlet filter or Web services

+handler</li>

+<li>Provide limited form of aspect-oriented programming</li>

+</ul></li>

+</ul></p><?Pub Caret -2?>

+<p>For further additional information on EJB 3.0, see the official

+specification: <xref href="http://jcp.org/en/jsr/detail?id=220"

+scope="external">JSR 220: Enterprise <tm tmclass="special"

+tmowner="Sun Microsystems, Inc." tmtype="tm" trademark="JavaBeans">JavaBeans</tm> 3.0 </xref></p>

+</conbody>

+</concept>

+<?Pub *0000004197?>

diff --git a/docs/org.eclipse.jst.ejb.doc.user/topics/cejb3.html b/docs/org.eclipse.jst.ejb.doc.user/topics/cejb3.html
new file mode 100644
index 0000000..ddb4e8a
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/topics/cejb3.html
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html lang="en-us" xml:lang="en-us">
+<head>
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+<meta name="copyright" content="Copyright (c) 2000, 2011 IBM 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: IBM Corporation - initial API and implementation" />
+<meta name="DC.rights.owner" content="(C) Copyright 2000, 2011" />
+<meta content="public" name="security" />
+<meta content="index,follow" name="Robots" />
+<meta http-equiv="PICS-Label" content='(PICS-1.1 "http://www.icra.org/ratingsv02.html" l gen true r (cz 1 lz 1 nz 1 oz 1 vz 1) "http://www.rsac.org/ratingsv01.html" l gen true r (n 0 s 0 v 0 l 0) "http://www.classify.org/safesurf/" l gen true r (SS~~000 1))' />
+<meta content="concept" name="DC.Type" />
+<meta name="DC.Title" content="Developing EJB 3.1 Applications" />
+<meta name="abstract" content="You can use the workbench to develop and test enterprise beans that conform to the distributed component architecture defined in the Sun Microsystems Enterprise JavaBeans (EJB) 3.10 specification." />
+<meta name="description" content="You can use the workbench to develop and test enterprise beans that conform to the distributed component architecture defined in the Sun Microsystems Enterprise JavaBeans (EJB) 3.10 specification." />
+<meta content="Enterprise JavaBeans 3.0" name="DC.subject" />
+<meta content="Enterprise JavaBeans 3.0" name="keywords" />
+<meta scheme="URI" name="DC.Relation" content="../topics/ceover.html" />
+<meta scheme="URI" name="DC.Relation" content="../topics/tecrtpro.html" />
+<meta scheme="URI" name="DC.Relation" content="../topics/ccontentassist3.html" />
+<meta content="XHTML" name="DC.Format" />
+<meta content="cejb3" name="DC.Identifier" />
+<meta content="en-us" name="DC.Language" />
+<link href="../../org.eclipse.wst.doc.user/common.css" type="text/css" rel="stylesheet" />
+<title>Developing EJB 3.1 Applications</title>
+</head>
+<body id="cejb3"><a name="cejb3"><!-- --></a>
+
+
+<h1 class="topictitle1">Developing EJB 3.1 Applications</h1>
+
+
+
+<div><p>You can use the workbench to develop and test enterprise
+beans that conform to the distributed component architecture defined
+in the Sun Microsystems Enterprise JavaBeans (EJB) 3.10 specification.</p>
+
+<p> Using this specification, you can develop beans more simply than
+in the 2.1 standard. You can annotate your Java source code to provide
+information that was previously contained in XML deployment descriptors.
+Using Java™ annotations allows you to create EJBs and Java Persistence Architecture (JPA) beans quickly
+and easily from “plain old Java objects
+(POJOs).  For EJBs, these can be created without implementing EnterpriseBean
+interfaces. </p>
+
+<p>This product supports the Enterprise JavaBeans 2.1 and 3.0 specification
+levels.  All of the EJB tools in the product are accessible from the Java EE perspective in the workbench. You can
+create session beans (stateful or stateless) or message-driven beans,
+by simply specifying the component defining annotation in your POJO.
+ Additional configuration for your bean can be done by specifying
+additional annotations in the Java class.
+The Java editor provides validation, content assistance
+and QuickFixes for your EJB 3.0 annotations, as well as support for
+refactoring beans. For richer assistance with the EJB 3.0 annotations,
+you can use the Annotations view to add or delete annotations, and
+to modify the attribute values of annotations. Deployment descriptors
+for your EJB 3.0 modules are optional, but can be created for additional
+configuration.</p>
+
+<p><strong>New in EJB 3.1 (JSR 318)</strong></p>
+
+<div class="p"><ul>
+<li>Singleton beans (@Singleton)<ul>
+<li>Before EJB 3.1, there was no easy way to share data throughout
+the application; the EJB 3.1 Singleton is an application-wide singleton.</li>
+
+<li> Concurrency can be managed either by the container or by the
+Bean Developer</li>
+
+</ul>
+</li>
+
+</ul>
+</div>
+
+<div class="p">Java EE 5 streamlines EJB development in the following ways: <ul>
+<li>Fewer required classes and interfaces<ul>
+<li>Home and object interfaces are no longer required – you need the
+business interface only</li>
+
+<li>No need to implement javax.ejb.SessionBean</li>
+
+<li>No need to declare checked exceptions</li>
+
+</ul>
+</li>
+
+<li>Optional deployment descriptors<ul>
+<li>Annotations provide component definition and dependency injection</li>
+
+</ul>
+</li>
+
+<li>Simple lookups<ul>
+<li>new EJBContext() interface method replaces JNDI calls</li>
+
+</ul>
+</li>
+
+<li>Lightweight persistence for object-relational mapping<ul>
+<li>Entities are POJOs that provide an object-oriented view of the
+data stored in relational database</li>
+
+</ul>
+</li>
+
+<li>New Interceptors class (new in Java EE 5)<ul>
+<li>Interceptors are objects that can intercept a call to a business
+method (to handle security for example)</li>
+
+<li>Similar in purpose and action to servlet filter or Web services
+handler</li>
+
+<li>Provide limited form of aspect-oriented programming</li>
+
+</ul>
+</li>
+
+</ul>
+</div>
+
+<p>For further additional information on EJB 3.0, see the official
+specification: <a href="http://jcp.org/en/jsr/detail?id=220" target="_blank">JSR 220: Enterprise JavaBeans™ 3.0</a></p>
+
+</div>
+
+<div>
+<ul class="ullinks">
+<li class="ulchildlink"><strong><a href="../topics/tecrtpro.html">Creating EJB projects</a></strong><br />
+An EJB project is used to organize the resources contained in an EJB module.</li>
+<li class="ulchildlink"><strong><a href="../topics/ccontentassist3.html">Content assist and EJB 3.1</a></strong><br />
+The content assist tool is a feature of the workbench. You can type code in your Java editor and the content assist tool recommends possibilities to complete your code.</li>
+</ul>
+
+<div class="familylinks">
+<div class="parentlink"><strong>Parent topic:</strong> <a href="../topics/ceover.html" title="The workbench provides a specialized environment that you can use to develop and test enterprise beans that conform to the distributed component architecture defined in the Sun Microsystems Enterprise JavaBeans (EJB) version specification. This product supports the Enterprise JavaBeans 1.1, 2.0, 2.1, and 3.0 specification levels.">EJB 2.x application development</a></div>
+</div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/org.eclipse.jst.ejb.doc.user/topics/cejb3vejb21.dita b/docs/org.eclipse.jst.ejb.doc.user/topics/cejb3vejb21.dita
new file mode 100644
index 0000000..3cbdd8c
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/topics/cejb3vejb21.dita
@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="utf-8"?>

+<!--Arbortext, Inc., 1988-2006, v.4002-->

+<!DOCTYPE concept PUBLIC "-//OASIS//DTD DITA Concept//EN"

+ "concept.dtd">

+<concept id="compareejb2" xml:lang="en-us">

+<title>Differences between EJB 3.0 and EJB 2.1</title>

+<titlealts>

+<navtitle>EJB 3.0 versus EJB 2.1</navtitle>

+<searchtitle>Enterprise JavaBean version differences between EJB 3.0 and EJB

+2.1</searchtitle>

+</titlealts>

+<shortdesc>Compared to EJB 2.1, EJB 3.0 simplifies the process of creating

+Enterprise JavaBean applications.</shortdesc>

+<prolog><metadata>

+<keywords><indexterm>Enterprise JavaBeans 3.0</indexterm></keywords>

+</metadata></prolog>

+<conbody>

+<p>The underlying concept of the EJB 3.0 specification centers on a plain

+old <tm tmclass="special" tmowner="Sun Microsystems, Inc." tmtype="tm" trademark="Java">Java</tm> object

+(POJO) programming model that uses <tm tmclass="special" tmowner="Sun Microsystems, Inc."

+tmtype="tm" trademark="Java">Java</tm> annotations to capture information

+that deployment descriptors used to contain.  Deployment descriptors are now

+optional in most cases.  Using default values liberally also means that you

+need to write and maintain less supporting code. This greatly simplifies the

+programming experience in creating and using EJB 3.0 components.</p>

+<p>While EJB 2.1 added support for Web services, changes in the implementation

+of session beans, changes in how enterprise beans are invoked and a new XML

+schema to replace the DTD that defined ejb-jar.xml deployment descriptor,

+EJB 3.0 has taken this one step further. EJB 3.0 has introduced a lightweight

+entity bean persistence mechanism through the <tm tmclass="special" tmowner="Sun Microsystems, Inc."

+tmtype="tm" trademark="Java">Java</tm> Persistence API. These entities are

+POJO based and can then be run outside of an EJB container and do not require

+any interfaces or EJB code in them. Similarly, session beans also no longer

+require EJB-specific component interfaces either.</p>

+<p><b>Comparison of EJB 2.1 class plus Deployment Descriptor file with equivalent

+EJB 3.0 class</b></p>

+<p>The examples in Table 1 are functionally equivalent:</p>

+<table><title>Comparison of EJB 2.1 and EJB 3.0</title>

+<tgroup cols="2"><colspec colname="col1"/><colspec colname="col2"/>

+<thead>

+<row valign="bottom">

+<entry colname="col1">EJB 2.1 </entry>

+<entry colname="col2">EJB 3.0</entry>

+</row>

+</thead>

+<tbody>

+<row>

+<entry colname="col1"><p><b>Java Class</b></p><codeblock>public class AccountBean

+implements javax.ejb.SessionBean {

+ 

+     SessionContext ctx;

+     DataSource accountDB;

+ 

+     public void setSessionContext(SessionContext ctx) {

+        this.ctx = ctx;

+     }

+ 

+     public void ejbCreate() {

+          accountDB = (DataSource)ctx.lookup(

+                          "jdbc/accountDB");

+ 

+     }

+     public void ejbActivate() { }

+     public void ejbPassivate() { }

+     public void ejbRemove() { }

+

+     public void setAccountDeposit(int empId,

+                                      double deposit) {

+       ...

+       Connection conn = accountDB.getConnection();

+       ...

+     }

+  ...

+}</codeblock></entry>

+<entry colname="col2"><p><b>Java Class</b></p><codeblock>@Stateless

+public class AccountBean implements Account

+{

+     @Resource private DataSource accountDB;

+ 

+     public void setAccountDeposit(int customerId,

+                                      double deposit) {

+       ...

+       Connection conn = accountDB.getConnection();

+       ...

+     }

+  ...

+}</codeblock></entry>

+</row>

+<row>

+<entry colname="col1"><p><b>Deployment Descriptor</b></p><codeblock>&lt;session>

+  &lt;ejb-name>AccountBean&lt;/ejb-name>

+  &lt;local-home>AccountHome&lt;/local-home>

+  &lt;local>Account&lt;/local>

+  &lt;ejb-class>com.example.AccountBean&lt;/ejb-class>

+  &lt;session-type>Stateless&lt;/session-type>

+  &lt;transaction-type>Container&lt;/transaction-type>

+  &lt;resource-ref>

+    &lt;res-ref-name>jdbc/accountDB&lt;/res-ref-name>

+    &lt;res-ref-type>javax.sql.DataSource&lt;/res-ref-type>

+    &lt;res-auth>Container&lt;/res-auth>

+  &lt;/resource-ref>

+&lt;/session>

+...

+&lt;assembly-descriptor>...&lt;/assembly-descriptor>

+</codeblock></entry>

+<entry colname="col2"></entry>

+</row>

+</tbody>

+</tgroup>

+</table>

+<p>The following four facets of <tm tmclass="special" tmowner="Sun Microsystems, Inc."

+tmtype="tm" trademark="Java">Java</tm> EE 5 contributed the most to the changes

+in EJB 3.0 from EJB 2.1:<ul>

+<li>Plain old <tm tmclass="special" tmowner="Sun Microsystems, Inc." tmtype="tm"

+trademark="Java">Java</tm> objects</li>

+<li>Annotations</li>

+<li>Implied values</li>

+<li>Persistence</li>

+</ul></p>

+</conbody>

+</concept>

diff --git a/docs/org.eclipse.jst.ejb.doc.user/topics/cejb3vejb21.html b/docs/org.eclipse.jst.ejb.doc.user/topics/cejb3vejb21.html
new file mode 100644
index 0000000..67e4758
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/topics/cejb3vejb21.html
@@ -0,0 +1,170 @@
+<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html lang="en-us" xml:lang="en-us">
+<head>
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+<meta name="copyright" content="Copyright (c) 2000, 2011 IBM 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: IBM Corporation - initial API and implementation" />
+<meta name="DC.rights.owner" content="(C) Copyright 2000, 2011" />
+<meta content="public" name="security" />
+<meta content="index,follow" name="Robots" />
+<meta http-equiv="PICS-Label" content='(PICS-1.1 "http://www.icra.org/ratingsv02.html" l gen true r (cz 1 lz 1 nz 1 oz 1 vz 1) "http://www.rsac.org/ratingsv01.html" l gen true r (n 0 s 0 v 0 l 0) "http://www.classify.org/safesurf/" l gen true r (SS~~000 1))' />
+<meta content="concept" name="DC.Type" />
+<meta name="DC.Title" content="Differences between EJB 3.0 and EJB 2.1" />
+<meta name="abstract" content="Compared to EJB 2.1, EJB 3.0 simplifies the process of creating Enterprise JavaBean applications." />
+<meta name="description" content="Compared to EJB 2.1, EJB 3.0 simplifies the process of creating Enterprise JavaBean applications." />
+<meta content="Enterprise JavaBeans 3.0" name="DC.subject" />
+<meta content="Enterprise JavaBeans 3.0" name="keywords" />
+<meta scheme="URI" name="DC.Relation" content="../topics/ejbarch.html" />
+<meta content="XHTML" name="DC.Format" />
+<meta content="compareejb2" name="DC.Identifier" />
+<meta content="en-us" name="DC.Language" />
+<link href="../../org.eclipse.wst.doc.user/common.css" type="text/css" rel="stylesheet" />
+<title>Enterprise JavaBean version differences between EJB 3.0 and EJB
+2.1</title>
+</head>
+<body id="compareejb2"><a name="compareejb2"><!-- --></a>
+
+
+<h1 class="topictitle1">Differences between EJB 3.0 and EJB 2.1</h1>
+
+
+
+
+<div><p>Compared to EJB 2.1, EJB 3.0 simplifies the process of creating
+Enterprise JavaBean applications.</p>
+
+<p>The underlying concept of the EJB 3.0 specification centers on a plain
+old Java™ object
+(POJO) programming model that uses Java annotations to capture information
+that deployment descriptors used to contain.  Deployment descriptors are now
+optional in most cases.  Using default values liberally also means that you
+need to write and maintain less supporting code. This greatly simplifies the
+programming experience in creating and using EJB 3.0 components.</p>
+
+<p>While EJB 2.1 added support for Web services, changes in the implementation
+of session beans, changes in how enterprise beans are invoked and a new XML
+schema to replace the DTD that defined ejb-jar.xml deployment descriptor,
+EJB 3.0 has taken this one step further. EJB 3.0 has introduced a lightweight
+entity bean persistence mechanism through the Java Persistence API. These entities are
+POJO based and can then be run outside of an EJB container and do not require
+any interfaces or EJB code in them. Similarly, session beans also no longer
+require EJB-specific component interfaces either.</p>
+
+<p><strong>Comparison of EJB 2.1 class plus Deployment Descriptor file with equivalent
+EJB 3.0 class</strong></p>
+
+<p>The examples in Table 1 are functionally equivalent:</p>
+
+
+<div class="tablenoborder"><table summary="" cellspacing="0" cellpadding="4" frame="border" border="1" rules="all"><caption>Table 1. Comparison of EJB 2.1 and EJB 3.0</caption>
+<thead align="left">
+<tr valign="bottom">
+<th valign="bottom" id="N100A4">EJB 2.1 </th>
+
+<th valign="bottom" id="N100AB">EJB 3.0</th>
+
+</tr>
+
+</thead>
+
+<tbody>
+<tr>
+<td valign="top" headers="N100A4 "><p><strong>Java Class</strong></p>
+<pre>public class AccountBean
+implements javax.ejb.SessionBean {
+ 
+     SessionContext ctx;
+     DataSource accountDB;
+ 
+     public void setSessionContext(SessionContext ctx) {
+        this.ctx = ctx;
+     }
+ 
+     public void ejbCreate() {
+          accountDB = (DataSource)ctx.lookup(
+                          "jdbc/accountDB");
+ 
+     }
+     public void ejbActivate() { }
+     public void ejbPassivate() { }
+     public void ejbRemove() { }
+
+     public void setAccountDeposit(int empId,
+                                      double deposit) {
+       ...
+       Connection conn = accountDB.getConnection();
+       ...
+     }
+  ...
+}</pre>
+</td>
+
+<td valign="top" headers="N100AB "><p><strong>Java Class</strong></p>
+<pre>@Stateless
+public class AccountBean implements Account
+{
+     @Resource private DataSource accountDB;
+ 
+     public void setAccountDeposit(int customerId,
+                                      double deposit) {
+       ...
+       Connection conn = accountDB.getConnection();
+       ...
+     }
+  ...
+}</pre>
+</td>
+
+</tr>
+
+<tr>
+<td valign="top" headers="N100A4 "><p><strong>Deployment Descriptor</strong></p>
+<pre>&lt;session&gt;
+  &lt;ejb-name&gt;AccountBean&lt;/ejb-name&gt;
+  &lt;local-home&gt;AccountHome&lt;/local-home&gt;
+  &lt;local&gt;Account&lt;/local&gt;
+  &lt;ejb-class&gt;com.example.AccountBean&lt;/ejb-class&gt;
+  &lt;session-type&gt;Stateless&lt;/session-type&gt;
+  &lt;transaction-type&gt;Container&lt;/transaction-type&gt;
+  &lt;resource-ref&gt;
+    &lt;res-ref-name&gt;jdbc/accountDB&lt;/res-ref-name&gt;
+    &lt;res-ref-type&gt;javax.sql.DataSource&lt;/res-ref-type&gt;
+    &lt;res-auth&gt;Container&lt;/res-auth&gt;
+  &lt;/resource-ref&gt;
+&lt;/session&gt;
+...
+&lt;assembly-descriptor&gt;...&lt;/assembly-descriptor&gt;
+</pre>
+</td>
+
+<td valign="top" headers="N100AB ">&nbsp;</td>
+
+</tr>
+
+</tbody>
+
+</table>
+</div>
+
+<div class="p">The following four facets of Java EE 5 contributed the most to the changes
+in EJB 3.0 from EJB 2.1:<ul>
+<li>Plain old Java objects</li>
+
+<li>Annotations</li>
+
+<li>Implied values</li>
+
+<li>Persistence</li>
+
+</ul>
+</div>
+
+</div>
+
+<div>
+<div class="familylinks">
+<div class="parentlink"><strong>Parent topic:</strong> <a href="../topics/ejbarch.html" title="This topic provides a high-level overview of the distributed component architecture defined in the Sun Microsystems Enterprise JavaBeans (EJB) version 3.0 architecture specification.">EJB 3.0 and EJB 3.1 architecture</a></div>
+</div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/org.eclipse.jst.ejb.doc.user/topics/ceover.dita b/docs/org.eclipse.jst.ejb.doc.user/topics/ceover.dita
new file mode 100644
index 0000000..1371ae3
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/topics/ceover.dita
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8"?>

+<!--Arbortext, Inc., 1988-2006, v.4002-->

+<!DOCTYPE concept PUBLIC "-//OASIS//DTD DITA Concept//EN"

+ "concept.dtd">

+<concept id="ceover" xml:lang="en-us">

+<title>EJB 2.x application development</title>

+<shortdesc>The workbench provides a specialized environment that you can use

+to develop and test enterprise beans that conform to the distributed component

+architecture defined in the Sun Microsystems Enterprise <tm tmclass="special"

+tmowner="Sun Microsystems, Inc." tmtype="tm" trademark="JavaBeans">JavaBeans</tm> (EJB)

+version specification. This product supports the Enterprise <tm tmclass="special"

+tmowner="Sun Microsystems, Inc." tmtype="tm" trademark="JavaBeans">JavaBeans</tm> 1.1,

+2.0, 2.1, and 3.0 specification levels.</shortdesc>

+<prolog><metadata>

+<keywords><indexterm>applications<indexterm>EJB development</indexterm></indexterm>

+<indexterm>EJB<indexterm>developing<indexterm>applications</indexterm></indexterm></indexterm>

+</keywords>

+</metadata></prolog>

+<conbody>

+<p>The complete Enterprise <tm tmclass="special" tmowner="Sun Microsystems, Inc."

+tmtype="tm" trademark="JavaBeans">JavaBeans</tm> specifications and descriptions

+of the technology are available from the <xref format="html" href="http://java.sun.com/products/ejb/docs.html#specs"

+scope="external">java.sun.com<desc></desc></xref> Web site.</p>

+<p>If you are not familiar with enterprise beans or related EJB technology,

+see <xref href="cearch.dita#cearch" type="concept"></xref> for a brief description

+of key EJB concepts.</p>

+<p>The EJB development environment includes the following tools:</p>

+<dl><dlentry>

+<dt><b>The <tm tmclass="special" tmowner="Sun Microsystems, Inc." tmtype="tm"

+trademark="Java">Java</tm> EE perspective</b></dt>

+<dd>All of the EJB tools are accessible from the <tm tmclass="special" tmowner="Sun Microsystems, Inc."

+tmtype="tm" trademark="Java">Java</tm> EE perspective. This perspective provides

+a layout in which the most commonly used actions, views, and wizards for <tm

+tmclass="special" tmowner="Sun Microsystems, Inc." tmtype="tm" trademark="Java">Java</tm> EE

+and EJB development are easily accessible</dd>

+</dlentry><dlentry>

+<dt><b>Creating enterprise beans</b></dt>

+<dd>The EJB tools help you create enterprise beans, such as session beans

+or message-driven beans. You can accomplish the following complementary enterprise

+bean development activities:<ul>

+<li>Writing and editing business logic.</li>

+<li>Importing or exporting enterprise beans.</li>

+<li>Maintaining enterprise bean source code and generated code using build

+in <tm tmclass="special" tmowner="Sun Microsystems, Inc." tmtype="tm" trademark="Java">Java</tm> development

+tools, and team and version control capabilities of the workbench.</li>

+</ul> </dd>

+</dlentry><dlentry>

+<dt><b>Validating enterprise bean code</b></dt>

+<dd>The EJB tools automatically validate that your enterprise bean code is

+consistent and that it conforms to the rules defined by the Enterprise <tm

+tmclass="special" tmowner="Sun Microsystems, Inc." tmtype="tm" trademark="JavaBeans">JavaBeans</tm> specifications.

+Code verification occurs whenever an enterprise bean or its properties are

+changed. Errors and warnings are displayed in the Problems view of the workbench.

+Files with errors also display error icons. </dd>

+</dlentry><dlentry>

+<dt><b>Importing existing EJB JAR files</b></dt>

+<dd>EJB Tools allow beans and other metadata from an EJB JAR file to be imported

+into a new or existing EJB project.</dd>

+</dlentry><dlentry>

+<dt><b>Exporting existing EJB projects into JAR files</b></dt>

+<dd>EJB tools can export your EJB project so that it may be deployed to an

+application server.</dd>

+</dlentry></dl>

+</conbody>

+</concept>

diff --git a/docs/org.eclipse.jst.ejb.doc.user/topics/ceover.html b/docs/org.eclipse.jst.ejb.doc.user/topics/ceover.html
new file mode 100644
index 0000000..83019b6
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/topics/ceover.html
@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html lang="en-us" xml:lang="en-us">
+<head>
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+<meta name="copyright" content="Copyright (c) 2000, 2011 IBM 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: IBM Corporation - initial API and implementation" />
+<meta name="DC.rights.owner" content="(C) Copyright 2000, 2011" />
+<meta content="public" name="security" />
+<meta content="index,follow" name="Robots" />
+<meta http-equiv="PICS-Label" content='(PICS-1.1 "http://www.icra.org/ratingsv02.html" l gen true r (cz 1 lz 1 nz 1 oz 1 vz 1) "http://www.rsac.org/ratingsv01.html" l gen true r (n 0 s 0 v 0 l 0) "http://www.classify.org/safesurf/" l gen true r (SS~~000 1))' />
+<meta content="concept" name="DC.Type" />
+<meta name="DC.Title" content="EJB 2.x application development" />
+<meta name="abstract" content="The workbench provides a specialized environment that you can use to develop and test enterprise beans that conform to the distributed component architecture defined in the Sun Microsystems Enterprise JavaBeans (EJB) version specification. This product supports the Enterprise JavaBeans 1.1, 2.0, 2.1, and 3.0 specification levels." />
+<meta name="description" content="The workbench provides a specialized environment that you can use to develop and test enterprise beans that conform to the distributed component architecture defined in the Sun Microsystems Enterprise JavaBeans (EJB) version specification. This product supports the Enterprise JavaBeans 1.1, 2.0, 2.1, and 3.0 specification levels." />
+<meta content="applications, EJB development, EJB, developing" name="DC.subject" />
+<meta content="applications, EJB development, EJB, developing" name="keywords" />
+<meta scheme="URI" name="DC.Relation" content="../topics/ejbarch.html" />
+<meta scheme="URI" name="DC.Relation" content="../topics/cejb3.html" />
+<meta scheme="URI" name="DC.Relation" content="../topics/cearch.html" />
+<meta scheme="URI" name="DC.Relation" content="../topics/ceresrc.html" />
+<meta scheme="URI" name="DC.Relation" content="../topics/tecrte.html" />
+<meta content="XHTML" name="DC.Format" />
+<meta content="ceover" name="DC.Identifier" />
+<meta content="en-us" name="DC.Language" />
+<link href="../../org.eclipse.wst.doc.user/common.css" type="text/css" rel="stylesheet" />
+<title>EJB 2.x application development</title>
+</head>
+<body id="ceover"><a name="ceover"><!-- --></a>
+
+
+<h1 class="topictitle1">EJB 2.x application development</h1>
+
+
+
+<div><p>The workbench provides a specialized environment that you can use
+to develop and test enterprise beans that conform to the distributed component
+architecture defined in the Sun Microsystems Enterprise JavaBeans™ (EJB)
+version specification. This product supports the Enterprise JavaBeans 1.1,
+2.0, 2.1, and 3.0 specification levels.</p>
+
+<p>The complete Enterprise JavaBeans specifications and descriptions
+of the technology are available from the <a href="http://java.sun.com/products/ejb/docs.html#specs" target="_blank" title="">java.sun.com</a> Web site.</p>
+
+<p>If you are not familiar with enterprise beans or related EJB technology,
+see <a href="cearch.html#cearch" title="This topic provides a high-level overview of the distributed component&#10;architecture defined in the Sun Microsystems Enterprise JavaBeans (EJB)&#10;version 2.x architecture specification.">EJB 2.x architecture</a> for a brief description
+of key EJB concepts.</p>
+
+<p>The EJB development environment includes the following tools:</p>
+
+<dl>
+<dt class="dlterm"><strong>The Java™ EE perspective</strong></dt>
+
+<dd>All of the EJB tools are accessible from the Java EE perspective. This perspective provides
+a layout in which the most commonly used actions, views, and wizards for Java EE
+and EJB development are easily accessible</dd>
+
+
+<dt class="dlterm"><strong>Creating enterprise beans</strong></dt>
+
+<dd>The EJB tools help you create enterprise beans, such as session beans
+or message-driven beans. You can accomplish the following complementary enterprise
+bean development activities:<ul>
+<li>Writing and editing business logic.</li>
+
+<li>Importing or exporting enterprise beans.</li>
+
+<li>Maintaining enterprise bean source code and generated code using build
+in Java development
+tools, and team and version control capabilities of the workbench.</li>
+
+</ul>
+ </dd>
+
+
+<dt class="dlterm"><strong>Validating enterprise bean code</strong></dt>
+
+<dd>The EJB tools automatically validate that your enterprise bean code is
+consistent and that it conforms to the rules defined by the Enterprise JavaBeans specifications.
+Code verification occurs whenever an enterprise bean or its properties are
+changed. Errors and warnings are displayed in the Problems view of the workbench.
+Files with errors also display error icons. </dd>
+
+
+<dt class="dlterm"><strong>Importing existing EJB JAR files</strong></dt>
+
+<dd>EJB Tools allow beans and other metadata from an EJB JAR file to be imported
+into a new or existing EJB project.</dd>
+
+
+<dt class="dlterm"><strong>Exporting existing EJB projects into JAR files</strong></dt>
+
+<dd>EJB tools can export your EJB project so that it may be deployed to an
+application server.</dd>
+
+</dl>
+
+</div>
+
+<div>
+<ul class="ullinks">
+<li class="ulchildlink"><strong><a href="../topics/ejbarch.html">EJB 3.0 and EJB 3.1 architecture</a></strong><br />
+This topic provides a high-level overview of the distributed component architecture defined in the Sun Microsystems Enterprise JavaBeans (EJB) version 3.0 architecture specification.</li>
+<li class="ulchildlink"><strong><a href="../topics/cejb3.html">Developing EJB 3.1 Applications</a></strong><br />
+You can use the workbench to develop and test enterprise beans that conform to the distributed component architecture defined in the Sun Microsystems Enterprise JavaBeans (EJB) 3.10 specification.</li>
+<li class="ulchildlink"><strong><a href="../topics/cearch.html">EJB 2.x architecture</a></strong><br />
+This topic provides a high-level overview of the distributed component architecture defined in the Sun Microsystems Enterprise JavaBeans (EJB) version 2.x architecture specification.</li>
+<li class="ulchildlink"><strong><a href="../topics/ceresrc.html">EJB 2.x development resources</a></strong><br />
+This topic describes resources and development tools that are commonly used in EJB version 2.x development.</li>
+<li class="ulchildlink"><strong><a href="../topics/tecrte.html">Creating enterprise beans with XDoclet annotation support</a></strong><br />
+You can use a wizard to create session beans and message-driven beans that support XDoclet annotation.</li>
+</ul>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/org.eclipse.jst.ejb.doc.user/topics/ceresrc.dita b/docs/org.eclipse.jst.ejb.doc.user/topics/ceresrc.dita
new file mode 100644
index 0000000..94ca12a
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/topics/ceresrc.dita
@@ -0,0 +1,140 @@
+<?xml version="1.0" encoding="utf-8"?>

+<!--Arbortext, Inc., 1988-2006, v.4002-->

+<!DOCTYPE concept PUBLIC "-//OASIS//DTD DITA Concept//EN"

+ "concept.dtd">

+<concept id="ceresrc" xml:lang="en-us">

+<title>EJB 2.x development resources</title>

+<shortdesc>This topic describes resources and development tools that are commonly

+used in EJB version 2.x development.</shortdesc>

+<prolog><metadata>

+<keywords><indexterm>EJB<indexterm>developing<indexterm>resources</indexterm></indexterm></indexterm>

+<indexterm>resources<indexterm>EJB development</indexterm></indexterm></keywords>

+</metadata></prolog>

+<conbody>

+<dl><dlentry>

+<dt><b>EJB modules</b></dt>

+<dd> <p>EJB modules are displayed in the Project Explorer view of the <tm

+tmclass="special" tmowner="Sun Microsystems, Inc." tmtype="tm" trademark="Java">Java</tm> EE

+perspective, and they correspond to EJB projects.</p><p>An EJB module is used

+to assemble one or more enterprise beans into a single deployable unit. An

+EJB module is developed in an EJB project, and it can either be exported as

+a standalone EJB JAR file, or combined with other EJB or Web modules within

+an enterprise application. An EJB JAR file uses the format of a standard <tm

+tmclass="special" tmowner="Sun Microsystems, Inc." tmtype="tm" trademark="Java">Java</tm> archive

+file. An EJB module contains the following: </p><ul>

+<li>One or more enterprise beans and their associated .class and .java files.</li>

+<li>Graphics and other files depending on the need of the enterprise bean. </li>

+<li>A deployment descriptor. The file type for the deployment descriptor is

+Extensible Markup Language (XML). This file declares the contents of the EJB

+module, defines the structure of the beans in the module, and provides a description

+of how the beans are to be used at run time. </li>

+<li>A MANIFEST.MF file in the <uicontrol>META-INF</uicontrol> directory. The

+manifest file can contain a class path entry, with references to other JAR

+files or EJB modules in a J2EE enterprise application. It defines the module's

+external dependencies.</li>

+</ul><p>An EJB module is installed and runs in an EJB container.</p><p>An

+enterprise bean is a <tm tmclass="special" tmowner="Sun Microsystems, Inc."

+tmtype="tm" trademark="Java">Java</tm> component that can be combined with

+other resources to create distributed client/server applications.</p><note>If

+you choose to create an EJB client JAR file for your EJB module, the client

+interface classes for the enterprise beans will not be included in the EJB

+JAR file, but are included in the EJB client JAR file.</note></dd>

+</dlentry><dlentry>

+<dt><b>EJB projects</b></dt>

+<dd> <p>In the workbench, you create and maintain resources for enterprise

+applications in projects. An EJB project is a logical module that allows you

+to organize your enterprise beans.</p><p>The workbench supports EJB 1.1, EJB

+2.0, and EJB 2.1 projects. The J2EE specification level of a containing EAR

+project must be set to J2EE 1.3 or higher for EJB 2.0 projects, and J2EE 1.4

+for EJB 2.1 projects. In an EJB 1.1 project, you will only be able to create

+EJB 1.1 beans.</p><p>An EJB project is a specialized <tm tmclass="special"

+tmowner="Sun Microsystems, Inc." tmtype="tm" trademark="Java">Java</tm> project.

+Like a <tm tmclass="special" tmowner="Sun Microsystems, Inc." tmtype="tm"

+trademark="Java">Java</tm> project, an EJB project must have one or more source

+folders to contain the source and output files for the project. By default,

+the source folder is named <b>ejbModule</b>, but you can change that name

+when you create the project or new source folders. When you publish or deploy

+the project, the contents of the folder or folders are aggregated. </p><p>You

+cannot use the EJB project as the source folder, doing so will cause errors.

+Also, though you can have more than one source folder in the project, only

+one of these source folders can contain the <uicontrol>META-INF</uicontrol> folder

+in which the MANIFEST.MF and deployment descriptor files reside.</p><note>If

+you choose to create an EJB client JAR file for your EJB module, the client

+interface classes for the enterprise beans will not be included in the EJB

+project, but in separate EJB client JAR project. EJB client JAR projects are

+displayed in the Project Explorer as <tm tmclass="special" tmowner="Sun Microsystems, Inc."

+tmtype="tm" trademark="Java">Java</tm> projects under the <b>Other Projects</b> node.</note></dd>

+</dlentry><dlentry>

+<dt><b>EJB client projects</b></dt>

+<dd> <p>The EJB tooling supports the creation of EJB client JAR projects for

+EJB modules. An EJB client JAR project contains all the interface classes

+that a client program needs to use the client views of the enterprise beans

+that are contained in the EJB project. When you create an EJB client project

+for an EJB project, a new <tm tmclass="special" tmowner="Sun Microsystems, Inc."

+tmtype="tm" trademark="Java">Java</tm> project is created and added to your

+workspace. The EJB client project is added as a project utility JAR file to

+each module that the EJB project belongs to.</p><p>By default, when you use

+the wizard to create an EJB project, an EJB client JAR project is also created.

+However, you can clear this option in the wizard.</p><note type="tip">You

+can also add the EJB client project to another enterprise application that

+does not include the EJB project as a module. This will ensure that the EJB

+client JAR file is exported and packaged with the EAR file when the application

+is exported.</note></dd>

+</dlentry><dlentry>

+<dt><b>Enterprise beans</b></dt>

+<dd> <p>An enterprise bean is a <tm tmclass="special" tmowner="Sun Microsystems, Inc."

+tmtype="tm" trademark="Java">Java</tm> component that can be combined with

+other resources to create distributed client/server applications.</p><p>There

+are three types of enterprise beans: entity beans, session beans, and message-driven

+beans. Typically, all types of beans are used together within an enterprise

+application.</p><dl><dlentry>

+<dt><b>Entity beans</b></dt>

+<dd>Entity beans store permanent data. Entity beans with container-managed

+persistence (CMP) require database connections. Entity beans with bean-managed

+persistence manage permanent data in whichever manner is defined in the bean

+code. This can include writing to databases or XML files, for example.</dd>

+</dlentry><dlentry>

+<dt><b>Session beans</b></dt>

+<dd>Session beans do not require database access, though they can obtain it

+indirectly (as needed) by accessing entity beans. Session beans can also obtain

+direct access to databases (and other resources) through the use of resource

+references.</dd>

+</dlentry><dlentry>

+<dt><b>Message-driven beans</b></dt>

+<dd>Message-driven beans are a special kind of enterprise bean that act as

+message consumers in the JMS messaging system. As with standard JMS message

+consumers, message-driven beans perform business logic based on the message

+contents. In several ways, the dynamic creation and allocation of message-driven

+bean instances mimics the behavior of stateless session enterprise beans.

+However, message-driven beans are different from stateless session enterprise

+beans (and other types of enterprise beans) in a couple of ways:<ul>

+<li>Message-driven beans process multiple JMS messages asynchronously, rather

+than processing a serialized sequence of method calls.</li>

+<li>Message-driven beans have no home or remote interface, and therefore cannot

+be directly accessed by internal or external clients.</li>

+</ul></dd>

+</dlentry></dl></dd>

+</dlentry><dlentry>

+<dt><b>Deployment descriptors</b></dt>

+<dd> <p>A deployment descriptor contains configuration data that the runtime

+environment uses for an application. A deployment descriptor can include information

+about the following: </p><ul>

+<li>The structure and content (enterprise beans, for example) of the application.</li>

+<li>References to internal and external dependencies. For example, an enterprise

+bean in an EJB module can require another enterprise bean that is not bundled

+in the same module.</li>

+<li>References to resource factory objects, such as URLs or JDBC data sources.</li>

+<li>Security roles that the container uses when implementing the required

+access control for the application.</li>

+<li>Transactional information about how (and whether) the container is to

+manage transactions for the application.</li>

+</ul><p>Deployment descriptors are XML files packaged with the application's

+files in a <tm tmclass="special" tmowner="Sun Microsystems, Inc." tmtype="tm"

+trademark="Java">Java</tm> archive file. An EJB deployment descriptor is called

+ejb-jar.xml and is located in the <b>META-INF</b> folder of an EJB project.

+A J2EE application contains one application-level deployment descriptor file,

+governing the application as a whole. It also contains several component-level

+deployment descriptors, one for each module in the application.</p></dd>

+</dlentry></dl>

+</conbody>

+</concept>

diff --git a/docs/org.eclipse.jst.ejb.doc.user/topics/ceresrc.html b/docs/org.eclipse.jst.ejb.doc.user/topics/ceresrc.html
new file mode 100644
index 0000000..3697cd4
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/topics/ceresrc.html
@@ -0,0 +1,222 @@
+<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html lang="en-us" xml:lang="en-us">
+<head>
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+<meta name="copyright" content="Copyright (c) 2000, 2011 IBM 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: IBM Corporation - initial API and implementation" />
+<meta name="DC.rights.owner" content="(C) Copyright 2000, 2011" />
+<meta content="public" name="security" />
+<meta content="index,follow" name="Robots" />
+<meta http-equiv="PICS-Label" content='(PICS-1.1 "http://www.icra.org/ratingsv02.html" l gen true r (cz 1 lz 1 nz 1 oz 1 vz 1) "http://www.rsac.org/ratingsv01.html" l gen true r (n 0 s 0 v 0 l 0) "http://www.classify.org/safesurf/" l gen true r (SS~~000 1))' />
+<meta content="concept" name="DC.Type" />
+<meta name="DC.Title" content="EJB 2.x development resources" />
+<meta name="abstract" content="This topic describes resources and development tools that are commonly used in EJB version 2.x development." />
+<meta name="description" content="This topic describes resources and development tools that are commonly used in EJB version 2.x development." />
+<meta content="EJB, developing, resources, EJB development" name="DC.subject" />
+<meta content="EJB, developing, resources, EJB development" name="keywords" />
+<meta scheme="URI" name="DC.Relation" content="../topics/ceover.html" />
+<meta scheme="URI" name="DC.Relation" content="../topics/tecrtpro.html" />
+<meta scheme="URI" name="DC.Relation" content="../topics/ceclientjars.html" />
+<meta scheme="URI" name="DC.Relation" content="../topics/teimp.html" />
+<meta scheme="URI" name="DC.Relation" content="../topics/teexp.html" />
+<meta content="XHTML" name="DC.Format" />
+<meta content="ceresrc" name="DC.Identifier" />
+<meta content="en-us" name="DC.Language" />
+<link href="../../org.eclipse.wst.doc.user/common.css" type="text/css" rel="stylesheet" />
+<title>EJB 2.x development resources</title>
+</head>
+<body id="ceresrc"><a name="ceresrc"><!-- --></a>
+
+
+<h1 class="topictitle1">EJB 2.x development resources</h1>
+
+
+
+<div><p>This topic describes resources and development tools that are commonly
+used in EJB version 2.x development.</p>
+
+<dl>
+<dt class="dlterm"><strong>EJB modules</strong></dt>
+
+<dd> <p>EJB modules are displayed in the Project Explorer view of the Java™ EE
+perspective, and they correspond to EJB projects.</p>
+<p>An EJB module is used
+to assemble one or more enterprise beans into a single deployable unit. An
+EJB module is developed in an EJB project, and it can either be exported as
+a standalone EJB JAR file, or combined with other EJB or Web modules within
+an enterprise application. An EJB JAR file uses the format of a standard Java archive
+file. An EJB module contains the following: </p>
+<ul>
+<li>One or more enterprise beans and their associated .class and .java files.</li>
+
+<li>Graphics and other files depending on the need of the enterprise bean. </li>
+
+<li>A deployment descriptor. The file type for the deployment descriptor is
+Extensible Markup Language (XML). This file declares the contents of the EJB
+module, defines the structure of the beans in the module, and provides a description
+of how the beans are to be used at run time. </li>
+
+<li>A MANIFEST.MF file in the <span class="uicontrol">META-INF</span> directory. The
+manifest file can contain a class path entry, with references to other JAR
+files or EJB modules in a J2EE enterprise application. It defines the module's
+external dependencies.</li>
+
+</ul>
+<p>An EJB module is installed and runs in an EJB container.</p>
+<p>An
+enterprise bean is a Java component that can be combined with
+other resources to create distributed client/server applications.</p>
+<div class="note"><span class="notetitle">Note:</span> If
+you choose to create an EJB client JAR file for your EJB module, the client
+interface classes for the enterprise beans will not be included in the EJB
+JAR file, but are included in the EJB client JAR file.</div>
+</dd>
+
+
+<dt class="dlterm"><strong>EJB projects</strong></dt>
+
+<dd> <p>In the workbench, you create and maintain resources for enterprise
+applications in projects. An EJB project is a logical module that allows you
+to organize your enterprise beans.</p>
+<p>The workbench supports EJB 1.1, EJB
+2.0, and EJB 2.1 projects. The J2EE specification level of a containing EAR
+project must be set to J2EE 1.3 or higher for EJB 2.0 projects, and J2EE 1.4
+for EJB 2.1 projects. In an EJB 1.1 project, you will only be able to create
+EJB 1.1 beans.</p>
+<p>An EJB project is a specialized Java project.
+Like a Java project, an EJB project must have one or more source
+folders to contain the source and output files for the project. By default,
+the source folder is named <strong>ejbModule</strong>, but you can change that name
+when you create the project or new source folders. When you publish or deploy
+the project, the contents of the folder or folders are aggregated. </p>
+<p>You
+cannot use the EJB project as the source folder, doing so will cause errors.
+Also, though you can have more than one source folder in the project, only
+one of these source folders can contain the <span class="uicontrol">META-INF</span> folder
+in which the MANIFEST.MF and deployment descriptor files reside.</p>
+<div class="note"><span class="notetitle">Note:</span> If
+you choose to create an EJB client JAR file for your EJB module, the client
+interface classes for the enterprise beans will not be included in the EJB
+project, but in separate EJB client JAR project. EJB client JAR projects are
+displayed in the Project Explorer as Java projects under the <strong>Other Projects</strong> node.</div>
+</dd>
+
+
+<dt class="dlterm"><strong>EJB client projects</strong></dt>
+
+<dd> <p>The EJB tooling supports the creation of EJB client JAR projects for
+EJB modules. An EJB client JAR project contains all the interface classes
+that a client program needs to use the client views of the enterprise beans
+that are contained in the EJB project. When you create an EJB client project
+for an EJB project, a new Java project is created and added to your
+workspace. The EJB client project is added as a project utility JAR file to
+each module that the EJB project belongs to.</p>
+<p>By default, when you use
+the wizard to create an EJB project, an EJB client JAR project is also created.
+However, you can clear this option in the wizard.</p>
+<div class="tip"><span class="tiptitle">Tip:</span> You
+can also add the EJB client project to another enterprise application that
+does not include the EJB project as a module. This will ensure that the EJB
+client JAR file is exported and packaged with the EAR file when the application
+is exported.</div>
+</dd>
+
+
+<dt class="dlterm"><strong>Enterprise beans</strong></dt>
+
+<dd> <p>An enterprise bean is a Java component that can be combined with
+other resources to create distributed client/server applications.</p>
+<p>There
+are three types of enterprise beans: entity beans, session beans, and message-driven
+beans. Typically, all types of beans are used together within an enterprise
+application.</p>
+<dl>
+<dt class="dlterm"><strong>Entity beans</strong></dt>
+
+<dd>Entity beans store permanent data. Entity beans with container-managed
+persistence (CMP) require database connections. Entity beans with bean-managed
+persistence manage permanent data in whichever manner is defined in the bean
+code. This can include writing to databases or XML files, for example.</dd>
+
+
+<dt class="dlterm"><strong>Session beans</strong></dt>
+
+<dd>Session beans do not require database access, though they can obtain it
+indirectly (as needed) by accessing entity beans. Session beans can also obtain
+direct access to databases (and other resources) through the use of resource
+references.</dd>
+
+
+<dt class="dlterm"><strong>Message-driven beans</strong></dt>
+
+<dd>Message-driven beans are a special kind of enterprise bean that act as
+message consumers in the JMS messaging system. As with standard JMS message
+consumers, message-driven beans perform business logic based on the message
+contents. In several ways, the dynamic creation and allocation of message-driven
+bean instances mimics the behavior of stateless session enterprise beans.
+However, message-driven beans are different from stateless session enterprise
+beans (and other types of enterprise beans) in a couple of ways:<ul>
+<li>Message-driven beans process multiple JMS messages asynchronously, rather
+than processing a serialized sequence of method calls.</li>
+
+<li>Message-driven beans have no home or remote interface, and therefore cannot
+be directly accessed by internal or external clients.</li>
+
+</ul>
+</dd>
+
+</dl>
+</dd>
+
+
+<dt class="dlterm"><strong>Deployment descriptors</strong></dt>
+
+<dd> <p>A deployment descriptor contains configuration data that the runtime
+environment uses for an application. A deployment descriptor can include information
+about the following: </p>
+<ul>
+<li>The structure and content (enterprise beans, for example) of the application.</li>
+
+<li>References to internal and external dependencies. For example, an enterprise
+bean in an EJB module can require another enterprise bean that is not bundled
+in the same module.</li>
+
+<li>References to resource factory objects, such as URLs or JDBC data sources.</li>
+
+<li>Security roles that the container uses when implementing the required
+access control for the application.</li>
+
+<li>Transactional information about how (and whether) the container is to
+manage transactions for the application.</li>
+
+</ul>
+<p>Deployment descriptors are XML files packaged with the application's
+files in a Java archive file. An EJB deployment descriptor is called
+ejb-jar.xml and is located in the <strong>META-INF</strong> folder of an EJB project.
+A J2EE application contains one application-level deployment descriptor file,
+governing the application as a whole. It also contains several component-level
+deployment descriptors, one for each module in the application.</p>
+</dd>
+
+</dl>
+
+</div>
+
+<div>
+<ul class="ullinks">
+<li class="ulchildlink"><strong><a href="../topics/tecrtpro.html">Creating EJB projects</a></strong><br />
+An EJB project is used to organize the resources contained in an EJB module.</li>
+<li class="ulchildlink"><strong><a href="../topics/ceclientjars.html">EJB 2.x client JAR projects</a></strong><br />
+An EJB client JAR project contains all the class files that a client program needs to use the client view of the enterprise beans that are contained in the EJB module.</li>
+<li class="ulchildlink"><strong><a href="../topics/teimp.html">Importing EJB 2.x JAR files</a></strong><br />
+You can import beans and other metadata from an EJB JAR file into a new or existing EJB project.</li>
+<li class="ulchildlink"><strong><a href="../topics/teexp.html">Exporting EJB 2.x projects to EJB JAR files</a></strong><br />
+After you have tested your enterprise beans, you can export the module into an EJB JAR file.</li>
+</ul>
+
+<div class="familylinks">
+<div class="parentlink"><strong>Parent topic:</strong> <a href="../topics/ceover.html" title="The workbench provides a specialized environment that you can use to develop and test enterprise beans that conform to the distributed component architecture defined in the Sun Microsystems Enterprise JavaBeans (EJB) version specification. This product supports the Enterprise JavaBeans 1.1, 2.0, 2.1, and 3.0 specification levels.">EJB 2.x application development</a></div>
+</div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/org.eclipse.jst.ejb.doc.user/topics/cpojosandee5.dita b/docs/org.eclipse.jst.ejb.doc.user/topics/cpojosandee5.dita
new file mode 100644
index 0000000..61e580d
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/topics/cpojosandee5.dita
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="utf-8"?>

+<!--Arbortext, Inc., 1988-2006, v.4002-->

+<!DOCTYPE concept PUBLIC "-//OASIS//DTD DITA Concept//EN"

+ "concept.dtd">

+<concept id="cejb3" xml:lang="en-us">

+<title>Plain old <tm tmclass="special" tmowner="Sun Microsystems, Inc." tmtype="tm"

+trademark="Java">Java</tm> objects</title>

+<titlealts>

+<navtitle>POJOs (Plain old Java objects)</navtitle>

+<searchtitle>Plain old Java objects (POJOs) in Java EE 5 EJB 3.0 applications</searchtitle>

+</titlealts>

+<shortdesc>Although POJOs existed before, they play a more important role

+in the programming methodology of <tm tmclass="special" tmowner="Sun Microsystems, Inc."

+tmtype="tm" trademark="Java">Java</tm> EE 5. Now, you can now create EJB applications

+with persistence capabilities by using enterprise beans and entities created

+from POJOs.</shortdesc>

+<prolog><metadata>

+<keywords><indexterm>Enterprise JavaBeans 3.0</indexterm></keywords>

+</metadata></prolog>

+<conbody>

+<p>The complexity of the <tm tmclass="special" tmowner="Sun Microsystems, Inc."

+tmtype="tm" trademark="Java">Java</tm> 2 Enterprise Edition framework used

+to present a major hurdle for adoption previously. The <tm tmclass="special"

+tmowner="Sun Microsystems, Inc." tmtype="tm" trademark="Java">Java</tm> EE

+5 specification sought a simpler development experience by making POJOs the

+basis of its design paradigm. The POJO programming model enables you to unit

+test outside of the application server, making the whole programming experience

+smoother.</p>

+<example><title>A simple POJO</title><p>The following code is an example of

+a simple POJO. Note that there are no references to any interfaces. To use

+this POJO as the basis for an EJB 2.1 application requires additional framework

+classes to support it and the class itself would have to implement additional

+interfaces.</p><codeblock>public class Test {

+

+    String name;

+

+		/**

+    *  This is a constructor for a Test Object.

+    **/

+    public Test(){

+    

+        name = "Jane";

+

+    } 

+

+}</codeblock><p>To create an EJB 3.0 bean, inject a component defining annotation

+at the class level. The following example turns a POJO into a stateless session

+bean by adding the @Stateless annotation.</p><codeblock>@Stateless

+

+String class Test {

+

+	String name;

+

+	/**

+	* This is a constructor for a Test Object.

+	**/

+	public Test () {

+

+			name = "jane";

+

+	}

+

+}</codeblock></example>

+<example>In a real application, the POJO needs additional business logic.

+The fundamental idea of using POJOs in the context of the <tm tmclass="special"

+tmowner="Sun Microsystems, Inc." tmtype="tm" trademark="Java">Java</tm> EE

+specification is to associate Metadata about your component to be associated

+directly in your POJO. This approach reduces the number of artifacts you need

+to deal with and makes it easier to ensure the integrity of your Metadata.</example>

+<example>The new POJO-based programming model also shifts your concentration

+to working on your <tm tmclass="special" tmowner="Sun Microsystems, Inc."

+tmtype="tm" trademark="Java">Java</tm> EE 5 components in your <tm tmclass="special"

+tmowner="Sun Microsystems, Inc." tmtype="tm" trademark="Java">Java</tm> editor

+as opposed to writing business logic in XML. By working with this application

+development software, you can take advantage of features that can even further

+simplify the process of developing <tm tmclass="special" tmowner="Sun Microsystems, Inc."

+tmtype="tm" trademark="Java">Java</tm> EE 5 applications (such as as-you-type

+validation, content assist, and refactoring). </example>

+</conbody>

+</concept>

diff --git a/docs/org.eclipse.jst.ejb.doc.user/topics/cpojosandee5.html b/docs/org.eclipse.jst.ejb.doc.user/topics/cpojosandee5.html
new file mode 100644
index 0000000..3d0c94f
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/topics/cpojosandee5.html
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html lang="en-us" xml:lang="en-us">
+<head>
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+<meta name="copyright" content="Copyright (c) 2000, 2011 IBM 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: IBM Corporation - initial API and implementation" />
+<meta name="DC.rights.owner" content="(C) Copyright 2000, 2011" />
+<meta content="public" name="security" />
+<meta content="index,follow" name="Robots" />
+<meta http-equiv="PICS-Label" content='(PICS-1.1 "http://www.icra.org/ratingsv02.html" l gen true r (cz 1 lz 1 nz 1 oz 1 vz 1) "http://www.rsac.org/ratingsv01.html" l gen true r (n 0 s 0 v 0 l 0) "http://www.classify.org/safesurf/" l gen true r (SS~~000 1))' />
+<meta content="concept" name="DC.Type" />
+<meta name="DC.Title" content="Plain old Java objects" />
+<meta name="abstract" content="Although POJOs existed before, they play a more important role in the programming methodology of Java EE 5. Now, you can now create EJB applications with persistence capabilities by using enterprise beans and entities created from POJOs." />
+<meta name="description" content="Although POJOs existed before, they play a more important role in the programming methodology of Java EE 5. Now, you can now create EJB applications with persistence capabilities by using enterprise beans and entities created from POJOs." />
+<meta content="Enterprise JavaBeans 3.0" name="DC.subject" />
+<meta content="Enterprise JavaBeans 3.0" name="keywords" />
+<meta scheme="URI" name="DC.Relation" content="../topics/ejbarch.html" />
+<meta content="XHTML" name="DC.Format" />
+<meta content="cejb3" name="DC.Identifier" />
+<meta content="en-us" name="DC.Language" />
+<link href="../../org.eclipse.wst.doc.user/common.css" type="text/css" rel="stylesheet" />
+<title>Plain old Java objects (POJOs) in Java EE 5 EJB 3.0 applications</title>
+</head>
+<body id="cejb3"><a name="cejb3"><!-- --></a>
+
+
+<h1 class="topictitle1">Plain old Java objects</h1>
+
+
+
+
+<div><p>Although POJOs existed before, they play a more important role
+in the programming methodology of Java™ EE 5. Now, you can now create EJB applications
+with persistence capabilities by using enterprise beans and entities created
+from POJOs.</p>
+
+<p>The complexity of the Java 2 Enterprise Edition framework used
+to present a major hurdle for adoption previously. The Java EE
+5 specification sought a simpler development experience by making POJOs the
+basis of its design paradigm. The POJO programming model enables you to unit
+test outside of the application server, making the whole programming experience
+smoother.</p>
+
+<div class="example"><h4 class="sectiontitle">A simple POJO</h4><p>The following code is an example of
+a simple POJO. Note that there are no references to any interfaces. To use
+this POJO as the basis for an EJB 2.1 application requires additional framework
+classes to support it and the class itself would have to implement additional
+interfaces.</p>
+<pre>public class Test {
+
+    String name;
+
+		/**
+    *  This is a constructor for a Test Object.
+    **/
+    public Test(){
+    
+        name = "Jane";
+
+    } 
+
+}</pre>
+<p>To create an EJB 3.0 bean, inject a component defining annotation
+at the class level. The following example turns a POJO into a stateless session
+bean by adding the @Stateless annotation.</p>
+<pre>@Stateless
+
+String class Test {
+
+	String name;
+
+	/**
+	* This is a constructor for a Test Object.
+	**/
+	public Test () {
+
+			name = "jane";
+
+	}
+
+}</pre>
+</div>
+
+<div class="example">In a real application, the POJO needs additional business logic.
+The fundamental idea of using POJOs in the context of the Java EE
+specification is to associate Metadata about your component to be associated
+directly in your POJO. This approach reduces the number of artifacts you need
+to deal with and makes it easier to ensure the integrity of your Metadata.</div>
+
+<div class="example">The new POJO-based programming model also shifts your concentration
+to working on your Java EE 5 components in your Java editor
+as opposed to writing business logic in XML. By working with this application
+development software, you can take advantage of features that can even further
+simplify the process of developing Java EE 5 applications (such as as-you-type
+validation, content assist, and refactoring). </div>
+
+</div>
+
+<div>
+<div class="familylinks">
+<div class="parentlink"><strong>Parent topic:</strong> <a href="../topics/ejbarch.html" title="This topic provides a high-level overview of the distributed component architecture defined in the Sun Microsystems Enterprise JavaBeans (EJB) version 3.0 architecture specification.">EJB 3.0 and EJB 3.1 architecture</a></div>
+</div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/org.eclipse.jst.ejb.doc.user/topics/ejbarch.dita b/docs/org.eclipse.jst.ejb.doc.user/topics/ejbarch.dita
new file mode 100644
index 0000000..5ac3c4d
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/topics/ejbarch.dita
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--Arbortext, Inc., 1988-2009, v.4002-->
+<!DOCTYPE concept PUBLIC "-//OASIS//DTD DITA Concept//EN"
+ "concept.dtd">
+<?Pub Sty _display FontColor="red"?>
+<concept id="ejbarch" xml:lang="en-us">
+<title>EJB 3.0 and EJB 3.1 architecture</title><?Pub Caret 8?>
+<shortdesc>This topic provides a high-level overview of the distributed
+component architecture defined in the Sun Microsystems Enterprise <tm
+tmclass="special" tmowner="Sun Microsystems, Inc." tmtype="tm"
+trademark="JavaBeans">JavaBeans</tm> (EJB) version 3.0 architecture
+specification.</shortdesc>
+<prolog><metadata>
+<keywords><indexterm>architecture<indexterm>EJB 3.0 and EJB 3.1</indexterm></indexterm>
+<indexterm>EJB 3.0 and EJB 3.1<indexterm>architecture<indexterm>3.0</indexterm></indexterm></indexterm>
+</keywords>
+</metadata></prolog>
+<conbody>
+<p><b>Enterprise <tm tmclass="special" tmowner="Sun Microsystems, Inc."
+tmtype="tm" trademark="JavaBeans">JavaBeans</tm></b> is a standard
+server-side component model for distributed business applications.
+The EJB specification is part of the <b><tm tmclass="special"
+tmowner="Sun Microsystems, Inc." tmtype="tm" trademark="Java">Java</tm> Platform
+Enterprise Edition</b>.</p>
+<p><b>EJB 3.0 and EJB 3.1</b> makes it much easier to develop EJBs,
+using annotations rather than the complex deployment descriptors used
+in version 2.x. The use of home and remote interfaces and the <i>ejb-jar.xml</i> file
+are also no longer required in this release. They are replaced with
+a business interface and a bean class that implements the interface.</p>
+<p>For more information about EJB 3.0 and EJB 3.1 specification go
+to the following Web site: <xref format="html"
+href="http://java.sun.com/products/ejb/docs.html#specs" scope="external">http://java.sun.com<desc></desc></xref> </p>
+</conbody>
+</concept>
+<?Pub *0000001865?>
diff --git a/docs/org.eclipse.jst.ejb.doc.user/topics/ejbarch.html b/docs/org.eclipse.jst.ejb.doc.user/topics/ejbarch.html
new file mode 100644
index 0000000..8ed241d
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/topics/ejbarch.html
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html lang="en-us" xml:lang="en-us">
+<head>
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+<meta name="copyright" content="Copyright (c) 2000, 2011 IBM 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: IBM Corporation - initial API and implementation" />
+<meta name="DC.rights.owner" content="(C) Copyright 2000, 2011" />
+<meta content="public" name="security" />
+<meta content="index,follow" name="Robots" />
+<meta http-equiv="PICS-Label" content='(PICS-1.1 "http://www.icra.org/ratingsv02.html" l gen true r (cz 1 lz 1 nz 1 oz 1 vz 1) "http://www.rsac.org/ratingsv01.html" l gen true r (n 0 s 0 v 0 l 0) "http://www.classify.org/safesurf/" l gen true r (SS~~000 1))' />
+<meta content="concept" name="DC.Type" />
+<meta name="DC.Title" content="EJB 3.0 and EJB 3.1 architecture" />
+<meta name="abstract" content="This topic provides a high-level overview of the distributed component architecture defined in the Sun Microsystems Enterprise JavaBeans (EJB) version 3.0 architecture specification." />
+<meta name="description" content="This topic provides a high-level overview of the distributed component architecture defined in the Sun Microsystems Enterprise JavaBeans (EJB) version 3.0 architecture specification." />
+<meta content="architecture, EJB 3.0 and EJB 3.1, 3.0" name="DC.subject" />
+<meta content="architecture, EJB 3.0 and EJB 3.1, 3.0" name="keywords" />
+<meta scheme="URI" name="DC.Relation" content="../topics/ceover.html" />
+<meta scheme="URI" name="DC.Relation" content="../topics/cpojosandee5.html" />
+<meta scheme="URI" name="DC.Relation" content="../topics/cejb3vejb21.html" />
+<meta content="XHTML" name="DC.Format" />
+<meta content="ejbarch" name="DC.Identifier" />
+<meta content="en-us" name="DC.Language" />
+<link href="../../org.eclipse.wst.doc.user/common.css" type="text/css" rel="stylesheet" />
+<title>EJB 3.0 and EJB 3.1 architecture</title>
+</head>
+<body id="ejbarch"><a name="ejbarch"><!-- --></a>
+
+
+<h1 class="topictitle1">EJB 3.0 and EJB 3.1 architecture</h1>
+
+
+
+<div><p>This topic provides a high-level overview of the distributed
+component architecture defined in the Sun Microsystems Enterprise JavaBeans™ (EJB) version 3.0 architecture
+specification.</p>
+
+<p><strong>Enterprise JavaBeans</strong> is a standard
+server-side component model for distributed business applications.
+The EJB specification is part of the <strong>Java™ Platform
+Enterprise Edition</strong>.</p>
+
+<p><strong>EJB 3.0 and EJB 3.1</strong> makes it much easier to develop EJBs,
+using annotations rather than the complex deployment descriptors used
+in version 2.x. The use of home and remote interfaces and the <em>ejb-jar.xml</em> file
+are also no longer required in this release. They are replaced with
+a business interface and a bean class that implements the interface.</p>
+
+<p>For more information about EJB 3.0 and EJB 3.1 specification go
+to the following Web site: <a href="http://java.sun.com/products/ejb/docs.html#specs" target="_blank" title="">http://java.sun.com</a> </p>
+
+</div>
+
+<div>
+<ul class="ullinks">
+<li class="ulchildlink"><strong><a href="../topics/cpojosandee5.html">Plain old Java objects</a></strong><br />
+Although POJOs existed before, they play a more important role in the programming methodology of Java EE 5. Now, you can now create EJB applications with persistence capabilities by using enterprise beans and entities created from POJOs.</li>
+<li class="ulchildlink"><strong><a href="../topics/cejb3vejb21.html">Differences between EJB 3.0 and EJB 2.1</a></strong><br />
+Compared to EJB 2.1, EJB 3.0 simplifies the process of creating Enterprise JavaBean applications.</li>
+</ul>
+
+<div class="familylinks">
+<div class="parentlink"><strong>Parent topic:</strong> <a href="../topics/ceover.html" title="The workbench provides a specialized environment that you can use to develop and test enterprise beans that conform to the distributed component architecture defined in the Sun Microsystems Enterprise JavaBeans (EJB) version specification. This product supports the Enterprise JavaBeans 1.1, 2.0, 2.1, and 3.0 specification levels.">EJB 2.x application development</a></div>
+</div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/org.eclipse.jst.ejb.doc.user/topics/messb.dita b/docs/org.eclipse.jst.ejb.doc.user/topics/messb.dita
new file mode 100644
index 0000000..bc4b998
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/topics/messb.dita
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Arbortext, Inc., 1988-2006, v.4002-->
+<!DOCTYPE concept PUBLIC "-//OASIS//DTD DITA Concept//EN"
+ "concept.dtd">
+<concept id="messb" xml:lang="en-us">
+<title>Message-driven Beans</title>
+<shortdesc></shortdesc>
+<prolog><metadata>
+<keywords><indexterm>message-driven beans<indexterm>overview</indexterm></indexterm>
+</keywords>
+</metadata></prolog>
+<conbody>
+<p>A <b>message-driven bean</b> is an enterprise bean that allows <tm tmclass="special"
+tmowner="Sun Microsystems, Inc." tmtype="tm" trademark="Java">Java</tm> EE
+applications to process messages asynchronously. It acts as a <tm tmclass="special"
+tmowner="Sun Microsystems, Inc." tmtype="tm" trademark="Java">Java</tm> Message
+Service (JMS) message listener, which is similar to an event listener except
+that it receives messages instead of events. The messages may be sent by any <tm
+tmclass="special" tmowner="Sun Microsystems, Inc." tmtype="tm" trademark="Java">Java</tm> EE
+component - an application client, another enterprise bean, or a Web component
+- or by a JMS application or system that does not use <tm tmclass="special"
+tmowner="Sun Microsystems, Inc." tmtype="tm" trademark="Java">Java</tm> EE
+technology.</p>
+<p>In JMS, a message is a <tm tmclass="special" tmowner="Sun Microsystems, Inc."
+tmtype="tm" trademark="Java">Java</tm> object with two parts: a <b>header</b> and
+a <b>body</b>. The header is composed of delivery information and metadata.
+The message body carries the application data, which can take several forms:
+text, serializable objects, byte streams, etc. The JMS API defines several
+message types (<b>TextMessage, MapMessage, ObjectMessage</b>, and others)
+and provides methods for delivering messages to and receiving messages from
+other applications.</p>
+</conbody>
+</concept>
diff --git a/docs/org.eclipse.jst.ejb.doc.user/topics/messb.html b/docs/org.eclipse.jst.ejb.doc.user/topics/messb.html
new file mode 100644
index 0000000..7bdb70b
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/topics/messb.html
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html lang="en-us" xml:lang="en-us">
+<head>
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+<meta name="copyright" content="Copyright (c) 2000, 2008 IBM 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: IBM Corporation - initial API and implementation" />
+<meta name="DC.rights.owner" content="(C) Copyright 2000, 2008" />
+<meta content="public" name="security" />
+<meta content="index,follow" name="Robots" />
+<meta http-equiv="PICS-Label" content='(PICS-1.1 "http://www.icra.org/ratingsv02.html" l gen true r (cz 1 lz 1 nz 1 oz 1 vz 1) "http://www.rsac.org/ratingsv01.html" l gen true r (n 0 s 0 v 0 l 0) "http://www.classify.org/safesurf/" l gen true r (SS~~000 1))' />
+<meta content="concept" name="DC.Type" />
+<meta name="DC.Title" content="Message-driven Beans" />
+<meta name="abstract" content="" />
+<meta name="description" content="" />
+<meta content="message-driven beans, overview" name="DC.subject" />
+<meta content="message-driven beans, overview" name="keywords" />
+<meta scheme="URI" name="DC.Relation" content="../topics/messbwiz.html" />
+<meta content="XHTML" name="DC.Format" />
+<meta content="messb" name="DC.Identifier" />
+<meta content="en-us" name="DC.Language" />
+<link href="../../../org.eclipse.wst.doc.user/common.css" type="text/css" rel="stylesheet" />
+<title>Message-driven Beans</title>
+</head>
+<body id="messb"><a name="messb"><!-- --></a>
+
+
+<h1 class="topictitle1">Message-driven Beans</h1>
+
+
+
+<div><p />
+
+<p>A <strong>message-driven bean</strong> is an enterprise bean that allows Java™ EE
+applications to process messages asynchronously. It acts as a Java Message
+Service (JMS) message listener, which is similar to an event listener except
+that it receives messages instead of events. The messages may be sent by any Java EE
+component - an application client, another enterprise bean, or a Web component
+- or by a JMS application or system that does not use Java EE
+technology.</p>
+
+<p>In JMS, a message is a Java object with two parts: a <strong>header</strong> and
+a <strong>body</strong>. The header is composed of delivery information and metadata.
+The message body carries the application data, which can take several forms:
+text, serializable objects, byte streams, etc. The JMS API defines several
+message types (<strong>TextMessage, MapMessage, ObjectMessage</strong>, and others)
+and provides methods for delivering messages to and receiving messages from
+other applications.</p>
+
+</div>
+
+<div>
+<div class="familylinks">
+<div class="parentlink"><strong>Parent topic:</strong> <a href="../topics/messbwiz.html" title="You can use a wizard to create a message-driven bean and add it to your project.">Creating Message-driven Beans</a></div>
+</div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/org.eclipse.jst.ejb.doc.user/topics/messbwiz.dita b/docs/org.eclipse.jst.ejb.doc.user/topics/messbwiz.dita
new file mode 100644
index 0000000..f076bea
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/topics/messbwiz.dita
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Arbortext, Inc., 1988-2006, v.4002-->
+<!DOCTYPE task PUBLIC "-//OASIS//DTD DITA Task//EN"
+ "task.dtd">
+<task id="messbwiz" xml:lang="en-us">
+<title>Creating Message-driven Beans</title>
+<shortdesc>You can use a wizard to create a message-driven bean and add it
+to your project.</shortdesc>
+<prolog><metadata>
+<keywords><indexterm>message-driven beans<indexterm>creating</indexterm></indexterm>
+</keywords>
+</metadata></prolog>
+<taskbody>
+<context><p>The message-driven bean wizard helps you create an Enterprise
+message-driven bean by walking you through the creation process and by providing
+you with output files that you can use or that you can modify for use with
+your application.</p> <p>To create a message-driven bean, complete the following
+steps:</p></context>
+<steps>
+<step><cmd>From the <tm tmclass="special" tmowner="Sun Microsystems, Inc."
+tmtype="tm" trademark="Java">Java</tm> EE perspective, expand your  EJB project
+in the Project Explorer view.</cmd></step>
+<step><cmd>Right click on the <b>Message-Driven Bean</b> icon, and select <menucascade>
+<uicontrol>New</uicontrol><uicontrol>Message-Driven Bean</uicontrol></menucascade> from
+the pop-up menu.</cmd><stepresult> The <uicontrol>Create Message-Driven Bean</uicontrol> wizard
+appears.</stepresult></step>
+<step><cmd>Follow the project wizard prompts.</cmd></step>
+</steps>
+<postreq><p><b>General Information</b></p><dl><dlentry>
+<dt><b>Destination name</b></dt>
+<dd>This field provides the attribute <b>mappedName</b> to the <b>@MessageDriven</b> annotation.
+This attribute specifies the product-specific name to which the message-driven
+bean should be mapped. You can also use this attribute to specify the JNDI
+name of the destination from which the bean will consume messages.</dd>
+</dlentry></dl> <dl><dlentry>
+<dt><b>Destination type</b></dt>
+<dd>To send a JMS message, we need a connection to the JMS provider and a
+destination address for the message. A JMS connection factory makes the connection
+to the provider possible. In JMS, messages are not sent directly to applications;
+they are sent to topics or queues:<dl><dlentry>
+<dt>Queue:</dt>
+<dd>Queue is used as a destination for pointtopoint messaging. The <b>point-to-point</b> 
+messaging model allows JMS clients to send and receive messages both synchronously
+and asynchronously via virtual channels known as <i>queues</i>. The p2p messaging
+model has traditionally been a pull- or polling-based model, where messages
+are requested from the queue instead of being pushed to the client automatically.
+A queue may have multiple receivers, but only one receiver may receive each
+message.  Messages holding this queue are of <b>MapMessages</b> type, which
+stores the information about the email as name/value pair.</dd>
+</dlentry><dlentry>
+<dt>Topic:</dt>
+<dd>Topic is used as a destination for publish/subscribe messaging. In <b>publish-and-subscribe</b> 
+messaging, one producer can send a message to many consumers through a virtual
+channel called a <i>topic</i>. Consumers can choose to subscribe to a topic.
+Any messages addressed to a topic are delivered to all the topic's consumers.
+Every consumer receives a copy of each message. The pub/sub messaging model
+is a push-based model, where messages are automatically broadcast to consumers
+without them having to request or poll the topic for new messages. In the
+pub/sub messaging model, the producer sending the message is not dependent
+on the consumers receiving the message. Optionally, JMS clients that use pub/sub
+can establish durable subscriptions that allow consumers to disconnect and
+later reconnect and collect messages that were published while they were disconnected.</dd>
+</dlentry></dl></dd>
+</dlentry></dl> <dl><dlentry>
+<dt><b>Transaction type</b></dt>
+<dd>The <b>Transaction type</b> field is used to specify whether the transaction
+is handled by the <b>Container</b> or the <b>Bean</b>.</dd>
+</dlentry></dl> <dl><dlentry>
+<dt><b>Interfaces</b></dt>
+<dd>Message-driven beans usually implement the <b>javax.jms.MessageListener</b> 
+interface. A <i>MessageListener object</i> is used to receive asynchronously
+delivered messages. This interface defines the <b>onMessage()</b> method.
+This method processes the JMS messages received by a bean.</dd>
+</dlentry></dl></postreq>
+</taskbody>
+</task>
diff --git a/docs/org.eclipse.jst.ejb.doc.user/topics/messbwiz.html b/docs/org.eclipse.jst.ejb.doc.user/topics/messbwiz.html
new file mode 100644
index 0000000..a3571e3
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/topics/messbwiz.html
@@ -0,0 +1,134 @@
+<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html lang="en-us" xml:lang="en-us">
+<head>
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+<meta name="copyright" content="Copyright (c) 2000, 2008 IBM 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: IBM Corporation - initial API and implementation" />
+<meta name="DC.rights.owner" content="(C) Copyright 2000, 2008" />
+<meta content="public" name="security" />
+<meta content="index,follow" name="Robots" />
+<meta http-equiv="PICS-Label" content='(PICS-1.1 "http://www.icra.org/ratingsv02.html" l gen true r (cz 1 lz 1 nz 1 oz 1 vz 1) "http://www.rsac.org/ratingsv01.html" l gen true r (n 0 s 0 v 0 l 0) "http://www.classify.org/safesurf/" l gen true r (SS~~000 1))' />
+<meta content="task" name="DC.Type" />
+<meta name="DC.Title" content="Creating Message-driven Beans" />
+<meta name="abstract" content="You can use a wizard to create a message-driven bean and add it to your project." />
+<meta name="description" content="You can use a wizard to create a message-driven bean and add it to your project." />
+<meta content="message-driven beans, creating" name="DC.subject" />
+<meta content="message-driven beans, creating" name="keywords" />
+<meta scheme="URI" name="DC.Relation" content="../topics/ceover.html" />
+<meta scheme="URI" name="DC.Relation" content="../topics/messb.html" />
+<meta content="XHTML" name="DC.Format" />
+<meta content="messbwiz" name="DC.Identifier" />
+<meta content="en-us" name="DC.Language" />
+<link href="../../../org.eclipse.wst.doc.user/common.css" type="text/css" rel="stylesheet" />
+<title>Creating Message-driven Beans</title>
+</head>
+<body id="messbwiz"><a name="messbwiz"><!-- --></a>
+
+
+<h1 class="topictitle1">Creating Message-driven Beans</h1>
+
+
+
+<div><p>You can use a wizard to create a message-driven bean and add it
+to your project.</p>
+
+<div class="section"><p>The message-driven bean wizard helps you create an Enterprise
+message-driven bean by walking you through the creation process and by providing
+you with output files that you can use or that you can modify for use with
+your application.</p>
+ <p>To create a message-driven bean, complete the following
+steps:</p>
+</div>
+
+<ol>
+<li class="stepexpand"><span>From the Java™ EE perspective, expand your  EJB project
+in the Project Explorer view.</span></li>
+
+<li class="stepexpand"><span>Right click on the <strong>Message-Driven Bean</strong> icon, and select <span class="menucascade">
+<span class="uicontrol">New</span> &gt; <span class="uicontrol">Message-Driven Bean</span></span> from
+the pop-up menu.</span>  The <span class="uicontrol">Create Message-Driven Bean</span> wizard
+appears.</li>
+
+<li class="stepexpand"><span>Follow the project wizard prompts.</span></li>
+
+</ol>
+
+<div class="section"><p><strong>General Information</strong></p>
+<dl>
+<dt class="dlterm"><strong>Destination name</strong></dt>
+
+<dd>This field provides the attribute <strong>mappedName</strong> to the <strong>@MessageDriven</strong> annotation.
+This attribute specifies the product-specific name to which the message-driven
+bean should be mapped. You can also use this attribute to specify the JNDI
+name of the destination from which the bean will consume messages.</dd>
+
+</dl>
+ <dl>
+<dt class="dlterm"><strong>Destination type</strong></dt>
+
+<dd>To send a JMS message, we need a connection to the JMS provider and a
+destination address for the message. A JMS connection factory makes the connection
+to the provider possible. In JMS, messages are not sent directly to applications;
+they are sent to topics or queues:<dl>
+<dt class="dlterm">Queue:</dt>
+
+<dd>Queue is used as a destination for pointtopoint messaging. The <strong>point-to-point</strong> 
+messaging model allows JMS clients to send and receive messages both synchronously
+and asynchronously via virtual channels known as <em>queues</em>. The p2p messaging
+model has traditionally been a pull- or polling-based model, where messages
+are requested from the queue instead of being pushed to the client automatically.
+A queue may have multiple receivers, but only one receiver may receive each
+message.  Messages holding this queue are of <strong>MapMessages</strong> type, which
+stores the information about the email as name/value pair.</dd>
+
+
+<dt class="dlterm">Topic:</dt>
+
+<dd>Topic is used as a destination for publish/subscribe messaging. In <strong>publish-and-subscribe</strong> 
+messaging, one producer can send a message to many consumers through a virtual
+channel called a <em>topic</em>. Consumers can choose to subscribe to a topic.
+Any messages addressed to a topic are delivered to all the topic's consumers.
+Every consumer receives a copy of each message. The pub/sub messaging model
+is a push-based model, where messages are automatically broadcast to consumers
+without them having to request or poll the topic for new messages. In the
+pub/sub messaging model, the producer sending the message is not dependent
+on the consumers receiving the message. Optionally, JMS clients that use pub/sub
+can establish durable subscriptions that allow consumers to disconnect and
+later reconnect and collect messages that were published while they were disconnected.</dd>
+
+</dl>
+</dd>
+
+</dl>
+ <dl>
+<dt class="dlterm"><strong>Transaction type</strong></dt>
+
+<dd>The <strong>Transaction type</strong> field is used to specify whether the transaction
+is handled by the <strong>Container</strong> or the <strong>Bean</strong>.</dd>
+
+</dl>
+ <dl>
+<dt class="dlterm"><strong>Interfaces</strong></dt>
+
+<dd>Message-driven beans usually implement the <strong>javax.jms.MessageListener</strong> 
+interface. A <em>MessageListener object</em> is used to receive asynchronously
+delivered messages. This interface defines the <strong>onMessage()</strong> method.
+This method processes the JMS messages received by a bean.</dd>
+
+</dl>
+</div>
+
+</div>
+
+<div>
+<ul class="ullinks">
+<li class="ulchildlink"><strong><a href="../topics/messb.html">Message-driven Beans</a></strong><br />
+</li>
+</ul>
+
+<div class="familylinks">
+<div class="parentlink"><strong>Parent topic:</strong> <a href="../topics/ceover.html" title="The workbench provides a specialized environment that you can use to develop and test enterprise beans that conform to the distributed component architecture defined in the Sun Microsystems Enterprise JavaBeans (EJB) version specification. This product supports the Enterprise JavaBeans 1.1, 2.0, 2.1, and 3.0 specification levels.">EJB 2.x application development</a></div>
+</div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/org.eclipse.jst.ejb.doc.user/topics/sessb.dita b/docs/org.eclipse.jst.ejb.doc.user/topics/sessb.dita
new file mode 100644
index 0000000..977a513
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/topics/sessb.dita
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Arbortext, Inc., 1988-2006, v.4002-->
+<!DOCTYPE concept PUBLIC "-//OASIS//DTD DITA Concept//EN"
+ "concept.dtd">
+<concept id="sessb" xml:lang="en-us">
+<title>Session Beans</title>
+<shortdesc></shortdesc>
+<prolog><metadata>
+<keywords><indexterm>session beans<indexterm>overview</indexterm></indexterm>
+</keywords>
+</metadata></prolog>
+<conbody>
+<p>A <b>session bean</b> is a type of enterprise bean. It is created by a
+client and usually exists only for the duration of a single client-server
+session.</p>
+<p>Session beans are useful for describing interactions between other beans
+(taskflow) and for implementing particular tasks. They do not represent data
+in the database, but they can access data, so we can use session beans to
+read, update, and insert data in a business process. Session beans access
+data that spans concepts, is not shared, and is usually read-only. Session
+beans contain business logic, and entities model persistent data. There are 
+three types of session beans: stateless, stateful and singleton. </p>
+<ul>
+<li><b>Stateless session beans</b> <p>A stateless session bean is pooled by
+the container to handle multiple requests from multiple clients and does not
+maintain any conversational state.</p> </li>
+<li> <b>Stateful session beans</b> <p>A stateful session bean acts on behalf
+of a single client and maintains client-specific session information (called
+conversational state) across multiple method calls and transactions. It exists
+for the duration of a single client/server session.</p> </li>
+<li> <b>Singleton session beans</b> <p>A Singleton session bean is a session 
+bean component that is instantiated once per application. In cases where the container 
+is distributed over many virtual machines, each application will have one bean instance 
+of the Singleton for each JVM.</p> </li>
+</ul>
+</conbody>
+</concept>
diff --git a/docs/org.eclipse.jst.ejb.doc.user/topics/sessb.html b/docs/org.eclipse.jst.ejb.doc.user/topics/sessb.html
new file mode 100644
index 0000000..3337d17
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/topics/sessb.html
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html lang="en-us" xml:lang="en-us">
+<head>
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+<meta name="copyright" content="Copyright (c) 2000, 2008 IBM 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: IBM Corporation - initial API and implementation" />
+<meta name="DC.rights.owner" content="(C) Copyright 2000, 2008" />
+<meta content="public" name="security" />
+<meta content="index,follow" name="Robots" />
+<meta http-equiv="PICS-Label" content='(PICS-1.1 "http://www.icra.org/ratingsv02.html" l gen true r (cz 1 lz 1 nz 1 oz 1 vz 1) "http://www.rsac.org/ratingsv01.html" l gen true r (n 0 s 0 v 0 l 0) "http://www.classify.org/safesurf/" l gen true r (SS~~000 1))' />
+<meta content="concept" name="DC.Type" />
+<meta name="DC.Title" content="Session Beans" />
+<meta name="abstract" content="" />
+<meta name="description" content="" />
+<meta content="session beans, overview" name="DC.subject" />
+<meta content="session beans, overview" name="keywords" />
+<meta scheme="URI" name="DC.Relation" content="../topics/sessbwiz.html" />
+<meta content="XHTML" name="DC.Format" />
+<meta content="sessb" name="DC.Identifier" />
+<meta content="en-us" name="DC.Language" />
+<link href="../../../org.eclipse.wst.doc.user/common.css" type="text/css" rel="stylesheet" />
+<title>Session Beans</title>
+</head>
+<body id="sessb"><a name="sessb"><!-- --></a>
+
+
+<h1 class="topictitle1">Session Beans</h1>
+
+
+
+<div><p />
+
+<p>A <strong>session bean</strong> is a type of enterprise bean. It is created by a
+client and usually exists only for the duration of a single client-server
+session.</p>
+
+<p>Session beans are useful for describing interactions between other beans
+(taskflow) and for implementing particular tasks. They do not represent data
+in the database, but they can access data, so we can use session beans to
+read, update, and insert data in a business process. Session beans access
+data that spans concepts, is not shared, and is usually read-only. Session
+beans contain business logic, and entities model persistent data. There are 
+three types of session beans: stateless, stateful and singleton. </p>
+
+<ul>
+<li><strong>Stateless session beans</strong> <p>A stateless session bean is pooled by
+the container to handle multiple requests from multiple clients and does not
+maintain any conversational state.</p>
+ </li>
+
+<li> <strong>Stateful session beans</strong> <p>A stateful session bean acts on behalf
+of a single client and maintains client-specific session information (called
+conversational state) across multiple method calls and transactions. It exists
+for the duration of a single client/server session.</p>
+ </li>
+ 
+<li> <strong>Singleton session beans</strong> <p>A Singleton session bean is a session 
+bean component that is instantiated once per application. In cases where the container 
+is distributed over many virtual machines, each application will have one bean instance 
+of the Singleton for each JVM.</p>
+ </li>
+
+</ul>
+
+</div>
+
+<div>
+<div class="familylinks">
+<div class="parentlink"><strong>Parent topic:</strong> <a href="../topics/sessbwiz.html" title="You can use a wizard to create a session bean and add it to your project.">Creating EJB Session Beans</a></div>
+</div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/org.eclipse.jst.ejb.doc.user/topics/sessbwiz.dita b/docs/org.eclipse.jst.ejb.doc.user/topics/sessbwiz.dita
new file mode 100644
index 0000000..057cb1f
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/topics/sessbwiz.dita
@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--Arbortext, Inc., 1988-2009, v.4002-->
+<!DOCTYPE task PUBLIC "-//OASIS//DTD DITA Task//EN"
+ "task.dtd">
+<task id="sessbwiz" xml:lang="en-us">
+<title>Creating EJB Session Beans</title>
+<shortdesc>You can use a wizard to create a session bean and add it
+to your project.</shortdesc>
+<prolog><metadata>
+<keywords><indexterm>session beans</indexterm><indexterm>creating</indexterm>
+</keywords>
+</metadata></prolog>
+<taskbody>
+<context><p>The session bean wizard helps you create an Enterprise
+session bean by walking you through the creation process and by providing
+you with output files that you can use or that you can modify for
+use with your application.</p> <p>To create a session bean, complete
+the following steps:</p></context>
+<steps>
+<step><cmd>From the <tm tmclass="special"
+tmowner="Sun Microsystems, Inc." tmtype="tm" trademark="Java">Java</tm> EE
+perspective, expand your  EJB project in the Project Explorer view.</cmd>
+</step>
+<step><cmd>Right click on the <b>Session Bean</b> icon, and select <menucascade>
+<uicontrol>New</uicontrol><uicontrol>Session Bean</uicontrol>
+</menucascade> from the pop-up menu.</cmd><stepresult> The <uicontrol>Create
+Session Bean</uicontrol> wizard appears.</stepresult></step>
+<step><cmd>Follow the project wizard prompts.</cmd></step>
+</steps>
+<postreq><p><b>General Information</b></p><dl><dlentry>
+<dt>State type</dt>
+<dd>There are three types of session beans: stateless, stateful and
+singleton. <dl><dlentry>
+<dt>Stateless session beans</dt>
+<dd>A stateless session bean is a collection of related services,
+each represented by a method; the bean maintains no state from one
+method invocation to the next. When you invoke a method on a stateless
+session bean, it executes the method and returns the result without
+knowing or caring what other requests have gone before or might follow.
+Stateless session beans have longer lives because they do not maintain
+any conversational state.</dd>
+</dlentry><dlentry>
+<dt>Stateful session beans</dt>
+<dd>A stateful session bean performs tasks on behalf of a client and
+maintains state related to that client. This state is called conversational
+state because it represents a continuing conversation between the
+stateful session bean and the client. Methods invoked on a stateful
+session bean can write and read data to and from this conversational
+state, which is shared among all methods in the bean. Stateful session
+beans have timeout periods.</dd>
+</dlentry><dlentry>
+<dt>Singleton session beans</dt>
+<dd>A Singleton session bean is a session bean component that is instantiated
+ once per application. In cases where the container is distributed
+over many virtual  machines, each application will have one bean instance
+of the Singleton for each JVM.  Once instantiated, a Singleton session
+bean instance lives for the duration of the  application in which
+it is created. It maintains its state between client invocations 
+but that state is not required to survive container shutdown or crash.
+A Singleton  session bean is intended to be shared and supports concurrent
+access.</dd>
+</dlentry></dl></dd>
+</dlentry></dl> <dl><dlentry>
+<dt>Business interface</dt>
+<dd>A business interface of a session bean is an ordinary <tm
+tmclass="special" tmowner="Sun Microsystems, Inc." tmtype="tm"
+trademark="Java">Java</tm> interface that contains the business methods
+for the bean. A reference to a session bean's business interface can
+be passed as a parameter or as a return value of a business interface
+method. It contains methods to initialize a session bean's state and
+to notify the EJB container when the reference is no more needed and
+can be removed. The business interfaces are two types:<dl><dlentry>
+<dt>Remote business interface:</dt>
+<dd>The client can run on a different machine or different <tm
+tmclass="special" tmowner="Sun Microsystems, Inc." tmtype="tm"
+trademark="Java">Java</tm> virtual machine than the enterprise bean
+it accesses and the location of the bean is transparent.</dd>
+</dlentry><dlentry>
+<dt>Local business interface:</dt>
+<dd>The client must run on the same <tm tmclass="special"
+tmowner="Sun Microsystems, Inc." tmtype="tm" trademark="Java">Java</tm> virtual
+machine as the bean it accesses and the location of the enterprise
+bean is not transparent.</dd>
+</dlentry><dlentry>
+<dt>No-interface View:</dt><?Pub Caret 17?>
+<dd>This is a variation of the Local view that exposes the public
+methods of the  bean class without the use of a separate business
+interface.</dd>
+</dlentry></dl></dd>
+</dlentry></dl> <dl><dlentry>
+<dt>Mapped name</dt>
+<dd>Specifies the bean's global JNDI name. The use of mappedName attribute
+allows you to assign names which you can use to search the EJB bean
+through the remote client.</dd>
+</dlentry></dl> <dl><dlentry>
+<dt>Transaction type</dt>
+<dd>The <b>Transaction type</b> field is used to specify whether the
+transaction is handled by the <b>Container</b> or the <b>Bean</b>.</dd>
+</dlentry></dl> <dl><dlentry>
+<dt>Home and Components Interfaces</dt>
+<dd>Home and component interfaces are used only for EJB 2.x session
+beans.<dl><dlentry>
+<dt>Home interface:</dt>
+<dd>The home interface allows a client to create, remove and find
+existing instances of enterprise beans.</dd>
+</dlentry><dlentry>
+<dt>Component interface:</dt>
+<dd>The component interface allows a client to access the business
+methods of the enterprise bean.</dd>
+</dlentry></dl></dd>
+</dlentry></dl></postreq>
+</taskbody>
+</task>
+<?Pub *0000005511?>
diff --git a/docs/org.eclipse.jst.ejb.doc.user/topics/sessbwiz.html b/docs/org.eclipse.jst.ejb.doc.user/topics/sessbwiz.html
new file mode 100644
index 0000000..884c789
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/topics/sessbwiz.html
@@ -0,0 +1,173 @@
+<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html lang="en-us" xml:lang="en-us">
+<head>
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+<meta name="copyright" content="Copyright (c) 2000, 2008 IBM 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: IBM Corporation - initial API and implementation" />
+<meta name="DC.rights.owner" content="(C) Copyright 2000, 2008" />
+<meta content="public" name="security" />
+<meta content="index,follow" name="Robots" />
+<meta http-equiv="PICS-Label" content='(PICS-1.1 "http://www.icra.org/ratingsv02.html" l gen true r (cz 1 lz 1 nz 1 oz 1 vz 1) "http://www.rsac.org/ratingsv01.html" l gen true r (n 0 s 0 v 0 l 0) "http://www.classify.org/safesurf/" l gen true r (SS~~000 1))' />
+<meta content="task" name="DC.Type" />
+<meta name="DC.Title" content="Creating EJB Session Beans" />
+<meta name="abstract" content="You can use a wizard to create a session bean and add it to your project." />
+<meta name="description" content="You can use a wizard to create a session bean and add it to your project." />
+<meta content="session beans, creating" name="DC.subject" />
+<meta content="session beans, creating" name="keywords" />
+<meta scheme="URI" name="DC.Relation" content="../topics/ceover.html" />
+<meta scheme="URI" name="DC.Relation" content="../topics/sessb.html" />
+<meta content="XHTML" name="DC.Format" />
+<meta content="sessbwiz" name="DC.Identifier" />
+<meta content="en-us" name="DC.Language" />
+<link href="../../../org.eclipse.wst.doc.user/common.css" type="text/css" rel="stylesheet" />
+<title>Creating EJB Session Beans</title>
+</head>
+<body id="sessbwiz"><a name="sessbwiz"><!-- --></a>
+
+
+<h1 class="topictitle1">Creating EJB Session Beans</h1>
+
+
+
+<div><p>You can use a wizard to create a session bean and add it to your
+project.</p>
+
+<div class="section"><p>The session bean wizard helps you create an Enterprise session
+bean by walking you through the creation process and by providing you with
+output files that you can use or that you can modify for use with your application.</p>
+ <p>To
+create a session bean, complete the following steps:</p>
+</div>
+
+<ol>
+<li class="stepexpand"><span>From the Java™ EE perspective, expand your  EJB project
+in the Project Explorer view.</span></li>
+
+<li class="stepexpand"><span>Right click on the <strong>Session Bean</strong> icon, and select <span class="menucascade">
+<span class="uicontrol">New</span> &gt; <span class="uicontrol">Session Bean</span></span> from
+the pop-up menu.</span>  The <span class="uicontrol">Create Session Bean</span> wizard
+appears.</li>
+
+<li class="stepexpand"><span>Follow the project wizard prompts.</span></li>
+
+</ol>
+
+<div class="section"><p><strong>General Information</strong></p>
+<dl>
+<dt class="dlterm">State type</dt>
+
+<dd>There are three types of session beans: stateless, stateful and singleton. <dl>
+<dt class="dlterm">Stateless session beans</dt>
+
+<dd>A stateless session bean is a collection of related services, each represented
+by a method; the bean maintains no state from one method invocation to the
+next. When you invoke a method on a stateless session bean, it executes the
+method and returns the result without knowing or caring what other requests
+have gone before or might follow. Stateless session beans have longer lives
+because they do not maintain any conversational state.</dd>
+
+
+<dt class="dlterm">Stateful session beans</dt>
+
+<dd>A stateful session bean performs tasks on behalf of a client and maintains
+state related to that client. This state is called conversational state because
+it represents a continuing conversation between the stateful session bean
+and the client. Methods invoked on a stateful session bean can write and read
+data to and from this conversational state, which is shared among all methods
+in the bean. Stateful session beans have timeout periods.</dd>
+
+<dt class="dlterm">Singleton session beans</dt>
+
+<dd>A Singleton session bean is a session bean component that is instantiated 
+once per application. In cases where the container is distributed over many virtual 
+machines, each application will have one bean instance of the Singleton for each JVM. 
+Once instantiated, a Singleton session bean instance lives for the duration of the 
+application in which it is created. It maintains its state between client invocations 
+but that state is not required to survive container shutdown or crash. A Singleton 
+session bean is intended to be shared and supports concurrent access.</dd>
+
+</dl>
+</dd>
+
+</dl>
+ <dl>
+<dt class="dlterm">Business interface</dt>
+
+<dd>A business interface of a session bean is an ordinary Java interface
+that contains the business methods for the bean. A reference to a session
+bean's business interface can be passed as a parameter or as a return value
+of a business interface method. It contains methods to initialize a session
+bean's state and to notify the EJB container when the reference is no more
+needed and can be removed. There are several options available:<dl>
+<dt class="dlterm">Remote business interface:</dt>
+
+<dd>The client can run on a different machine or different Java virtual
+machine than the enterprise bean it accesses and the location of the bean
+is transparent.</dd>
+
+
+<dt class="dlterm">Local business interface:</dt>
+
+<dd>The client must run on the same Java virtual machine as the bean it accesses
+and the location of the enterprise bean is not transparent.</dd>
+
+<dt class="dlterm">No-interface:</dt>
+
+<dd>This is a variation of the Local view that exposes the public methods of the 
+bean class without the use of a separate business interface.</dd>
+
+</dl>
+</dd>
+
+</dl>
+ <dl>
+<dt class="dlterm">Mapped name</dt>
+
+<dd>Specifies the bean's global JNDI name. The use of mappedName attribute
+allows you to assign names which you can use to search the EJB bean through
+the remote client.</dd>
+
+</dl>
+ <dl>
+<dt class="dlterm">Transaction type</dt>
+
+<dd>The <strong>Transaction type</strong> field is used to specify whether the transaction
+is handled by the <strong>Container</strong> or the <strong>Bean</strong>.</dd>
+
+</dl>
+ <dl>
+<dt class="dlterm">Home and Components Interfaces</dt>
+
+<dd>Home and component interfaces are used only for EJB 2.x session beans.<dl>
+
+<dt class="dlterm">Home interface:</dt>
+
+<dd>The home interface allows a client to create, remove and find existing
+instances of enterprise beans.</dd>
+
+
+<dt class="dlterm">Component interface:</dt>
+
+<dd>The component interface allows a client to access the business methods
+of the enterprise bean.</dd>
+
+</dl>
+</dd>
+
+</dl>
+</div>
+
+</div>
+
+<div>
+<ul class="ullinks">
+<li class="ulchildlink"><strong><a href="../topics/sessb.html">Session Beans</a></strong><br />
+</li>
+</ul>
+
+<div class="familylinks">
+<div class="parentlink"><strong>Parent topic:</strong> <a href="../topics/ceover.html" title="The workbench provides a specialized environment that you can use to develop and test enterprise beans that conform to the distributed component architecture defined in the Sun Microsystems Enterprise JavaBeans (EJB) version specification. This product supports the Enterprise JavaBeans 1.1, 2.0, 2.1, and 3.0 specification levels.">EJB 2.x application development</a></div>
+</div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/org.eclipse.jst.ejb.doc.user/topics/tcreatingsessbeans3.dita b/docs/org.eclipse.jst.ejb.doc.user/topics/tcreatingsessbeans3.dita
new file mode 100644
index 0000000..76985c5
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/topics/tcreatingsessbeans3.dita
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<!--Arbortext, Inc., 1988-2009, v.4002-->

+<!DOCTYPE task PUBLIC "-//OASIS//DTD DITA Task//EN"

+ "task.dtd">

+<task id="tsessbeanwiz" xml:lang="en-us">

+<title>Creating a EJB 3.1 session bean using the wizard</title><?Pub

+Caret 18?>

+<shortdesc>You can use the <uicontrol>Create Session Bean</uicontrol> wizard

+to create a session bean in your EJB project.</shortdesc>

+<prolog><metadata>

+<keywords><indexterm>EJB 3.0<indexterm>session bean<indexterm>creating</indexterm></indexterm></indexterm>

+<indexterm>Session bean<indexterm>EJB 3.0<indexterm>creating</indexterm></indexterm></indexterm>

+</keywords>

+</metadata></prolog>

+<taskbody>

+<context>Here are the steps to create a session bean in an EJB project:</context>

+<steps>

+<step><cmd>In the <tm tmclass="special" tmowner="Sun Microsystems, Inc."

+tmtype="tm" trademark="Java">Java</tm> EE perspective, right-click

+your EJB Project, and select <menucascade><uicontrol>File</uicontrol>

+<uicontrol>New</uicontrol><uicontrol>Session Bean</uicontrol>

+</menucascade>. The Create Session Bean wizard appears.</cmd></step>

+<step><cmd>In the <uicontrol>Project</uicontrol> field, ensure that

+your EJB Project name appears.</cmd></step>

+<step><cmd>In the <uicontrol>Folder</uicontrol> field, select the

+source folder for the new bean.</cmd></step>

+<step><cmd>In the <uicontrol>Java package</uicontrol> field, type

+the package name for the new bean.</cmd></step>

+<step><cmd>In the <b>Class name</b> field, type the name that you

+want to assign to the session bean. By convention, bean names should

+begin with an uppercase letter.</cmd><info><note>You can use Unicode

+characters for the bean name, but Unicode characters are not supported

+for enterprise bean packages and classes associated with enterprise

+beans.</note></info></step>

+<step><cmd>In the <b>Superclass</b> field, <uicontrol>Browse</uicontrol> to

+find a Superclass to add to your Session bean.</cmd></step>

+<step><cmd>In the <b>State Type</b> field, select the type of Session

+bean you want to create. Valid options are</cmd><info><ul>

+<li>Stateless</li>

+<li>Stateful</li>

+</ul></info></step>

+<step><cmd><i>Optional</i>In the <uicontrol>Create Business Interface</uicontrol> field,

+select <uicontrol>Local</uicontrol> or <uicontrol>Remote</uicontrol> if

+you want to include these interfaces.</cmd></step>

+<step><cmd>Click <uicontrol>Next</uicontrol>.</cmd></step>

+<step><cmd>On the Session Bean information page, you may change the

+values of some of the Session bean elements: </cmd><info><ul>

+<li><i>Optional</i>: In the <uicontrol>EJB Name</uicontrol> field,

+you can change the value of your EJB name that you assigned in the

+previous page.</li>

+<li><i>Optional</i>: In the <uicontrol>Mapped Name</uicontrol> field,

+type a value for your EJB Mappedname.</li>

+<li><i>Optional</i>: In the <uicontrol>Transaction Type</uicontrol> field,

+select the type of Session bean you want to create (Container or Bean).</li>

+<li><i>Optional</i>: In the <uicontrol>Business Interfaces</uicontrol> field,

+you can add or remove Business Interfaces that you created in the

+previous wizard page.</li>

+</ul></info></step>

+<step><cmd>Click <uicontrol>Finish</uicontrol>.</cmd></step>

+<step><cmd>In the <tm tmclass="special" tmowner="Sun Microsystems, Inc."

+tmtype="tm" trademark="Java">Java</tm> class editor, your new Session

+bean appears, with the @Stateless annotation and the required import

+statements.</cmd><info></info></step>

+</steps>

+</taskbody>

+</task>

+<?Pub *0000003502?>

diff --git a/docs/org.eclipse.jst.ejb.doc.user/topics/tcreatingsessbeans3.html b/docs/org.eclipse.jst.ejb.doc.user/topics/tcreatingsessbeans3.html
new file mode 100644
index 0000000..df33cb2
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/topics/tcreatingsessbeans3.html
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html lang="en-us" xml:lang="en-us">
+<head>
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+<meta name="copyright" content="Copyright (c) 2000, 2011 IBM 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: IBM Corporation - initial API and implementation" />
+<meta name="DC.rights.owner" content="(C) Copyright 2000, 2011" />
+<meta content="public" name="security" />
+<meta content="index,follow" name="Robots" />
+<meta http-equiv="PICS-Label" content='(PICS-1.1 "http://www.icra.org/ratingsv02.html" l gen true r (cz 1 lz 1 nz 1 oz 1 vz 1) "http://www.rsac.org/ratingsv01.html" l gen true r (n 0 s 0 v 0 l 0) "http://www.classify.org/safesurf/" l gen true r (SS~~000 1))' />
+<meta content="task" name="DC.Type" />
+<meta name="DC.Title" content="Creating a EJB 3.1 session bean using the wizard" />
+<meta name="abstract" content="You can use the Create Session Bean wizard to create a session bean in your EJB project." />
+<meta name="description" content="You can use the Create Session Bean wizard to create a session bean in your EJB project." />
+<meta content="EJB 3.0, session bean, creating, Session bean" name="DC.subject" />
+<meta content="EJB 3.0, session bean, creating, Session bean" name="keywords" />
+<meta scheme="URI" name="DC.Relation" content="../topics/tecrtpro.html" />
+<meta content="XHTML" name="DC.Format" />
+<meta content="tsessbeanwiz" name="DC.Identifier" />
+<meta content="en-us" name="DC.Language" />
+<link href="../../org.eclipse.wst.doc.user/common.css" type="text/css" rel="stylesheet" />
+<title>Creating a EJB 3.1 session bean using the wizard</title>
+</head>
+<body id="tsessbeanwiz"><a name="tsessbeanwiz"><!-- --></a>
+
+
+<h1 class="topictitle1">Creating a EJB 3.1 session bean using the wizard</h1>
+
+
+
+<div><p>You can use the <span class="uicontrol">Create Session Bean</span> wizard
+to create a session bean in your EJB project.</p>
+
+<div class="section">Here are the steps to create a session bean in an EJB project:</div>
+
+<ol>
+<li class="stepexpand"><span>In the Java™ EE perspective, right-click
+your EJB Project, and select <span class="menucascade"><span class="uicontrol">File</span>
+ &gt; <span class="uicontrol">New</span> &gt; <span class="uicontrol">Session Bean</span>
+</span>. The Create Session Bean wizard appears.</span></li>
+
+<li class="stepexpand"><span>In the <span class="uicontrol">Project</span> field, ensure that
+your EJB Project name appears.</span></li>
+
+<li class="stepexpand"><span>In the <span class="uicontrol">Folder</span> field, select the
+source folder for the new bean.</span></li>
+
+<li class="stepexpand"><span>In the <span class="uicontrol">Java package</span> field, type
+the package name for the new bean.</span></li>
+
+<li class="stepexpand"><span>In the <strong>Class name</strong> field, type the name that you
+want to assign to the session bean. By convention, bean names should
+begin with an uppercase letter.</span> <div class="note"><span class="notetitle">Note:</span> You can use Unicode
+characters for the bean name, but Unicode characters are not supported
+for enterprise bean packages and classes associated with enterprise
+beans.</div>
+</li>
+
+<li class="stepexpand"><span>In the <strong>Superclass</strong> field, <span class="uicontrol">Browse</span> to
+find a Superclass to add to your Session bean.</span></li>
+
+<li class="stepexpand"><span>In the <strong>State Type</strong> field, select the type of Session
+bean you want to create. Valid options are</span> <ul>
+<li>Stateless</li>
+
+<li>Stateful</li>
+
+</ul>
+</li>
+
+<li class="stepexpand"><span><em>Optional</em>In the <span class="uicontrol">Create Business Interface</span> field,
+select <span class="uicontrol">Local</span> or <span class="uicontrol">Remote</span> if
+you want to include these interfaces.</span></li>
+
+<li class="stepexpand"><span>Click <span class="uicontrol">Next</span>.</span></li>
+
+<li class="stepexpand"><span>On the Session Bean information page, you may change the
+values of some of the Session bean elements: </span> <ul>
+<li><em>Optional</em>: In the <span class="uicontrol">EJB Name</span> field,
+you can change the value of your EJB name that you assigned in the
+previous page.</li>
+
+<li><em>Optional</em>: In the <span class="uicontrol">Mapped Name</span> field,
+type a value for your EJB Mappedname.</li>
+
+<li><em>Optional</em>: In the <span class="uicontrol">Transaction Type</span> field,
+select the type of Session bean you want to create (Container or Bean).</li>
+
+<li><em>Optional</em>: In the <span class="uicontrol">Business Interfaces</span> field,
+you can add or remove Business Interfaces that you created in the
+previous wizard page.</li>
+
+</ul>
+</li>
+
+<li class="stepexpand"><span>Click <span class="uicontrol">Finish</span>.</span></li>
+
+<li class="stepexpand"><span>In the Java class editor, your new Session
+bean appears, with the @Stateless annotation and the required import
+statements.</span> </li>
+
+</ol>
+
+</div>
+
+<div>
+<div class="familylinks">
+<div class="parentlink"><strong>Parent topic:</strong> <a href="../topics/tecrtpro.html" title="An EJB project is used to organize the resources contained in an EJB module.">Creating EJB projects</a></div>
+</div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/org.eclipse.jst.ejb.doc.user/topics/tcreatinmessbeans3.dita b/docs/org.eclipse.jst.ejb.doc.user/topics/tcreatinmessbeans3.dita
new file mode 100644
index 0000000..8070a44
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/topics/tcreatinmessbeans3.dita
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="utf-8"?>

+<!--Arbortext, Inc., 1988-2006, v.4002-->

+<!DOCTYPE task PUBLIC "-//OASIS//DTD DITA Task//EN"

+ "task.dtd">

+<task id="tcreatingsessionbean" xml:lang="en-us">

+<title>Creating a message-driven bean using the wizard</title>

+<shortdesc>You can use the <uicontrol>Create Message-Driven Bean</uicontrol> wizard

+to create a message-driven bean in your EJB project.</shortdesc>

+<prolog><metadata>

+<keywords><indexterm>EJB 3.0<indexterm>message-driven bean<indexterm>creating</indexterm></indexterm></indexterm>

+<indexterm>Message-driven bean<indexterm>EJB 3.0<indexterm>creating</indexterm></indexterm></indexterm>

+</keywords>

+</metadata></prolog>

+<taskbody>

+<context><p>The main difference between a message-driven bean and a session

+bean is that a message-driven bean has no local or remote interface. Instead,

+it has only a bean class. To create a message-driven bean within your EJB

+project, follow these steps:</p></context>

+<steps>

+<step><cmd>In the <tm tmclass="special" tmowner="Sun Microsystems, Inc." tmtype="tm"

+trademark="Java">Java</tm> EE perspective, right-click your EJB Project, and

+select <menucascade><uicontrol>File</uicontrol><uicontrol>New</uicontrol>

+<uicontrol>Message-Driven Bean</uicontrol></menucascade>. The Create Message-Driven

+wizard appears.</cmd></step>

+<step><cmd>In the <uicontrol>Project</uicontrol> field, ensure that your EJB

+Project name appears.</cmd></step>

+<step><cmd>In the <uicontrol>Folder</uicontrol> field, select the source folder

+for the new bean.</cmd></step>

+<step><cmd>In the <uicontrol>Java package</uicontrol> field, type the package

+name for the new bean.</cmd></step>

+<step><cmd>In the <b>Class name</b> field, type the name that you want to

+assign to the session bean. By convention, bean names should begin with an

+uppercase letter.</cmd><info><note>You can use Unicode characters for the

+bean name, but Unicode characters are not supported for enterprise bean packages

+and classes associated with enterprise beans.</note></info></step>

+<step><cmd>In the <b>Superclass</b> field, <uicontrol>Browse</uicontrol> to

+find a Superclass to add to your Session bean.</cmd></step>

+<step><cmd>In the <uicontrol>Destination Name</uicontrol> field, type the

+name of your message destination.</cmd></step>

+<step><cmd>In the <uicontrol>JMS</uicontrol> field, Select JMS if you want

+to use Java Messaging Service, and in the <uicontrol>Destination Type</uicontrol> field,

+select the type of destination.</cmd><info><ul>

+<li>Queue</li>

+<li>Topic</li>

+</ul></info></step>

+<step><cmd>Click <uicontrol>Next</uicontrol>.</cmd></step>

+<step><cmd>On the Message-Driven Bean information page, you may change the

+values of some of the Session bean elements: </cmd><info><ul>

+<li><i>Optional</i>: In the <uicontrol>EJB Name</uicontrol> field, you can

+change the value of your EJB name that you assigned in the previous page.</li>

+<li><i>Optional</i>: In the <uicontrol>Transaction Type</uicontrol> field,

+select the type of Session bean you want to create (Container or Bean).</li>

+<li><i>Optional</i>: In the <uicontrol>Interfaces</uicontrol> field, you can

+add or remove Business Interfaces that you created in the previous wizard

+page.</li>

+<li><i>Optional</i>: In the <uicontrol>Which method stubs would you like to

+create?</uicontrol> field, you can create one or both of these methods: <ul>

+<li>Inherited abstract methods</li>

+<li>Constructors from superclass</li>

+</ul></li>

+</ul></info></step>

+<step><cmd>Click <uicontrol>Finish</uicontrol>.</cmd></step>

+<step><cmd>In the <tm tmclass="special" tmowner="Sun Microsystems, Inc." tmtype="tm"

+trademark="Java">Java</tm> class editor, your new Message-driven bean appears,

+with the @MessageDriven annotation and the required import statements.</cmd>

+<info></info></step>

+</steps>

+</taskbody>

+</task>

diff --git a/docs/org.eclipse.jst.ejb.doc.user/topics/tcreatinmessbeans3.html b/docs/org.eclipse.jst.ejb.doc.user/topics/tcreatinmessbeans3.html
new file mode 100644
index 0000000..9ce9cdb
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/topics/tcreatinmessbeans3.html
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html lang="en-us" xml:lang="en-us">
+<head>
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+<meta name="copyright" content="Copyright (c) 2000, 2011 IBM 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: IBM Corporation - initial API and implementation" />
+<meta name="DC.rights.owner" content="(C) Copyright 2000, 2011" />
+<meta content="public" name="security" />
+<meta content="index,follow" name="Robots" />
+<meta http-equiv="PICS-Label" content='(PICS-1.1 "http://www.icra.org/ratingsv02.html" l gen true r (cz 1 lz 1 nz 1 oz 1 vz 1) "http://www.rsac.org/ratingsv01.html" l gen true r (n 0 s 0 v 0 l 0) "http://www.classify.org/safesurf/" l gen true r (SS~~000 1))' />
+<meta content="task" name="DC.Type" />
+<meta name="DC.Title" content="Creating a message-driven bean using the wizard" />
+<meta name="abstract" content="You can use the Create Message-Driven Bean wizard to create a message-driven bean in your EJB project." />
+<meta name="description" content="You can use the Create Message-Driven Bean wizard to create a message-driven bean in your EJB project." />
+<meta content="EJB 3.0, message-driven bean, creating, Message-driven bean" name="DC.subject" />
+<meta content="EJB 3.0, message-driven bean, creating, Message-driven bean" name="keywords" />
+<meta scheme="URI" name="DC.Relation" content="../topics/tecrtpro.html" />
+<meta content="XHTML" name="DC.Format" />
+<meta content="tcreatingsessionbean" name="DC.Identifier" />
+<meta content="en-us" name="DC.Language" />
+<link href="../../org.eclipse.wst.doc.user/common.css" type="text/css" rel="stylesheet" />
+<title>Creating a message-driven bean using the wizard</title>
+</head>
+<body id="tcreatingsessionbean"><a name="tcreatingsessionbean"><!-- --></a>
+
+
+<h1 class="topictitle1">Creating a message-driven bean using the wizard</h1>
+
+
+
+<div><p>You can use the <span class="uicontrol">Create Message-Driven Bean</span> wizard
+to create a message-driven bean in your EJB project.</p>
+
+<div class="section"><p>The main difference between a message-driven bean and a session
+bean is that a message-driven bean has no local or remote interface. Instead,
+it has only a bean class. To create a message-driven bean within your EJB
+project, follow these steps:</p>
+</div>
+
+<ol>
+<li class="stepexpand"><span>In the Java™ EE perspective, right-click your EJB Project, and
+select <span class="menucascade"><span class="uicontrol">File</span> &gt; <span class="uicontrol">New</span>
+ &gt; <span class="uicontrol">Message-Driven Bean</span></span>. The Create Message-Driven
+wizard appears.</span></li>
+
+<li class="stepexpand"><span>In the <span class="uicontrol">Project</span> field, ensure that your EJB
+Project name appears.</span></li>
+
+<li class="stepexpand"><span>In the <span class="uicontrol">Folder</span> field, select the source folder
+for the new bean.</span></li>
+
+<li class="stepexpand"><span>In the <span class="uicontrol">Java package</span> field, type the package
+name for the new bean.</span></li>
+
+<li class="stepexpand"><span>In the <strong>Class name</strong> field, type the name that you want to
+assign to the session bean. By convention, bean names should begin with an
+uppercase letter.</span> <div class="note"><span class="notetitle">Note:</span> You can use Unicode characters for the
+bean name, but Unicode characters are not supported for enterprise bean packages
+and classes associated with enterprise beans.</div>
+</li>
+
+<li class="stepexpand"><span>In the <strong>Superclass</strong> field, <span class="uicontrol">Browse</span> to
+find a Superclass to add to your Session bean.</span></li>
+
+<li class="stepexpand"><span>In the <span class="uicontrol">Destination Name</span> field, type the
+name of your message destination.</span></li>
+
+<li class="stepexpand"><span>In the <span class="uicontrol">JMS</span> field, Select JMS if you want
+to use Java Messaging Service, and in the <span class="uicontrol">Destination Type</span> field,
+select the type of destination.</span> <ul>
+<li>Queue</li>
+
+<li>Topic</li>
+
+</ul>
+</li>
+
+<li class="stepexpand"><span>Click <span class="uicontrol">Next</span>.</span></li>
+
+<li class="stepexpand"><span>On the Message-Driven Bean information page, you may change the
+values of some of the Session bean elements: </span> <ul>
+<li><em>Optional</em>: In the <span class="uicontrol">EJB Name</span> field, you can
+change the value of your EJB name that you assigned in the previous page.</li>
+
+<li><em>Optional</em>: In the <span class="uicontrol">Transaction Type</span> field,
+select the type of Session bean you want to create (Container or Bean).</li>
+
+<li><em>Optional</em>: In the <span class="uicontrol">Interfaces</span> field, you can
+add or remove Business Interfaces that you created in the previous wizard
+page.</li>
+
+<li><em>Optional</em>: In the <span class="uicontrol">Which method stubs would you like to
+create?</span> field, you can create one or both of these methods: <ul>
+<li>Inherited abstract methods</li>
+
+<li>Constructors from superclass</li>
+
+</ul>
+</li>
+
+</ul>
+</li>
+
+<li class="stepexpand"><span>Click <span class="uicontrol">Finish</span>.</span></li>
+
+<li class="stepexpand"><span>In the Java class editor, your new Message-driven bean appears,
+with the @MessageDriven annotation and the required import statements.</span>
+ </li>
+
+</ol>
+
+</div>
+
+<div>
+<div class="familylinks">
+<div class="parentlink"><strong>Parent topic:</strong> <a href="../topics/tecrtpro.html" title="An EJB project is used to organize the resources contained in an EJB module.">Creating EJB projects</a></div>
+</div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/org.eclipse.jst.ejb.doc.user/topics/tecrte.dita b/docs/org.eclipse.jst.ejb.doc.user/topics/tecrte.dita
new file mode 100644
index 0000000..88b0260
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/topics/tecrte.dita
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>

+<!--Arbortext, Inc., 1988-2006, v.4002-->

+<!DOCTYPE task PUBLIC "-//OASIS//DTD DITA Task//EN"

+ "task.dtd">

+<task id="tecrte" xml:lang="en-us">

+<title>Creating enterprise beans with XDoclet annotation support</title>

+<shortdesc>You can use a wizard to create session beans and message-driven

+beans that support XDoclet annotation.</shortdesc>

+<prolog><metadata>

+<keywords><indexterm>EJB<indexterm>XDoclet annotation support</indexterm></indexterm>

+<indexterm>XDoclet annotation support<indexterm>EJBs</indexterm></indexterm>

+</keywords>

+</metadata></prolog>

+<taskbody>

+<prereq><p>Before you can create an enterprise bean, you must:</p><ul>

+<li>Define an EJB project to contain the enterprise bean. See <xref href="tecrtpro.dita"></xref>.</li>

+<li>Install XDoclet annotation support and enable it. See <xref href="txdocletconf.dita"></xref>.</li>

+</ul></prereq>

+<context> <p> After you create an EJB project, you can add enterprise beans

+to the EJB project in one of the following ways: </p><ul>

+<li>Create new enterprise beans.</li>

+<li>Import enterprise beans from EJB JAR files.</li>

+</ul><p>A wizard helps you to create enterprise beans. You can use the Enterprise

+Bean Creation wizard to generate an enterprise bean while avoiding the complexities

+that exist between the different types of beans. The wizard helps you add

+enterprise beans to you project by creating entirely new enterprise beans.</p><p>With

+the wizard, you can create three types of enterprise beans: session beans

+and message-driven beans (EJB 2.0 or later projects only): </p><ul>

+<li>Create a session bean. For more information, see <xref href="tesessb.dita"></xref>.</li>

+<li>Create a CMP entity bean. For more information, see <xref href="teentityb.dita"></xref>.</li>

+<li>Create a message-driven bean. For more information, see <xref href="temessb.dita"></xref>.</li>

+</ul></context>

+</taskbody>

+</task>

diff --git a/docs/org.eclipse.jst.ejb.doc.user/topics/tecrte.html b/docs/org.eclipse.jst.ejb.doc.user/topics/tecrte.html
new file mode 100644
index 0000000..7fc5298
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/topics/tecrte.html
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html lang="en-us" xml:lang="en-us">
+<head>
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+<meta name="copyright" content="Copyright (c) 2000, 2011 IBM 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: IBM Corporation - initial API and implementation" />
+<meta name="DC.rights.owner" content="(C) Copyright 2000, 2011" />
+<meta content="public" name="security" />
+<meta content="index,follow" name="Robots" />
+<meta http-equiv="PICS-Label" content='(PICS-1.1 "http://www.icra.org/ratingsv02.html" l gen true r (cz 1 lz 1 nz 1 oz 1 vz 1) "http://www.rsac.org/ratingsv01.html" l gen true r (n 0 s 0 v 0 l 0) "http://www.classify.org/safesurf/" l gen true r (SS~~000 1))' />
+<meta content="task" name="DC.Type" />
+<meta name="DC.Title" content="Creating enterprise beans with XDoclet annotation support" />
+<meta name="abstract" content="You can use a wizard to create session beans and message-driven beans that support XDoclet annotation." />
+<meta name="description" content="You can use a wizard to create session beans and message-driven beans that support XDoclet annotation." />
+<meta content="EJB, XDoclet annotation support, EJBs" name="DC.subject" />
+<meta content="EJB, XDoclet annotation support, EJBs" name="keywords" />
+<meta scheme="URI" name="DC.Relation" content="../topics/ceover.html" />
+<meta scheme="URI" name="DC.Relation" content="../topics/tesessb.html" />
+<meta scheme="URI" name="DC.Relation" content="../topics/teentityb.html" />
+<meta scheme="URI" name="DC.Relation" content="../topics/temessb.html" />
+<meta scheme="URI" name="DC.Relation" content="../topics/txdocletconf.html" />
+<meta content="XHTML" name="DC.Format" />
+<meta content="tecrte" name="DC.Identifier" />
+<meta content="en-us" name="DC.Language" />
+<link href="../../org.eclipse.wst.doc.user/common.css" type="text/css" rel="stylesheet" />
+<title>Creating enterprise beans with XDoclet annotation support</title>
+</head>
+<body id="tecrte"><a name="tecrte"><!-- --></a>
+
+
+<h1 class="topictitle1">Creating enterprise beans with XDoclet annotation support</h1>
+
+
+
+<div><p>You can use a wizard to create session beans and message-driven
+beans that support XDoclet annotation.</p>
+
+<div class="p"><p>Before you can create an enterprise bean, you must:</p>
+<ul>
+<li>Define an EJB project to contain the enterprise bean. See <a href="tecrtpro.html" title="An EJB project is used to organize the resources contained in an&#10;EJB module.">Creating EJB projects</a>.</li>
+
+<li>Install XDoclet annotation support and enable it. See <a href="txdocletconf.html" title="To use XDoclet annotation support, or to create enterprise beans,&#10;XDoclet must be installed on your system and configured to work with the workbench. ">Configuring XDoclet annotation support</a>.</li>
+
+</ul>
+</div>
+
+<div class="section"> <p> After you create an EJB project, you can add enterprise beans
+to the EJB project in one of the following ways: </p>
+<ul>
+<li>Create new enterprise beans.</li>
+
+<li>Import enterprise beans from EJB JAR files.</li>
+
+</ul>
+<p>A wizard helps you to create enterprise beans. You can use the Enterprise
+Bean Creation wizard to generate an enterprise bean while avoiding the complexities
+that exist between the different types of beans. The wizard helps you add
+enterprise beans to you project by creating entirely new enterprise beans.</p>
+<p>With
+the wizard, you can create three types of enterprise beans: session beans
+and message-driven beans (EJB 2.0 or later projects only): </p>
+<ul>
+<li>Create a session bean. For more information, see <a href="tesessb.html" title="You can use a wizard to create a session bean and add it to your&#10;project.">Creating session beans with XDoclet annotation support</a>.</li>
+
+<li>Create a CMP entity bean. For more information, see <a href="teentityb.html" title="You can use a wizard to create a CMP entity bean and add it to&#10;your project.">Creating container-managed persistence (CMP) entity beans with XDoclet annotation support</a>.</li>
+
+<li>Create a message-driven bean. For more information, see <a href="temessb.html" title="You can use a wizard to create a message-driven bean and add it&#10;to your project.">Creating message-driven beans with XDoclet annotation support</a>.</li>
+
+</ul>
+</div>
+
+</div>
+
+<div>
+<ul class="ullinks">
+<li class="ulchildlink"><strong><a href="../topics/tesessb.html">Creating session beans with XDoclet annotation support</a></strong><br />
+You can use a wizard to create a session bean and add it to your project.</li>
+<li class="ulchildlink"><strong><a href="../topics/teentityb.html">Creating container-managed persistence (CMP) entity beans with XDoclet annotation support</a></strong><br />
+You can use a wizard to create a CMP entity bean and add it to your project.</li>
+<li class="ulchildlink"><strong><a href="../topics/temessb.html">Creating message-driven beans with XDoclet annotation support</a></strong><br />
+You can use a wizard to create a message-driven bean and add it to your project.</li>
+<li class="ulchildlink"><strong><a href="../topics/txdocletconf.html">Configuring XDoclet annotation support</a></strong><br />
+To use XDoclet annotation support, or to create enterprise beans, XDoclet must be installed on your system and configured to work with the workbench.</li>
+</ul>
+
+<div class="familylinks">
+<div class="parentlink"><strong>Parent topic:</strong> <a href="../topics/ceover.html" title="The workbench provides a specialized environment that you can use to develop and test enterprise beans that conform to the distributed component architecture defined in the Sun Microsystems Enterprise JavaBeans (EJB) version specification. This product supports the Enterprise JavaBeans 1.1, 2.0, 2.1, and 3.0 specification levels.">EJB 2.x application development</a></div>
+</div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/org.eclipse.jst.ejb.doc.user/topics/tecrtpro.dita b/docs/org.eclipse.jst.ejb.doc.user/topics/tecrtpro.dita
new file mode 100644
index 0000000..2fa09e6
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/topics/tecrtpro.dita
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="utf-8"?>

+<!--Arbortext, Inc., 1988-2006, v.4002-->

+<!DOCTYPE task PUBLIC "-//OASIS//DTD DITA Task//EN"

+ "task.dtd">

+<task id="tecrtpro" xml:lang="en-us">

+<title>Creating EJB projects</title>

+<shortdesc>An EJB project is used to organize the resources contained in an

+EJB module.</shortdesc>

+<prolog><metadata>

+<keywords><indexterm>EJB<indexterm>projects<indexterm>creating</indexterm></indexterm></indexterm>

+</keywords>

+</metadata></prolog>

+<taskbody>

+<context><p>An EJB module is used to assemble one or more enterprise beans

+into a single deployable unit. It is deployed in a standard <tm tmclass="special"

+tmowner="Sun Microsystems, Inc." tmtype="tm" trademark="Java">Java</tm> archive

+(JAR) file. An EJB module can be used as a standalone application, or it can

+be combined with other modules to create a Java EE enterprise application.

+An EJB module is installed and run in an enterprise bean container. An EJB

+project must be referenced by an enterprise application project (defined as

+a module in an EAR) in order to be deployed successfully and run on a server.</p><p>An

+EJB module contains the following:</p><ul>

+<li>One or more deployable enterprise beans.</li>

+<li>A deployment descriptor, stored in an Extensible Markup Language (XML)

+file. This file declares the contents of the module, defines the structure

+and external dependencies of the beans in the module, and describes how the

+enterprise beans are to be used at run time.</li>

+</ul><p>To create a new EJB project, complete the following steps:</p></context>

+<steps>

+<step><cmd>In the <tm tmclass="special" tmowner="Sun Microsystems, Inc." tmtype="tm"

+trademark="Java">Java</tm> EE perspective, select <menucascade><uicontrol>File</uicontrol>

+<uicontrol>New</uicontrol><uicontrol>Other</uicontrol></menucascade>.</cmd>

+</step>

+<step><cmd>In the New Project Wizard, select <menucascade><uicontrol>EJB</uicontrol>

+<uicontrol>EJB Project</uicontrol></menucascade> and click <uicontrol>Next</uicontrol>.</cmd>

+</step>

+<step><cmd>In the <uicontrol>Project Name</uicontrol> field, type a name for

+the EJB project.</cmd></step>

+<step importance="optional"><cmd>To use a different workspace directory for

+your EJB project, modify the settings for <uicontrol>Project contents.</uicontrol> </cmd>

+<info><note type="note">If you specify a non-default project location that

+is already being used by another project, the project creation will fail.</note></info>

+</step>

+<step><cmd>In the <uicontrol>Target runtime</uicontrol> drop-down list, select

+the application server that you want to target for your development. This

+selection affects the compilation and runtime settings by modifying the class

+path entries for the project. Use the <uicontrol>New</uicontrol> button if

+a target runtime does not exist, or if you want to use a different one.</cmd>

+</step>

+<step><cmd>In the <uicontrol>EJB Module version</uicontrol> field, select

+the correct version level for the project.</cmd></step>

+<step><cmd>Select a pre-defined project configuration from the <uicontrol>Configurations</uicontrol> drop-down

+list, or modify the configuration to customize the project facets. You can

+select the Java version, support for XDoclet, and support for Java persistence

+when customizing your configuration.</cmd><info><p>For example, if you are

+creating an Entity Bean, select the <uicontrol>Java Persistence</uicontrol> facet.

+You can save your configuration with a meaningful name so that you can reference

+this configuration in any EJB projects that are subsequently created.</p></info>

+</step>

+<step importance="optional"><cmd>Select the <uicontrol>Add project to an EAR </uicontrol> check

+box to add the new module to an enterprise application (EAR) project.</cmd>

+<info>Type a new project name or select an existing enterprise application

+project from the drop-down list in the <uicontrol>EAR Project</uicontrol> combination

+box. Or, click the <uicontrol>New</uicontrol> button to launch the New Enterprise

+Application Project wizard. Click <uicontrol>Next</uicontrol>.<note>If you

+type a new EAR project name, the EAR project will be created in the default

+location with the lowest compatible Java EE version based on the version of

+the project being created. If you want to specify a different version or a

+different location for the enterprise application, click <uicontrol>New</uicontrol> to

+use the New Enterprise Application Project wizard.</note></info></step>

+<step importance="optional"><cmd>Change the value of <uicontrol>Source Folder</uicontrol> to

+change the directory where the <tm tmclass="special" tmowner="Sun Microsystems, Inc."

+tmtype="tm" trademark="Java">Java</tm> source files are stored. </cmd></step>

+<step importance="optional"><cmd>Select the <uicontrol>Create an EJB Client

+JAR Project to hold the client interfaces and classes</uicontrol> check box

+if you want the client interface classes for your enterprise beans to be kept

+in a separate EJB client JAR file. This EJB client JAR file will be added

+to the enterprise application as a project utility JAR file. You can also

+modify the <uicontrol>Name</uicontrol> of the EJB Client JAR project, or the

+name (<uicontrol>Client JAR URI</uicontrol>) of the client JAR file. </cmd>

+</step>

+<step><cmd>Click <uicontrol>Finish</uicontrol>.</cmd></step>

+</steps>

+<postreq outputclass="id_postreq"><note>The New Project Wizard will automatically

+add default facets to your project. You can change these facets or add new

+ones in the <uicontrol>Preferences</uicontrol> window. For more information,

+see <xref href="../../org.eclipse.jst.j2ee.doc.user/topics/taddingfacet.dita"

+scope="peer">Adding a facet to a Java EE project</xref>.</note><p outputclass="anchor_topicbottom"></p></postreq>

+</taskbody>

+</task>

diff --git a/docs/org.eclipse.jst.ejb.doc.user/topics/tecrtpro.html b/docs/org.eclipse.jst.ejb.doc.user/topics/tecrtpro.html
new file mode 100644
index 0000000..b30d991
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/topics/tecrtpro.html
@@ -0,0 +1,152 @@
+<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html lang="en-us" xml:lang="en-us">
+<head>
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+<meta name="copyright" content="Copyright (c) 2000, 2011 IBM 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: IBM Corporation - initial API and implementation" />
+<meta name="DC.rights.owner" content="(C) Copyright 2000, 2011" />
+<meta content="public" name="security" />
+<meta content="index,follow" name="Robots" />
+<meta http-equiv="PICS-Label" content='(PICS-1.1 "http://www.icra.org/ratingsv02.html" l gen true r (cz 1 lz 1 nz 1 oz 1 vz 1) "http://www.rsac.org/ratingsv01.html" l gen true r (n 0 s 0 v 0 l 0) "http://www.classify.org/safesurf/" l gen true r (SS~~000 1))' />
+<meta content="task" name="DC.Type" />
+<meta name="DC.Title" content="Creating EJB projects" />
+<meta name="abstract" content="An EJB project is used to organize the resources contained in an EJB module." />
+<meta name="description" content="An EJB project is used to organize the resources contained in an EJB module." />
+<meta content="EJB, projects, creating" name="DC.subject" />
+<meta content="EJB, projects, creating" name="keywords" />
+<meta scheme="URI" name="DC.Relation" content="../topics/cejb3.html" />
+<meta scheme="URI" name="DC.Relation" content="../topics/tcreatingsessbeans3.html" />
+<meta scheme="URI" name="DC.Relation" content="../topics/tcreatinmessbeans3.html" />
+<meta scheme="URI" name="DC.Relation" content="../topics/ceresrc.html" />
+<meta content="XHTML" name="DC.Format" />
+<meta content="tecrtpro" name="DC.Identifier" />
+<meta content="en-us" name="DC.Language" />
+<link href="../../org.eclipse.wst.doc.user/common.css" type="text/css" rel="stylesheet" />
+<title>Creating EJB projects</title>
+</head>
+<body id="tecrtpro"><a name="tecrtpro"><!-- --></a>
+
+
+<h1 class="topictitle1">Creating EJB projects</h1>
+
+
+
+<div><p>An EJB project is used to organize the resources contained in an
+EJB module.</p>
+
+<div class="section"><p>An EJB module is used to assemble one or more enterprise beans
+into a single deployable unit. It is deployed in a standard Java™ archive
+(JAR) file. An EJB module can be used as a standalone application, or it can
+be combined with other modules to create a Java EE enterprise application.
+An EJB module is installed and run in an enterprise bean container. An EJB
+project must be referenced by an enterprise application project (defined as
+a module in an EAR) in order to be deployed successfully and run on a server.</p>
+<p>An
+EJB module contains the following:</p>
+<ul>
+<li>One or more deployable enterprise beans.</li>
+
+<li>A deployment descriptor, stored in an Extensible Markup Language (XML)
+file. This file declares the contents of the module, defines the structure
+and external dependencies of the beans in the module, and describes how the
+enterprise beans are to be used at run time.</li>
+
+</ul>
+<p>To create a new EJB project, complete the following steps:</p>
+</div>
+
+<ol>
+<li class="stepexpand"><span>In the Java EE perspective, select <span class="menucascade"><span class="uicontrol">File</span>
+ &gt; <span class="uicontrol">New</span> &gt; <span class="uicontrol">Other</span></span>.</span>
+</li>
+
+<li class="stepexpand"><span>In the New Project Wizard, select <span class="menucascade"><span class="uicontrol">EJB</span>
+ &gt; <span class="uicontrol">EJB Project</span></span> and click <span class="uicontrol">Next</span>.</span>
+</li>
+
+<li class="stepexpand"><span>In the <span class="uicontrol">Project Name</span> field, type a name for
+the EJB project.</span></li>
+
+<li class="stepexpand"><strong>Optional: </strong><span>To use a different workspace directory for
+your EJB project, modify the settings for <span class="uicontrol">Project contents.</span> </span>
+ <div class="note"><span class="notetitle">Note:</span> If you specify a non-default project location that
+is already being used by another project, the project creation will fail.</div>
+
+</li>
+
+<li class="stepexpand"><span>In the <span class="uicontrol">Target runtime</span> drop-down list, select
+the application server that you want to target for your development. This
+selection affects the compilation and runtime settings by modifying the class
+path entries for the project. Use the <span class="uicontrol">New</span> button if
+a target runtime does not exist, or if you want to use a different one.</span>
+</li>
+
+<li class="stepexpand"><span>In the <span class="uicontrol">EJB Module version</span> field, select
+the correct version level for the project.</span></li>
+
+<li class="stepexpand"><span>Select a pre-defined project configuration from the <span class="uicontrol">Configurations</span> drop-down
+list, or modify the configuration to customize the project facets. You can
+select the Java version, support for XDoclet, and support for Java persistence
+when customizing your configuration.</span> <p>For example, if you are
+creating an Entity Bean, select the <span class="uicontrol">Java Persistence</span> facet.
+You can save your configuration with a meaningful name so that you can reference
+this configuration in any EJB projects that are subsequently created.</p>
+
+</li>
+
+<li class="stepexpand"><strong>Optional: </strong><span>Select the <span class="uicontrol">Add project to an EAR </span> check
+box to add the new module to an enterprise application (EAR) project.</span>
+ Type a new project name or select an existing enterprise application
+project from the drop-down list in the <span class="uicontrol">EAR Project</span> combination
+box. Or, click the <span class="uicontrol">New</span> button to launch the New Enterprise
+Application Project wizard. Click <span class="uicontrol">Next</span>.<div class="note"><span class="notetitle">Note:</span> If you
+type a new EAR project name, the EAR project will be created in the default
+location with the lowest compatible Java EE version based on the version of
+the project being created. If you want to specify a different version or a
+different location for the enterprise application, click <span class="uicontrol">New</span> to
+use the New Enterprise Application Project wizard.</div>
+</li>
+
+<li class="stepexpand"><strong>Optional: </strong><span>Change the value of <span class="uicontrol">Source Folder</span> to
+change the directory where the Java source files are stored. </span></li>
+
+<li class="stepexpand"><strong>Optional: </strong><span>Select the <span class="uicontrol">Create an EJB Client
+JAR Project to hold the client interfaces and classes</span> check box
+if you want the client interface classes for your enterprise beans to be kept
+in a separate EJB client JAR file. This EJB client JAR file will be added
+to the enterprise application as a project utility JAR file. You can also
+modify the <span class="uicontrol">Name</span> of the EJB Client JAR project, or the
+name (<span class="uicontrol">Client JAR URI</span>) of the client JAR file. </span>
+</li>
+
+<li class="stepexpand"><span>Click <span class="uicontrol">Finish</span>.</span></li>
+
+</ol>
+
+<div class="id_postreq"><div class="note"><span class="notetitle">Note:</span> The New Project Wizard will automatically
+add default facets to your project. You can change these facets or add new
+ones in the <span class="uicontrol">Preferences</span> window. For more information,
+see <a href="../../org.eclipse.jst.j2ee.doc.user/topics/taddingfacet.html">Adding a facet to a Java EE project</a>.</div>
+<p class="anchor_topicbottom" />
+</div>
+
+</div>
+
+<div>
+<ul class="ullinks">
+<li class="ulchildlink"><strong><a href="../topics/tcreatingsessbeans3.html">Creating a EJB 3.1 session bean using the wizard</a></strong><br />
+You can use the Create Session Bean wizard to create a session bean in your EJB project.</li>
+<li class="ulchildlink"><strong><a href="../topics/tcreatinmessbeans3.html">Creating a message-driven bean using the wizard</a></strong><br />
+You can use the Create Message-Driven Bean wizard to create a message-driven bean in your EJB project.</li>
+</ul>
+
+<div class="familylinks">
+<div class="parentlink"><strong>Parent topic:</strong> <a href="../topics/cejb3.html" title="You can use the workbench to develop and test enterprise beans that conform to the distributed component architecture defined in the Sun Microsystems Enterprise JavaBeans (EJB) 3.10 specification.">Developing EJB 3.1 Applications</a></div>
+</div>
+
+<div class="familylinks">
+<div class="parentlink"><strong>Parent topic:</strong> <a href="../topics/ceresrc.html" title="This topic describes resources and development tools that are commonly used in EJB version 2.x development.">EJB 2.x development resources</a></div>
+</div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/org.eclipse.jst.ejb.doc.user/topics/teentityb.dita b/docs/org.eclipse.jst.ejb.doc.user/topics/teentityb.dita
new file mode 100644
index 0000000..2c9d7fe
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/topics/teentityb.dita
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="utf-8"?>

+<!--Arbortext, Inc., 1988-2006, v.4002-->

+<!DOCTYPE task PUBLIC "-//OASIS//DTD DITA Task//EN"

+ "task.dtd">

+<task id="temessb" xml:lang="en-us">

+<title>Creating container-managed persistence (CMP) entity beans with XDoclet

+annotation support</title>

+<shortdesc>You can use a wizard to create a CMP entity bean and add it to

+your project.</shortdesc>

+<prolog><metadata>

+<keywords><indexterm>CMP entity beans<indexterm>XDoclet annotation support</indexterm></indexterm>

+<indexterm>XDoclet annotation support<indexterm>entity beans</indexterm></indexterm>

+</keywords>

+</metadata></prolog>

+<taskbody>

+<prereq><p>Before you can create an enterprise bean, you must:</p><ul>

+<li>Define an EJB project to contain the enterprise bean. See <xref href="tecrtpro.dita"></xref>.</li>

+<li>Install XDoclet annotation support and enable it. See <xref href="txdocletconf.dita"></xref>.</li>

+</ul></prereq>

+<context><p>To create a CMP entity bean, complete the following steps:</p></context>

+<steps>

+<step><cmd>In the <tm tmclass="special" tmowner="Sun Microsystems, Inc." tmtype="tm"

+trademark="Java">Java</tm> EE perspective, click <menucascade><uicontrol>File</uicontrol>

+<uicontrol>New</uicontrol><uicontrol>Other</uicontrol></menucascade>. Select <menucascade>

+<uicontrol>EJB</uicontrol><uicontrol>XDoclet Enterprise JavaBean</uicontrol>

+</menucascade> and click <uicontrol>Next</uicontrol>.</cmd></step>

+<step><cmd>Select <uicontrol>Container Managed Entity Bean</uicontrol> and

+click <uicontrol>Next</uicontrol>.</cmd></step>

+<step><cmd>Select the <uicontrol>Project</uicontrol> that will contain the

+new bean. </cmd></step>

+<step><cmd>In the <uicontrol>Folder</uicontrol> field, select the folder for

+the new bean. </cmd></step>

+<step><cmd>In the <uicontrol>Java package</uicontrol> field, enter the package

+name for the new bean. </cmd></step>

+<step><cmd>In the <uicontrol>Class name</uicontrol> field, type a name for

+the enterprise bean. By convention, bean names should begin with an uppercase

+letter. </cmd><info><note>You can use Unicode characters for the bean name,

+but Unicode characters are not supported for enterprise bean packages and

+classes associated with enterprise beans.</note></info></step>

+<step importance="optional"><cmd>Change the <uicontrol>Superclass</uicontrol> for

+the bean if you want it to inherit from a class other than <codeph>java.lang.Object</codeph> and

+click <uicontrol>Next</uicontrol>.</cmd></step>

+<step><cmd>Provide an <uicontrol>EJB Name</uicontrol> for the bean. This is

+the name of the enterprise bean class. </cmd></step>

+<step><cmd>Provide a <uicontrol>Schema</uicontrol> name to specify the abstract

+schema of the bean.</cmd></step>

+<step><cmd>Provide a <uicontrol>Display Name</uicontrol> for the bean. This

+is a short name for the enterprise bean that is used by tools.</cmd></step>

+<step><cmd>Provide a text <uicontrol>Description</uicontrol> for the bean.</cmd>

+</step>

+<step><cmd>Select a <uicontrol>CMP Version</uicontrol> for the new bean:</cmd>

+<choices>

+<choice><uicontrol>1.x</uicontrol> specifies you are adding the bean to an

+EJB 1.0 or later project.</choice>

+<choice><uicontrol>2.x</uicontrol> specifies you are adding the bean to an

+EJB 2.0 or later project.</choice>

+</choices>

+</step>

+<step><cmd>Select a <uicontrol>Usecase</uicontrol> for the new bean:</cmd>

+<choices>

+<choice><uicontrol>Import attributes from table</uicontrol> specifies that

+the CMP entity bean attributes will be imported from a database table. Click <uicontrol>Next</uicontrol> and

+do one of the following:<ul>

+<li>To select an available connection definition, click a connection in the <uicontrol>Available

+Connection Definitions</uicontrol> list. Click <uicontrol>Next</uicontrol>.</li>

+<li>To create a new JDBC connection definition, click <uicontrol>New</uicontrol> and

+complete the following steps: <ol>

+<li>Select a database manager in the Connection Profile Type window and click <uicontrol>Next</uicontrol>.</li>

+<li>Enter a name and description for the new connection definition and click <uicontrol>Next</uicontrol>.</li>

+<li>Select a JDBC driver from the drop-down menu or click the <uicontrol>...</uicontrol> button

+to add, edit, or remove driver definitions.</li>

+<li>Specify the other connection details in this window, test the connection,

+and click <uicontrol>Finish</uicontrol> and then click <uicontrol>Next</uicontrol>.</li>

+</ol></li>

+</ul></choice>

+<choice><uicontrol>Define new attributes</uicontrol> specifies that the CMP

+entity bean attributes will be user-defined. Click <uicontrol>Next</uicontrol> and

+complete the following steps:<ol>

+<li>To specify a table name for the entity bean, enter a name in the <uicontrol>Table</uicontrol> field.</li>

+<li>To create a CMP attribute for the entity bean, click <uicontrol>Add</uicontrol>.</li>

+<li>To specify a name for the attribute, click in the <uicontrol>Name</uicontrol> field

+and enter a name.</li>

+<li>To specify a type for the attribute, click in the <uicontrol>Type</uicontrol> field

+and enter a type.</li>

+<li>To make the attribute a key field for the entity bean, select the <uicontrol>Primary

+Key</uicontrol> check box.</li>

+<li importance="optional">To add more attributes, repeat procedures b to e

+and click <uicontrol>Next</uicontrol>.</li>

+</ol></choice>

+</choices>

+</step>

+<step><cmd>Select the type of <uicontrol>Modifiers</uicontrol> to use for

+the class.</cmd></step>

+<step importance="optional"><cmd>Select the <b>Interfaces</b> you want the

+bean to implement. Click <uicontrol>Add</uicontrol> to select interfaces that

+you want to implement and click <uicontrol>Remove</uicontrol> to take away

+interfaces that you no longer want to implement.</cmd></step>

+<step><cmd>Select the method stubs that you want the wizard to create.</cmd>

+</step>

+<step><cmd>Click <uicontrol>Finish</uicontrol> to add the new bean to the

+specified EJB project.</cmd></step>

+</steps>

+</taskbody>

+</task>

diff --git a/docs/org.eclipse.jst.ejb.doc.user/topics/teentityb.html b/docs/org.eclipse.jst.ejb.doc.user/topics/teentityb.html
new file mode 100644
index 0000000..c0f71a1
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/topics/teentityb.html
@@ -0,0 +1,177 @@
+<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html lang="en-us" xml:lang="en-us">
+<head>
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+<meta name="copyright" content="Copyright (c) 2000, 2011 IBM 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: IBM Corporation - initial API and implementation" />
+<meta name="DC.rights.owner" content="(C) Copyright 2000, 2011" />
+<meta content="public" name="security" />
+<meta content="index,follow" name="Robots" />
+<meta http-equiv="PICS-Label" content='(PICS-1.1 "http://www.icra.org/ratingsv02.html" l gen true r (cz 1 lz 1 nz 1 oz 1 vz 1) "http://www.rsac.org/ratingsv01.html" l gen true r (n 0 s 0 v 0 l 0) "http://www.classify.org/safesurf/" l gen true r (SS~~000 1))' />
+<meta content="task" name="DC.Type" />
+<meta name="DC.Title" content="Creating container-managed persistence (CMP) entity beans with XDoclet annotation support" />
+<meta name="abstract" content="You can use a wizard to create a CMP entity bean and add it to your project." />
+<meta name="description" content="You can use a wizard to create a CMP entity bean and add it to your project." />
+<meta content="CMP entity beans, XDoclet annotation support, entity beans" name="DC.subject" />
+<meta content="CMP entity beans, XDoclet annotation support, entity beans" name="keywords" />
+<meta scheme="URI" name="DC.Relation" content="../topics/tecrte.html" />
+<meta content="XHTML" name="DC.Format" />
+<meta content="temessb" name="DC.Identifier" />
+<meta content="en-us" name="DC.Language" />
+<link href="../../org.eclipse.wst.doc.user/common.css" type="text/css" rel="stylesheet" />
+<title>Creating container-managed persistence (CMP) entity beans with XDoclet
+annotation support</title>
+</head>
+<body id="temessb"><a name="temessb"><!-- --></a>
+
+
+<h1 class="topictitle1">Creating container-managed persistence (CMP) entity beans with XDoclet
+annotation support</h1>
+
+
+
+<div><p>You can use a wizard to create a CMP entity bean and add it to
+your project.</p>
+
+<div class="p"><p>Before you can create an enterprise bean, you must:</p>
+<ul>
+<li>Define an EJB project to contain the enterprise bean. See <a href="tecrtpro.html" title="An EJB project is used to organize the resources contained in an&#10;EJB module.">Creating EJB projects</a>.</li>
+
+<li>Install XDoclet annotation support and enable it. See <a href="txdocletconf.html" title="To use XDoclet annotation support, or to create enterprise beans,&#10;XDoclet must be installed on your system and configured to work with the workbench. ">Configuring XDoclet annotation support</a>.</li>
+
+</ul>
+</div>
+
+<div class="section"><p>To create a CMP entity bean, complete the following steps:</p>
+</div>
+
+<ol>
+<li class="stepexpand"><span>In the Java™ EE perspective, click <span class="menucascade"><span class="uicontrol">File</span>
+ &gt; <span class="uicontrol">New</span> &gt; <span class="uicontrol">Other</span></span>. Select <span class="menucascade">
+<span class="uicontrol">EJB</span> &gt; <span class="uicontrol">XDoclet Enterprise JavaBean</span>
+</span> and click <span class="uicontrol">Next</span>.</span></li>
+
+<li class="stepexpand"><span>Select <span class="uicontrol">Container Managed Entity Bean</span> and
+click <span class="uicontrol">Next</span>.</span></li>
+
+<li class="stepexpand"><span>Select the <span class="uicontrol">Project</span> that will contain the
+new bean. </span></li>
+
+<li class="stepexpand"><span>In the <span class="uicontrol">Folder</span> field, select the folder for
+the new bean. </span></li>
+
+<li class="stepexpand"><span>In the <span class="uicontrol">Java package</span> field, enter the package
+name for the new bean. </span></li>
+
+<li class="stepexpand"><span>In the <span class="uicontrol">Class name</span> field, type a name for
+the enterprise bean. By convention, bean names should begin with an uppercase
+letter. </span> <div class="note"><span class="notetitle">Note:</span> You can use Unicode characters for the bean name,
+but Unicode characters are not supported for enterprise bean packages and
+classes associated with enterprise beans.</div>
+</li>
+
+<li class="stepexpand"><strong>Optional: </strong><span>Change the <span class="uicontrol">Superclass</span> for
+the bean if you want it to inherit from a class other than <samp class="codeph">java.lang.Object</samp> and
+click <span class="uicontrol">Next</span>.</span></li>
+
+<li class="stepexpand"><span>Provide an <span class="uicontrol">EJB Name</span> for the bean. This is
+the name of the enterprise bean class. </span></li>
+
+<li class="stepexpand"><span>Provide a <span class="uicontrol">Schema</span> name to specify the abstract
+schema of the bean.</span></li>
+
+<li class="stepexpand"><span>Provide a <span class="uicontrol">Display Name</span> for the bean. This
+is a short name for the enterprise bean that is used by tools.</span></li>
+
+<li class="stepexpand"><span>Provide a text <span class="uicontrol">Description</span> for the bean.</span>
+</li>
+
+<li class="stepexpand"><span>Select a <span class="uicontrol">CMP Version</span> for the new bean:</span>
+<ul>
+<li><span class="uicontrol">1.x</span> specifies you are adding the bean to an
+EJB 1.0 or later project.</li>
+
+<li><span class="uicontrol">2.x</span> specifies you are adding the bean to an
+EJB 2.0 or later project.</li>
+
+</ul>
+
+</li>
+
+<li class="stepexpand"><span>Select a <span class="uicontrol">Usecase</span> for the new bean:</span>
+<ul>
+<li><span class="uicontrol">Import attributes from table</span> specifies that
+the CMP entity bean attributes will be imported from a database table. Click <span class="uicontrol">Next</span> and
+do one of the following:<ul>
+<li>To select an available connection definition, click a connection in the <span class="uicontrol">Available
+Connection Definitions</span> list. Click <span class="uicontrol">Next</span>.</li>
+
+<li>To create a new JDBC connection definition, click <span class="uicontrol">New</span> and
+complete the following steps: <ol type="a">
+<li>Select a database manager in the Connection Profile Type window and click <span class="uicontrol">Next</span>.</li>
+
+<li>Enter a name and description for the new connection definition and click <span class="uicontrol">Next</span>.</li>
+
+<li>Select a JDBC driver from the drop-down menu or click the <span class="uicontrol">...</span> button
+to add, edit, or remove driver definitions.</li>
+
+<li>Specify the other connection details in this window, test the connection,
+and click <span class="uicontrol">Finish</span> and then click <span class="uicontrol">Next</span>.</li>
+
+</ol>
+</li>
+
+</ul>
+</li>
+
+<li><span class="uicontrol">Define new attributes</span> specifies that the CMP
+entity bean attributes will be user-defined. Click <span class="uicontrol">Next</span> and
+complete the following steps:<ol type="a">
+<li>To specify a table name for the entity bean, enter a name in the <span class="uicontrol">Table</span> field.</li>
+
+<li>To create a CMP attribute for the entity bean, click <span class="uicontrol">Add</span>.</li>
+
+<li>To specify a name for the attribute, click in the <span class="uicontrol">Name</span> field
+and enter a name.</li>
+
+<li>To specify a type for the attribute, click in the <span class="uicontrol">Type</span> field
+and enter a type.</li>
+
+<li>To make the attribute a key field for the entity bean, select the <span class="uicontrol">Primary
+Key</span> check box.</li>
+
+<li>To add more attributes, repeat procedures b to e
+and click <span class="uicontrol">Next</span>.</li>
+
+</ol>
+</li>
+
+</ul>
+
+</li>
+
+<li class="stepexpand"><span>Select the type of <span class="uicontrol">Modifiers</span> to use for
+the class.</span></li>
+
+<li class="stepexpand"><strong>Optional: </strong><span>Select the <strong>Interfaces</strong> you want the
+bean to implement. Click <span class="uicontrol">Add</span> to select interfaces that
+you want to implement and click <span class="uicontrol">Remove</span> to take away
+interfaces that you no longer want to implement.</span></li>
+
+<li class="stepexpand"><span>Select the method stubs that you want the wizard to create.</span>
+</li>
+
+<li class="stepexpand"><span>Click <span class="uicontrol">Finish</span> to add the new bean to the
+specified EJB project.</span></li>
+
+</ol>
+
+</div>
+
+<div>
+<div class="familylinks">
+<div class="parentlink"><strong>Parent topic:</strong> <a href="../topics/tecrte.html" title="You can use a wizard to create session beans and message-driven beans that support XDoclet annotation.">Creating enterprise beans with XDoclet annotation support</a></div>
+</div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/org.eclipse.jst.ejb.doc.user/topics/teexp.dita b/docs/org.eclipse.jst.ejb.doc.user/topics/teexp.dita
new file mode 100644
index 0000000..7440027
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/topics/teexp.dita
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>

+<!--Arbortext, Inc., 1988-2006, v.4002-->

+<!DOCTYPE task PUBLIC "-//OASIS//DTD DITA Task//EN"

+ "task.dtd">

+<task id="teexp" xml:lang="en-us">

+<title>Exporting EJB 2.x projects to EJB JAR files</title>

+<shortdesc>After you have tested your enterprise beans, you can export the

+module into an EJB JAR file.</shortdesc>

+<prolog><metadata>

+<keywords><indexterm>EJB<indexterm>JAR files<indexterm>exporting projects</indexterm></indexterm></indexterm>

+<indexterm>EJB<indexterm>exporting projects</indexterm></indexterm></keywords>

+</metadata></prolog>

+<taskbody>

+<context><p>When you export an EJB project, the contents of the project are

+exported into an EJB JAR file regardless of whether deployment code has been

+generated or not. You can use the exported server-side JAR file as the client

+JAR file, since it contains all of the required code from both a server-side

+and client-side perspective.</p><note id="exportEJBClientJAR" type="important">If

+you use the Export EJB JAR file wizard to export an EJB project, the export

+wizard does not include an EJB project's associated EJB client JAR project.

+To include the EJB client JAR file, it is recommended that you export the

+enterprise application EAR file that contains the EJB project. The resulting

+EAR file will include any dependent EJB client JAR files as utility JAR files.

+Alternatively, you can export the EJB client JAR project separately as a JAR

+file.</note><p>To export an EJB project, complete the following steps:</p></context>

+<steps>

+<step><cmd>In the Project Explorer view of the <tm tmclass="special" tmowner="Sun Microsystems, Inc."

+tmtype="tm" trademark="Java">Java</tm> EE perspective, right-click the EJB

+project that you want to export and select <menucascade><uicontrol>Export</uicontrol>

+<uicontrol>EJB JAR File</uicontrol></menucascade>.</cmd></step>

+<step><cmd>In the <uicontrol>EJB Project</uicontrol> drop-down list, select

+the project you want to export if the name is not already filled in for you.</cmd>

+</step>

+<step><cmd>In the <uicontrol>Destination</uicontrol> field, provide the full

+path and JAR file name for the exported EJB module.</cmd></step>

+<step importance="optional"><cmd>To include source files in the exported JAR

+file, select the <uicontrol>Export source files</uicontrol> check box.</cmd>

+</step>

+<step importance="optional"><cmd>If you are exporting to an existing JAR file

+and you do not want to be warned about overwriting it, select <uicontrol>Overwrite

+existing file</uicontrol>.</cmd></step>

+<step><cmd>Click <uicontrol>Finish</uicontrol>.</cmd></step>

+</steps>

+<result> <p>To deploy your EJB JAR file to an application server after you

+export it, you need to use the deployment tools provided by the vendor of

+that server.</p></result>

+</taskbody>

+</task>

diff --git a/docs/org.eclipse.jst.ejb.doc.user/topics/teexp.html b/docs/org.eclipse.jst.ejb.doc.user/topics/teexp.html
new file mode 100644
index 0000000..4c395a1
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/topics/teexp.html
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html lang="en-us" xml:lang="en-us">
+<head>
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+<meta name="copyright" content="Copyright (c) 2000, 2011 IBM 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: IBM Corporation - initial API and implementation" />
+<meta name="DC.rights.owner" content="(C) Copyright 2000, 2011" />
+<meta content="public" name="security" />
+<meta content="index,follow" name="Robots" />
+<meta http-equiv="PICS-Label" content='(PICS-1.1 "http://www.icra.org/ratingsv02.html" l gen true r (cz 1 lz 1 nz 1 oz 1 vz 1) "http://www.rsac.org/ratingsv01.html" l gen true r (n 0 s 0 v 0 l 0) "http://www.classify.org/safesurf/" l gen true r (SS~~000 1))' />
+<meta content="task" name="DC.Type" />
+<meta name="DC.Title" content="Exporting EJB 2.x projects to EJB JAR files" />
+<meta name="abstract" content="After you have tested your enterprise beans, you can export the module into an EJB JAR file." />
+<meta name="description" content="After you have tested your enterprise beans, you can export the module into an EJB JAR file." />
+<meta content="EJB, JAR files, exporting projects" name="DC.subject" />
+<meta content="EJB, JAR files, exporting projects" name="keywords" />
+<meta scheme="URI" name="DC.Relation" content="../topics/ceresrc.html" />
+<meta content="XHTML" name="DC.Format" />
+<meta content="teexp" name="DC.Identifier" />
+<meta content="en-us" name="DC.Language" />
+<link href="../../org.eclipse.wst.doc.user/common.css" type="text/css" rel="stylesheet" />
+<title>Exporting EJB 2.x projects to EJB JAR files</title>
+</head>
+<body id="teexp"><a name="teexp"><!-- --></a>
+
+
+<h1 class="topictitle1">Exporting EJB 2.x projects to EJB JAR files</h1>
+
+
+
+<div><p>After you have tested your enterprise beans, you can export the
+module into an EJB JAR file.</p>
+
+<div class="section"><p>When you export an EJB project, the contents of the project are
+exported into an EJB JAR file regardless of whether deployment code has been
+generated or not. You can use the exported server-side JAR file as the client
+JAR file, since it contains all of the required code from both a server-side
+and client-side perspective.</p>
+<div class="important" id="teexp__exportEJBClientJAR"><a name="teexp__exportEJBClientJAR"><!-- --></a><span class="importanttitle">Important:</span> If
+you use the Export EJB JAR file wizard to export an EJB project, the export
+wizard does not include an EJB project's associated EJB client JAR project.
+To include the EJB client JAR file, it is recommended that you export the
+enterprise application EAR file that contains the EJB project. The resulting
+EAR file will include any dependent EJB client JAR files as utility JAR files.
+Alternatively, you can export the EJB client JAR project separately as a JAR
+file.</div>
+<p>To export an EJB project, complete the following steps:</p>
+</div>
+
+<ol>
+<li><span>In the Project Explorer view of the Java™ EE perspective, right-click the EJB
+project that you want to export and select <span class="menucascade"><span class="uicontrol">Export</span>
+ &gt; <span class="uicontrol">EJB JAR File</span></span>.</span></li>
+
+<li><span>In the <span class="uicontrol">EJB Project</span> drop-down list, select
+the project you want to export if the name is not already filled in for you.</span>
+</li>
+
+<li><span>In the <span class="uicontrol">Destination</span> field, provide the full
+path and JAR file name for the exported EJB module.</span></li>
+
+<li><strong>Optional: </strong><span>To include source files in the exported JAR
+file, select the <span class="uicontrol">Export source files</span> check box.</span>
+</li>
+
+<li><strong>Optional: </strong><span>If you are exporting to an existing JAR file
+and you do not want to be warned about overwriting it, select <span class="uicontrol">Overwrite
+existing file</span>.</span></li>
+
+<li><span>Click <span class="uicontrol">Finish</span>.</span></li>
+
+</ol>
+
+<div class="section"> <p>To deploy your EJB JAR file to an application server after you
+export it, you need to use the deployment tools provided by the vendor of
+that server.</p>
+</div>
+
+</div>
+
+<div>
+<div class="familylinks">
+<div class="parentlink"><strong>Parent topic:</strong> <a href="../topics/ceresrc.html" title="This topic describes resources and development tools that are commonly used in EJB version 2.x development.">EJB 2.x development resources</a></div>
+</div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/org.eclipse.jst.ejb.doc.user/topics/teimp.dita b/docs/org.eclipse.jst.ejb.doc.user/topics/teimp.dita
new file mode 100644
index 0000000..6506064
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/topics/teimp.dita
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8"?>

+<!--Arbortext, Inc., 1988-2006, v.4002-->

+<!DOCTYPE task PUBLIC "-//OASIS//DTD DITA Task//EN"

+ "task.dtd">

+<task id="teimp" xml:lang="en-us">

+<title>Importing EJB 2.x JAR files</title>

+<shortdesc>You can import beans and other metadata from an EJB JAR file into

+a new or existing EJB project.</shortdesc>

+<prolog><metadata>

+<keywords><indexterm>EJB<indexterm>importing JAR files</indexterm></indexterm>

+<indexterm>JAR files<indexterm>importing EJB</indexterm></indexterm></keywords>

+</metadata></prolog>

+<taskbody>

+<context> <p>To import an EJB JAR file into an EJB project using the Import

+wizard, complete the following steps:</p></context>

+<steps>

+<step><cmd>In the Project Explorer view of the <tm tmclass="special" tmowner="Sun Microsystems, Inc."

+tmtype="tm" trademark="Java">Java</tm> EE perspective, select <menucascade>

+<uicontrol>File</uicontrol><uicontrol>Import</uicontrol></menucascade>.</cmd>

+</step>

+<step><cmd>Under <uicontrol>Select an import source</uicontrol>, click <menucascade>

+<uicontrol>EJB</uicontrol><uicontrol>EJB JAR file</uicontrol></menucascade> and

+click <uicontrol>Next</uicontrol>.</cmd></step>

+<step><cmd>In the <uicontrol>EJB JAR file</uicontrol> field, enter the location

+and name of the EJB JAR file that you want to import.</cmd></step>

+<step><cmd>In the <uicontrol>EJB Project</uicontrol> field, a new project

+name or select an EJB project from the drop-down list.</cmd></step>

+<step><cmd>In the <uicontrol>Target runtime</uicontrol> drop-down list, select

+the application server that you want to target for your development. If no

+Target servers exist, create one using the <uicontrol>New</uicontrol> button.

+The target server choice affects the run time settings by modifying the class

+path entries for the project. This selection affects the run time settings

+by modifying the class path entries for the project.</cmd></step>

+<step><cmd>Specify whether you want to add the new module to an enterprise

+application (EAR) project. </cmd></step>

+<step importance="optional"><cmd>Select the <uicontrol>Add project to an EAR </uicontrol> check

+box to add the new module to an enterprise application (EAR) project.</cmd>

+<info>Type a new project name or select an existing enterprise application

+project from the drop-down list in the <uicontrol>EAR Project</uicontrol> combination

+box. Or, click the <uicontrol>New</uicontrol> button to launch the New Enterprise

+Application Project wizard. Click <uicontrol>Next</uicontrol>.</info></step>

+<step><cmd>Click <uicontrol>Finish</uicontrol> to import the EJB JAR file.</cmd>

+</step>

+</steps>

+<result><note type="tip">In the Project Explorer view you can also copy enterprise

+beans by dragging and dropping them from one EJB project to another EJB project.

+The import wizard will open to help you merge existing enterprise beans.</note><note

+type="tip"><image alt="The following paragraph applies to Windows." href="../images/ycwin.gif"

+placement="inline"></image> You can quickly drag and drop an EJB JAR file

+from the <tm tmclass="special" tmowner="Microsoft Corporation" tmtype="reg"

+trademark="Windows">Windows</tm> Explorer or desktop onto the Project Explorer

+view. The Import wizard will open with appropriate fields already populated.

+If you drop on an existing EJB module, the wizard will import into that EJB

+module. If you drop on an enterprise application, the wizard will bind the

+new EJB module to this EAR.</note><note>The .ser files in an EJB 1.0 JAR are

+converted into the ejb-jar.xml file for EJB 1.1 during an import.</note></result>

+</taskbody>

+</task>

diff --git a/docs/org.eclipse.jst.ejb.doc.user/topics/teimp.html b/docs/org.eclipse.jst.ejb.doc.user/topics/teimp.html
new file mode 100644
index 0000000..2089aed
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/topics/teimp.html
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html lang="en-us" xml:lang="en-us">
+<head>
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+<meta name="copyright" content="Copyright (c) 2000, 2011 IBM 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: IBM Corporation - initial API and implementation" />
+<meta name="DC.rights.owner" content="(C) Copyright 2000, 2011" />
+<meta content="public" name="security" />
+<meta content="index,follow" name="Robots" />
+<meta http-equiv="PICS-Label" content='(PICS-1.1 "http://www.icra.org/ratingsv02.html" l gen true r (cz 1 lz 1 nz 1 oz 1 vz 1) "http://www.rsac.org/ratingsv01.html" l gen true r (n 0 s 0 v 0 l 0) "http://www.classify.org/safesurf/" l gen true r (SS~~000 1))' />
+<meta content="task" name="DC.Type" />
+<meta name="DC.Title" content="Importing EJB 2.x JAR files" />
+<meta name="abstract" content="You can import beans and other metadata from an EJB JAR file into a new or existing EJB project." />
+<meta name="description" content="You can import beans and other metadata from an EJB JAR file into a new or existing EJB project." />
+<meta content="EJB, importing JAR files, JAR files, importing EJB" name="DC.subject" />
+<meta content="EJB, importing JAR files, JAR files, importing EJB" name="keywords" />
+<meta scheme="URI" name="DC.Relation" content="../topics/ceresrc.html" />
+<meta content="XHTML" name="DC.Format" />
+<meta content="teimp" name="DC.Identifier" />
+<meta content="en-us" name="DC.Language" />
+<link href="../../org.eclipse.wst.doc.user/common.css" type="text/css" rel="stylesheet" />
+<title>Importing EJB 2.x JAR files</title>
+</head>
+<body id="teimp"><a name="teimp"><!-- --></a>
+
+
+<h1 class="topictitle1">Importing EJB 2.x JAR files</h1>
+
+
+
+<div><p>You can import beans and other metadata from an EJB JAR file into
+a new or existing EJB project.</p>
+
+<div class="section"> <p>To import an EJB JAR file into an EJB project using the Import
+wizard, complete the following steps:</p>
+</div>
+
+<ol>
+<li class="stepexpand"><span>In the Project Explorer view of the Java™ EE perspective, select <span class="menucascade">
+<span class="uicontrol">File</span> &gt; <span class="uicontrol">Import</span></span>.</span>
+</li>
+
+<li class="stepexpand"><span>Under <span class="uicontrol">Select an import source</span>, click <span class="menucascade">
+<span class="uicontrol">EJB</span> &gt; <span class="uicontrol">EJB JAR file</span></span> and
+click <span class="uicontrol">Next</span>.</span></li>
+
+<li class="stepexpand"><span>In the <span class="uicontrol">EJB JAR file</span> field, enter the location
+and name of the EJB JAR file that you want to import.</span></li>
+
+<li class="stepexpand"><span>In the <span class="uicontrol">EJB Project</span> field, a new project
+name or select an EJB project from the drop-down list.</span></li>
+
+<li class="stepexpand"><span>In the <span class="uicontrol">Target runtime</span> drop-down list, select
+the application server that you want to target for your development. If no
+Target servers exist, create one using the <span class="uicontrol">New</span> button.
+The target server choice affects the run time settings by modifying the class
+path entries for the project. This selection affects the run time settings
+by modifying the class path entries for the project.</span></li>
+
+<li class="stepexpand"><span>Specify whether you want to add the new module to an enterprise
+application (EAR) project. </span></li>
+
+<li class="stepexpand"><strong>Optional: </strong><span>Select the <span class="uicontrol">Add project to an EAR </span> check
+box to add the new module to an enterprise application (EAR) project.</span>
+ Type a new project name or select an existing enterprise application
+project from the drop-down list in the <span class="uicontrol">EAR Project</span> combination
+box. Or, click the <span class="uicontrol">New</span> button to launch the New Enterprise
+Application Project wizard. Click <span class="uicontrol">Next</span>.</li>
+
+<li class="stepexpand"><span>Click <span class="uicontrol">Finish</span> to import the EJB JAR file.</span>
+</li>
+
+</ol>
+
+<div class="section"><div class="tip"><span class="tiptitle">Tip:</span> In the Project Explorer view you can also copy enterprise
+beans by dragging and dropping them from one EJB project to another EJB project.
+The import wizard will open to help you merge existing enterprise beans.</div>
+<div class="tip"><span class="tiptitle">Tip:</span> <img src="../images/ycwin.gif" alt="The following paragraph applies to Windows." /> You can quickly drag and drop an EJB JAR file
+from the Windows<sup>®</sup> Explorer or desktop onto the Project Explorer
+view. The Import wizard will open with appropriate fields already populated.
+If you drop on an existing EJB module, the wizard will import into that EJB
+module. If you drop on an enterprise application, the wizard will bind the
+new EJB module to this EAR.</div>
+<div class="note"><span class="notetitle">Note:</span> The .ser files in an EJB 1.0 JAR are
+converted into the ejb-jar.xml file for EJB 1.1 during an import.</div>
+</div>
+
+</div>
+
+<div>
+<div class="familylinks">
+<div class="parentlink"><strong>Parent topic:</strong> <a href="../topics/ceresrc.html" title="This topic describes resources and development tools that are commonly used in EJB version 2.x development.">EJB 2.x development resources</a></div>
+</div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/org.eclipse.jst.ejb.doc.user/topics/temessb.dita b/docs/org.eclipse.jst.ejb.doc.user/topics/temessb.dita
new file mode 100644
index 0000000..ea4067c
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/topics/temessb.dita
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="utf-8"?>

+<!--Arbortext, Inc., 1988-2006, v.4002-->

+<!DOCTYPE task PUBLIC "-//OASIS//DTD DITA Task//EN"

+ "task.dtd">

+<task id="temessb" xml:lang="en-us">

+<title>Creating message-driven beans with XDoclet annotation support</title>

+<shortdesc>You can use a wizard to create a message-driven bean and add it

+to your project.</shortdesc>

+<prolog><metadata>

+<keywords><indexterm>message-driven beans<indexterm>XDoclet annotation support</indexterm></indexterm>

+<indexterm>XDoclet annotation support<indexterm>message-driven beans</indexterm></indexterm>

+</keywords>

+</metadata></prolog>

+<taskbody>

+<prereq><p>Before you can create an enterprise bean, you must:</p><ul>

+<li>Define an EJB project to contain the enterprise bean. See <xref href="tecrtpro.dita"></xref>.</li>

+<li>Install XDoclet annotation support and enable it. See <xref href="txdocletconf.dita"></xref>.</li>

+</ul></prereq>

+<context><p>To create a message-driven bean, complete the following steps:</p></context>

+<steps>

+<step><cmd>In the <tm tmclass="special" tmowner="Sun Microsystems, Inc." tmtype="tm"

+trademark="Java">Java</tm> EE perspective, click <menucascade><uicontrol>File</uicontrol>

+<uicontrol>New</uicontrol><uicontrol>Other</uicontrol></menucascade>. Select <menucascade>

+<uicontrol>EJB</uicontrol><uicontrol>XDoclet Enterprise JavaBean</uicontrol>

+</menucascade> and click <uicontrol>Next</uicontrol>.</cmd></step>

+<step><cmd>Select the <uicontrol>Message Driven Bean</uicontrol> and click <uicontrol>Next</uicontrol>.</cmd>

+</step>

+<step><cmd>Select the <uicontrol>Project</uicontrol> that will contain the

+new bean. </cmd></step>

+<step><cmd>In the <uicontrol>Folder</uicontrol> field, select the folder for

+the new bean. </cmd></step>

+<step><cmd>In the <uicontrol>Java package</uicontrol> field, enter the package

+name for the new bean. </cmd></step>

+<step><cmd>In the <uicontrol>Class name</uicontrol> field, type a name for

+the enterprise bean. By convention, bean names should begin with an uppercase

+letter. </cmd><info><note>You can use Unicode characters for the bean name,

+but Unicode characters are not supported for enterprise bean packages and

+classes associated with enterprise beans.</note></info></step>

+<step><cmd>Change the <uicontrol>Superclass</uicontrol> for the bean if you

+want it to inherit from a class other than <codeph>java.lang.Object</codeph> and

+click <uicontrol>Next</uicontrol>.</cmd></step>

+<step><cmd>Provide an <uicontrol>EJB Name</uicontrol> for the bean. This is

+the name of the enterprise bean class. </cmd></step>

+<step><cmd>Provide an <uicontrol>Destination JNDI Name</uicontrol> for the

+bean. This is a logical name used by the server to locate an enterprise bean

+at runtime. </cmd></step>

+<step><cmd>Provide an <uicontrol>Display Name</uicontrol> for the bean. This

+is a short name for the enterprise bean that is used by tools. </cmd></step>

+<step><cmd>Provide a text <uicontrol>Description</uicontrol> for the bean.</cmd>

+</step>

+<step><cmd>Select a <uicontrol>Destination</uicontrol> for the new bean: </cmd>

+<info><ul>

+<li><uicontrol>Queue</uicontrol> specifies that the point-to-point JMS messaging

+model will be used. </li>

+<li><uicontrol>Topic</uicontrol> specifies that the publish-and-subscribe

+JMS messaging model will be used.</li>

+</ul></info></step>

+<step><cmd>Select a <uicontrol>Transaction Type</uicontrol> for the new bean:</cmd>

+<info><ul>

+<li><uicontrol>Container</uicontrol> specifies that the transaction demarcation

+is performed by the container.</li>

+<li><uicontrol>Bean</uicontrol> specifies that the transaction demarcation

+is performed by the bean. </li>

+</ul>Click <uicontrol>Next</uicontrol>.</info></step>

+<step><cmd>Select the type of <uicontrol>Modifiers</uicontrol> to use for

+the class.</cmd></step>

+<step importance="optional"><cmd>Select the <uicontrol>Interfaces</uicontrol> you

+want the bean to implement. Click <uicontrol>Add</uicontrol> to select interfaces

+that you want to implement and click <uicontrol>Remove</uicontrol> to take

+away interfaces that you no longer want to implement.</cmd></step>

+<step><cmd>Select the method stubs that you want the wizard to create.</cmd>

+</step>

+<step><cmd>Click <uicontrol>Finish</uicontrol> to add the new bean to the

+specified EJB project.</cmd></step>

+</steps>

+</taskbody>

+</task>

diff --git a/docs/org.eclipse.jst.ejb.doc.user/topics/temessb.html b/docs/org.eclipse.jst.ejb.doc.user/topics/temessb.html
new file mode 100644
index 0000000..8afd383
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/topics/temessb.html
@@ -0,0 +1,134 @@
+<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html lang="en-us" xml:lang="en-us">
+<head>
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+<meta name="copyright" content="Copyright (c) 2000, 2011 IBM 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: IBM Corporation - initial API and implementation" />
+<meta name="DC.rights.owner" content="(C) Copyright 2000, 2011" />
+<meta content="public" name="security" />
+<meta content="index,follow" name="Robots" />
+<meta http-equiv="PICS-Label" content='(PICS-1.1 "http://www.icra.org/ratingsv02.html" l gen true r (cz 1 lz 1 nz 1 oz 1 vz 1) "http://www.rsac.org/ratingsv01.html" l gen true r (n 0 s 0 v 0 l 0) "http://www.classify.org/safesurf/" l gen true r (SS~~000 1))' />
+<meta content="task" name="DC.Type" />
+<meta name="DC.Title" content="Creating message-driven beans with XDoclet annotation support" />
+<meta name="abstract" content="You can use a wizard to create a message-driven bean and add it to your project." />
+<meta name="description" content="You can use a wizard to create a message-driven bean and add it to your project." />
+<meta content="message-driven beans, XDoclet annotation support" name="DC.subject" />
+<meta content="message-driven beans, XDoclet annotation support" name="keywords" />
+<meta scheme="URI" name="DC.Relation" content="../topics/tecrte.html" />
+<meta content="XHTML" name="DC.Format" />
+<meta content="temessb" name="DC.Identifier" />
+<meta content="en-us" name="DC.Language" />
+<link href="../../org.eclipse.wst.doc.user/common.css" type="text/css" rel="stylesheet" />
+<title>Creating message-driven beans with XDoclet annotation support</title>
+</head>
+<body id="temessb"><a name="temessb"><!-- --></a>
+
+
+<h1 class="topictitle1">Creating message-driven beans with XDoclet annotation support</h1>
+
+
+
+<div><p>You can use a wizard to create a message-driven bean and add it
+to your project.</p>
+
+<div class="p"><p>Before you can create an enterprise bean, you must:</p>
+<ul>
+<li>Define an EJB project to contain the enterprise bean. See <a href="tecrtpro.html" title="An EJB project is used to organize the resources contained in an&#10;EJB module.">Creating EJB projects</a>.</li>
+
+<li>Install XDoclet annotation support and enable it. See <a href="txdocletconf.html" title="To use XDoclet annotation support, or to create enterprise beans,&#10;XDoclet must be installed on your system and configured to work with the workbench. ">Configuring XDoclet annotation support</a>.</li>
+
+</ul>
+</div>
+
+<div class="section"><p>To create a message-driven bean, complete the following steps:</p>
+</div>
+
+<ol>
+<li class="stepexpand"><span>In the Java™ EE perspective, click <span class="menucascade"><span class="uicontrol">File</span>
+ &gt; <span class="uicontrol">New</span> &gt; <span class="uicontrol">Other</span></span>. Select <span class="menucascade">
+<span class="uicontrol">EJB</span> &gt; <span class="uicontrol">XDoclet Enterprise JavaBean</span>
+</span> and click <span class="uicontrol">Next</span>.</span></li>
+
+<li class="stepexpand"><span>Select the <span class="uicontrol">Message Driven Bean</span> and click <span class="uicontrol">Next</span>.</span>
+</li>
+
+<li class="stepexpand"><span>Select the <span class="uicontrol">Project</span> that will contain the
+new bean. </span></li>
+
+<li class="stepexpand"><span>In the <span class="uicontrol">Folder</span> field, select the folder for
+the new bean. </span></li>
+
+<li class="stepexpand"><span>In the <span class="uicontrol">Java package</span> field, enter the package
+name for the new bean. </span></li>
+
+<li class="stepexpand"><span>In the <span class="uicontrol">Class name</span> field, type a name for
+the enterprise bean. By convention, bean names should begin with an uppercase
+letter. </span> <div class="note"><span class="notetitle">Note:</span> You can use Unicode characters for the bean name,
+but Unicode characters are not supported for enterprise bean packages and
+classes associated with enterprise beans.</div>
+</li>
+
+<li class="stepexpand"><span>Change the <span class="uicontrol">Superclass</span> for the bean if you
+want it to inherit from a class other than <samp class="codeph">java.lang.Object</samp> and
+click <span class="uicontrol">Next</span>.</span></li>
+
+<li class="stepexpand"><span>Provide an <span class="uicontrol">EJB Name</span> for the bean. This is
+the name of the enterprise bean class. </span></li>
+
+<li class="stepexpand"><span>Provide an <span class="uicontrol">Destination JNDI Name</span> for the
+bean. This is a logical name used by the server to locate an enterprise bean
+at runtime. </span></li>
+
+<li class="stepexpand"><span>Provide an <span class="uicontrol">Display Name</span> for the bean. This
+is a short name for the enterprise bean that is used by tools. </span></li>
+
+<li class="stepexpand"><span>Provide a text <span class="uicontrol">Description</span> for the bean.</span>
+</li>
+
+<li class="stepexpand"><span>Select a <span class="uicontrol">Destination</span> for the new bean: </span>
+ <ul>
+<li><span class="uicontrol">Queue</span> specifies that the point-to-point JMS messaging
+model will be used. </li>
+
+<li><span class="uicontrol">Topic</span> specifies that the publish-and-subscribe
+JMS messaging model will be used.</li>
+
+</ul>
+</li>
+
+<li class="stepexpand"><span>Select a <span class="uicontrol">Transaction Type</span> for the new bean:</span>
+ <ul>
+<li><span class="uicontrol">Container</span> specifies that the transaction demarcation
+is performed by the container.</li>
+
+<li><span class="uicontrol">Bean</span> specifies that the transaction demarcation
+is performed by the bean. </li>
+
+</ul>
+Click <span class="uicontrol">Next</span>.</li>
+
+<li class="stepexpand"><span>Select the type of <span class="uicontrol">Modifiers</span> to use for
+the class.</span></li>
+
+<li class="stepexpand"><strong>Optional: </strong><span>Select the <span class="uicontrol">Interfaces</span> you
+want the bean to implement. Click <span class="uicontrol">Add</span> to select interfaces
+that you want to implement and click <span class="uicontrol">Remove</span> to take
+away interfaces that you no longer want to implement.</span></li>
+
+<li class="stepexpand"><span>Select the method stubs that you want the wizard to create.</span>
+</li>
+
+<li class="stepexpand"><span>Click <span class="uicontrol">Finish</span> to add the new bean to the
+specified EJB project.</span></li>
+
+</ol>
+
+</div>
+
+<div>
+<div class="familylinks">
+<div class="parentlink"><strong>Parent topic:</strong> <a href="../topics/tecrte.html" title="You can use a wizard to create session beans and message-driven beans that support XDoclet annotation.">Creating enterprise beans with XDoclet annotation support</a></div>
+</div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/org.eclipse.jst.ejb.doc.user/topics/tesessb.dita b/docs/org.eclipse.jst.ejb.doc.user/topics/tesessb.dita
new file mode 100644
index 0000000..c656f06
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/topics/tesessb.dita
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="utf-8"?>

+<!--Arbortext, Inc., 1988-2006, v.4002-->

+<!DOCTYPE task PUBLIC "-//OASIS//DTD DITA Task//EN"

+ "task.dtd">

+<task id="tesessb" xml:lang="en-us">

+<title>Creating session beans with XDoclet annotation support</title>

+<shortdesc>You can use a wizard to create a session bean and add it to your

+project.</shortdesc>

+<prolog><metadata>

+<keywords><indexterm>session beans<indexterm>XDoclet annotation support</indexterm></indexterm>

+<indexterm>XDoclet annotation support<indexterm>session beans</indexterm></indexterm>

+</keywords>

+</metadata></prolog>

+<taskbody>

+<prereq><p>Before you can create an enterprise bean, you must:</p><ul>

+<li>Define an EJB project to contain the enterprise bean. See <xref href="tecrtpro.dita"></xref>.</li>

+<li>Install XDoclet annotation support and enable it. See <xref href="txdocletconf.dita"></xref>.</li>

+</ul></prereq>

+<context> <p>To create a session bean, complete the following steps:</p></context>

+<steps>

+<step><cmd>In the <tm tmclass="special" tmowner="Sun Microsystems, Inc." tmtype="tm"

+trademark="Java">Java</tm> EE perspective, click <menucascade><uicontrol>File</uicontrol>

+<uicontrol>New</uicontrol><uicontrol>Other</uicontrol></menucascade>. Select <menucascade>

+<uicontrol>EJB</uicontrol><uicontrol>XDoclet Enterprise JavaBean</uicontrol>

+</menucascade> and click <uicontrol>Next</uicontrol>.</cmd></step>

+<step><cmd>Select <uicontrol>Session Bean</uicontrol> and click <uicontrol>Next</uicontrol>.</cmd>

+</step>

+<step><cmd>Select the <uicontrol>Project</uicontrol> that will contain the

+new session bean.</cmd></step>

+<step><cmd>In the <uicontrol>Folder</uicontrol> field, select the folder for

+the new bean. </cmd></step>

+<step><cmd>In the <uicontrol>Java package</uicontrol> field, enter the package

+name for the new bean. </cmd></step>

+<step><cmd>In the <uicontrol>Class name</uicontrol> field, type a name for

+the enterprise bean. By convention, bean names should begin with an uppercase

+letter. </cmd><info><note>You can use Unicode characters for the bean name,

+but Unicode characters are not supported for enterprise bean packages and

+classes associated with enterprise beans.</note></info></step>

+<step importance="optional"><cmd>Change the <uicontrol>Superclass</uicontrol> for

+the bean if you want it to inherit from a class other than <codeph>java.lang.Object</codeph> and

+click <uicontrol>Next</uicontrol>.</cmd></step>

+<step><cmd>Provide an <uicontrol>EJB Name</uicontrol> for the bean.</cmd>

+<info>This is the name of the enterprise bean class. The next three fields

+will automatically be filled in, you can change these values if you want:<ul>

+<li><uicontrol>JNDI Name</uicontrol> is the logical name used by the server

+to locate an enterprise bean at runtime.</li>

+<li><uicontrol>Display Name</uicontrol>  is a short name for the enterprise

+bean that is used by tools.</li>

+<li><uicontrol>Description</uicontrol> is to help you identify the bean.</li>

+</ul></info></step>

+<step><cmd>Select the <uicontrol>State type</uicontrol> for the new bean:</cmd>

+<info><ul>

+<li>A <uicontrol>Stateful</uicontrol> session bean maintains client-specific

+session information, or conversational state, across multiple method calls

+and transactions. An instance of a stateful session bean has a unique identity

+that is assigned by the container at create time. </li>

+<li>A <uicontrol>Stateless</uicontrol> session bean does not maintain conversational

+state. Instances of a stateless session bean have no conversational state.

+All instances of a stateless session bean have the same object identifier,

+which is assigned by the container. </li>

+</ul></info></step>

+<step><cmd>Select a <uicontrol>Transaction Type</uicontrol> for the new bean:</cmd>

+<info><ul>

+<li><b>Container</b> specifies that the transaction demarcation is performed

+by the container.</li>

+<li><uicontrol>Bean</uicontrol> specifies that the transaction demarcation

+is performed by the bean.</li>

+</ul>Click <uicontrol>Next</uicontrol>.</info></step>

+<step><cmd>Select the type of <uicontrol>Modifiers</uicontrol> to use for

+the class.</cmd></step>

+<step importance="optional"><cmd>Select the <b>Interfaces</b> you want the

+bean to implement. Click <uicontrol>Add</uicontrol> to select interfaces that

+you want to implement and click <uicontrol>Remove</uicontrol> to take away

+interfaces that you no longer want to implement.</cmd></step>

+<step><cmd>Select the method stubs that you want the wizard to create.</cmd>

+</step>

+<step><cmd>Click <uicontrol>Finish</uicontrol> to add the new bean to the

+specified EJB project.</cmd></step>

+</steps>

+</taskbody>

+</task>

diff --git a/docs/org.eclipse.jst.ejb.doc.user/topics/tesessb.html b/docs/org.eclipse.jst.ejb.doc.user/topics/tesessb.html
new file mode 100644
index 0000000..f7877ea
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/topics/tesessb.html
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html lang="en-us" xml:lang="en-us">
+<head>
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+<meta name="copyright" content="Copyright (c) 2000, 2011 IBM 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: IBM Corporation - initial API and implementation" />
+<meta name="DC.rights.owner" content="(C) Copyright 2000, 2011" />
+<meta content="public" name="security" />
+<meta content="index,follow" name="Robots" />
+<meta http-equiv="PICS-Label" content='(PICS-1.1 "http://www.icra.org/ratingsv02.html" l gen true r (cz 1 lz 1 nz 1 oz 1 vz 1) "http://www.rsac.org/ratingsv01.html" l gen true r (n 0 s 0 v 0 l 0) "http://www.classify.org/safesurf/" l gen true r (SS~~000 1))' />
+<meta content="task" name="DC.Type" />
+<meta name="DC.Title" content="Creating session beans with XDoclet annotation support" />
+<meta name="abstract" content="You can use a wizard to create a session bean and add it to your project." />
+<meta name="description" content="You can use a wizard to create a session bean and add it to your project." />
+<meta content="session beans, XDoclet annotation support" name="DC.subject" />
+<meta content="session beans, XDoclet annotation support" name="keywords" />
+<meta scheme="URI" name="DC.Relation" content="../topics/tecrte.html" />
+<meta content="XHTML" name="DC.Format" />
+<meta content="tesessb" name="DC.Identifier" />
+<meta content="en-us" name="DC.Language" />
+<link href="../../org.eclipse.wst.doc.user/common.css" type="text/css" rel="stylesheet" />
+<title>Creating session beans with XDoclet annotation support</title>
+</head>
+<body id="tesessb"><a name="tesessb"><!-- --></a>
+
+
+<h1 class="topictitle1">Creating session beans with XDoclet annotation support</h1>
+
+
+
+<div><p>You can use a wizard to create a session bean and add it to your
+project.</p>
+
+<div class="p"><p>Before you can create an enterprise bean, you must:</p>
+<ul>
+<li>Define an EJB project to contain the enterprise bean. See <a href="tecrtpro.html" title="An EJB project is used to organize the resources contained in an&#10;EJB module.">Creating EJB projects</a>.</li>
+
+<li>Install XDoclet annotation support and enable it. See <a href="txdocletconf.html" title="To use XDoclet annotation support, or to create enterprise beans,&#10;XDoclet must be installed on your system and configured to work with the workbench. ">Configuring XDoclet annotation support</a>.</li>
+
+</ul>
+</div>
+
+<div class="section"> <p>To create a session bean, complete the following steps:</p>
+</div>
+
+<ol>
+<li class="stepexpand"><span>In the Java™ EE perspective, click <span class="menucascade"><span class="uicontrol">File</span>
+ &gt; <span class="uicontrol">New</span> &gt; <span class="uicontrol">Other</span></span>. Select <span class="menucascade">
+<span class="uicontrol">EJB</span> &gt; <span class="uicontrol">XDoclet Enterprise JavaBean</span>
+</span> and click <span class="uicontrol">Next</span>.</span></li>
+
+<li class="stepexpand"><span>Select <span class="uicontrol">Session Bean</span> and click <span class="uicontrol">Next</span>.</span>
+</li>
+
+<li class="stepexpand"><span>Select the <span class="uicontrol">Project</span> that will contain the
+new session bean.</span></li>
+
+<li class="stepexpand"><span>In the <span class="uicontrol">Folder</span> field, select the folder for
+the new bean. </span></li>
+
+<li class="stepexpand"><span>In the <span class="uicontrol">Java package</span> field, enter the package
+name for the new bean. </span></li>
+
+<li class="stepexpand"><span>In the <span class="uicontrol">Class name</span> field, type a name for
+the enterprise bean. By convention, bean names should begin with an uppercase
+letter. </span> <div class="note"><span class="notetitle">Note:</span> You can use Unicode characters for the bean name,
+but Unicode characters are not supported for enterprise bean packages and
+classes associated with enterprise beans.</div>
+</li>
+
+<li class="stepexpand"><strong>Optional: </strong><span>Change the <span class="uicontrol">Superclass</span> for
+the bean if you want it to inherit from a class other than <samp class="codeph">java.lang.Object</samp> and
+click <span class="uicontrol">Next</span>.</span></li>
+
+<li class="stepexpand"><span>Provide an <span class="uicontrol">EJB Name</span> for the bean.</span>
+ This is the name of the enterprise bean class. The next three fields
+will automatically be filled in, you can change these values if you want:<ul>
+<li><span class="uicontrol">JNDI Name</span> is the logical name used by the server
+to locate an enterprise bean at runtime.</li>
+
+<li><span class="uicontrol">Display Name</span>  is a short name for the enterprise
+bean that is used by tools.</li>
+
+<li><span class="uicontrol">Description</span> is to help you identify the bean.</li>
+
+</ul>
+</li>
+
+<li class="stepexpand"><span>Select the <span class="uicontrol">State type</span> for the new bean:</span>
+ <ul>
+<li>A <span class="uicontrol">Stateful</span> session bean maintains client-specific
+session information, or conversational state, across multiple method calls
+and transactions. An instance of a stateful session bean has a unique identity
+that is assigned by the container at create time. </li>
+
+<li>A <span class="uicontrol">Stateless</span> session bean does not maintain conversational
+state. Instances of a stateless session bean have no conversational state.
+All instances of a stateless session bean have the same object identifier,
+which is assigned by the container. </li>
+
+</ul>
+</li>
+
+<li class="stepexpand"><span>Select a <span class="uicontrol">Transaction Type</span> for the new bean:</span>
+ <ul>
+<li><strong>Container</strong> specifies that the transaction demarcation is performed
+by the container.</li>
+
+<li><span class="uicontrol">Bean</span> specifies that the transaction demarcation
+is performed by the bean.</li>
+
+</ul>
+Click <span class="uicontrol">Next</span>.</li>
+
+<li class="stepexpand"><span>Select the type of <span class="uicontrol">Modifiers</span> to use for
+the class.</span></li>
+
+<li class="stepexpand"><strong>Optional: </strong><span>Select the <strong>Interfaces</strong> you want the
+bean to implement. Click <span class="uicontrol">Add</span> to select interfaces that
+you want to implement and click <span class="uicontrol">Remove</span> to take away
+interfaces that you no longer want to implement.</span></li>
+
+<li class="stepexpand"><span>Select the method stubs that you want the wizard to create.</span>
+</li>
+
+<li class="stepexpand"><span>Click <span class="uicontrol">Finish</span> to add the new bean to the
+specified EJB project.</span></li>
+
+</ol>
+
+</div>
+
+<div>
+<div class="familylinks">
+<div class="parentlink"><strong>Parent topic:</strong> <a href="../topics/tecrte.html" title="You can use a wizard to create session beans and message-driven beans that support XDoclet annotation.">Creating enterprise beans with XDoclet annotation support</a></div>
+</div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/org.eclipse.jst.ejb.doc.user/topics/txdocletconf.dita b/docs/org.eclipse.jst.ejb.doc.user/topics/txdocletconf.dita
new file mode 100644
index 0000000..d0720c8
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/topics/txdocletconf.dita
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>

+<!--Arbortext, Inc., 1988-2006, v.4002-->

+<!DOCTYPE task PUBLIC "-//OASIS//DTD DITA Task//EN"

+ "task.dtd">

+<task id="configuringxdocletannotationsupport" xml:lang="en-us">

+<title>Configuring XDoclet annotation support</title>

+<shortdesc>To use XDoclet annotation support, or to create enterprise beans,

+XDoclet must be installed on your system and configured to work with the workbench. </shortdesc>

+<prolog><metadata>

+<keywords><indexterm>Java annotation<indexterm>XDoclet annotation support</indexterm></indexterm>

+<indexterm>XDoclet annotation support<indexterm>configuring</indexterm></indexterm>

+</keywords>

+</metadata></prolog>

+<taskbody>

+<prereq>More information on XDoclet can be found at <xref href="http://xdoclet.sourceforge.net/xdoclet/index.html"

+scope="external"><desc>The XDoclet Web site</desc></xref>.</prereq>

+<context><p>To configure XDoclet to work with the workbench, complete the

+following steps:</p></context>

+<steps>

+<step><cmd>Download and unzip xdoclet-bin-1.2.3.zip by navigating to <xref

+href="http://xdoclet.sourceforge.net/xdoclet/install.html" scope="external"><desc></desc></xref> and

+following the download link.</cmd></step>

+<step><cmd>Click <menucascade><uicontrol>Window</uicontrol><uicontrol>Preferences</uicontrol>

+</menucascade>. </cmd></step>

+<step><cmd>In the Preferences window, click <uicontrol>XDoclet</uicontrol> in

+the left pane.</cmd></step>

+<step><cmd>Check the <uicontrol>Enable XDoclet Builder</uicontrol> check box

+to turn on annotation-based artifact creation. </cmd></step>

+<step><cmd>Use the <uicontrol>Browse</uicontrol> button to locate the folder

+where you unzipped the XDoclet download (<uicontrol>XDoclet Home</uicontrol>). </cmd>

+</step>

+<step><cmd>Select the <uicontrol>Version</uicontrol> of XDoclet that you have

+installed. In this case, select 1.2.3.</cmd><info>If you downloaded an earlier

+version, XDoclet versions 1.2.1 and 1.2.2 are also supported.<?Pub Caret?></info>

+</step>

+<step><cmd>Click <uicontrol>OK</uicontrol> to save the preferences.</cmd>

+</step>

+</steps>

+</taskbody>

+</task>

+<?Pub *0000002115?>

diff --git a/docs/org.eclipse.jst.ejb.doc.user/topics/txdocletconf.html b/docs/org.eclipse.jst.ejb.doc.user/topics/txdocletconf.html
new file mode 100644
index 0000000..eeea0c8
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.doc.user/topics/txdocletconf.html
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html lang="en-us" xml:lang="en-us">
+<head>
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+<meta name="copyright" content="Copyright (c) 2000, 2011 IBM 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: IBM Corporation - initial API and implementation" />
+<meta name="DC.rights.owner" content="(C) Copyright 2000, 2011" />
+<meta content="public" name="security" />
+<meta content="index,follow" name="Robots" />
+<meta http-equiv="PICS-Label" content='(PICS-1.1 "http://www.icra.org/ratingsv02.html" l gen true r (cz 1 lz 1 nz 1 oz 1 vz 1) "http://www.rsac.org/ratingsv01.html" l gen true r (n 0 s 0 v 0 l 0) "http://www.classify.org/safesurf/" l gen true r (SS~~000 1))' />
+<meta content="task" name="DC.Type" />
+<meta name="DC.Title" content="Configuring XDoclet annotation support" />
+<meta name="abstract" content="To use XDoclet annotation support, or to create enterprise beans, XDoclet must be installed on your system and configured to work with the workbench." />
+<meta name="description" content="To use XDoclet annotation support, or to create enterprise beans, XDoclet must be installed on your system and configured to work with the workbench." />
+<meta content="Java annotation, XDoclet annotation support, configuring" name="DC.subject" />
+<meta content="Java annotation, XDoclet annotation support, configuring" name="keywords" />
+<meta scheme="URI" name="DC.Relation" content="../topics/tecrte.html" />
+<meta content="XHTML" name="DC.Format" />
+<meta content="configuringxdocletannotationsupport" name="DC.Identifier" />
+<meta content="en-us" name="DC.Language" />
+<link href="../../org.eclipse.wst.doc.user/common.css" type="text/css" rel="stylesheet" />
+<title>Configuring XDoclet annotation support</title>
+</head>
+<body id="configuringxdocletannotationsupport"><a name="configuringxdocletannotationsupport"><!-- --></a>
+
+
+<h1 class="topictitle1">Configuring XDoclet annotation support</h1>
+
+
+
+<div><p>To use XDoclet annotation support, or to create enterprise beans,
+XDoclet must be installed on your system and configured to work with the workbench. </p>
+
+<div class="p">More information on XDoclet can be found at <a href="http://xdoclet.sourceforge.net/xdoclet/index.html" target="_blank" title="The XDoclet Web site">http://xdoclet.sourceforge.net/xdoclet/index.html</a>.</div>
+
+<div class="section"><p>To configure XDoclet to work with the workbench, complete the
+following steps:</p>
+</div>
+
+<ol>
+<li class="stepexpand"><span>Download and unzip xdoclet-bin-1.2.3.zip by navigating to <a href="http://xdoclet.sourceforge.net/xdoclet/install.html" target="_blank" title="">http://xdoclet.sourceforge.net/xdoclet/install.html</a> and
+following the download link.</span></li>
+
+<li class="stepexpand"><span>Click <span class="menucascade"><span class="uicontrol">Window</span> &gt; <span class="uicontrol">Preferences</span>
+</span>. </span></li>
+
+<li class="stepexpand"><span>In the Preferences window, click <span class="uicontrol">XDoclet</span> in
+the left pane.</span></li>
+
+<li class="stepexpand"><span>Check the <span class="uicontrol">Enable XDoclet Builder</span> check box
+to turn on annotation-based artifact creation. </span></li>
+
+<li class="stepexpand"><span>Use the <span class="uicontrol">Browse</span> button to locate the folder
+where you unzipped the XDoclet download (<span class="uicontrol">XDoclet Home</span>). </span>
+</li>
+
+<li class="stepexpand"><span>Select the <span class="uicontrol">Version</span> of XDoclet that you have
+installed. In this case, select 1.2.3.</span> If you downloaded an earlier
+version, XDoclet versions 1.2.1 and 1.2.2 are also supported.
+</li>
+
+<li class="stepexpand"><span>Click <span class="uicontrol">OK</span> to save the preferences.</span>
+</li>
+
+</ol>
+
+</div>
+
+<div>
+<div class="familylinks">
+<div class="parentlink"><strong>Parent topic:</strong> <a href="../topics/tecrte.html" title="You can use a wizard to create session beans and message-driven beans that support XDoclet annotation.">Creating enterprise beans with XDoclet annotation support</a></div>
+</div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/org.eclipse.jst.ejb.ui.infopop/.project b/docs/org.eclipse.jst.ejb.ui.infopop/.project
new file mode 100644
index 0000000..4fb0e17
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.ui.infopop/.project
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.jst.ejb.ui.infopop</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+	</buildSpec>
+	<natures>
+	</natures>
+</projectDescription>
diff --git a/docs/org.eclipse.jst.ejb.ui.infopop/META-INF/MANIFEST.MF b/docs/org.eclipse.jst.ejb.ui.infopop/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..573ad1e
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.ui.infopop/META-INF/MANIFEST.MF
@@ -0,0 +1,8 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.jst.ejb.ui.infopop;singleton:=true
+Bundle-Version: 1.0.300.qualifier
+Bundle-Vendor: %pluginProvider
+Bundle-Localization: plugin
+Eclipse-AutoStart: true
diff --git a/docs/org.eclipse.jst.ejb.ui.infopop/MessageDrivenBeanWizContext.xml b/docs/org.eclipse.jst.ejb.ui.infopop/MessageDrivenBeanWizContext.xml
new file mode 100644
index 0000000..c55666d
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.ui.infopop/MessageDrivenBeanWizContext.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS type="org.eclipse.help.contexts"?>
+
+
+<contexts>
+<context id="messbw1100">
+<description>
+Specify the <b>Project</b> and <b>Folder</b> where the message–driven bean will be placed. The message–driven bean should be stored in the Java source directory, which you specified when you created the EJB Project (for example ejbModule).
+
+Specify the <b>Java package</b> that the class will belong to. <b>Note:</b> The bean class cannot be added into a default package.
+
+Specify the <b>Class name</b> of the message-driven bean (for example MyMessageBean).
+
+In the field <b>Superclass</b> specify the superclass for the message-driven bean, only if it is derived from one. Click <b>Browse</b> to choose from the available, already existing or created, superclasses. This field is optional.
+
+In the field <b>Destination name</b> specify the global JNDI name of the Queue/Topic JMS Resource.
+
+Check <b>JMS</b> to specify that message-driven bean is of JMS message type. This means that the message listener interface is the javax.jms.MessageListener interface. If <b>JMS</b> is checked you can specify the <b>Destination type</b> of the message-driven bean:
+ <b>- Queue</b> is used as a destination for point–to–point messaging. 
+ <b>- Topic</b> is used as a destination for publish/subscribe messaging. 
+</description>
+<topic label="Creating Messsage-driven Beans" href="../org.eclipse.jst.ejb.doc.user/topics/messbwiz.html"/>
+<topic label="EJB 2.x architecture" href="../org.eclipse.jst.ejb.doc.user/topics/cearch.html"/>
+<topic label="EJB 2.x development resource" href="../org.eclipse.jst.ejb.doc.user/topics/ceresrc.html"/>
+</context>
+
+<context id="messbw1200">
+<description>
+Note that the <b>Class name</b> value provided in the first page of the wizard is automatically mapped to the <b>Bean name</b> field on this page.
+
+In the field <b>Transaction type</b> specify whether the transaction is handled by the <b>Container</b> or the <b>Bean</b>.
+
+You can <b>Add</b> and <b>Remove</b> <b>Interfaces</b> that this message-driven bean implements. 
+Clicking on the <b>Message listener interface</b> allows you to set or change the message listener interface of the bean. This field is automatically set to the first interfaces added to <b>Interfaces</b>. It is mandatory that this field point to a valid Java interface. Otherwise the wizard cannot be finished. 
+Note that, if you have specified on the first wizard page that the bean is of JMS message type, then the javax.jms.MessageListener interface is automatically set as <b>Message listener interface</b> and added to the <b>Interfaces</b>.
+If the <b>Inherited abstract methods</b> option is checked, it means that you want to override the methods provided by the interface, which is defined in the <b>Interfaces</b> field.
+
+Using the option <b>Constructors from superclass</b> you can choose whether to override the constructor of the class, which you specified as superclass in the first page of the wizard.
+</description>
+<topic label="Creating Messsage-driven Beans" href="../org.eclipse.jst.ejb.doc.user/topics/messbwiz.html"/>
+<topic label="EJB 2.x architecture" href="../org.eclipse.jst.ejb.doc.user/topics/cearch.html"/>
+<topic label="EJB 2.x development resource" href="../org.eclipse.jst.ejb.doc.user/topics/ceresrc.html"/>
+</context>
+
+</contexts>
diff --git a/docs/org.eclipse.jst.ejb.ui.infopop/SessionBeanWizContext.xml b/docs/org.eclipse.jst.ejb.ui.infopop/SessionBeanWizContext.xml
new file mode 100644
index 0000000..ddd9a99
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.ui.infopop/SessionBeanWizContext.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS type="org.eclipse.help.contexts"?>
+
+<contexts>
+<context id="sessbw1100">
+<description>
+Specify the <b>Project</b> and <b>Folder</b> where the session bean will be placed. The session bean should be stored in the Java source directory, which you specified when you created the EJB Project (for example ejbModule).
+
+Specify the <b>Java package</b> that the class will belong to. <b>Note:</b> The bean class cannot be added into a default package.
+
+Specify the <b>Class name</b> of the session bean (for example MySessionBean).
+
+In the field <b>Superclass</b> specify the superclass for the session bean, only if it is derived from one. Click <b>Browse</b> to choose from the available, already existing or created, superclasses. (This field is optional).
+
+In the field <b>State type</b> choose the type of the session bean that you create: 
+ <b>- Stateless</b> – the session bean instances contain no conversational state between methods; any instance can be used for any client. 
+ <b>- Stateful</b> – the session bean instances contain conversational state which must be retained across methods and transactions. 
+ <b>- Singleton</b> – a single session bean instance is shared between clients and supports concurrent access. 
+
+In the section <b>Create business interface</b>, check the business interface that you want to create:
+  <b>- Remote</b> – the client can run on a different machine or different Java virtual machine than the enterprise bean it accesses and the location of the bean is transparent.
+  <b>- Local</b> – the client must run on the same Java virtual machine as the bean it accesses and the location of the enterprise bean is not transparent.
+  <b>- No-interface</b> – this is a variation of the Local view that exposes the public methods of the bean class without the use of a separate business interface.
+   
+<b>Note:</b> It is valid to check all of the above options. 
+</description>
+<topic label="Creating Session Beans" href="../org.eclipse.jst.ejb.doc.user/topics/sessbwiz.html"/>
+<topic label="EJB 2.x architecture" href="../org.eclipse.jst.ejb.doc.user/topics/cearch.html"/>
+<topic label="EJB 2.x development resource" href="../org.eclipse.jst.ejb.doc.user/topics/ceresrc.html"/>
+</context>
+
+<context id="sessbw1200">
+<description>
+Note that the <b>Class name</b> value provided in the first page of the wizard is automatically mapped to the <b>Bean name</b> field on this page.
+
+In the field <b>Transaction type</b> specify whether the transaction is handled by the <b>Container</b> or the <b>Bean</b>.
+
+In the field <b>Mapped name</b> specify the bean’s global JNDI name. 
+
+Note that the business interface, provided in the previous page of the wizard, is automatically mapped to the <b>Business interfaces</b> field on this page. You can click the <b>Add</b> button to add additional interfaces to implement.
+
+Note: If you create EJB 2.x beans, click on <b>Home and Component interfaces(EJB 2.x)</b> to add the home and the component interfaces. The <b>home interface</b> allows a client to create, remove and find existing instances of enterprise beans. The <b>component interface</b> allows a client to access the business methods of the enterprise bean. Check:
+  <b>- Local</b> to add the local home and component interfaces. 
+  <b>- Remote</b> to add the remote home and component interfaces.
+  
+If the <b>Inherited abstract methods</b> option is checked, it means that you want to override the methods provided by the interface, which is defined in the <b>Business interfaces</b> field.
+
+Using the option <b>Constructors from superclass</b> you can choose whether to override the constructor of the class, which you specified as superclass in the first page of the wizard.
+</description>
+<topic label="Creating Session Beans" href="../org.eclipse.jst.ejb.doc.user/topics/sessbwiz.html"/>
+<topic label="EJB 2.x architecture" href="../org.eclipse.jst.ejb.doc.user/topics/cearch.html"/>
+<topic label="EJB 2.x development resource" href="../org.eclipse.jst.ejb.doc.user/topics/ceresrc.html"/>
+</context>
+
+</contexts>
diff --git a/docs/org.eclipse.wst.web.ui.infopop/about.html b/docs/org.eclipse.jst.ejb.ui.infopop/about.html
similarity index 100%
rename from docs/org.eclipse.wst.web.ui.infopop/about.html
rename to docs/org.eclipse.jst.ejb.ui.infopop/about.html
diff --git a/docs/org.eclipse.jst.ejb.ui.infopop/build.properties b/docs/org.eclipse.jst.ejb.ui.infopop/build.properties
new file mode 100644
index 0000000..ac09c39
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.ui.infopop/build.properties
@@ -0,0 +1,9 @@
+bin.includes = SessionBeanWizContext.xml,\
+               MessageDrivenBeanWizContext.xml,\
+               about.html,\
+               plugin.xml,\
+               plugin.properties,\
+               META-INF/
+          
+src.includes = build.properties
+generateSourceBundle=false
\ No newline at end of file
diff --git a/docs/org.eclipse.jst.ejb.ui.infopop/plugin.properties b/docs/org.eclipse.jst.ejb.ui.infopop/plugin.properties
new file mode 100644
index 0000000..0abd6eb
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.ui.infopop/plugin.properties
@@ -0,0 +1,13 @@
+###############################################################################
+# Copyright (c) 2001, 2006 IBM 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:
+#     IBM Corporation - initial API and implementation
+###############################################################################
+
+pluginName     = EJB infopop
+pluginProvider = Eclipse.org
\ No newline at end of file
diff --git a/docs/org.eclipse.jst.ejb.ui.infopop/plugin.xml b/docs/org.eclipse.jst.ejb.ui.infopop/plugin.xml
new file mode 100644
index 0000000..f7d8022
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.ui.infopop/plugin.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!-- ================================================= -->
+<!-- This is the plugin for declaring the help         -->
+<!-- contributions for using the tool.                 -->
+<!-- ================================================= -->
+<!-- /*******************************************************************************
+ * Copyright (c) 2000, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/ -->
+<plugin>
+
+<extension point="org.eclipse.help.contexts">
+      <contexts file="SessionBeanWizContext.xml" plugin ="org.eclipse.jst.ejb.ui"/>
+   <contexts file="MessageDrivenBeanWizContext.xml" plugin ="org.eclipse.jst.ejb.ui"/>
+
+</extension>
+
+
+</plugin>
diff --git a/docs/org.eclipse.jst.ejb.ui.infopop/pom.xml b/docs/org.eclipse.jst.ejb.ui.infopop/pom.xml
new file mode 100644
index 0000000..e638b9f
--- /dev/null
+++ b/docs/org.eclipse.jst.ejb.ui.infopop/pom.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Copyright (c) 2012, 2013 Eclipse Foundation and others.
+  All rights reserved. This program and the accompanying materials
+  are made available under the terms of the Eclipse Distribution License v1.0
+  which accompanies this distribution, and is available at
+  http://www.eclipse.org/org/documents/edl-v10.php
+ 
+  Contributors:
+    Thanh Ha (Eclipse Foundation) - initial implementation
+-->
+
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.eclipse.webtools.javaee</groupId>
+    <artifactId>javaee.docs</artifactId>
+    <version>3.6.0-SNAPSHOT</version>
+  </parent>
+
+  <groupId>org.eclipse.webtools.ejb</groupId>
+  <artifactId>org.eclipse.jst.ejb.ui.infopop</artifactId>
+  <version>1.0.300-SNAPSHOT</version>
+  <packaging>eclipse-plugin</packaging>
+</project>
diff --git a/docs/org.eclipse.jst.j2ee.doc.user/pom.xml b/docs/org.eclipse.jst.j2ee.doc.user/pom.xml
index 09c4ff0..93d7c94 100644
--- a/docs/org.eclipse.jst.j2ee.doc.user/pom.xml
+++ b/docs/org.eclipse.jst.j2ee.doc.user/pom.xml
@@ -15,9 +15,8 @@
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
+    <artifactId>javaee.docs</artifactId>
     <version>3.6.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
   </parent>
 
   <groupId>org.eclipse.webtools.javaee</groupId>
diff --git a/docs/org.eclipse.jst.j2ee.infopop/pom.xml b/docs/org.eclipse.jst.j2ee.infopop/pom.xml
index 9c06493..5900a52 100644
--- a/docs/org.eclipse.jst.j2ee.infopop/pom.xml
+++ b/docs/org.eclipse.jst.j2ee.infopop/pom.xml
@@ -15,9 +15,8 @@
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
+    <artifactId>javaee.docs</artifactId>
     <version>3.6.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
   </parent>
 
   <groupId>org.eclipse.webtools.javaee</groupId>
diff --git a/docs/org.eclipse.jst.servlet.ui.infopop/pom.xml b/docs/org.eclipse.jst.servlet.ui.infopop/pom.xml
index 90b53d3..93939b2 100644
--- a/docs/org.eclipse.jst.servlet.ui.infopop/pom.xml
+++ b/docs/org.eclipse.jst.servlet.ui.infopop/pom.xml
@@ -15,9 +15,8 @@
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
+    <artifactId>javaee.docs</artifactId>
     <version>3.6.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
   </parent>
 
   <groupId>org.eclipse.webtools.javaee</groupId>
diff --git a/docs/org.eclipse.wst.web.ui.infopop/.project b/docs/org.eclipse.wst.web.ui.infopop/.project
deleted file mode 100644
index 10c4a6e..0000000
--- a/docs/org.eclipse.wst.web.ui.infopop/.project
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.wst.web.ui.infopop</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-	</buildSpec>
-	<natures>
-	</natures>
-</projectDescription>
diff --git a/docs/org.eclipse.wst.web.ui.infopop/META-INF/MANIFEST.MF b/docs/org.eclipse.wst.web.ui.infopop/META-INF/MANIFEST.MF
deleted file mode 100644
index 8a60c52..0000000
--- a/docs/org.eclipse.wst.web.ui.infopop/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,8 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: Static Web infopop
-Bundle-SymbolicName: org.eclipse.wst.web.ui.infopop; singleton:=true
-Bundle-Version: 1.0.300.qualifier
-Bundle-Vendor: %pluginProvider
-Bundle-Localization: plugin
-Eclipse-AutoStart: true
diff --git a/docs/org.eclipse.wst.web.ui.infopop/StaticWebWizContexts.xml b/docs/org.eclipse.wst.web.ui.infopop/StaticWebWizContexts.xml
deleted file mode 100644
index bf0f403..0000000
--- a/docs/org.eclipse.wst.web.ui.infopop/StaticWebWizContexts.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?NLS type="org.eclipse.help.contexts"?>
-<!-- /*******************************************************************************
- * Copyright (c) 2000, 2006 IBM 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:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/ -->
-<contexts>
-<context id="webw2000">
-<description> Use this page to name your Web project and specify the file system location (the place where the resources you create are stored.) When the Use default check box is selected, the project will be created in the file system location where your workspace resides. To change the default file system location, clear the checkbox and locate the path using the <b>Browse</b> button. To configure additional options, select the <b>Next</b> button.
-In the Target Runtime field, select the server where you want to publish the Web project. if a server is not already defined, click <b>New</b> to select a server runtime environment. </description>
-<topic label="Creating a static Web project" href="../org.eclipse.wst.webtools.doc.user/topics/twcresta.html"/>
-</context>
-
-<context id="webw2100">
-<description>Presets are used to define a default set of facet versions that will configure a project for a particular type of development. The Static Web Module facet enables the project to be deployed as a static
-Web module. Click Show Runtimes to view the available runtimes and runtime compositions.</description>
-<topic label="Creating a static Web project" href="../org.eclipse.wst.webtools.doc.user/topics/twcresta.html"/>
-</context>
-
-<context id="webw2200">
-<description>The Web content folder is where the elements of your Web site such as Web pages, graphics and style sheets are stored. This directory structure is necessary to ensure that the content of your Web site will be included in the WAR file at deployment and that link validation will work correctly.
-</description>
-<topic label="Creating a static Web project" href="../org.eclipse.wst.webtools.doc.user/topics/twcresta.html"/>
-</context>
-
-
-</contexts>
diff --git a/docs/org.eclipse.wst.web.ui.infopop/build.properties b/docs/org.eclipse.wst.web.ui.infopop/build.properties
deleted file mode 100644
index 0c7c1a9..0000000
--- a/docs/org.eclipse.wst.web.ui.infopop/build.properties
+++ /dev/null
@@ -1,7 +0,0 @@
-bin.includes = StaticWebWizContexts.xml,\
-               about.html,\
-               plugin.xml,\
-               plugin.properties,\
-               META-INF/
-src.includes = build.properties
-generateSourceBundle=false
\ No newline at end of file
diff --git a/docs/org.eclipse.wst.web.ui.infopop/plugin.properties b/docs/org.eclipse.wst.web.ui.infopop/plugin.properties
deleted file mode 100644
index b61d2de..0000000
--- a/docs/org.eclipse.wst.web.ui.infopop/plugin.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-###############################################################################
-# Copyright (c) 2006 IBM 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:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-
-pluginName     = Static Web infopop
-pluginProvider = Eclipse.org
\ No newline at end of file
diff --git a/docs/org.eclipse.wst.web.ui.infopop/plugin.xml b/docs/org.eclipse.wst.web.ui.infopop/plugin.xml
deleted file mode 100644
index 20ac018..0000000
--- a/docs/org.eclipse.wst.web.ui.infopop/plugin.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-
-<!-- ================================================= -->
-<!-- This is the plugin for declaring the help         -->
-<!-- contributions for using the tool.                 -->
-<!-- ================================================= -->
-<!-- /*******************************************************************************
- * Copyright (c) 2000, 2006 IBM 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:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/ -->
-<plugin>
-
-<extension point="org.eclipse.help.contexts">
-      <contexts file="StaticWebWizContexts.xml" plugin ="org.eclipse.wst.web.ui"/>
-</extension>
-
-
-</plugin>
\ No newline at end of file
diff --git a/docs/org.eclipse.wst.web.ui.infopop/pom.xml b/docs/org.eclipse.wst.web.ui.infopop/pom.xml
deleted file mode 100644
index 691597d..0000000
--- a/docs/org.eclipse.wst.web.ui.infopop/pom.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Copyright (c) 2012, 2013 Eclipse Foundation and others.
-  All rights reserved. This program and the accompanying materials
-  are made available under the terms of the Eclipse Distribution License v1.0
-  which accompanies this distribution, and is available at
-  http://www.eclipse.org/org/documents/edl-v10.php
- 
-  Contributors:
-    Thanh Ha (Eclipse Foundation) - initial implementation
--->
-
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
-    <version>3.6.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
-  </parent>
-
-  <groupId>org.eclipse.webtools.javaee</groupId>
-  <artifactId>org.eclipse.wst.web.ui.infopop</artifactId>
-  <version>1.0.300-SNAPSHOT</version>
-  <packaging>eclipse-plugin</packaging>
-</project>
diff --git a/docs/pom.xml b/docs/pom.xml
new file mode 100644
index 0000000..24e7016
--- /dev/null
+++ b/docs/pom.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Copyright (c) 2017 Eclipse Foundation and others.
+  All rights reserved. This program and the accompanying materials
+  are made available under the terms of the Eclipse Distribution License v1.0
+  which accompanies this distribution, and is available at
+  http://www.eclipse.org/org/documents/edl-v10.php
+ 
+  Contributors:
+    Nick Boldt (Red Hat) - initial implementation
+    Rob Stryker (Red Hat) - initial implementation
+-->
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.eclipse.webtools.javaee</groupId>
+    <artifactId>org.eclipse.webtools.javaee</artifactId>
+    <version>3.6.0-SNAPSHOT</version>
+  </parent>
+
+  <groupId>org.eclipse.webtools.javaee</groupId>
+  <artifactId>javaee.docs</artifactId>
+  <version>3.6.0-SNAPSHOT</version>
+  <packaging>pom</packaging>
+
+  <modules>
+    <module>org.eclipse.jst.ejb.doc.user</module>
+    <module>org.eclipse.jst.ejb.ui.infopop</module>
+    <module>org.eclipse.jst.j2ee.doc.user</module>
+    <module>org.eclipse.jst.j2ee.infopop</module>
+    <module>org.eclipse.jst.servlet.ui.infopop</module>
+  </modules>
+</project>
diff --git a/features/org.eclipse.jem-feature/.project b/features/org.eclipse.jem-feature/.project
deleted file mode 100644
index 866466f..0000000
--- a/features/org.eclipse.jem-feature/.project
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jem-feature</name>
-	<comment></comment>
-	<projects>
-	</projects>
-</projectDescription>
diff --git a/features/org.eclipse.jem-feature/archived.txt b/features/org.eclipse.jem-feature/archived.txt
deleted file mode 100644
index ae7c321..0000000
--- a/features/org.eclipse.jem-feature/archived.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This feature is no longer used, 
-so I have "nulled out" the head stream 
-to avoid confusion. 
-
diff --git a/features/org.eclipse.jst.doc.user.feature/README.deprecated.txt b/features/org.eclipse.jst.doc.user.feature/README.deprecated.txt
new file mode 100644
index 0000000..7b1a312
--- /dev/null
+++ b/features/org.eclipse.jst.doc.user.feature/README.deprecated.txt
@@ -0,0 +1 @@
+This feature has moved to http://git.eclipse.org/c/webservices/webtools.webservices.git/tree/features/javaee-web/ and is therefore deprecated in this repo.
diff --git a/features/org.eclipse.jst.doc.user.feature/pom.xml b/features/org.eclipse.jst.doc.user.feature/pom.xml
index b267516..158ea68 100644
--- a/features/org.eclipse.jst.doc.user.feature/pom.xml
+++ b/features/org.eclipse.jst.doc.user.feature/pom.xml
@@ -15,9 +15,8 @@
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
+    <artifactId>javaee.features</artifactId>
     <version>3.6.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
   </parent>
 
   <groupId>org.eclipse.webtools.javaee</groupId>
diff --git a/features/org.eclipse.jst.enterprise_core.feature.patch/pom.xml b/features/org.eclipse.jst.enterprise_core.feature.patch/pom.xml
index 60ff0e2..a9a7890 100644
--- a/features/org.eclipse.jst.enterprise_core.feature.patch/pom.xml
+++ b/features/org.eclipse.jst.enterprise_core.feature.patch/pom.xml
@@ -15,9 +15,8 @@
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
+    <artifactId>javaee.features</artifactId>
     <version>3.6.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
   </parent>
 
   <groupId>org.eclipse.webtools.javaee</groupId>
diff --git a/features/org.eclipse.jst.enterprise_core.feature/README.deprecated.txt b/features/org.eclipse.jst.enterprise_core.feature/README.deprecated.txt
new file mode 100644
index 0000000..7b1a312
--- /dev/null
+++ b/features/org.eclipse.jst.enterprise_core.feature/README.deprecated.txt
@@ -0,0 +1 @@
+This feature has moved to http://git.eclipse.org/c/webservices/webtools.webservices.git/tree/features/javaee-web/ and is therefore deprecated in this repo.
diff --git a/features/org.eclipse.jst.enterprise_core.feature/pom.xml b/features/org.eclipse.jst.enterprise_core.feature/pom.xml
index 8fa19c0..c864570 100644
--- a/features/org.eclipse.jst.enterprise_core.feature/pom.xml
+++ b/features/org.eclipse.jst.enterprise_core.feature/pom.xml
@@ -15,9 +15,8 @@
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
+    <artifactId>javaee.features</artifactId>
     <version>3.6.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
   </parent>
 
   <groupId>org.eclipse.webtools.javaee</groupId>
diff --git a/features/org.eclipse.jst.enterprise_sdk.feature/README.deprecated.txt b/features/org.eclipse.jst.enterprise_sdk.feature/README.deprecated.txt
new file mode 100644
index 0000000..7b1a312
--- /dev/null
+++ b/features/org.eclipse.jst.enterprise_sdk.feature/README.deprecated.txt
@@ -0,0 +1 @@
+This feature has moved to http://git.eclipse.org/c/webservices/webtools.webservices.git/tree/features/javaee-web/ and is therefore deprecated in this repo.
diff --git a/features/org.eclipse.jst.enterprise_sdk.feature/pom.xml b/features/org.eclipse.jst.enterprise_sdk.feature/pom.xml
index 297dbfa..76572ec 100644
--- a/features/org.eclipse.jst.enterprise_sdk.feature/pom.xml
+++ b/features/org.eclipse.jst.enterprise_sdk.feature/pom.xml
@@ -15,9 +15,8 @@
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
+    <artifactId>javaee.features</artifactId>
     <version>3.6.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
   </parent>
 
   <groupId>org.eclipse.webtools.javaee</groupId>
diff --git a/docs/org.eclipse.wst.web.ui.infopop/.cvsignore b/features/org.eclipse.jst.enterprise_tests.feature/.cvsignore
similarity index 100%
rename from docs/org.eclipse.wst.web.ui.infopop/.cvsignore
rename to features/org.eclipse.jst.enterprise_tests.feature/.cvsignore
diff --git a/features/org.eclipse.jst.enterprise_tests.feature/.project b/features/org.eclipse.jst.enterprise_tests.feature/.project
new file mode 100644
index 0000000..79b4618
--- /dev/null
+++ b/features/org.eclipse.jst.enterprise_tests.feature/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.jst.enterprise_tests.feature</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.pde.FeatureBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.FeatureNature</nature>
+	</natures>
+</projectDescription>
diff --git a/features/org.eclipse.jst.enterprise_tests.feature/README.deprecated.txt b/features/org.eclipse.jst.enterprise_tests.feature/README.deprecated.txt
new file mode 100644
index 0000000..7b1a312
--- /dev/null
+++ b/features/org.eclipse.jst.enterprise_tests.feature/README.deprecated.txt
@@ -0,0 +1 @@
+This feature has moved to http://git.eclipse.org/c/webservices/webtools.webservices.git/tree/features/javaee-web/ and is therefore deprecated in this repo.
diff --git a/features/org.eclipse.jst.enterprise_tests.feature/build.properties b/features/org.eclipse.jst.enterprise_tests.feature/build.properties
new file mode 100644
index 0000000..7c626e2
--- /dev/null
+++ b/features/org.eclipse.jst.enterprise_tests.feature/build.properties
@@ -0,0 +1,3 @@
+bin.includes = feature.xml,\
+               eclipse_update_120.jpg,\
+               feature.properties
diff --git a/features/org.eclipse.jst.enterprise_tests.feature/eclipse_update_120.jpg b/features/org.eclipse.jst.enterprise_tests.feature/eclipse_update_120.jpg
new file mode 100644
index 0000000..bfdf708
--- /dev/null
+++ b/features/org.eclipse.jst.enterprise_tests.feature/eclipse_update_120.jpg
Binary files differ
diff --git a/features/org.eclipse.jst.enterprise_tests.feature/feature.properties b/features/org.eclipse.jst.enterprise_tests.feature/feature.properties
new file mode 100644
index 0000000..7ade69a
--- /dev/null
+++ b/features/org.eclipse.jst.enterprise_tests.feature/feature.properties
@@ -0,0 +1,48 @@
+###############################################################################
+# Copyright (c) 2006 IBM 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:
+#     IBM Corporation - initial API and implementation
+###############################################################################
+# feature.properties
+# contains externalized strings for feature.xml
+# "%foo" in feature.xml corresponds to the key "foo" in this file
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# This file should be translated.
+
+# "featureName" property - name of the feature
+featureName=JST Enterprise Tests
+
+# "providerName" property - name of the company that provides the feature
+providerName=Eclipse Web Tools Platform
+
+
+# "description" property - description of the feature
+description=JST enterprise tests
+
+# "copyright" property - text of the "Feature Update Copyright"
+copyright=\
+Copyright (c) 2006 IBM Corporation and others.\n\
+All rights reserved. This program and the accompanying materials\n\
+are made available under the terms of the Eclipse Public License v1.0\n\
+which accompanies this distribution, and is available at\n\
+http://www.eclipse.org/legal/epl-v10.html\n\
+\n\
+Contributors:\n\
+    IBM Corporation - initial API and implementation\n
+################ end of copyright property ####################################
+
+# "licenseURL" property - URL of the "Feature License"
+# do not translate value - just change to point to a locale-specific HTML page
+# license and licenseURL properties were removed as a result to migrating to new PDE license support. 
+#    Those properties are now added at build time. See http://wiki.eclipse.org/Equinox/p2/License_Mechanism. 
+
+# "license" property - text of the "Feature Update License"
+# should be plain text version of license agreement pointed to be "licenseURL"
+# license and licenseURL properties were removed as a result to migrating to new PDE license support. 
+#    Those properties are now added at build time. See http://wiki.eclipse.org/Equinox/p2/License_Mechanism. 
+########### end of license property ##########################################
diff --git a/features/org.eclipse.jst.enterprise_tests.feature/feature.xml b/features/org.eclipse.jst.enterprise_tests.feature/feature.xml
new file mode 100644
index 0000000..5316d82
--- /dev/null
+++ b/features/org.eclipse.jst.enterprise_tests.feature/feature.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<feature

+      id="org.eclipse.jst.enterprise_tests.feature"

+      label="%featureName"

+      version="3.6.0.qualifier"

+      provider-name="%providerName"

+      license-feature="org.eclipse.license"

+      license-feature-version="1.0.1.qualifier">

+

+   <description>

+      %description

+   </description>

+

+   <copyright>

+      %copyright

+   </copyright>

+

+   <license url="license.html">

+      %license

+   </license>

+

+   <plugin

+         id="org.eclipse.jst.validation.sample"

+         download-size="0"

+         install-size="0"

+         version="0.0.0"/>

+

+   <plugin

+         id="org.eclipse.jst.validation.test"

+         download-size="0"

+         install-size="0"

+         version="0.0.0"/>

+

+   <plugin

+         id="org.eclipse.jst.ws.tests"

+         download-size="0"

+         install-size="0"

+         version="0.0.0"/>

+

+   <plugin

+         id="org.eclipse.jst.ws.tests.performance"

+         download-size="0"

+         install-size="0"

+         version="0.0.0"/>

+

+   <plugin

+         id="org.eclipse.jst.ws.axis.consumption.core.tests"

+         download-size="0"

+         install-size="0"

+         version="0.0.0"

+         unpack="false"/>

+

+   <plugin

+         id="org.eclipse.jst.ejb.ui.tests"

+         download-size="0"

+         install-size="0"

+         version="0.0.0"

+         unpack="false"/>

+

+</feature>

diff --git a/features/org.eclipse.jst.enterprise_tests.feature/pom.xml b/features/org.eclipse.jst.enterprise_tests.feature/pom.xml
new file mode 100644
index 0000000..0c3dbe3
--- /dev/null
+++ b/features/org.eclipse.jst.enterprise_tests.feature/pom.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Copyright (c) 2012, 2013 Eclipse Foundation and others.
+  All rights reserved. This program and the accompanying materials
+  are made available under the terms of the Eclipse Distribution License v1.0
+  which accompanies this distribution, and is available at
+  http://www.eclipse.org/org/documents/edl-v10.php
+ 
+  Contributors:
+    Thanh Ha (Eclipse Foundation) - initial implementation
+-->
+
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.eclipse.webtools.javaee</groupId>
+    <artifactId>javaee.features</artifactId>
+    <version>3.6.0-SNAPSHOT</version>
+  </parent>
+
+  <groupId>org.eclipse.webtools.javaee</groupId>
+  <artifactId>org.eclipse.jst.enterprise_tests.feature</artifactId>
+  <version>3.6.0-SNAPSHOT</version>
+  <packaging>eclipse-feature</packaging>
+</project>
diff --git a/features/org.eclipse.jst.enterprise_ui.feature.patch/pom.xml b/features/org.eclipse.jst.enterprise_ui.feature.patch/pom.xml
index 897393f..142d351 100644
--- a/features/org.eclipse.jst.enterprise_ui.feature.patch/pom.xml
+++ b/features/org.eclipse.jst.enterprise_ui.feature.patch/pom.xml
@@ -15,9 +15,8 @@
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
+    <artifactId>javaee.features</artifactId>
     <version>3.6.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
   </parent>
 
   <groupId>org.eclipse.webtools.javaee</groupId>
diff --git a/features/org.eclipse.jst.enterprise_ui.feature/README.deprecated.txt b/features/org.eclipse.jst.enterprise_ui.feature/README.deprecated.txt
new file mode 100644
index 0000000..7b1a312
--- /dev/null
+++ b/features/org.eclipse.jst.enterprise_ui.feature/README.deprecated.txt
@@ -0,0 +1 @@
+This feature has moved to http://git.eclipse.org/c/webservices/webtools.webservices.git/tree/features/javaee-web/ and is therefore deprecated in this repo.
diff --git a/features/org.eclipse.jst.enterprise_ui.feature/pom.xml b/features/org.eclipse.jst.enterprise_ui.feature/pom.xml
index 31c32ec..2f13844 100644
--- a/features/org.eclipse.jst.enterprise_ui.feature/pom.xml
+++ b/features/org.eclipse.jst.enterprise_ui.feature/pom.xml
@@ -15,9 +15,8 @@
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
+    <artifactId>javaee.features</artifactId>
     <version>3.6.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
   </parent>
 
   <groupId>org.eclipse.webtools.javaee</groupId>
diff --git a/features/org.eclipse.jst.enterprise_userdoc.feature/README.deprecated.txt b/features/org.eclipse.jst.enterprise_userdoc.feature/README.deprecated.txt
new file mode 100644
index 0000000..7b1a312
--- /dev/null
+++ b/features/org.eclipse.jst.enterprise_userdoc.feature/README.deprecated.txt
@@ -0,0 +1 @@
+This feature has moved to http://git.eclipse.org/c/webservices/webtools.webservices.git/tree/features/javaee-web/ and is therefore deprecated in this repo.
diff --git a/features/org.eclipse.jst.enterprise_userdoc.feature/pom.xml b/features/org.eclipse.jst.enterprise_userdoc.feature/pom.xml
index a581f0f..2d00df5 100644
--- a/features/org.eclipse.jst.enterprise_userdoc.feature/pom.xml
+++ b/features/org.eclipse.jst.enterprise_userdoc.feature/pom.xml
@@ -15,9 +15,8 @@
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
+    <artifactId>javaee.features</artifactId>
     <version>3.6.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
   </parent>
 
   <groupId>org.eclipse.webtools.javaee</groupId>
diff --git a/features/org.eclipse.jst.servlet.ui.patch/pom.xml b/features/org.eclipse.jst.servlet.ui.patch/pom.xml
index 369a5ac..d771375 100644
--- a/features/org.eclipse.jst.servlet.ui.patch/pom.xml
+++ b/features/org.eclipse.jst.servlet.ui.patch/pom.xml
@@ -15,9 +15,8 @@
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
+    <artifactId>javaee.features</artifactId>
     <version>3.6.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
   </parent>
 
   <groupId>org.eclipse.webtools.javaee</groupId>
diff --git a/features/org.eclipse.jst.web_core.feature/README.deprecated.txt b/features/org.eclipse.jst.web_core.feature/README.deprecated.txt
new file mode 100644
index 0000000..7b1a312
--- /dev/null
+++ b/features/org.eclipse.jst.web_core.feature/README.deprecated.txt
@@ -0,0 +1 @@
+This feature has moved to http://git.eclipse.org/c/webservices/webtools.webservices.git/tree/features/javaee-web/ and is therefore deprecated in this repo.
diff --git a/features/org.eclipse.jst.web_core.feature/pom.xml b/features/org.eclipse.jst.web_core.feature/pom.xml
index 5b66618..be4eceb 100644
--- a/features/org.eclipse.jst.web_core.feature/pom.xml
+++ b/features/org.eclipse.jst.web_core.feature/pom.xml
@@ -15,9 +15,8 @@
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
+    <artifactId>javaee.features</artifactId>
     <version>3.6.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
   </parent>
 
   <groupId>org.eclipse.webtools.javaee</groupId>
diff --git a/features/org.eclipse.jst.web_sdk.feature/README.deprecated.txt b/features/org.eclipse.jst.web_sdk.feature/README.deprecated.txt
new file mode 100644
index 0000000..7b1a312
--- /dev/null
+++ b/features/org.eclipse.jst.web_sdk.feature/README.deprecated.txt
@@ -0,0 +1 @@
+This feature has moved to http://git.eclipse.org/c/webservices/webtools.webservices.git/tree/features/javaee-web/ and is therefore deprecated in this repo.
diff --git a/features/org.eclipse.jst.web_sdk.feature/pom.xml b/features/org.eclipse.jst.web_sdk.feature/pom.xml
index e0df245..fa9c01e 100644
--- a/features/org.eclipse.jst.web_sdk.feature/pom.xml
+++ b/features/org.eclipse.jst.web_sdk.feature/pom.xml
@@ -15,9 +15,8 @@
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
+    <artifactId>javaee.features</artifactId>
     <version>3.6.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
   </parent>
 
   <groupId>org.eclipse.webtools.javaee</groupId>
diff --git a/docs/org.eclipse.wst.web.ui.infopop/.cvsignore b/features/org.eclipse.jst.web_tests.feature/.cvsignore
similarity index 100%
copy from docs/org.eclipse.wst.web.ui.infopop/.cvsignore
copy to features/org.eclipse.jst.web_tests.feature/.cvsignore
diff --git a/features/org.eclipse.jst.web_tests.feature/.project b/features/org.eclipse.jst.web_tests.feature/.project
new file mode 100644
index 0000000..832ea5e
--- /dev/null
+++ b/features/org.eclipse.jst.web_tests.feature/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.jst.web_tests.feature</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.pde.FeatureBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.FeatureNature</nature>
+	</natures>
+</projectDescription>
diff --git a/features/org.eclipse.jst.web_tests.feature/README.deprecated.txt b/features/org.eclipse.jst.web_tests.feature/README.deprecated.txt
new file mode 100644
index 0000000..7b1a312
--- /dev/null
+++ b/features/org.eclipse.jst.web_tests.feature/README.deprecated.txt
@@ -0,0 +1 @@
+This feature has moved to http://git.eclipse.org/c/webservices/webtools.webservices.git/tree/features/javaee-web/ and is therefore deprecated in this repo.
diff --git a/features/org.eclipse.jst.web_tests.feature/build.properties b/features/org.eclipse.jst.web_tests.feature/build.properties
new file mode 100644
index 0000000..7c626e2
--- /dev/null
+++ b/features/org.eclipse.jst.web_tests.feature/build.properties
@@ -0,0 +1,3 @@
+bin.includes = feature.xml,\
+               eclipse_update_120.jpg,\
+               feature.properties
diff --git a/features/org.eclipse.jst.web_tests.feature/eclipse_update_120.jpg b/features/org.eclipse.jst.web_tests.feature/eclipse_update_120.jpg
new file mode 100644
index 0000000..bfdf708
--- /dev/null
+++ b/features/org.eclipse.jst.web_tests.feature/eclipse_update_120.jpg
Binary files differ
diff --git a/features/org.eclipse.jst.web_tests.feature/feature.properties b/features/org.eclipse.jst.web_tests.feature/feature.properties
new file mode 100644
index 0000000..4a15608
--- /dev/null
+++ b/features/org.eclipse.jst.web_tests.feature/feature.properties
@@ -0,0 +1,48 @@
+###############################################################################
+# Copyright (c) 2006 IBM 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:
+#     IBM Corporation - initial API and implementation
+###############################################################################
+# feature.properties
+# contains externalized strings for feature.xml
+# "%foo" in feature.xml corresponds to the key "foo" in this file
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# This file should be translated.
+
+# "featureName" property - name of the feature
+featureName=Eclipse Java Web Developer Tests
+
+# "providerName" property - name of the company that provides the feature
+providerName=Eclipse Web Tools Platform
+
+
+# "description" property - description of the feature
+description=Unit Tests and BVT
+
+# "copyright" property - text of the "Feature Update Copyright"
+copyright=\
+Copyright (c) 2006 IBM Corporation and others.\n\
+All rights reserved. This program and the accompanying materials\n\
+are made available under the terms of the Eclipse Public License v1.0\n\
+which accompanies this distribution, and is available at\n\
+http://www.eclipse.org/legal/epl-v10.html\n\
+\n\
+Contributors:\n\
+    IBM Corporation - initial API and implementation\n
+################ end of copyright property ####################################
+
+# "licenseURL" property - URL of the "Feature License"
+# do not translate value - just change to point to a locale-specific HTML page
+# license and licenseURL properties were removed as a result to migrating to new PDE license support. 
+#    Those properties are now added at build time. See http://wiki.eclipse.org/Equinox/p2/License_Mechanism. 
+
+# "license" property - text of the "Feature Update License"
+# should be plain text version of license agreement pointed to be "licenseURL"
+# license and licenseURL properties were removed as a result to migrating to new PDE license support. 
+#    Those properties are now added at build time. See http://wiki.eclipse.org/Equinox/p2/License_Mechanism. 
+########### end of license property ##########################################
diff --git a/features/org.eclipse.jst.web_tests.feature/feature.xml b/features/org.eclipse.jst.web_tests.feature/feature.xml
new file mode 100644
index 0000000..4e68b26
--- /dev/null
+++ b/features/org.eclipse.jst.web_tests.feature/feature.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<feature

+      id="org.eclipse.jst.web_tests.feature"

+      label="%featureName"

+      version="3.6.1.qualifier"

+      provider-name="%providerName"

+      license-feature="org.eclipse.license"

+      license-feature-version="1.0.1.qualifier">

+

+   <description>

+      %description

+   </description>

+

+   <copyright>

+      %copyright

+   </copyright>

+

+   <license url="license.html">

+      %license

+   </license>

+

+   <plugin

+         id="org.eclipse.jst.j2ee.core.tests"

+         download-size="0"

+         install-size="0"

+         version="0.0.0"/>

+

+   <plugin

+         id="org.eclipse.jst.j2ee.tests"

+         download-size="0"

+         install-size="0"

+         version="0.0.0"/>

+

+   <plugin

+         id="org.eclipse.jst.jsp.core.tests"

+         download-size="0"

+         install-size="0"

+         version="0.0.0"/>

+

+   <plugin

+         id="org.eclipse.jst.jsp.tests.encoding"

+         download-size="0"

+         install-size="0"

+         version="0.0.0"/>

+

+   <plugin

+         id="org.eclipse.jst.jsp.ui.tests"

+         download-size="0"

+         install-size="0"

+         version="0.0.0"/>

+

+   <plugin

+         id="org.eclipse.jst.servlet.tests"

+         download-size="0"

+         install-size="0"

+         version="0.0.0"/>

+

+   <plugin

+         id="org.eclipse.jem.tests"

+         download-size="0"

+         install-size="0"

+         version="0.0.0"/>

+

+   <plugin

+         id="org.eclipse.jst.jee.tests"

+         download-size="0"

+         install-size="0"

+         version="0.0.0"/>

+

+</feature>

diff --git a/features/org.eclipse.jst.web_tests.feature/pom.xml b/features/org.eclipse.jst.web_tests.feature/pom.xml
new file mode 100644
index 0000000..6eb0b6f
--- /dev/null
+++ b/features/org.eclipse.jst.web_tests.feature/pom.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Copyright (c) 2012, 2013 Eclipse Foundation and others.
+  All rights reserved. This program and the accompanying materials
+  are made available under the terms of the Eclipse Distribution License v1.0
+  which accompanies this distribution, and is available at
+  http://www.eclipse.org/org/documents/edl-v10.php
+ 
+  Contributors:
+    Thanh Ha (Eclipse Foundation) - initial implementation
+-->
+
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.eclipse.webtools.javaee</groupId>
+    <artifactId>javaee.features</artifactId>
+    <version>3.6.0-SNAPSHOT</version>
+  </parent>
+
+  <groupId>org.eclipse.webtools.javaee</groupId>
+  <artifactId>org.eclipse.jst.web_tests.feature</artifactId>
+  <version>3.6.1-SNAPSHOT</version>
+  <packaging>eclipse-feature</packaging>
+</project>
diff --git a/features/org.eclipse.jst.web_ui.feature.patch/pom.xml b/features/org.eclipse.jst.web_ui.feature.patch/pom.xml
index cf55d3a..37f10d4 100644
--- a/features/org.eclipse.jst.web_ui.feature.patch/pom.xml
+++ b/features/org.eclipse.jst.web_ui.feature.patch/pom.xml
@@ -15,9 +15,8 @@
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
+    <artifactId>javaee.features</artifactId>
     <version>3.6.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
   </parent>
 
   <groupId>org.eclipse.webtools.javaee</groupId>
diff --git a/features/org.eclipse.jst.web_ui.feature/README.deprecated.txt b/features/org.eclipse.jst.web_ui.feature/README.deprecated.txt
new file mode 100644
index 0000000..7b1a312
--- /dev/null
+++ b/features/org.eclipse.jst.web_ui.feature/README.deprecated.txt
@@ -0,0 +1 @@
+This feature has moved to http://git.eclipse.org/c/webservices/webtools.webservices.git/tree/features/javaee-web/ and is therefore deprecated in this repo.
diff --git a/features/org.eclipse.jst.web_ui.feature/pom.xml b/features/org.eclipse.jst.web_ui.feature/pom.xml
index 99f4121..967b8aa 100644
--- a/features/org.eclipse.jst.web_ui.feature/pom.xml
+++ b/features/org.eclipse.jst.web_ui.feature/pom.xml
@@ -15,9 +15,8 @@
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
+    <artifactId>javaee.features</artifactId>
     <version>3.6.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
   </parent>
 
   <groupId>org.eclipse.webtools.javaee</groupId>
diff --git a/features/org.eclipse.jst.web_userdoc.feature/README.deprecated.txt b/features/org.eclipse.jst.web_userdoc.feature/README.deprecated.txt
new file mode 100644
index 0000000..7b1a312
--- /dev/null
+++ b/features/org.eclipse.jst.web_userdoc.feature/README.deprecated.txt
@@ -0,0 +1 @@
+This feature has moved to http://git.eclipse.org/c/webservices/webtools.webservices.git/tree/features/javaee-web/ and is therefore deprecated in this repo.
diff --git a/features/org.eclipse.jst.web_userdoc.feature/pom.xml b/features/org.eclipse.jst.web_userdoc.feature/pom.xml
index 41e83ac..20d75af 100644
--- a/features/org.eclipse.jst.web_userdoc.feature/pom.xml
+++ b/features/org.eclipse.jst.web_userdoc.feature/pom.xml
@@ -15,9 +15,8 @@
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
+    <artifactId>javaee.features</artifactId>
     <version>3.6.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
   </parent>
 
   <groupId>org.eclipse.webtools.javaee</groupId>
diff --git a/features/pom.xml b/features/pom.xml
new file mode 100644
index 0000000..33bec56
--- /dev/null
+++ b/features/pom.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Copyright (c) 2017 Eclipse Foundation and others.
+  All rights reserved. This program and the accompanying materials
+  are made available under the terms of the Eclipse Distribution License v1.0
+  which accompanies this distribution, and is available at
+  http://www.eclipse.org/org/documents/edl-v10.php
+ 
+  Contributors:
+    Nick Boldt (Red Hat) - initial implementation
+    Rob Stryker (Red Hat) - initial implementation
+-->
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.eclipse.webtools.javaee</groupId>
+    <artifactId>org.eclipse.webtools.javaee</artifactId>
+    <version>3.6.0-SNAPSHOT</version>
+  </parent>
+
+  <groupId>org.eclipse.webtools.javaee</groupId>
+  <artifactId>javaee.features</artifactId>
+  <version>3.6.0-SNAPSHOT</version>
+  <packaging>pom</packaging>
+
+  <modules>
+  </modules>
+
+</project>
diff --git a/plugins/org.eclipse.jem.beaninfo.vm.common/pom.xml b/plugins/org.eclipse.jem.beaninfo.vm.common/pom.xml
index 4031ca2..5047d34 100644
--- a/plugins/org.eclipse.jem.beaninfo.vm.common/pom.xml
+++ b/plugins/org.eclipse.jem.beaninfo.vm.common/pom.xml
@@ -15,9 +15,8 @@
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
+    <artifactId>javaee.plugins</artifactId>
     <version>3.6.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
   </parent>
 
   <groupId>org.eclipse.webtools.javaee</groupId>
diff --git a/plugins/org.eclipse.jem.beaninfo.vm/pom.xml b/plugins/org.eclipse.jem.beaninfo.vm/pom.xml
index 8da8a6e..5ee8803 100644
--- a/plugins/org.eclipse.jem.beaninfo.vm/pom.xml
+++ b/plugins/org.eclipse.jem.beaninfo.vm/pom.xml
@@ -15,9 +15,8 @@
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
+    <artifactId>javaee.plugins</artifactId>
     <version>3.6.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
   </parent>
 
   <groupId>org.eclipse.webtools.javaee</groupId>
diff --git a/plugins/org.eclipse.jem.beaninfo/pom.xml b/plugins/org.eclipse.jem.beaninfo/pom.xml
index 80e9fb7..d6d9fa9 100644
--- a/plugins/org.eclipse.jem.beaninfo/pom.xml
+++ b/plugins/org.eclipse.jem.beaninfo/pom.xml
@@ -15,9 +15,8 @@
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
+    <artifactId>javaee.plugins</artifactId>
     <version>3.6.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
   </parent>
 
   <groupId>org.eclipse.webtools.javaee</groupId>
diff --git a/plugins/org.eclipse.jem.proxy/pom.xml b/plugins/org.eclipse.jem.proxy/pom.xml
index 6779812..a7a9f39 100644
--- a/plugins/org.eclipse.jem.proxy/pom.xml
+++ b/plugins/org.eclipse.jem.proxy/pom.xml
@@ -15,9 +15,8 @@
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
+    <artifactId>javaee.plugins</artifactId>
     <version>3.6.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
   </parent>
 
   <groupId>org.eclipse.webtools.javaee</groupId>
diff --git a/plugins/org.eclipse.jem.workbench/pom.xml b/plugins/org.eclipse.jem.workbench/pom.xml
index 2bb7ccc..9658308 100644
--- a/plugins/org.eclipse.jem.workbench/pom.xml
+++ b/plugins/org.eclipse.jem.workbench/pom.xml
@@ -15,9 +15,8 @@
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
+    <artifactId>javaee.plugins</artifactId>
     <version>3.6.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
   </parent>
 
   <groupId>org.eclipse.webtools.javaee</groupId>
diff --git a/plugins/org.eclipse.jem/pom.xml b/plugins/org.eclipse.jem/pom.xml
index 684b0cd..ff0eee7 100644
--- a/plugins/org.eclipse.jem/pom.xml
+++ b/plugins/org.eclipse.jem/pom.xml
@@ -15,9 +15,8 @@
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
+    <artifactId>javaee.plugins</artifactId>
     <version>3.6.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
   </parent>
 
   <groupId>org.eclipse.webtools.javaee</groupId>
diff --git a/plugins/org.eclipse.jst.common.annotations.controller/pom.xml b/plugins/org.eclipse.jst.common.annotations.controller/pom.xml
index 771d4b6..54ecf9e 100644
--- a/plugins/org.eclipse.jst.common.annotations.controller/pom.xml
+++ b/plugins/org.eclipse.jst.common.annotations.controller/pom.xml
@@ -15,9 +15,8 @@
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
+    <artifactId>javaee.plugins</artifactId>
     <version>3.6.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
   </parent>
 
   <groupId>org.eclipse.webtools.javaee</groupId>
diff --git a/plugins/org.eclipse.jst.common.annotations.core/pom.xml b/plugins/org.eclipse.jst.common.annotations.core/pom.xml
index 2d68c8f..a877c1f 100644
--- a/plugins/org.eclipse.jst.common.annotations.core/pom.xml
+++ b/plugins/org.eclipse.jst.common.annotations.core/pom.xml
@@ -15,9 +15,8 @@
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
+    <artifactId>javaee.plugins</artifactId>
     <version>3.6.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
   </parent>
 
   <groupId>org.eclipse.webtools.javaee</groupId>
diff --git a/plugins/org.eclipse.jst.common.annotations.ui/pom.xml b/plugins/org.eclipse.jst.common.annotations.ui/pom.xml
index 34a22ec..ff374a4 100644
--- a/plugins/org.eclipse.jst.common.annotations.ui/pom.xml
+++ b/plugins/org.eclipse.jst.common.annotations.ui/pom.xml
@@ -15,9 +15,8 @@
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
+    <artifactId>javaee.plugins</artifactId>
     <version>3.6.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
   </parent>
 
   <groupId>org.eclipse.webtools.javaee</groupId>
diff --git a/plugins/org.eclipse.jst.common.annotations.ui/src/org/eclipse/jst/common/internal/annotations/ui/AbstractAnnotationTagProposal.java b/plugins/org.eclipse.jst.common.annotations.ui/src/org/eclipse/jst/common/internal/annotations/ui/AbstractAnnotationTagProposal.java
index 4a1e11a..7676289 100644
--- a/plugins/org.eclipse.jst.common.annotations.ui/src/org/eclipse/jst/common/internal/annotations/ui/AbstractAnnotationTagProposal.java
+++ b/plugins/org.eclipse.jst.common.annotations.ui/src/org/eclipse/jst/common/internal/annotations/ui/AbstractAnnotationTagProposal.java
@@ -24,7 +24,7 @@
 import org.eclipse.jdt.ui.PreferenceConstants;
 import org.eclipse.jface.preference.IPreferenceStore;
 import org.eclipse.jface.preference.PreferenceConverter;
-import org.eclipse.jface.text.Assert;
+import org.eclipse.core.runtime.Assert;
 import org.eclipse.jface.text.BadLocationException;
 import org.eclipse.jface.text.BadPositionCategoryException;
 import org.eclipse.jface.text.DefaultPositionUpdater;
diff --git a/plugins/org.eclipse.jst.common.frameworks/pom.xml b/plugins/org.eclipse.jst.common.frameworks/pom.xml
index cd9f2f7..af78ee3 100644
--- a/plugins/org.eclipse.jst.common.frameworks/pom.xml
+++ b/plugins/org.eclipse.jst.common.frameworks/pom.xml
@@ -15,9 +15,8 @@
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
+    <artifactId>javaee.plugins</artifactId>
     <version>3.6.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
   </parent>
 
   <groupId>org.eclipse.webtools.javaee</groupId>
diff --git a/plugins/org.eclipse.jst.common.ui/pom.xml b/plugins/org.eclipse.jst.common.ui/pom.xml
index 213cab4..d63105e 100644
--- a/plugins/org.eclipse.jst.common.ui/pom.xml
+++ b/plugins/org.eclipse.jst.common.ui/pom.xml
@@ -15,9 +15,8 @@
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
+    <artifactId>javaee.plugins</artifactId>
     <version>3.6.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
   </parent>
 
   <groupId>org.eclipse.webtools.javaee</groupId>
diff --git a/plugins/org.eclipse.jst.ejb.ui/.classpath b/plugins/org.eclipse.jst.ejb.ui/.classpath
new file mode 100644
index 0000000..45540be
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/.classpath
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="ejb_ui"/>
+	<classpathentry kind="src" path="property_files"/>
+	<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="output" path="bin"/>
+</classpath>
diff --git a/plugins/org.eclipse.jst.ejb.ui/.cvsignore b/plugins/org.eclipse.jst.ejb.ui/.cvsignore
new file mode 100644
index 0000000..f7ed1f3
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/.cvsignore
@@ -0,0 +1,7 @@
+bin
+temp.folder
+build.xml
+ejb_ui.jar
+@dot
+src.zip
+javaCompiler...args
diff --git a/plugins/org.eclipse.jst.ejb.ui/.project b/plugins/org.eclipse.jst.ejb.ui/.project
new file mode 100644
index 0000000..ac932ae
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/.project
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.jst.ejb.ui</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>
+		<nature>com.ibm.etools.ctc.javaprojectnature</nature>
+	</natures>
+</projectDescription>
diff --git a/plugins/org.eclipse.wst.web.ui/.settings/org.eclipse.jdt.core.prefs b/plugins/org.eclipse.jst.ejb.ui/.settings/org.eclipse.jdt.core.prefs
similarity index 100%
rename from plugins/org.eclipse.wst.web.ui/.settings/org.eclipse.jdt.core.prefs
rename to plugins/org.eclipse.jst.ejb.ui/.settings/org.eclipse.jdt.core.prefs
diff --git a/plugins/org.eclipse.jst.ejb.ui/META-INF/MANIFEST.MF b/plugins/org.eclipse.jst.ejb.ui/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..8b6f178
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,53 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.jst.ejb.ui; singleton:=true
+Bundle-Version: 1.1.910.qualifier
+Bundle-Activator: org.eclipse.jst.ejb.ui.internal.plugin.EJBUIPlugin
+Bundle-Vendor: %providerName
+Bundle-Localization: plugin
+Export-Package: org.eclipse.jst.ejb.ui.context.ids;x-internal:=true,
+ org.eclipse.jst.ejb.ui.internal.actions;x-internal:=true,
+ org.eclipse.jst.ejb.ui.internal.deployables;x-internal:=true,
+ org.eclipse.jst.ejb.ui.internal.extension;x-internal:=true,
+ org.eclipse.jst.ejb.ui.internal.plugin;x-internal:=true,
+ org.eclipse.jst.ejb.ui.internal.quickfixes.ejb;x-internal:=true,
+ org.eclipse.jst.ejb.ui.internal.util;x-internal:=true,
+ org.eclipse.jst.ejb.ui.internal.wizard;x-internal:=true,
+ org.eclipse.jst.ejb.ui.project.facet
+Require-Bundle: org.eclipse.core.resources;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.ui;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.wst.common.frameworks.ui;bundle-version="[1.1.0,2.0.0)",
+ org.eclipse.jst.j2ee.ejb;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.jst.j2ee;bundle-version="[1.1.0,1.3.0)",
+ org.eclipse.jst.j2ee.core;bundle-version="[1.1.0,2.0.0)",
+ org.eclipse.ui.workbench;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.wst.common.frameworks;bundle-version="[1.1.0,2.0.0)",
+ org.eclipse.emf.ecore.xmi;bundle-version="[2.2.0,3.0.0)",
+ org.eclipse.jst.j2ee.ui;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.jst.common.annotations.controller;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.wst.common.modulecore;bundle-version="[1.1.0,2.0.0)",
+ org.eclipse.jem.util;bundle-version="[2.0.0,3.0.0)",
+ org.eclipse.debug.ui;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.jdt.core;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.wst.server.core;bundle-version="[1.0.102,2.0.0)",
+ org.eclipse.jst.common.frameworks;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.wst.common.project.facet.ui;bundle-version="[1.1.0,2.0.0)",
+ org.eclipse.wst.common.project.facet.core;bundle-version="[1.1.0,2.0.0)",
+ org.eclipse.wst.web.ui;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.ui.navigator.resources;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.jem.workbench;bundle-version="[2.0.0,3.0.0)",
+ org.eclipse.emf.edit.ui;bundle-version="[2.2.0,3.0.0)",
+ org.eclipse.ui.ide;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.wst.validation.ui;bundle-version="[1.1.0,2.0.0)",
+ org.eclipse.wst.validation;bundle-version="[1.1.0,2.0.0)",
+ org.eclipse.wst.web;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.ui.forms;bundle-version="[3.3.0,4.0.0)",
+ org.eclipse.jdt.ui;bundle-version="[3.4.0,4.0.0)",
+ org.eclipse.jst.jee.ui;bundle-version="[1.0.100,2.0.0)",
+ org.eclipse.jst.common.project.facet.core;bundle-version="[1.4.0,2.0.0)"
+Eclipse-LazyStart: true
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Import-Package: org.eclipse.emf.codegen.jet
+Bundle-ActivationPolicy: lazy
diff --git a/plugins/org.eclipse.wst.web.ui/about.html b/plugins/org.eclipse.jst.ejb.ui/about.html
similarity index 100%
rename from plugins/org.eclipse.wst.web.ui/about.html
rename to plugins/org.eclipse.jst.ejb.ui/about.html
diff --git a/plugins/org.eclipse.jst.ejb.ui/build.properties b/plugins/org.eclipse.jst.ejb.ui/build.properties
new file mode 100644
index 0000000..5788c19
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/build.properties
@@ -0,0 +1,20 @@
+###############################################################################
+# Copyright (c) 2005, 2006 IBM 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:
+#     IBM Corporation - initial API and implementation
+###############################################################################
+bin.includes = plugin.xml,\
+               icons/,\
+               plugin.properties,\
+               .,\
+               META-INF/,\
+               about.html
+               
+source.. = ejb_ui/,\
+                    property_files/
+output.. = bin/
diff --git a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/context/ids/IEJBUIContextIds.java b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/context/ids/IEJBUIContextIds.java
new file mode 100644
index 0000000..6a46f82
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/context/ids/IEJBUIContextIds.java
@@ -0,0 +1,11 @@
+package org.eclipse.jst.ejb.ui.context.ids;
+
+public interface IEJBUIContextIds {
+	public static final String PLUGIN_EJB_UI = "org.eclipse.jst.ejb.ui."; //$NON-NLS-1$
+	
+	public static final String EJB_SESSION_BEAN_WIZARD_ADD_SESSION_BEAN_PAGE_1 = PLUGIN_EJB_UI + "sessbw1100"; //$NON-NLS-1$
+	public static final String EJB_SESSION_BEAN_WIZARD_ADD_SESSION_BEAN_PAGE_2 = PLUGIN_EJB_UI + "sessbw1200"; //$NON-NLS-1$
+	
+	public static final String EJB_MESSAGE_BEAN_WIZARD_ADD_MESSAGE_BEAN_PAGE_1 = PLUGIN_EJB_UI + "messbw1100"; //$NON-NLS-1$
+	public static final String EJB_MESSAGE_BEAN_WIZARD_ADD_MESSAGE_BEAN_PAGE_2 = PLUGIN_EJB_UI + "messbw1200"; //$NON-NLS-1$
+}
diff --git a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/actions/AbstractClientJARAction.java b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/actions/AbstractClientJARAction.java
new file mode 100644
index 0000000..d901626
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/actions/AbstractClientJARAction.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.jst.ejb.ui.internal.actions;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
+import org.eclipse.jst.j2ee.ejb.EJBJar;
+import org.eclipse.jst.j2ee.internal.actions.BaseAction;
+import org.eclipse.jst.j2ee.internal.ejb.project.operations.ClientJARCreationConstants;
+
+
+
+public abstract class AbstractClientJARAction extends BaseAction implements ClientJARCreationConstants {
+
+	
+	protected IProject getProject() {
+		IProject project = null;
+		Object element = selection.getFirstElement();
+		
+		if (element instanceof EJBJar) 
+			project = ProjectUtilities.getProject((EJBJar) element);
+		else if (element instanceof IProject)
+			project = (IProject) element;
+		else if (element instanceof IAdaptable)
+			project = ((IAdaptable)element).getAdapter(IProject.class);
+		
+		return project;
+	}
+}
diff --git a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/actions/EJBArchiveUIResourceHandler.java b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/actions/EJBArchiveUIResourceHandler.java
new file mode 100644
index 0000000..bf26923
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/actions/EJBArchiveUIResourceHandler.java
@@ -0,0 +1,64 @@
+/***************************************************************************************************
+ * Copyright (c) 2003, 2004 IBM 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: IBM Corporation - initial API and implementation
+ **************************************************************************************************/
+package org.eclipse.jst.ejb.ui.internal.actions;
+
+
+
+import java.text.MessageFormat;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+public class EJBArchiveUIResourceHandler {
+
+	private static ResourceBundle fgResourceBundle;
+
+	/**
+	 * Returns the resource bundle used by all classes in this Project
+	 */
+	public static ResourceBundle getResourceBundle() {
+		try {
+			return ResourceBundle.getBundle("ejbarchiveui");//$NON-NLS-1$
+		} catch (MissingResourceException e) {
+			// does nothing - this method will return null and
+			// getString(String, String) will return the key
+			// it was called with
+		}
+		return null;
+	}
+
+	public static String getString(String key) {
+		if (fgResourceBundle == null) {
+			fgResourceBundle = getResourceBundle();
+		}
+
+		if (fgResourceBundle != null) {
+			try {
+				return fgResourceBundle.getString(key);
+			} catch (MissingResourceException e) {
+				return "!" + key + "!";//$NON-NLS-2$//$NON-NLS-1$
+			}
+		}
+		return "!" + key + "!";//$NON-NLS-2$//$NON-NLS-1$
+	}
+
+	public static String getString(String key, Object[] args) {
+
+		try {
+			return MessageFormat.format(getString(key), args);
+		} catch (IllegalArgumentException e) {
+			return getString(key);
+		}
+
+	}
+
+	public static String getString(String key, Object[] args, int x) {
+
+		return getString(key);
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/actions/EJBCheckboxTableViewer.java b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/actions/EJBCheckboxTableViewer.java
new file mode 100644
index 0000000..aea382a
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/actions/EJBCheckboxTableViewer.java
@@ -0,0 +1,128 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2004 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.ejb.ui.internal.actions;
+
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.swt.widgets.Widget;
+
+/**
+ * Insert the type's description here. Creation date: (3/22/2001 4:44:53 PM)
+ * 
+ * @author: Administrator
+ */
+public class EJBCheckboxTableViewer extends org.eclipse.jface.viewers.CheckboxTableViewer {
+	/**
+	 * EJBCheckboxTableViewer constructor comment.
+	 * 
+	 * @param parent
+	 *            org.eclipse.swt.widgets.Composite
+	 * @param style
+	 *            int
+	 */
+	public EJBCheckboxTableViewer(org.eclipse.swt.widgets.Composite parent, int style) {
+		super(createTable(parent, style));
+	}
+
+	/**
+	 * EJBCheckboxTableViewer constructor comment.
+	 * 
+	 * @param table
+	 *            org.eclipse.swt.widgets.Table
+	 */
+	public EJBCheckboxTableViewer(org.eclipse.swt.widgets.Table table) {
+		super(table);
+	}
+
+	/**
+	 * Returns a list of elements corresponding to checked table items in this viewer.
+	 * <p>
+	 * This method is typically used when preserving the interesting state of a viewer;
+	 * <code>setCheckedElements</code> is used during the restore.
+	 * </p>
+	 * <p>
+	 * [Issue: Should return Object[] rather than List.]
+	 * </p>
+	 * 
+	 * @return the list of checked nodes (element type: <code>Object</code>)
+	 * @see #setCheckedElements
+	 */
+	public List getAllElements() {
+		TableItem[] children = getTable().getItems();
+		List v = new ArrayList(children.length);
+		for (int i = 0; i < children.length; i++) {
+			TableItem item = children[i];
+			v.add(item.getData());
+		}
+
+		return v;
+	}
+
+	/**
+	 * Returns a list of elements corresponding to checked table items in this viewer.
+	 * <p>
+	 * This method is typically used when preserving the interesting state of a viewer;
+	 * <code>setCheckedElements</code> is used during the restore.
+	 * </p>
+	 * <p>
+	 * [Issue: Should return Object[] rather than List.]
+	 * </p>
+	 * 
+	 * @return the list of checked nodes (element type: <code>Object</code>)
+	 * @see #setCheckedElements
+	 */
+	public List getUnCheckedElements() {
+		TableItem[] children = getTable().getItems();
+		List v = new ArrayList(children.length);
+		for (int i = 0; i < children.length; i++) {
+			TableItem item = children[i];
+			if (!(item.getChecked()))
+				v.add(item.getData());
+		}
+		return v;
+	}
+
+	/**
+	 * Sets which nodes are checked in this viewer. The given list contains the elements that are to
+	 * be checked; all other nodes are to be unchecked.
+	 * <p>
+	 * This method is typically used when restoring the interesting state of a viewer captured by an
+	 * earlier call to <code>getCheckedElements</code>.
+	 * </p>
+	 * <p>
+	 * [Issue: Should accept Object[] rather than List.]
+	 * </p>
+	 * 
+	 * @param elements
+	 *            the list of checked elements (element type: <code>Object</code>)
+	 * @see #getCheckedElements
+	 */
+	public void setUnCheckedElements(List elements) {
+		for (int i = 0; i < elements.size(); i++) {
+			Widget widget = findItem(elements.get(i));
+			if (widget instanceof TableItem)
+				((TableItem) widget).setChecked(false);
+		}
+
+	}
+
+	public void setCheckedElements(List elements) {
+		for (int i = 0; i < elements.size(); i++) {
+			Widget widget = findItem(elements.get(i));
+			if (widget instanceof TableItem)
+				((TableItem) widget).setChecked(true);
+		}
+
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/actions/EJBClientCreationAction.java b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/actions/EJBClientCreationAction.java
new file mode 100644
index 0000000..6ff01d5
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/actions/EJBClientCreationAction.java
@@ -0,0 +1,163 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.jst.ejb.ui.internal.actions;
+
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
+import org.eclipse.jem.workbench.utility.JemProjectUtilities;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.jst.ejb.ui.internal.extension.EJBClientActionRegistryReader;
+import org.eclipse.jst.ejb.ui.internal.extension.IEJBClientActionExtender;
+import org.eclipse.jst.ejb.ui.internal.plugin.EJBUIPlugin;
+import org.eclipse.jst.ejb.ui.internal.wizard.EJBClientComponentCreationWizard;
+import org.eclipse.jst.j2ee.ejb.EJBJar;
+import org.eclipse.jst.j2ee.internal.ejb.archiveoperations.EjbClientJarCreationDataModelProvider;
+import org.eclipse.jst.j2ee.internal.ejb.archiveoperations.IEjbClientJarCreationDataModelProperties;
+import org.eclipse.jst.j2ee.internal.ejb.project.operations.EJBCreationResourceHandler;
+import org.eclipse.jst.j2ee.internal.ejb.provider.GroupedEJBItemProvider;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPlugin;
+import org.eclipse.jst.j2ee.project.EJBUtilities;
+import org.eclipse.jst.j2ee.project.EarUtilities;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+
+
+public class EJBClientCreationAction extends AbstractClientJARAction {
+	
+	public static String LABEL = Platform.getResourceString(
+				Platform.getBundle(EJBUIPlugin.PLUGIN_ID),
+				"%ejb.client.jar.creation.action.description_ui_"); //$NON-NLS-1$
+	
+
+	public EJBClientCreationAction() {
+		super();
+		setText(LABEL);
+		setImageDescriptor(J2EEUIPlugin.getDefault().getImageDescriptor("ejbclientjar_wiz")); //$NON-NLS-1$
+	}
+
+	/* (non-Javadoc)
+	 * @see com.ibm.etools.j2ee.common.actions.BaseAction#primRun(org.eclipse.swt.widgets.Shell)
+	 */
+	@Override
+	protected void primRun(Shell shell) {
+		if(getSelectedProject() == null) return;
+		if(!checkBinaryProject(shell) || !checkEARProject(shell))
+			return;
+		
+		IDataModel dm = DataModelFactory.createDataModel(new EjbClientJarCreationDataModelProvider());
+		dm.setProperty(IEjbClientJarCreationDataModelProperties.EJB_PROJECT_NAME,
+				getSelectedProject().getName() );
+		
+		EJBClientComponentCreationWizard wizard = new EJBClientComponentCreationWizard(dm);
+		J2EEUIPlugin plugin = J2EEUIPlugin.getDefault();
+		wizard.setDialogSettings(plugin.getDialogSettings());
+
+		WizardDialog dialog = new WizardDialog(shell, wizard);
+		dialog.create();
+		dialog.getShell().setSize(500, 550);
+		dialog.open(); 
+	}
+
+    private boolean checkEARProject(Shell shell) {
+        if (!hasEARProject()) {
+            // if this is an EJB project that is not in an EAR project, check to see if an extension allows for its creation
+        	IProject project = getSelectedProject();
+            
+        	List<IEJBClientActionExtender> ejbClientCreationExtensions = EJBClientActionRegistryReader.getInstance().getEJBClientActionExtenders();
+			Iterator<IEJBClientActionExtender> i = ejbClientCreationExtensions.iterator();
+			IEJBClientActionExtender current = null;
+			int wizardRet;
+			boolean done = false;
+			// iterate through the extenders.  If the first way to create the EJB Client jar is not correct, the user can press cancel and the next wizard will be created.
+			while (i.hasNext() && !done)
+			{
+				current = i.next();
+				if (current.allowEJBClientCreation(project))
+				{
+					// if the extension allows its creation, then launch whatever wizard is applicable
+					wizardRet = current.showEJBClientCreationWizard(shell, project);
+					if (wizardRet == Window.OK)
+					{
+						done = true;
+					}
+				}
+			}
+
+			// if no extenders can create an EJB Client project, display the usual error message
+			if (!done)
+			{
+				MessageDialog.openError(shell, EJBCreationResourceHandler.EJB_Client_JAR_Creation_Error_, EJBCreationResourceHandler.Cannot_Be_StandAlone_Project_For_Client_);
+			}
+            return false;
+        }
+        return true;		
+    }
+
+    private boolean checkBinaryProject(Shell shell) {
+        if (isBinaryProject()) {
+            MessageDialog.openError(shell, EJBCreationResourceHandler.EJB_Client_JAR_Creation_Error_, EJBCreationResourceHandler.Cannot_Be_Binary_Project_For_Client_); 
+            return false;
+        }
+        return true;		
+    }
+    
+    private boolean hasEARProject() {
+        IProject project = getSelectedProject();
+        return !EarUtilities.isStandaloneProject(project);
+    }
+
+
+    private boolean isBinaryProject() {
+		IProject project = getSelectedProject();
+		return JemProjectUtilities.isBinaryProject(project);
+    }
+
+    /**
+     * @return
+     */
+    private IProject getSelectedProject() {
+        if (selection.getFirstElement() instanceof EJBJar) {
+            EJBJar selProject = (EJBJar) selection.getFirstElement();
+            return ProjectUtilities.getProject(selProject);
+        } else if (selection.getFirstElement() instanceof IProject) {
+            return (IProject) selection.getFirstElement();
+        } else if (selection.getFirstElement() instanceof IJavaProject) {
+            return ((IJavaProject) selection.getFirstElement()).getProject();
+        } else if(selection.getFirstElement() instanceof GroupedEJBItemProvider) {
+        	if(((GroupedEJBItemProvider)selection.getFirstElement()).getParent() instanceof EJBJar) {
+        		EJBJar jar = (EJBJar) ((GroupedEJBItemProvider)selection.getFirstElement()).getParent();
+        		return ProjectUtilities.getProject(jar);
+        	}
+        }
+        return null;
+    }
+
+	@Override
+	public void selectionChanged(IAction action, ISelection selection) {
+		super.selectionChanged(action, selection);
+		if (EJBUtilities.hasEJBClientJARProject(getProject()))
+			action.setEnabled(false);
+		else 
+			action.setEnabled(true);
+	}
+}
diff --git a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/actions/EJBClientCreationActionDelegate.java b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/actions/EJBClientCreationActionDelegate.java
new file mode 100644
index 0000000..d7d29de
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/actions/EJBClientCreationActionDelegate.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.jst.ejb.ui.internal.actions;
+import org.eclipse.jst.j2ee.internal.actions.AbstractActionDelegate;
+import org.eclipse.swt.widgets.Shell;
+
+
+
+
+public class EJBClientCreationActionDelegate extends AbstractActionDelegate {
+	private EJBClientCreationAction realAction = new EJBClientCreationAction();
+    /**
+     * 
+     */
+    public EJBClientCreationActionDelegate() {
+        super();
+       	setAllowsMultiSelect(false);
+    }
+	@Override
+	protected void primRun(Shell shell) {
+		realAction.setSelection(getStructuredSelection());
+		realAction.primRun(shell);
+	}
+	/* (non-Javadoc)
+	 * @see com.ibm.etools.j2ee.common.actions.AbstractActionDelegate#isSupportedAction(java.lang.Object)
+	 */
+	@Override
+	protected boolean isSupportedAction(Object element) {
+		return false;
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/actions/EJBClientRemovalAction.java b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/actions/EJBClientRemovalAction.java
new file mode 100644
index 0000000..311a6c3
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/actions/EJBClientRemovalAction.java
@@ -0,0 +1,251 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.jst.ejb.ui.internal.actions;
+
+import java.lang.reflect.InvocationTargetException;
+import java.text.MessageFormat;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jem.util.logger.proxy.Logger;
+import org.eclipse.jem.workbench.utility.JemProjectUtilities;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.dialogs.ProgressMonitorDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jst.ejb.ui.internal.extension.EJBClientActionRegistryReader;
+import org.eclipse.jst.ejb.ui.internal.extension.IEJBClientActionExtender;
+import org.eclipse.jst.ejb.ui.internal.plugin.EJBUIPlugin;
+import org.eclipse.jst.j2ee.ejb.componentcore.util.EJBArtifactEdit;
+import org.eclipse.jst.j2ee.internal.ejb.archiveoperations.EjbClientProjectRemovalDataModelProvider;
+import org.eclipse.jst.j2ee.internal.ejb.archiveoperations.IEjbClientProjectRemovalDataModelProperties;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPlugin;
+import org.eclipse.jst.j2ee.project.EJBUtilities;
+import org.eclipse.jst.j2ee.project.EarUtilities;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.progress.UIJob;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.internal.ui.UIOperationHandler;
+import org.eclipse.wst.common.frameworks.internal.ui.WorkspaceModifyComposedOperation;
+import org.eclipse.wst.validation.internal.operations.ValidatorSubsetOperation;
+import org.eclipse.wst.validation.internal.ui.plugin.ValidationUIPlugin;
+
+
+
+public class EJBClientRemovalAction extends AbstractClientJARAction {
+
+	
+	public static String LABEL = Platform.getResourceString(
+				Platform.getBundle(EJBUIPlugin.PLUGIN_ID),
+				"%ejb.client.jar.remove.action.description_ui_"); //$NON-NLS-1$
+	
+
+
+	
+	public EJBClientRemovalAction() {
+		super();
+		setText(LABEL);
+	}
+
+	/* (non-Javadoc)
+	 * @see com.ibm.etools.j2ee.common.actions.BaseAction#primRun(org.eclipse.swt.widgets.Shell)
+	 */
+	@Override
+	protected void primRun(final Shell shell) {
+		final IProject ejbProject = getProject();
+
+		if (!checkClientExists(shell))
+			return;
+		if (!checkBinaryProject(shell))
+			return;
+		if (!confirmProceed(shell))
+			return;
+
+		final IProject clientProject = getClientProject();
+		
+//		ValidatorManager validatorMgr = ValidatorManager.getManager();
+		try{
+				//validatorMgr.suspendAllValidation(true);
+				if (!EarUtilities.isStandaloneProject(ejbProject))
+				{
+					Job clientRemoveJob = new UIJob("Removing EJB Client Project"){ //$NON-NLS-1$
+						@Override
+						public IStatus runInUIThread(IProgressMonitor monitor) {
+							
+							UIOperationHandler opHandler = new UIOperationHandler(shell);
+							IDataModel model = DataModelFactory.createDataModel( new EjbClientProjectRemovalDataModelProvider() );
+							model.setProperty(IEjbClientProjectRemovalDataModelProperties.EJB_PROJECT, ejbProject);
+							model.setProperty(IEjbClientProjectRemovalDataModelProperties.EJB_CLIENT_VIEW_PROJECT, clientProject);
+							model.setProperty(IEjbClientProjectRemovalDataModelProperties.OP_HANDLER, opHandler );
+							
+							IStatus status = Status.OK_STATUS;
+							try {
+								status = model.getDefaultOperation().execute(monitor, null);
+							} catch (ExecutionException e) {
+								EJBUIPlugin.logError(e);
+							}
+							return status;
+						}
+					};
+			
+					clientRemoveJob.setRule(ResourcesPlugin.getWorkspace().getRoot());
+					clientRemoveJob.setUser(true);
+					clientRemoveJob.schedule();
+				}
+				else
+				{
+					List<IEJBClientActionExtender> ejbClientActionExtensions = EJBClientActionRegistryReader.getInstance().getEJBClientActionExtenders();
+					Iterator<IEJBClientActionExtender> i = ejbClientActionExtensions.iterator();
+					IEJBClientActionExtender current = null;
+					IStatus status = null;
+					// iterate through the extenders to find if any allow for the removal of the EJB Client jar
+					while (i.hasNext() && (status == null || !status.isOK()))
+					{
+						current = i.next();
+						if (current.allowEJBClientRemoval(ejbProject))
+						{
+							status = current.performEJBClientRemoval(shell, ejbProject);
+						}
+					}
+				}
+
+		}finally {
+//			validatorMgr.suspendAllValidation(false);
+//			ProgressMonitorDialog dlg = new ProgressMonitorDialog(shell);
+//			runValidationOperation(dlg);
+		}
+		
+		
+//		IRunnableWithProgress runnable = WTPUIPlugin.getRunnableWithProgress(op);
+//		ProgressMonitorDialog dlg = new ProgressMonitorDialog(shell);
+//		
+//		ValidatorManager validatorMgr = ValidatorManager.getManager();
+//		try {
+//			validatorMgr.suspendAllValidation(true);
+//			//dlg.run(false, false, runnable);
+//		} catch (InvocationTargetException e) {
+//			handleException(shell, e);
+//		} catch (RuntimeException e) {
+//			handleException(shell, e);
+//		} catch (InterruptedException e) {
+//			//do nothing
+//		} finally {
+//			validatorMgr.suspendAllValidation(false);
+//			runValidationOperation(dlg);
+//		}
+	}
+	
+	protected void runValidationOperation(ProgressMonitorDialog dlg) {
+		WorkspaceModifyComposedOperation runnable = new WorkspaceModifyComposedOperation();
+		ValidatorSubsetOperation sop = new ValidatorSubsetOperation(getProject(), true, false);
+		sop.setValidators(new String[] { "org.eclipse.jst.j2ee.core.internal.validation.EJBValidator"}); //$NON-NLS-1$
+		//TODO: add extension back in for validator  "com.ibm.etools.ejb.mapvalidator.MapValidation" 
+		runnable.addRunnable(ValidationUIPlugin.getRunnableWithProgress(sop));
+		try {
+			dlg.run(true, false, runnable);
+		} catch (InvocationTargetException e) {
+			Logger.getLogger(J2EEUIPlugin.PLUGIN_ID).logError(e);
+		} catch (InterruptedException ie) {
+		}
+	}
+	
+//	private void handleException(Shell shell, Exception e) {
+//		EJBUIPlugin.logError(e);
+//		MessageDialog.openError(shell, REMOVE_ERROR_TITLE, ERROR_REMOVING_CLIENT);
+//	}
+
+	/**
+	 * @return
+	 */
+	private boolean checkClientExists(Shell shell) {
+		if (getClientProject() == null) {
+			MessageDialog.openError(shell, NO_CLIENT_JAR_TITLE, NO_CLIENT_JAR_MSG);
+			return false;
+		}
+		return true; 
+	}
+	
+	private boolean confirmProceed(Shell shell) {
+		String message = MessageFormat.format(REMOVE_MESSAGE, new Object[] {getClientProject().getName()});
+		return MessageDialog.openQuestion(shell, REMOVE_TITLE, message);
+	}
+	
+	/**
+	 * @return
+	 */
+	private IProject getClientProject() {
+		IProject ejbProject = getProject();
+		if( ejbProject.exists() && ejbProject.isAccessible()){
+			EJBArtifactEdit edit = null;
+			try {
+				edit = EJBArtifactEdit.getEJBArtifactEditForRead( ejbProject );
+				if (edit != null){
+					IVirtualComponent clientComp = edit.getEJBClientJarModule();
+					if( clientComp != null ){
+						return clientComp.getProject();
+					}
+				}
+			} finally {
+				if(edit != null)
+					edit.dispose();
+					  
+			}
+		}
+		return null;
+	}
+
+	private boolean checkBinaryProject(Shell shell) {
+		if (JemProjectUtilities.isBinaryProject(getProject())) {
+			MessageDialog.openError(shell, REMOVE_ERROR_TITLE, BINARY_EJB_PROJECT);
+			return false;
+		} else if (JemProjectUtilities.isBinaryProject(getClientProject())) {
+			MessageDialog.openError(shell, REMOVE_ERROR_TITLE, BINARY_CLIENT_PROJECT);
+			return false;
+		}
+		return true;		
+	}
+
+	@Override
+	public void selectionChanged(IAction action, ISelection selection) {
+		super.selectionChanged(action, selection);
+		IProject project = getProject();
+		if (EJBUtilities.hasEJBClientJARProject(project))
+			action.setEnabled(true);
+		else
+		{
+			List<IEJBClientActionExtender> ejbClientActionExtensions = EJBClientActionRegistryReader.getInstance().getEJBClientActionExtenders();
+			Iterator<IEJBClientActionExtender> i = ejbClientActionExtensions.iterator();
+			IEJBClientActionExtender current = null;
+			boolean allow = false;
+			// iterate through the extenders to find if any allow for the removal of the EJB Client jar
+			while (i.hasNext() && !allow)
+			{
+				current = i.next();
+				if (current.allowEJBClientRemoval(project))
+				{
+					allow = true;
+				}
+			}
+			action.setEnabled(allow);
+		}
+	}    
+}
diff --git a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/actions/EJBClientRemovalActionDelegate.java b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/actions/EJBClientRemovalActionDelegate.java
new file mode 100644
index 0000000..0eb0279
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/actions/EJBClientRemovalActionDelegate.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.ejb.ui.internal.actions;
+
+import org.eclipse.jst.j2ee.internal.actions.AbstractActionDelegate;
+import org.eclipse.swt.widgets.Shell;
+
+
+
+public class EJBClientRemovalActionDelegate extends AbstractActionDelegate {
+	private EJBClientRemovalAction realAction = new EJBClientRemovalAction();
+    /**
+     * 
+     */
+    public EJBClientRemovalActionDelegate() {
+        super();
+       	setAllowsMultiSelect(false);
+    }
+	@Override
+	protected void primRun(Shell shell) {
+		realAction.setSelection(getStructuredSelection());
+		realAction.primRun(shell);
+	}
+	/* (non-Javadoc)
+	 * @see com.ibm.etools.j2ee.common.actions.AbstractActionDelegate#isSupportedAction(java.lang.Object)
+	 */
+	@Override
+	protected boolean isSupportedAction(Object element) {
+		return false;
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/actions/EJBSelectiveImportDialog.java b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/actions/EJBSelectiveImportDialog.java
new file mode 100644
index 0000000..384d5c0
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/actions/EJBSelectiveImportDialog.java
@@ -0,0 +1,159 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2004 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.ejb.ui.internal.actions;
+
+
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.List;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * Insert the type's description here. Creation date: (9/7/2001 11:28:24 AM)
+ * 
+ * @author: Administrator
+ */
+public class EJBSelectiveImportDialog extends org.eclipse.jface.dialogs.MessageDialog {
+	protected String[] ejbList;
+
+	/**
+	 * EJBSelectiveImportDialog constructor comment.
+	 * 
+	 * @param parentShell
+	 *            org.eclipse.swt.widgets.Shell
+	 * @param dialogTitle
+	 *            java.lang.String
+	 * @param dialogTitleImage
+	 *            org.eclipse.swt.graphics.Image
+	 * @param dialogMessage
+	 *            java.lang.String
+	 * @param dialogImageType
+	 *            int
+	 * @param dialogButtonLabels
+	 *            java.lang.String[]
+	 * @param defaultIndex
+	 *            int
+	 */
+	public EJBSelectiveImportDialog(org.eclipse.swt.widgets.Shell parentShell, String dialogTitle, org.eclipse.swt.graphics.Image dialogTitleImage, String dialogMessage, int dialogImageType, java.lang.String[] dialogButtonLabels, int defaultIndex) {
+		super(parentShell, dialogTitle, dialogTitleImage, dialogMessage, dialogImageType, dialogButtonLabels, defaultIndex);
+	}
+
+	/**
+	 * EJBSelectiveImportDialog constructor comment.
+	 * 
+	 * @param parentShell
+	 *            org.eclipse.swt.widgets.Shell
+	 * @param dialogTitle
+	 *            java.lang.String
+	 * @param dialogTitleImage
+	 *            org.eclipse.swt.graphics.Image
+	 * @param dialogMessage
+	 *            java.lang.String
+	 * @param dialogImageType
+	 *            int
+	 * @param dialogButtonLabels
+	 *            java.lang.String[]
+	 * @param defaultIndex
+	 *            int
+	 */
+	public EJBSelectiveImportDialog(org.eclipse.swt.widgets.Shell parentShell, String dialogTitle, org.eclipse.swt.graphics.Image dialogTitleImage, String dialogMessage, int dialogImageType, java.lang.String[] dialogButtonLabels, int defaultIndex, String[] ejbNames) {
+		super(parentShell, dialogTitle, dialogTitleImage, dialogMessage, dialogImageType, dialogButtonLabels, defaultIndex);
+		ejbList = ejbNames;
+	}
+
+	/**
+	 * Creates and returns the contents of an area of the dialog which appears below the message and
+	 * above the button bar.
+	 * <p>
+	 * The default implementation of this framework method returns <code>null</code>. Subclasses
+	 * may override.
+	 * </p>
+	 * 
+	 * @param the
+	 *            parent composite to contain the custom area
+	 * @return the custom area control, or <code>null</code>
+	 */
+	@Override
+	protected Control createCustomArea(Composite parent) {
+
+		Composite composite = new Composite(parent, 0);
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 1;
+		layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
+		layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
+		layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
+		composite.setLayout(layout);
+		composite.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+		if (ejbList != null) {
+			List list = new List(composite, SWT.BORDER | SWT.HIDE_SELECTION);
+			GridData data = new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_CENTER);
+			list.setLayoutData(data);
+			list.setItems(ejbList);
+			list.setForeground(new Color(null, 0, 0, 255));
+		}
+
+		return composite;
+
+	}
+
+	/**
+	 * Convenience method to open a simple Yes/No question dialog.
+	 * 
+	 * @param parent
+	 *            the parent shell of the dialog, or <code>null</code> if none
+	 * @param title
+	 *            the dialog's title, or <code>null</code> if none
+	 * @param message
+	 *            the message
+	 * @return <code>true</code> if the user presses the OK button, <code>false</code> otherwise
+	 */
+	public static boolean openError(Shell parent, String title, String message, String[] names) {
+		EJBSelectiveImportDialog dialog = new EJBSelectiveImportDialog(parent, title, null, // accept
+					// the
+					// default
+					// window
+					// icon
+					message, ERROR, new String[]{IDialogConstants.OK_LABEL}, 0, names); // yes is
+		// the
+		// default
+		return dialog.open() == 0;
+	}
+
+	/**
+	 * Convenience method to open a simple Yes/No question dialog.
+	 * 
+	 * @param parent
+	 *            the parent shell of the dialog, or <code>null</code> if none
+	 * @param title
+	 *            the dialog's title, or <code>null</code> if none
+	 * @param message
+	 *            the message
+	 * @return <code>true</code> if the user presses the OK button, <code>false</code> otherwise
+	 */
+	public static boolean openQuestion(Shell parent, String title, String message, String[] ejbNames) {
+		EJBSelectiveImportDialog dialog = new EJBSelectiveImportDialog(parent, title, null, // accept
+					// the
+					// default
+					// window
+					// icon
+					message, QUESTION, new String[]{IDialogConstants.YES_LABEL, IDialogConstants.NO_LABEL}, 0, ejbNames); // yes
+		// is
+		// the
+		// default
+		return dialog.open() == 0;
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/actions/ExportEJBAction.java b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/actions/ExportEJBAction.java
new file mode 100644
index 0000000..d586b89
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/actions/ExportEJBAction.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ * Created on Mar 27, 2003
+ *
+ * To change this generated comment go to 
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+package org.eclipse.jst.ejb.ui.internal.actions;
+
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.jst.ejb.ui.internal.wizard.EJBComponentExportWizard;
+import org.eclipse.jst.j2ee.internal.actions.BaseAction;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPlugin;
+import org.eclipse.swt.widgets.Shell;
+
+
+/**
+ * @author jsholl
+ * 
+ * To change this generated comment go to Window>Preferences>Java>Code Generation>Code and Comments
+ */
+public class ExportEJBAction extends BaseAction {
+	public static String LABEL = Platform.getResourceString(J2EEUIPlugin.getDefault().getBundle(), "%ejb.export.action.description_ui_"); //$NON-NLS-1$
+	private static final String ICON = "export_ejbjar_wiz"; //$NON-NLS-1$
+
+	public ExportEJBAction() {
+		super();
+		setText(LABEL);
+		setImageDescriptor(J2EEUIPlugin.getDefault().getImageDescriptor(ICON));
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jst.j2ee.internal.common.actions.BaseAction#primRun(org.eclipse.swt.widgets.Shell)
+	 */
+	@Override
+	protected void primRun(Shell shell) {
+		EJBComponentExportWizard wizard = new EJBComponentExportWizard();
+		J2EEUIPlugin plugin = J2EEUIPlugin.getDefault();
+		wizard.init(plugin.getWorkbench(), selection);
+
+		WizardDialog dialog = new WizardDialog(shell, wizard);
+		dialog.create();
+		dialog.open();
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/actions/ImportEJBAction.java b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/actions/ImportEJBAction.java
new file mode 100644
index 0000000..361b1cf
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/actions/ImportEJBAction.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ * Created on Mar 27, 2003
+ * 
+ * To change this generated comment go to Window>Preferences>Java>Code
+ * Generation>Code and Comments
+ */
+package org.eclipse.jst.ejb.ui.internal.actions;
+
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.jst.ejb.ui.internal.wizard.EJBComponentImportWizard;
+import org.eclipse.jst.j2ee.internal.actions.BaseAction;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPlugin;
+import org.eclipse.swt.widgets.Shell;
+
+
+/**
+ * @author jsholl
+ * 
+ * To change this generated comment go to Window>Preferences>Java>Code Generation>Code and Comments
+ */
+public class ImportEJBAction extends BaseAction {
+	public static String LABEL = EJBArchiveUIResourceHandler.getString("Import_EJBJar"); //$NON-NLS-1$
+	private static final String ICON = "import_ejbjar_wiz"; //$NON-NLS-1$
+
+	public ImportEJBAction() {
+		super();
+		setText(LABEL);
+		setImageDescriptor(J2EEUIPlugin.getDefault().getImageDescriptor(ICON));
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jst.j2ee.internal.common.actions.BaseAction#primRun(org.eclipse.swt.widgets.Shell)
+	 */
+	@Override
+	protected void primRun(Shell shell) {
+
+		EJBComponentImportWizard wizard = new EJBComponentImportWizard();
+
+		J2EEUIPlugin plugin = J2EEUIPlugin.getDefault();
+
+		wizard.init(plugin.getWorkbench(), StructuredSelection.EMPTY);
+
+		WizardDialog dialog = new WizardDialog(shell, wizard);
+		dialog.create();
+		dialog.open();
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/actions/NewEJBComponentAction.java b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/actions/NewEJBComponentAction.java
new file mode 100644
index 0000000..b387abe
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/actions/NewEJBComponentAction.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.ejb.ui.internal.actions;
+
+
+
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.jst.ejb.ui.internal.util.EJBUIMessages;
+import org.eclipse.jst.ejb.ui.project.facet.EjbProjectWizard;
+import org.eclipse.jst.j2ee.internal.actions.AbstractOpenWizardWorkbenchAction;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPlugin;
+import org.eclipse.ui.IWorkbench;
+
+
+
+
+public class NewEJBComponentAction extends AbstractOpenWizardWorkbenchAction {
+
+	// TODO MDE 02-28 Find correct label
+	public static String LABEL = EJBUIMessages.NewEJBModuleAction;
+	private static final String ICON = "newejbprj_wiz"; //$NON-NLS-1$
+
+	public NewEJBComponentAction() {
+		setText(LABEL);
+		setImageDescriptor(J2EEUIPlugin.getDefault().getImageDescriptor(ICON));
+	}
+
+	public NewEJBComponentAction(IWorkbench workbench, String label, Class[] acceptedTypes) {
+		super(workbench, label, acceptedTypes, false);
+		setImageDescriptor(J2EEUIPlugin.getDefault().getImageDescriptor(ICON));
+	}
+
+	@Override
+	protected Wizard createWizard() {
+		return new EjbProjectWizard();
+	}
+
+	@Override
+	protected boolean shouldAcceptElement(Object obj) {
+		return true; /* NewGroup.isOnBuildPath(obj) && !NewGroup.isInArchive(obj); */
+	}
+
+	@Override
+	protected String getDialogText() {
+		return null;
+	}
+	
+	@Override
+	public String getId() {
+		return EJBUIMessages.NewEJBModuleAction;
+	}
+}
diff --git a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/deployables/EJBDeployableArtifactAdapterFactory.java b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/deployables/EJBDeployableArtifactAdapterFactory.java
new file mode 100644
index 0000000..8d91327
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/deployables/EJBDeployableArtifactAdapterFactory.java
@@ -0,0 +1,36 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 IBM 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: IBM Corporation - initial API and implementation
+ **************************************************************************************************/
+
+/*
+ * Created on Jan 18, 2005
+ */
+package org.eclipse.jst.ejb.ui.internal.deployables;
+
+import org.eclipse.core.runtime.IAdapterFactory;
+import org.eclipse.debug.ui.actions.ILaunchable;
+import org.eclipse.jst.j2ee.ejb.internal.deployables.EJBDeployableArtifactAdapterUtil;
+import org.eclipse.wst.server.core.IModuleArtifact;
+import org.eclipse.wst.server.core.model.ModuleArtifactAdapterDelegate;
+
+public class EJBDeployableArtifactAdapterFactory extends ModuleArtifactAdapterDelegate implements IAdapterFactory {
+
+	public Object getAdapter(Object adaptableObject, Class adapterType) {
+      return null;
+	}
+
+	public Class[] getAdapterList() {
+		return new Class[]{ILaunchable.class};
+	}
+
+	@Override
+	public IModuleArtifact getModuleArtifact(Object obj) {
+		return EJBDeployableArtifactAdapterUtil.getModuleObject(obj);
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/extension/EJBClientActionExtension.java b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/extension/EJBClientActionExtension.java
new file mode 100644
index 0000000..879dcaa
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/extension/EJBClientActionExtension.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) 2011 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.ejb.ui.internal.extension;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.jst.ejb.ui.internal.plugin.EJBUIPlugin;
+
+public class EJBClientActionExtension {
+	public static final String EJB_CLIENT_CREATION_EXTENSION = "ejbClientActionExtension"; //$NON-NLS-1$
+	public static final String ATT_ID = "id"; //$NON-NLS-1$
+	public static final String ATT_CLASS = "class"; //$NON-NLS-1$
+	public static final String ACTION = "action"; //$NON-NLS-1$
+	private String id = null;
+	private IConfigurationElement element;
+	private IEJBClientActionExtender instance;
+	private boolean errorCondition = false;
+
+	public EJBClientActionExtension(IConfigurationElement newExtension) {
+		if (!ACTION.equals(newExtension.getName()))
+		{
+			throw new IllegalArgumentException("Extensions must be of the type \"" + ACTION + "\".");  //$NON-NLS-1$//$NON-NLS-2$
+		}
+		element = newExtension;
+		init();
+	}
+
+	private void init() {
+		id = element.getAttribute(ATT_ID);
+	}
+
+	public String getId()
+	{
+		return id;
+	}
+
+	public IEJBClientActionExtender getInstance()
+	{
+		try
+		{
+			if (instance == null && !errorCondition)
+			{
+				instance = (IEJBClientActionExtender) element.createExecutableExtension(ATT_CLASS);
+			}
+		}
+		catch (Throwable e)
+		{
+			EJBUIPlugin.logError(e);
+			errorCondition = true;
+		}
+		return instance;
+	}
+}
diff --git a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/extension/EJBClientActionRegistryReader.java b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/extension/EJBClientActionRegistryReader.java
new file mode 100644
index 0000000..a74fc85
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/extension/EJBClientActionRegistryReader.java
@@ -0,0 +1,92 @@
+/*******************************************************************************
+ * Copyright (c) 2011 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.ejb.ui.internal.extension;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.jst.ejb.ui.internal.plugin.EJBUIPlugin;
+import org.eclipse.wst.common.core.util.RegistryReader;
+
+public class EJBClientActionRegistryReader extends RegistryReader {
+	private static EJBClientActionRegistryReader instance;
+	private List<EJBClientActionExtension> ejbClientCreationExtensions;
+
+	public EJBClientActionRegistryReader() {
+		super(EJBUIPlugin.PLUGIN_ID, EJBClientActionExtension.EJB_CLIENT_CREATION_EXTENSION);
+	}
+
+	@Override
+	public boolean readElement(IConfigurationElement element) {
+		if (EJBClientActionExtension.ACTION.equals(element.getName()))
+		{
+			addExtension(element);
+			return true;
+		}
+		return false;
+	}
+
+	/**
+	 * Sets the extension point.
+	 * 
+	 * @param extensions
+	 *            The extensions to set
+	 */
+	protected void addExtension(IConfigurationElement newExtension) {
+		getEJBClientActionExtensions().add(new EJBClientActionExtension(newExtension));
+	}
+
+	/**
+	 * @return Returns the handlerExtensions.
+	 */
+	protected List<EJBClientActionExtension> getEJBClientActionExtensions()
+	{
+		if (ejbClientCreationExtensions == null)
+		{
+			ejbClientCreationExtensions = new ArrayList<EJBClientActionExtension>();
+		}
+		return ejbClientCreationExtensions;
+	}
+
+	public List<IEJBClientActionExtender> getEJBClientActionExtenders()
+	{
+		List<IEJBClientActionExtender> retVal = new ArrayList<IEJBClientActionExtender>();
+		Iterator<EJBClientActionExtension> i = getEJBClientActionExtensions().iterator();
+		IEJBClientActionExtender current = null;
+		while (i.hasNext())
+		{
+			current = i.next().getInstance();
+			if (current != null)
+			{
+				retVal.add(current);
+			}
+		}
+		
+		return retVal;
+	}
+
+	/**
+	 * Gets the instance.
+	 * 
+	 * @return Returns an EJBClientCreationRegistryReader
+	 */
+	public static EJBClientActionRegistryReader getInstance()
+	{
+		if (instance == null)
+		{
+			instance = new EJBClientActionRegistryReader();
+			instance.readRegistry();
+		}
+		return instance;
+	}
+}
diff --git a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/extension/IEJBClientActionExtender.java b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/extension/IEJBClientActionExtender.java
new file mode 100644
index 0000000..3feb508
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/extension/IEJBClientActionExtender.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2011 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.ejb.ui.internal.extension;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.swt.widgets.Shell;
+
+public interface IEJBClientActionExtender {
+	/**
+	 * Check to see if an extension is capable of creating an EJB Client jar project for the selected EJB project
+	 * 
+	 * @param project - the EJB Project for which an EJB Client is to be created
+	 * @return true if the extender can create an EJB Client jar project for this EJB project
+	 */
+	boolean allowEJBClientCreation(IProject project);
+
+	/**
+	 * Launch the appropriate wizard (or action if no UI) to create an EJB Client jar for the selected EJB project
+	 * 
+	 * @param shell - the current shell
+	 * @param project - the EJB Project for which an EJB Client is to be created
+	 * @return Window.OK if the wizard completed successfully
+	 */
+	int showEJBClientCreationWizard(Shell shell, IProject project);
+
+	/**
+	 * Check to see if an extension is capable of removing an EJB Client jar project from the selected EJB project
+	 * 
+	 * @param project - the EJB Project for which an EJB Client is to be removed
+	 * @return true if the extender can remove an EJB Client jar project from this EJB project
+	 */
+	boolean allowEJBClientRemoval(IProject project);
+
+	/**
+	 * Launch the appropriate wizard (or action if no UI) to remove an EJB Client jar from the selected EJB project
+	 * 
+	 * @param shell - the current shell
+	 * @param project - the EJB Project from which an EJB Client is to be removed
+	 * @return Window.OK if the wizard completed successfully
+	 */
+	IStatus performEJBClientRemoval(Shell shell, IProject project);
+}
diff --git a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/plugin/EJBUIPlugin.java b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/plugin/EJBUIPlugin.java
new file mode 100644
index 0000000..32ee8cb
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/plugin/EJBUIPlugin.java
@@ -0,0 +1,120 @@
+/***************************************************************************************************
+ * Copyright (c) 2004, 2005 IBM 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: IBM Corporation - initial API and implementation
+ **************************************************************************************************/
+
+/*
+ * Created on Nov 15, 2004
+ */
+package org.eclipse.jst.ejb.ui.internal.plugin;
+
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+
+/**
+ * @author jlanuti
+ */
+public class EJBUIPlugin extends AbstractUIPlugin {
+	
+	public static final String PLUGIN_ID = "org.eclipse.jst.ejb.ui"; //$NON-NLS-1$
+	
+	//	The shared instance.
+	private static EJBUIPlugin plugin;
+
+	/**
+	 * The constructor.
+	 */
+	public EJBUIPlugin() {
+		super();
+		plugin = this;
+	}
+	
+
+	/**
+	 * Returns the shared instance.
+	 */
+	public static EJBUIPlugin getDefault() {
+		return plugin;
+	}
+
+	/**
+	 * Returns the workspace instance.
+	 */
+	public static IWorkspace getWorkspace() {
+		return ResourcesPlugin.getWorkspace();
+	}
+
+	/**
+	 * Create a new IStatus with a severity using the EJBUIPlugin ID. aCode is just an internal code.
+	 */
+	public static IStatus createStatus(int severity, int aCode, String aMessage, Throwable exception) {
+		return new Status(severity, PLUGIN_ID, aCode, aMessage, exception);
+	}
+
+	public static IStatus createStatus(int severity, String message, Throwable exception) {
+		return new Status(severity, PLUGIN_ID, message, exception);
+	}
+
+	public static IStatus createStatus(int severity, String message) {
+		return createStatus(severity, message, null);
+	}
+	
+	public static IStatus createErrorStatus(int aCode, String aMessage, Throwable exception) {
+		return createStatus(IStatus.ERROR, aCode, aMessage != null ? aMessage : exception.toString(), exception);
+	}
+	
+	/**
+	 * Record an error against this plugin's log. 
+	 * 
+	 * @param aCode
+	 * @param aMessage
+	 * @param anException
+	 */
+	public static void logError(int aCode, String aMessage,
+			Throwable anException) {
+		getDefault().getLog().log(
+				createErrorStatus(aCode, aMessage, anException));
+	}
+
+	/**
+	 * 
+	 * Record a message against this plugin's log. 
+	 * 
+	 * @param severity
+	 * @param aCode
+	 * @param aMessage
+	 * @param exception
+	 */
+	public static void log(int severity, int aCode, String aMessage,
+			Throwable exception) {
+		log(createStatus(severity, aCode, aMessage, exception));
+	}
+
+	/**
+	 * 
+	 * Record a status against this plugin's log. 
+	 * 
+	 * @param aStatus
+	 */
+	public static void log(IStatus aStatus) {
+		getDefault().getLog().log(aStatus);
+	}
+
+	public static void logError(Throwable exception) {
+		Platform.getLog(Platform.getBundle(PLUGIN_ID)).log( createStatus(IStatus.ERROR, exception.getMessage(), exception));
+	}
+
+	public static void logError(CoreException exception) {
+		Platform.getLog(Platform.getBundle(PLUGIN_ID)).log( exception.getStatus() );
+	} 
+	
+}
diff --git a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/quickfixes/ejb/CreateBeanQuickFix.java b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/quickfixes/ejb/CreateBeanQuickFix.java
new file mode 100644
index 0000000..2d8fe83
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/quickfixes/ejb/CreateBeanQuickFix.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2010 SAP AG 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:
+ *     SAP AG - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.ejb.ui.internal.quickfixes.ejb;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.jst.ejb.ui.internal.wizard.AddMessageDrivenBeanWizard;
+import org.eclipse.jst.ejb.ui.internal.wizard.AddSessionBeanWizard;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IMarkerResolution;
+import org.eclipse.ui.IWorkbenchWizard;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.wst.common.componentcore.internal.operation.IArtifactEditOperationDataModelProperties;
+import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizard;
+
+@SuppressWarnings("restriction")
+public class CreateBeanQuickFix implements IMarkerResolution {
+	
+	public static enum BEAN_TYPE {
+		SESSION,
+		MESSAGE_DRIVEN
+	}
+	
+	private BEAN_TYPE beanType;
+	private IProject project;
+
+	public CreateBeanQuickFix(BEAN_TYPE bType, IProject proj) {
+		this.beanType = bType;
+		this.project = proj;
+	}
+	
+	public String getLabel() {
+		return (beanType == BEAN_TYPE.SESSION) ? 
+					Messages.CREATE_NEW_SESSION_BEAN : 
+					Messages.CREATE_NEW_MDB; 
+	}
+
+	public void run(IMarker marker) {
+		Runnable r = new Runnable() {
+			public void run() {
+				openNewBeanWizard();
+			}
+		};
+		Display.getDefault().asyncExec(r);
+	}
+
+	private void openNewBeanWizard() {
+		DataModelWizard wizard = (beanType == BEAN_TYPE.SESSION) ? 
+					new AddSessionBeanWizard() : 
+					new AddMessageDrivenBeanWizard();
+		wizard.getDataModel().setStringProperty(IArtifactEditOperationDataModelProperties.COMPONENT_NAME, project.getName());
+		((IWorkbenchWizard) wizard).init(PlatformUI.getWorkbench(), new StructuredSelection(project));
+		WizardDialog dialog = new WizardDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), wizard);
+		dialog.open();	
+	}	
+	
+}
diff --git a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/quickfixes/ejb/Messages.java b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/quickfixes/ejb/Messages.java
new file mode 100644
index 0000000..58312e0
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/quickfixes/ejb/Messages.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2010 SAP AG 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:
+ *     SAP AG - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.ejb.ui.internal.quickfixes.ejb;
+
+import org.eclipse.osgi.util.NLS;
+
+
+public class Messages extends NLS {
+
+	private static final String BUNDLE_NAME = "org.eclipse.jst.ejb.ui.internal.quickfixes.ejb.messages"; //$NON-NLS-1$
+	
+
+	private Messages() {
+		// Do not instantiate
+	}
+	
+	public static String CREATE_NEW_SESSION_BEAN;
+	public static String CREATE_NEW_MDB;
+
+	static {
+		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+	}
+}
diff --git a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/quickfixes/ejb/NoBeansQuickFixer.java b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/quickfixes/ejb/NoBeansQuickFixer.java
new file mode 100644
index 0000000..af74cab
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/quickfixes/ejb/NoBeansQuickFixer.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2010 SAP AG 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:
+ *     SAP AG - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.ejb.ui.internal.quickfixes.ejb;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.ui.IMarkerResolution;
+import org.eclipse.ui.IMarkerResolutionGenerator2;
+
+public class NoBeansQuickFixer implements IMarkerResolutionGenerator2  {
+
+	public IMarkerResolution[] getResolutions(IMarker marker) {
+        return new IMarkerResolution[] {
+        		new CreateBeanQuickFix(CreateBeanQuickFix.BEAN_TYPE.SESSION, (IProject)marker.getResource()),
+        		new CreateBeanQuickFix(CreateBeanQuickFix.BEAN_TYPE.MESSAGE_DRIVEN, (IProject)marker.getResource())
+        };
+    }
+
+	public boolean hasResolutions(IMarker marker) {
+		return true;
+	}
+	
+}
diff --git a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/quickfixes/ejb/messages.properties b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/quickfixes/ejb/messages.properties
new file mode 100644
index 0000000..4cedaad
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/quickfixes/ejb/messages.properties
@@ -0,0 +1,13 @@
+###############################################################################
+# Copyright (c) 2010 SAP AG 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:
+#     SAP AG - initial API and implementation
+###############################################################################
+CREATE_NEW_SESSION_BEAN=Create a new session bean
+CREATE_NEW_MDB=Create a new message driven bean
+
diff --git a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/util/EJBUIMessages.java b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/util/EJBUIMessages.java
new file mode 100644
index 0000000..41e4d0b
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/util/EJBUIMessages.java
@@ -0,0 +1,153 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2014 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *     Oracle - EJB Timer
+ *******************************************************************************/
+package org.eclipse.jst.ejb.ui.internal.util;
+
+import org.eclipse.osgi.util.NLS;
+
+
+public class EJBUIMessages extends NLS {
+	
+	private static final String BUNDLE_NAME = "ejb_ui";//$NON-NLS-1$
+
+	private EJBUIMessages() {
+		// Do not instantiate
+	}
+
+	public static String KEY_0;
+	public static String KEY_1;
+	public static String KEY_2;
+	public static String KEY_3;
+	public static String KEY_4;
+	public static String KEY_5;
+	public static String KEY_6;
+	public static String KEY_7;
+	public static String KEY_8;
+	public static String KEY_9;
+	public static String KEY_10;
+	public static String KEY_11;
+	public static String KEY_12;
+	public static String KEY_13;
+	public static String KEY_14;
+	public static String KEY_15;
+	public static String KEY_16;
+	public static String KEY_17;
+	public static String KEY_18;
+	public static String KEY_19;
+	public static String KEY_20;
+	public static String KEY_21;
+	public static String KEY_22;
+	public static String KEY_23;
+	public static String KEY_24;
+	public static String KEY_25;
+	public static String KEY_26;
+	public static String KEY_27;
+	public static String KEY_28;
+	public static String GroupedEJBJarItemProvider_UI_0;
+	public static String GroupedEJBJarItemProvider_UI_1;
+	public static String GroupedEJBJarItemProvider_UI_2;
+	public static String NewEJBModuleAction_UI_0;
+	public static String pageTitle;
+	public static String pageDescription;
+	public static String configFolderLabel;
+	
+	//common
+	public static String NEW_JAVA_CLASS_DESTINATION_WIZARD_PAGE_DESC;
+	public static String NEW_JAVA_CLASS_OPTIONS_WIZARD_PAGE_DESC;
+	
+	//EnterpriseBeans
+	public static String ADD_SESSION_BEAN_WIZARD_PAGE_TITLE;
+	public static String STATE_TYPE_LABEL;
+	public static String CREATE_BUSINESS_INTERFACE;
+	public static String REMOTE_BUSINESS_INTERFACE;
+	public static String REMOTE_BUSINESS_INTERFACE_E;
+	public static String REMOTE_BUSINESS_INTERFACE_LABEL;
+	public static String REMOTE_HOME_INTERFACE_LABEL;
+	public static String LOCAL_BUSINESS_INTERFACE;
+	public static String LOCAL_BUSINESS_INTERFACE_LABEL;
+	public static String LOCAL_HOME_INTERFACE_LABEL;
+	public static String NO_INTERFACE;
+	public static String EJB_NAME;
+	public static String TRANSACTION_TYPE_CONTAINER;
+	public static String TRANSACTION_TYPE_BEAN;
+	public static String STATE_TYPE_STATELESS;
+	public static String STATE_TYPE_STATEFUL;
+	public static String chooseInterface;
+	public static String addAs;
+	public static String HOMECOMPONENTINTERFACE;
+	public static String MAPPED_NAME;
+	public static String TRANSACTION_TYPE;
+	public static String BUSSINESS_INTERFACE;
+	public static String ADD_INTERFACES;
+	public static String REMOVE_INTERFACES;
+	public static String ADD_SESSION_BEAN_WIZARD_PAGE_DESC;
+	public static String ADD_MESSAGE_DRIVEN_BEAN_WIZARD_PAGE_TITLE;
+	public static String DESTINATION_LABEL;
+	public static String DESTINATION_TYPE_QUEUE;
+	public static String DESTINATION_TYPE_TOPIC;
+	public static String JMS;
+	public static String DESTINATION_NAME_LABEL;
+	public static String ADD_MESSAGE_DRIVEN_BEAN_WIZARD_PAGE_DESC;
+	public static String MESSAGE_LISTENER_INTERFACE_HYPERLINK;
+	public static String MESSAGE_LISTENER_INTERFACE_HYPERLINK_TOOLTIP;
+	public static String CLICK_TO_SELECT;
+	public static String LOCAL_COMPONENT_INTERFACE_CODE;
+	public static String LOCAL_HOME_INTERFACE_CODE;
+	public static String REMOTE_COMPONENT_INTERFACE_CODE;
+	public static String REMOTE_HOME_INTERFACE_CODE;
+	public static String LOCAL_COMPONENT_INTERFACE_TOOLTIP;
+	public static String LOCAL_HOME_INTERFACE_TOOLTIP;
+	public static String REMOTE_COMPONENT_INTERFACE_TOOLTIP;
+	public static String REMOTE_HOME_INTERFACE_TOOLTIP;
+	public static String EJB_CLIENT_JAR_GROUP;
+	public static String ASYNC;
+
+	//EJB Timer
+    public static String timerWizardTitle;
+    public static String timerWizardDescription;
+    public static String timerScheduleLabel;
+    public static String NON_PERSISTENT;
+
+	static {
+		NLS.initializeMessages(BUNDLE_NAME, EJBUIMessages.class);
+	}
+	
+	public static final String IMAGE_LOAD_ERROR = KEY_0;
+	public static final String EJB_PROJECT_WIZ_TITLE = KEY_1;
+	public static final String EJB_VERSION_LBL = KEY_2;
+	public static final String EJB_PROJECT_MAIN_PG_TITLE = KEY_3;
+	public static final String EJB_PROJECT_MAIN_PG_DESC = KEY_4;
+	public static final String EJB_IMPORT_MAIN_PG_DESC = KEY_5;
+	public static final String EJB_IMPORT_MAIN_PG_TITLE = KEY_6;
+	public static final String EJB_JAR_FILE_LBL = KEY_7;
+	public static final String EJB_PROJECT_LBL = KEY_8;
+	public static final String EJB_EXPORT_MAIN_PG_TITLE = KEY_9;
+	public static final String EJB_EXPORT_MAIN_PG_DESC = KEY_10;
+	public static final String EJB_Client_Title = KEY_11;
+	public static final String EJB_Client_Desc = KEY_12;
+	public static final String Client_JAR_URI = KEY_13;
+	public static final String Project_name = KEY_14;
+	public static final String Project_location = KEY_15;
+	public static final String EJB_Project = KEY_16;
+	public static final String DELETE_BEAN_ONLY = KEY_17;
+	public static final String Delete_Bean_Classes_UI = KEY_18;
+	public static final String Delete_Access_Bean = KEY_19;
+	public static final String Delete_Deployed_Code = KEY_20;
+	public static final String Select_All_UI = KEY_21;
+	public static final String Deselect_All_UI = KEY_22;
+	public static final String The_selected_Enterprise_Be = KEY_23;
+	public static final String Delete = KEY_24;
+	public static final String Cannot_delete_Enterprise_B = KEY_25;
+	public static final String Cannot_delete_bean = KEY_26;
+	public static final String Delete_Enterprise_Beans = KEY_27;
+	public static final String Delete_Options_Query = KEY_27;
+	public static final String NewEJBModuleAction = NewEJBModuleAction_UI_0;
+}
diff --git a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/AddButtonListener.java b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/AddButtonListener.java
new file mode 100644
index 0000000..255ca10
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/AddButtonListener.java
@@ -0,0 +1,163 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 SAP AG 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:
+ * Kaloyan Raev, kaloyan.raev@sap.com - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.ejb.ui.internal.wizard;
+
+import static org.eclipse.jst.j2ee.internal.common.operations.INewJavaClassDataModelProperties.INTERFACES;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IPackageFragmentRoot;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.core.search.IJavaSearchConstants;
+import org.eclipse.jdt.core.search.IJavaSearchScope;
+import org.eclipse.jdt.core.search.SearchEngine;
+import org.eclipse.jdt.ui.dialogs.TypeSelectionExtension;
+import org.eclipse.jface.operation.IRunnableContext;
+import org.eclipse.jst.ejb.ui.internal.util.EJBUIMessages;
+import org.eclipse.jst.j2ee.ejb.internal.operations.BusinessInterface;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+public class AddButtonListener implements SelectionListener {
+
+	private static final String SEARCH_FILTER = "**"; //$NON-NLS-1$
+	private static final String EMPTY = ""; //$NON-NLS-1$
+	
+	private AddSessionBeanWizardPage page;
+	private IDataModel model;
+	
+	public AddButtonListener(AddSessionBeanWizardPage page, IDataModel model) {
+		this.page = page;
+		this.model = model;
+	}
+	
+	public void widgetSelected(SelectionEvent e) {
+		BusinessInterface iface = chooseEnclosingType(getRoots(), new String[] { "All_APIs" },  //$NON-NLS-1$
+				page.getShell(), page.getWizard().getContainer(),
+				IJavaSearchConstants.INTERFACE, EMPTY);
+		
+		if (iface != null) {
+			IType type = iface.getJavaType();
+			if (type != null) {
+				String text = type.getFullyQualifiedName();
+				List<BusinessInterface> biList = (List<BusinessInterface>) model.getProperty(INTERFACES);
+				if (!hasInterface(text, biList)) {
+					biList.add(iface);
+					model.setProperty(INTERFACES, biList);
+					model.notifyPropertyChange(INTERFACES, IDataModel.VALUE_CHG);
+					page.updateBusinessInterfacesList();
+				}
+			}
+		}
+	}
+	
+	private IPackageFragmentRoot[] getRoots() {
+		return null;
+	}
+	
+	public BusinessInterface chooseEnclosingType(
+			IPackageFragmentRoot[] root,
+			String[] jdkTypes, 
+			Shell shell, 
+			IRunnableContext container,
+			int type, 
+			String currentSelection) {
+		
+		BusinessInterface ret = null;
+		String currSelection = SEARCH_FILTER;
+		IJavaSearchScope scope = buildJavaSearchScope(root, jdkTypes);
+
+        if (currentSelection != null && !currentSelection.equals(EMPTY)) {
+            currSelection = currentSelection;
+        }
+        TypeSelectionExtension selectionExtension = createTypeSelectionExtension();
+		BusinessInterfaceSelectionDialog dialog = new BusinessInterfaceSelectionDialog(shell, false, null, scope, type,
+				selectionExtension);
+        dialog.setTitle(EJBUIMessages.chooseInterface);
+        dialog.setMessage(EJBUIMessages.chooseInterface);
+        dialog.setInitialPattern(currSelection);
+        if (dialog.open() == BusinessInterfaceSelectionDialog.OK) {
+            ret = dialog.getResult()[0];
+        }
+        
+        return ret;
+    }
+	
+	public boolean hasInterface(String text, List<BusinessInterface> biList) {
+		
+        for (Iterator<BusinessInterface> i = biList.iterator(); i.hasNext(); ) {
+            BusinessInterface element = i.next();
+            if (element.getFullyQualifiedName().equals(text)) {
+            	return true;
+            }
+        }
+        return false;
+    }
+
+	public void widgetDefaultSelected(SelectionEvent e) {
+	}
+	
+	private static IJavaSearchScope buildJavaSearchScope(IPackageFragmentRoot[] root, String[] jdkTypes) {
+        IJavaProject project = null;
+        ArrayList<IPackageFragmentRoot> pkgRoots = new ArrayList<IPackageFragmentRoot>();
+
+        if (root != null) {
+            if (root.length == 1 && (root[0] != null)) {
+                project = root[0].getJavaProject();
+                pkgRoots.add(root[0]);
+            } else
+                pkgRoots.addAll(Arrays.asList(root));
+        }
+        
+        if (jdkTypes != null) {
+            IJavaProject[] prjs = { project };
+            if (project == null) {
+            	IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
+            	List<IJavaProject> javaProjects = new ArrayList<IJavaProject>();
+            	for (IProject p : projects) {
+            		javaProjects.add(JavaCore.create(p));
+            	}
+            	prjs = javaProjects.toArray(new IJavaProject[javaProjects.size()]);
+            }
+
+            for (int i = 0; prjs != null && (i < prjs.length); i++) {
+                try {
+                    pkgRoots.addAll(Arrays.asList(prjs[i].getAllPackageFragmentRoots()));
+                } catch (JavaModelException e) {
+                    continue;
+                }
+            }
+        }
+
+        IPackageFragmentRoot[] roots = new IPackageFragmentRoot[pkgRoots.size()];
+        try {
+            pkgRoots.toArray(roots);
+        } catch (ArrayStoreException e) {
+            return null;
+        }
+        
+        return SearchEngine.createJavaSearchScope(roots);
+    }
+	
+	private TypeSelectionExtension createTypeSelectionExtension() {
+		return new BusinessInterfaceSelectionExtension();
+	}
+}
diff --git a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/AddEjbTimerWizard.java b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/AddEjbTimerWizard.java
new file mode 100644
index 0000000..d9173a8
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/AddEjbTimerWizard.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Oracle 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:
+ * Ludovic Champenois ludo@java.net
+ *******************************************************************************/
+
+package org.eclipse.jst.ejb.ui.internal.wizard;
+
+import org.eclipse.jst.ejb.ui.internal.util.EJBUIMessages;
+import org.eclipse.jst.j2ee.ejb.internal.operations.AddEjbTimerDataModelProvider;
+import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider;
+
+@SuppressWarnings("restriction")
+/* 
+ * Java EE 6 EJB Timer wizard
+ */
+public class AddEjbTimerWizard extends NewEnterpriseBeanWizard {
+
+	public AddEjbTimerWizard() {
+		this(null);
+	}
+
+	public AddEjbTimerWizard(IDataModel model) {
+		super(model);
+		setWindowTitle(EJBUIMessages.timerWizardTitle);
+	}
+
+	@Override
+	protected void doAddPages() {
+		AddEjbTimerWizardPage page1 = new AddEjbTimerWizardPage(getDataModel(),
+				"page1", EJBUIMessages.timerWizardDescription, //$NON-NLS-1$
+				EJBUIMessages.timerWizardTitle, J2EEProjectUtilities.EJB);
+		addPage(page1);
+	}
+
+	@Override
+	protected IDataModelProvider getDefaultProvider() {
+		return new AddEjbTimerDataModelProvider();
+	}
+}
diff --git a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/AddEjbTimerWizardPage.java b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/AddEjbTimerWizardPage.java
new file mode 100644
index 0000000..3e211de
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/AddEjbTimerWizardPage.java
@@ -0,0 +1,79 @@
+/*******************************************************************************
+ * Copyright (c) 2011, 2014 Oracle 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:
+ * Ludovic Champenois ludo@java.net
+ * IBM - Async and Non-persistent support
+ *******************************************************************************/
+
+
+package org.eclipse.jst.ejb.ui.internal.wizard;
+
+import org.eclipse.jst.ejb.ui.internal.util.EJBUIMessages;
+import org.eclipse.jst.j2ee.ejb.internal.operations.AddEjbTimerDataModelProvider;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+@SuppressWarnings("restriction")
+/* 
+ * Java EE 6 EJB Timer wizard page
+ */
+public class AddEjbTimerWizardPage extends NewEnterpriseBeanClassWizardPage {
+
+	private Text scheduleText;
+	private Button nonPersistentCheckbox;
+
+	public AddEjbTimerWizardPage(IDataModel mode, String pageName,
+			String pageDesc, String pageTitle, String moduleType) {
+		super(mode, pageName, pageDesc, pageTitle, moduleType);
+	}
+
+	@Override
+	protected Composite createTopLevelComposite(Composite parent) {
+		Composite composite = super.createTopLevelComposite(parent);
+
+		addSeperator(composite, 3);
+		
+		new Label(composite, SWT.LEFT).setText(EJBUIMessages.timerScheduleLabel);
+		scheduleText = new Text(composite, SWT.MULTI | SWT.BORDER | SWT.WRAP /*| SWT.V_SCROLL*/);
+		GridData layoutData = new GridData(GridData.FILL_BOTH);
+		layoutData.verticalSpan = 2;
+		initializeDialogUnits(scheduleText);
+		layoutData.heightHint = convertHeightInCharsToPixels(2);
+		scheduleText.setLayoutData(layoutData);
+		synchHelper.synchText(scheduleText,
+				AddEjbTimerDataModelProvider.SCHEDULE, null);
+		
+		GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+		gd.horizontalSpan = 2;
+		nonPersistentCheckbox = new Button(composite, SWT.CHECK);
+		nonPersistentCheckbox.setLayoutData(gd);
+		nonPersistentCheckbox.setText(IEjbWizardConstants.NON_PERSISTENT);
+		synchHelper.synchCheckbox(nonPersistentCheckbox, 
+				AddEjbTimerDataModelProvider.NON_PERSISTENT, null);
+
+		return composite;
+	}
+	
+	@Override
+	protected String[] getValidationPropertyNames() {
+		String[] base = super.getValidationPropertyNames();
+		String[] result = new String[base.length + 2];
+		System.arraycopy(base, 0, result, 0, base.length);
+		result[base.length] = AddEjbTimerDataModelProvider.SCHEDULE;
+		result[base.length+1] = AddEjbTimerDataModelProvider.NON_PERSISTENT;
+		
+		return result;
+	}
+
+
+}
diff --git a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/AddEnterpriseBeanWizardPage.java b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/AddEnterpriseBeanWizardPage.java
new file mode 100644
index 0000000..da66f71
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/AddEnterpriseBeanWizardPage.java
@@ -0,0 +1,73 @@
+/*******************************************************************************
+ * Copyright (c) 2008 SAP AG 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:
+ * Kaloyan Raev, kaloyan.raev@sap.com - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.ejb.ui.internal.wizard;
+
+import static org.eclipse.jst.j2ee.internal.common.operations.INewJavaClassDataModelProperties.ABSTRACT_METHODS;
+import static org.eclipse.jst.j2ee.internal.common.operations.INewJavaClassDataModelProperties.CONSTRUCTOR;
+
+import org.eclipse.jst.j2ee.internal.plugin.J2EEUIMessages;
+import org.eclipse.jst.j2ee.internal.wizard.NewJavaClassOptionsWizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+public class AddEnterpriseBeanWizardPage extends NewJavaClassOptionsWizardPage {
+	
+	public AddEnterpriseBeanWizardPage(IDataModel model, String pageName, String pageDesc, String pageTitle) {
+		super(model, pageName, pageDesc, pageTitle);
+	}
+	
+	@Override
+	protected void createStubsComposite(Composite parent) {
+		Label stubLabel = new Label(parent, SWT.NONE);
+		stubLabel.setText(J2EEUIMessages.JAVA_CLASS_METHOD_STUBS_LABEL);
+		GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+		data.horizontalSpan = 2;
+		stubLabel.setLayoutData(data);
+
+		Composite buttonCompo = new Composite(parent, SWT.NULL);
+		buttonCompo.setLayout(new GridLayout());
+		data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+		data.horizontalSpan = 2;
+		data.horizontalIndent = 15;
+		buttonCompo.setLayoutData(data);
+
+		inheritButton = new Button(buttonCompo, SWT.CHECK);
+		inheritButton.setText(J2EEUIMessages.JAVA_CLASS_INHERIT_CHECKBOX_LABEL);
+		synchHelper.synchCheckbox(inheritButton, ABSTRACT_METHODS, null);
+
+		constructorButton = new Button(buttonCompo, SWT.CHECK);
+		constructorButton.setText(J2EEUIMessages.JAVA_CLASS_CONSTRUCTOR_CHECKBOX_LABEL);
+		synchHelper.synchCheckbox(constructorButton, CONSTRUCTOR, null);
+	}
+
+	@Override
+	protected String[] getValidationPropertyNames() {
+		return null;
+	}
+
+	protected void addSeperator(Composite composite, int horSpan) {
+		GridData data = new GridData();
+		data.verticalAlignment = GridData.FILL;
+		data.horizontalAlignment = GridData.FILL;
+		data.widthHint = 300;
+		// Separator label
+		Label seperator = new Label(composite, SWT.HORIZONTAL | SWT.SEPARATOR);
+		data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+		data.horizontalSpan = horSpan;
+		seperator.setLayoutData(data);
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/AddMessageDrivenBeanWizard.java b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/AddMessageDrivenBeanWizard.java
new file mode 100644
index 0000000..7049db5
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/AddMessageDrivenBeanWizard.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2008 SAP AG 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:
+ * Kaloyan Raev, kaloyan.raev@sap.com - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.ejb.ui.internal.wizard;
+
+import java.net.URL;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jst.ejb.ui.context.ids.IEJBUIContextIds;
+import org.eclipse.jst.j2ee.ejb.internal.operations.NewMessageDrivenBeanClassDataModelProvider;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
+import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider;
+
+public class AddMessageDrivenBeanWizard extends NewEnterpriseBeanWizard {
+
+
+	private static final String PAGE_ONE = "pageOne"; //$NON-NLS-1$
+	private static final String PAGE_TWO = "pageTwo"; //$NON-NLS-1$
+	
+	private AddMessageDrivenBeanWizardPage page2;
+	private NewMessageDrivenBeanClassWizardPage page1;
+
+	public AddMessageDrivenBeanWizard(IDataModel model) {
+		super(model);
+		setWindowTitle(IEjbWizardConstants.ADD_MESSAGE_DRIVEN_BEANS_WIZARD_PAGE_TITLE);
+		setDefaultPageImageDescriptor(getWizBan());
+	}
+
+	private ImageDescriptor getWizBan() {
+		URL url = (URL) J2EEPlugin.getDefault().getImage("message_bean_wiz"); //$NON-NLS-1$
+		return ImageDescriptor.createFromURL(url);
+	}
+
+	public AddMessageDrivenBeanWizard() {
+		this(null);
+	}
+
+	@Override
+	protected void doAddPages() {
+		page1 = new NewMessageDrivenBeanClassWizardPage(
+				getDataModel(),
+				PAGE_ONE,
+				IEjbWizardConstants.NEW_JAVA_CLASS_DESTINATION_WIZARD_PAGE_DESC,
+				IEjbWizardConstants.ADD_MESSAGE_DRIVEN_BEANS_WIZARD_PAGE_TITLE, 
+				J2EEProjectUtilities.EJB);
+		page1.setInfopopID(IEJBUIContextIds.EJB_MESSAGE_BEAN_WIZARD_ADD_MESSAGE_BEAN_PAGE_1);
+		addPage(page1);
+		page2 = new AddMessageDrivenBeanWizardPage(getDataModel(), PAGE_TWO);
+		page2.setInfopopID(IEJBUIContextIds.EJB_MESSAGE_BEAN_WIZARD_ADD_MESSAGE_BEAN_PAGE_2);
+		addPage(page2);
+	}
+
+	@Override
+	protected IDataModelProvider getDefaultProvider() {
+		return new NewMessageDrivenBeanClassDataModelProvider();
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/AddMessageDrivenBeanWizardPage.java b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/AddMessageDrivenBeanWizardPage.java
new file mode 100644
index 0000000..6b6c2cd
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/AddMessageDrivenBeanWizardPage.java
@@ -0,0 +1,206 @@
+/*******************************************************************************
+ * Copyright (c) 2008 SAP AG 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:
+ * Kaloyan Raev, kaloyan.raev@sap.com - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.ejb.ui.internal.wizard;
+
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewEnterpriseBeanClassDataModelProperties.EJB_NAME;
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewEnterpriseBeanClassDataModelProperties.TRANSACTION_TYPE;
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewMessageDrivenBeanClassDataModelProperties.MESSAGE_LISTENER_INTERFACE;
+import static org.eclipse.jst.j2ee.internal.common.operations.INewJavaClassDataModelProperties.INTERFACES;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.search.IJavaSearchConstants;
+import org.eclipse.jdt.core.search.IJavaSearchScope;
+import org.eclipse.jdt.internal.ui.dialogs.FilteredTypesSelectionDialog;
+import org.eclipse.jem.workbench.utility.JemProjectUtilities;
+import org.eclipse.jface.operation.IRunnableContext;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jst.ejb.ui.internal.util.EJBUIMessages;
+import org.eclipse.jst.j2ee.internal.common.operations.INewJavaClassDataModelProperties;
+import org.eclipse.jst.j2ee.internal.dialogs.TypeSearchEngine;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEUIMessages;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.forms.HyperlinkGroup;
+import org.eclipse.ui.forms.events.HyperlinkAdapter;
+import org.eclipse.ui.forms.events.HyperlinkEvent;
+import org.eclipse.ui.forms.widgets.Hyperlink;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelPropertyDescriptor;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelSynchHelper;
+
+public class AddMessageDrivenBeanWizardPage extends
+		AddEnterpriseBeanWizardPage {
+
+	private class HyperlinkDataModelSynchHelper extends DataModelSynchHelper {
+
+		public HyperlinkDataModelSynchHelper(IDataModel model) {
+			super(model);
+		}
+		
+		public void synchHyperlink(Hyperlink hyperlink, String propertyName, Control[] dependentControls) {
+			synchComposite(hyperlink, propertyName, dependentControls);
+		}
+		
+		@Override
+		public void synchUIWithModel(final String propertyName, final int flag) {
+			if (MESSAGE_LISTENER_INTERFACE.equals(propertyName)) {
+				if(Thread.currentThread() == Display.getDefault().getThread()) {
+					setHyperlinkText();
+				} else {
+					Display.getDefault().asyncExec(new Runnable() {
+						public void run() {
+							setHyperlinkText();
+						}
+					});
+				}
+			} else if (INTERFACES.equals(propertyName)) {
+				if(Thread.currentThread() == Display.getDefault().getThread()) {
+					updateInterfaces();
+				} else {
+					Display.getDefault().asyncExec(new Runnable() {
+						public void run() {
+							updateInterfaces();
+						}
+					});
+				}
+			}
+			
+			super.synchUIWithModel(propertyName, flag);
+		}
+		
+		private void setHyperlinkText() {
+			if (null != messageListenerInterfaceHyperlink) {
+				String value = getDataModel().getStringProperty(MESSAGE_LISTENER_INTERFACE);
+				if (value == null || value.trim().length() == 0) {
+					value = IEjbWizardConstants.CLICK_TO_SELECT;
+				}
+				messageListenerInterfaceHyperlink.setText(value);
+			}
+		}
+
+		private void updateInterfaces() {
+			if (null != interfaceViewer) {
+				interfaceViewer.setInput(getDataModel().getProperty(INTERFACES));
+			}
+		}
+		
+	}
+
+	private Text ejbNameText;
+	private Combo transactionTypeCombo;
+
+	private Hyperlink messageListenerInterfaceHyperlink;
+
+	public AddMessageDrivenBeanWizardPage(IDataModel model, String pageName) {
+		super(model, pageName,
+				IEjbWizardConstants.ADD_MESSAGE_DRIVEN_BEAN_WIZARD_PAGE_DESC,
+				IEjbWizardConstants.ADD_MESSAGE_DRIVEN_BEANS_WIZARD_PAGE_TITLE);
+	}
+	
+	@Override
+	public DataModelSynchHelper initializeSynchHelper(IDataModel dm) {
+		return new HyperlinkDataModelSynchHelper(dm);
+	}
+
+	@Override
+	protected Composite createTopLevelComposite(Composite parent) {
+		Composite composite = new Composite(parent, SWT.NULL);
+		composite.setLayout(new GridLayout(2, false));
+		GridData data = new GridData(GridData.FILL_BOTH);
+		data.widthHint = 300;
+		composite.setLayoutData(data);
+		
+		createBeanNameTransactionType(composite);
+		addSeperator(composite, 2);
+		createInterfaceControls(composite);
+		createMessageListenerInterfaceControl(composite);
+		addSeperator(composite, 2);
+		createStubsComposite(composite);
+
+		return composite;
+	}
+	
+	private void createBeanNameTransactionType(Composite composite) {
+		// bean name
+		Label ejbNameLabel = new Label(composite, SWT.LEFT);
+		ejbNameLabel.setText(IEjbWizardConstants.EJB_NAME);
+
+		GridData data = new GridData();
+		data.horizontalAlignment = GridData.FILL;
+		data.grabExcessHorizontalSpace = true;
+
+		ejbNameText = new Text(composite, SWT.SINGLE | SWT.BORDER);
+		ejbNameText.setLayoutData(data);
+		synchHelper.synchText(ejbNameText, EJB_NAME, null);
+
+		// transaction type
+		Label transactionTypeLabel = new Label(composite, SWT.LEFT);
+		transactionTypeLabel.setText(EJBUIMessages.TRANSACTION_TYPE);
+		transactionTypeCombo = new Combo(composite, SWT.None | SWT.READ_ONLY);
+		transactionTypeCombo.setLayoutData(data);
+		DataModelPropertyDescriptor[] descriptors = model.getValidPropertyDescriptors(TRANSACTION_TYPE);
+		for (DataModelPropertyDescriptor descriptor : descriptors) {
+			transactionTypeCombo.add(descriptor.getPropertyDescription());
+		}
+		transactionTypeCombo.select(0);
+		synchHelper.synchCombo(transactionTypeCombo, TRANSACTION_TYPE, null);
+	}
+
+	private void createMessageListenerInterfaceControl(Composite composite) {
+		Label messageListenerInterfaceLabel = new Label(composite, SWT.LEFT);
+		messageListenerInterfaceLabel.setText(EJBUIMessages.MESSAGE_LISTENER_INTERFACE_HYPERLINK);
+		messageListenerInterfaceHyperlink = new Hyperlink(composite, SWT.NULL);
+		messageListenerInterfaceHyperlink.setToolTipText(IEjbWizardConstants.MESSAGE_LISTENER_INTERFACE_HYPERLINK_TOOLTIP);
+		messageListenerInterfaceHyperlink.setVisible(true);
+		messageListenerInterfaceHyperlink.setUnderlined(true);
+		messageListenerInterfaceHyperlink.addHyperlinkListener(new HyperlinkAdapter() {
+			@Override
+			public void linkActivated(HyperlinkEvent e){
+				IProject project = (IProject) model.getProperty(INewJavaClassDataModelProperties.PROJECT);
+				IRunnableContext context = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+				IJavaProject javaProject = JemProjectUtilities.getJavaProject(project);
+				// this eliminates the non-exported classpath entries
+				final IJavaSearchScope scope = TypeSearchEngine.createJavaSearchScopeForAProject(javaProject, true, true);
+				FilteredTypesSelectionDialog dialog = new FilteredTypesSelectionDialog(getShell(), false, context, scope, IJavaSearchConstants.INTERFACE);
+				dialog.setTitle(J2EEUIMessages.INTERFACE_SELECTION_DIALOG_TITLE);
+				if (dialog.open() == Window.OK) {
+					IType type = (IType) dialog.getFirstResult();
+					String fullyQualifiedName = type.getFullyQualifiedName();
+					getDataModel().setProperty(MESSAGE_LISTENER_INTERFACE, fullyQualifiedName);
+				}
+			}
+		});
+		new HyperlinkGroup(Display.getCurrent()).add(messageListenerInterfaceHyperlink);
+		((HyperlinkDataModelSynchHelper) synchHelper).synchHyperlink(messageListenerInterfaceHyperlink, MESSAGE_LISTENER_INTERFACE, null);
+	}
+
+	@Override
+	protected boolean showValidationErrorsOnEnter() {
+		return true;
+	}
+
+	@Override
+	protected String[] getValidationPropertyNames() {
+		return new String[] { MESSAGE_LISTENER_INTERFACE , EJB_NAME};
+	}
+
+}
+
diff --git a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/AddSessionBeanWizard.java b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/AddSessionBeanWizard.java
new file mode 100644
index 0000000..037b961
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/AddSessionBeanWizard.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 SAP AG 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:
+ * Kaloyan Raev, kaloyan.raev@sap.com - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.ejb.ui.internal.wizard;
+
+import java.net.URL;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jst.ejb.ui.context.ids.IEJBUIContextIds;
+import org.eclipse.jst.j2ee.ejb.internal.operations.NewSessionBeanClassDataModelProvider;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
+import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider;
+
+public class AddSessionBeanWizard extends NewEnterpriseBeanWizard {
+
+
+	private static final String PAGE_ONE = "pageOne"; //$NON-NLS-1$
+	private static final String PAGE_TWO = "pageTwo"; //$NON-NLS-1$
+	
+	private AddSessionBeanWizardPage page2;
+	private NewSessionBeanClassWizardPage page1;
+
+	public AddSessionBeanWizard(IDataModel model) {
+		super(model);
+		setWindowTitle(IEjbWizardConstants.ADD_SESSION_BEAN_WIZARD_PAGE_TITLE);
+		setDefaultPageImageDescriptor(getWizBan());
+	}
+
+	private ImageDescriptor getWizBan() {
+		URL url = (URL) J2EEPlugin.getDefault().getImage("session_bean_wiz"); //$NON-NLS-1$
+		return ImageDescriptor.createFromURL(url);
+	}
+
+	public AddSessionBeanWizard() {
+		this(null);
+	}
+
+	@Override
+	protected void doAddPages() {
+		page1 = new NewSessionBeanClassWizardPage(
+				getDataModel(),
+				PAGE_ONE,
+				IEjbWizardConstants.NEW_JAVA_CLASS_DESTINATION_WIZARD_PAGE_DESC,
+				IEjbWizardConstants.ADD_SESSION_BEAN_WIZARD_PAGE_TITLE, 
+				J2EEProjectUtilities.EJB);
+		page1.setInfopopID(IEJBUIContextIds.EJB_SESSION_BEAN_WIZARD_ADD_SESSION_BEAN_PAGE_1);
+		addPage(page1);
+		page2 = new AddSessionBeanWizardPage(getDataModel(), PAGE_TWO);
+		page2.setInfopopID(IEJBUIContextIds.EJB_SESSION_BEAN_WIZARD_ADD_SESSION_BEAN_PAGE_2);
+		addPage(page2);
+	}
+
+	@Override
+	protected IDataModelProvider getDefaultProvider() {
+		return new NewSessionBeanClassDataModelProvider();
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/AddSessionBeanWizardPage.java b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/AddSessionBeanWizardPage.java
new file mode 100644
index 0000000..0684159
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/AddSessionBeanWizardPage.java
@@ -0,0 +1,312 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 SAP AG 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:
+ * Kaloyan Raev, kaloyan.raev@sap.com - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.ejb.ui.internal.wizard;
+
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewEnterpriseBeanClassDataModelProperties.EJB_NAME;
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewEnterpriseBeanClassDataModelProperties.MAPPED_NAME;
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewEnterpriseBeanClassDataModelProperties.TRANSACTION_TYPE;
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewSessionBeanClassDataModelProperties.LOCAL;
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewSessionBeanClassDataModelProperties.LOCAL_COMPONENT_INTERFACE;
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewSessionBeanClassDataModelProperties.LOCAL_HOME;
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewSessionBeanClassDataModelProperties.LOCAL_HOME_INTERFACE;
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewSessionBeanClassDataModelProperties.REMOTE;
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewSessionBeanClassDataModelProperties.REMOTE_COMPONENT_INTERFACE;
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewSessionBeanClassDataModelProperties.REMOTE_HOME;
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewSessionBeanClassDataModelProperties.REMOTE_HOME_INTERFACE;
+import static org.eclipse.jst.j2ee.internal.common.operations.INewJavaClassDataModelProperties.INTERFACES;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+
+import org.eclipse.jdt.internal.ui.preferences.ScrolledPageContent;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jst.ejb.ui.internal.util.EJBUIMessages;
+import org.eclipse.jst.j2ee.ejb.internal.operations.BusinessInterface;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.forms.events.ExpansionAdapter;
+import org.eclipse.ui.forms.events.ExpansionEvent;
+import org.eclipse.ui.forms.widgets.ExpandableComposite;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelPropertyDescriptor;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+public class AddSessionBeanWizardPage extends AddEnterpriseBeanWizardPage {
+
+	private Text ejbNameText;
+	private Text mappedNameText;
+	private Combo transactionTypeCombo;
+	private Session2xInterfacesTable localIntfTable;
+	private Session2xInterfacesTable remoteIntfTable;
+
+	public AddSessionBeanWizardPage(IDataModel model, String pageName) {
+		super(model, pageName, IEjbWizardConstants.ADD_SESSION_BEAN_WIZARD_PAGE_DESC,
+				IEjbWizardConstants.ADD_SESSION_BEAN_WIZARD_PAGE_TITLE);
+	}
+
+	@Override
+	protected Composite createTopLevelComposite(Composite parent) {
+
+		ScrolledPageContent pageContent = new ScrolledPageContent(parent);
+		Composite composite = pageContent.getBody();
+		composite.setLayout(new GridLayout(3, false));
+
+		Label ejbNameLabel = new Label(composite, SWT.LEFT);
+		ejbNameLabel.setText(IEjbWizardConstants.EJB_NAME);
+
+		GridData data = new GridData();
+		data.horizontalAlignment = GridData.FILL;
+		data.horizontalSpan = 2;
+		data.grabExcessHorizontalSpace = true;
+
+		ejbNameText = new Text(composite, SWT.SINGLE | SWT.BORDER);
+		ejbNameText.setLayoutData(data);
+		synchHelper.synchText(ejbNameText, EJB_NAME, null);
+
+		Label ejbMappedNameLabel = new Label(composite, SWT.LEFT);
+		ejbMappedNameLabel.setText(EJBUIMessages.MAPPED_NAME);
+
+		mappedNameText = new Text(composite, SWT.SINGLE | SWT.BORDER);
+		mappedNameText.setLayoutData(data);
+		synchHelper.synchText(mappedNameText, MAPPED_NAME, null);
+
+		Label transactionTypeLabel = new Label(composite, SWT.LEFT);
+		transactionTypeLabel.setText(EJBUIMessages.TRANSACTION_TYPE);
+		transactionTypeCombo = new Combo(composite, SWT.None | SWT.READ_ONLY);
+		transactionTypeCombo.setLayoutData(data);
+
+		DataModelPropertyDescriptor[] descriptors = model.getValidPropertyDescriptors(TRANSACTION_TYPE);
+		for (DataModelPropertyDescriptor descriptor : descriptors) {
+			transactionTypeCombo.add(descriptor.getPropertyDescription());
+		}
+
+		transactionTypeCombo.select(0);
+		synchHelper.synchCombo(transactionTypeCombo, TRANSACTION_TYPE, null);
+
+		addSeperator(composite, 3);
+		createInterfaceControls(composite);
+		createExpandableComposite(composite);
+		createStubsComposite(composite);
+
+		return pageContent;
+	}
+
+	private ExpandableComposite createExpandableComposite(Composite composite) {
+		ExpandableComposite excomposite = new ExpandableComposite(composite, SWT.NONE, ExpandableComposite.TWISTIE
+				| ExpandableComposite.CLIENT_INDENT);
+		excomposite.setText(EJBUIMessages.HOMECOMPONENTINTERFACE);
+		excomposite.setExpanded(false);
+		excomposite.setFont(JFaceResources.getFontRegistry().getBold(JFaceResources.DIALOG_FONT));
+		excomposite.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, false, 3, 1));
+		excomposite.addExpansionListener(new ExpansionAdapter() {
+			@Override
+			public void expansionStateChanged(ExpansionEvent e) {
+				expandedStateChanged((ExpandableComposite) e.getSource());
+			}
+		});
+
+		Composite othersComposite = new Composite(excomposite, SWT.NONE);
+		excomposite.setClient(othersComposite);
+		othersComposite.setLayout(new GridLayout(2, false));
+		final Button local2xCheck = new Button(othersComposite, SWT.CHECK | SWT.TOP);
+		local2xCheck.setText(EJBUIMessages.LOCAL_BUSINESS_INTERFACE);
+
+		synchHelper.synchCheckbox(local2xCheck, LOCAL_HOME, null);
+
+		Session2xInterfacesTableRow localRow = new Session2xInterfacesTableRow(
+				EJBUIMessages.LOCAL_COMPONENT_INTERFACE_CODE, model.getStringProperty(LOCAL_COMPONENT_INTERFACE),
+				LOCAL_COMPONENT_INTERFACE);
+		Session2xInterfacesTableRow localRowHome = new Session2xInterfacesTableRow(
+				EJBUIMessages.LOCAL_HOME_INTERFACE_CODE, model.getStringProperty(LOCAL_HOME_INTERFACE),
+				LOCAL_HOME_INTERFACE);
+		Session2xInterfacesTableRow[] localTableRows = { localRow, localRowHome };
+		localIntfTable = new Session2xInterfacesTable(othersComposite, new String[0], model, localTableRows);
+		localIntfTable.getTable().setEnabled(model.getBooleanProperty(LOCAL_HOME));
+		GridData gridData = new GridData();
+		gridData.verticalAlignment = SWT.BEGINNING;
+		gridData.verticalSpan = 2;
+		gridData.verticalAlignment = SWT.BEGINNING;
+		gridData.verticalSpan = 1;
+		local2xCheck.addSelectionListener(new SelectionListener() {
+
+			public void widgetDefaultSelected(SelectionEvent e) {
+
+			}
+
+			public void widgetSelected(SelectionEvent e) {
+				localIntfTable.getTable().setEnabled(local2xCheck.getSelection());
+			}
+
+		});
+
+		final Button remote2xCheck = new Button(othersComposite, SWT.CHECK);
+		remote2xCheck.setText(EJBUIMessages.REMOTE_BUSINESS_INTERFACE_E);
+
+		synchHelper.synchCheckbox(remote2xCheck, REMOTE_HOME, null);
+
+		Session2xInterfacesTableRow remoteRow = new Session2xInterfacesTableRow(
+				EJBUIMessages.REMOTE_COMPONENT_INTERFACE_CODE, model.getStringProperty(REMOTE_COMPONENT_INTERFACE),
+				REMOTE_COMPONENT_INTERFACE);
+		Session2xInterfacesTableRow remoteRowHome = new Session2xInterfacesTableRow(
+				EJBUIMessages.REMOTE_HOME_INTERFACE_CODE, model.getStringProperty(REMOTE_HOME_INTERFACE),
+				REMOTE_HOME_INTERFACE);
+		Session2xInterfacesTableRow[] remoteTableRows = { remoteRow, remoteRowHome };
+		remoteIntfTable = new Session2xInterfacesTable(othersComposite, new String[0], model, remoteTableRows);
+		remoteIntfTable.getTable().setEnabled(model.getBooleanProperty(REMOTE_HOME));
+		remote2xCheck.addSelectionListener(new SelectionListener() {
+
+			public void widgetDefaultSelected(SelectionEvent e) {
+
+			}
+
+			public void widgetSelected(SelectionEvent e) {
+				remoteIntfTable.getTable().setEnabled(remote2xCheck.getSelection());
+			}
+
+		});
+
+		return excomposite;
+	}
+
+	@Override
+	protected void enter() {
+		super.enter();
+		updateBusinessInterfacesList();
+	}
+
+	@Override
+	protected IStructuredContentProvider getInterfaceContentProvider() {
+		return new BusinessInterfaceContentProvider();
+	}
+
+	@Override
+	protected ILabelProvider getInterfaceLabelProvider() {
+		return new BusinessInterfaceLabelProvider();
+	}
+
+	@Override
+	protected void handleInterfaceAddButtonSelected() {
+		AddButtonListener listener = new AddButtonListener(this, model);
+		listener.widgetSelected(null);
+	}
+ 	
+
+	@Override
+	protected void handleInterfaceRemoveButtonSelected() {
+		IStructuredSelection selection = (IStructuredSelection) interfaceViewer.getSelection();
+		Iterator iterator = selection.iterator();
+		while (iterator.hasNext()) {
+			BusinessInterface element = (BusinessInterface) iterator.next();
+			if (element.getJavaType() == null) {
+				if (element.isLocal())
+					model.setBooleanProperty(LOCAL, false);
+				else
+					model.setBooleanProperty(REMOTE, false);
+			} else {
+				removeInterfaceFromModel(element);
+			}
+		}
+		updateBusinessInterfacesList();
+	}
+
+	private void removeInterfaceFromModel(BusinessInterface element) {
+		Collection<BusinessInterface> biList = (Collection<BusinessInterface>) model.getProperty(INTERFACES);
+		biList.remove(element);
+		model.setProperty(INTERFACES, biList);
+		model.notifyPropertyChange(INTERFACES, IDataModel.VALUE_CHG);
+	}
+
+	public void updateBusinessInterfacesList() {
+		Object biList = getDataModel().getProperty(INTERFACES);
+		interfaceViewer.setInput(biList);
+	}
+	
+	public void updateInterfaces(){
+		if(localIntfTable != null){
+			ArrayList input = new ArrayList();
+			Session2xInterfacesTableRow localRow = new Session2xInterfacesTableRow(
+					EJBUIMessages.LOCAL_COMPONENT_INTERFACE_CODE, 
+					model.getStringProperty(LOCAL_COMPONENT_INTERFACE), 
+					LOCAL_COMPONENT_INTERFACE);
+			input.add(localRow);
+			Session2xInterfacesTableRow localRowHome = new Session2xInterfacesTableRow(
+					EJBUIMessages.LOCAL_HOME_INTERFACE_CODE, 
+					model.getStringProperty(LOCAL_HOME_INTERFACE), 
+					LOCAL_HOME_INTERFACE);
+			input.add(localRowHome);
+			localIntfTable.getTableViewer().setInput(input);
+			//localIntfTable.getTableViewer().refresh();
+		}
+		if(remoteIntfTable != null){
+			ArrayList input = new ArrayList();
+			Session2xInterfacesTableRow remoteRow = new Session2xInterfacesTableRow(
+					EJBUIMessages.REMOTE_COMPONENT_INTERFACE_CODE, 
+					model.getStringProperty(REMOTE_COMPONENT_INTERFACE), 
+					REMOTE_COMPONENT_INTERFACE);
+			input.add(remoteRow);
+			Session2xInterfacesTableRow remoteRowHome = new Session2xInterfacesTableRow(
+					EJBUIMessages.REMOTE_HOME_INTERFACE_CODE, 
+					model.getStringProperty(REMOTE_HOME_INTERFACE), 
+					REMOTE_HOME_INTERFACE);
+			input.add(remoteRowHome);
+			remoteIntfTable.getTableViewer().setInput(input);
+		}
+	}
+
+	@Override
+	protected void updateControls() {
+		super.updateControls();
+		updateBusinessInterfacesList();
+		updateInterfaces();
+	}
+
+	protected ScrolledPageContent getParentScrolledComposite(Control control) {
+		Control parent = control.getParent();
+		while (!(parent instanceof ScrolledPageContent) && parent != null) {
+			parent = parent.getParent();
+		}
+		if (parent instanceof ScrolledPageContent) {
+			return (ScrolledPageContent) parent;
+		}
+		return null;
+	}
+
+	protected final void expandedStateChanged(ExpandableComposite expandable) {
+		ScrolledPageContent parentScrolledComposite = getParentScrolledComposite(expandable);
+		if (parentScrolledComposite != null) {
+			parentScrolledComposite.reflow(true);
+		}
+	}
+
+	@Override
+	protected String[] getValidationPropertyNames() {
+		return new String[] { LOCAL_HOME_INTERFACE, REMOTE_HOME_INTERFACE, LOCAL_COMPONENT_INTERFACE,
+				REMOTE_COMPONENT_INTERFACE, EJB_NAME, INTERFACES };
+	}
+
+	@Override
+	protected boolean showValidationErrorsOnEnter() {
+		return true;
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/AlphaImageHelper.java b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/AlphaImageHelper.java
new file mode 100644
index 0000000..79b1454
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/AlphaImageHelper.java
@@ -0,0 +1,36 @@
+/***************************************************************************************************
+ * Copyright (c) 2003, 2004 IBM 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: IBM Corporation - initial API and implementation
+ **************************************************************************************************/
+package org.eclipse.jst.ejb.ui.internal.wizard;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.ImageData;
+
+public class AlphaImageHelper {
+
+	static protected Object createAlphaImage(Class clazz, String path) {
+		ImageDescriptor desc = ImageDescriptor.createFromFile(clazz, path);
+		Image image = desc.createImage();
+		ImageData mask = image.getImageData();
+		image.dispose();
+		image = new Image(null, mask.width, mask.height);
+		ImageData iData = image.getImageData();
+		image.dispose();
+
+		for (int x = 0; x < mask.width; x++)
+			for (int y = 0; y < mask.height; y++) {
+				int pixel = mask.getPixel(x, y);
+				int value = (255 - pixel % 256) / 2;
+				iData.setPixel(x, y, 0);
+				iData.setAlpha(x, y, value);
+			}
+		return new Image(null, iData);
+	}
+
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/BusinessInterfaceContentProvider.java b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/BusinessInterfaceContentProvider.java
new file mode 100644
index 0000000..84f1239
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/BusinessInterfaceContentProvider.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2007 SAP AG 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:
+ * Kaloyan Raev, kaloyan.raev@sap.com - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.ejb.ui.internal.wizard;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jst.j2ee.ejb.internal.operations.BusinessInterface;
+
+public class BusinessInterfaceContentProvider implements IStructuredContentProvider {
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
+	 */
+	public void dispose() {
+
+	}
+
+	public Object[] getElements(Object inputElement) {
+		if (inputElement instanceof BusinessInterface) {
+			return new BusinessInterface[] {(BusinessInterface) inputElement};
+		} else if (inputElement instanceof ArrayList) {
+			return ((List) inputElement).toArray();
+		}
+		return new Object[0];
+	}
+
+	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+	}
+}
diff --git a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/BusinessInterfaceLabelProvider.java b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/BusinessInterfaceLabelProvider.java
new file mode 100644
index 0000000..2a55a5b
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/BusinessInterfaceLabelProvider.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2007 SAP AG 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:
+ * Kaloyan Raev, kaloyan.raev@sap.com - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.ejb.ui.internal.wizard;
+
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jst.j2ee.ejb.internal.operations.BusinessInterface;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPlugin;
+import org.eclipse.swt.graphics.Image;
+
+public class BusinessInterfaceLabelProvider extends LabelProvider {
+
+	@Override
+	public Image getImage(Object element) {
+		if (element instanceof BusinessInterface) {
+			if (((BusinessInterface) element).isLocal()) {
+				return J2EEUIPlugin.getDefault().getImage("local_interface_overlay_obj"); //$NON-NLS-1$
+			}
+			return J2EEUIPlugin.getDefault().getImage("remote_interface_overlay_obj"); //$NON-NLS-1$
+		}
+		return super.getImage(element);
+	}
+
+	@Override
+	public String getText(Object element) {
+		String retText = null;
+		if (element instanceof BusinessInterface) {
+			retText = ((BusinessInterface) element).getFullyQualifiedName();
+		}
+		return retText;
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/BusinessInterfaceSelectionDialog.java b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/BusinessInterfaceSelectionDialog.java
new file mode 100644
index 0000000..39204eb
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/BusinessInterfaceSelectionDialog.java
@@ -0,0 +1,92 @@
+/*******************************************************************************
+ * Copyright (c) 2007 SAP AG 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:
+ * Kaloyan Raev, kaloyan.raev@sap.com - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.ejb.ui.internal.wizard;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.search.IJavaSearchScope;
+import org.eclipse.jdt.core.search.TypeNameMatch;
+import org.eclipse.jdt.internal.ui.dialogs.OpenTypeSelectionDialog;
+import org.eclipse.jdt.ui.dialogs.TypeSelectionExtension;
+import org.eclipse.jface.operation.IRunnableContext;
+import org.eclipse.jst.ejb.ui.internal.util.EJBUIMessages;
+import org.eclipse.jst.j2ee.ejb.internal.operations.BusinessInterface;
+import org.eclipse.jst.j2ee.ejb.internal.operations.BusinessInterface.BusinessInterfaceType;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+
+public class BusinessInterfaceSelectionDialog extends OpenTypeSelectionDialog {
+	
+    private Button remoteRadio;
+    private Button localRadio;
+    
+    private List<BusinessInterface> resultToReturn;
+    
+    public BusinessInterfaceSelectionDialog(Shell parent, boolean multi, IRunnableContext context, 
+            IJavaSearchScope scope, int elementKinds) {
+        this(parent, multi, context, scope, elementKinds, null);
+    }
+    
+    public BusinessInterfaceSelectionDialog(Shell parent, boolean multi, IRunnableContext context, 
+            IJavaSearchScope scope, int elementKinds, TypeSelectionExtension extension) {
+    	super(parent, false, context, scope, elementKinds, extension);
+        setShellStyle(getShellStyle() | SWT.RESIZE);
+    }
+    
+    @Override
+	protected Control createDialogArea(Composite parent) {
+        Composite area = (Composite)super.createDialogArea(parent);
+        
+        Label label = new Label(area, SWT.NONE);
+        label.setText(EJBUIMessages.addAs);
+        label.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+        
+        remoteRadio = new Button(area, SWT.RADIO);
+        remoteRadio.setText(EJBUIMessages.REMOTE_BUSINESS_INTERFACE);
+        remoteRadio.setSelection(false);
+        remoteRadio.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+        
+        localRadio = new Button(area, SWT.RADIO);
+        localRadio.setText(EJBUIMessages.LOCAL_BUSINESS_INTERFACE);
+        localRadio.setSelection(true);
+        localRadio.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+        
+        return area;
+    }
+    
+    @Override
+    public void setResult(List newResult) {
+    	resultToReturn = new ArrayList<BusinessInterface>();
+    	
+    	Iterator iterator = newResult.iterator();
+    	while (iterator.hasNext()) {
+    		TypeNameMatch typeNameMatch = (TypeNameMatch) iterator.next();
+    		IType javaType = typeNameMatch.getType();
+            BusinessInterfaceType type = (localRadio.getSelection() 
+            		? BusinessInterfaceType.LOCAL
+					: BusinessInterfaceType.REMOTE);
+            resultToReturn.add(new BusinessInterface(javaType, type));
+    	}
+    }
+    
+    @Override
+    public BusinessInterface[] getResult() {
+    	return resultToReturn.toArray(new BusinessInterface[] { });
+    }
+}
diff --git a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/BusinessInterfaceSelectionExtension.java b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/BusinessInterfaceSelectionExtension.java
new file mode 100644
index 0000000..a6a406c
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/BusinessInterfaceSelectionExtension.java
@@ -0,0 +1,56 @@
+/***********************************************************************
+ * Copyright (c) 2008 by SAP AG, Walldorf. 
+ * 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:
+ *     SAP AG - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jst.ejb.ui.internal.wizard;
+
+import org.eclipse.jdt.ui.dialogs.ITypeInfoFilterExtension;
+import org.eclipse.jdt.ui.dialogs.ITypeInfoRequestor;
+import org.eclipse.jdt.ui.dialogs.TypeSelectionExtension;
+
+/**
+ * A type selection extension used in the
+ * {@link BusinessInterfaceSelectionDialog}. The extension filters the types
+ * shown in the business interface selection dialog.
+ * 
+ * Interfaces from the javax.ejb package can not be used as business interfaces
+ * for a bean. The same applies for {@link java.io.Serializable} and
+ * {@link java.io.Externalizable}
+ * 
+ * @author Kiril Mitov k.mitov@sap.com
+ * 
+ */
+public class BusinessInterfaceSelectionExtension extends TypeSelectionExtension {
+
+	private static final String EXTERNALIZABLE = "Externalizable"; //$NON-NLS-1$
+	private static final String SERIALIZABLE = "Serializable"; //$NON-NLS-1$
+	private static final String JAVA_IO = "java.io"; //$NON-NLS-1$
+	private static final String JAVAX_EJB = "javax.ejb"; //$NON-NLS-1$
+
+	public BusinessInterfaceSelectionExtension() {
+	}
+
+	@Override
+	public ITypeInfoFilterExtension getFilterExtension() {
+		return new ITypeInfoFilterExtension() {
+
+			public boolean select(ITypeInfoRequestor typeInfoRequestor) {
+				String packageName = typeInfoRequestor.getPackageName();
+				if (packageName.equals(JAVAX_EJB))
+					return false;
+				else if (packageName.equals(JAVA_IO)) {
+					String typeName = typeInfoRequestor.getTypeName();
+					if (typeName.equals(SERIALIZABLE) || typeName.equals(EXTERNALIZABLE))
+						return false;
+				}
+				return true;
+			}
+		};
+	}
+}
diff --git a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/EJBClientComponentCreationWizard.java b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/EJBClientComponentCreationWizard.java
new file mode 100644
index 0000000..d0fe6f7
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/EJBClientComponentCreationWizard.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.ejb.ui.internal.wizard;
+
+import org.eclipse.jst.ejb.ui.internal.util.EJBUIMessages;
+import org.eclipse.jst.j2ee.internal.ejb.archiveoperations.EjbClientJarCreationDataModelProvider;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPlugin;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPluginIcons;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider;
+import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizard;
+
+public class EJBClientComponentCreationWizard extends DataModelWizard {
+	private static final String PAGE_ONE = "pageOne"; //$NON-NLS-1$
+
+	/**
+	 * @param model
+	 */
+	public EJBClientComponentCreationWizard(IDataModel model) {
+		super(model);
+		setWindowTitle(EJBUIMessages.EJB_Client_Title);
+		setDefaultPageImageDescriptor(J2EEUIPlugin.getDefault().getImageDescriptor(J2EEUIPluginIcons.CLIENT_BANNER));
+	}
+
+	/**
+	 *  
+	 */
+	public EJBClientComponentCreationWizard() {
+		super();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.wizard.Wizard#addPages()
+	 */
+	@Override
+	public void doAddPages() {
+		addPage(new EJBClientComponentCreationWizardPage(getDataModel(), PAGE_ONE));
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.common.frameworks.internal.ui.wizard.WTPWizard#runForked()
+	 */
+	@Override
+	protected boolean runForked() {
+		return false;
+	}
+
+    @Override
+	protected IDataModelProvider getDefaultProvider() {
+        return new EjbClientJarCreationDataModelProvider();
+    }
+
+}
diff --git a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/EJBClientComponentCreationWizardPage.java b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/EJBClientComponentCreationWizardPage.java
new file mode 100644
index 0000000..c45029b
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/EJBClientComponentCreationWizardPage.java
@@ -0,0 +1,184 @@
+/***************************************************************************************************
+ * Copyright (c) 2003, 2006 IBM 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: IBM Corporation - initial API and implementation
+ *				 David Schneider, david.schneider@unisys.com - [142500] WTP properties pages fonts don't follow Eclipse preferences
+ **************************************************************************************************/
+package org.eclipse.jst.ejb.ui.internal.wizard;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jst.ejb.ui.internal.util.EJBUIMessages;
+import org.eclipse.jst.j2ee.ejb.EJBJar;
+import org.eclipse.jst.j2ee.internal.actions.IJ2EEUIContextIds;
+import org.eclipse.jst.j2ee.internal.ejb.archiveoperations.IEjbClientProjectCreationDataModelProperties;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEUIMessages;
+import org.eclipse.jst.j2ee.project.EJBUtilities;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizardPage;
+
+public class EJBClientComponentCreationWizardPage extends DataModelWizardPage implements IEjbClientProjectCreationDataModelProperties{
+	protected EJBJar selProject = null;
+	private Label selectedProjectLabel;
+	private Text selectedProjectName;
+	private Label clientJarURILabel;
+	private Text clientJarURI;
+	protected int indent = 0;
+	private Label projectNameLabel;
+    protected Text projectNameText = null;
+    private static final String MODULE_NAME_UI = J2EEUIMessages.getResourceString(J2EEUIMessages.NAME_LABEL);    
+    private static final int SIZING_TEXT_FIELD_WIDTH = 305;	
+
+	/**
+	 * @param model
+	 * @param pageName
+	 */
+	public EJBClientComponentCreationWizardPage(IDataModel model, String pageName) {
+		super(model, pageName);
+		setTitle(EJBUIMessages.EJB_Client_Title);
+		setDescription(EJBUIMessages.EJB_Client_Desc);
+	}
+
+	/**
+	 * @param model
+	 * @param pageName
+	 * @param title
+	 * @param titleImage
+	 */
+	public EJBClientComponentCreationWizardPage(IDataModel model, String pageName, String title, ImageDescriptor titleImage) {
+		super(model, pageName, title, titleImage);
+	}
+
+
+    
+	@Override
+	protected Composite createTopLevelComposite(Composite parent) {
+		
+		Composite top = new Composite(parent, SWT.NONE);
+	    top.setLayout(new GridLayout());
+	    top.setData(new GridData(GridData.FILL_BOTH));
+		
+	
+		Composite composite = new Composite(top, SWT.NONE);
+		GridLayout layout = new GridLayout( 3, false );
+		composite.setLayout(layout);
+	
+		setInfopopID(IJ2EEUIContextIds.NEW_EJB_WIZARD_P2);
+		
+		createProjectNameGroup(composite);
+		createEJBComponentSection(composite);
+		createClientJarURISection(composite);
+		handleHasClientJar();
+	    Dialog.applyDialogFont(parent);
+		return top;
+	}
+    
+    private void createProjectNameGroup(Composite parent) {
+        // set up project name label
+        projectNameLabel = new Label(parent, SWT.NONE);
+        projectNameLabel.setText(MODULE_NAME_UI);
+        GridData data = new GridData();
+        projectNameLabel.setLayoutData(data);
+        // set up project name entry field
+        projectNameText = new Text(parent, SWT.BORDER);
+        data = new GridData(GridData.FILL_HORIZONTAL);
+        data.widthHint = SIZING_TEXT_FIELD_WIDTH;
+        projectNameText.setLayoutData(data);
+        new Label(parent, SWT.NONE); // pad
+        synchHelper.synchText(projectNameText, PROJECT_NAME, new Control[]{projectNameLabel});
+        projectNameText.setFocus();
+    }
+    
+    private void createEJBComponentSection(Composite parent) {
+    	selectedProjectLabel = new Label(parent, SWT.NONE);
+    	selectedProjectLabel.setText(EJBUIMessages.EJB_Project);
+        GridData data = new GridData();
+        selectedProjectLabel.setLayoutData(data);
+
+        selectedProjectName = new Text(parent, SWT.BORDER);
+        data = new GridData(GridData.FILL_HORIZONTAL);
+        data.widthHint = SIZING_TEXT_FIELD_WIDTH;
+        selectedProjectName.setLayoutData(data);
+        new Label(parent, SWT.NONE); // pad
+		selectedProjectName.setEditable(false);
+		synchHelper.synchText(selectedProjectName, EJB_PROJECT_NAME, new Control[]{selectedProjectLabel});
+    }
+   
+
+
+	private void handleHasClientJar() {
+		String projectName = model.getStringProperty(EJB_PROJECT_NAME);
+		IProject project = ProjectUtilities.getProject( projectName );
+		
+		if( project.exists() && project.isAccessible()){
+			enableAllSections(EJBUtilities.hasEJBClientJARProject(project));
+		}
+	}
+	
+	private void enableAllSections(boolean state) {
+		projectNameText.setEnabled(state);
+		projectNameLabel.setEnabled(state);
+		selectedProjectLabel.setEnabled(state);
+		selectedProjectName.setEnabled(state);
+		clientJarURILabel.setEnabled(state);
+		clientJarURI.setEnabled(state);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.common.frameworks.internal.ui.wizard.WTPWizardPage#getValidationPropertyNames()
+	 */
+	@Override
+	protected String[] getValidationPropertyNames() {
+		return new String[]{PROJECT_NAME, EJB_PROJECT_NAME, CLIENT_URI };
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.common.frameworks.internal.ui.wizard.WTPWizardPage#showValidationErrorsOnEnter()
+	 */
+	@Override
+	protected boolean showValidationErrorsOnEnter() {
+		return true;
+	}
+
+
+	@Override
+	public void dispose() {
+		super.dispose();
+	}
+
+	@Override
+	protected void enter() {
+		super.enter();
+	}
+
+	private void createClientJarURISection(Composite parent) {
+	    // set up project name label
+		clientJarURILabel = new Label(parent, SWT.NONE);
+		clientJarURILabel.setText(EJBUIMessages.Client_JAR_URI + " "); //$NON-NLS-1$
+	    GridData data = new GridData();
+	    clientJarURILabel.setLayoutData(data);
+	
+	    clientJarURI = new Text(parent, SWT.BORDER);
+	    data = new GridData(GridData.FILL_HORIZONTAL);
+	    data.widthHint = SIZING_TEXT_FIELD_WIDTH;
+	    clientJarURI.setLayoutData(data);
+	    new Label(parent, SWT.NONE); // pad
+		synchHelper.synchText(clientJarURI, CLIENT_URI, new Control[]{clientJarURILabel});
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/EJBComponentExportWizard.java b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/EJBComponentExportWizard.java
new file mode 100644
index 0000000..f49085d
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/EJBComponentExportWizard.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.ejb.ui.internal.wizard;
+
+import org.eclipse.jst.j2ee.internal.ejb.project.operations.EJBComponentExportDataModelProvider;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPlugin;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPluginIcons;
+import org.eclipse.jst.j2ee.internal.wizard.J2EEArtifactExportWizard;
+import org.eclipse.ui.IExportWizard;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider;
+
+/**
+ * <p>
+ * Wizard used to export J2EE Enterprise Java Bean module structures 
+ * from the Eclipse Workbench to a deployable Enterprise Java Bean 
+ * Archive *.jar file.  
+ * </p>
+ */
+public final class EJBComponentExportWizard extends J2EEArtifactExportWizard implements IExportWizard {
+
+	/**
+	 * <p>
+	 * The default constructor. Creates a wizard with no selection, 
+	 * no model instance, and no operation instance. The model and 
+	 * operation will be created as needed.
+	 * </p>
+	 */
+	public EJBComponentExportWizard() {
+		super();
+	}
+
+	/**
+	 * <p>
+	 * The model is used to prepopulate the wizard controls
+	 * and interface with the operation.
+	 * </p>
+	 * @param model The model parameter is used to pre-populate wizard controls and interface with the operation
+	 */
+	public EJBComponentExportWizard(IDataModel model) {
+		super(model);
+	}
+
+    @Override
+	protected IDataModelProvider getDefaultProvider() {
+        return new EJBComponentExportDataModelProvider();
+    }
+	/**
+	 * <p>
+	 * Adds the following pages:
+	 * <ul>
+	 * 	<li> {@link EJBExportPage} as the main wizard page ({@link #MAIN_PG}) 
+	 * </ul>
+	 * </p>
+	 */
+	@Override
+	public void doAddPages() {
+		addPage(new EJBExportPage(getDataModel(), MAIN_PG, getSelection()));
+	}
+
+	/**
+	 * {@inheritDoc}   
+	 * 
+	 * <p>
+	 * Sets up the default wizard page image. 
+	 * </p>
+	 */
+	@Override
+	protected void doInit() {
+		setDefaultPageImageDescriptor(J2EEUIPlugin.getDefault().getImageDescriptor(J2EEUIPluginIcons.EJB_EXPORT_WIZARD_BANNER));
+	}
+}
diff --git a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/EJBComponentImportPage.java b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/EJBComponentImportPage.java
new file mode 100644
index 0000000..a9166a2
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/EJBComponentImportPage.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2006 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.ejb.ui.internal.wizard;
+
+import org.eclipse.jst.ejb.ui.internal.util.EJBUIMessages;
+import org.eclipse.jst.j2ee.internal.actions.IJ2EEUIContextIds;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEUIMessages;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPlugin;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPluginIcons;
+import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
+import org.eclipse.jst.j2ee.internal.wizard.J2EEModuleImportPage;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+
+/**
+ * @author cbridgha
+ * 
+ * To change the template for this generated type comment go to Window>Preferences>Java>Code
+ * Generation>Code and Comments
+ */
+public class EJBComponentImportPage extends J2EEModuleImportPage {
+	/**
+	 * @param model
+	 * @param pageName
+	 */
+	public EJBComponentImportPage(IDataModel model, String pageName) {
+		super(model, pageName);
+		setTitle(EJBUIMessages.EJB_IMPORT_MAIN_PG_TITLE);
+		setDescription(EJBUIMessages.EJB_IMPORT_MAIN_PG_DESC);
+		setImageDescriptor(J2EEUIPlugin.getDefault().getImageDescriptor(J2EEUIPluginIcons.EJB_IMPORT_WIZARD_BANNER));
+	}
+
+	@Override
+	protected String getFileNamesStoreID() {
+		return "EJB";//$NON-NLS-1$
+	}
+
+	@Override
+	protected String getFileImportLabel() {
+		return EJBUIMessages.EJB_JAR_FILE_LBL;
+	}
+
+	@Override
+	protected String[] getFilterExpression() {
+		return new String[]{"*.jar"}; //$NON-NLS-1$
+	}
+
+	@Override
+	protected String getProjectImportLabel() {
+		return J2EEUIMessages.getResourceString(J2EEUIMessages.EJB_PROJ_LBL);
+	}
+
+	@Override
+	protected Composite createTopLevelComposite(Composite parent) {
+		setInfopopID(IJ2EEUIContextIds.IMPORT_EJB_WIZARD_P1);
+		return super.createTopLevelComposite(parent);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jst.j2ee.internal.ui.wizard.J2EEModuleImportPage#createAnnotationsStandaloneGroup(org.eclipse.swt.widgets.Composite)
+	 */
+	@Override
+	protected void createAnnotationsStandaloneGroup(Composite composite) {
+		// new AnnotationsStandaloneGroup(composite, getEJBDataModel(), false);
+	}
+	
+	@Override
+	protected String getModuleFacetID(){
+		return J2EEProjectUtilities.EJB;
+	}	
+}
diff --git a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/EJBComponentImportWizard.java b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/EJBComponentImportWizard.java
new file mode 100644
index 0000000..9b7330f
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/EJBComponentImportWizard.java
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2006 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.ejb.ui.internal.wizard;
+
+import org.eclipse.jst.j2ee.internal.ejb.project.operations.EJBComponentImportDataModelProvider;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEUIMessages;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPlugin;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPluginIcons;
+import org.eclipse.jst.j2ee.internal.wizard.J2EEComponentImportWizard;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider;
+import org.eclipse.wst.project.facet.IProductConstants;
+import org.eclipse.wst.project.facet.ProductManager;
+
+/**
+ * <p>
+ * Wizard used to import J2EE Enterprise Java Bean module structures into the Eclipse Workbench from
+ * an existing Enteprise Java Bean *.jar file.
+ * </p>
+ */
+public final class EJBComponentImportWizard extends J2EEComponentImportWizard {
+
+	/**
+	 * <p>
+	 * The default constructor. Creates a wizard with no selection, no model instance, and no
+	 * operation instance. The model and operation will be created as needed.
+	 * </p>
+	 */
+	public EJBComponentImportWizard() {
+		super();
+	}
+
+	/**
+	 * <p>
+	 * The model is used to prepopulate the wizard controls and interface with the operation.
+	 * </p>
+	 * 
+	 * @param model
+	 *            The model parameter is used to pre-populate wizard controls and interface with the
+	 *            operation
+	 */
+	public EJBComponentImportWizard(IDataModel model) {
+		super(model);
+	}
+
+	/**
+	 * <p>
+	 * Adds an {@link EJBComponentImportPage} as the main wizard page ({@link #MAIN_PG}).
+	 * </p>
+	 */
+	@Override
+	public void doAddPages() {
+		addPage(new EJBComponentImportPage(getDataModel(), MAIN_PG));
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * <p>
+	 * Sets up the dialog window title and default wizard page image.
+	 * </p>
+	 */
+	@Override
+	public final void doInit() {
+		setWindowTitle(J2EEUIMessages.getResourceString(J2EEUIMessages.IMPORT_WIZ_TITLE));
+		setDefaultPageImageDescriptor(J2EEUIPlugin.getDefault().getImageDescriptor(J2EEUIPluginIcons.EJB_IMPORT_WIZARD_BANNER));
+		// updateEARToModelFromSelection(getSpecificDataModel());
+	}
+
+	@Override
+	protected String[] getModuleValidatorStrings() {
+		return new String[]{"org.eclipse.jst.j2ee.model.internal.validation.EJBValidator"}; //$NON-NLS-1$ 
+	}
+
+	@Override
+	protected IDataModelProvider getDefaultProvider() {
+		return new EJBComponentImportDataModelProvider();
+	}
+	
+	@Override
+	protected String getFinalPerspectiveID() {
+        return ProductManager.getProperty(IProductConstants.FINAL_PERSPECTIVE_EJB);
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/EJBExportPage.java b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/EJBExportPage.java
new file mode 100644
index 0000000..47bcb75
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/EJBExportPage.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ * Created on Dec 3, 2003
+ *
+ * To change the template for this generated file go to
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+package org.eclipse.jst.ejb.ui.internal.wizard;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jst.ejb.ui.internal.util.EJBUIMessages;
+import org.eclipse.jst.j2ee.internal.actions.IJ2EEUIContextIds;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPlugin;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPluginIcons;
+import org.eclipse.jst.j2ee.internal.wizard.J2EEModuleExportPage;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+
+/**
+ * @author cbridgha
+ * 
+ * To change the template for this generated type comment go to Window>Preferences>Java>Code
+ * Generation>Code and Comments
+ */
+public class EJBExportPage extends J2EEModuleExportPage {
+	/**
+	 * @param model
+	 * @param pageName
+	 */
+	public EJBExportPage(IDataModel model, String pageName, IStructuredSelection selection) {
+		super(model, pageName, selection);
+		setTitle(EJBUIMessages.EJB_EXPORT_MAIN_PG_TITLE);
+		setDescription(EJBUIMessages.EJB_EXPORT_MAIN_PG_DESC);
+		setImageDescriptor(J2EEUIPlugin.getDefault().getImageDescriptor(J2EEUIPluginIcons.EJB_EXPORT_WIZARD_BANNER));
+
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jst.j2ee.internal.ui.wizard.J2EEImportPage#getProjectImportLabel()
+	 */
+	@Override
+	protected String getComponentLabel() {
+		return EJBUIMessages.EJB_PROJECT_LBL;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jst.j2ee.internal.ui.wizard.J2EEImportPage#getFilterExpression()
+	 */
+	@Override
+	protected String[] getFilterExpression() {
+		return new String[]{"*.jar"}; //$NON-NLS-1$
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jst.j2ee.internal.ui.wizard.J2EEExportPage#isMetaTypeSupported(java.lang.Object)
+	 */
+	@Override
+	protected boolean isMetaTypeSupported(Object o) {
+		return o instanceof org.eclipse.jst.j2ee.ejb.EJBJar;
+	}
+
+	@Override
+	protected String getInfopopID() {
+		return IJ2EEUIContextIds.EXPORT_EJB_WIZARD_P1;
+	}
+
+    @Override
+	protected String getComponentID() {
+        return "JST_EJB"; //$NON-NLS-1$
+    }
+
+}
diff --git a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/EJBFiguresResourceHandler.java b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/EJBFiguresResourceHandler.java
new file mode 100644
index 0000000..8bfe3d6
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/EJBFiguresResourceHandler.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.ejb.ui.internal.wizard;
+
+import org.eclipse.osgi.util.NLS;
+
+public final class EJBFiguresResourceHandler extends NLS {
+
+	private static final String BUNDLE_NAME = "ejb_figures";//$NON-NLS-1$
+
+	private EJBFiguresResourceHandler() {
+		// Do not instantiate
+	}
+
+	public static String RelationshipPolyLine_UI_0;
+	public static String RelationshipPolyLine_UI_1;
+	public static String RelationshipPolyLine_UI_2;
+	public static String RelationshipPolyLine_UI_3;
+	public static String RelationshipPolyLine_UI_4;
+	public static String RelationshipPolyLine_UI_5;
+	public static String RelationshipPolyLine_UI_6;
+	public static String RelationshipPolyLine_UI_7;
+
+	static {
+		NLS.initializeMessages(BUNDLE_NAME, EJBFiguresResourceHandler.class);
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/IEjbWizardConstants.java b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/IEjbWizardConstants.java
new file mode 100644
index 0000000..ff93b0f
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/IEjbWizardConstants.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2014 SAP AG 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:
+ * Kaloyan Raev, kaloyan.raev@sap.com - initial API and implementation
+ * Ludovic Champenois ludo@java.net
+ * IBM - Async and Non-persistent support
+ *******************************************************************************/
+package org.eclipse.jst.ejb.ui.internal.wizard;
+
+import org.eclipse.jst.ejb.ui.internal.util.EJBUIMessages;
+
+public interface IEjbWizardConstants {
+
+	public final static String NEW_JAVA_CLASS_DESTINATION_WIZARD_PAGE_DESC = EJBUIMessages.NEW_JAVA_CLASS_DESTINATION_WIZARD_PAGE_DESC;
+	public final static String NEW_JAVA_CLASS_OPTIONS_WIZARD_PAGE_DESC = EJBUIMessages.NEW_JAVA_CLASS_OPTIONS_WIZARD_PAGE_DESC;
+	public final static String ADD_SESSION_BEAN_WIZARD_PAGE_DESC = EJBUIMessages.ADD_SESSION_BEAN_WIZARD_PAGE_DESC;
+	
+	
+	// New Enterprise Bean Wizard
+	public final static String ADD_SESSION_BEAN_WIZARD_PAGE_TITLE = EJBUIMessages.ADD_SESSION_BEAN_WIZARD_PAGE_TITLE;
+	public static final String STATE_TYPE_LABEL = EJBUIMessages.STATE_TYPE_LABEL;
+	public static final String CREATE_BUSINESS_INTERFACE = EJBUIMessages.CREATE_BUSINESS_INTERFACE;
+	public static final String REMOTE_BUSINESS_INTERFACE = EJBUIMessages.REMOTE_BUSINESS_INTERFACE;
+	public static final String REMOTE_BUSINESS_INTERFACE_LABEL = EJBUIMessages.REMOTE_BUSINESS_INTERFACE_LABEL;
+	public static final String LOCAL_BUSINESS_INTERFACE = EJBUIMessages.LOCAL_BUSINESS_INTERFACE;
+	public static final String LOCAL_BUSINESS_INTERFACE_LABEL = EJBUIMessages.LOCAL_BUSINESS_INTERFACE_LABEL;
+	public static final String NO_INTERFACE = EJBUIMessages.NO_INTERFACE;
+	public static final String ASYNC = EJBUIMessages.ASYNC;
+	public static final String NON_PERSISTENT = EJBUIMessages.NON_PERSISTENT;
+	
+	public static final String EJB_NAME = EJBUIMessages.EJB_NAME;
+	
+	public final static String TRANSACTION_TYPE_CONTAINER = EJBUIMessages.TRANSACTION_TYPE_CONTAINER;
+	public final static String TRANSACTION_TYPE_BEAN = EJBUIMessages.TRANSACTION_TYPE_BEAN;
+	
+	public final static String STATE_TYPE_STATELESS = EJBUIMessages.STATE_TYPE_STATELESS;
+	public final static String STATE_TYPE_STATEFUL = EJBUIMessages.STATE_TYPE_STATEFUL;
+	
+	//New Message-Driven Bean wizard
+	public final static String ADD_MESSAGE_DRIVEN_BEANS_WIZARD_PAGE_TITLE = EJBUIMessages.ADD_MESSAGE_DRIVEN_BEAN_WIZARD_PAGE_TITLE;
+	public final static String DESTINATION_LABEL = EJBUIMessages.DESTINATION_LABEL;
+	public final static String DESTINATION_TYPE_QUEUE = EJBUIMessages.DESTINATION_TYPE_QUEUE;
+	public final static String DESTINATION_TYPE_TOPIC = EJBUIMessages.DESTINATION_TYPE_TOPIC;
+	public static final String JMS = EJBUIMessages.JMS;
+	public static final String DESTINATION_NAME_LABEL = EJBUIMessages.DESTINATION_NAME_LABEL;
+	public static final String ADD_MESSAGE_DRIVEN_BEAN_WIZARD_PAGE_DESC = EJBUIMessages.ADD_MESSAGE_DRIVEN_BEAN_WIZARD_PAGE_DESC;
+	public static final String MESSAGE_LISTENER_INTERFACE_HYPERLINK = EJBUIMessages.MESSAGE_LISTENER_INTERFACE_HYPERLINK;
+	public static final String MESSAGE_LISTENER_INTERFACE_HYPERLINK_TOOLTIP = EJBUIMessages.MESSAGE_LISTENER_INTERFACE_HYPERLINK_TOOLTIP;
+	public static final String CLICK_TO_SELECT = EJBUIMessages.CLICK_TO_SELECT;
+	
+    public static final  String timerWizardTitle = EJBUIMessages.timerWizardTitle;
+    public static final  String timerWizardDescription = EJBUIMessages.timerWizardDescription;
+    public static final  String timerScheduleLabel = EJBUIMessages.timerScheduleLabel;
+	
+}
diff --git a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/NewEnterpriseBeanClassWizardPage.java b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/NewEnterpriseBeanClassWizardPage.java
new file mode 100644
index 0000000..5661314
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/NewEnterpriseBeanClassWizardPage.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * Copyright (c) 2008 SAP AG 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:
+ * Kaloyan Raev, kaloyan.raev@sap.com - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.ejb.ui.internal.wizard;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.j2ee.internal.common.J2EEVersionUtil;
+import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
+import org.eclipse.jst.j2ee.internal.wizard.NewJavaClassWizardPage;
+import org.eclipse.jst.j2ee.project.JavaEEProjectUtilities;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetConstants;
+import org.eclipse.jst.jee.ui.internal.navigator.AbstractDDNode;
+import org.eclipse.jst.jee.ui.internal.navigator.ejb.GroupEJBProvider;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
+
+public class NewEnterpriseBeanClassWizardPage extends NewJavaClassWizardPage {
+	
+	public NewEnterpriseBeanClassWizardPage(IDataModel model, String pageName,
+			String pageDesc, String pageTitle, String moduleType) {
+		super(model, pageName, pageDesc, pageTitle, moduleType);
+	}
+	
+	@Override
+	protected Composite createTopLevelComposite(Composite parent) {
+		Composite composite = super.createTopLevelComposite(parent);
+		
+		// bug 303917
+		//projectNameLabel.setText(EJBUIMessages.EJB_PROJECT_LBL);
+		
+		return composite;
+	}
+
+	@Override
+	protected boolean isProjectValid(IProject project) {
+		boolean result = super.isProjectValid(project);
+		// bug 241670 - 3.x EJBs can be created in 3.x EJB project, or Web 3.0 or Web Fragment 3.0
+		boolean isJEEProject = J2EEProjectUtilities.isJEEProject(project);
+		if (isJEEProject)
+		{
+			if (!result)
+			{
+				result = JavaEEProjectUtilities.isWebFragmentProject(project);
+				if (!result)
+				{
+					IProjectFacetVersion webFacetVersion = JavaEEProjectUtilities.getProjectFacetVersion(project, IJ2EEFacetConstants.DYNAMIC_WEB);
+					if (webFacetVersion != null)
+					{
+						int version = J2EEVersionUtil.convertVersionStringToInt(webFacetVersion.getVersionString());
+						result = (version >= J2EEVersionConstants.VERSION_3_0);
+					}
+				}
+			}
+		}
+		else
+		{
+			result = false;
+		}
+		return result;
+	}
+	
+	@Override
+	protected IProject getExtendedSelectedProject(Object selection) {
+		if (selection instanceof GroupEJBProvider) {
+			String projectName = ((GroupEJBProvider) selection).getProjectName();
+			return ProjectUtilities.getProject(projectName);
+		} else if (selection instanceof AbstractDDNode) {
+			Object adapterNode = ((AbstractDDNode) selection).getAdapterNode();
+			return ProjectUtilities.getProject(adapterNode);
+		}
+		
+		return super.getExtendedSelectedProject(selection);
+	}
+	
+}
diff --git a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/NewEnterpriseBeanWizard.java b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/NewEnterpriseBeanWizard.java
new file mode 100644
index 0000000..cbff3fa
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/NewEnterpriseBeanWizard.java
@@ -0,0 +1,105 @@
+/*******************************************************************************
+ * Copyright (c) 2008 SAP AG 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:
+ * Kaloyan Raev, kaloyan.raev@sap.com - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.ejb.ui.internal.wizard;
+
+import static org.eclipse.jst.j2ee.internal.common.operations.INewJavaClassDataModelProperties.OPEN_IN_EDITOR;
+import static org.eclipse.jst.j2ee.internal.common.operations.INewJavaClassDataModelProperties.PROJECT;
+import static org.eclipse.jst.j2ee.internal.common.operations.INewJavaClassDataModelProperties.QUALIFIED_CLASS_NAME;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jst.ejb.ui.internal.plugin.EJBUIPlugin;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEEditorUtility;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPlugin;
+import org.eclipse.ui.INewWizard;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.ide.IDE;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizard;
+
+public abstract class NewEnterpriseBeanWizard extends DataModelWizard implements INewWizard {
+
+	/**
+	 * @param model
+	 */
+	public NewEnterpriseBeanWizard(IDataModel model) {
+		super(model);
+	}
+	
+	/**
+	 * Default constructor
+	 */
+	public NewEnterpriseBeanWizard() {
+		super();
+	}
+
+	public void init(IWorkbench workbench, IStructuredSelection selection) {
+		getDataModel();
+	}
+	
+	protected IStructuredSelection getCurrentSelection() {
+		IWorkbenchWindow window = J2EEUIPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow();
+		if (window != null) {
+			ISelection selection = window.getSelectionService().getSelection();
+			if (selection instanceof IStructuredSelection) {
+				return (IStructuredSelection) selection;
+			}
+		}
+		return null;
+	}
+
+	@Override
+	protected void postPerformFinish() throws InvocationTargetException {
+		String className = getDataModel().getStringProperty(QUALIFIED_CLASS_NAME);
+		IProject p = (IProject) getDataModel().getProperty(PROJECT);
+		IJavaProject javaProject = J2EEEditorUtility.getJavaProject(p);
+		IFile file;
+		try {
+			file = (IFile) javaProject.findType(className).getResource();
+			openEditor(file);
+		} catch (JavaModelException e) {
+			EJBUIPlugin.logError(e);
+		}
+	}
+
+	private void openEditor(final IFile file) {
+		if (getDataModel().getBooleanProperty(OPEN_IN_EDITOR)) {
+			if (file != null) {
+				getShell().getDisplay().asyncExec(new Runnable() {
+					public void run() {
+						try {
+							IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+							IDE.openEditor(page, file, true);
+						} catch (PartInitException e) {
+							EJBUIPlugin.logError(e);
+						}
+					}
+				});
+			}
+		}
+	}
+
+	@Override
+	public boolean canFinish() {
+		return getDataModel().isValid();
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/NewMessageDrivenBeanClassWizardPage.java b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/NewMessageDrivenBeanClassWizardPage.java
new file mode 100644
index 0000000..cbd638b
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/NewMessageDrivenBeanClassWizardPage.java
@@ -0,0 +1,101 @@
+/*******************************************************************************
+ * Copyright (c) 2008 SAP AG 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:
+ * Kaloyan Raev, kaloyan.raev@sap.com - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.ejb.ui.internal.wizard;
+
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewEnterpriseBeanClassDataModelProperties.MAPPED_NAME;
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewMessageDrivenBeanClassDataModelProperties.DESTINATION_TYPE;
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewMessageDrivenBeanClassDataModelProperties.JMS;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelPropertyDescriptor;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+public class NewMessageDrivenBeanClassWizardPage extends NewEnterpriseBeanClassWizardPage {
+
+	private Label destinationLabel;
+	private Combo destinationTypeCombo;
+	private Button jmsCheckbox;
+	private Text destinationText;
+
+	public NewMessageDrivenBeanClassWizardPage(IDataModel model, String pageName,
+			String pageDesc, String pageTitle, String moduleType) {
+		super(model, pageName, pageDesc, pageTitle, moduleType);
+	}
+
+	@Override
+	protected Composite createTopLevelComposite(Composite parent) {
+		Composite composite = super.createTopLevelComposite(parent);
+		
+		addSeperator(composite, 3);
+		
+		new Label(composite,SWT.LEFT).setText(IEjbWizardConstants.DESTINATION_NAME_LABEL);
+		destinationText = new Text(composite,SWT.SINGLE | SWT.BORDER);
+		destinationText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		synchHelper.synchText(destinationText, MAPPED_NAME, null);
+		
+		createJMSGroup(composite);
+		return composite;
+	}
+
+	private void createJMSGroup(Composite composite) {
+
+		jmsCheckbox = new Button(composite, SWT.CHECK);
+		jmsCheckbox.setText(IEjbWizardConstants.JMS);
+		GridData data = new GridData();
+		data.horizontalSpan = 3;
+		jmsCheckbox.setLayoutData(data);
+		synchHelper.synchCheckbox(jmsCheckbox, JMS, null);
+		jmsCheckbox.addSelectionListener(new SelectionListener(){
+			public void widgetSelected(SelectionEvent e) {
+				destinationTypeCombo.setEnabled(jmsCheckbox.getSelection());
+			}
+			public void widgetDefaultSelected(SelectionEvent e) {
+			}
+		});
+		
+		destinationLabel = new Label(composite, SWT.LEFT);
+		destinationLabel.setText(IEjbWizardConstants.DESTINATION_LABEL);
+
+		destinationTypeCombo = new Combo(composite, SWT.READ_ONLY);
+		destinationTypeCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		DataModelPropertyDescriptor[] descriptors = model.getValidPropertyDescriptors(DESTINATION_TYPE);
+		for (DataModelPropertyDescriptor descriptor : descriptors) {
+			destinationTypeCombo.add(descriptor.getPropertyDescription());
+		}
+		destinationTypeCombo.select(0);
+		synchHelper.synchCombo(destinationTypeCombo, DESTINATION_TYPE, null);
+		destinationTypeCombo.setEnabled(false);
+	}
+	
+	@Override
+	protected String[] getValidationPropertyNames() {
+		String[] base = super.getValidationPropertyNames();
+		String[] result = new String[base.length + 1];
+		System.arraycopy(base, 0, result, 0, base.length);
+		result[base.length] = JMS;
+		return result;
+	}
+	
+	@Override
+	protected void updateControls() {
+		super.updateControls();
+		destinationTypeCombo.setEnabled(jmsCheckbox.getSelection());
+	}
+	
+}
diff --git a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/NewSessionBeanClassWizardPage.java b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/NewSessionBeanClassWizardPage.java
new file mode 100644
index 0000000..563d108
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/NewSessionBeanClassWizardPage.java
@@ -0,0 +1,137 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2014 SAP AG 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:
+ * Kaloyan Raev, kaloyan.raev@sap.com - initial API and implementation
+ * IBM - Async and Non-persistent support
+ *******************************************************************************/
+package org.eclipse.jst.ejb.ui.internal.wizard;
+
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewSessionBeanClassDataModelProperties.LOCAL;
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewSessionBeanClassDataModelProperties.LOCAL_BUSINESS_INTERFACE;
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewSessionBeanClassDataModelProperties.NO_INTERFACE;
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewSessionBeanClassDataModelProperties.REMOTE;
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewSessionBeanClassDataModelProperties.REMOTE_BUSINESS_INTERFACE;
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewSessionBeanClassDataModelProperties.STATE_TYPE;
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewSessionBeanClassDataModelProperties.ASYNC;
+import static org.eclipse.jst.j2ee.internal.common.operations.INewJavaClassDataModelProperties.INTERFACES;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelPropertyDescriptor;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+public class NewSessionBeanClassWizardPage extends
+		NewEnterpriseBeanClassWizardPage {
+
+	private Label stateTypeLabel;
+	private Combo stateTypeCombo;
+	private Button remoteCheckbox;
+	private Button localCheckbox;
+	private Button noInterfaceCheckbox;
+	private Button ansyncCheckbox;
+	private Text remoteInterfaceName;
+	private Text localInterfaceName;
+
+	public NewSessionBeanClassWizardPage(IDataModel model, String pageName,
+			String pageDesc, String pageTitle, String moduleType) {
+		super(model, pageName, pageDesc, pageTitle, moduleType);
+	}
+
+	@Override
+	protected Composite createTopLevelComposite(Composite parent) {
+		Composite composite = super.createTopLevelComposite(parent);
+
+		createBusinessInterfacesGroup(composite);
+
+		return composite;
+	}
+
+	private void createBusinessInterfacesGroup(Composite composite) {
+
+		addSeperator(composite, 3);
+
+		stateTypeLabel = new Label(composite, SWT.LEFT);
+		stateTypeLabel.setText(IEjbWizardConstants.STATE_TYPE_LABEL);
+
+		stateTypeCombo = new Combo(composite, SWT.READ_ONLY);
+		stateTypeCombo.setLayoutData(gdhspan(1));
+		DataModelPropertyDescriptor[] descriptors = model
+				.getValidPropertyDescriptors(STATE_TYPE);
+		for (DataModelPropertyDescriptor descriptor : descriptors) {
+			stateTypeCombo.add(descriptor.getPropertyDescription());
+		}
+		stateTypeCombo.select(0);
+		synchHelper.synchCombo(stateTypeCombo, STATE_TYPE, null);
+
+		Group group = new Group(composite, SWT.NONE);
+		group.setLayoutData(gdhspan(2));
+		group.setLayout(new GridLayout(2, false));
+		group.setText(IEjbWizardConstants.CREATE_BUSINESS_INTERFACE);
+
+		remoteCheckbox = new Button(group, SWT.CHECK);
+		remoteCheckbox.setLayoutData(gdhspan(1));
+		remoteCheckbox.setText(IEjbWizardConstants.REMOTE_BUSINESS_INTERFACE);
+		synchHelper.synchCheckbox(remoteCheckbox, REMOTE, null);
+		remoteInterfaceName = new Text(group, SWT.SINGLE | SWT.BORDER);
+		remoteInterfaceName
+				.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		synchHelper.synchText(remoteInterfaceName, REMOTE_BUSINESS_INTERFACE,
+				null);
+
+		localCheckbox = new Button(group, SWT.CHECK);
+		localCheckbox.setLayoutData(gdhspan(1));
+		localCheckbox.setText(IEjbWizardConstants.LOCAL_BUSINESS_INTERFACE);
+		synchHelper.synchCheckbox(localCheckbox, LOCAL, null);
+		localInterfaceName = new Text(group, SWT.SINGLE | SWT.BORDER);
+		localInterfaceName
+				.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		synchHelper.synchText(localInterfaceName, LOCAL_BUSINESS_INTERFACE,
+				null);
+
+		noInterfaceCheckbox = new Button(group, SWT.CHECK);
+		noInterfaceCheckbox.setLayoutData(gdhspan(2));
+		noInterfaceCheckbox.setText(IEjbWizardConstants.NO_INTERFACE);
+		synchHelper.synchCheckbox(noInterfaceCheckbox, NO_INTERFACE, null);
+
+		ansyncCheckbox = new Button(group, SWT.CHECK);
+		ansyncCheckbox.setLayoutData(gdhspan(2));
+		ansyncCheckbox.setText(IEjbWizardConstants.ASYNC);
+		synchHelper.synchCheckbox(ansyncCheckbox, ASYNC, null);
+	}
+
+	private static GridData gdhspan(int span) {
+		GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+		gd.horizontalSpan = span;
+		return gd;
+	}
+
+	@Override
+	protected String[] getValidationPropertyNames() {
+		ArrayList<String> names = new ArrayList<String>();
+		names.addAll(Arrays.asList(super.getValidationPropertyNames()));
+
+		names.add(STATE_TYPE);
+		names.add(INTERFACES);
+		names.add(LOCAL_BUSINESS_INTERFACE);
+		names.add(REMOTE_BUSINESS_INTERFACE);
+		names.add(NO_INTERFACE);
+		names.add(ASYNC);
+
+		return names.toArray(new String[0]);
+	}
+}
diff --git a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/Session2xInterfacesTable.java b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/Session2xInterfacesTable.java
new file mode 100644
index 0000000..a93d0f0
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/Session2xInterfacesTable.java
@@ -0,0 +1,427 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 SAP AG 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:
+ * Kaloyan Raev, kaloyan.raev@sap.com - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.ejb.ui.internal.wizard;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.search.IJavaSearchConstants;
+import org.eclipse.jdt.core.search.SearchEngine;
+import org.eclipse.jdt.internal.ui.dialogs.OpenTypeSelectionDialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.ICellModifier;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TextCellEditor;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jst.ejb.ui.internal.util.EJBUIMessages;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.TableEditor;
+import org.eclipse.swt.events.ControlAdapter;
+import org.eclipse.swt.events.ControlEvent;
+import org.eclipse.swt.events.FocusAdapter;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.events.TraverseEvent;
+import org.eclipse.swt.events.TraverseListener;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+public class Session2xInterfacesTable extends Composite {
+
+	private static final String _TABLEITEM = "_TABLEITEM"; //$NON-NLS-1$
+
+	private Table table;
+	private TableViewer viewer;
+	
+	private IDataModel model;
+	private final static String ABBREVIATION_COLUMN = "abbreviation"; //$NON-NLS-1$
+	private final static String CLASS_NAME_COLUMN = "className"; //$NON-NLS-1$
+	
+	private ArrayList tableValues = new ArrayList();
+	
+	// Set column names
+	private String[] columnNames = { ABBREVIATION_COLUMN, CLASS_NAME_COLUMN };
+	
+	protected class IntfTableContentProvider implements IStructuredContentProvider {
+
+		public Object[] getElements(Object inputElement) {
+			if (inputElement instanceof List) {
+				return ((List) inputElement).toArray();
+			}
+			return new Object[0];
+		}
+
+		public void dispose() {
+			
+		}
+
+		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+			
+		}
+		
+	}
+	
+	protected class IntfTableLabelProvider extends LabelProvider implements ITableLabelProvider {
+
+		public Image getColumnImage(Object element, int columnIndex) {
+			return null;
+		}
+
+		public String getColumnText(Object element, int columnIndex) {
+			if (element instanceof Session2xInterfacesTableRow) {
+				Session2xInterfacesTableRow row = (Session2xInterfacesTableRow) element;
+				if (columnIndex == 0) {
+					return row.getAbbreviation();
+				} else if(columnIndex == 1){
+					return row.getClassName();
+				}
+			}
+			return null;
+		}
+		
+	}	
+	
+
+	public Session2xInterfacesTable(Composite parent, String[] columnTitles, IDataModel model, Session2xInterfacesTableRow[] tableRows) {
+		super(parent, SWT.NONE);
+		this.model = model;
+		for (int k = 0; k < tableRows.length; k++) {
+			tableValues.add(tableRows[k]);
+		}
+		
+		GridLayout layout = new GridLayout(1, false);
+		layout.marginHeight = 4;
+		layout.marginWidth = 0;
+		this.setLayout(layout);
+		
+		createTable();
+		createTableViewer();
+		
+		final OpenTypeSelectionDialog dialog = new OpenTypeSelectionDialog(parent.getShell(), false, null, SearchEngine.createWorkspaceScope(), IJavaSearchConstants.INTERFACE);
+		dialog.setTitle(EJBUIMessages.chooseInterface);
+		
+		setInput(tableValues);
+		TableItem[] items = getTable().getItems();
+		for(int i = 0; i < items.length; i++) {
+            final TableItem item = items[i];
+            TableEditor editor = new TableEditor(getTable());
+            final Button button = new Button(getTable(), SWT.FLAT);
+            button.setText("..."); //$NON-NLS-1$
+            button.pack();
+            
+            button.addSelectionListener(new SelectionListener(){
+				public void widgetDefaultSelected(SelectionEvent e) {
+					
+				}
+
+				public void widgetSelected(SelectionEvent e) {
+					if (dialog.open() != IDialogConstants.OK_ID)
+						return;
+
+					Object[] types= dialog.getResult();
+					if (types != null && types.length == 1) {
+						IType type= (IType) types[0];
+						Session2xInterfacesTableRow row = (Session2xInterfacesTableRow) item.getData();
+						row.setClassName(type.getFullyQualifiedName());
+						getTableViewer().update(row, null);
+					}
+				}
+            	
+            });
+            
+            // accessibility: trigger button push when the RETURN hit is hit and the button is on focus
+            button.addTraverseListener(new TraverseListener() {
+            	public void keyTraversed(TraverseEvent e) {
+    				if (e.detail == SWT.TRAVERSE_RETURN) {
+                        e.doit = false;
+                        button.notifyListeners(SWT.Selection, new Event());
+    				}
+            	}
+            });
+            
+            editor.minimumWidth = 24;
+            editor.grabHorizontal = true;
+            editor.horizontalAlignment = SWT.LEFT;
+            editor.setEditor(button, item, 2);
+            GridData data = new GridData(GridData.FILL_BOTH);
+    		data.heightHint = getTable().getItemHeight() * 3;
+    		this.setLayoutData(data);
+    		
+    		GridData gridData1 = new GridData();
+    		gridData1.verticalAlignment = GridData.FILL;
+    		gridData1.grabExcessVerticalSpace = true;
+    		gridData1.horizontalAlignment = GridData.FILL;
+    		gridData1.grabExcessHorizontalSpace = true;
+    		getTable().setLayoutData(gridData1);
+		}
+		
+		setTableTooltips(table);
+	}
+
+	public void setInput(List input) {		
+		viewer.setInput(input);
+	}
+
+	public TableViewer getTableViewer() {
+		return viewer;
+	}
+	
+	/**
+	 * Create the Table
+	 */
+	private void createTable() {
+		int style = SWT.SINGLE | SWT.BORDER | SWT.FULL_SELECTION;
+
+		table = new Table(this, style);
+		GridData gridData = new GridData();
+		gridData.grabExcessHorizontalSpace = true;
+		table.setLayoutData(gridData);		
+					
+		table.setLinesVisible(true);
+		table.setHeaderVisible(false);
+		
+		// 1st column abbreviation
+		TableColumn column = new TableColumn(getTable(), SWT.CENTER, 0);		
+		column.setWidth(30);
+		
+		// 2nd column className
+		column = new TableColumn(getTable(), SWT.LEFT, 1);
+		column.setWidth(100);
+
+		column = new TableColumn(getTable(), SWT.LEFT, 2);
+		column.setWidth(25);
+		
+		// accessibility: switch to cell editing when the RETURN key is hit
+		table.addTraverseListener(new TraverseListener() {
+			public void keyTraversed(TraverseEvent e) {
+				if (e.detail == SWT.TRAVERSE_RETURN) {
+                    e.doit = false;
+                    ISelection selection = viewer.getSelection();
+                    if (selection instanceof IStructuredSelection) {
+                    	IStructuredSelection ssel = (IStructuredSelection) selection;
+                    	Object element = ssel.getFirstElement();
+                    	if (element != null) {
+                    		viewer.editElement(element, 1);
+                    	}
+                    }
+                }
+			}
+		});
+		
+		// accessibility: if there is no selection select the first row by default
+		table.addFocusListener(new FocusAdapter() {
+			@Override
+			public void focusGained(FocusEvent e) {
+				if (table.getSelectionCount() == 0) {
+					table.select(0);
+				}
+			}
+		});
+		
+		this.addControlListener(new ControlAdapter() {
+			@Override
+			public void controlResized(ControlEvent e) {
+				Rectangle area = table.getParent().getClientArea();
+				Point preferredSize = viewer.getTable().computeSize(
+						SWT.DEFAULT, SWT.DEFAULT);
+				int delta = area.width - preferredSize.x;
+				TableColumn column2 = table.getColumn(1);
+				int tmp = column2.getWidth() + delta;
+				column2.setWidth(tmp);
+			}
+		});
+	}
+
+	/**
+	 * Create the TableViewer 
+	 */
+	private void createTableViewer() {
+
+		viewer = new TableViewer(getTable()) {
+
+			@Override
+			public void update(Object element, String[] properties) {				
+				super.update(element, properties);
+				Session2xInterfacesTableRow row = (Session2xInterfacesTableRow) element;
+				model.setStringProperty(row.getPropertyName(), row.getClassName());
+			}
+			
+		};
+		viewer.setUseHashlookup(true);
+		viewer.setColumnProperties(columnNames);
+
+		// Create the cell editors
+		CellEditor[] editors = new CellEditor[columnNames.length];
+		TextCellEditor textEditor = new TextCellEditor(getTable());
+		((Text) textEditor.getControl()).setTextLimit(256);
+		// Column 1 : business interface type - read only
+		editors[0] = null;
+		// Column 2 : business interface name
+		editors[1] = textEditor;
+		
+		// Assign the cell editors to the viewer 
+		viewer.setCellEditors(editors);
+		// Set the cell modifier for the viewer
+		viewer.setCellModifier(new ICellModifier() {
+
+			public boolean canModify(Object element, String property) {
+				if (property.equals(CLASS_NAME_COLUMN)) {
+					return true;
+				}
+				return false;
+			}
+
+			public Object getValue(Object element, String property) {
+				Session2xInterfacesTableRow row = (Session2xInterfacesTableRow) element;
+				if (property.equals(CLASS_NAME_COLUMN)) {					
+					return row.getClassName();
+				}
+				return null;
+			}
+
+			public void modify(Object element, String property, Object value) {
+				TableItem item = (TableItem) element;
+				Session2xInterfacesTableRow row = (Session2xInterfacesTableRow) item.getData();
+				if (property.equals(CLASS_NAME_COLUMN)) {
+					row.setClassName((String) value);
+				}
+				viewer.update(row, null);
+			}
+			
+		});
+		viewer.setContentProvider(new IntfTableContentProvider());
+		viewer.setLabelProvider(new IntfTableLabelProvider());
+	}
+
+	public Table getTable() {
+		return table;
+	}
+	
+	/**
+	 * <p>This method has been derived from example 
+	 * <a href="http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet125.java?view=co">Snippet 125</a></p>
+	 * @param table
+	 */
+	protected void setTableTooltips(final Table table) {
+		// Disable native tooltip
+		table.setToolTipText(""); //$NON-NLS-1$
+		
+		// Implement a "fake" tooltip
+		final Listener labelListener = new Listener() {
+			public void handleEvent(Event event) {
+				Label label = (Label) event.widget;
+				Shell shell = label.getShell();
+				switch (event.type) {
+					case SWT.MouseDown:
+						Event e = new Event();
+						e.item = (TableItem) label.getData(_TABLEITEM);
+						// Assuming table is single select, set the selection as if
+						// the mouse down event went through to the table
+						table.setSelection(new TableItem[] { (TableItem) e.item });
+						table.notifyListeners(SWT.Selection, e);
+						shell.dispose();
+						table.setFocus();
+						break;
+					case SWT.MouseExit:
+						shell.dispose();
+						break;
+				}
+			}
+		};
+		
+		Listener tableListener = new Listener() {
+			Shell tip = null;
+			Label label = null;
+			public void handleEvent(Event event) {
+				switch (event.type) {
+					case SWT.Dispose:
+					case SWT.KeyDown:
+					case SWT.MouseMove: {
+						if (tip == null) break;
+						tip.dispose();
+						tip = null;
+						label = null;
+						break;
+					}
+					case SWT.MouseHover: {
+						TableItem item = table.getItem(new Point(event.x, event.y));
+						if (item != null) {
+							if (tip != null  && !tip.isDisposed()) tip.dispose();
+							Display display = event.widget.getDisplay();
+							Shell shell = ((Table) event.widget).getShell();
+							tip = new Shell(shell, SWT.ON_TOP | SWT.NO_FOCUS | SWT.TOOL);
+							tip.setBackground(display.getSystemColor(SWT.COLOR_INFO_BACKGROUND));
+							FillLayout layout = new FillLayout();
+							layout.marginWidth = 2;
+							tip.setLayout(layout);
+							label = new Label(tip, SWT.NONE);
+							label.setForeground(display.getSystemColor(SWT.COLOR_INFO_FOREGROUND));
+							label.setBackground(display.getSystemColor(SWT.COLOR_INFO_BACKGROUND));
+							label.setData(_TABLEITEM, item);
+							label.setText(getTooltipForTableItem(item.getText()));
+							label.addListener(SWT.MouseExit, labelListener);
+							label.addListener(SWT.MouseDown, labelListener);
+							Point size = tip.computeSize(SWT.DEFAULT, SWT.DEFAULT);
+							Rectangle rect = item.getBounds(0);
+							Point pt = table.toDisplay(rect.x, rect.y);
+							tip.setBounds(pt.x, pt.y, size.x, size.y);
+							tip.setVisible(true);
+						}
+					}
+				}
+			}
+		};
+		
+		table.addListener(SWT.Dispose, tableListener);
+		table.addListener(SWT.KeyDown, tableListener);
+		table.addListener(SWT.MouseMove, tableListener);
+		table.addListener(SWT.MouseHover, tableListener);
+	}
+	
+	protected String getTooltipForTableItem(String tableItemText) {
+		if (EJBUIMessages.LOCAL_COMPONENT_INTERFACE_CODE.equals(tableItemText)) {
+			return EJBUIMessages.LOCAL_COMPONENT_INTERFACE_TOOLTIP;
+		} else if (EJBUIMessages.LOCAL_HOME_INTERFACE_CODE.equals(tableItemText)) {
+			return EJBUIMessages.LOCAL_HOME_INTERFACE_TOOLTIP;
+		} else if (EJBUIMessages.REMOTE_COMPONENT_INTERFACE_CODE.equals(tableItemText)) {
+			return EJBUIMessages.REMOTE_COMPONENT_INTERFACE_TOOLTIP;
+		} else if (EJBUIMessages.REMOTE_HOME_INTERFACE_CODE.equals(tableItemText)) {
+			return EJBUIMessages.REMOTE_HOME_INTERFACE_TOOLTIP;
+		} 
+		
+		return ""; //$NON-NLS-1$
+	}
+	
+}
diff --git a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/Session2xInterfacesTableRow.java b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/Session2xInterfacesTableRow.java
new file mode 100644
index 0000000..aa6063d
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/Session2xInterfacesTableRow.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 SAP AG 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:
+ * Kaloyan Raev, kaloyan.raev@sap.com - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.ejb.ui.internal.wizard;
+
+public class Session2xInterfacesTableRow {
+	
+	private String abbreviation;
+	private String className;
+	private String propertyName;
+	
+	Session2xInterfacesTableRow(String abbreviation, String className, String propertyName){
+		setAbbreviation(abbreviation);
+		setClassName(className);
+		setPropertyName(propertyName);
+	}
+	
+	public void setAbbreviation(String abbreviation) {
+		this.abbreviation = abbreviation;
+	}
+	
+	public String getAbbreviation() {
+		return abbreviation;
+	}
+	
+	public void setClassName(String className) {
+		this.className = className;
+	}
+	
+	public String getClassName() {
+		return className;
+	}
+
+	public void setPropertyName(String propertyName) {
+		this.propertyName = propertyName;
+	}
+
+	public String getPropertyName() {
+		return propertyName;
+	}
+	
+}
diff --git a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/project/facet/EjbFacetInstallPage.java b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/project/facet/EjbFacetInstallPage.java
new file mode 100644
index 0000000..e9daf77
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/project/facet/EjbFacetInstallPage.java
@@ -0,0 +1,130 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 IBM 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:
+ *				 David Schneider, david.schneider@unisys.com - [142500] WTP properties pages fonts don't follow Eclipse preferences
+ *******************************************************************************/
+package org.eclipse.jst.ejb.ui.project.facet;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jst.ejb.ui.internal.util.EJBUIMessages;
+import org.eclipse.jst.j2ee.ejb.project.operations.IEjbFacetInstallDataModelProperties;
+import org.eclipse.jst.j2ee.internal.J2EEConstants;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.j2ee.internal.actions.IJ2EEUIContextIds;
+import org.eclipse.jst.j2ee.internal.common.J2EEVersionUtil;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEUIMessages;
+import org.eclipse.jst.j2ee.internal.wizard.J2EEModuleFacetInstallPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+
+
+
+public class EjbFacetInstallPage extends J2EEModuleFacetInstallPage 
+	implements IEjbFacetInstallDataModelProperties {
+
+    private static final String MODULE_NAME_UI = J2EEUIMessages.getResourceString(J2EEUIMessages.NAME_LABEL);
+    
+	protected Button addClient;	
+    protected Text clientNameText = null;  
+	private Label clientJarURILabel;
+	private Text clientJarURI;
+    
+	public EjbFacetInstallPage() {
+		super("ejb.facet.install.page"); //$NON-NLS-1$
+		setTitle(EJBUIMessages.pageTitle);
+		setDescription(EJBUIMessages.pageDescription);
+	}
+	
+	@Override
+	protected String[] getValidationPropertyNames() {
+		return new String[]{EAR_PROJECT_NAME, CREATE_CLIENT, CLIENT_NAME, CLIENT_SOURCE_FOLDER, CLIENT_URI, CONFIG_FOLDER};
+	}
+
+		
+	@Override
+	protected Composite createTopLevelComposite(Composite parent) {
+		setInfopopID(IJ2EEUIContextIds.NEW_EJB_WIZARD_P3);
+		final Composite composite = new Composite(parent, SWT.NONE);
+		composite.setLayout(new GridLayout(1, false));
+
+		Composite ejbClientComposite = createEjbClientComposite(composite);
+		createEJBClientGroup(ejbClientComposite);
+		createProjectNameGroup(ejbClientComposite);
+		createClientJarURISection(ejbClientComposite);
+		
+		new Label(composite, SWT.NONE); // pad
+		
+        createGenerateDescriptorControl(composite, J2EEConstants.EJBJAR_DD_SHORT_NAME);
+        registerFacetVersionChangeListener();
+        
+	    Dialog.applyDialogFont(parent);
+	    
+		return composite;
+	}
+	
+    @Override
+	protected void handleFacetVersionChangedEvent()
+    {
+        String fv = model.getStringProperty(FACET_VERSION_STR);
+        boolean isEJB30OrGreater = J2EEVersionUtil.convertVersionStringToInt(fv) >= J2EEVersionConstants.EJB_3_0_ID;
+        this.addDD.setVisible(isEJB30OrGreater);
+    }
+    
+    private Composite createEjbClientComposite(Composite parent) {
+    	Group group = new Group(parent, SWT.NONE);
+    	group.setLayout(new GridLayout(2, false));
+    	group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+    	group.setText(EJBUIMessages.EJB_CLIENT_JAR_GROUP);
+    	return group;
+    }
+
+	private void createEJBClientGroup(Composite parent) {
+		addClient = new Button(parent, SWT.CHECK);
+		addClient.setText(J2EEUIMessages.getResourceString(J2EEUIMessages.CREATE_EJB_CLIENT_JAR));
+		synchHelper.synchCheckbox(addClient, CREATE_CLIENT, null);
+		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+		gd.horizontalSpan = 2;
+		addClient.setLayoutData(gd);
+		synchHelper.synchCheckbox(addClient, CREATE_CLIENT, null);
+	}
+	
+    private void createProjectNameGroup(Composite parent) {
+        // set up project name label
+        Label projectNameLabel = new Label(parent, SWT.NONE);
+        projectNameLabel.setText(MODULE_NAME_UI);
+        GridData data = new GridData();
+        projectNameLabel.setLayoutData(data);
+        // set up project name entry field
+        clientNameText = new Text(parent, SWT.BORDER);
+        data = new GridData(GridData.FILL_HORIZONTAL);
+        //data.widthHint = SIZING_TEXT_FIELD_WIDTH;
+        clientNameText.setLayoutData(data);
+        synchHelper.synchText(clientNameText, CLIENT_NAME, new Control[]{projectNameLabel});
+    }
+    
+    private void createClientJarURISection(Composite parent) {
+        // set up project name label
+    	clientJarURILabel = new Label(parent, SWT.NONE);
+    	clientJarURILabel.setText(EJBUIMessages.Client_JAR_URI);
+        GridData data = new GridData();
+        clientJarURILabel.setLayoutData(data);
+
+        clientJarURI = new Text(parent, SWT.BORDER);
+        data = new GridData(GridData.FILL_HORIZONTAL);
+        //data.widthHint = SIZING_TEXT_FIELD_WIDTH;
+        clientJarURI.setLayoutData(data);
+		synchHelper.synchText(clientJarURI, CLIENT_URI, new Control[]{clientJarURILabel});
+    }    
+}
diff --git a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/project/facet/EjbProjectFirstPage.java b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/project/facet/EjbProjectFirstPage.java
new file mode 100644
index 0000000..c8ab0dd
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/project/facet/EjbProjectFirstPage.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.ejb.ui.project.facet;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.jst.common.project.facet.core.JavaFacet;
+import org.eclipse.jst.ejb.ui.internal.util.EJBUIMessages;
+import org.eclipse.jst.j2ee.internal.actions.IJ2EEUIContextIds;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPlugin;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPluginIcons;
+import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
+import org.eclipse.jst.j2ee.internal.wizard.J2EEComponentFacetCreationWizardPage;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetConstants;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
+import org.eclipse.wst.common.project.facet.core.runtime.IRuntime;
+
+public class EjbProjectFirstPage extends J2EEComponentFacetCreationWizardPage {
+
+	@Override
+	protected String getModuleFacetID() {
+		return J2EEProjectUtilities.EJB;
+	}
+
+	public EjbProjectFirstPage(IDataModel model, String pageName) {
+		super(model, pageName);
+		setTitle(EJBUIMessages.EJB_PROJECT_MAIN_PG_TITLE);
+		setDescription(EJBUIMessages.EJB_PROJECT_MAIN_PG_DESC);
+		setImageDescriptor(J2EEUIPlugin.getDefault().getImageDescriptor(J2EEUIPluginIcons.EJB_PROJECT_WIZARD_BANNER));
+		setInfopopID(IJ2EEUIContextIds.NEW_EJB_WIZARD_P1);
+	}
+
+	@Override
+	protected Set<IProjectFacetVersion> getFacetConfiguration( final IProjectFacetVersion primaryFacetVersion )
+	{
+		IRuntime runtime = (IRuntime)model.getProperty(IFacetProjectCreationDataModelProperties.FACET_RUNTIME);
+	    final Set<IProjectFacetVersion> facets = new HashSet<IProjectFacetVersion>( 2 );
+	    
+	    if(runtime != null) {
+	    	facets.addAll(super.getFacetConfiguration(primaryFacetVersion));
+	    }
+	    else {
+		    facets.add(primaryFacetVersion);
+		    
+		    if(primaryFacetVersion == IJ2EEFacetConstants.EJB_32)
+		    {
+		        facets.add(JavaFacet.VERSION_1_7);
+		    }
+		    else if(primaryFacetVersion == IJ2EEFacetConstants.EJB_31)
+		    {
+		        facets.add(JavaFacet.VERSION_1_6);
+		    }
+		    else if(primaryFacetVersion == IJ2EEFacetConstants.EJB_30)
+		    {
+		        facets.add(JavaFacet.VERSION_1_5);
+		    }
+		    else if(primaryFacetVersion == IJ2EEFacetConstants.EJB_21)
+		    {
+		        facets.add(JavaFacet.VERSION_1_4);
+		    }
+		    else if(primaryFacetVersion == IJ2EEFacetConstants.EJB_20 || 
+		    		primaryFacetVersion == IJ2EEFacetConstants.EJB_11)
+		    {
+		        facets.add(JavaFacet.VERSION_1_3);
+		    }
+	    }
+	    return Collections.unmodifiableSet( facets );
+	}
+}
diff --git a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/project/facet/EjbProjectWizard.java b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/project/facet/EjbProjectWizard.java
new file mode 100644
index 0000000..e93f1a3
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/project/facet/EjbProjectWizard.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.ejb.ui.project.facet;
+
+import java.net.URL;
+
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.jst.ejb.ui.internal.util.EJBUIMessages;
+import org.eclipse.jst.j2ee.internal.ejb.project.operations.EjbFacetProjectCreationDataModelProvider;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.project.facet.core.IFacetedProjectTemplate;
+import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
+import org.eclipse.wst.project.facet.IProductConstants;
+import org.eclipse.wst.project.facet.ProductManager;
+import org.eclipse.wst.web.ui.internal.wizards.NewProjectDataModelFacetWizard;
+import org.osgi.framework.Bundle;
+
+public class EjbProjectWizard extends NewProjectDataModelFacetWizard {
+
+	public EjbProjectWizard(IDataModel model){
+		super(model);
+		setWindowTitle(EJBUIMessages.KEY_1);
+	}
+	
+	public EjbProjectWizard(){
+		super();
+		setWindowTitle(EJBUIMessages.KEY_1);
+	}
+	
+	@Override
+	protected IDataModel createDataModel() {
+		return DataModelFactory.createDataModel(new EjbFacetProjectCreationDataModelProvider());
+	}
+
+	@Override
+	protected IFacetedProjectTemplate getTemplate() {
+		return ProjectFacetsManager.getTemplate("template.jst.ejb"); //$NON-NLS-1$
+	}
+
+	@Override
+	protected IWizardPage createFirstPage() {
+		return new EjbProjectFirstPage(model, "first.page"); //$NON-NLS-1$
+	}
+	
+	@Override
+	protected ImageDescriptor getDefaultPageImageDescriptor() {
+		final Bundle bundle = Platform.getBundle("org.eclipse.jst.ejb.ui"); //$NON-NLS-1$
+		final URL url = bundle.getEntry("icons/full/wizban/ejbproject_wiz.gif"); //$NON-NLS-1$
+		return ImageDescriptor.createFromURL(url);
+	}
+	
+	@Override
+	protected String getFinalPerspectiveID() {
+        return ProductManager.getProperty(IProductConstants.FINAL_PERSPECTIVE_EJB);
+	}
+	
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/20_cmpbean_obj.gif b/plugins/org.eclipse.jst.ejb.ui/icons/20_cmpbean_obj.gif
new file mode 100644
index 0000000..023fe8d
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/20_cmpbean_obj.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/EjbModule.gif b/plugins/org.eclipse.jst.ejb.ui/icons/EjbModule.gif
new file mode 100644
index 0000000..f8b5c0a
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/EjbModule.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/adown.gif b/plugins/org.eclipse.jst.ejb.ui/icons/adown.gif
new file mode 100644
index 0000000..91e708f
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/adown.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/appclientgroup_obj.gif b/plugins/org.eclipse.jst.ejb.ui/icons/appclientgroup_obj.gif
new file mode 100644
index 0000000..2768428
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/appclientgroup_obj.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/arrow_down.gif b/plugins/org.eclipse.jst.ejb.ui/icons/arrow_down.gif
new file mode 100644
index 0000000..3c455c9
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/arrow_down.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/arrowp.gif b/plugins/org.eclipse.jst.ejb.ui/icons/arrowp.gif
new file mode 100644
index 0000000..a906320
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/arrowp.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/cascade_left.gif b/plugins/org.eclipse.jst.ejb.ui/icons/cascade_left.gif
new file mode 100644
index 0000000..788e76d
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/cascade_left.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/cascade_left2.gif b/plugins/org.eclipse.jst.ejb.ui/icons/cascade_left2.gif
new file mode 100644
index 0000000..3e31054
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/cascade_left2.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/cascade_right.gif b/plugins/org.eclipse.jst.ejb.ui/icons/cascade_right.gif
new file mode 100644
index 0000000..573b60f
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/cascade_right.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/cmp.gif b/plugins/org.eclipse.jst.ejb.ui/icons/cmp.gif
new file mode 100644
index 0000000..20ed1f9
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/cmp.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/connectorgroup_obj.gif b/plugins/org.eclipse.jst.ejb.ui/icons/connectorgroup_obj.gif
new file mode 100644
index 0000000..ad3af3c
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/connectorgroup_obj.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/deadend.gif b/plugins/org.eclipse.jst.ejb.ui/icons/deadend.gif
new file mode 100644
index 0000000..5df6193
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/deadend.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/eargroup_obj.gif b/plugins/org.eclipse.jst.ejb.ui/icons/eargroup_obj.gif
new file mode 100644
index 0000000..2eeb3ef
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/eargroup_obj.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/ejbgroup_obj.gif b/plugins/org.eclipse.jst.ejb.ui/icons/ejbgroup_obj.gif
new file mode 100644
index 0000000..b0adb3e
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/ejbgroup_obj.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/folder.gif b/plugins/org.eclipse.jst.ejb.ui/icons/folder.gif
new file mode 100644
index 0000000..c91b267
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/folder.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/clcl16/ejb_client_remove_action_obj.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/clcl16/ejb_client_remove_action_obj.gif
new file mode 100644
index 0000000..1823211
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/clcl16/ejb_client_remove_action_obj.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/clcl16/ejb_deploy_action_obj.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/clcl16/ejb_deploy_action_obj.gif
new file mode 100644
index 0000000..db8945f
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/clcl16/ejb_deploy_action_obj.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/ctool16/appclient_export.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/ctool16/appclient_export.gif
new file mode 100644
index 0000000..6f83300
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/ctool16/appclient_export.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/ctool16/appclient_import_wiz.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/ctool16/appclient_import_wiz.gif
new file mode 100644
index 0000000..ce667f4
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/ctool16/appclient_import_wiz.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/ctool16/ejb_client_remove_action_obj.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/ctool16/ejb_client_remove_action_obj.gif
new file mode 100644
index 0000000..1823211
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/ctool16/ejb_client_remove_action_obj.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/ctool16/ejbclientjar_wiz.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/ctool16/ejbclientjar_wiz.gif
new file mode 100644
index 0000000..6e65e7d
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/ctool16/ejbclientjar_wiz.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/ctool16/export_ear.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/ctool16/export_ear.gif
new file mode 100644
index 0000000..2270b17
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/ctool16/export_ear.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/ctool16/export_ejbjar_wiz.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/ctool16/export_ejbjar_wiz.gif
new file mode 100644
index 0000000..72cd417
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/ctool16/export_ejbjar_wiz.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/ctool16/export_rar.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/ctool16/export_rar.gif
new file mode 100644
index 0000000..befb3d4
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/ctool16/export_rar.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/ctool16/exportwar_wiz.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/ctool16/exportwar_wiz.gif
new file mode 100644
index 0000000..ced859d
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/ctool16/exportwar_wiz.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/ctool16/import_ear.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/ctool16/import_ear.gif
new file mode 100644
index 0000000..099201b
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/ctool16/import_ear.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/ctool16/import_ejbjar.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/ctool16/import_ejbjar.gif
new file mode 100644
index 0000000..5644b48
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/ctool16/import_ejbjar.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/ctool16/import_rar.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/ctool16/import_rar.gif
new file mode 100644
index 0000000..50f25a2
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/ctool16/import_rar.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/ctool16/importwar_wiz.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/ctool16/importwar_wiz.gif
new file mode 100644
index 0000000..432c066
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/ctool16/importwar_wiz.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/ctool16/msgdrivenbean_wiz.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/ctool16/msgdrivenbean_wiz.gif
new file mode 100644
index 0000000..30eae50
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/ctool16/msgdrivenbean_wiz.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/ctool16/newappclient_wiz.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/ctool16/newappclient_wiz.gif
new file mode 100644
index 0000000..0ce86a1
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/ctool16/newappclient_wiz.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/ctool16/newconnectionprj_wiz.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/ctool16/newconnectionprj_wiz.gif
new file mode 100644
index 0000000..1bec6ba
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/ctool16/newconnectionprj_wiz.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/ctool16/newear_wiz.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/ctool16/newear_wiz.gif
new file mode 100644
index 0000000..8b409b5
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/ctool16/newear_wiz.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/ctool16/newejbprj_wiz.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/ctool16/newejbprj_wiz.gif
new file mode 100644
index 0000000..ecda22b
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/ctool16/newejbprj_wiz.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/ctool16/newwar_wiz.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/ctool16/newwar_wiz.gif
new file mode 100644
index 0000000..b9ac6be
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/ctool16/newwar_wiz.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/ctool16/sessionbean_wiz.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/ctool16/sessionbean_wiz.gif
new file mode 100644
index 0000000..b9a8d71
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/ctool16/sessionbean_wiz.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/cview16/j2ee_view.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/cview16/j2ee_view.gif
new file mode 100644
index 0000000..20acd4c
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/cview16/j2ee_view.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/dlcl16/ejb_client_remove_action_obj.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/dlcl16/ejb_client_remove_action_obj.gif
new file mode 100644
index 0000000..928a0bf
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/dlcl16/ejb_client_remove_action_obj.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/dlcl16/ejb_deploy_action_obj.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/dlcl16/ejb_deploy_action_obj.gif
new file mode 100644
index 0000000..9657388
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/dlcl16/ejb_deploy_action_obj.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/obj16/13_ear_obj.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/obj16/13_ear_obj.gif
new file mode 100644
index 0000000..54b9b17
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/obj16/13_ear_obj.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/obj16/21_cmpbean_obj.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/obj16/21_cmpbean_obj.gif
new file mode 100644
index 0000000..35835bc
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/obj16/21_cmpbean_obj.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/obj16/21_ejb_obj.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/obj16/21_ejb_obj.gif
new file mode 100644
index 0000000..673ba6a
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/obj16/21_ejb_obj.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/obj16/21_ejbjar_wiz.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/obj16/21_ejbjar_wiz.gif
new file mode 100644
index 0000000..9dae052
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/obj16/21_ejbjar_wiz.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/obj16/annotation_positioned_overlay.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/obj16/annotation_positioned_overlay.gif
new file mode 100644
index 0000000..cec1d2d
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/obj16/annotation_positioned_overlay.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/obj16/appclient_14.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/obj16/appclient_14.gif
new file mode 100644
index 0000000..b248380
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/obj16/appclient_14.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/obj16/appclient_14_deploy.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/obj16/appclient_14_deploy.gif
new file mode 100644
index 0000000..b0d08af
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/obj16/appclient_14_deploy.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/obj16/extwebserviceitemprovider_obj.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/obj16/extwebserviceitemprovider_obj.gif
new file mode 100644
index 0000000..f4cc6e3
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/obj16/extwebserviceitemprovider_obj.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/obj16/home_interface_positioned_overlay.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/obj16/home_interface_positioned_overlay.gif
new file mode 100644
index 0000000..91a756a
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/obj16/home_interface_positioned_overlay.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/obj16/local_home_interface_positioned_overlay.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/obj16/local_home_interface_positioned_overlay.gif
new file mode 100644
index 0000000..e5d6090
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/obj16/local_home_interface_positioned_overlay.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/obj16/local_interface_positioned_overlay.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/obj16/local_interface_positioned_overlay.gif
new file mode 100644
index 0000000..156febe
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/obj16/local_interface_positioned_overlay.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/obj16/remote_interface_positioned_overlay.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/obj16/remote_interface_positioned_overlay.gif
new file mode 100644
index 0000000..203e398
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/obj16/remote_interface_positioned_overlay.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/obj16/service_interface_positioned_overlay.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/obj16/service_interface_positioned_overlay.gif
new file mode 100644
index 0000000..6146667
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/obj16/service_interface_positioned_overlay.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/obj16/webServiceItemProvider_obj.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/obj16/webServiceItemProvider_obj.gif
new file mode 100644
index 0000000..8fb844f
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/obj16/webServiceItemProvider_obj.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/obj16/webServicesFolder_obj.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/obj16/webServicesFolder_obj.gif
new file mode 100644
index 0000000..ab3039c
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/obj16/webServicesFolder_obj.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/obj16/webapp_14.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/obj16/webapp_14.gif
new file mode 100644
index 0000000..83f9165
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/obj16/webapp_14.gif
Binary files differ
diff --git a/plugins/org.eclipse.wst.web/icons/full/obj16/webstatic_deploy.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/obj16/webapp_deploy.gif
similarity index 100%
rename from plugins/org.eclipse.wst.web/icons/full/obj16/webstatic_deploy.gif
rename to plugins/org.eclipse.jst.ejb.ui/icons/full/obj16/webapp_deploy.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/annotation_bean_overlay.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/annotation_bean_overlay.gif
new file mode 100644
index 0000000..f277755
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/annotation_bean_overlay.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/annotation_positioned_overlay.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/annotation_positioned_overlay.gif
new file mode 100644
index 0000000..cec1d2d
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/annotation_positioned_overlay.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/client_app_ovr.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/client_app_ovr.gif
new file mode 100644
index 0000000..3ff1ca5
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/client_app_ovr.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/connector_ovr.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/connector_ovr.gif
new file mode 100644
index 0000000..b7e77bc
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/connector_ovr.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/dis_annotation_bean_overlay.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/dis_annotation_bean_overlay.gif
new file mode 100644
index 0000000..dac498a
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/dis_annotation_bean_overlay.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/ejb_module_ovr.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/ejb_module_ovr.gif
new file mode 100644
index 0000000..cf50d6d
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/ejb_module_ovr.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/enterprise_app_ovr.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/enterprise_app_ovr.gif
new file mode 100644
index 0000000..ec19c47
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/enterprise_app_ovr.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/externalWebServiceOverlay_obj.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/externalWebServiceOverlay_obj.gif
new file mode 100644
index 0000000..daff412
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/externalWebServiceOverlay_obj.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/home_interface_overlay_obj.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/home_interface_overlay_obj.gif
new file mode 100644
index 0000000..48380fc
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/home_interface_overlay_obj.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/home_interface_positioned_overlay.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/home_interface_positioned_overlay.gif
new file mode 100644
index 0000000..91a756a
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/home_interface_positioned_overlay.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/key_interf_ov.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/key_interf_ov.gif
new file mode 100644
index 0000000..3070440
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/key_interf_ov.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/local_home_interface_overlay_obj.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/local_home_interface_overlay_obj.gif
new file mode 100644
index 0000000..d782734
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/local_home_interface_overlay_obj.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/local_home_interface_positioned_overlay.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/local_home_interface_positioned_overlay.gif
new file mode 100644
index 0000000..e5d6090
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/local_home_interface_positioned_overlay.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/local_interface_overlay_obj.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/local_interface_overlay_obj.gif
new file mode 100644
index 0000000..43e1655
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/local_interface_overlay_obj.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/local_interface_positioned_overlay.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/local_interface_positioned_overlay.gif
new file mode 100644
index 0000000..156febe
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/local_interface_positioned_overlay.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/remote_interface_overlay_obj.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/remote_interface_overlay_obj.gif
new file mode 100644
index 0000000..19c9cae
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/remote_interface_overlay_obj.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/remote_interface_positioned_overlay.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/remote_interface_positioned_overlay.gif
new file mode 100644
index 0000000..203e398
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/remote_interface_positioned_overlay.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/service_interface_overlay_obj.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/service_interface_overlay_obj.gif
new file mode 100644
index 0000000..93f0679
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/service_interface_overlay_obj.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/service_interface_positioned_overlay.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/service_interface_positioned_overlay.gif
new file mode 100644
index 0000000..6146667
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/service_interface_positioned_overlay.gif
Binary files differ
diff --git a/plugins/org.eclipse.wst.web.ui/icons/full/ovr16/web_module_ovr.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/web_module_ovr.gif
similarity index 100%
rename from plugins/org.eclipse.wst.web.ui/icons/full/ovr16/web_module_ovr.gif
rename to plugins/org.eclipse.jst.ejb.ui/icons/full/ovr16/web_module_ovr.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/add_mess_dest_wiz_ban.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/add_mess_dest_wiz_ban.gif
new file mode 100644
index 0000000..f9941ce
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/add_mess_dest_wiz_ban.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/add_mess_dest_wiz_ban.png b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/add_mess_dest_wiz_ban.png
new file mode 100644
index 0000000..d1c113f
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/add_mess_dest_wiz_ban.png
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/add_web_service_handler_wiz.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/add_web_service_handler_wiz.gif
new file mode 100644
index 0000000..e1fa98a
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/add_web_service_handler_wiz.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/add_web_service_handler_wiz.png b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/add_web_service_handler_wiz.png
new file mode 100644
index 0000000..18219bc
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/add_web_service_handler_wiz.png
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addauthoritycontraints_wiz_.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addauthoritycontraints_wiz_.gif
new file mode 100644
index 0000000..2ec0ffb
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addauthoritycontraints_wiz_.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addauthoritycontraints_wiz_.png b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addauthoritycontraints_wiz_.png
new file mode 100644
index 0000000..d0bec1d
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addauthoritycontraints_wiz_.png
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addcmpfiled_wiz_ban.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addcmpfiled_wiz_ban.gif
new file mode 100644
index 0000000..879329e
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addcmpfiled_wiz_ban.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addcmpfiled_wiz_ban.png b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addcmpfiled_wiz_ban.png
new file mode 100644
index 0000000..0925e1b
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addcmpfiled_wiz_ban.png
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addcontextparameter_wiz_ban.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addcontextparameter_wiz_ban.gif
new file mode 100644
index 0000000..6457e12
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addcontextparameter_wiz_ban.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addcontextparameter_wiz_ban.png b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addcontextparameter_wiz_ban.png
new file mode 100644
index 0000000..b804711
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addcontextparameter_wiz_ban.png
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addenvirentry_wiz_ban.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addenvirentry_wiz_ban.gif
new file mode 100644
index 0000000..653ab02
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addenvirentry_wiz_ban.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addenvirentry_wiz_ban.png b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addenvirentry_wiz_ban.png
new file mode 100644
index 0000000..27a4c27
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addenvirentry_wiz_ban.png
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/adderrorcodeerror_wiz_ban.g.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/adderrorcodeerror_wiz_ban.g.gif
new file mode 100644
index 0000000..2eb9efe
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/adderrorcodeerror_wiz_ban.g.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/adderrorcodeerror_wiz_ban.png b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/adderrorcodeerror_wiz_ban.png
new file mode 100644
index 0000000..5df26da
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/adderrorcodeerror_wiz_ban.png
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addexceptionerrorpage_wiz_ban.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addexceptionerrorpage_wiz_ban.gif
new file mode 100644
index 0000000..e12d2ac
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addexceptionerrorpage_wiz_ban.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addexceptionerrorpage_wiz_ban.png b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addexceptionerrorpage_wiz_ban.png
new file mode 100644
index 0000000..dc0bac2
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addexceptionerrorpage_wiz_ban.png
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addfiltermapping_wiz_ban.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addfiltermapping_wiz_ban.gif
new file mode 100644
index 0000000..5b53010
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addfiltermapping_wiz_ban.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addfiltermapping_wiz_ban.png b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addfiltermapping_wiz_ban.png
new file mode 100644
index 0000000..8d5d070
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addfiltermapping_wiz_ban.png
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addhandlersoapheader_wiz_ba.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addhandlersoapheader_wiz_ba.gif
new file mode 100644
index 0000000..189c3e9
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addhandlersoapheader_wiz_ba.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addhandlersoapheader_wiz_ba.png b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addhandlersoapheader_wiz_ba.png
new file mode 100644
index 0000000..1e349d8
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addhandlersoapheader_wiz_ba.png
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addjsppropgropu_wiz_ban.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addjsppropgropu_wiz_ban.gif
new file mode 100644
index 0000000..624fe7f
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addjsppropgropu_wiz_ban.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addjsppropgropu_wiz_ban.png b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addjsppropgropu_wiz_ban.png
new file mode 100644
index 0000000..e706bd9
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addjsppropgropu_wiz_ban.png
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addlocencodingmap_wiz_ban.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addlocencodingmap_wiz_ban.gif
new file mode 100644
index 0000000..46e3e08
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addlocencodingmap_wiz_ban.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addlocencodingmap_wiz_ban.png b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addlocencodingmap_wiz_ban.png
new file mode 100644
index 0000000..c9e8dfb
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addlocencodingmap_wiz_ban.png
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addmimemapping_wiz_ban.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addmimemapping_wiz_ban.gif
new file mode 100644
index 0000000..bb856a4
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addmimemapping_wiz_ban.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addmimemapping_wiz_ban.png b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addmimemapping_wiz_ban.png
new file mode 100644
index 0000000..150572e
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addmimemapping_wiz_ban.png
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addservletmapping_wiz_ban.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addservletmapping_wiz_ban.gif
new file mode 100644
index 0000000..2820c5a
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addservletmapping_wiz_ban.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addservletmapping_wiz_ban.png b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addservletmapping_wiz_ban.png
new file mode 100644
index 0000000..ad4e5d7
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addservletmapping_wiz_ban.png
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addtaglibref_wiz_ban.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addtaglibref_wiz_ban.gif
new file mode 100644
index 0000000..d238b56
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addtaglibref_wiz_ban.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addtaglibref_wiz_ban.png b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addtaglibref_wiz_ban.png
new file mode 100644
index 0000000..b542037
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addtaglibref_wiz_ban.png
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addwebSecuritycontraint_wiz.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addwebSecuritycontraint_wiz.gif
new file mode 100644
index 0000000..fc97d84
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addwebSecuritycontraint_wiz.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addwebSecuritycontraint_wiz.png b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addwebSecuritycontraint_wiz.png
new file mode 100644
index 0000000..6645a29
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addwebSecuritycontraint_wiz.png
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addwebrescollection_wiz_ban.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addwebrescollection_wiz_ban.gif
new file mode 100644
index 0000000..7dfe6e9
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addwebrescollection_wiz_ban.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addwebrescollection_wiz_ban.png b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addwebrescollection_wiz_ban.png
new file mode 100644
index 0000000..d2b34f5
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addwebrescollection_wiz_ban.png
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addwebsecurityroleref_wiz_b.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addwebsecurityroleref_wiz_b.gif
new file mode 100644
index 0000000..aab4b50
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addwebsecurityroleref_wiz_b.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addwebsecurityroleref_wiz_b.png b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addwebsecurityroleref_wiz_b.png
new file mode 100644
index 0000000..876d586
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addwebsecurityroleref_wiz_b.png
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addwelcomepage_wiz_ban.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addwelcomepage_wiz_ban.gif
new file mode 100644
index 0000000..e0f50cc
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addwelcomepage_wiz_ban.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addwelcomepage_wiz_ban.png b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addwelcomepage_wiz_ban.png
new file mode 100644
index 0000000..6ea6e23
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/addwelcomepage_wiz_ban.png
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/appclient_wiz.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/appclient_wiz.gif
new file mode 100644
index 0000000..56d7fa7
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/appclient_wiz.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/appclient_wiz.png b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/appclient_wiz.png
new file mode 100644
index 0000000..81b82df
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/appclient_wiz.png
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/connection_migration_wizard.png b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/connection_migration_wizard.png
new file mode 100644
index 0000000..0810c5a
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/connection_migration_wizard.png
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/connection_migration_wizard_wiz.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/connection_migration_wizard_wiz.gif
new file mode 100644
index 0000000..e9ecba5
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/connection_migration_wizard_wiz.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/connector_wiz.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/connector_wiz.gif
new file mode 100644
index 0000000..231f8d3
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/connector_wiz.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/connector_wiz.png b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/connector_wiz.png
new file mode 100644
index 0000000..fd5c26b
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/connector_wiz.png
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/ear_wiz.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/ear_wiz.gif
new file mode 100644
index 0000000..625e763
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/ear_wiz.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/ear_wiz.png b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/ear_wiz.png
new file mode 100644
index 0000000..e3631e5
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/ear_wiz.png
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/ejbclientjar_wizban.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/ejbclientjar_wizban.gif
new file mode 100644
index 0000000..231da61
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/ejbclientjar_wizban.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/ejbclientjar_wizban.png b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/ejbclientjar_wizban.png
new file mode 100644
index 0000000..9eca1eb
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/ejbclientjar_wizban.png
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/ejbproject_wiz.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/ejbproject_wiz.gif
new file mode 100644
index 0000000..7f2aa1e
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/ejbproject_wiz.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/ejbproject_wiz.png b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/ejbproject_wiz.png
new file mode 100644
index 0000000..581b413
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/ejbproject_wiz.png
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/export_appclient_wiz.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/export_appclient_wiz.gif
new file mode 100644
index 0000000..3515396
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/export_appclient_wiz.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/export_ear_wiz.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/export_ear_wiz.gif
new file mode 100644
index 0000000..a327fa6
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/export_ear_wiz.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/export_ejbjar_obj.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/export_ejbjar_obj.gif
new file mode 100644
index 0000000..adca79e
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/export_ejbjar_obj.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/export_rar_wiz.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/export_rar_wiz.gif
new file mode 100644
index 0000000..6047f1a
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/export_rar_wiz.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/export_war_wiz.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/export_war_wiz.gif
new file mode 100644
index 0000000..d251242
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/export_war_wiz.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/import_appclient_wiz.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/import_appclient_wiz.gif
new file mode 100644
index 0000000..351a31d
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/import_appclient_wiz.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/import_ear_wiz.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/import_ear_wiz.gif
new file mode 100644
index 0000000..67754de
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/import_ear_wiz.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/import_ejbjar_wiz.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/import_ejbjar_wiz.gif
new file mode 100644
index 0000000..d123519
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/import_ejbjar_wiz.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/import_rar_wiz.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/import_rar_wiz.gif
new file mode 100644
index 0000000..ea9dff4
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/import_rar_wiz.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/import_war_wiz.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/import_war_wiz.gif
new file mode 100644
index 0000000..514274d
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/import_war_wiz.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/init_param_wiz_ban.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/init_param_wiz_ban.gif
new file mode 100644
index 0000000..3fb6df4
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/init_param_wiz_ban.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/mdb_2_1_jms_creation_wiz.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/mdb_2_1_jms_creation_wiz.gif
new file mode 100644
index 0000000..51b1d5a
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/mdb_2_1_jms_creation_wiz.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/mdb_2_1_non_jms_creation_wi.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/mdb_2_1_non_jms_creation_wi.gif
new file mode 100644
index 0000000..51b1d5a
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/mdb_2_1_non_jms_creation_wi.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/newejb_wiz_ban.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/newejb_wiz_ban.gif
new file mode 100644
index 0000000..2ee5da2
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/newejb_wiz_ban.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/versionmigrate3_wiz.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/versionmigrate3_wiz.gif
new file mode 100644
index 0000000..9b72bf5
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/versionmigrate3_wiz.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/war_wiz.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/war_wiz.gif
new file mode 100644
index 0000000..d964e2e
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/war_wiz.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/web_library_project_wiz_ban.gif b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/web_library_project_wiz_ban.gif
new file mode 100644
index 0000000..767a416
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/full/wizban/web_library_project_wiz_ban.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/jar_obj.gif b/plugins/org.eclipse.jst.ejb.ui/icons/jar_obj.gif
new file mode 100644
index 0000000..ec315d5
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/jar_obj.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/jcu_obj.gif b/plugins/org.eclipse.jst.ejb.ui/icons/jcu_obj.gif
new file mode 100644
index 0000000..36a73ac
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/jcu_obj.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/key_interf_ov.gif b/plugins/org.eclipse.jst.ejb.ui/icons/key_interf_ov.gif
new file mode 100644
index 0000000..3070440
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/key_interf_ov.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/left_arrow.gif b/plugins/org.eclipse.jst.ejb.ui/icons/left_arrow.gif
new file mode 100644
index 0000000..3bc3831
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/left_arrow.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/right_arrow.gif b/plugins/org.eclipse.jst.ejb.ui/icons/right_arrow.gif
new file mode 100644
index 0000000..d03e351
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/right_arrow.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/servlet.gif b/plugins/org.eclipse.jst.ejb.ui/icons/servlet.gif
new file mode 100644
index 0000000..fc1bece
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/servlet.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/sessionBean_obj.gif b/plugins/org.eclipse.jst.ejb.ui/icons/sessionBean_obj.gif
new file mode 100644
index 0000000..507b8a8
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/sessionBean_obj.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/showerr_tsk.gif b/plugins/org.eclipse.jst.ejb.ui/icons/showerr_tsk.gif
new file mode 100644
index 0000000..0bc6068
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/showerr_tsk.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/showwarn_tsk.gif b/plugins/org.eclipse.jst.ejb.ui/icons/showwarn_tsk.gif
new file mode 100644
index 0000000..14009e9
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/showwarn_tsk.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/srvce_elem_obj.gif b/plugins/org.eclipse.jst.ejb.ui/icons/srvce_elem_obj.gif
new file mode 100644
index 0000000..6fdcb3f
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/srvce_elem_obj.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/webgroup_obj.gif b/plugins/org.eclipse.jst.ejb.ui/icons/webgroup_obj.gif
new file mode 100644
index 0000000..274d361
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/webgroup_obj.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/webservicedesc.gif b/plugins/org.eclipse.jst.ejb.ui/icons/webservicedesc.gif
new file mode 100644
index 0000000..8fb844f
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/webservicedesc.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/icons/wsdl.gif b/plugins/org.eclipse.jst.ejb.ui/icons/wsdl.gif
new file mode 100644
index 0000000..8fb844f
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/icons/wsdl.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.ejb.ui/plugin.properties b/plugins/org.eclipse.jst.ejb.ui/plugin.properties
new file mode 100644
index 0000000..2b540c2
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/plugin.properties
@@ -0,0 +1,110 @@
+###############################################################################
+# Copyright (c) 2005, 2006 IBM 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:
+#     IBM Corporation - initial API and implementation
+#     Oracle - EJB Timer
+###############################################################################
+providerName=Eclipse.org
+pluginName=WTP EJB UI Plug-in
+
+j2ee=J2EE
+new.appclient.project.description_ui_=Create an Application Client project
+appclient.project_ui_=Application Client Project
+j2ee.view_ui_=Project Explorer 
+ejb.class.java.editor_ui_=Enterprise Bean Java Editor
+ejb.extension.editor_ui_=EJB Extension Editor
+application.extension.editor_ui_=Application Extension Editor
+ejb.properties_ui_=EJB Properties
+client.jar.file_ui_=App Client JAR file
+client.import.description_ui_=Import an external Application Client JAR file into an Application Client project
+client.import.action.description_ui_=Import Application Client...
+client.export.description_ui_=Export an Application Client project into an Application Client JAR file
+client.export.action.description_ui_=Export Application Client...
+ear.file_ui_=EAR file
+ear.import.description_ui_=Import an external EAR file into an Enterprise Application project
+ear.import.action.description_ui_=Import EAR File...
+ear.export.description_ui_=Export an Enterprise Application project into an EAR file
+ear.export.action.description_ui_=Export EAR File...
+ejb.project_ui_=EJB Project
+client.project_ui_=Application Client Project
+new.client.project.description_ui_=Create an Application Client project
+ear.project_ui_=Enterprise Application Project
+new.ear.project.description_ui_=Create an Enterprise Application project
+create.finders.action_ui_=Create Finders
+j2ee.actions.description_ui_=Actions for Java EE Development
+create.enterprise.application_ui_=Create an Enterprise Application
+create.web.module_ui_=Create a Web project
+create.web.project_ui_=Create a Web project
+create.client.module_ui_=Create an Application Client project
+create_servlet_ui_=Create Java Servlet file
+client.export.action.label_ui_=Export Application Client JAR...
+j2eeProjectDecorator=J2EE Project Decorator
+j2eeProjectDecorator.description=Adds a version decorator to Java EE projects.
+utilJarDeployableLabel=Project Utility JAR
+jar.dependency.editor_ui_=JAR Dependency Editor
+jar.dependencies.props_ui_=Java JAR Dependencies
+connector.import.action.label_ui_=Import RAR File...
+connector.export.action.label_ui_=Export RAR File...
+ejb.export.action.description_ui_=Export EJB JAR File...
+ejb.client.jar.creation.action.description_ui_=Create EJB Client Jar
+ejb.client.jar.removal.action.description_ui_=Remove EJB Client Jar
+migrate.menu_ui_=Migrate
+migrateJ2EEProjectStructure.action.label_ui_=J2EE Project Structure...
+migrateJ2EEProjectVersion.action.label_ui_=J2EE Version 1.2 to 1.3...
+openJ2EEMigrationWizard.action.label_ui_=J2EE Migration Wizard...
+enterprise.java.bean_session_ui_=Session Bean
+enterprise.java.bean_bmp_ui_=BMP Entity Bean
+enterprise.java.bean_cmp_ui_=CMP Entity Bean
+enterprise.java.bean_message_ui_=Message-Driven Bean
+emptyEJBGroupFilter.name=Empty EJB groups
+emptyEJBGroupFilter.description=Hides all empty EJB groups
+serverTarget.menu_ui_=Target Server
+ejbClientJAR.menu_ui=EJB Client JAR
+modifyServerTarget.action.label_ui_=Modify...
+syncServerTarget.action.label_ui_=Synchronize...
+classes.import.action.label_ui_=Import Class Files...
+ejb.action.set.description=Actions for EJB Development
+ejb.import.description_ui_=Import an external EJB JAR file into an EJB project
+ejb.import.action.description_ui_=Import EJB JAR File...
+ejb.export.description_ui_=Export an EJB project into an EJB JAR file
+new.ejb.project.description_ui_=Create an EJB project
+new_ejb_description_ui_=Create an enterprise bean
+connector.project_ui_=Connector Project
+new.connector.project.description_ui_=Create a Connector project
+war.import.description_ui_=Import an external WAR file into an Web project
+war.import.action.description_ui_=Import WAR File...
+war.export.description_ui_=Export a Web project into a WAR file
+war.export.action.description_ui_=Export WAR File...
+connector.import.description_ui_=Import an external Connector RAR file into a Connector project
+connector.export.description_ui_=Export a Connector project into a Connector RAR file
+connector.jar.file_ui_=RAR file
+ejb.category_ui_=EJB
+web.category_ui_=Web
+web.project_ui_=Dynamic Web Project
+new.web.project.description_ui_=Create a Dynamic Web project
+ejb.jar.file_ui_=EJB JAR file
+jca.project_ui_=Connector Project
+new.jca.project.description_ui_=Create a Connector project
+WarexportWizard.name=WAR file
+WarexportWizard.description=Export a Web Project into an external WAR file
+WarImportWizard.name=WAR file
+WarImportWizard.description=Import an external WAR file into a Web Project
+beanClassAnnotationDecorator=EJB Bean Class Annotation Decorator
+beanClassAnnotationDecorator.description=Adds decorator(s) to the Bean class of the Enterprise bean which is annotated.
+ejbAnnotationDecorator=Enterprise Bean Annotation Decorator
+ejbAnnotationDecorator.description=Adds decorator(s) to the Enterprise Bean which are annotated.
+create.ejb.module_ui_=Create an EJB module
+
+BeanEjbRegionWizard.name=Session Bean (EJB 3.x)
+BeanWebRegionWizard.description=Create a new EJB 3.x Session Bean
+MDBEjbRegionWizard.name=Message-Driven Bean (EJB 3.x)
+MDBEjbRegionWizard.description=Create a new EJB 3.x Message-Driven Bean
+
+
+EJBTIMER.ejbtimerlabel=EJB Timer
+EJBTIMER.ejbtimer.BeanWebRegionWizard.description=Create a new Java EE 6 EJB Timer
diff --git a/plugins/org.eclipse.jst.ejb.ui/plugin.xml b/plugins/org.eclipse.jst.ejb.ui/plugin.xml
new file mode 100644
index 0000000..397a604
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/plugin.xml
@@ -0,0 +1,399 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+    
+<!--================================-->
+<!-- Export Wizard Contributions    -->
+<!--================================-->
+   <extension
+         point="org.eclipse.ui.exportWizards">
+      <wizard
+            category="org.eclipse.jst.ejb.ui"
+            class="org.eclipse.jst.ejb.ui.internal.wizard.EJBComponentExportWizard"
+            icon="icons/full/ctool16/export_ejbjar_wiz.gif"
+            id="org.eclipse.jst.ejb.ui.internal.wizard.EJBComponentExportWizard"
+            name="%ejb.jar.file_ui_">
+         <description>
+            %ejb.export.description_ui_
+         </description>
+         <selection
+               class="org.eclipse.core.resources.IResource">
+         </selection>
+      </wizard>
+      <category
+            id="org.eclipse.jst.ejb.ui"
+            name="%ejb.category_ui_"/>
+   </extension>
+
+<!-- New EJB Module Wizard -->
+   <extension
+         point="org.eclipse.ui.newWizards">
+       <category
+            name="%ejb.category_ui_"
+            id="org.eclipse.jst.ejb.ui">
+      </category>
+      <wizard
+            name="%ejb.project_ui_"
+            icon="icons/full/ctool16/newejbprj_wiz.gif"
+            category="org.eclipse.jst.ejb.ui"
+            project="true"
+            finalPerspective="org.eclipse.jst.j2ee.J2EEPerspective"
+            id="org.eclipse.jst.ejb.ui.project.facet.EjbProjectWizard">
+         <class class="org.eclipse.jst.ejb.ui.project.facet.EjbProjectWizard">
+            <parameter name="javaeeproject" value="true"/>
+            <parameter name="menuIndex" value="20" />
+         </class>
+         <description>
+            %new.ejb.project.description_ui_
+         </description>
+      </wizard>
+      <wizard
+            category="org.eclipse.jst.ejb.ui"
+            class="org.eclipse.jst.ejb.ui.internal.wizard.AddSessionBeanWizard"
+            icon="icons/full/ctool16/sessionbean_wiz.gif"
+            id="org.eclipse.jst.ejb.ui.internal.wizard.AddSessionBeanWizard"
+            name="%BeanEjbRegionWizard.name">
+         <class class="org.eclipse.jst.ejb.ui.internal.wizard.AddSessionBeanWizard">
+            <parameter name="javaeeartifact" value="true"/>
+            <parameter name="menuIndex" value="35" />
+         </class>
+         <description>
+            %BeanWebRegionWizard.description
+         </description>
+      </wizard>
+      <wizard
+            category="org.eclipse.jst.ejb.ui"
+            class="org.eclipse.jst.ejb.ui.internal.wizard.AddMessageDrivenBeanWizard"
+            icon="icons/full/ctool16/msgdrivenbean_wiz.gif"
+            id="org.eclipse.jst.ejb.ui.internal.wizard.AddMessageDrivenBeanWizard"
+            name="%MDBEjbRegionWizard.name">
+         <class
+               class="org.eclipse.jst.ejb.ui.internal.wizard.AddMessageDrivenBeanWizard">
+            <parameter
+                  name="javaeeartifact"
+                  value="true">
+            </parameter>
+            <parameter
+                  name="menuIndex"
+                  value="36">
+            </parameter>
+         </class>
+         <description>
+            %MDBEjbRegionWizard.description
+         </description>
+      </wizard>
+      
+       <wizard
+             category="org.eclipse.jst.ejb.ui"
+             class="org.eclipse.jst.ejb.ui.internal.wizard.AddEjbTimerWizard"
+             icon="icons/full/ctool16/sessionbean_wiz.gif"
+             id="org.eclipse.jst.ejb.ui.internal.wizard.AddEjbTimerWizard"
+             name="%EJBTIMER.ejbtimerlabel">
+		 <class
+               class="org.eclipse.jst.ejb.ui.internal.wizard.AddEjbTimerWizard">
+            <parameter
+                  name="javaeeartifact"
+                  value="true">
+            </parameter>
+            <parameter
+                  name="menuIndex"
+                  value="37">
+            </parameter>
+         </class>
+         <description>
+            %EJBTIMER.ejbtimer.BeanWebRegionWizard.description
+         </description>
+       </wizard>      
+      
+      
+   </extension>
+<!-- Navigator Object Contributions -->
+<!-- EJB Group Contributions 
+   <extension
+         point="org.eclipse.ui.popupMenus">
+      <objectContribution
+            objectClass="org.eclipse.wst.common.navigator.internal.groups.NavigatorGroup"
+            id="org.eclipse.jst.j2ee.internal.navigator.ui.ejbProjectActions">
+         <action
+               label="%ejb.jar.file_ui_"
+               icon="icons/full/ctool16/import_ejbjar.gif"
+               class="org.eclipse.jst.ejb.ui.internal.actions.ImportEJBAction"
+               menubarPath="org.eclipse.wst.common.frameworks.internal.navigator.import.menu/additions"
+               enablesFor="1"
+               id="org.eclipse.jst.ejb.ui.internal.actions.ImportEJBAction">
+         </action>
+         <action
+               label="%ejb.jar.file_ui_"
+               icon="icons/full/ctool16/export_ejbjar_wiz.gif"
+               class="org.eclipse.jst.ejb.ui.internal.actions.ExportEJBAction"
+               menubarPath="org.eclipse.wst.common.frameworks.internal.navigator.export.menu/additions"
+               enablesFor="1"
+               id="org.eclipse.jst.ejb.ui.internal.actions.ExportEJBAction">
+         </action>
+         <visibility>
+            <objectState
+                  name="projectNature"
+                  value="org.eclipse.jst.j2ee.ejb.EJBNature">
+            </objectState>
+         </visibility>
+      </objectContribution>
+   </extension>
+   -->
+   
+<!-- ====================================================== -->
+<!--           Label Decorators                             -->
+<!-- ====================================================== -->
+  
+    <extension
+         point="org.eclipse.ui.decorators">
+         <decorator
+               lightweight="true"
+               adaptable="true"
+               label="%ejbAnnotationDecorator"
+               class="org.eclipse.jst.j2ee.internal.ui.util.AnnotationIconDecorator"
+               state="true"
+               location="TOP_LEFT"
+               id="org.eclipse.jst.j2ee.internal.ui.util.AnnotationIconDecorator_ejb">
+         <description>
+            %ejbAnnotationDecorator.description
+         </description>
+         <enablement>
+         	<or>
+              <objectClass
+                   name="org.eclipse.jst.j2ee.internal.ejb.provider.BeanClassProviderHelper">
+              </objectClass>
+              <objectClass
+                   name="org.eclipse.jst.j2ee.ejb.EnterpriseBean">
+              </objectClass>
+            </or>
+         </enablement>
+      </decorator>
+    </extension> 
+    
+    <extension point="org.eclipse.core.runtime.adapters">
+         <factory
+             class="org.eclipse.jst.ejb.ui.internal.deployables.EJBDeployableArtifactAdapterFactory"
+             adaptableType="org.eclipse.core.resources.IProject">
+             <adapter type= "org.eclipse.debug.ui.actions.ILaunchable"/> 
+        </factory>
+        <factory
+             class="org.eclipse.jst.ejb.ui.internal.deployables.EJBDeployableArtifactAdapterFactory"
+             adaptableType="org.eclipse.jdt.core.ICompilationUnit">
+             <adapter type= "org.eclipse.debug.ui.actions.ILaunchable"/> 
+        </factory>
+        <factory
+             class="org.eclipse.jst.ejb.ui.internal.deployables.EJBDeployableArtifactAdapterFactory"
+             adaptableType="org.eclipse.core.resources.IFile">
+            <adapter type= "org.eclipse.debug.ui.actions.ILaunchable"/> 
+       </factory>
+       <factory
+             class="org.eclipse.jst.ejb.ui.internal.deployables.EJBDeployableArtifactAdapterFactory"
+             adaptableType="org.eclipse.jst.j2ee.ejb.EnterpriseBean">
+             <adapter type= "org.eclipse.debug.ui.actions.ILaunchable"/> 
+       </factory>
+       <factory
+             class="org.eclipse.jst.ejb.ui.internal.deployables.EJBDeployableArtifactAdapterFactory"
+             adaptableType="org.eclipse.jst.j2ee.ejb.EJBJar">
+             <adapter type= "org.eclipse.debug.ui.actions.ILaunchable"/> 
+       </factory>
+   </extension>
+   
+   <!-- ==================================================================== -->
+<!-- Purpose: Define adapters for EJB resources                           -->
+<!-- Extension point: org.eclipse.wst.server.core.moduleArtifactAdapters  -->
+<!-- ==================================================================== -->
+   <extension
+         point="org.eclipse.wst.server.core.moduleArtifactAdapters">
+      <moduleArtifactAdapter
+            id="org.eclipse.jst.j2ee.server.ejb"
+            class="org.eclipse.jst.ejb.ui.internal.deployables.EJBDeployableArtifactAdapterFactory">
+         <enablement>
+           <with variable="selection">
+             <adapt type="org.eclipse.jst.j2ee.ejb.EJBJar"/>
+           </with>
+         </enablement>
+      </moduleArtifactAdapter>
+      <moduleArtifactAdapter
+            id="org.eclipse.jst.j2ee.server.ejb2"
+            class="org.eclipse.jst.ejb.ui.internal.deployables.EJBDeployableArtifactAdapterFactory">
+         <enablement>
+           <with variable="selection">
+             <adapt type="org.eclipse.jst.j2ee.ejb.EnterpriseBean"/>
+           </with>
+         </enablement>
+      </moduleArtifactAdapter>
+      <moduleArtifactAdapter
+            id="org.eclipse.jst.j2ee.server.ejb3"
+             class="org.eclipse.jst.ejb.ui.internal.deployables.EJBDeployableArtifactAdapterFactory">
+         <enablement>
+           <with variable="selection">
+             <adapt type="org.eclipse.jdt.core.ICompilationUnit"/>
+           </with>
+         </enablement>
+      </moduleArtifactAdapter>
+      <moduleArtifactAdapter
+            id="org.eclipse.jst.j2ee.server.ejb4"
+             class="org.eclipse.jst.ejb.ui.internal.deployables.EJBDeployableArtifactAdapterFactory">
+         <enablement>
+           <with variable="selection">
+             <adapt type="org.eclipse.core.resources.IFile">
+             <test forcePluginActivation="true"
+							property="org.eclipse.wst.common.project.facet.core.projectFacet"
+							value="jst.ejb:2.1]" />
+			 </adapt>
+           </with>
+         </enablement>
+      </moduleArtifactAdapter>
+      <moduleArtifactAdapter
+            id="org.eclipse.jst.j2ee.server.ejb5"
+             class="org.eclipse.jst.ejb.ui.internal.deployables.EJBDeployableArtifactAdapterFactory">
+         <enablement>
+           <with variable="selection">
+             <adapt type="org.eclipse.core.resources.IProject">
+              <test forcePluginActivation="true"
+							property="org.eclipse.wst.common.project.facet.core.projectFacet"
+							value="jst.ejb:2.1]" />
+			 </adapt>
+           </with>
+         </enablement>
+      </moduleArtifactAdapter>
+      </extension>
+    
+<!--================================-->
+<!-- Import Wizard Contributions    -->
+<!--================================-->
+
+   <extension
+         point="org.eclipse.ui.importWizards">
+      <wizard
+            category="org.eclipse.jst.ejb.ui"
+            class="org.eclipse.jst.ejb.ui.internal.wizard.EJBComponentImportWizard"
+            icon="icons/full/ctool16/import_ejbjar.gif"
+            id="org.eclipse.jst.ejb.ui.internal.wizard.EJBComponentImportWizard"
+            name="%ejb.jar.file_ui_">
+         <description>
+            %ejb.import.description_ui_
+         </description>
+         <selection
+               class="org.eclipse.core.resources.IResource">
+         </selection>
+      </wizard>
+      <category
+            id="org.eclipse.jst.ejb.ui"
+            name="%ejb.category_ui_"/>
+    </extension> 
+    
+    <extension point="org.eclipse.wst.common.project.facet.ui.wizardPages">
+      <wizard-pages action="jst.ejb.install">
+        <page class="org.eclipse.jst.ejb.ui.project.facet.EjbFacetInstallPage"/>
+      </wizard-pages>
+    </extension>   
+    
+<!-- ====================================================== -->
+<!--           EJB Client Action                            -->
+<!-- ====================================================== -->
+
+  
+   <extension
+         point="org.eclipse.ui.popupMenus">
+         
+     
+      <objectContribution
+            objectClass="org.eclipse.core.resources.IProject"
+            adaptable="true"
+            id="org.eclipse.jst.ejb.ui.internal.actions.IProject">
+        <!-- didnt work
+         <menu
+               label="%ejbClientJAR.menu_ui"
+               path="javeeUIPopupMenuCategory/slot3"
+               id="clientJARParent">
+            <separator
+                  name="clientJARChildren">
+            </separator>
+         </menu>
+         -->
+         <action
+               label="%ejb.client.jar.creation.action.description_ui_"
+               icon="icons/full/ctool16/ejbclientjar_wiz.gif"
+               class="org.eclipse.jst.ejb.ui.internal.actions.EJBClientCreationAction"
+               menubarPath="javeeUIPopupMenuCategory/slot3"
+               enablesFor="1"
+               id="org.eclipse.jst.ejb.ui.internal.actions.EJBClientCreationAction">
+         </action>         
+         <action
+               label="%ejb.client.jar.removal.action.description_ui_"
+               icon="icons/full/ctool16/ejb_client_remove_action_obj.gif"
+               class="org.eclipse.jst.ejb.ui.internal.actions.EJBClientRemovalAction"
+               menubarPath="javeeUIPopupMenuCategory/slot3"
+               enablesFor="1"
+               id="org.eclipse.jst.ejb.ui.internal.actions.EJBClientRemovalAction">
+               
+         </action>
+		<enablement>
+		  <adapt type="org.eclipse.core.resources.IProject">
+						<test forcePluginActivation="true"
+							property="org.eclipse.wst.common.project.facet.core.projectFacet"
+							value="jst.ejb" />
+					</adapt>
+		</enablement>
+
+      </objectContribution>
+      
+      
+      <objectContribution
+            objectClass="org.eclipse.emf.ecore.EObject"
+            id="org.eclipse.jst.ejb.ui.internal.actions.EJBClientActions.EJBJar">
+         <menu
+               label="%ejbClientJAR.menu_ui"
+               path="additions"
+               id="clientJARParent">
+            <separator
+                  name="clientJARChildren">
+            </separator>
+         </menu>
+         <action
+               label="%ejb.client.jar.creation.action.description_ui_"
+               icon="icons/full/ctool16/ejbclientjar_wiz.gif"
+               class="org.eclipse.jst.ejb.ui.internal.actions.EJBClientCreationAction"
+               menubarPath="clientJARParent/clientJARChildren"
+               enablesFor="1"
+               id="org.eclipse.jst.ejb.ui.internal.actions.EJBClientCreationAction">
+         </action>
+
+         <action
+               label="%ejb.client.jar.removal.action.description_ui_"
+               icon="icons/full/ctool16/ejb_client_remove_action_obj.gif"
+               class="org.eclipse.jst.ejb.ui.internal.actions.EJBClientRemovalAction"
+               menubarPath="clientJARParent/clientJARChildren"
+               enablesFor="1"
+               id="org.eclipse.jst.ejb.ui.internal.actions.EJBClientRemovalAction">
+         </action>
+
+         <visibility>
+            <objectClass
+                  name="org.eclipse.jst.j2ee.ejb.EJBJar">
+            </objectClass>
+         </visibility>
+      </objectContribution>
+   </extension>
+   <extension
+         point="org.eclipse.wst.common.project.facet.ui.images">
+      <image
+            facet="jst.ejb"
+            path="icons/EjbModule.gif">
+      </image>
+   </extension>  
+   
+   <extension point="org.eclipse.ui.ide.markerResolution">
+      <markerResolutionGenerator
+            class="org.eclipse.jst.ejb.ui.internal.quickfixes.ejb.NoBeansQuickFixer"
+            markerType="org.eclipse.jst.jee.ejb3.nobeans">
+      </markerResolutionGenerator>
+   </extension>
+
+<!-- ====================================================== -->
+<!--           EJB Client Extension                         -->
+<!-- ====================================================== -->
+
+	<extension-point id="ejbClientActionExtension" name ="EjbClientAction" schema="schema/ejbClientAction.exsd"/>       
+</plugin>
diff --git a/plugins/org.eclipse.jst.ejb.ui/pom.xml b/plugins/org.eclipse.jst.ejb.ui/pom.xml
new file mode 100644
index 0000000..12e1454
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/pom.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Copyright (c) 2012, 2013 Eclipse Foundation and others.
+  All rights reserved. This program and the accompanying materials
+  are made available under the terms of the Eclipse Distribution License v1.0
+  which accompanies this distribution, and is available at
+  http://www.eclipse.org/org/documents/edl-v10.php
+ 
+  Contributors:
+    Thanh Ha (Eclipse Foundation) - initial implementation
+-->
+
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.eclipse.webtools.javaee</groupId>
+    <artifactId>javaee.plugins</artifactId>
+    <version>3.6.0-SNAPSHOT</version>
+  </parent>
+
+  <groupId>org.eclipse.webtools.ejb</groupId>
+  <artifactId>org.eclipse.jst.ejb.ui</artifactId>
+  <version>1.1.910-SNAPSHOT</version>
+  <packaging>eclipse-plugin</packaging>
+</project>
diff --git a/plugins/org.eclipse.jst.ejb.ui/prepareforpii.xml b/plugins/org.eclipse.jst.ejb.ui/prepareforpii.xml
new file mode 100644
index 0000000..997f197
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/prepareforpii.xml
@@ -0,0 +1,32 @@
+<project name="PrepareForPII" default="main" basedir=".">
+		
+	<!-- Setup temp variables -->
+	<target name="init">
+		<property name="nlsDir" value="d:/NLS/Corona/0526"/>
+		<property name="plugin" value="com.ibm.wtp.ejb.ui"/>
+		<property name="plugindir" value="d:/workspaceCorona/${plugin}"/>
+		<property name="outputDir" value="${nlsDir}/${plugin}"/>
+		
+	
+	</target>
+
+	<!-- Create the destination dir -->
+	<target name="nlsDir" depends="init">
+		<mkdir dir="${nlsDir}"/>
+	</target>
+	
+	<!-- Create the destination dir -->
+	<target name="plugindir" depends="nlsDir">
+		<delete dir="${outputDir}"/>
+		<mkdir dir="${outputDir}"/>
+	</target>
+
+	<!-- Move the files to the correct locations in the workspace. -->
+	<target name="main" depends="plugindir">
+	
+		<messageIdGen folderPath = "${plugindir}" componentId = "E" />
+  		
+  		<copy file="${plugindir}/plugin.properties" todir="${outputDir}"/>
+  		
+	</target>
+</project>
diff --git a/plugins/org.eclipse.jst.ejb.ui/property_files/ejb_ui.properties b/plugins/org.eclipse.jst.ejb.ui/property_files/ejb_ui.properties
new file mode 100644
index 0000000..15e1a8b
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/property_files/ejb_ui.properties
@@ -0,0 +1,101 @@
+###############################################################################
+# Copyright (c) 2003, 2006 IBM 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:
+# IBM Corporation - initial API and implementation
+# Oracle - EJB Timer
+###############################################################################
+KEY_0=Failed to find the image "{0}".
+KEY_1=New EJB Project
+KEY_2=EJB version:
+KEY_3=EJB Project
+KEY_4=Create an EJB Project and add it to a new or existing Enterprise Application.
+KEY_5=Import an EJB jar from the file system
+KEY_6=EJB Jar Import
+KEY_7=EJB JAR fi&le:
+KEY_8=EJB &project:
+KEY_9=EJB Jar Export
+KEY_10=Export EJB project to the local file system.
+KEY_11=EJB client JAR Creation
+KEY_12=Use this wizard to create an EJB client JAR from your existing EJB
+KEY_13=Client JAR &URI:
+KEY_14=Project name:
+KEY_15=Project location:
+KEY_16=EJB Project:
+KEY_17=Delete Bean Only
+KEY_18=Delete Bean Classes
+KEY_19=Delete Access Bean
+KEY_20=Delete Deployed Code
+KEY_21=Select All
+KEY_22=Deselect All
+KEY_23=The selected enterprise bean cannot be deleted because it is involved in\nrelationships with other enterprise beans.  You must first delete these\nrelationships before deleting the bean.
+KEY_24=Delete...
+KEY_25=Cannot delete Enterprise Bean
+KEY_26=Cannot delete the bean named "{0}" because it is in a binary project.
+KEY_27=Delete Enterprise Bean(s)
+KEY_28=What options would you like when deleting the selected\nEnterprise Bean(s)?
+GroupedEJBJarItemProvider_UI_0=Session
+GroupedEJBJarItemProvider_UI_1=Entity
+GroupedEJBJarItemProvider_UI_2=Message
+NewEJBModuleAction_UI_0=EJB Project
+pageTitle=EJB Module
+pageDescription=Configure EJB module settings.
+configFolderLabel=Config Folder
+
+NEW_JAVA_CLASS_DESTINATION_WIZARD_PAGE_DESC=Specify class file destination.
+NEW_JAVA_CLASS_OPTIONS_WIZARD_PAGE_DESC=Specify modifiers, interfaces to implement, and method stubs to generate.
+ADD_SESSION_BEAN_WIZARD_PAGE_DESC=Enter Session Bean specific information.
+
+STATE_TYPE_LABEL=State &type:
+CREATE_BUSINESS_INTERFACE=Create business interface
+HOMECOMPONENTINTERFACE=H&ome and Component interfaces (EJB 2.x)
+REMOTE_BUSINESS_INTERFACE=&Remote
+REMOTE_BUSINESS_INTERFACE_E=R&emote
+REMOTE_BUSINESS_INTERFACE_LABEL=Remote Business Interface:
+REMOTE_HOME_INTERFACE_LABEL=Remote Home Interface:
+LOCAL_BUSINESS_INTERFACE=&Local
+LOCAL_BUSINESS_INTERFACE_LABEL=Local Business Interface:
+NO_INTERFACE=No-&interface View
+LOCAL_HOME_INTERFACE_LABEL=Local Home Interface:
+LOCAL_COMPONENT_INTERFACE_CODE=L
+LOCAL_HOME_INTERFACE_CODE=LH
+REMOTE_COMPONENT_INTERFACE_CODE=R
+REMOTE_HOME_INTERFACE_CODE=RH
+LOCAL_COMPONENT_INTERFACE_TOOLTIP=Local Component interface
+LOCAL_HOME_INTERFACE_TOOLTIP=Local Home interface
+REMOTE_COMPONENT_INTERFACE_TOOLTIP=Remote Component interface
+REMOTE_HOME_INTERFACE_TOOLTIP=Remote Home interface
+EJB_NAME=Bean na&me:
+TRANSACTION_TYPE_CONTAINER=Container
+TRANSACTION_TYPE_BEAN=Bean
+STATE_TYPE_STATELESS=Stateless
+STATE_TYPE_STATEFUL=Stateful
+chooseInterface=Choose Interface
+addAs=Add as:
+MAPPED_NAME=Ma&pped name:
+TRANSACTION_TYPE=&Transaction type:
+BUSSINESS_INTERFACE=Business interfaces:
+ADD_INTERFACES=Add...
+REMOVE_INTERFACES=Remove
+ADD_SESSION_BEAN_WIZARD_PAGE_TITLE=Create EJB 3.x Session Bean
+ADD_MESSAGE_DRIVEN_BEAN_WIZARD_PAGE_TITLE=Create EJB 3.x Message-Driven Bean
+ADD_MESSAGE_DRIVEN_BEAN_WIZARD_PAGE_DESC=Enter Message-Driven Bean specific information.
+DESTINATION_LABEL=Destination &type:
+DESTINATION_TYPE_QUEUE=Queue
+DESTINATION_TYPE_TOPIC=Topic
+JMS=&JMS
+DESTINATION_NAME_LABEL=Destination n&ame:
+MESSAGE_LISTENER_INTERFACE_HYPERLINK=Message &listener: 
+MESSAGE_LISTENER_INTERFACE_HYPERLINK_TOOLTIP=Set message listener interface
+CLICK_TO_SELECT=<click to select>
+EJB_CLIENT_JAR_GROUP=EJB Client JAR
+ASYNC=As&ynchronous
+
+timerWizardTitle=Create EJB Timer Callback
+timerWizardDescription=Create Java class with an added EJB Timer Callback method.
+timerScheduleLabel=Schedule: 
+NON_PERSISTENT=&Non-persistent
diff --git a/plugins/org.eclipse.jst.ejb.ui/schema/ejbClientAction.exsd b/plugins/org.eclipse.jst.ejb.ui/schema/ejbClientAction.exsd
new file mode 100644
index 0000000..8c62317
--- /dev/null
+++ b/plugins/org.eclipse.jst.ejb.ui/schema/ejbClientAction.exsd
@@ -0,0 +1,116 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.jst.ejb.ui" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+      <appInfo>
+         <meta.schema plugin="org.eclipse.jst.ejb.ui" id="ejbClientActionExtension" name="Ejb Client Action"/>
+      </appInfo>
+      <documentation>
+         This is for adopters to extend the creation of EJB Clients via the Java EE Tools -&gt; Create EJB Client jar action and/or the removal of EJB Clients via the Java EE Tools -&gt; Remove EJB Client jar action
+      </documentation>
+   </annotation>
+
+   <element name="extension">
+      <annotation>
+         <appInfo>
+            <meta.element />
+         </appInfo>
+      </annotation>
+      <complexType>
+         <sequence>
+            <element ref="action"/>
+         </sequence>
+         <attribute name="point" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="name" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="action">
+      <annotation>
+         <documentation>
+            The action that will both test
+         </documentation>
+      </annotation>
+      <complexType>
+         <attribute name="class" type="string" use="required">
+            <annotation>
+               <documentation>
+                  The qualified name of the class that implements org.eclipse.jst.ejb.ui.internal.extensions.IEBJClientActionExtender
+               </documentation>
+               <appInfo>
+                  <meta.attribute kind="java" basedOn=":org.eclipse.jst.ejb.ui.internal.extension.IEJBClientActionExtender"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="since"/>
+      </appInfo>
+      <documentation>
+         This extension point is part of an interim API that is still under development and expected to change significantly before reaching stability. It is being made available at this early stage to solicit feedback from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken (repeatedly) as the API evolves.
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="examples"/>
+      </appInfo>
+      <documentation>
+         [Enter extension point usage example here.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="apiinfo"/>
+      </appInfo>
+      <documentation>
+         [Enter API information here.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="implementation"/>
+      </appInfo>
+      <documentation>
+         [Enter information about supplied implementation of this extension point.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="copyright"/>
+      </appInfo>
+      <documentation>
+         Copyright (c) 2011 IBM Corporation and others.&lt;br&gt;
+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 &lt;a
+href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
+      </documentation>
+   </annotation>
+
+</schema>
diff --git a/plugins/org.eclipse.jst.j2ee.core/jee-models/org/eclipse/jst/javaee/web/internal/impl/WebFragmentImpl.java b/plugins/org.eclipse.jst.j2ee.core/jee-models/org/eclipse/jst/javaee/web/internal/impl/WebFragmentImpl.java
index 2155520..5d37fff 100644
--- a/plugins/org.eclipse.jst.j2ee.core/jee-models/org/eclipse/jst/javaee/web/internal/impl/WebFragmentImpl.java
+++ b/plugins/org.eclipse.jst.j2ee.core/jee-models/org/eclipse/jst/javaee/web/internal/impl/WebFragmentImpl.java
@@ -190,7 +190,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final WebAppVersionType VERSION_EDEFAULT = WebAppVersionType._31;
+	protected static final WebAppVersionType VERSION_EDEFAULT = WebAppVersionType._40;
 
 	/**
 	 * The cached value of the '{@link #getVersion() <em>Version</em>}' attribute.
diff --git a/plugins/org.eclipse.jst.j2ee.core/jee-models/org/eclipse/jst/javaee/web/internal/impl/WebPackageImpl.java b/plugins/org.eclipse.jst.j2ee.core/jee-models/org/eclipse/jst/javaee/web/internal/impl/WebPackageImpl.java
index f0eacff..78ac026 100644
--- a/plugins/org.eclipse.jst.j2ee.core/jee-models/org/eclipse/jst/javaee/web/internal/impl/WebPackageImpl.java
+++ b/plugins/org.eclipse.jst.j2ee.core/jee-models/org/eclipse/jst/javaee/web/internal/impl/WebPackageImpl.java
@@ -3255,7 +3255,8 @@
 		addEEnumLiteral(webAppVersionTypeEEnum, WebAppVersionType._25_LITERAL);
 		addEEnumLiteral(webAppVersionTypeEEnum, WebAppVersionType._30_LITERAL);
 		addEEnumLiteral(webAppVersionTypeEEnum, WebAppVersionType._31);
-
+		addEEnumLiteral(webAppVersionTypeEEnum, WebAppVersionType._40);
+		
 		// Initialize data types
 		initEDataType(authMethodTypeEDataType, String.class, "AuthMethodType", IS_SERIALIZABLE, !IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
 		initEDataType(dispatcherTypeObjectEDataType, DispatcherType.class, "DispatcherTypeObject", IS_SERIALIZABLE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
diff --git a/plugins/org.eclipse.jst.j2ee.core/pom.xml b/plugins/org.eclipse.jst.j2ee.core/pom.xml
index 306955d..0470c75 100644
--- a/plugins/org.eclipse.jst.j2ee.core/pom.xml
+++ b/plugins/org.eclipse.jst.j2ee.core/pom.xml
@@ -15,9 +15,8 @@
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
+    <artifactId>javaee.plugins</artifactId>
     <version>3.6.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
   </parent>
 
   <groupId>org.eclipse.webtools.javaee</groupId>
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/.classpath b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/.classpath
new file mode 100644
index 0000000..196d49a
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src/"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/.cvsignore b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/.cvsignore
new file mode 100644
index 0000000..fa3eb8f
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/.cvsignore
@@ -0,0 +1,7 @@
+bin
+temp.folder
+*.jar
+build.xml
+@dot
+src.zip
+javaCompiler...args
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/.project b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/.project
new file mode 100644
index 0000000..5ec81c8
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.jst.j2ee.ejb.annotation.model</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/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/.settings/org.eclipse.jdt.core.prefs b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..9aaa98f
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,62 @@
+#Thu May 10 18:42:24 EDT 2007
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=disabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=ignore
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nullReference=ignore
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=error
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=error
+org.eclipse.jdt.core.compiler.problem.unusedLabel=error
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/META-INF/MANIFEST.MF b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..d4668d4
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/META-INF/MANIFEST.MF
@@ -0,0 +1,31 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name.0
+Bundle-SymbolicName: org.eclipse.jst.j2ee.ejb.annotation.model; singleton:=true
+Bundle-Version: 1.1.400.qualifier
+Bundle-ClassPath: .
+Bundle-Activator: org.eclipse.jst.j2ee.ejb.annotation.internal.model.ModelPlugin
+Bundle-Vendor: %Bundle-Vendor.0
+Bundle-Localization: plugin
+Export-Package: 
+ org.eclipse.jst.j2ee.ejb.annotation.internal.messages;x-internal:=true,
+ org.eclipse.jst.j2ee.ejb.annotation.internal.model;x-internal:=true,
+ org.eclipse.jst.j2ee.ejb.annotation.internal.operations;x-internal:=true,
+ org.eclipse.jst.j2ee.ejb.annotation.internal.preferences;x-internal:=true,
+ org.eclipse.jst.j2ee.ejb.annotation.internal.provider;x-internal:=true,
+ org.eclipse.jst.j2ee.ejb.annotation.internal.utility;x-internal:=true
+Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.core.resources;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.jdt.core;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.wst.common.frameworks;bundle-version="[1.1.0,2.0.0)",
+ org.eclipse.jst.j2ee;bundle-version="[1.1.0,1.3.0)",
+ org.eclipse.jst.j2ee.core;bundle-version="[1.1.0,2.0.0)",
+ org.eclipse.jst.j2ee.ejb;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.emf.ecore.xmi;bundle-version="[2.2.0,3.0.0)",
+ org.eclipse.jem;bundle-version="[2.0.0,3.0.0)",
+ org.eclipse.wst.common.modulecore;bundle-version="[1.1.0,2.0.0)",
+ org.eclipse.jst.common.frameworks;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.core.commands;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.wst.common.environment;bundle-version="[1.0.100,1.2.0)"
+Eclipse-LazyStart: true
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/plugins/org.eclipse.wst.web.ui/about.html b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/about.html
similarity index 100%
copy from plugins/org.eclipse.wst.web.ui/about.html
copy to plugins/org.eclipse.jst.j2ee.ejb.annotation.model/about.html
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/build.properties b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/build.properties
new file mode 100644
index 0000000..19d1785
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/build.properties
@@ -0,0 +1,8 @@
+bin.includes = plugin.xml,\
+               .,\
+               META-INF/,\
+               about.html,\
+               plugin.properties
+src.includes = schema/
+source.. = src/
+
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/plugin.properties b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/plugin.properties
new file mode 100644
index 0000000..53b5ac4
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/plugin.properties
@@ -0,0 +1,3 @@
+# properties file for org.eclipse.jst.j2ee.ejb.annotation.model
+Bundle-Name.0 = EJB Annotation Model Plug-in
+Bundle-Vendor.0 = Eclipse Web Tools Platform
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/plugin.xml b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/plugin.xml
new file mode 100644
index 0000000..fcd4c63
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/plugin.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+
+     <extension-point id="ejbGenerator" name="org.eclipse.jst.j2ee.ejb.generator" schema="schema/ejbGenerator.exsd"/>
+
+	<extension
+         point="org.eclipse.wst.common.frameworks.DataModelProviderExtension">
+        <DataModelProvider
+            class="org.eclipse.jst.j2ee.ejb.annotation.internal.model.EnterpriseBeanClassDataModelProvider"
+            id="org.eclipse.jst.j2ee.ejb.annotation.internal.model.EnterpriseBeanClassDataModelProvider"/>
+     	<DataModelProvider
+            class="org.eclipse.jst.j2ee.ejb.annotation.internal.model.MessageDrivenBeanDataModelProvider"
+            id="org.eclipse.jst.j2ee.ejb.annotation.internal.model.MessageDrivenBeanDataModelProvider"/>
+        <DataModelProvider
+            class="org.eclipse.jst.j2ee.ejb.annotation.internal.model.SessionBeanDataModelProvider"
+            id="org.eclipse.jst.j2ee.ejb.annotation.internal.model.SessionBeanDataModelProvider"/>
+	</extension>
+    <extension
+       id="org.eclipse.jst.j2ee.ejb.annotation.model"
+       name="org.eclipse.jst.j2ee.ejb.annotation.model"
+       point="org.eclipse.core.runtime.preferences">
+    <initializer class="org.eclipse.jst.j2ee.ejb.annotation.internal.preferences.AnnotationPreferenceStore"/>
+    
+    </extension>
+</plugin>
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/pom.xml b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/pom.xml
new file mode 100644
index 0000000..051a0f7
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/pom.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Copyright (c) 2012, 2013 Eclipse Foundation and others.
+  All rights reserved. This program and the accompanying materials
+  are made available under the terms of the Eclipse Distribution License v1.0
+  which accompanies this distribution, and is available at
+  http://www.eclipse.org/org/documents/edl-v10.php
+ 
+  Contributors:
+    Thanh Ha (Eclipse Foundation) - initial implementation
+-->
+
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.eclipse.webtools.javaee</groupId>
+    <artifactId>javaee.plugins</artifactId>
+    <version>3.6.0-SNAPSHOT</version>
+  </parent>
+
+  <groupId>org.eclipse.webtools.ejb</groupId>
+  <artifactId>org.eclipse.jst.j2ee.ejb.annotation.model</artifactId>
+  <version>1.1.400-SNAPSHOT</version>
+  <packaging>eclipse-plugin</packaging>
+</project>
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/schema/ejbGenerator.exsd b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/schema/ejbGenerator.exsd
new file mode 100644
index 0000000..88af90d
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/schema/ejbGenerator.exsd
@@ -0,0 +1,160 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.jst.j2ee.ejb.annotation.model">
+<annotation>
+      <appInfo>
+         <meta.schema plugin="org.eclipse.jst.j2ee.ejb.annotation.model" id="ejbGenerator" name="EJB Generator"/>
+      </appInfo>
+      <documentation>
+         This extension permits definitions for new types of EJB generators.  An example of such a generator is XDoclet.  There can be other types of generators that can be associated with EJB wizards.  Currently this is not selectabled via the UI.
+      </documentation>
+   </annotation>
+
+   <element name="extension">
+      <complexType>
+         <sequence>
+            <element ref="ejbGenerator"/>
+            <element ref="provider"/>
+         </sequence>
+         <attribute name="point" type="string" use="required">
+            <annotation>
+               <documentation>
+                  a fully qualified identifier of the target extension point
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string">
+            <annotation>
+               <documentation>
+                  an optional identifier of the extension instance
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="name" type="string">
+            <annotation>
+               <documentation>
+                  an optional name of the extension instance
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="ejbGenerator">
+      <annotation>
+         <documentation>
+            Using this extension point an EJB generator can generate annotated Java from EMF models. This extension point is invoked from the EJB wizards.  The provider and generator are linked by the &quot;id&quot;. i.e. They should both have the same id (e.g. XDoclet). There can be many provider-generator sets.
+
+         </documentation>
+      </annotation>
+      <complexType>
+         <sequence>
+         </sequence>
+         <attribute name="name" type="string">
+            <annotation>
+               <documentation>
+                  The name of the generator.
+               </documentation>
+               <appInfo>
+                  <meta.attribute translatable="true"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+         <attribute name="class" type="string" use="required">
+            <annotation>
+               <documentation>
+                  A class that implements &lt;code&gt;org.eclipse.jst.j2ee.ejb.annotation.internal.provider.IEJBGenerator&lt;/code&gt;.
+               </documentation>
+               <appInfo>
+                  <meta.attribute kind="java"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="provider">
+      <annotation>
+         <documentation>
+            Using this extension point clients can define an annotation generator. (i.e. appear in wizards that generate EJBs and Servlets to generate annotated Java code from a model.) The processor can be selective about the types annotation it generates (servlet/EJB/WebService), and it should be return whether is ready to generate code or not (isValid).  Typically the generator may need an installation step.  isValid is used to confirm whether this took place or not.  The name may appear as a user selectable option in wizards.
+
+         </documentation>
+      </annotation>
+      <complexType>
+         <attribute name="name" type="string" use="required">
+            <annotation>
+               <documentation>
+                  The name of the provider.
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="class" type="string" use="required">
+            <annotation>
+               <documentation>
+                  A class that implements &lt;code&gt;org.eclipse.jst.j2ee.ejb.annotation.internal.provider.IAnnotationProvider&lt;/code&gt;.
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="since"/>
+      </appInfo>
+      <documentation>
+         &lt;b&gt;This extension point is part of an interim API that is still under development and expected to change significantly before reaching stability. It is being made available at this early stage to solicit feedback from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken (repeatedly) as the API evolves.&lt;/b&gt;
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="examples"/>
+      </appInfo>
+      <documentation>
+         &lt;pre&gt;
+   &lt;extension
+         point=&quot;org.eclipse.jst.j2ee.ejb.annotation.model.ejbGenerator&quot;&gt;
+      &lt;provider 
+            name=&quot;XDoclet&quot; 
+            class=&quot;org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.provider.XDocletAnnotationProvider&quot; /&gt;
+      &lt;ejbGenerator 
+            name=&quot;XDoclet&quot; 
+            class=&quot;org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.provider.XDocletAnnotationProvider&quot; /&gt;
+   &lt;/extension&gt;
+&lt;/pre&gt;
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="apiInfo"/>
+      </appInfo>
+      <documentation>
+         The ejb generator class must implement the &lt;code&gt;org.eclipse.jst.j2ee.ejb.annotation.internal.provider.IEJBGenerator&lt;/code&gt;.
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="implementation"/>
+      </appInfo>
+      <documentation>
+         &lt;code&gt;org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.provider.XDocletAnnotationProvider&lt;/code&gt; provides an implementation for XDoclet.
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="copyright"/>
+      </appInfo>
+      <documentation>
+         Copyright (c) 2005 Eteration A.S. and others.&lt;br&gt;
+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 &lt;a
+href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
+      </documentation>
+   </annotation>
+
+</schema>
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/messages/EJBAnnotationMessages.java b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/messages/EJBAnnotationMessages.java
new file mode 100644
index 0000000..a5fb0f4
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/messages/EJBAnnotationMessages.java
@@ -0,0 +1,156 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotation.internal.messages;
+
+import org.eclipse.osgi.util.NLS;
+
+
+public class EJBAnnotationMessages extends NLS {
+
+	private static final String BUNDLE_NAME = "web_ui";//$NON-NLS-1$
+
+	private EJBAnnotationMessages() {
+		// Do not instantiate
+	}
+
+	public static String ERR_TRANSACTION_EMPTY;
+	public static String FOLDER_LABEL;
+	public static String ADD_EJB_WIZARD_WINDOW_TITLE;
+	public static String DESTINATION_LABEL;
+	public static String ERR_STATELESS_VALUE;
+	public static String TRANSACTION_LABEL;
+	public static String JAVA_CLASS_MODIFIERS_LABEL;
+	public static String DISPLAY_NAME_LABEL;
+	public static String ERR_DESTINATIONTYPE_EMPTY;
+	public static String ERR_EJB_TYPE_VALUE;
+	public static String SUPERCLASS_LABEL;
+	public static String ERR_CLASS_NAME_MUSTEND_WITH_BEAN;
+	public static String PACKAGE_SELECTION_DIALOG_MSG_NONE;
+	public static String JAVA_CLASS_ABSTRACT_CHECKBOX_LABEL;
+	public static String DESTINATION_NAME_LABEL;
+	public static String _9;
+	public static String JAVA_CLASS_MAIN_CHECKBOX_LABEL;
+	public static String _8;
+	public static String ERR_JNDI_NAME_VALUE;
+	public static String _7;
+	public static String _6;
+	public static String _5;
+	public static String _4;
+	public static String _3;
+	public static String _2;
+	public static String _1;
+	public static String ADD_EJB_WIZARD_PAGE_DESC;
+	public static String _0;
+	public static String EMPTY_LIST_MSG;
+	public static String ERR_DISPLAY_NAME_EMPTY;
+	public static String NO_WEB_PROJECTS;
+	public static String INTERFACE_SELECTION_DIALOG_MSG_NONE;
+	public static String ERR_EJB_NAME_ENDS_WITH_BEAN;
+	public static String SUPERCLASS_SELECTION_DIALOG_TITLE;
+	public static String PACKAGE_SELECTION_DIALOG_DESC;
+	public static String JAVA_CLASS_BROWER_DIALOG_TITLE;
+	public static String CONTAINER_SELECTION_DIALOG_DESC;
+	public static String NEW_JAVA_CLASS_DESTINATION_WIZARD_PAGE_DESC;
+	public static String JAVA_CLASS_PUBLIC_CHECKBOX_LABEL;
+	public static String URL_PATTERN_LABEL;
+	public static String CONTAINER_SELECTION_DIALOG_TITLE;
+	public static String URL_PATTERN_TITLE;
+	public static String CONTAINER_SELECTION_DIALOG_VALIDATOR_MESG;
+	public static String DESCRIPTION_LABEL;
+	public static String JAVA_CLASS_FINAL_CHECKBOX_LABEL;
+	public static String ERR_STATELESS_EMPTY;
+	public static String EJB_NAME_LABEL;
+	public static String ERR_EJB_DISPLAY_NAME_USED;
+	public static String ERR_EJB_TYPE_EXISTS;
+	public static String ERR_MUST_ENTER_A_PACKAGE_NAME;
+	public static String ERR_EJB_TYPE_EMPTY;
+	public static String INTERFACE_SELECTION_DIALOG_DESC;
+	public static String ADD_LABEL;
+	public static String JAVA_CLASS_BROWER_DIALOG_MESSAGE;
+	public static String ERR_DESTINATIONTYPE_VALUE;
+	public static String JAVA_CLASS_METHOD_STUBS_LABEL;
+	public static String JAVA_CLASS_CONSTRUCTOR_CHECKBOX_LABEL;
+	public static String DEFAULT_PACKAGE;
+	public static String BROWSE_BUTTON_LABEL;
+	public static String REMOVE_BUTTON;
+	public static String ERR_JNDI_NAME_EMPTY;
+	public static String ERR_EJB_CLASS_NAME_USED;
+	public static String CLASS_NAME_LABEL;
+	public static String STATELESS_LABEL;
+	public static String JAVA_PACKAGE_LABEL;
+	public static String PACKAGE_SELECTION_DIALOG_TITLE;
+	public static String ADD_BUTTON_LABEL;
+	public static String ADD_EJB_WIZARD_PAGE_TITLE;
+	public static String _10;
+	public static String SUPERCLASS_SELECTION_DIALOG_DESC;
+	public static String NEW_JAVA_CLASS_OPTIONS_WIZARD_PAGE_DESC;
+	public static String REMOVE_BUTTON_LABEL;
+	public static String ERR_EJB_NAME_EMPTY;
+	public static String INTERFACE_SELECTION_DIALOG_TITLE;
+	public static String NAME_LABEL;
+	public static String VALUE_LABEL;
+	public static String JAVA_CLASS_INHERIT_CHECKBOX_LABEL;
+	public static String JNDI_NAME_LABEL;
+	public static String JAVA_CLASS_INTERFACES_LABEL;
+	public static String SELECT_CLASS_TITLE;
+	public static String NO_EJB_PROJECTS;
+	public static String ERR_TRANSACTION_VALUE;
+	public static String ENTITY_USECASE_LABEL;
+	public static String DATASOURCE_NAME_LABEL;
+	
+	public static String ERR_NO_ATTRIBUTES;
+	public static String ERR_DUPLICATE_ATTRIBUTES;
+	public static String ERR_NO_KEY;
+	
+	
+	public static String ADD_EJB_CMPWIZARD_PAGE_DESC;
+	public static String ADD_EJB_CMPWIZARD_PAGE_TITLE;
+	public static String CMP_FROM_TABLE;
+	public static String CMP_FROM_BEAN;
+	public static String ERR_CMP_CONNECTION_SUCCESS;
+	public static String ERR_CMP_NO_CONNECTION;
+	public static String CMP_CONNECTION_VALUE;
+	public static String CMP_CONNECTION_PROPERTY;
+	public static String CMP_CONNECTION_PROPERTIES;
+	public static String CMP_CONNECTION_AVAILABLE;
+	public static String CMP_CONNECTION_NEW_BUTTON;
+	public static String CMP_CONNECTION_PAGE_DESC;
+	public static String CMP_CONNECTION_PAGE_TITLE;
+	public static String CMP_CONNECTION_RECONNECT_BUTTON;
+	public static String CMP_CONNECTION_VALUE_BUTTON;
+	public static String ADD_CMP_TABLE_WIZARD_PAGE_DESC;
+	public static String ADD_CMP_TABLE_WIZARD_PAGE_TITLE;
+	public static String CMP_TABLE_CHOOSE_TABLE;
+	public static String CANNOT_CONNECT;
+	public static String CHECK_PROPERTIES;
+	public static String CMP_MANAGED_FIELDS;
+	public static String ATTRIBUTE_NAME;
+	public static String ATTRIBUTE_COLUMN;
+	public static String ATTRIBUTE_TYPE;
+	public static String ATTRIBUTE_JDBCTYPE;
+	public static String ATTRIBUTE_SQLTYPE;
+	public static String ATTRIBUTE_COLUMNSIZE;
+	public static String ATTRIBUTE_DECIMALDIGITS;
+	public static String ATTRIBUTE_READONLY;
+	public static String ATTRIBUTE_ISKEY;
+	public static String ATTRIBUTE_ADD;
+	public static String ATTRIBUTE_REMOVE;
+	public static String ERR_CMP_INVALID_TABLE;
+	public static String SCHEMA_NAME_LABEL;
+	public static String ERR_CMP_INVALID_VERSION;
+	public static String ENTITY_VERSION_LABEL;
+
+	static {
+		NLS.initializeMessages(BUNDLE_NAME, EJBAnnotationMessages.class);
+	}
+
+	public static final String IMAGE_LOAD_ERROR = _0;
+
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/messages/IEJBAnnotationConstants.java b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/messages/IEJBAnnotationConstants.java
new file mode 100644
index 0000000..a068e5b
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/messages/IEJBAnnotationConstants.java
@@ -0,0 +1,138 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+package org.eclipse.jst.j2ee.ejb.annotation.internal.messages;
+
+
+
+public interface IEJBAnnotationConstants {
+	
+	public static final String ERR_EJB_CLASS_NAME_USED = EJBAnnotationMessages.ERR_EJB_CLASS_NAME_USED;
+	public static final String ERR_EJB_NAME_EMPTY = EJBAnnotationMessages.ERR_EJB_NAME_EMPTY;
+	public static final String ERR_EJB_TYPE_EMPTY = EJBAnnotationMessages.ERR_EJB_TYPE_EMPTY;;
+	public static final String ERR_EJB_TYPE_EXISTS = EJBAnnotationMessages.ERR_EJB_TYPE_EXISTS;;
+	public static final String ERR_EJB_TYPE_VALUE = EJBAnnotationMessages.ERR_EJB_TYPE_VALUE;;
+	public static final String ERR_CLASS_NAME_MUSTEND_WITH_BEAN = EJBAnnotationMessages.ERR_CLASS_NAME_MUSTEND_WITH_BEAN;
+	public static final String ERR_EJB_NAME_ENDS_WITH_BEAN = EJBAnnotationMessages.ERR_EJB_NAME_ENDS_WITH_BEAN;
+	public static final String ERR_DISPLAY_NAME_EMPTY = EJBAnnotationMessages.ERR_DISPLAY_NAME_EMPTY;
+	public static final String ERR_EJB_DISPLAY_NAME_USED = EJBAnnotationMessages.ERR_EJB_DISPLAY_NAME_USED;
+	public static final String ERR_STATELESS_EMPTY = EJBAnnotationMessages.ERR_STATELESS_EMPTY;
+	public static final String ERR_STATELESS_VALUE = EJBAnnotationMessages.ERR_STATELESS_VALUE;
+	public static final String ERR_JNDI_NAME_EMPTY = EJBAnnotationMessages.ERR_JNDI_NAME_EMPTY;
+	public static final String ERR_JNDI_NAME_VALUE = EJBAnnotationMessages.ERR_JNDI_NAME_VALUE;
+	public static final String ERR_TRANSACTION_EMPTY = EJBAnnotationMessages.ERR_TRANSACTION_EMPTY;
+	public static final String ERR_TRANSACTION_VALUE = EJBAnnotationMessages.ERR_TRANSACTION_VALUE;
+	public static final String ERR_DESTINATIONTYPE_EMPTY = EJBAnnotationMessages.ERR_DESTINATIONTYPE_EMPTY;
+	public static final String ERR_DESTINATIONTYPE_VALUE = EJBAnnotationMessages.ERR_DESTINATIONTYPE_VALUE;
+	public static final String ERR_MUST_ENTER_A_PACKAGE_NAME = EJBAnnotationMessages.ERR_MUST_ENTER_A_PACKAGE_NAME;
+
+	// AddEjbWizard
+	public final static String ADD_EJB_WIZARD_WINDOW_TITLE = EJBAnnotationMessages.ADD_EJB_WIZARD_WINDOW_TITLE;
+	public final static String ADD_EJB_WIZARD_PAGE_TITLE = EJBAnnotationMessages.ADD_EJB_WIZARD_PAGE_TITLE;
+	public static final String ADD_EJB_WIZARD_PAGE_DESC = EJBAnnotationMessages.ADD_EJB_WIZARD_PAGE_DESC;
+
+	public final static String DEFAULT_PACKAGE = EJBAnnotationMessages.DEFAULT_PACKAGE;
+	public final static String SELECT_CLASS_TITLE = EJBAnnotationMessages.SELECT_CLASS_TITLE;
+	
+	
+	// common
+	
+	public final static String EJB_NAME_LABEL = EJBAnnotationMessages.EJB_NAME_LABEL;
+	public final static String DESCRIPTION_LABEL = EJBAnnotationMessages.DESCRIPTION_LABEL;
+	public static final String NAME_LABEL = EJBAnnotationMessages.NAME_LABEL;
+	public static final String JNDI_NAME_LABEL = EJBAnnotationMessages.JNDI_NAME_LABEL;
+	public static final String STATELESS_LABEL =  EJBAnnotationMessages.STATELESS_LABEL;
+	public static final String TRANSACTION_LABEL = EJBAnnotationMessages.TRANSACTION_LABEL;
+	public static final String DESTINATION_LABEL = EJBAnnotationMessages.DESTINATION_LABEL;
+	public static final String DESTINATION_NAME_LABEL = EJBAnnotationMessages.DESTINATION_NAME_LABEL;
+	public static final String DISPLAY_NAME_LABEL = EJBAnnotationMessages.DISPLAY_NAME_LABEL;
+
+	
+	public final static String ADD_BUTTON_LABEL = EJBAnnotationMessages.ADD_BUTTON_LABEL;
+	public final static String FOLDER_LABEL = EJBAnnotationMessages.FOLDER_LABEL;
+	public final static String JAVA_PACKAGE_LABEL = EJBAnnotationMessages.JAVA_PACKAGE_LABEL;
+	public final static String CLASS_NAME_LABEL = EJBAnnotationMessages.CLASS_NAME_LABEL;
+	public final static String SUPERCLASS_LABEL = EJBAnnotationMessages.SUPERCLASS_LABEL;
+	public final static String CONTAINER_SELECTION_DIALOG_TITLE = EJBAnnotationMessages.CONTAINER_SELECTION_DIALOG_TITLE;
+	public final static String CONTAINER_SELECTION_DIALOG_DESC = EJBAnnotationMessages.CONTAINER_SELECTION_DIALOG_DESC;
+	public final static String CONTAINER_SELECTION_DIALOG_VALIDATOR_MESG = EJBAnnotationMessages.CONTAINER_SELECTION_DIALOG_VALIDATOR_MESG;
+	public final static String PACKAGE_SELECTION_DIALOG_TITLE = EJBAnnotationMessages.PACKAGE_SELECTION_DIALOG_TITLE;
+	public final static String PACKAGE_SELECTION_DIALOG_DESC = EJBAnnotationMessages.PACKAGE_SELECTION_DIALOG_DESC;
+	public final static String PACKAGE_SELECTION_DIALOG_MSG_NONE = EJBAnnotationMessages.PACKAGE_SELECTION_DIALOG_MSG_NONE;
+	public final static String SUPERCLASS_SELECTION_DIALOG_TITLE = EJBAnnotationMessages.SUPERCLASS_SELECTION_DIALOG_TITLE;
+	public final static String SUPERCLASS_SELECTION_DIALOG_DESC = EJBAnnotationMessages.SUPERCLASS_SELECTION_DIALOG_DESC;
+	public final static String INTERFACE_SELECTION_DIALOG_TITLE = EJBAnnotationMessages.INTERFACE_SELECTION_DIALOG_TITLE;
+	public final static String INTERFACE_SELECTION_DIALOG_DESC = EJBAnnotationMessages.INTERFACE_SELECTION_DIALOG_DESC;
+	public final static String INTERFACE_SELECTION_DIALOG_MSG_NONE = EJBAnnotationMessages.INTERFACE_SELECTION_DIALOG_MSG_NONE;
+	public final static String JAVA_CLASS_MODIFIERS_LABEL = EJBAnnotationMessages.JAVA_CLASS_MODIFIERS_LABEL;
+	public final static String JAVA_CLASS_INTERFACES_LABEL = EJBAnnotationMessages.JAVA_CLASS_INTERFACES_LABEL;
+	public final static String JAVA_CLASS_METHOD_STUBS_LABEL = EJBAnnotationMessages.JAVA_CLASS_METHOD_STUBS_LABEL;
+	public final static String JAVA_CLASS_PUBLIC_CHECKBOX_LABEL = EJBAnnotationMessages.JAVA_CLASS_PUBLIC_CHECKBOX_LABEL;
+	public final static String JAVA_CLASS_ABSTRACT_CHECKBOX_LABEL = EJBAnnotationMessages.JAVA_CLASS_ABSTRACT_CHECKBOX_LABEL;
+	public final static String JAVA_CLASS_FINAL_CHECKBOX_LABEL = EJBAnnotationMessages.JAVA_CLASS_FINAL_CHECKBOX_LABEL;
+	public final static String JAVA_CLASS_CONSTRUCTOR_CHECKBOX_LABEL = EJBAnnotationMessages.JAVA_CLASS_CONSTRUCTOR_CHECKBOX_LABEL;
+	public final static String JAVA_CLASS_MAIN_CHECKBOX_LABEL = EJBAnnotationMessages.JAVA_CLASS_MAIN_CHECKBOX_LABEL;
+	public final static String JAVA_CLASS_INHERIT_CHECKBOX_LABEL = EJBAnnotationMessages.JAVA_CLASS_INHERIT_CHECKBOX_LABEL;
+	public final static String JAVA_CLASS_BROWER_DIALOG_TITLE = EJBAnnotationMessages.JAVA_CLASS_BROWER_DIALOG_TITLE;
+	public final static String JAVA_CLASS_BROWER_DIALOG_MESSAGE = EJBAnnotationMessages.JAVA_CLASS_BROWER_DIALOG_MESSAGE;
+	
+	public final static String VALUE_LABEL = EJBAnnotationMessages.VALUE_LABEL;
+	public final static String EMPTY_STRING = ""; //$NON-NLS-1$
+	public final static String BROWSE_BUTTON_LABEL = EJBAnnotationMessages.BROWSE_BUTTON_LABEL;
+	public static final String REMOVE_BUTTON = EJBAnnotationMessages.REMOVE_BUTTON;
+    
+	public final static String NEW_JAVA_CLASS_DESTINATION_WIZARD_PAGE_DESC = EJBAnnotationMessages.NEW_JAVA_CLASS_DESTINATION_WIZARD_PAGE_DESC;
+	public final static String NEW_JAVA_CLASS_OPTIONS_WIZARD_PAGE_DESC = EJBAnnotationMessages.NEW_JAVA_CLASS_OPTIONS_WIZARD_PAGE_DESC;
+	
+	public final static String NO_EJB_PROJECTS = EJBAnnotationMessages.NO_EJB_PROJECTS;
+	public static final String ENTITY_USECASE_LABEL = EJBAnnotationMessages.ENTITY_USECASE_LABEL;
+	public static final String DATASOURCE_NAME_LABEL = EJBAnnotationMessages.DATASOURCE_NAME_LABEL;
+	
+	
+	public static final String ERR_NO_ATTRIBUTES = EJBAnnotationMessages.ERR_NO_ATTRIBUTES;
+	public static final String ERR_DUPLICATE_ATTRIBUTES  = EJBAnnotationMessages.ERR_DUPLICATE_ATTRIBUTES;
+	public static final String ERR_NO_KEY = EJBAnnotationMessages.ERR_NO_KEY;
+	
+	public static final String ADD_EJB_CMPWIZARD_PAGE_DESC = EJBAnnotationMessages.ADD_EJB_CMPWIZARD_PAGE_DESC;
+	public static final String ADD_EJB_CMPWIZARD_PAGE_TITLE = EJBAnnotationMessages.ADD_EJB_CMPWIZARD_PAGE_TITLE;
+	public static final String CMP_FROM_TABLE = EJBAnnotationMessages.CMP_FROM_TABLE;
+	public static final String CMP_FROM_BEAN = EJBAnnotationMessages.CMP_FROM_BEAN;
+	public static final String ERR_CMP_CONNECTION_SUCCESS = EJBAnnotationMessages.ERR_CMP_CONNECTION_SUCCESS;
+	public static final String ERR_CMP_NO_CONNECTION = EJBAnnotationMessages.ERR_CMP_NO_CONNECTION;
+	public static final String CMP_CONNECTION_VALUE = EJBAnnotationMessages.CMP_CONNECTION_VALUE;
+	public static final String CMP_CONNECTION_PROPERTY = EJBAnnotationMessages.CMP_CONNECTION_PROPERTY;
+	public static final String CMP_CONNECTION_PROPERTIES = EJBAnnotationMessages.CMP_CONNECTION_PROPERTIES;
+	public static final String CMP_CONNECTION_AVAILABLE = EJBAnnotationMessages.CMP_CONNECTION_AVAILABLE;
+	public static final String CMP_CONNECTION_NEW_BUTTON = EJBAnnotationMessages.CMP_CONNECTION_NEW_BUTTON;
+	public static final String CMP_CONNECTION_PAGE_DESC = EJBAnnotationMessages.CMP_CONNECTION_PAGE_DESC;
+	public static final String CMP_CONNECTION_PAGE_TITLE = EJBAnnotationMessages.CMP_CONNECTION_PAGE_TITLE;
+	public static final String CMP_CONNECTION_RECONNECT_BUTTON = EJBAnnotationMessages.CMP_CONNECTION_RECONNECT_BUTTON;
+	public static final String CMP_CONNECTION_VALUE_BUTTON = EJBAnnotationMessages.CMP_CONNECTION_VALUE_BUTTON;
+
+	public static final String ADD_CMP_TABLE_WIZARD_PAGE_DESC = EJBAnnotationMessages.ADD_CMP_TABLE_WIZARD_PAGE_DESC;
+	public static final String ADD_CMP_TABLE_WIZARD_PAGE_TITLE = EJBAnnotationMessages.ADD_CMP_TABLE_WIZARD_PAGE_TITLE;
+	public static final String CMP_TABLE_CHOOSE_TABLE = EJBAnnotationMessages.CMP_TABLE_CHOOSE_TABLE;
+	public static final String CANNOT_CONNECT = EJBAnnotationMessages.CANNOT_CONNECT;
+	public static final String CHECK_PROPERTIES = EJBAnnotationMessages.CHECK_PROPERTIES;
+	public static final String CMP_MANAGED_FIELDS = EJBAnnotationMessages.CMP_MANAGED_FIELDS;
+	public static final String ATTRIBUTE_NAME = EJBAnnotationMessages.ATTRIBUTE_NAME;
+	public static final String ATTRIBUTE_COLUMN = EJBAnnotationMessages.ATTRIBUTE_COLUMN;
+	public static final String ATTRIBUTE_TYPE = EJBAnnotationMessages.ATTRIBUTE_TYPE;
+	public static final String ATTRIBUTE_JDBCTYPE = EJBAnnotationMessages.ATTRIBUTE_JDBCTYPE;
+	public static final String ATTRIBUTE_SQLTYPE = EJBAnnotationMessages.ATTRIBUTE_SQLTYPE;
+	public static final String ATTRIBUTE_COLUMNSIZE = EJBAnnotationMessages.ATTRIBUTE_COLUMNSIZE;
+	public static final String ATTRIBUTE_DECIMALDIGITS = EJBAnnotationMessages.ATTRIBUTE_DECIMALDIGITS;
+	public static final String ATTRIBUTE_READONLY = EJBAnnotationMessages.ATTRIBUTE_READONLY;
+	public static final String ATTRIBUTE_ISKEY = EJBAnnotationMessages.ATTRIBUTE_ISKEY;
+	public static final String ATTRIBUTE_ADD = EJBAnnotationMessages.ATTRIBUTE_ADD;
+	public static final String ATTRIBUTE_REMOVE = EJBAnnotationMessages.ATTRIBUTE_REMOVE;
+	public static final String ERR_CMP_INVALID_TABLE = EJBAnnotationMessages.ERR_CMP_INVALID_TABLE;
+	public static final String SCHEMA_NAME_LABEL = EJBAnnotationMessages.SCHEMA_NAME_LABEL;
+	public static final String ERR_CMP_INVALID_VERSION = EJBAnnotationMessages.ERR_CMP_INVALID_VERSION;
+	public static final String ENTITY_VERSION_LABEL =  EJBAnnotationMessages.ENTITY_VERSION_LABEL;
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/model/CMPAttributeDelegate.java b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/model/CMPAttributeDelegate.java
new file mode 100644
index 0000000..694cc83
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/model/CMPAttributeDelegate.java
@@ -0,0 +1,191 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotation.internal.model;
+
+public class CMPAttributeDelegate {
+	private String name;
+	private String attributeType;
+	private String sqlType;
+	private boolean isKey = false;
+	private boolean isTransient = false;
+	private String columnName;
+	private String jdbcType;
+	private boolean isReadOnly;
+	
+	private int columnSize;
+	private int decimalDigits;
+
+	public CMPAttributeDelegate() {
+		this.name = "aField";
+		this.attributeType = "java.lang.String";
+		this.jdbcType = "VARCHAR";
+		this.sqlType = "VARCHAR";
+		this.columnName = "ACOLUMN";
+		this.columnSize = 0;
+		this.decimalDigits = 0;
+	}
+
+	/**
+	 * @return Returns the attributeType.
+	 */
+	public String getAttributeType() {
+		return attributeType;
+	}
+
+	/**
+	 * @param attributeType
+	 *            The attributeType to set.
+	 */
+	public void setAttributeType(String attributeType) {
+		this.attributeType = attributeType;
+	}
+
+	/**
+	 * @return Returns the columnName.
+	 */
+	public String getColumnName() {
+		return columnName;
+	}
+
+	/**
+	 * @param columnName
+	 *            The columnName to set.
+	 */
+	public void setColumnName(String columnName) {
+		this.columnName = columnName;
+	}
+
+	/**
+	 * @return Returns the isKey.
+	 */
+	public boolean isKey() {
+		return isKey;
+	}
+
+	/**
+	 * @param isKey
+	 *            The isKey to set.
+	 */
+	public void setKey(boolean isKey) {
+		this.isKey = isKey;
+	}
+
+	/**
+	 * @return Returns the isReadOnly.
+	 */
+	public boolean isReadOnly() {
+		return isReadOnly;
+	}
+
+	/**
+	 * @param isReadOnly
+	 *            The isReadOnly to set.
+	 */
+	public void setReadOnly(boolean isReadOnly) {
+		this.isReadOnly = isReadOnly;
+	}
+
+	/**
+	 * @return Returns the isTransient.
+	 */
+	public boolean isTransient() {
+		return isTransient;
+	}
+
+	/**
+	 * @param isTransient
+	 *            The isTransient to set.
+	 */
+	public void setTransient(boolean isTransient) {
+		this.isTransient = isTransient;
+	}
+
+	/**
+	 * @return Returns the jdbcType.
+	 */
+	public String getJdbcType() {
+		return jdbcType;
+	}
+
+	/**
+	 * @param jdbcType
+	 *            The jdbcType to set.
+	 */
+	public void setJdbcType(String jdbcType) {
+		this.jdbcType = jdbcType;
+	}
+
+	/**
+	 * @return Returns the name.
+	 */
+	public String getName() {
+		return name;
+	}
+
+	/**
+	 * @param name
+	 *            The name to set.
+	 */
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	/**
+	 * @return Returns the sqlType.
+	 */
+	public String getSqlType() {
+		return sqlType;
+	}
+	/**
+	 * @return Returns the sqlType.
+	 */
+	public String getSqlTypeDecl() {
+		String response = this.sqlType;
+		if (isVariableSizedType()) {
+			response += ("("+columnSize);
+			if (isDecimal())
+					response += (","+decimalDigits);
+			response += ")";
+		}
+		return response;
+	}
+
+	public boolean isDecimal() {
+		return sqlType.equalsIgnoreCase("DECIMAL");
+	}
+
+	public boolean isVariableSizedType() {
+		return isDecimal() || sqlType.equalsIgnoreCase("VARCHAR") || sqlType.equalsIgnoreCase("CHAR") || sqlType.equalsIgnoreCase("CLOB") || sqlType.equalsIgnoreCase("BLOB");
+	}
+
+	/**
+	 * @param sqlType
+	 *            The sqlType to set.
+	 */
+	public void setSqlType(String sqlType) {
+		this.sqlType = sqlType;
+	}
+
+	public int getColumnSize() {
+		return columnSize;
+	}
+
+	public void setColumnSize(int columnSize) {
+		this.columnSize = columnSize;
+	}
+
+	public int getDecimalDigits() {
+		return decimalDigits;
+	}
+
+	public void setDecimalDigits(int decimalDigits) {
+		this.decimalDigits = decimalDigits;
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/model/ContainerManagedEntityBeanDataModelProvider.java b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/model/ContainerManagedEntityBeanDataModelProvider.java
new file mode 100644
index 0000000..d45700c
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/model/ContainerManagedEntityBeanDataModelProvider.java
@@ -0,0 +1,214 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotation.internal.model;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jst.j2ee.ejb.ContainerManagedEntity;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.messages.IEJBAnnotationConstants;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.operations.AddContainerManagedEntityBeanOperation;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
+import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
+
+public class ContainerManagedEntityBeanDataModelProvider extends EnterpriseBeanClassDataModelProvider implements
+		IContainerManagedEntityBeanDataModelProperties {
+
+	public final static String DEFAULT_EJB_SUPERCLASS = "java.lang.Object"; //$NON-NLS-1$ 
+	public final static String[] DEFAULT_EJB_INTERFACES = { "javax.ejb.EntityBean" }; //$NON-NLS-1$ //$NON-NLS-2$
+
+	private List interfaceList;
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.common.frameworks.internal.operation.WTPOperationDataModel#getDefaultOperation()
+	 */
+	public IDataModelOperation getDefaultOperation() {
+		AddContainerManagedEntityBeanOperation operation = new AddContainerManagedEntityBeanOperation(getDataModel());
+		getDataModel().getProperty(IEnterpriseBeanClassDataModelProperties.MODELDELEGATE);
+		return operation;
+	}
+
+	/**
+	 * Subclasses may extend this method to add their own data model's
+	 * properties as valid base properties.
+	 * 
+	 * @see org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider#getPropertyNames()
+	 */
+	public Set getPropertyNames() {
+		Set propertyNames = super.getPropertyNames();
+		propertyNames.add(DATASOURCE);
+		propertyNames.add(SCHEMA);
+		propertyNames.add(TABLE);
+		propertyNames.add(ATTRIBUTES);
+		propertyNames.add(VERSION);
+		propertyNames.add(EJB_INTERFACES);
+		return propertyNames;
+	}
+
+	public Object getDefaultProperty(String propertyName) {
+		if (propertyName.equals(USE_ANNOTATIONS))
+			return Boolean.FALSE;
+		else if (propertyName.equals(DATASOURCE))
+			return getProperty(JNDI_NAME);
+		else if (propertyName.equals(EJB_TYPE))
+			return "EntityBean";
+		else if (propertyName.equals(MODIFIER_ABSTRACT))
+			return Boolean.TRUE;
+		else if (propertyName.equals(SUPERCLASS))
+			return DEFAULT_EJB_SUPERCLASS;
+		else if (propertyName.equals(EJB_INTERFACES))
+			return DEFAULT_EJB_INTERFACES;
+		else if (propertyName.equals(SCHEMA))
+			return this.getProperty(EJB_NAME)+"SCHEMA";
+		else if (propertyName.equals(TABLE))
+			return "MYTABLE";
+		else if (propertyName.equals(ATTRIBUTES))
+			return new ArrayList();
+		else if (propertyName.equals(VERSION))
+			return ContainerManagedEntity.VERSION_2_X;
+		return super.getDefaultProperty(propertyName);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.common.frameworks.internal.operation.WTPOperationDataModel#doValidateProperty(java.lang.String)
+	 */
+	public IStatus validate(String propertyName) {
+		if (propertyName.equals(DATASOURCE))
+			return validateJndiName(getStringProperty(propertyName));
+		if (propertyName.equals(TABLE))
+			return validateTable(getStringProperty(propertyName));
+		if (propertyName.equals(SCHEMA))
+			return validateJndiName(getStringProperty(propertyName));
+		if (propertyName.equals(ATTRIBUTES))
+			return validateAttributes(getProperty(propertyName));
+		if (propertyName.equals(VERSION))
+			return validateVersion((String)getProperty(propertyName));
+		return super.validate(propertyName);
+	}
+
+	protected IStatus validateTable(String prop) {
+		// check for empty
+		if (prop == null || prop.trim().length() == 0 || prop.indexOf(" ") >= 0) {
+			String msg = IEJBAnnotationConstants.ERR_CMP_INVALID_TABLE;
+			return WTPCommonPlugin.createErrorStatus(msg);
+		}
+
+		return WTPCommonPlugin.OK_STATUS;
+	}
+
+	protected IStatus validateVersion(String prop) {
+		// check for empty
+		if (prop == null || prop.trim().length() == 0 || prop.indexOf(" ") >= 0) {
+			String msg = IEJBAnnotationConstants.ERR_CMP_INVALID_VERSION;
+			return WTPCommonPlugin.createErrorStatus(msg);
+		}
+
+		if (!(ContainerManagedEntity.VERSION_1_X.equals(prop) || ContainerManagedEntity.VERSION_2_X.equals(prop))) {
+			String msg = IEJBAnnotationConstants.ERR_CMP_INVALID_VERSION;
+			return WTPCommonPlugin.createErrorStatus(msg);
+		}
+
+		return WTPCommonPlugin.OK_STATUS;
+	}
+
+	private IStatus validateAttributes(Object property) {
+		ArrayList attributes = (ArrayList) property;
+		if (attributes == null || attributes.size() == 0) {
+			String msg = IEJBAnnotationConstants.ERR_NO_ATTRIBUTES;
+			return WTPCommonPlugin.createErrorStatus(msg);
+		}
+
+		// No two fields should have the same name/column
+		Iterator attributeNames = attributes.iterator();
+		boolean duplicate = false;
+
+		while (attributeNames.hasNext() && duplicate == false) {
+			CMPAttributeDelegate aRow = (CMPAttributeDelegate) attributeNames.next();
+			Iterator otherNames = attributes.iterator();
+			while (otherNames.hasNext()) {
+				CMPAttributeDelegate otherRow = (CMPAttributeDelegate) otherNames.next();
+				if (aRow != otherRow && aRow.getName().equals(otherRow.getName())) {
+					duplicate = true;
+					break;
+				}
+				if (aRow != otherRow && aRow.getColumnName().equals(otherRow.getColumnName())) {
+					duplicate = true;
+					break;
+				}
+			}
+		}
+		if (duplicate)
+			return WTPCommonPlugin.createErrorStatus(IEJBAnnotationConstants.ERR_DUPLICATE_ATTRIBUTES);
+
+		// There should be at least one primary key field
+		attributeNames = attributes.iterator();
+		int primaryKey = 0;
+		while (attributeNames.hasNext() && duplicate == false) {
+			CMPAttributeDelegate aRow = (CMPAttributeDelegate) attributeNames.next();
+			if (aRow.isKey())
+				primaryKey++;
+		}
+
+		if (primaryKey == 0)
+			return WTPCommonPlugin.createErrorStatus(IEJBAnnotationConstants.ERR_NO_KEY);
+
+		return WTPCommonPlugin.OK_STATUS;
+
+	}
+
+	public List getCMPAttributes() {
+		List attributes = (List) getProperty(ATTRIBUTES);
+		return attributes;
+	}
+
+	protected List getEJBInterfaces() {
+		if (this.interfaceList == null) {
+			this.interfaceList = new ArrayList();
+			for (int i = 0; i < ((String[]) getProperty(EJB_INTERFACES)).length; i++) {
+				this.interfaceList.add(((String[]) getProperty(EJB_INTERFACES))[i]);
+			}
+		}
+		return this.interfaceList;
+	}
+
+	protected void initializeDelegate() {
+		ContainerManagedEntityBeanDelegate delegate = new ContainerManagedEntityBeanDelegate();
+		delegate.setDataModel(getDataModel());
+		this.setProperty(MODELDELEGATE, delegate);
+
+		// Set the defaults so that they are propagated via events
+		this.setProperty(DATASOURCE, this.getProperty(DATASOURCE));
+		this.setProperty(SCHEMA, this.getProperty(SCHEMA));
+		this.setProperty(TABLE, this.getProperty(TABLE));
+		this.setProperty(ATTRIBUTES, this.getProperty(ATTRIBUTES));
+		this.setProperty(VERSION, this.getProperty(VERSION));
+	}
+	
+	public boolean propertySet(String propertyName, Object propertyValue) {
+
+		boolean result = super.propertySet(propertyName, propertyValue);
+
+		if (propertyName.equals(EJB_NAME)) {
+			if (!isPropertySet(DATASOURCE))
+				getDataModel().notifyPropertyChange(DATASOURCE, IDataModel.DEFAULT_CHG);
+			if (!isPropertySet(SCHEMA))
+				getDataModel().notifyPropertyChange(SCHEMA, IDataModel.DEFAULT_CHG);
+		}
+		return result;
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/model/ContainerManagedEntityBeanDelegate.java b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/model/ContainerManagedEntityBeanDelegate.java
new file mode 100644
index 0000000..37a4483
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/model/ContainerManagedEntityBeanDelegate.java
@@ -0,0 +1,133 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotation.internal.model;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.jst.j2ee.ejb.CMPAttribute;
+import org.eclipse.jst.j2ee.ejb.ContainerManagedEntity;
+import org.eclipse.jst.j2ee.ejb.EjbFactory;
+import org.eclipse.jst.j2ee.ejb.TransactionType;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelEvent;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+public class ContainerManagedEntityBeanDelegate extends EnterpriseBeanDelegate implements IContainerManagedEntityBean {
+
+	public static final String BMP = "BMP";
+	public static final String CMP = "CMP";
+
+	public ContainerManagedEntityBeanDelegate() {
+		super();
+		ContainerManagedEntity entity = EjbFactory.eINSTANCE.createContainerManagedEntity();
+		this.setEnterpriseBean(entity);
+	}
+
+	public void setDataModel(IDataModel dataModel) {
+		super.setDataModel(dataModel);
+		String schema = dataModel.getStringProperty(IContainerManagedEntityBeanDataModelProperties.SCHEMA);
+		ContainerManagedEntity entity = (ContainerManagedEntity) this.getEnterpriseBean();
+		entity.setAbstractSchemaName(schema);
+		
+	}
+
+	public String getType() {
+		return CMP;
+	}
+
+	public String getTransactionType() {
+		return TransactionType.CONTAINER_LITERAL.getName();
+	}
+
+	public void propertyChanged(DataModelEvent event) {
+		super.propertyChanged(event);
+		String property = event.getPropertyName();
+		Object propertyValue = event.getProperty();
+		ContainerManagedEntity entity = (ContainerManagedEntity) this.getEnterpriseBean();
+		if (entity == null)
+			return;
+
+		if (IContainerManagedEntityBeanDataModelProperties.SCHEMA.equals(property)) {
+			entity.setAbstractSchemaName((String) propertyValue);
+		}
+	}
+
+	public String getDatasource() {
+		return this.getDataModel().getStringProperty(IContainerManagedEntityBeanDataModelProperties.DATASOURCE);
+	}
+
+	public String getSchema() {
+		ContainerManagedEntity entity = (ContainerManagedEntity) this.getEnterpriseBean();
+		return entity.getAbstractSchemaName();
+	}
+
+	public String getTable() {
+		return this.getDataModel().getStringProperty(IContainerManagedEntityBeanDataModelProperties.TABLE);
+	}
+
+
+	public List getAttributes() {
+		return (List) this.getDataModel().getProperty(IContainerManagedEntityBeanDataModelProperties.ATTRIBUTES);
+	}
+
+	public void setAttributes(HashMap attr) {
+		this.getDataModel().setProperty(IContainerManagedEntityBeanDataModelProperties.ATTRIBUTES,attr);
+	}
+
+	public void setAtribute(String name, String jtype, String stype, String description, boolean isPrimary, boolean isTransient) {
+		ContainerManagedEntity entity = (ContainerManagedEntity) this.getEnterpriseBean();
+		CMPAttribute attribute = null;
+		if (isPrimary)
+			attribute = entity.addKeyAttributeName(name);
+		else
+			attribute = entity.addPersistentAttributeName(name);
+		// If the class doesn't exist, it will be reflected
+
+		// JavaHelpers helper = JavaRefFactory.eINSTANCE.reflectType(type,
+		// (ResourceSet) nature.getResourceSet());
+		// attribute.setOriginatingType(helper);
+		attribute.setDescription(description);
+		attribute.setTransient(isTransient);
+
+	}
+	public void removeAttribute(String name) {
+		
+		ContainerManagedEntity entity = (ContainerManagedEntity) this.getEnterpriseBean();
+		entity.removePersistentAttribute(name);
+	}
+
+	public String getPrimaryKeyClass() {
+		java.util.List keys = getKeyAttributes();
+		
+		if( keys.size() > 1)
+			return this.getSimpleClassName() + ".PrimaryKey";
+		else if( keys.size() == 1)
+			return ((CMPAttributeDelegate)keys.get(0)).getAttributeType();
+		return "java.lang.String";
+	}
+
+	public List getKeyAttributes() {
+		Iterator attributes = getAttributes().iterator();
+		ArrayList keys = new ArrayList();
+		while (attributes.hasNext()) {
+			CMPAttributeDelegate attribute = (CMPAttributeDelegate) attributes.next();
+			if(attribute.isKey())
+				keys.add(attribute);
+			
+		}
+		return keys;
+	}
+
+	public String getVersion() {
+		return this.getDataModel().getStringProperty(IContainerManagedEntityBeanDataModelProperties.VERSION);
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/model/EnterpriseBeanClassDataModelProvider.java b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/model/EnterpriseBeanClassDataModelProvider.java
new file mode 100644
index 0000000..2d0447e
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/model/EnterpriseBeanClassDataModelProvider.java
@@ -0,0 +1,358 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotation.internal.model;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaConventions;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jst.j2ee.ejb.EJBJar;
+import org.eclipse.jst.j2ee.ejb.EnterpriseBean;
+import org.eclipse.jst.j2ee.ejb.TransactionType;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.messages.IEJBAnnotationConstants;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.utility.AnnotationUtilities;
+import org.eclipse.jst.j2ee.ejb.componentcore.util.EJBArtifactEdit;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.j2ee.internal.common.J2EECommonMessages;
+import org.eclipse.jst.j2ee.internal.common.operations.NewJavaClassDataModelProvider;
+import org.eclipse.wst.common.componentcore.ArtifactEdit;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
+
+public abstract class EnterpriseBeanClassDataModelProvider extends NewJavaClassDataModelProvider implements IEnterpriseBeanClassDataModelProperties {
+
+	public EnterpriseBeanClassDataModelProvider() {
+		super();
+		// initializeDelegate();
+	}
+
+	protected abstract void initializeDelegate();
+
+	/**
+	 * Subclasses may extend this method to add their own data model's properties as valid base
+	 * properties.
+	 * 
+	 * @see org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider#getPropertyNames()
+	 */
+	public Set getPropertyNames() {
+		Set propertyNames = super.getPropertyNames();
+		propertyNames.add(USE_ANNOTATIONS);
+		propertyNames.add(EJB_TYPE);
+		propertyNames.add(EJB_NAME);
+		propertyNames.add(DISPLAY_NAME);
+		propertyNames.add(JNDI_NAME);
+		propertyNames.add(DESCRIPTION);
+		propertyNames.add(CLASS_NAME);
+		propertyNames.add(TRANSACTIONTYPE);
+		propertyNames.add(ANNOTATIONPROVIDER);
+		propertyNames.add(MODELDELEGATE);
+		propertyNames.add(INTERFACES_AS_STRING);
+		return propertyNames;
+	}
+
+	/**
+	 * Subclasses may extend this method to provide their own determination of whether or not
+	 * certain properties should be disabled or enabled. This method does not accept null parameter.
+	 * It will not return null. This implementation makes sure annotation support is only allowed on
+	 * web projects of J2EE version 1.3 or higher.
+	 * 
+	 * @see org.eclipse.wst.common.frameworks.internal.operations.WTPOperationDataModel#basicIsEnabled(String)
+	 * @see IAnnotationsDataModel#USE_ANNOTATIONS
+	 * 
+	 * @param propertyName
+	 * @return Boolean should property be enabled?
+	 */
+	public boolean isPropertyEnabled(String propertyName) {
+		// Annotations should only be enabled on a valid j2ee project of version 1.3 or higher
+		if (USE_ANNOTATIONS.equals(propertyName)) {
+			return true;
+			// if (!isAnnotationsSupported())
+			// return Boolean.FALSE;
+			// return Boolean.TRUE;
+		}
+		// Otherwise return super implementation
+		return super.isPropertyEnabled(propertyName);
+	}
+
+
+	protected boolean isAnnotationsSupported() {
+		if (getTargetProject() == null || getTargetComponent() == null)
+			return true;
+		EJBArtifactEdit ejbEdit = null;
+		try {
+			ejbEdit = EJBArtifactEdit.getEJBArtifactEditForRead(getTargetProject());
+			if (ejbEdit == null)
+				return false;
+			return ejbEdit.getJ2EEVersion() > J2EEVersionConstants.VERSION_1_2;
+		} catch (Exception e) {
+			e.printStackTrace();
+			return false;
+		} finally {
+			if (ejbEdit != null)
+				ejbEdit.dispose();
+		}
+	}
+
+	public boolean propertySet(String propertyName, Object propertyValue) {
+
+		boolean result = super.propertySet(propertyName, propertyValue);
+		// After the property is set, if project changed, update the nature and the annotations
+		// enablement
+		if (propertyName.equals(COMPONENT_NAME)) {
+			getDataModel().notifyPropertyChange(USE_ANNOTATIONS, IDataModel.ENABLE_CHG);
+		} else if (propertyName.equals(CLASS_NAME)) {
+			if (!isPropertySet(EJB_NAME))
+				getDataModel().notifyPropertyChange(EJB_NAME, IDataModel.DEFAULT_CHG);
+		} else if (propertyName.equals(EJB_NAME)) {
+			if (!isPropertySet(JNDI_NAME))
+				getDataModel().notifyPropertyChange(JNDI_NAME, IDataModel.DEFAULT_CHG);
+			if (!isPropertySet(DISPLAY_NAME))
+				getDataModel().notifyPropertyChange(DISPLAY_NAME, IDataModel.DEFAULT_CHG);
+			if (!isPropertySet(DESCRIPTION))
+				getDataModel().notifyPropertyChange(DESCRIPTION, IDataModel.DEFAULT_CHG);
+		}
+		return result;
+	}
+
+	public Object getDefaultProperty(String propertyName) {
+		if (propertyName.equals(USE_ANNOTATIONS))
+			return Boolean.TRUE;
+		else if (propertyName.equals(CLASS_NAME))
+			return "MyBean";
+		else if (propertyName.equals(EJB_NAME)) {
+			String className = getStringProperty(CLASS_NAME);
+			if (className.endsWith("Bean"))
+				className = className.substring(0, className.length() - 4);
+			return className;
+		} else if (propertyName.equals(JNDI_NAME)) {
+			return getProperty(EJB_NAME);
+		} else if (propertyName.equals(TRANSACTIONTYPE)) {
+			return TransactionType.CONTAINER_LITERAL.getName();
+		} else if (propertyName.equals(EJB_TYPE)) {
+			return "SessionBean";
+		} else if (propertyName.equals(DISPLAY_NAME)) {
+			return getProperty(EJB_NAME);
+		} else if (propertyName.equals(DESCRIPTION)) {
+			return "An EJB named " + getStringProperty(EJB_NAME);
+		} else if (propertyName.equals(INTERFACES))
+			return getEJBInterfaces();
+		else if (propertyName.equals(ANNOTATIONPROVIDER)) {
+			String[] providers = AnnotationUtilities.getProviderNames();
+			if (providers != null && providers.length > 0)
+				return providers[0];
+		} else if (propertyName.equals(SOURCE_FOLDER)) {
+			try {
+				Object srcFolder = super.getDefaultProperty(propertyName);
+				return srcFolder;
+			} catch (Exception e) {// Ignore
+			}
+			return ""; //$NON-NLS-1$
+		} else if (propertyName.equals(INTERFACES_AS_STRING))
+			return getInterfacesString();
+		else if (propertyName.equals(MODELDELEGATE)) {
+			initializeDelegate();
+			return getProperty(MODELDELEGATE);
+		}
+		return super.getDefaultProperty(propertyName);
+	}
+
+	public IStatus validate(String propertyName) {
+		if (propertyName.equals(JAVA_PACKAGE))
+			return validateEjbJavaPackage(getStringProperty(propertyName));
+		if (propertyName.equals(EJB_NAME))
+			return validateEJBName(getStringProperty(propertyName));
+		if (propertyName.equals(EJB_TYPE))
+			return validateEJBType(getStringProperty(propertyName));
+		if (propertyName.equals(JNDI_NAME))
+			return validateJndiName(getStringProperty(propertyName));
+		if (propertyName.equals(DISPLAY_NAME))
+			return validateDisplayName(getStringProperty(propertyName));
+		if (propertyName.equals(CLASS_NAME))
+			return validateClassName(getStringProperty(propertyName));
+		if (propertyName.equals(TRANSACTIONTYPE))
+			return validateTransaction(getStringProperty(propertyName));
+		return super.validate(propertyName);
+	}
+
+	protected IStatus validateClassName(String className) {
+		IStatus status = this.validateJavaClassName(className);
+		if (status.isOK())
+			status = canCreateTypeInClasspath(className);
+		if (status != WTPCommonPlugin.OK_STATUS)
+			return status;
+
+		if (className.equals("Bean") || className.equals("EJB")) {
+
+		} else if ((className.endsWith("Bean") || className.endsWith("EJB")))
+			return status;
+		String msg = IEJBAnnotationConstants.ERR_CLASS_NAME_MUSTEND_WITH_BEAN;
+		return WTPCommonPlugin.createErrorStatus(msg);
+
+	}
+
+	protected IStatus validateEjbJavaPackage(String packageName) {
+		if (packageName != null && packageName.trim().length() > 0) {
+			// Use standard java conventions to validate the package name
+			IStatus javaStatus = JavaConventions.validatePackageName(packageName);
+			if (javaStatus.getSeverity() == IStatus.ERROR) {
+				String msg = J2EECommonMessages.ERR_JAVA_PACAKGE_NAME_INVALID + javaStatus.getMessage();
+				return WTPCommonPlugin.createErrorStatus(msg);
+			} else if (javaStatus.getSeverity() == IStatus.WARNING) {
+				String msg = J2EECommonMessages.ERR_JAVA_PACKAGE_NAME_WARNING + javaStatus.getMessage();
+				return WTPCommonPlugin.createErrorStatus(msg);
+			}
+		}
+		if (packageName == null || packageName.trim().length() == 0) {
+			String msg = IEJBAnnotationConstants.ERR_MUST_ENTER_A_PACKAGE_NAME;
+			return WTPCommonPlugin.createErrorStatus(msg);
+		}
+		return WTPCommonPlugin.OK_STATUS;
+
+	}
+
+	private IStatus validateEJBType(String prop) {
+		// check for empty
+		if (prop == null || prop.trim().length() == 0) {
+			String msg = IEJBAnnotationConstants.ERR_EJB_TYPE_EMPTY;
+			return WTPCommonPlugin.createErrorStatus(msg);
+		}
+		if (prop.indexOf("SessionBean") >= 0 || prop.indexOf("MessageDrivenBean") >= 0 || prop.indexOf("EntityBean") >= 0) {
+			return WTPCommonPlugin.OK_STATUS;
+		}
+		String msg = IEJBAnnotationConstants.ERR_EJB_TYPE_VALUE;
+		return WTPCommonPlugin.createErrorStatus(msg);
+	}
+
+
+
+	private IStatus validateTransaction(String prop) {
+		// check for empty
+		if (prop == null || prop.trim().length() == 0) {
+			String msg = IEJBAnnotationConstants.ERR_TRANSACTION_EMPTY;
+			return WTPCommonPlugin.createErrorStatus(msg);
+		}
+		if (prop.indexOf("Container") >= 0 || prop.indexOf("Bean") >= 0) {
+			return WTPCommonPlugin.OK_STATUS;
+		}
+		String msg = IEJBAnnotationConstants.ERR_TRANSACTION_VALUE;
+		return WTPCommonPlugin.createErrorStatus(msg);
+	}
+
+	protected IStatus validateJndiName(String prop) {
+		// check for empty
+		if (prop == null || prop.trim().length() == 0) {
+			String msg = IEJBAnnotationConstants.ERR_JNDI_NAME_EMPTY;
+			return WTPCommonPlugin.createErrorStatus(msg);
+		}
+		if (prop.indexOf(" ") >= 0) {
+			String msg = IEJBAnnotationConstants.ERR_JNDI_NAME_VALUE;
+			return WTPCommonPlugin.createErrorStatus(msg);
+		}
+		return WTPCommonPlugin.OK_STATUS;
+	}
+
+	private IStatus validateEJBName(String prop) {
+		// check for empty
+		if (prop == null || prop.trim().length() == 0) {
+			String msg = IEJBAnnotationConstants.ERR_EJB_NAME_EMPTY;
+			return WTPCommonPlugin.createErrorStatus(msg);
+		}
+		if (prop.indexOf("Bean") >= 0) {
+			String msg = IEJBAnnotationConstants.ERR_EJB_NAME_ENDS_WITH_BEAN;
+			return WTPCommonPlugin.createErrorStatus(msg);
+		}
+		return WTPCommonPlugin.OK_STATUS;
+	}
+
+	protected IStatus validateDisplayName(String prop) {
+		// check for empty
+		if (prop == null || prop.trim().length() == 0) {
+			String msg = IEJBAnnotationConstants.ERR_DISPLAY_NAME_EMPTY;
+			return WTPCommonPlugin.createErrorStatus(msg);
+		}
+		if (getTargetProject() == null)// || getComponent()==null)
+			return WTPCommonPlugin.OK_STATUS;
+		ArtifactEdit edit = null;
+		try {
+			//edit = getArtifactEditForRead();
+			edit = ArtifactEdit.getArtifactEditForRead(getTargetProject());
+			if (edit == null)
+				return WTPCommonPlugin.OK_STATUS;
+			EJBJar ejbJar = (EJBJar) edit.getContentModelRoot();
+			if (ejbJar == null)
+				return WTPCommonPlugin.OK_STATUS;
+			List ejbs = ejbJar.getEnterpriseBeans();
+			if (ejbs != null && ejbs.size() > 0) {
+				for (int i = 0; i < ejbs.size(); i++) {
+					EnterpriseBean ejb = (EnterpriseBean) ejbs.get(i);
+					if (prop.equals(ejb.getDisplayName())) {
+						String msg = IEJBAnnotationConstants.ERR_EJB_DISPLAY_NAME_USED;
+						return WTPCommonPlugin.createErrorStatus(msg);
+					}
+				}
+			}
+		} catch (Exception e) {
+			// do nothing no DD no names to validate against
+		} finally {
+			if (edit != null)
+				edit.dispose();
+		}
+		return WTPCommonPlugin.OK_STATUS;
+	}
+
+	protected IStatus validateJavaClassName(String prop) {
+		IStatus status = super.validateJavaClassName(prop);
+		if( status == WTPCommonPlugin.OK_STATUS && getTargetProject() != null ){
+			try {
+				IJavaProject jProject = JavaCore.create(getTargetProject());
+				String pName = getStringProperty(JAVA_PACKAGE);
+				IType type = jProject.findType(pName + "." + prop);
+				if(type != null ){
+					String msg = IEJBAnnotationConstants.ERR_EJB_TYPE_EXISTS;
+					return WTPCommonPlugin.createErrorStatus(msg);
+				}
+			} catch (JavaModelException e) {
+			}
+		}
+
+		return status;
+	}
+
+	protected String getInterfacesString() {
+		List ints = (List) this.getProperty(INTERFACES);
+		Iterator iterator = ints.iterator();
+		String intStr = (iterator.hasNext() ? (String) iterator.next() : getDefaultInterfaces());
+		while (iterator.hasNext()) {
+			String intrfc = (String) iterator.next();
+			intStr += ", " + intrfc;
+		}
+
+		return intStr;
+	}
+
+	private String getDefaultInterfaces() {
+		Iterator interfaces = getEJBInterfaces().iterator();
+		String interfacesStr = (interfaces.hasNext() ? (String) interfaces.next() : "");
+		while (interfaces.hasNext()) {
+			interfacesStr = interfacesStr + ", " + (String) interfaces.next();
+
+		}
+		return interfacesStr;
+	}
+
+	protected abstract List getEJBInterfaces();
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/model/EnterpriseBeanDelegate.java b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/model/EnterpriseBeanDelegate.java
new file mode 100644
index 0000000..1938fc4
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/model/EnterpriseBeanDelegate.java
@@ -0,0 +1,140 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotation.internal.model;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.jst.j2ee.ejb.EnterpriseBean;
+import org.eclipse.jst.j2ee.internal.common.operations.INewJavaClassDataModelProperties;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelEvent;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelListener;
+
+/**
+ * @author naci
+ *
+ */
+public  abstract class EnterpriseBeanDelegate implements IEnterpriseBean, IDataModelListener {
+
+	private final static String DEFAULT_DATA_MODEL="EnterpriseBeanDelegate.DATA_MODEL"; //$NON-NLS-1$
+	
+	private Map dataModels;
+	private EnterpriseBean enterpriseBean;
+	
+	public EnterpriseBeanDelegate()
+	{
+		dataModels = new HashMap();
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jst.j2ee.ejb.annotation.internal.model.IEnterpriseBean#getEnterpriseBean()
+	 */
+	public EnterpriseBean getEnterpriseBean() {
+		return enterpriseBean;
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jst.j2ee.ejb.annotation.internal.model.IEnterpriseBean#getVersionID()
+	 */
+	public int getVersionID() {
+		return enterpriseBean.getVersionID();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jst.j2ee.ejb.annotation.internal.model.IEnterpriseBean#getDataModel()
+	 */
+	public IDataModel getDataModel() {
+		return (IDataModel)dataModels.get(DEFAULT_DATA_MODEL);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jst.j2ee.ejb.annotation.internal.model.IEnterpriseBean#getDataModel()
+	 */
+	public void setDataModel(IDataModel dataModel) {
+		if(this.getDataModel() != null)
+			this.getDataModel().removeListener(this);
+		dataModel.addListener(this);
+		dataModels.put(DEFAULT_DATA_MODEL, dataModel);
+		enterpriseBean.setName(dataModel.getStringProperty(IEnterpriseBeanClassDataModelProperties.EJB_NAME));
+		enterpriseBean.setDescription(dataModel.getStringProperty(IEnterpriseBeanClassDataModelProperties.DESCRIPTION));
+		enterpriseBean.setDisplayName(dataModel.getStringProperty(IEnterpriseBeanClassDataModelProperties.DISPLAY_NAME));
+		enterpriseBean.setEjbClassName(dataModel.getStringProperty(INewJavaClassDataModelProperties.QUALIFIED_CLASS_NAME));
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jst.j2ee.ejb.annotation.internal.model.IEnterpriseBean#getDataModelFor(java.lang.String)
+	 */
+	public IDataModel getDataModelFor(String feature) {
+		return (IDataModel)dataModels.get(feature);
+	}
+
+	public void setEnterpriseBean(EnterpriseBean enterpriseBean) {
+		this.enterpriseBean = enterpriseBean;
+	}
+
+
+	public String getJndiName() {
+		return getDataModel().getStringProperty(IEnterpriseBeanClassDataModelProperties.JNDI_NAME);
+	}
+	
+	public String getEjbName() {
+		return getDataModel().getStringProperty(IEnterpriseBeanClassDataModelProperties.EJB_NAME);
+	}
+
+	public String getInterfaces() {
+		return getDataModel().getStringProperty(IEnterpriseBeanClassDataModelProperties.INTERFACES_AS_STRING);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jst.j2ee.ejb.annotation.model.ISessionBeanDelegate#getSimpleClassName()
+	 */
+	public String getSimpleClassName() {
+		return getDataModel().getStringProperty(INewJavaClassDataModelProperties.CLASS_NAME);
+	}
+
+
+	public String getDisplayName() {
+		return getDataModel().getStringProperty(IEnterpriseBeanClassDataModelProperties.DISPLAY_NAME);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jst.j2ee.ejb.annotation.model.ISessionBeanDelegate#getDescription()
+	 */
+	public String getDescription() {
+		return getDataModel().getStringProperty(IEnterpriseBeanClassDataModelProperties.DESCRIPTION);
+	}
+
+	public abstract String getTransactionType() ;
+
+	/**
+	 * 
+	 * This method permits us to keep emf model for the bean
+	 * in sync with the  changes in the datamodel
+	 */
+	
+	public void propertyChanged(DataModelEvent event) {
+		String property = event.getPropertyName();
+		Object propertyValue = event.getProperty();
+		if( enterpriseBean == null)
+			return;
+		if( IEnterpriseBeanClassDataModelProperties.EJB_NAME.equals(property)){
+			enterpriseBean.setName((String)propertyValue);
+		}else if(IEnterpriseBeanClassDataModelProperties.DESCRIPTION.equals(property)){
+			enterpriseBean.setDescription((String)propertyValue);
+		}else if(IEnterpriseBeanClassDataModelProperties.DISPLAY_NAME.equals(property)){
+			enterpriseBean.setDisplayName((String)propertyValue);
+		} else if(INewJavaClassDataModelProperties.CLASS_NAME.equals(property)){
+			enterpriseBean.setEjbClassName(event.getDataModel().getStringProperty(INewJavaClassDataModelProperties.QUALIFIED_CLASS_NAME));
+		} 
+	}
+
+	
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/model/IContainerManagedEntityBean.java b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/model/IContainerManagedEntityBean.java
new file mode 100644
index 0000000..7c0be40
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/model/IContainerManagedEntityBean.java
@@ -0,0 +1,32 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotation.internal.model;
+
+import java.util.List;
+
+/**
+ * @author naci
+ */
+public interface IContainerManagedEntityBean extends IEnterpriseBean {
+
+	public String getDatasource();
+
+	public String getSchema();
+
+	public String getTable();
+
+	public List getAttributes();
+
+	public String getPrimaryKeyClass();
+
+	public String getVersion();
+
+	public List getKeyAttributes();
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/model/IContainerManagedEntityBeanDataModelProperties.java b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/model/IContainerManagedEntityBeanDataModelProperties.java
new file mode 100644
index 0000000..b3cadfa
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/model/IContainerManagedEntityBeanDataModelProperties.java
@@ -0,0 +1,24 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotation.internal.model;
+
+import org.eclipse.jst.j2ee.application.internal.operations.IAnnotationsDataModel;
+
+public interface IContainerManagedEntityBeanDataModelProperties extends IEnterpriseBeanClassDataModelProperties, IAnnotationsDataModel {
+
+	public static final String DATASOURCE = "EntityBeanDataModel.DATASOURCE"; //$NON-NLS-1$
+	public static final String SCHEMA = "EntityBeanDataModel.SCHEMA"; //$NON-NLS-1$
+	public static final String TABLE = "EntityBeanDataModel.TABLE"; //$NON-NLS-1$
+	public static final String ATTRIBUTES = "EntityBeanDataModel.ATTRIBUTES"; //$NON-NLS-1$
+	public static final String VERSION = "EntityBeanDataModel.VERSION"; //$NON-NLS-1$
+
+	public final static String EJB_INTERFACES = "EntityBeanDataModel.EJB_INTERFACES"; //$NON-NLS-1$
+													
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/model/IEnterpriseBean.java b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/model/IEnterpriseBean.java
new file mode 100644
index 0000000..7977be8
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/model/IEnterpriseBean.java
@@ -0,0 +1,35 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotation.internal.model;
+
+import org.eclipse.jst.j2ee.ejb.EnterpriseBean;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+/**
+ * @author naci
+ *
+ */
+public interface IEnterpriseBean {
+	
+	public EnterpriseBean getEnterpriseBean();
+	public IDataModel getDataModel();
+	public IDataModel getDataModelFor(String feature);
+
+	public String getTransactionType();
+	public String getEjbName();
+	public String getDisplayName();
+	public String getDescription();
+	public String getJndiName();
+	public String getInterfaces();
+	public String getSimpleClassName();
+	
+	public int getVersionID();
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/model/IEnterpriseBeanClassDataModelProperties.java b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/model/IEnterpriseBeanClassDataModelProperties.java
new file mode 100644
index 0000000..8655f38
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/model/IEnterpriseBeanClassDataModelProperties.java
@@ -0,0 +1,34 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotation.internal.model;
+
+import org.eclipse.jst.j2ee.application.internal.operations.IAnnotationsDataModel;
+import org.eclipse.jst.j2ee.internal.common.operations.INewJavaClassDataModelProperties;
+
+public interface IEnterpriseBeanClassDataModelProperties extends INewJavaClassDataModelProperties, IAnnotationsDataModel {
+
+	public static final String EJB_TYPE = "IEjbCommonDataModel.EJB_TYPE"; //$NON-NLS-1$
+
+	public static final String EJB_NAME = "IEjbCommonDataModel.EJB_NAME"; //$NON-NLS-1$
+
+	public static final String JNDI_NAME = "IEjbCommonDataModel.JNDI_NAME"; //$NON-NLS-1$
+
+	public static final String DISPLAY_NAME = "IEjbCommonDataModel.DISPLAY_NAME"; //$NON-NLS-1$
+
+	public static final String DESCRIPTION = "IEjbCommonDataModel.DESCRIPTION"; //$NON-NLS-1$
+
+	public static final String TRANSACTIONTYPE = "IEjbCommonDataModel.TRANSACTIONTYPE"; //$NON-NLS-1$
+
+	public static final String ANNOTATIONPROVIDER = "IEjbCommonDataModel.ANNOTATIONPROVIDER"; //$NON-NLS-1$
+
+	public static final String MODELDELEGATE = "IEjbCommonDataModel.MODELDELEGATE"; //$NON-NLS-1$
+	
+	public static final String INTERFACES_AS_STRING = "IEjbCommonDataModel.INTERFACES_AS_STRING"; //$NON-NLS-1$
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/model/IMessageDrivenBean.java b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/model/IMessageDrivenBean.java
new file mode 100644
index 0000000..46fae90
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/model/IMessageDrivenBean.java
@@ -0,0 +1,20 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotation.internal.model;
+
+/**
+ * @author naci
+ *
+ */
+public interface IMessageDrivenBean extends IEnterpriseBean {
+	public String getDestinationType();
+	public String getDestinationJndiName();
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/model/IMessageDrivenBeanDataModelProperties.java b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/model/IMessageDrivenBeanDataModelProperties.java
new file mode 100644
index 0000000..6e0dddb
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/model/IMessageDrivenBeanDataModelProperties.java
@@ -0,0 +1,21 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotation.internal.model;
+
+import org.eclipse.jst.j2ee.application.internal.operations.IAnnotationsDataModel;
+
+public interface IMessageDrivenBeanDataModelProperties extends IEnterpriseBeanClassDataModelProperties, IAnnotationsDataModel {
+
+	public static final String DESTINATIONNAME = "MessageDrivenBeanDataModel.DESTINATIONNAME"; //$NON-NLS-1$
+	public static final String DESTINATIONTYPE = "MessageDrivenBeanDataModel.DESTINATIONTYPE"; //$NON-NLS-1$
+
+	public final static String EJB_INTERFACES = "MessageDrivenBeanDataModel.EJB_INTERFACES"; //$NON-NLS-1$
+													
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/model/ISessionBean.java b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/model/ISessionBean.java
new file mode 100644
index 0000000..1062558
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/model/ISessionBean.java
@@ -0,0 +1,19 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotation.internal.model;
+
+/**
+ * @author naci
+ *
+ */
+public interface ISessionBean extends IEnterpriseBean {
+	public String getSessionType();
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/model/ISessionBeanDataModelProperties.java b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/model/ISessionBeanDataModelProperties.java
new file mode 100644
index 0000000..a16f33e
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/model/ISessionBeanDataModelProperties.java
@@ -0,0 +1,19 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotation.internal.model;
+
+import org.eclipse.jst.j2ee.application.internal.operations.IAnnotationsDataModel;
+
+public interface ISessionBeanDataModelProperties extends IEnterpriseBeanClassDataModelProperties, IAnnotationsDataModel {
+
+	public static final String STATELESS = "SessionBeanDataModel.STATELESS"; //$NON-NLS-1$
+	
+	public final static String EJB_INTERFACES = "SessionBeanDataModel.EJB_INTERFACES"; //$NON-NLS-1$
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/model/Logger.java b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/model/Logger.java
new file mode 100644
index 0000000..e598b9f
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/model/Logger.java
@@ -0,0 +1,142 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+package org.eclipse.jst.j2ee.ejb.annotation.internal.model;
+
+import java.util.StringTokenizer;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.osgi.framework.Bundle;
+
+/**
+ * Small convenience class to log messages to plugin's log file and also, if desired,
+ * the console. This class should only be used by classes in this plugin. Other
+ * plugins should make their own copy, with appropriate ID.
+ */
+public class Logger {
+	private static final String PLUGIN_ID = "org.eclipse.jst.j2ee.ejb.annotation.model"; //$NON-NLS-1$
+
+	private static final String TRACEFILTER_LOCATION = "/debug/tracefilter"; //$NON-NLS-1$
+
+	public static final int OK = IStatus.OK; // 0
+	public static final int INFO = IStatus.INFO; // 1
+	public static final int WARNING = IStatus.WARNING; // 2
+	public static final int ERROR = IStatus.ERROR; // 4
+
+	public static final int OK_DEBUG = 200 + OK;
+	public static final int INFO_DEBUG = 200 + INFO;
+	public static final int WARNING_DEBUG = 200 + WARNING;
+	public static final int ERROR_DEBUG = 200 + ERROR;
+
+	/**
+	 * Adds message to log.
+	 * @param level severity level of the message (OK, INFO, WARNING, ERROR, OK_DEBUG, INFO_DEBUG, WARNING_DEBUG, ERROR_DEBUG)
+	 * @param message text to add to the log
+	 * @param exception exception thrown
+	 */
+	protected static void _log(int level, String message, Throwable exception) {
+		if (level == OK_DEBUG || level == INFO_DEBUG || level == WARNING_DEBUG || level == ERROR_DEBUG) {
+			if (!isDebugging())
+				return;
+		}
+
+		int severity = IStatus.OK;
+		switch (level) {
+			case INFO_DEBUG :
+			case INFO :
+				severity = IStatus.INFO;
+				break;
+			case WARNING_DEBUG :
+			case WARNING :
+				severity = IStatus.WARNING;
+				break;
+			case ERROR_DEBUG :
+			case ERROR :
+				severity = IStatus.ERROR;
+		}
+		message = (message != null) ? message : "null"; //$NON-NLS-1$
+		Status statusObj = new Status(severity, PLUGIN_ID, severity, message, exception);
+		Bundle bundle = Platform.getBundle(PLUGIN_ID);
+		if (bundle != null) 
+			Platform.getLog(bundle).log(statusObj);
+	}
+
+	/**
+	 * Prints message to log if category matches /debug/tracefilter option.
+	 * @param message text to print
+	 * @param category category of the message, to be compared with /debug/tracefilter
+	 */
+	protected static void _trace(String category, String message, Throwable exception) {
+		if (isTracing(category)) {
+			message = (message != null) ? message : "null"; //$NON-NLS-1$
+			Status statusObj = new Status(IStatus.OK, PLUGIN_ID, IStatus.OK, message, exception);
+			Bundle bundle = Platform.getBundle(PLUGIN_ID);
+			if (bundle != null) 
+				Platform.getLog(bundle).log(statusObj);
+		}
+	}
+
+	/**
+	 * @return true if the platform is debugging
+	 */
+	public static boolean isDebugging() {
+		return Platform.inDebugMode();
+	}
+
+	/**
+	 * Determines if currently tracing a category
+	 * @param category
+	 * @return true if tracing category, false otherwise
+	 */
+	public static boolean isTracing(String category) {
+		if (!isDebugging())
+			return false;
+
+		String traceFilter = Platform.getDebugOption(PLUGIN_ID + TRACEFILTER_LOCATION);
+		if (traceFilter != null) {
+			StringTokenizer tokenizer = new StringTokenizer(traceFilter, ","); //$NON-NLS-1$
+			while (tokenizer.hasMoreTokens()) {
+				String cat = tokenizer.nextToken().trim();
+				if (category.equals(cat)) {
+					return true;
+				}
+			}
+		}
+		return false;
+	}
+
+	public static void log(int level, String message) {
+		_log(level, message, null);
+	}
+
+	public static void log(int level, String message, Throwable exception) {
+		_log(level, message, exception);
+	}
+
+	public static void logException(String message, Throwable exception) {
+		_log(ERROR, message, exception);
+	}
+
+	public static void logException(Throwable exception) {
+		_log(ERROR, exception.getMessage(), exception);
+	}
+
+	public static void traceException(String category, String message, Throwable exception) {
+		_trace(category, message, exception);
+	}
+
+	public static void traceException(String category, Throwable exception) {
+		_trace(category, exception.getMessage(), exception);
+	}
+
+	public static void trace(String category, String message) {
+		_trace(category, message, null);
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/model/MessageDrivenBeanDataModelProvider.java b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/model/MessageDrivenBeanDataModelProvider.java
new file mode 100644
index 0000000..c035aa8
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/model/MessageDrivenBeanDataModelProvider.java
@@ -0,0 +1,135 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotation.internal.model;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jst.j2ee.ejb.DestinationType;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.messages.IEJBAnnotationConstants;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.operations.AddMessageDrivenBeanOperation;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
+import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
+
+
+public class MessageDrivenBeanDataModelProvider extends EnterpriseBeanClassDataModelProvider implements IMessageDrivenBeanDataModelProperties {
+
+	public final static String DEFAULT_EJB_SUPERCLASS = "java.lang.Object"; //$NON-NLS-1$ 
+	public final static String[] DEFAULT_EJB_INTERFACES = {"javax.ejb.MessageDrivenBean", "javax.jms.MessageListener"}; //$NON-NLS-1$ //$NON-NLS-2$
+
+	private List interfaceList;
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.common.frameworks.internal.operation.WTPOperationDataModel#getDefaultOperation()
+	 */
+	public IDataModelOperation getDefaultOperation() {
+		AddMessageDrivenBeanOperation operation = new AddMessageDrivenBeanOperation(getDataModel());
+		//Initialize the delagate. It can cause Invalid state vioation if a wizard exits early
+		getDataModel().getProperty(IEnterpriseBeanClassDataModelProperties.MODELDELEGATE);
+
+		return operation;
+	}
+
+	/**
+	 * Subclasses may extend this method to add their own data model's properties as valid base
+	 * properties.
+	 * 
+	 * @see org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider#getPropertyNames()
+	 */
+	public Set getPropertyNames() {
+		Set propertyNames = super.getPropertyNames();
+		propertyNames.add(DESTINATIONTYPE);
+		propertyNames.add(DESTINATIONNAME);
+		propertyNames.add(EJB_INTERFACES);
+		return propertyNames;
+	}
+
+	public Object getDefaultProperty(String propertyName) {
+		if (propertyName.equals(USE_ANNOTATIONS))
+			return Boolean.FALSE;
+		else if (propertyName.equals(DESTINATIONNAME))
+			return getProperty(JNDI_NAME);
+		else if (propertyName.equals(DESTINATIONTYPE))
+			return DestinationType.QUEUE_LITERAL.getName();
+		else if (propertyName.equals(EJB_TYPE))
+			return "MessageDrivenBean";
+		else if (propertyName.equals(MODIFIER_ABSTRACT))
+			return Boolean.FALSE;
+		else if (propertyName.equals(SUPERCLASS))
+			return DEFAULT_EJB_SUPERCLASS;
+		else if (propertyName.equals(EJB_INTERFACES))
+			return DEFAULT_EJB_INTERFACES;
+		return super.getDefaultProperty(propertyName);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.common.frameworks.internal.operation.WTPOperationDataModel#doValidateProperty(java.lang.String)
+	 */
+	public IStatus validate(String propertyName) {
+		if (propertyName.equals(DESTINATIONNAME))
+			return validateJndiName(getStringProperty(propertyName));
+		if (propertyName.equals(DESTINATIONTYPE))
+			return validateDestinationType(getStringProperty(propertyName));
+		return super.validate(propertyName);
+	}
+
+	private IStatus validateDestinationType(String prop) {
+		// check for empty
+		if (prop == null || prop.trim().length() == 0) {
+			String msg = IEJBAnnotationConstants.ERR_DESTINATIONTYPE_EMPTY;
+			return WTPCommonPlugin.createErrorStatus(msg);
+		}
+		if (prop.indexOf("Queue") >= 0 || prop.indexOf("Topic") >= 0) {
+			return WTPCommonPlugin.OK_STATUS;
+		}
+		String msg = IEJBAnnotationConstants.ERR_DESTINATIONTYPE_VALUE;
+		return WTPCommonPlugin.createErrorStatus(msg);
+	}
+
+	protected List getEJBInterfaces() {
+		if (this.interfaceList == null) {
+			this.interfaceList = new ArrayList();
+			for (int i = 0; i < ((String[]) getProperty(EJB_INTERFACES)).length; i++) {
+				this.interfaceList.add(((String[]) getProperty(EJB_INTERFACES))[i]);
+			}
+		}
+		return this.interfaceList;
+	}
+
+	protected void initializeDelegate() {
+		MessageDrivenBeanDelegate delegate = new MessageDrivenBeanDelegate();
+		delegate.setDataModel(getDataModel());
+		this.setProperty(MODELDELEGATE, delegate);
+		// Set the defaults so that they are propagated via events
+		this.setProperty(DESTINATIONTYPE, this.getProperty(DESTINATIONTYPE));
+		this.setProperty(TRANSACTIONTYPE, this.getProperty(TRANSACTIONTYPE));
+	}
+	
+	public boolean propertySet(String propertyName, Object propertyValue) {
+
+		boolean result = super.propertySet(propertyName, propertyValue);
+
+		if (propertyName.equals(EJB_NAME)) {
+			if (!isPropertySet(DESTINATIONNAME))
+				getDataModel().notifyPropertyChange(DESTINATIONNAME, IDataModel.DEFAULT_CHG);
+		}
+		return result;
+	}
+
+
+
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/model/MessageDrivenBeanDelegate.java b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/model/MessageDrivenBeanDelegate.java
new file mode 100644
index 0000000..b372a00
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/model/MessageDrivenBeanDelegate.java
@@ -0,0 +1,122 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotation.internal.model;
+
+import org.eclipse.jst.j2ee.ejb.DestinationType;
+import org.eclipse.jst.j2ee.ejb.EjbFactory;
+import org.eclipse.jst.j2ee.ejb.MessageDriven;
+import org.eclipse.jst.j2ee.ejb.MessageDrivenDestination;
+import org.eclipse.jst.j2ee.ejb.TransactionType;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelEvent;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+public class MessageDrivenBeanDelegate extends EnterpriseBeanDelegate implements IMessageDrivenBean {
+
+	public MessageDrivenBeanDelegate() {
+		super();
+		MessageDriven mdBean = EjbFactory.eINSTANCE.createMessageDriven();
+		this.setEnterpriseBean(mdBean);
+
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jst.j2ee.ejb.annotation.internal.model.IEnterpriseBean#getDataModel()
+	 */
+	public void setDataModel(IDataModel dataModel) {
+		super.setDataModel(dataModel);
+		MessageDriven messageDriven = (MessageDriven) this.getEnterpriseBean();
+		if (messageDriven == null)
+			return;
+
+		DestinationType dType = DestinationType.QUEUE_LITERAL;
+		if (dataModel.getStringProperty(IMessageDrivenBeanDataModelProperties.DESTINATIONTYPE).equals(
+				DestinationType.TOPIC_LITERAL.getName()))
+			dType = DestinationType.TOPIC_LITERAL;
+		MessageDrivenDestination destination = EjbFactory.eINSTANCE.createMessageDrivenDestination();
+		destination.setType(dType);
+		destination.setBean(messageDriven);
+		messageDriven.setDestination(destination);
+		String dName = dataModel.getStringProperty(IMessageDrivenBeanDataModelProperties.DESTINATIONNAME);
+		if (dName == null || dName.length() <= 0)
+			dName = dataModel.getStringProperty(IEnterpriseBeanClassDataModelProperties.JNDI_NAME);
+		messageDriven.setMessageSelector(dName);
+
+		TransactionType transactionType = TransactionType.CONTAINER_LITERAL;
+		if (dataModel.getStringProperty(IMessageDrivenBeanDataModelProperties.TRANSACTIONTYPE).equals(
+				TransactionType.BEAN_LITERAL.getName()))
+			transactionType = TransactionType.BEAN_LITERAL;
+		messageDriven.setTransactionType(transactionType);
+
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jst.j2ee.ejb.annotations.internal.emitter.model.IMessageDrivenBeanDelegate#getDestinationType()
+	 */
+	public String getDestinationType() {
+		MessageDriven messageDriven = (MessageDriven) this.getEnterpriseBean();
+		return messageDriven.getDestination().getType().getName();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jst.j2ee.ejb.annotations.internal.emitter.model.IMessageDrivenBeanDelegate#getDestinationType()
+	 */
+	public String getTransactionType() {
+		MessageDriven messageDriven = (MessageDriven) this.getEnterpriseBean();
+		return messageDriven.getTransactionType().getName();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jst.j2ee.ejb.annotations.internal.emitter.model.IMessageDrivenBeanDelegate#getDestinationJndiName()
+	 */
+	public String getDestinationJndiName() {
+		MessageDriven messageDriven = (MessageDriven) this.getEnterpriseBean();
+		return messageDriven.getMessageSelector();
+	}
+
+	/**
+	 * This method permits us to keep emf model for the bean in sync with the
+	 * changes in the datamodel
+	 */
+	public void propertyChanged(DataModelEvent event) {
+		super.propertyChanged(event);
+		String property = event.getPropertyName();
+		Object propertyValue = event.getProperty();
+		MessageDriven messageDriven = (MessageDriven) this.getEnterpriseBean();
+		if (messageDriven == null)
+			return;
+
+		if (IMessageDrivenBeanDataModelProperties.DESTINATIONTYPE.equals(property)) {
+			DestinationType dType = DestinationType.QUEUE_LITERAL;
+			if (propertyValue.equals(DestinationType.TOPIC_LITERAL.getName()))
+				dType = DestinationType.TOPIC_LITERAL;
+			MessageDrivenDestination destination = EjbFactory.eINSTANCE.createMessageDrivenDestination();
+			destination.setType(dType);
+			destination.setBean(messageDriven);
+			messageDriven.setDestination(destination);
+		} else if (IMessageDrivenBeanDataModelProperties.DESTINATIONNAME.equals(property)
+				|| IEnterpriseBeanClassDataModelProperties.JNDI_NAME.equals(property)) {
+			messageDriven.setMessageSelector((String) propertyValue);
+		} else if (IEnterpriseBeanClassDataModelProperties.TRANSACTIONTYPE.equals(property)) {
+			TransactionType transactionType = TransactionType.CONTAINER_LITERAL;
+			if (propertyValue.equals(TransactionType.BEAN_LITERAL.getName()))
+				transactionType = TransactionType.BEAN_LITERAL;
+			messageDriven.setTransactionType(transactionType);
+		}
+
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/model/ModelPlugin.java b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/model/ModelPlugin.java
new file mode 100644
index 0000000..50fbd59
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/model/ModelPlugin.java
@@ -0,0 +1,88 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotation.internal.model;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+import org.eclipse.core.runtime.Plugin;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.preferences.AnnotationPreferenceStore;
+import org.osgi.framework.BundleContext;
+
+public class ModelPlugin extends Plugin {
+
+	public static final String PLUGINID = "org.eclipse.jst.j2ee.ejb.annotation.model";
+
+	// The shared instance.
+	private static ModelPlugin plugin;
+	// Resource bundle.
+	private ResourceBundle resourceBundle;
+
+	/**
+	 * The constructor.
+	 */
+	public ModelPlugin() {
+		super();
+		plugin = this;
+	}
+
+	/**
+	 * This method is called upon plug-in activation
+	 */
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+	}
+
+	/**
+	 * This method is called when the plug-in is stopped
+	 */
+	public void stop(BundleContext context) throws Exception {
+		super.stop(context);
+		plugin = null;
+		resourceBundle = null;
+	}
+
+	/**
+	 * Returns the shared instance.
+	 */
+	public static ModelPlugin getDefault() {
+		return plugin;
+	}
+
+	/**
+	 * Returns the string from the plugin's resource bundle, or 'key' if not
+	 * found.
+	 */
+	public static String getResourceString(String key) {
+		ResourceBundle bundle = ModelPlugin.getDefault().getResourceBundle();
+		try {
+			return (bundle != null) ? bundle.getString(key) : key;
+		} catch (MissingResourceException e) {
+			return key;
+		}
+	}
+
+	/**
+	 * Returns the plugin's resource bundle,
+	 */
+	public ResourceBundle getResourceBundle() {
+		try {
+			if (resourceBundle == null)
+				resourceBundle = ResourceBundle.getBundle("org.eclipse.jst.j2ee.ejb.annotation.model.ModelPluginResources");
+		} catch (MissingResourceException x) {
+			resourceBundle = null;
+		}
+		return resourceBundle;
+	}
+	
+	protected void initializeDefaultPluginPreferences() {
+		AnnotationPreferenceStore.initializeDefaultPreferences(this.getPluginPreferences());
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/model/SessionBeanDataModelProvider.java b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/model/SessionBeanDataModelProvider.java
new file mode 100644
index 0000000..e1f6226
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/model/SessionBeanDataModelProvider.java
@@ -0,0 +1,115 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotation.internal.model;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jst.j2ee.ejb.SessionType;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.messages.IEJBAnnotationConstants;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.operations.AddSessionBeanOperation;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
+import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
+
+
+public class SessionBeanDataModelProvider extends EnterpriseBeanClassDataModelProvider implements ISessionBeanDataModelProperties {
+	protected final static String DEFAULT_EJB_SUPERCLASS = "java.lang.Object"; //$NON-NLS-1$ 
+	protected final static String[] DEFAULT_EJB_INTERFACES = {"javax.ejb.SessionBean"}; //$NON-NLS-1$
+
+	private List interfaceList;
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.common.frameworks.internal.operation.WTPOperationDataModel#getDefaultOperation()
+	 */
+	public IDataModelOperation getDefaultOperation() {
+		AddSessionBeanOperation operation =  new AddSessionBeanOperation(getDataModel());
+		getDataModel().getProperty(IEnterpriseBeanClassDataModelProperties.MODELDELEGATE);
+		return operation;
+	}
+
+	/**
+	 * Subclasses may extend this method to add their own data model's properties as valid base
+	 * properties.
+	 * 
+	 * @see org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider#getPropertyNames()
+	 */
+	public Set getPropertyNames() {
+		Set propertyNames = super.getPropertyNames();
+		propertyNames.add(STATELESS);
+		propertyNames.add(EJB_INTERFACES);
+		return propertyNames;
+	}
+
+	public Object getDefaultProperty(String propertyName) {
+		if (propertyName.equals(USE_ANNOTATIONS))
+			return Boolean.FALSE;
+		else if (propertyName.equals(EJB_TYPE))
+			return "SessionBean"; //$NON-NLS-1$
+		else if (propertyName.equals(STATELESS))
+			return SessionType.STATELESS_LITERAL.getName();
+		else if (propertyName.equals(MODIFIER_ABSTRACT))
+			return Boolean.TRUE;
+		else if (propertyName.equals(SUPERCLASS))
+			return DEFAULT_EJB_SUPERCLASS;
+		else if (propertyName.equals(MODIFIER_ABSTRACT))
+			return Boolean.TRUE;
+		else if (propertyName.equals(EJB_INTERFACES))
+			return DEFAULT_EJB_INTERFACES;
+		return super.getDefaultProperty(propertyName);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.common.frameworks.internal.operation.WTPOperationDataModel#doValidateProperty(java.lang.String)
+	 */
+	public IStatus validate(String propertyName) {
+		if (propertyName.equals(STATELESS))
+			return validateStateless(getStringProperty(propertyName));
+		return super.validate(propertyName);
+	}
+
+	protected List getEJBInterfaces() {
+		if (this.interfaceList == null) {
+			this.interfaceList = new ArrayList();
+			for (int i = 0; i < ((String[]) getProperty(EJB_INTERFACES)).length; i++) {
+				this.interfaceList.add(((String[]) getProperty(EJB_INTERFACES))[i]);
+			}
+		}
+		return this.interfaceList;
+	}
+
+	private IStatus validateStateless(String prop) {
+		// check for empty
+		if (prop == null || prop.trim().length() == 0) {
+			String msg = IEJBAnnotationConstants.ERR_STATELESS_EMPTY;
+			return WTPCommonPlugin.createErrorStatus(msg);
+		}
+		if (prop.indexOf("Stateless") >= 0 || prop.indexOf("Stateful") >= 0) { //$NON-NLS-1$ //$NON-NLS-2$
+			return WTPCommonPlugin.OK_STATUS;
+		}
+		String msg = IEJBAnnotationConstants.ERR_STATELESS_VALUE;
+		return WTPCommonPlugin.createErrorStatus(msg);
+	}
+
+	protected void initializeDelegate() {
+		SessionBeanDelegate delegate = new SessionBeanDelegate();
+		delegate.setDataModel(getDataModel());
+		this.setProperty(MODELDELEGATE, delegate);
+		// Set the defaults so that they are propagated via events
+		this.setProperty(STATELESS, this.getProperty(STATELESS));
+		this.setProperty(TRANSACTIONTYPE, this.getProperty(TRANSACTIONTYPE));
+	}
+
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/model/SessionBeanDelegate.java b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/model/SessionBeanDelegate.java
new file mode 100644
index 0000000..1524c07
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/model/SessionBeanDelegate.java
@@ -0,0 +1,86 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotation.internal.model;
+
+import org.eclipse.jst.j2ee.ejb.EjbFactory;
+import org.eclipse.jst.j2ee.ejb.Session;
+import org.eclipse.jst.j2ee.ejb.SessionType;
+import org.eclipse.jst.j2ee.ejb.TransactionType;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelEvent;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+public class SessionBeanDelegate extends EnterpriseBeanDelegate implements ISessionBean {
+	public SessionBeanDelegate() {
+		super();
+		Session sessionBean = EjbFactory.eINSTANCE.createSession();
+		this.setEnterpriseBean(sessionBean);
+	}
+
+	public void setDataModel(IDataModel dataModel) {
+		super.setDataModel(dataModel);
+		Session session = (Session) this.getEnterpriseBean();
+		if (session == null)
+			return;
+
+		SessionType sessionBeanType = SessionType.STATELESS_LITERAL;
+		if (dataModel.getStringProperty(ISessionBeanDataModelProperties.STATELESS).equals(SessionType.STATEFUL_LITERAL.getName()))
+			sessionBeanType = SessionType.STATEFUL_LITERAL;
+		session.setSessionType(sessionBeanType);
+
+		TransactionType transactionType = TransactionType.CONTAINER_LITERAL;
+		if (dataModel.getStringProperty(ISessionBeanDataModelProperties.TRANSACTIONTYPE)
+				.equals(TransactionType.BEAN_LITERAL.getName()))
+			transactionType = TransactionType.BEAN_LITERAL;
+		session.setTransactionType(transactionType);
+
+	}
+
+	public String getSessionType() {
+		Session session = (Session) this.getEnterpriseBean();
+		return session.getSessionType().getName();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jst.j2ee.ejb.annotation.model.ISessionBeanDelegate#getTransactionType()
+	 */
+	public String getTransactionType() {
+		Session session = (Session) this.getEnterpriseBean();
+		return session.getTransactionType().getName();
+	}
+
+	/**
+	 * This method permits us to keep emf model for the bean in sync with the
+	 * changes in the datamodel
+	 */
+
+	public void propertyChanged(DataModelEvent event) {
+		super.propertyChanged(event);
+		String property = event.getPropertyName();
+		Object propertyValue = event.getProperty();
+		Session session = (Session) this.getEnterpriseBean();
+		if (session == null)
+			return;
+
+		if (ISessionBeanDataModelProperties.STATELESS.equals(property)) {
+			SessionType sessionBeanType = SessionType.STATELESS_LITERAL;
+			if (propertyValue.equals(SessionType.STATEFUL_LITERAL.getName()))
+				sessionBeanType = SessionType.STATEFUL_LITERAL;
+			session.setSessionType(sessionBeanType);
+		} else if (IEnterpriseBeanClassDataModelProperties.TRANSACTIONTYPE.equals(property)) {
+			TransactionType transactionType = TransactionType.CONTAINER_LITERAL;
+			if (propertyValue.equals(TransactionType.BEAN_LITERAL.getName()))
+				transactionType = TransactionType.BEAN_LITERAL;
+			session.setTransactionType(transactionType);
+		}
+
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/operations/AddContainerManagedEntityBeanOperation.java b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/operations/AddContainerManagedEntityBeanOperation.java
new file mode 100644
index 0000000..e348d32
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/operations/AddContainerManagedEntityBeanOperation.java
@@ -0,0 +1,60 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotation.internal.operations;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.model.IEnterpriseBeanClassDataModelProperties;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.model.IContainerManagedEntityBean;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.model.Logger;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.provider.IEJBGenerator;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.utility.AnnotationUtilities;
+import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+public class AddContainerManagedEntityBeanOperation extends AbstractDataModelOperation {
+
+	/**
+	 * @param dataModel
+	 */
+	public AddContainerManagedEntityBeanOperation(IDataModel dataModel) {
+		super(dataModel);
+	}
+
+	public IStatus execute(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+		try {
+			IEJBGenerator generator = AnnotationUtilities.findEjbGeneratorByName(getDataModel().getStringProperty(
+					IEnterpriseBeanClassDataModelProperties.ANNOTATIONPROVIDER));
+			IContainerManagedEntityBean delegate = (IContainerManagedEntityBean) getDataModel().getProperty(
+					IEnterpriseBeanClassDataModelProperties.MODELDELEGATE);
+			if (generator != null)
+				generator.generateCMP(delegate, monitor);
+			else {
+				// TODO MUST RAISE A WARNING HERE
+				Logger.log(Logger.WARNING, "There is no generator");
+			}
+		} catch (Exception e) {
+			Logger.logException(e);
+		}
+		return OK_STATUS;
+	}
+
+	public IStatus undo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	public IStatus redo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+		// TODO Auto-generated method stub
+		return null;
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/operations/AddEjbOperation.java b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/operations/AddEjbOperation.java
new file mode 100644
index 0000000..29b4735
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/operations/AddEjbOperation.java
@@ -0,0 +1,51 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+
+package org.eclipse.jst.j2ee.ejb.annotation.internal.operations;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.model.IEnterpriseBeanClassDataModelProperties;
+import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+public class AddEjbOperation extends AbstractDataModelOperation {
+	/**
+	 * @param dataModel
+	 */
+	public AddEjbOperation(IDataModel dataModel) {
+		super(dataModel);
+	}
+	public IStatus execute(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+		createEjb(monitor);
+		return OK_STATUS;
+	}
+	
+	public IStatus undo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+		// TODO Auto-generated method stub
+		return null;
+	}
+	
+	public IStatus redo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	private void createEjb(IProgressMonitor monitor) throws ExecutionException {
+		if( "SessionBean".equals(getDataModel().getStringProperty(IEnterpriseBeanClassDataModelProperties.EJB_TYPE))){ //$NON-NLS-1$
+			(new AddSessionBeanOperation(getDataModel())).execute(monitor, null);
+		}else if( "MessageDrivenBean".equals(getDataModel().getStringProperty(IEnterpriseBeanClassDataModelProperties.EJB_TYPE))){ //$NON-NLS-1$
+			(new AddMessageDrivenBeanOperation(getDataModel())).execute(monitor, null);
+		}
+	}
+
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/operations/AddMessageDrivenBeanOperation.java b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/operations/AddMessageDrivenBeanOperation.java
new file mode 100644
index 0000000..2587705
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/operations/AddMessageDrivenBeanOperation.java
@@ -0,0 +1,58 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotation.internal.operations;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.model.IEnterpriseBeanClassDataModelProperties;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.model.IMessageDrivenBean;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.model.Logger;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.provider.IEJBGenerator;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.utility.AnnotationUtilities;
+import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+public class AddMessageDrivenBeanOperation extends AbstractDataModelOperation {
+
+	/**
+	 * @param dataModel
+	 */
+	public AddMessageDrivenBeanOperation(IDataModel dataModel) {
+		super(dataModel);
+	}
+
+	public IStatus execute(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+		try {
+			IEJBGenerator generator = AnnotationUtilities.findEjbGeneratorByName(getDataModel().getStringProperty(IEnterpriseBeanClassDataModelProperties.ANNOTATIONPROVIDER));
+			IMessageDrivenBean delegate = (IMessageDrivenBean) getDataModel().getProperty(IEnterpriseBeanClassDataModelProperties.MODELDELEGATE);
+			if( generator != null )
+				generator.generateMessageDriven(delegate,monitor);
+			else{
+				//TODO MUST RAISE A WARNING HERE
+				Logger.log(Logger.WARNING,"There is no generator");
+			}
+		} catch (Exception e) {
+			Logger.logException(e);
+		}
+		return OK_STATUS;
+	}
+	
+	public IStatus undo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+		// TODO Auto-generated method stub
+		return null;
+	}
+	
+	public IStatus redo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+		// TODO Auto-generated method stub
+		return null;
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/operations/AddSessionBeanOperation.java b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/operations/AddSessionBeanOperation.java
new file mode 100644
index 0000000..eacae32
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/operations/AddSessionBeanOperation.java
@@ -0,0 +1,60 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+
+package org.eclipse.jst.j2ee.ejb.annotation.internal.operations;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.model.IEnterpriseBeanClassDataModelProperties;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.model.ISessionBean;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.model.Logger;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.provider.IEJBGenerator;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.utility.AnnotationUtilities;
+import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+public class AddSessionBeanOperation extends AbstractDataModelOperation {
+	
+	/**
+	 * @param dataModel
+	 */
+	public AddSessionBeanOperation(IDataModel dataModel) {
+		super(dataModel);
+	}
+
+	public IStatus execute(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+		try {
+			IEJBGenerator generator = AnnotationUtilities.findEjbGeneratorByName(getDataModel().getStringProperty(IEnterpriseBeanClassDataModelProperties.ANNOTATIONPROVIDER));
+			ISessionBean delegate = (ISessionBean) getDataModel().getProperty(IEnterpriseBeanClassDataModelProperties.MODELDELEGATE);
+			if(generator != null )
+				generator.generateSession(delegate,monitor);
+			else{
+				//TODO MUST RAISE A WARNING HERE
+				Logger.log(Logger.WARNING,"There is no generator");
+			}
+		} catch (Exception e) {
+			Logger.logException(e);
+		} 
+		return OK_STATUS;
+	}
+	
+	public IStatus undo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+		// TODO Auto-generated method stub
+		return null;
+	}
+	
+	public IStatus redo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/preferences/AnnotationPreferenceStore.java b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/preferences/AnnotationPreferenceStore.java
new file mode 100644
index 0000000..b3beda6
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/preferences/AnnotationPreferenceStore.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Copyright (c) 2002, 2003,2004 Eteration Bilisim A.S.
+ * Naci Dai and others.
+ * 
+ * Parts developed under contract ref:FT/R&D/MAPS/AMS/2004-09-09/AL are 
+ * Copyright France Telecom, 2004.
+ * 
+ * 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:
+ *     Eteration Bilisim A.S. - initial API and implementation
+ *     Naci Dai
+ * For more information on eteration, please see
+ * <http://www.eteration.com/>.
+ ***************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotation.internal.preferences;
+
+import org.eclipse.core.runtime.Preferences;
+import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
+import org.eclipse.core.runtime.preferences.DefaultScope;
+import org.eclipse.core.runtime.preferences.IEclipsePreferences;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.model.ModelPlugin;
+
+public class AnnotationPreferenceStore extends AbstractPreferenceInitializer {
+
+	public static final String ANNOTATIONPROVIDER = "ANNOTATIONPROVIDER";
+
+	protected static String getPreferencePrefix() {
+		return ModelPlugin.getDefault().getBundle().getSymbolicName();
+	}
+
+	private static Preferences getPreferenceStore() {
+		Preferences store = ModelPlugin.getDefault().getPluginPreferences();
+		return store;
+	}
+
+	public static String getPropertyRaw(String item) {
+		Preferences store = getPreferenceStore();
+		return store.getString(item);
+	}
+
+	public static void setProperty(String prefix, String item, String value) {
+		getPreferenceStore().setValue(ModelPlugin.PLUGINID + "." + prefix + "." + item + ".value", value);
+	}
+
+	public static void setProperty(String item, String value) {
+		String prefix = ModelPlugin.PLUGINID + ".";
+		getPreferenceStore().setValue(prefix + item + ".value", value);
+	}
+
+	public static String getProperty(String item) {
+		String prefix = ModelPlugin.PLUGINID + ".";
+		return getPreferenceStore().getString(prefix + item + ".value");
+	}
+
+	public static String getProperty(String prefix, String item) {
+		String pfix = ModelPlugin.PLUGINID + "." + prefix + "." + item + ".value";
+		return getPreferenceStore().getString(pfix);
+	}
+
+	public static boolean isPropertyActive(String item) {
+		String prefix = ModelPlugin.PLUGINID + ".";
+		return getPreferenceStore().getBoolean(prefix + item);
+	}
+
+	public static void setPropertyActive(String item, boolean active) {
+		String prefix = ModelPlugin.PLUGINID + ".";
+		getPreferenceStore().setValue(prefix + item, active);
+	}
+
+	public static void initializeDefaultPreferences(Preferences store) {
+		String prefix = ModelPlugin.PLUGINID + ".";
+		store.setDefault(prefix + ANNOTATIONPROVIDER + ".value", "XDoclet");
+	}
+
+	public void initializeDefaultPreferences() {
+		IEclipsePreferences node = new DefaultScope().getNode(getPreferencePrefix());
+		String prefix = ModelPlugin.PLUGINID + ".";
+		node.put(prefix + ANNOTATIONPROVIDER + ".value", "XDoclet");
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/provider/IAnnotationProvider.java b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/provider/IAnnotationProvider.java
new file mode 100644
index 0000000..8281387
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/provider/IAnnotationProvider.java
@@ -0,0 +1,24 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotation.internal.provider;
+
+/**
+ * @author naci
+ *
+ */
+public interface IAnnotationProvider {
+	
+	public boolean isEjbAnnotationProvider();
+	public boolean isServletAnnotationProvider();
+	public boolean isWebServiceAnnotationProvider();
+	public boolean isValid();
+	public String  getName();
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/provider/IEJBGenerator.java b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/provider/IEJBGenerator.java
new file mode 100644
index 0000000..fe3ffb5
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/provider/IEJBGenerator.java
@@ -0,0 +1,26 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotation.internal.provider;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.model.IContainerManagedEntityBean;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.model.IMessageDrivenBean;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.model.ISessionBean;
+
+/**
+ * @author naci
+ *
+ */
+public interface IEJBGenerator {
+	public void generateSession(ISessionBean bean,IProgressMonitor monitor) throws CoreException,InterruptedException;
+	public void generateMessageDriven(IMessageDrivenBean bean,IProgressMonitor monitor) throws CoreException, InterruptedException;
+	public void generateCMP(IContainerManagedEntityBean bean,IProgressMonitor monitor) throws CoreException, InterruptedException;
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/utility/AnnotationUtilities.java b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/utility/AnnotationUtilities.java
new file mode 100644
index 0000000..07da7ce
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/org/eclipse/jst/j2ee/ejb/annotation/internal/utility/AnnotationUtilities.java
@@ -0,0 +1,94 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotation.internal.utility;
+
+import java.util.ArrayList;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.InvalidRegistryObjectException;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.provider.IAnnotationProvider;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.provider.IEJBGenerator;
+
+/**
+ * @author naci
+ */
+public class AnnotationUtilities {
+
+	public static IConfigurationElement findAnnotationProviderConfigurationByName(String id) {
+
+		IConfigurationElement configurationElement[] = getGeneratorExtensions();
+		for (int i = 0; i < configurationElement.length; i++) {
+			IConfigurationElement element = configurationElement[i];
+			String providerID = element.getAttribute("name");
+			if ("provider".equals(element.getName()) && providerID != null && providerID.equals(id))
+				return element;
+		}
+		return null;
+	}
+
+	public static IAnnotationProvider findAnnotationProviderByName(String id) throws InvalidRegistryObjectException,
+			ClassNotFoundException, InstantiationException, IllegalAccessException {
+
+		IConfigurationElement configurationElement[] = getGeneratorExtensions();
+		for (int i = 0; i < configurationElement.length; i++) {
+			IConfigurationElement element = configurationElement[i];
+			String emitterId = element.getAttribute("name");
+			if ("provider".equals(element.getName()) && emitterId != null && emitterId.equals(id)) {
+				String pluginDescriptor = element.getDeclaringExtension().getContributor().getName();
+
+				org.osgi.framework.Bundle bundle = Platform.getBundle(pluginDescriptor);
+				Class c = bundle.loadClass(element.getAttribute("class"));
+				IAnnotationProvider provider = (IAnnotationProvider) c.newInstance();
+
+				return provider;
+			}
+		}
+		return null;
+	}
+
+	public static IEJBGenerator findEjbGeneratorByName(String id) throws InvalidRegistryObjectException, ClassNotFoundException,
+			InstantiationException, IllegalAccessException {
+
+		IConfigurationElement configurationElement[] = getGeneratorExtensions();
+		for (int i = 0; i < configurationElement.length; i++) {
+			IConfigurationElement element = configurationElement[i];
+			String generatorID = element.getAttribute("name");
+			if ("ejbGenerator".equals(element.getName()) && generatorID != null && generatorID.equals(id)) {
+				String pluginDescriptor = element.getDeclaringExtension().getContributor().getName();
+
+				org.osgi.framework.Bundle bundle = Platform.getBundle(pluginDescriptor);
+				Class c = bundle.loadClass(element.getAttribute("class"));
+				IEJBGenerator provider = (IEJBGenerator) c.newInstance();
+
+				return provider;
+			}
+		}
+		return null;
+	}
+
+	public static IConfigurationElement[] getGeneratorExtensions() {
+		IConfigurationElement[] configurationElements = Platform.getExtensionRegistry().getConfigurationElementsFor(
+				"org.eclipse.jst.j2ee.ejb.annotation.model.ejbGenerator");
+		return configurationElements;
+	}
+
+	public static String[] getProviderNames() {
+		IConfigurationElement configurationElement[] = getGeneratorExtensions();
+		ArrayList names = new ArrayList();
+		for (int i = 0; i < configurationElement.length; i++) {
+			IConfigurationElement element = configurationElement[i];
+			if ("provider".equals(element.getName()))
+				names.add(element.getAttribute("name"));
+		}
+		return (String[]) names.toArray(new String[names.size()]);
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/web_ui.properties b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/web_ui.properties
new file mode 100644
index 0000000..f8cbccd
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotation.model/src/web_ui.properties
@@ -0,0 +1,145 @@
+###############################################################################
+# Copyright (c) 2005 Eteration A.S. 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:
+# Eteration A.S. - initial API and implementation
+###############################################################################
+_0=Failed to find the image "{0}".
+_1=New Ejb
+_2=Ejb version:
+_3=Ejb Project
+_4=Create an EJB Project
+_5=Ejb project:
+_6=Jar file:
+_7=Import a JAR file from the file system
+_8=JAR Import
+_9=JAR Export
+_10=Export Ejb project to the local file system.
+
+ADD_EJB_WIZARD_WINDOW_TITLE=Create EnterpriseJavaBean
+ADD_EJB_WIZARD_PAGE_TITLE=EnterpriseJavaBean
+ADD_EJB_WIZARD_PAGE_DESC=Create an EnterpriseJavaBean
+SELECT_CLASS_TITLE=SELECT_CLASS_TITLE
+NO_EJB_PROJECTS=NO_EJB_PROJECTS
+ERR_TRANSACTION_VALUE=ERR_TRANSACTION_VALUE
+
+ERR_NO_ATTRIBUTES = Entity bean has no attributes
+ERR_DUPLICATE_ATTRIBUTES  = Entity bean has attributes with the same name
+ERR_NO_KEY = Entity bean has no key attributes
+
+ERR_EJB_CLASS_NAME_USED= There is already another EJB with same class name
+ERR_EJB_NAME_EMPTY=You must provide an EJB name;
+ERR_EJB_TYPE_EMPTY=You must provide an EJB type;
+ERR_EJB_TYPE_EXISTS=A java type with this name already exists
+ERR_MUST_ENTER_A_PACKAGE_NAME= EJB must not be in the default package
+ERR_CLASS_NAME_MUSTEND_WITH_BEAN= You must use Bean as a suffix to the class name
+ERR_EJB_NAME_ENDS_WITH_BEAN= You must not use Bean as a suffix to the EJB name
+ERR_DISPLAY_NAME_EMPTY= You must provide a display name for the EJB
+ERR_EJB_DISPLAY_NAME_USED= There is already another EJB with same display name
+ERR_STATELESS_EMPTY= You must provide a state type for the SessionBean
+ERR_STATELESS_VALUE= State value must be one of Stateless or Stateful
+ERR_TRANSACTION_EMPTY= You must provide a transaction type for the EJB
+ERR_JNDI_NAME_VALUE=You must provide a valid jndi name for the EJB
+ERR_JNDI_NAME_EMPTY=You must provide a jndi name for the EJB
+ERR_DESTINATIONTYPE_VALUE=Destination value must be one of Queue or Topic
+ERR_DESTINATIONTYPE_EMPTY=You must provide a destination type
+ERR_EJB_TYPE_VALUE=Ejb type must be one of SessionBean, MessageDrivenBean or EntityBean
+DEFAULT_PACKAGE=(default package)
+EMPTY_LIST_MSG=Empty List
+ADD_LABEL=Add
+
+
+ADD_BUTTON_LABEL=Add...
+REMOVE_BUTTON_LABEL=Remove
+URL_PATTERN_TITLE=URL Patterns
+URL_PATTERN_LABEL=Pattern:
+FOLDER_LABEL=Folder:
+JAVA_PACKAGE_LABEL=Java package:
+CLASS_NAME_LABEL=Class name:
+SUPERCLASS_LABEL=Superclass:
+CONTAINER_SELECTION_DIALOG_TITLE=Container Selection
+CONTAINER_SELECTION_DIALOG_DESC=Choose a Container:
+CONTAINER_SELECTION_DIALOG_VALIDATOR_MESG=Choose the Ejb Jar Folder or its subfolder
+PACKAGE_SELECTION_DIALOG_TITLE=Package Selection
+PACKAGE_SELECTION_DIALOG_DESC=Choose a package:
+PACKAGE_SELECTION_DIALOG_MSG_NONE=No packages to choose from
+SUPERCLASS_SELECTION_DIALOG_TITLE=Superclass Selection
+SUPERCLASS_SELECTION_DIALOG_DESC=Choose a superclass:
+INTERFACE_SELECTION_DIALOG_TITLE=Interface Selection
+INTERFACE_SELECTION_DIALOG_DESC=Choose interfaces:
+INTERFACE_SELECTION_DIALOG_MSG_NONE=''{0}'' added.
+JAVA_CLASS_MODIFIERS_LABEL=Modifiers:
+JAVA_CLASS_PUBLIC_CHECKBOX_LABEL=Public
+JAVA_CLASS_ABSTRACT_CHECKBOX_LABEL=Abstract
+JAVA_CLASS_FINAL_CHECKBOX_LABEL=Final
+JAVA_CLASS_INTERFACES_LABEL=Interfaces:
+JAVA_CLASS_METHOD_STUBS_LABEL=Which method stubs would you like to create?
+JAVA_CLASS_MAIN_CHECKBOX_LABEL=public static void main(String[] args)
+JAVA_CLASS_CONSTRUCTOR_CHECKBOX_LABEL=Constructors from superclass
+JAVA_CLASS_INHERIT_CHECKBOX_LABEL=Inherited abstract methods
+JAVA_CLASS_BROWER_DIALOG_TITLE=Java Class Browser
+JAVA_CLASS_BROWER_DIALOG_MESSAGE=Browse for a Java class
+
+NAME_LABEL=Name
+EJB_NAME_LABEL=&EJB name:
+JNDI_NAME_LABEL=&JNDI name:
+STATELESS_LABEL=&State type:
+TRANSACTION_LABEL=&Transaction type:
+DESTINATION_NAME_LABEL=Destination &JNDI name:
+DESTINATION_LABEL=De&stination:
+DISPLAY_NAME_LABEL=&Display name:
+DESCRIPTION_LABEL=Des&cription:
+VALUE_LABEL=Value
+BROWSE_BUTTON_LABEL=Browse...
+REMOVE_BUTTON=Remove
+
+NEW_JAVA_CLASS_DESTINATION_WIZARD_PAGE_DESC=Specifiy class file destination.
+NEW_JAVA_CLASS_OPTIONS_WIZARD_PAGE_DESC=Specify modifiers, interfaces to implement, and method stubs to generate.
+
+
+NO_WEB_PROJECTS=No EJB Projects
+ENTITY_USECASE_LABEL=&Use case:
+DATASOURCE_NAME_LABEL=Datasource:
+SCHEMA_NAME_LABEL=&Schema:
+
+ADD_EJB_CMPWIZARD_PAGE_DESC=ContainerManagedPersistence Entity Bean Wizard
+ADD_EJB_CMPWIZARD_PAGE_TITLE=CMP Entity Bean
+CMP_FROM_TABLE=Import attributes from table
+CMP_FROM_BEAN=Define new attributes
+ERR_CMP_CONNECTION_SUCCESS=Successfully connected
+ERR_CMP_NO_CONNECTION=There is no connection to database
+ERR_CMP_INVALID_TABLE=Not a valid table name
+ERR_CMP_INVALID_VERSION=Not a valid CMP version
+CMP_CONNECTION_VALUE=Value
+CMP_CONNECTION_PROPERTY=Property
+CMP_CONNECTION_PROPERTIES=&Properties:
+CMP_CONNECTION_AVAILABLE=&Available connection definitions
+CMP_CONNECTION_NEW_BUTTON=Ne&w...
+CMP_CONNECTION_PAGE_DESC=Create a new JDBC connection definition
+CMP_CONNECTION_PAGE_TITLE=New JDBC Connection
+CMP_CONNECTION_RECONNECT_BUTTON=&Reconnect
+CMP_CONNECTION_VALUE_BUTTON=&Value...
+ADD_CMP_TABLE_WIZARD_PAGE_DESC=Define CMP attributes
+ADD_CMP_TABLE_WIZARD_PAGE_TITLE=CMP Attributes
+CMP_TABLE_CHOOSE_TABLE=&Table:
+CANNOT_CONNECT=Cannot connect to database
+CHECK_PROPERTIES=Check JDBC connection properties and password.
+CMP_MANAGED_FIELDS=&Managed attributes
+ATTRIBUTE_NAME=Name
+ATTRIBUTE_COLUMN=Column
+ATTRIBUTE_TYPE=Type
+ATTRIBUTE_JDBCTYPE=JDBC Type
+ATTRIBUTE_SQLTYPE=SQL Type
+ATTRIBUTE_COLUMNSIZE=Size
+ATTRIBUTE_DECIMALDIGITS=Digits
+ATTRIBUTE_READONLY=Read Only
+ATTRIBUTE_ISKEY=Primary Key
+ATTRIBUTE_ADD=&Add...
+ATTRIBUTE_REMOVE=&Remove
+
+ENTITY_VERSION_LABEL=CMP &version:
+
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/.classpath b/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/.classpath
new file mode 100644
index 0000000..304e861
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/.cvsignore b/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/.cvsignore
new file mode 100644
index 0000000..9d920c4
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/.cvsignore
@@ -0,0 +1,7 @@
+bin
+build.xml
+temp.folder
+ejbEmitter.jar
+@dot
+src.zip
+javaCompiler...args
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/.project b/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/.project
new file mode 100644
index 0000000..89e7f17
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.jst.j2ee.ejb.annotations.emitter</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/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/.settings/org.eclipse.jdt.core.prefs b/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..2fc5570
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,54 @@
+#Thu May 10 18:34:25 EDT 2007
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=error
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/META-INF/MANIFEST.MF b/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..375cb22
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/META-INF/MANIFEST.MF
@@ -0,0 +1,26 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name.0
+Bundle-SymbolicName: org.eclipse.jst.j2ee.ejb.annotations.emitter; singleton:=true
+Bundle-Version: 1.1.300.qualifier
+Bundle-ClassPath: .
+Bundle-Activator: org.eclipse.jst.j2ee.ejb.annotations.internal.emitter.EjbEmitterPlugin
+Bundle-Vendor: %Bundle-Vendor.0
+Bundle-Localization: plugin
+Export-Package: org.eclipse.jst.j2ee.ejb.annotations.internal.classgen;x-internal:=true,
+ org.eclipse.jst.j2ee.ejb.annotations.internal.emitter;x-internal:=true
+Require-Bundle: org.eclipse.ui;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.core.resources;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.emf.codegen;bundle-version="[2.2.0,3.0.0)",
+ org.eclipse.jdt.core;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.jdt.ui;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.jst.j2ee.core;bundle-version="[1.1.0,2.0.0)",
+ org.eclipse.text;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.jst.j2ee;bundle-version="[1.1.0,1.3.0)",
+ org.eclipse.jst.j2ee.ejb.annotation.model;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.jem.util;bundle-version="[2.0.0,3.0.0)",
+ org.eclipse.wst.common.core;bundle-version="[1.1.0,2.0.0)",
+ org.eclipse.wst.common.frameworks;bundle-version="[1.1.0,2.0.0)"
+Eclipse-LazyStart: true
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/plugins/org.eclipse.wst.web.ui/about.html b/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/about.html
similarity index 100%
copy from plugins/org.eclipse.wst.web.ui/about.html
copy to plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/about.html
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/build.properties b/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/build.properties
new file mode 100644
index 0000000..e460338
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/build.properties
@@ -0,0 +1,7 @@
+bin.includes = plugin.xml,\
+               .,\
+               META-INF/,\
+               about.html,\
+               plugin.properties
+src.includes = schema/
+source.. = src/
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/plugin.properties b/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/plugin.properties
new file mode 100644
index 0000000..3bb5888
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/plugin.properties
@@ -0,0 +1,3 @@
+# properties file for org.eclipse.jst.j2ee.ejb.annotations.emitter
+Bundle-Name.0 = EJB Emitter Plug-in
+Bundle-Vendor.0 = Eclipse Web Tools Platform
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/plugin.xml b/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/plugin.xml
new file mode 100644
index 0000000..775d6d4
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/plugin.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+
+     <extension-point id="template" name="template" schema="schema/emitter.exsd"/>
+
+</plugin>
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/pom.xml b/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/pom.xml
new file mode 100644
index 0000000..1d4bf46
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/pom.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Copyright (c) 2012, 2013 Eclipse Foundation and others.
+  All rights reserved. This program and the accompanying materials
+  are made available under the terms of the Eclipse Distribution License v1.0
+  which accompanies this distribution, and is available at
+  http://www.eclipse.org/org/documents/edl-v10.php
+ 
+  Contributors:
+    Thanh Ha (Eclipse Foundation) - initial implementation
+-->
+
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.eclipse.webtools.javaee</groupId>
+    <artifactId>javaee.plugins</artifactId>
+    <version>3.6.0-SNAPSHOT</version>
+  </parent>
+
+  <groupId>org.eclipse.webtools.ejb</groupId>
+  <artifactId>org.eclipse.jst.j2ee.ejb.annotations.emitter</artifactId>
+  <version>1.1.300-SNAPSHOT</version>
+  <packaging>eclipse-plugin</packaging>
+</project>
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/schema/emitter.exsd b/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/schema/emitter.exsd
new file mode 100644
index 0000000..a93b085
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/schema/emitter.exsd
@@ -0,0 +1,163 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.jst.j2ee.ejb.annotations.emitter">
+<annotation>
+      <appInfo>
+         <meta.schema plugin="org.eclipse.jst.j2ee.ejb.annotations.emitter" id="provider" name="Provider"/>
+      </appInfo>
+      <documentation>
+         This extension point allows clients to provide their own templates for annotation based code generation using the EJB code generation framework. This extension point provides a framework to define &quot;Provider-Generator&quot; sets that use EMF JET (Java Emitter Templates) to annotate Java code.
+      </documentation>
+   </annotation>
+
+   <element name="extension">
+      <complexType>
+         <sequence>
+            <element ref="emitter"/>
+         </sequence>
+         <attribute name="point" type="string" use="required">
+            <annotation>
+               <documentation>
+                  a fully qualified identifier of the target extension point
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string">
+            <annotation>
+               <documentation>
+                  an optional identifier of the extension instance
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="name" type="string">
+            <annotation>
+               <documentation>
+                  an optional name of the extension instance
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="emitter">
+      <complexType>
+         <attribute name="name" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="classpathProvider" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="builderId" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="ejbIntrospector" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="mergeController" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="sessionTemplates" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="entityTemplates" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="messageTemplates" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="since"/>
+      </appInfo>
+      <documentation>
+         &lt;b&gt;This extension point is part of an interim API that is still under development and expected to change significantly before reaching stability. It is being made available at this early stage to solicit feedback from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken (repeatedly) as the API evolves.&lt;/b&gt;
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="examples"/>
+      </appInfo>
+      <documentation>
+         &lt;pre&gt;
+   &lt;extension
+         point=&quot;org.eclipse.jst.j2ee.ejb.annotations.emitter.provider&quot;&gt;
+      &lt;emitter 
+            name=&quot;xdoclet&quot;
+            classpathProvider=&quot;org.emitter.path.MyEmitterClasspathPorvider&quot;
+            builderId=&quot;org.emitter.path.MyEmitterBuilder&quot;
+            sessionTemplates=&quot;templates/ejb/session&quot;
+            entityTemplates=&quot;templates/ejb/entity&quot;
+            messageTemplates=&quot;templates/ejb/message&quot;/&gt;
+   &lt;/extension&gt;
+&lt;/pre&gt;
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="apiInfo"/>
+      </appInfo>
+      <documentation>
+         
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="implementation"/>
+      </appInfo>
+      <documentation>
+         WTP org.eclipse.jst.j2ee.ejb.annotations.xdoclet plugin uses this extension point to provide XDoclet templates.
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="copyright"/>
+      </appInfo>
+      <documentation>
+         Copyright (c) 2005 Eteration A.S. and others.&lt;br&gt;
+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 &lt;a
+href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
+      </documentation>
+   </annotation>
+
+</schema>
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/src/org/eclipse/jst/j2ee/ejb/annotations/internal/classgen/EjbBuilder.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/src/org/eclipse/jst/j2ee/ejb/annotations/internal/classgen/EjbBuilder.java
new file mode 100644
index 0000000..0601eba
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/src/org/eclipse/jst/j2ee/ejb/annotations/internal/classgen/EjbBuilder.java
@@ -0,0 +1,627 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotations.internal.classgen;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.core.resources.IWorkspaceRunnable;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.jdt.core.IBuffer;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.IMethod;
+import org.eclipse.jdt.core.IPackageFragment;
+import org.eclipse.jdt.core.IPackageFragmentRoot;
+import org.eclipse.jdt.core.ISourceRange;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.core.ToolFactory;
+import org.eclipse.jdt.core.compiler.IProblem;
+import org.eclipse.jdt.core.dom.AST;
+import org.eclipse.jdt.core.dom.ASTNode;
+import org.eclipse.jdt.core.dom.ASTParser;
+import org.eclipse.jdt.core.dom.ASTVisitor;
+import org.eclipse.jdt.core.dom.AbstractTypeDeclaration;
+import org.eclipse.jdt.core.dom.CompilationUnit;
+import org.eclipse.jdt.core.dom.ITypeBinding;
+import org.eclipse.jdt.core.dom.Javadoc;
+import org.eclipse.jdt.core.dom.MethodDeclaration;
+import org.eclipse.jdt.core.dom.Modifier;
+import org.eclipse.jdt.core.dom.PackageDeclaration;
+import org.eclipse.jdt.core.dom.SimpleName;
+import org.eclipse.jdt.core.dom.SimpleType;
+import org.eclipse.jdt.core.dom.TypeDeclaration;
+import org.eclipse.jdt.core.dom.rewrite.ImportRewrite;
+import org.eclipse.jdt.core.formatter.CodeFormatter;
+import org.eclipse.jdt.ui.CodeGeneration;
+import org.eclipse.jdt.ui.CodeStyleConfiguration;
+import org.eclipse.jdt.ui.actions.AddUnimplementedConstructorsAction;
+import org.eclipse.jdt.ui.actions.OverrideMethodsAction;
+import org.eclipse.jface.text.Document;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.text.edits.TextEdit;
+
+public class EjbBuilder {
+
+	protected IProgressMonitor monitor;
+
+	protected IPackageFragmentRoot packageFragmentRoot;
+
+	protected String packageName = "";
+
+	protected String typeName = "";
+
+	protected String typeStub;
+
+	protected String typeComment;
+
+	protected String methodStub;
+
+	protected String fields;
+
+	protected boolean createInheritedMethods;
+
+	protected boolean createInheritedConstructors;
+
+	protected IConfigurationElement configurationElement;
+
+	IType fCreatedType;
+
+	public EjbBuilder() {
+		super();
+	}
+
+	/**
+	 * Creates the new type using the entered field values.
+	 * 
+	 * @param monitor
+	 *            a progress monitor to report progress.
+	 */
+	public void createType() throws CoreException, InterruptedException {
+		monitor = getMonitor();
+
+		monitor.beginTask("Creating a new type", 10);
+
+		ICompilationUnit createdWorkingCopy = null;
+		try {
+			IPackageFragmentRoot root = getPackageFragmentRoot(); // Current
+			// source
+			// folder
+			IPackageFragment pack = root.createPackageFragment(this.packageName, true, monitor); // Package
+			// that
+			// contains
+			// the class
+			monitor.worked(1);
+
+			String clName = this.typeName;
+
+			IType createdType;
+			int indent = 0;
+
+			String lineDelimiter = null;
+			lineDelimiter = System.getProperty("line.separator", "\n"); //$NON-NLS-1$ //$NON-NLS-2$
+
+			ICompilationUnit parentCU = pack.getCompilationUnit(clName + ".java");
+			if (!parentCU.exists())
+				parentCU = pack.createCompilationUnit(clName + ".java", "", false, new SubProgressMonitor(monitor, 2)); //$NON-NLS-1$ //$NON-NLS-2$
+
+			// create a working copy with a new owner
+			createdWorkingCopy = parentCU.getWorkingCopy(null);
+
+			// use the compiler template a first time to read the imports
+			String content = CodeGeneration.getCompilationUnitContent(createdWorkingCopy, null, "", lineDelimiter); //$NON-NLS-1$
+			if (content != null) {
+				createdWorkingCopy.getBuffer().setContents(content);
+			}
+
+			String cuContent = content + lineDelimiter + typeComment + lineDelimiter + typeStub;
+			createdWorkingCopy.getBuffer().setContents(cuContent);
+			createdType = createdWorkingCopy.getType(clName);
+
+			// add imports for superclass/interfaces, so types can be resolved
+			// correctly
+			ICompilationUnit cu = createdType.getCompilationUnit();
+
+			cu.reconcile(ICompilationUnit.NO_AST, false, null, null);
+
+			// add imports
+			createTypeMembers(createdType, null, new SubProgressMonitor(monitor, 1));
+
+			if (isCreateInheritedMethods())
+				createInheritedMethods(cu, createdType, new SubProgressMonitor(monitor, 1));
+			if(isCreateInheritedConstructors())
+				createInheritedConstructors(cu, createdType, new SubProgressMonitor(monitor, 1));
+			
+			cu.reconcile(ICompilationUnit.NO_AST, false, null, null);
+
+			ISourceRange range = createdType.getSourceRange();
+
+			IBuffer buf = cu.getBuffer();
+			String originalContent = buf.getText(range.getOffset(), range.getLength());
+			CodeFormatter codeFormatter = ToolFactory.createCodeFormatter(JavaCore.getOptions());
+			TextEdit textEdit = codeFormatter.format(CodeFormatter.K_CLASS_BODY_DECLARATIONS, originalContent, 0, originalContent
+					.length(), indent, lineDelimiter);
+			IDocument document = new Document(originalContent);
+			try {
+				textEdit.apply(document);
+			} catch (Exception e) {
+			}
+			String formattedContent = document.get();
+
+			buf.replace(range.getOffset(), range.getLength(), formattedContent);
+			cu.getBuffer().setContents(buf.getContents());
+			cu.commitWorkingCopy(false, new SubProgressMonitor(monitor, 1));
+
+			fCreatedType = (IType) createdType.getPrimaryElement();
+
+		} finally {
+			if (createdWorkingCopy != null) {
+				createdWorkingCopy.discardWorkingCopy();
+			}
+			monitor.done();
+		}
+	}
+
+	/**
+	 * @param createdType
+	 * @param imports
+	 * @param monitor2
+	 */
+	private void createTypeMembers(IType createdType, ImportsManager imports, SubProgressMonitor monitor2) throws JavaModelException {
+		if (fields != null && fields.length() > 0)
+			createdType.createField(fields, null, false, this.getMonitor());
+		if (methodStub != null && methodStub.length() > 0)
+			createdType.createMethod(methodStub, null, false, this.getMonitor());
+	}
+
+	/**
+	 * Creates the bodies of all unimplemented methods and constructors and adds
+	 * them to the type. Method is typically called by implementers of
+	 * <code>NewTypeWizardPage</code> to add needed method and constructors.
+	 * 
+	 * @param type
+	 *            the type for which the new methods and constructor are to be
+	 *            created
+	 * @param doConstructors
+	 *            if <code>true</code> unimplemented constructors are created
+	 * @param doUnimplementedMethods
+	 *            if <code>true</code> unimplemented methods are created
+	 * @param imports
+	 *            an import manager to add all needed import statements
+	 * @param monitor
+	 *            a progress monitor to report progress
+	 * @return the created methods.
+	 * @throws CoreException
+	 *             thrown when the creation fails.
+	 */
+	protected IMethod[] createInheritedMethods(ICompilationUnit cu, IType type, IProgressMonitor monitor) throws CoreException {
+		cu.reconcile(ICompilationUnit.NO_AST, false, null, null);
+		Set handleIds = getHandleIds(type);
+		ASTParser parser = ASTParser.newParser(AST.JLS3);
+		parser.setResolveBindings(true);
+		parser.setSource(cu);
+		CompilationUnit unit = (CompilationUnit) parser.createAST(new SubProgressMonitor(monitor, 1));
+		ITypeBinding binding = getBinding(type, unit);
+
+		if (binding != null) {
+			IWorkspaceRunnable operation = OverrideMethodsAction.createRunnable(unit, binding, null, -1, true);
+			operation.run(monitor);
+			cu.reconcile(ICompilationUnit.NO_AST, false, null, null);
+			cu.commitWorkingCopy(false, monitor);
+		}
+
+		return getTypeMethods(type, handleIds);
+	}
+
+	protected IMethod[] createInheritedConstructors(ICompilationUnit cu, IType type, IProgressMonitor monitor) throws CoreException {
+		cu.reconcile(ICompilationUnit.NO_AST, false, null, null);
+		Set handleIds = getHandleIds(type);
+		ASTParser parser = ASTParser.newParser(AST.JLS3);
+		parser.setResolveBindings(true);
+		parser.setSource(cu);
+		CompilationUnit unit = (CompilationUnit) parser.createAST(new SubProgressMonitor(monitor, 1));
+		ITypeBinding binding = getBinding(type, unit);
+
+		if (binding != null) {
+			IWorkspaceRunnable operation = AddUnimplementedConstructorsAction.createRunnable(unit, binding, null, -1, true,
+					Modifier.PUBLIC, true);
+			operation.run(monitor);
+			cu.commitWorkingCopy(false, monitor);
+		}
+
+		return getTypeMethods(type, handleIds);
+	}
+
+	private ITypeBinding getBinding(IType type, CompilationUnit unit) throws JavaModelException {
+		ITypeBinding binding = null;
+		ASTNode node = NodeFinder.perform(unit, type.getNameRange());
+		do {
+			node = node.getParent();
+		} while (node != null && !AbstractTypeDeclaration.class.isInstance(node));
+
+		AbstractTypeDeclaration declaration = (AbstractTypeDeclaration) node;
+
+		if (declaration != null)
+			binding = declaration.resolveBinding();
+		return binding;
+	}
+
+	private Set getHandleIds(IType type) throws JavaModelException {
+		Set handleIds;
+		IMethod[] typeMethods = type.getMethods();
+		handleIds = new HashSet(typeMethods.length);
+		for (int index = 0; index < typeMethods.length; index++)
+			handleIds.add(typeMethods[index].getHandleIdentifier());
+		return handleIds;
+	}
+
+	private IMethod[] getTypeMethods(IType type, Set handleIds) throws JavaModelException {
+		ArrayList newMethods = new ArrayList();
+		IMethod[] typeMethods;
+		typeMethods = type.getMethods();
+		for (int index = 0; index < typeMethods.length; index++)
+			if (!handleIds.contains(typeMethods[index].getHandleIdentifier()))
+				newMethods.add(typeMethods[index]);
+		IMethod[] methods = new IMethod[newMethods.size()];
+		newMethods.toArray(methods);
+		return methods;
+	}
+
+	protected void createImports(ImportsManager imports, String[] createdImports) {
+		for (int index = 0; index < createdImports.length; index++)
+			imports.addImport(createdImports[index]);
+	}
+
+	/**
+	 * @return
+	 */
+	private IPackageFragmentRoot getPackageFragmentRoot() {
+		return packageFragmentRoot;
+	}
+
+	protected boolean removeUnused(ICompilationUnit cu, ImportsManager imports) {
+		ASTParser parser = ASTParser.newParser(AST.JLS3);
+		parser.setSource(cu);
+		parser.setResolveBindings(true);
+		CompilationUnit root = (CompilationUnit) parser.createAST(null);
+		IProblem[] problems = root.getProblems();
+		boolean importRemoved = false;
+		for (int i = 0; i < problems.length; i++) {
+			if (problems[i].getID() == IProblem.UnusedImport) {
+				String imp = problems[i].getArguments()[0];
+				imports.removeImport(imp);
+				importRemoved = true;
+			}
+		}
+		return importRemoved;
+	}
+
+	/**
+	 * @return Returns the monitor.
+	 */
+	public IProgressMonitor getMonitor() {
+		if (monitor == null) {
+			monitor = new NullProgressMonitor();
+		}
+		return monitor;
+	}
+
+	/**
+	 * @param monitor
+	 *            The monitor to set.
+	 */
+	public void setMonitor(IProgressMonitor monitor) {
+		this.monitor = monitor;
+	}
+
+	public static class ImportsManager {
+
+		private ImportRewrite fImportsStructure;
+
+		private HashSet fAddedTypes;
+
+		ImportsManager(ICompilationUnit createdWorkingCopy) throws CoreException {
+			fAddedTypes = new HashSet();
+			fImportsStructure = CodeStyleConfiguration.createImportRewrite(createdWorkingCopy, true);
+		}
+
+		/* package */ImportRewrite getImportsStructure() {
+			return fImportsStructure;
+		}
+
+		public String addImport(String qualifiedTypeName) {
+			fAddedTypes.add(qualifiedTypeName);
+			return fImportsStructure.addImport(qualifiedTypeName);
+		}
+
+		void create(ICompilationUnit cu, boolean toRestore) throws CoreException {
+			ImportRewrite.create(cu, toRestore);
+			TextEdit edit = fImportsStructure.rewriteImports(new NullProgressMonitor());
+			IDocument document = new Document(cu.getSource());
+			try {
+				edit.apply(document);
+			} catch (Exception e) {
+			}
+			String imports = document.get();
+			cu.getBuffer().setContents(imports);
+			cu.commitWorkingCopy(false, new NullProgressMonitor());
+		}
+
+		void removeImport(String qualifiedName) {
+			if (fAddedTypes.contains(qualifiedName)) {
+				fImportsStructure.removeImport(qualifiedName);
+			}
+		}
+
+	}
+
+	/**
+	 * @return Returns the fCreatedType.
+	 */
+	public IType getCreatedType() {
+		return fCreatedType;
+	}
+
+	/**
+	 * @param createdType
+	 *            The fCreatedType to set.
+	 */
+	public void setCreatedType(IType createdType) {
+		fCreatedType = createdType;
+	}
+
+	/**
+	 * @return Returns the methodStub.
+	 */
+	public String getMethodStub() {
+		return methodStub;
+	}
+
+	/**
+	 * @param methodStub
+	 *            The methodStub to set.
+	 */
+	public void setMethodStub(String methodStub) {
+		this.methodStub = methodStub;
+	}
+
+	/**
+	 * @return Returns the packageName.
+	 */
+	public String getPackageName() {
+		return packageName;
+	}
+
+	/**
+	 * @param packageName
+	 *            The packageName to set.
+	 */
+	public void setPackageName(String packageName) {
+		this.packageName = packageName;
+	}
+
+	/**
+	 * @return Returns the typeComment.
+	 */
+	public String getTypeComment() {
+		return typeComment;
+	}
+
+	/**
+	 * @param typeComment
+	 *            The typeComment to set.
+	 */
+	public void setTypeComment(String typeComment) {
+		this.typeComment = typeComment;
+	}
+
+	/**
+	 * @return Returns the typeName.
+	 */
+	public String getTypeName() {
+		return typeName;
+	}
+
+	/**
+	 * @param typeName
+	 *            The typeName to set.
+	 */
+	public void setTypeName(String typeName) {
+		this.typeName = typeName;
+	}
+
+	/**
+	 * @return Returns the typeStub.
+	 */
+	public String getTypeStub() {
+		return typeStub;
+	}
+
+	/**
+	 * @param typeStub
+	 *            The typeStub to set.
+	 */
+	public void setTypeStub(String typeStub) {
+		this.typeStub = typeStub;
+	}
+
+	/**
+	 * @param packageFragmentRoot
+	 *            The packageFragmentRoot to set.
+	 */
+	public void setPackageFragmentRoot(IPackageFragmentRoot packageFragmentRoot) {
+		this.packageFragmentRoot = packageFragmentRoot;
+	}
+
+	/**
+	 * @return Returns the fields.
+	 */
+	public String getFields() {
+		return fields;
+	}
+
+	/**
+	 * @param fields
+	 *            The fields to set.
+	 */
+	public void setFields(String fields) {
+		this.fields = fields;
+	}
+
+	/**
+	 * @return Returns the configurationElement.
+	 */
+	public IConfigurationElement getConfigurationElement() {
+		return configurationElement;
+	}
+
+	/**
+	 * @param configurationElement
+	 *            The configurationElement to set.
+	 */
+	public void setConfigurationElement(IConfigurationElement configurationElement) {
+		this.configurationElement = configurationElement;
+	}
+
+	public boolean isCreateInheritedConstructors() {
+		return createInheritedConstructors;
+	}
+
+	public void setCreateInheritedConstructors(boolean createInheritedConstructors) {
+		this.createInheritedConstructors = createInheritedConstructors;
+	}
+
+	public boolean isCreateInheritedMethods() {
+		return createInheritedMethods;
+	}
+
+	public void setCreateInheritedMethods(boolean createInheritedMethods) {
+		this.createInheritedMethods = createInheritedMethods;
+	}
+
+	public static class NodeFinder extends ASTVisitor {
+
+		public static ASTNode perform(ASTNode root, int start, int length) {
+			NodeFinder finder = new NodeFinder(start, length);
+			root.accept(finder);
+			ASTNode result = finder.getCoveredNode();
+			if (result == null || result.getStartPosition() != start || result.getLength() != length) {
+				return finder.getCoveringNode();
+			}
+			return result;
+		}
+
+		public static ASTNode perform(ASTNode root, ISourceRange range) {
+			return perform(root, range.getOffset(), range.getLength());
+		}
+
+		private int fStart;
+
+		private int fEnd;
+
+		private ASTNode fCoveringNode;
+
+		private ASTNode fCoveredNode;
+
+		public NodeFinder(int offset, int length) {
+			super(true); // include Javadoc tags
+			fStart = offset;
+			fEnd = offset + length;
+		}
+
+		protected boolean visitNode(ASTNode node) {
+			int nodeStart = node.getStartPosition();
+			int nodeEnd = nodeStart + node.getLength();
+			if (nodeEnd < fStart || fEnd < nodeStart) {
+				return false;
+			}
+			if (nodeStart <= fStart && fEnd <= nodeEnd) {
+				fCoveringNode = node;
+			}
+			if (fStart <= nodeStart && nodeEnd <= fEnd) {
+				if (fCoveringNode == node) { // nodeStart == fStart &&
+					// nodeEnd == fEnd
+					fCoveredNode = node;
+					return true; // look further for node with same length as
+					// parent
+				} else if (fCoveredNode == null) { // no better found
+					fCoveredNode = node;
+				}
+				return false;
+			}
+			return true;
+		}
+
+		public boolean visit(CompilationUnit node) {
+			return visitNode(node);
+		}
+
+		public boolean visit(PackageDeclaration node) {
+			return visitNode(node);
+		}
+
+		public boolean visit(TypeDeclaration node) {
+			return visitNode(node);
+		}
+
+		public boolean visit(Javadoc node) {
+			if (super.visit(node))
+				return visitNode(node);
+			else
+				return false;
+		}
+
+		public boolean visit(Modifier node) {
+			return visitNode(node);
+		}
+
+		public boolean visit(SimpleName node) {
+			return visitNode(node);
+		}
+
+		public boolean visit(SimpleType node) {
+			return visitNode(node);
+		}
+
+		public boolean visit(MethodDeclaration node) {
+			return visitNode(node);
+		}
+
+		/**
+		 * Returns the covered node. If more than one nodes are covered by the
+		 * selection, the returned node is first covered node found in a
+		 * top-down traversal of the AST
+		 * 
+		 * @return ASTNode
+		 */
+		public ASTNode getCoveredNode() {
+			return fCoveredNode;
+		}
+
+		/**
+		 * Returns the covering node. If more than one nodes are covering the
+		 * selection, the returned node is last covering node found in a
+		 * top-down traversal of the AST
+		 * 
+		 * @return ASTNode
+		 */
+		public ASTNode getCoveringNode() {
+			return fCoveringNode;
+		}
+
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/src/org/eclipse/jst/j2ee/ejb/annotations/internal/emitter/DefaultClasspathProvider.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/src/org/eclipse/jst/j2ee/ejb/annotations/internal/emitter/DefaultClasspathProvider.java
new file mode 100644
index 0000000..5cd6629
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/src/org/eclipse/jst/j2ee/ejb/annotations/internal/emitter/DefaultClasspathProvider.java
@@ -0,0 +1,42 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+
+package org.eclipse.jst.j2ee.ejb.annotations.internal.emitter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author naci
+ *
+ * TODO To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+public class DefaultClasspathProvider implements IEmitterClasspathProvider {
+	
+	protected ArrayList list = null;
+	public DefaultClasspathProvider() {
+		super();
+		list = new ArrayList();
+	}
+
+	
+	public List getClasspathItems() {
+		list.clear();
+		list.add("org.eclipse.emf.ecore");
+		list.add("org.eclipse.emf.ecore.xmi");
+		list.add("org.eclipse.emf.common");
+		list.add("org.eclipse.jst.j2ee");	
+		list.add("org.eclipse.jst.j2ee.core");	
+		list.add("org.eclipse.jst.j2ee.ejb.annotation.model");	
+		list.add("org.eclipse.jst.j2ee.ejb.annotations.emitter");	
+		return list;
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/src/org/eclipse/jst/j2ee/ejb/annotations/internal/emitter/DefaultEjbIntrospector.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/src/org/eclipse/jst/j2ee/ejb/annotations/internal/emitter/DefaultEjbIntrospector.java
new file mode 100644
index 0000000..0f699f5
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/src/org/eclipse/jst/j2ee/ejb/annotations/internal/emitter/DefaultEjbIntrospector.java
@@ -0,0 +1,79 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotations.internal.emitter;
+
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jst.j2ee.ejb.EnterpriseBean;
+
+
+/**
+ * @author naci
+ *
+ * TODO To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+public abstract class DefaultEjbIntrospector implements IEjbIntrospector {
+	
+	
+	
+	public abstract EnterpriseBean getEnterpriseBean();
+
+	protected boolean isEntityBean(ICompilationUnit unit) {
+	
+		try {
+			IType type = unit.findPrimaryType();
+			String[] inter = type.getSuperInterfaceNames();
+			for (int i = 0; i < inter.length; i++) {
+				if (inter[i].endsWith("EntityBean")) {
+					return true;
+				}
+			}
+		} catch (JavaModelException e) {
+		}
+		return false;
+	}
+
+	protected boolean isMDBBean(ICompilationUnit unit) {
+	
+		try {
+			IType type = unit.findPrimaryType();
+			String[] inter = type.getSuperInterfaceNames();
+			for (int i = 0; i < inter.length; i++) {
+				if (inter[i].endsWith("MessageDrivenBean")) {
+					return true;
+				}
+			}
+		} catch (JavaModelException e) {
+		}
+		return false;
+	}
+
+	/**
+	 * @return
+	 */
+	protected boolean isSessionBean(ICompilationUnit unit) {
+	
+		try {
+			IType type = unit.findPrimaryType();
+			String[] inter = type.getSuperInterfaceNames();
+			for (int i = 0; i < inter.length; i++) {
+				if (inter[i].endsWith("SessionBean")) {
+					return true;
+				}
+			}
+		} catch (JavaModelException e) {
+		}
+		return false;
+	}
+	
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/src/org/eclipse/jst/j2ee/ejb/annotations/internal/emitter/EjbEmitter.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/src/org/eclipse/jst/j2ee/ejb/annotations/internal/emitter/EjbEmitter.java
new file mode 100644
index 0000000..2871d60
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/src/org/eclipse/jst/j2ee/ejb/annotations/internal/emitter/EjbEmitter.java
@@ -0,0 +1,151 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotations.internal.emitter;
+
+import java.util.Iterator;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.emf.codegen.jet.JETException;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.model.IEnterpriseBean;
+import org.eclipse.jst.j2ee.internal.project.WTPJETEmitter;
+
+public abstract class EjbEmitter {
+	public static final String CLASSPATHPROVIDER = "classpathProvider";
+
+	public static final String JAVACLASSPATHVARIABLEPREFIX = "WTPEJBEMITTER";
+
+	public static final String EJBEMITTERPROJECT = ".WtpEjbEmitter";
+
+	protected IConfigurationElement emitterConfig;
+
+	protected IEmitterClasspathProvider classpathProvider;
+
+	protected String base;
+
+	protected IProgressMonitor monitor;
+
+	public EjbEmitter(IConfigurationElement emitterConfig) throws ClassNotFoundException, InstantiationException,
+			IllegalAccessException, CoreException {
+		this.emitterConfig = emitterConfig;
+		String pluginDescriptor = emitterConfig.getDeclaringExtension().getContributor().getName();
+
+		org.osgi.framework.Bundle bundle = Platform.getBundle(pluginDescriptor);
+		Class c = bundle.loadClass(emitterConfig.getAttribute(CLASSPATHPROVIDER));
+		classpathProvider = (IEmitterClasspathProvider) c.newInstance();
+		base = bundle.getEntry("/").toString();
+		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(EJBEMITTERPROJECT);
+		IProgressMonitor monitor = new NullProgressMonitor();
+		project.delete(true, true, monitor);
+	}
+
+	public abstract String emitTypeComment(IEnterpriseBean enterpriseBean) throws ClassNotFoundException, InstantiationException,
+			IllegalAccessException, CoreException;
+
+	public abstract String emitTypeStub(IEnterpriseBean enterpriseBean) throws ClassNotFoundException, InstantiationException,
+			IllegalAccessException, CoreException;
+
+	public abstract String emitInterfaceMethods(IEnterpriseBean enterpriseBean) throws ClassNotFoundException, InstantiationException,
+			IllegalAccessException, CoreException;
+
+	public abstract String emitFields(IEnterpriseBean enterpriseBean) throws ClassNotFoundException, InstantiationException,
+			IllegalAccessException, CoreException;
+
+	/**
+	 * @param uri
+	 * @return
+	 * @throws JETException
+	 */
+	protected WTPJETEmitter createJetEmitter(String uri) throws JETException {
+		WTPJETEmitter emitter = new WTPJETEmitter(uri, this.getClass().getClassLoader());
+		emitter.setProjectName(WTPJETEmitter.PROJECT_NAME);
+		emitter.setIntelligentLinkingEnabled(true);
+		Iterator iterator = classpathProvider.getClasspathItems().iterator();
+		int count = 0;
+		while (iterator.hasNext()) {
+			String cpItem = (String) iterator.next();
+			emitter.addVariable(JAVACLASSPATHVARIABLEPREFIX + count++, cpItem);
+		}
+		return emitter;
+	}
+
+	public String generate(String templatesBase, String template, IEnterpriseBean enterpriseBean) throws CoreException {
+		String uri = base + templatesBase + template;
+		String result = "";
+		IProgressMonitor aMonitor = this.getMonitor();
+		try {
+			WTPJETEmitter emitter = createJetEmitter(uri);
+			result = emitter.generate(aMonitor, new Object[] { enterpriseBean });
+		} catch (JETException e) {
+			throw new CoreException(e.getStatus());
+		}
+		return result;
+	}
+
+	/**
+	 * @return Returns the monitor.
+	 */
+	public IProgressMonitor getMonitor() {
+		if (monitor == null) {
+			monitor = new IProgressMonitor() {
+				private boolean cancelled = false;
+
+				public void beginTask(String name, int totalWork) {
+					System.out.println(this.getClass() + " Progress (" + totalWork + "): " + name);
+				}
+
+				public void done() {
+				}
+
+				public void internalWorked(double work) {
+				}
+
+				public boolean isCanceled() {
+					return cancelled;
+				}
+
+				public void setCanceled(boolean value) {
+					cancelled = value;
+				}
+
+				public void setTaskName(String name) {
+					System.out.println(this.getClass() + " Progress Task(" + name + "): ");
+				}
+
+				public void subTask(String name) {
+					System.out.println(this.getClass() + " Progress SubTask(" + name + "): ");
+				}
+
+				public void worked(int work) {
+				}
+			};
+		}
+		return monitor;
+	}
+
+	/**
+	 * @param monitor
+	 *            The monitor to set.
+	 */
+	public void setMonitor(IProgressMonitor monitor) {
+		this.monitor = monitor;
+	}
+
+	public void deleteProject() throws CoreException {
+		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(EJBEMITTERPROJECT);
+		IProgressMonitor monitor = new NullProgressMonitor();
+		project.delete(true, true, monitor);
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/src/org/eclipse/jst/j2ee/ejb/annotations/internal/emitter/EjbEmitterPlugin.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/src/org/eclipse/jst/j2ee/ejb/annotations/internal/emitter/EjbEmitterPlugin.java
new file mode 100644
index 0000000..c5ebb76
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/src/org/eclipse/jst/j2ee/ejb/annotations/internal/emitter/EjbEmitterPlugin.java
@@ -0,0 +1,81 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotations.internal.emitter;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+
+public class EjbEmitterPlugin extends AbstractUIPlugin {
+	//The shared instance.
+	private static EjbEmitterPlugin plugin;
+	//Resource bundle.
+	private ResourceBundle resourceBundle;
+	
+	/**
+	 * The constructor.
+	 */
+	public EjbEmitterPlugin() {
+		super();
+		plugin = this;
+	}
+
+	/**
+	 * This method is called upon plug-in activation
+	 */
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+	}
+
+	/**
+	 * This method is called when the plug-in is stopped
+	 */
+	public void stop(BundleContext context) throws Exception {
+		super.stop(context);
+		plugin = null;
+		resourceBundle = null;
+	}
+
+	/**
+	 * Returns the shared instance.
+	 */
+	public static EjbEmitterPlugin getDefault() {
+		return plugin;
+	}
+
+	/**
+	 * Returns the string from the plugin's resource bundle,
+	 * or 'key' if not found.
+	 */
+	public static String getResourceString(String key) {
+		ResourceBundle bundle = EjbEmitterPlugin.getDefault().getResourceBundle();
+		try {
+			return (bundle != null) ? bundle.getString(key) : key;
+		} catch (MissingResourceException e) {
+			return key;
+		}
+	}
+
+	/**
+	 * Returns the plugin's resource bundle,
+	 */
+	public ResourceBundle getResourceBundle() {
+		try {
+			if (resourceBundle == null)
+				resourceBundle = ResourceBundle.getBundle("org.eclipse.jst.j2ee.ejb.annotations.internal.emitter.model.emitter.EjbEmitterPluginResources");
+		} catch (MissingResourceException x) {
+			resourceBundle = null;
+		}
+		return resourceBundle;
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/src/org/eclipse/jst/j2ee/ejb/annotations/internal/emitter/EmitterUtilities.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/src/org/eclipse/jst/j2ee/ejb/annotations/internal/emitter/EmitterUtilities.java
new file mode 100644
index 0000000..03db733
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/src/org/eclipse/jst/j2ee/ejb/annotations/internal/emitter/EmitterUtilities.java
@@ -0,0 +1,50 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotations.internal.emitter;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
+
+/**
+ * @author naci
+ */
+public class EmitterUtilities {
+
+	final static String JAVABUILDER = JavaCore.BUILDER_ID;
+
+	public static void addAnnotationBuilderToProject(IConfigurationElement emitter, IProject targetProject) throws CoreException {
+		String builderId = emitter.getAttribute("builderId");
+		ProjectUtilities.addToBuildSpecBefore(emitter.getContributor().getName() + "." + builderId, JAVABUILDER, targetProject);
+
+	}
+
+	public static IConfigurationElement findEmitter(String id) {
+
+		IConfigurationElement configurationElement[] = getAnnotationExtensions();
+		for (int i = 0; i < configurationElement.length; i++) {
+			IConfigurationElement element = configurationElement[i];
+			String emitterId = element.getAttribute("name");
+			if ("emitter".equals(element.getName()) && emitterId != null && emitterId.equals(id))
+				return element;
+		}
+		return null;
+	}
+
+	public static IConfigurationElement[] getAnnotationExtensions() {
+		IConfigurationElement[] configurationElements = Platform.getExtensionRegistry().getConfigurationElementsFor(
+				"org.eclipse.jst.j2ee.ejb.annotations.emitter.template");
+		return configurationElements;
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/src/org/eclipse/jst/j2ee/ejb/annotations/internal/emitter/EntityEjbEmitter.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/src/org/eclipse/jst/j2ee/ejb/annotations/internal/emitter/EntityEjbEmitter.java
new file mode 100644
index 0000000..25e207b
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/src/org/eclipse/jst/j2ee/ejb/annotations/internal/emitter/EntityEjbEmitter.java
@@ -0,0 +1,48 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotations.internal.emitter;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.model.IEnterpriseBean;
+
+public class EntityEjbEmitter extends EjbEmitter {
+	public static final String TYPE_COMMENT = "/typeComment.javajet";
+	public static final String TYPE_STUB = "/typeStub.javajet";
+	public static final String METHOD_STUBS = "/methodStubs.javajet";
+	public static final String FIELDS = "/fields.javajet";
+	public static final String TEMPLATESDIR = "entityTemplates";
+	public EntityEjbEmitter(IConfigurationElement emitterConfig)
+			throws ClassNotFoundException, InstantiationException,
+			IllegalAccessException, CoreException {
+		super(emitterConfig);
+	}
+	public String emitTypeComment(IEnterpriseBean root)
+			throws ClassNotFoundException, InstantiationException,
+			IllegalAccessException, CoreException {
+		return generate(emitterConfig.getAttribute(TEMPLATESDIR), TYPE_COMMENT,
+				root);
+	}
+	public String emitTypeStub(IEnterpriseBean root)
+			throws ClassNotFoundException, InstantiationException,
+			IllegalAccessException, CoreException {
+		return generate(emitterConfig.getAttribute(TEMPLATESDIR), TYPE_STUB,
+				root);
+	}
+	public String emitInterfaceMethods(IEnterpriseBean root)
+			throws ClassNotFoundException, InstantiationException,
+			IllegalAccessException, CoreException {
+		return generate(emitterConfig.getAttribute(TEMPLATESDIR), METHOD_STUBS,
+				root);
+	}
+	public String emitFields(IEnterpriseBean root) throws ClassNotFoundException,
+			InstantiationException, IllegalAccessException, CoreException {
+		return generate(emitterConfig.getAttribute(TEMPLATESDIR), FIELDS, root);
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/src/org/eclipse/jst/j2ee/ejb/annotations/internal/emitter/IEjbIntrospector.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/src/org/eclipse/jst/j2ee/ejb/annotations/internal/emitter/IEjbIntrospector.java
new file mode 100644
index 0000000..4d2743f
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/src/org/eclipse/jst/j2ee/ejb/annotations/internal/emitter/IEjbIntrospector.java
@@ -0,0 +1,21 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotations.internal.emitter;
+
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jst.j2ee.ejb.EnterpriseBean;
+
+
+
+public interface IEjbIntrospector {
+	
+	public abstract EnterpriseBean getEnterpriseBean();
+	public abstract void setCompilationUnit(ICompilationUnit compilationUnit);
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/src/org/eclipse/jst/j2ee/ejb/annotations/internal/emitter/IEmitterClasspathProvider.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/src/org/eclipse/jst/j2ee/ejb/annotations/internal/emitter/IEmitterClasspathProvider.java
new file mode 100644
index 0000000..d565a1d
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/src/org/eclipse/jst/j2ee/ejb/annotations/internal/emitter/IEmitterClasspathProvider.java
@@ -0,0 +1,23 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotations.internal.emitter;
+
+import java.util.List;
+
+/**
+ * @author naci
+ *
+ * TODO To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+public interface IEmitterClasspathProvider {
+	
+	List getClasspathItems();
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/src/org/eclipse/jst/j2ee/ejb/annotations/internal/emitter/MessageDrivenEjbEmitter.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/src/org/eclipse/jst/j2ee/ejb/annotations/internal/emitter/MessageDrivenEjbEmitter.java
new file mode 100644
index 0000000..7045f18
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/src/org/eclipse/jst/j2ee/ejb/annotations/internal/emitter/MessageDrivenEjbEmitter.java
@@ -0,0 +1,48 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotations.internal.emitter;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.model.IEnterpriseBean;
+
+public class MessageDrivenEjbEmitter extends EjbEmitter {
+	public static final String TYPE_COMMENT = "/typeComment.javajet";
+	public static final String TYPE_STUB = "/typeStub.javajet";
+	public static final String METHOD_STUBS = "/methodStubs.javajet";
+	public static final String FIELDS = "/fields.javajet";
+	public static final String TEMPLATESDIR = "messageTemplates";
+	public MessageDrivenEjbEmitter(IConfigurationElement emitterConfig)
+			throws ClassNotFoundException, InstantiationException,
+			IllegalAccessException, CoreException {
+		super(emitterConfig);
+	}
+	public String emitTypeComment(IEnterpriseBean root)
+			throws ClassNotFoundException, InstantiationException,
+			IllegalAccessException, CoreException {
+		return generate(emitterConfig.getAttribute(TEMPLATESDIR), TYPE_COMMENT,
+				root);
+	}
+	public String emitTypeStub(IEnterpriseBean root)
+			throws ClassNotFoundException, InstantiationException,
+			IllegalAccessException, CoreException {
+		return generate(emitterConfig.getAttribute(TEMPLATESDIR), TYPE_STUB,
+				root);
+	}
+	public String emitInterfaceMethods(IEnterpriseBean root)
+			throws ClassNotFoundException, InstantiationException,
+			IllegalAccessException, CoreException {
+		return generate(emitterConfig.getAttribute(TEMPLATESDIR), METHOD_STUBS,
+				root);
+	}
+	public String emitFields(IEnterpriseBean root) throws ClassNotFoundException,
+			InstantiationException, IllegalAccessException, CoreException {
+		return generate(emitterConfig.getAttribute(TEMPLATESDIR), FIELDS, root);
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/src/org/eclipse/jst/j2ee/ejb/annotations/internal/emitter/SessionEjbEmitter.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/src/org/eclipse/jst/j2ee/ejb/annotations/internal/emitter/SessionEjbEmitter.java
new file mode 100644
index 0000000..41c24e4
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.emitter/src/org/eclipse/jst/j2ee/ejb/annotations/internal/emitter/SessionEjbEmitter.java
@@ -0,0 +1,49 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotations.internal.emitter;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.model.IEnterpriseBean;
+
+
+public class SessionEjbEmitter extends EjbEmitter {
+	public static final String TYPE_COMMENT = "/typeComment.javajet";
+	public static final String TYPE_STUB = "/typeStub.javajet";
+	public static final String METHOD_STUBS = "/methodStubs.javajet";
+	public static final String FIELDS = "/fields.javajet";
+	public static final String TEMPLATESDIR = "sessionTemplates";
+	public SessionEjbEmitter(IConfigurationElement emitterConfig)
+			throws ClassNotFoundException, InstantiationException,
+			IllegalAccessException, CoreException {
+		super(emitterConfig);
+	}
+	public String emitTypeComment(IEnterpriseBean root)
+			throws ClassNotFoundException, InstantiationException,
+			IllegalAccessException, CoreException {
+		return generate(emitterConfig.getAttribute(TEMPLATESDIR), TYPE_COMMENT,
+				root);
+	}
+	public String emitTypeStub(IEnterpriseBean root)
+			throws ClassNotFoundException, InstantiationException,
+			IllegalAccessException, CoreException {
+		return generate(emitterConfig.getAttribute(TEMPLATESDIR), TYPE_STUB,
+				root);
+	}
+	public String emitInterfaceMethods(IEnterpriseBean root)
+			throws ClassNotFoundException, InstantiationException,
+			IllegalAccessException, CoreException {
+		return generate(emitterConfig.getAttribute(TEMPLATESDIR), METHOD_STUBS,
+				root);
+	}
+	public String emitFields(IEnterpriseBean root) throws ClassNotFoundException,
+			InstantiationException, IllegalAccessException, CoreException {
+		return generate(emitterConfig.getAttribute(TEMPLATESDIR), FIELDS, root);
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/.classpath b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/.classpath
new file mode 100644
index 0000000..386e99a
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/.classpath
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
+		<accessrules>
+			<accessrule kind="accessible" pattern="org/eclipse/jst/**"/>
+			<accessrule kind="accessible" pattern="org/eclipse/wst/**"/>
+		</accessrules>
+	</classpathentry>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/.cvsignore b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/.cvsignore
new file mode 100644
index 0000000..e0c4599
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/.cvsignore
@@ -0,0 +1,7 @@
+bin
+temp.folder
+build.xml
+ejbAnnotationsUi.jar
+@dot
+src.zip
+javaCompiler...args
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/.project b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/.project
new file mode 100644
index 0000000..95911fe
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.jst.j2ee.ejb.annotations.ui</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/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/.settings/org.eclipse.jdt.ui.prefs b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..f16529c
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,3 @@
+#Mon Apr 17 15:48:15 EDT 2006
+eclipse.preferences.version=1
+internal.default.compliance=user
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/META-INF/MANIFEST.MF b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..6e00e30
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,39 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name.0
+Bundle-SymbolicName: org.eclipse.jst.j2ee.ejb.annotations.ui; singleton:=true
+Bundle-Version: 1.1.300.qualifier
+Bundle-ClassPath: .
+Bundle-Activator: org.eclipse.jst.j2ee.ejb.annotation.ui.internal.EjbAnnotationsUiPlugin
+Bundle-Vendor: %Bundle-Vendor.0
+Bundle-Localization: plugin
+Export-Package: org.eclipse.jst.j2ee.ejb.annotation.ui.internal;x-internal:=true,
+ org.eclipse.jst.j2ee.ejb.annotation.ui.internal.cmp.wizards;x-internal:=true,
+ org.eclipse.jst.j2ee.ejb.annotation.ui.internal.preferences;x-internal:=true,
+ org.eclipse.jst.j2ee.ejb.annotation.ui.internal.wizards;x-internal:=true
+Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.core.resources;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.wst.common.frameworks;bundle-version="[1.1.0,2.0.0)",
+ org.eclipse.wst.common.frameworks.ui;bundle-version="[1.1.0,2.0.0)",
+ org.eclipse.ui;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.ui.workbench;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.jst.j2ee;bundle-version="[1.1.0,1.3.0)",
+ org.eclipse.jst.j2ee.core;bundle-version="[1.1.0,2.0.0)",
+ org.eclipse.jst.j2ee.ui;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.jst.j2ee.ejb;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.jst.j2ee.ejb.annotation.model;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.emf.ecore.xmi;bundle-version="[2.2.0,3.0.0)",
+ org.eclipse.wst.common.modulecore;bundle-version="[1.1.0,2.0.0)",
+ org.eclipse.jst.ejb.ui;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.jem.util;bundle-version="[2.0.0,3.0.0)",
+ org.eclipse.jst.common.frameworks;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.jdt.core;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.wst.web.ui;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.wst.common.project.facet.ui;bundle-version="[1.1.0,2.0.0)",
+ org.eclipse.jdt.ui;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.jface.text;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.wst.common.project.facet.core;bundle-version="[1.1.0,2.0.0)",
+ org.eclipse.datatools.connectivity;resolution:=optional,
+ org.eclipse.datatools.connectivity.ui.dse;resolution:=optional
+Eclipse-LazyStart: true
+Bundle-RequiredExecutionEnvironment: J2SE-1.4
diff --git a/plugins/org.eclipse.wst.web.ui/about.html b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/about.html
similarity index 100%
copy from plugins/org.eclipse.wst.web.ui/about.html
copy to plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/about.html
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/build.properties b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/build.properties
new file mode 100644
index 0000000..ebfe7d6
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/build.properties
@@ -0,0 +1,9 @@
+bin.includes = plugin.xml,\
+               .,\
+               icons/,\
+               plugin.properties,\
+               META-INF/,\
+               about.html
+source.. = src/
+               
+
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/icons/checked.gif b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/icons/checked.gif
new file mode 100644
index 0000000..00da14e
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/icons/checked.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/icons/ejbgroup_obj.gif b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/icons/ejbgroup_obj.gif
new file mode 100644
index 0000000..b0adb3e
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/icons/ejbgroup_obj.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/icons/full/clcl16/ejb_client_remove_action_obj.gif b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/icons/full/clcl16/ejb_client_remove_action_obj.gif
new file mode 100644
index 0000000..1823211
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/icons/full/clcl16/ejb_client_remove_action_obj.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/icons/full/clcl16/ejb_deploy_action_obj.gif b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/icons/full/clcl16/ejb_deploy_action_obj.gif
new file mode 100644
index 0000000..db8945f
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/icons/full/clcl16/ejb_deploy_action_obj.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/icons/full/ctool16/new_ejb_wiz.gif b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/icons/full/ctool16/new_ejb_wiz.gif
new file mode 100644
index 0000000..507b8a8
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/icons/full/ctool16/new_ejb_wiz.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/icons/full/ctool16/newejb_wiz.gif b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/icons/full/ctool16/newejb_wiz.gif
new file mode 100644
index 0000000..d334fa0
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/icons/full/ctool16/newejb_wiz.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/icons/full/ctool16/newentityejb_wiz.gif b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/icons/full/ctool16/newentityejb_wiz.gif
new file mode 100644
index 0000000..46684a0
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/icons/full/ctool16/newentityejb_wiz.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/icons/full/ctool16/newmessageejb_wiz.gif b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/icons/full/ctool16/newmessageejb_wiz.gif
new file mode 100644
index 0000000..effcc3f
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/icons/full/ctool16/newmessageejb_wiz.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/icons/full/ctool16/newsessionejb_wiz.gif b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/icons/full/ctool16/newsessionejb_wiz.gif
new file mode 100644
index 0000000..50e231e
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/icons/full/ctool16/newsessionejb_wiz.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/icons/full/wizban/ejb_wiz.gif b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/icons/full/wizban/ejb_wiz.gif
new file mode 100644
index 0000000..7f2aa1e
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/icons/full/wizban/ejb_wiz.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/icons/full/wizban/ejb_wiz.png b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/icons/full/wizban/ejb_wiz.png
new file mode 100644
index 0000000..4654480
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/icons/full/wizban/ejb_wiz.png
Binary files differ
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/icons/full/wizban/newejb_wiz_ban.gif b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/icons/full/wizban/newejb_wiz_ban.gif
new file mode 100644
index 0000000..2ee5da2
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/icons/full/wizban/newejb_wiz_ban.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/icons/full/wizban/newejb_wiz_ban.png b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/icons/full/wizban/newejb_wiz_ban.png
new file mode 100644
index 0000000..3e8ec91
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/icons/full/wizban/newejb_wiz_ban.png
Binary files differ
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/icons/sessionBean_obj.gif b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/icons/sessionBean_obj.gif
new file mode 100644
index 0000000..507b8a8
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/icons/sessionBean_obj.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/icons/unchecked.gif b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/icons/unchecked.gif
new file mode 100644
index 0000000..7aa131a
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/icons/unchecked.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/plugin.properties b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/plugin.properties
new file mode 100644
index 0000000..f74e705
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/plugin.properties
@@ -0,0 +1,8 @@
+ejb.category_ui_=EJB
+ejb.createbean_ui_= XDoclet Enterprise JavaBean
+new.ejb.description_ui_=Create XDoclet Enterprise JavaBean
+j2ee_annotations=J2EE Annotations
+J2EEAnnotationPropertiesPage.name=J2EE Annotations
+
+Bundle-Name.0 = EJB Annotations Ui Plug-in
+Bundle-Vendor.0 = Eclipse Web Tools Platform
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/plugin.xml b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/plugin.xml
new file mode 100644
index 0000000..4d32579
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/plugin.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+   <extension-point id="ProviderPreferenceMapping" name="org.eclipse.jst.j2ee.ejb.annotations.ui.providerPreferenceMapping" schema="schema/ProviderPreferenceMapping.exsd"/>
+
+    
+<!--================================-->
+<!-- EJB Creation Wizard Contributions   -->
+<!--================================-->
+
+   <extension
+         id="org.eclipse.jst.j2ee.ejb.ui.wizards"
+         point="org.eclipse.ui.newWizards">
+       <category
+            name="EJB"
+            id="org.eclipse.jst.ejb.ui">
+      </category>
+      <wizard
+            name="%ejb.createbean_ui_"
+            icon="icons/full/ctool16/newejb_wiz.gif"
+            category="org.eclipse.jst.ejb.ui"
+            id="org.eclipse.jst.j2ee.ejb.annotation.ui.internal.wizards.AddEjbWizard">
+         <class class="org.eclipse.jst.j2ee.ejb.annotation.ui.internal.wizards.AddEjbWizard">
+            <parameter name="javaeeartifact" value="true"/>
+            <parameter name="menuIndex" value="40" />
+         </class>
+         <description>
+            %new.ejb.description_ui_
+         </description>
+      </wizard>
+   </extension>
+   
+<!--================================-->
+<!-- ANNOTATION PREFERENCES   -->
+<!--================================-->
+
+<!-- Not used anymore
+   <extension
+         point="org.eclipse.ui.preferencePages">
+     <page
+            name="%j2ee_annotations"
+             class="org.eclipse.jst.j2ee.ejb.annotation.ui.internal.preferences.AnnotationPreferencePage"
+            id="org.eclipse.jst.j2ee.ejb.annotation.ui.preferences">
+      </page>
+ 
+    </extension>
+-->
+<!-- =========== org.eclipse.jst.j2ee.internal.J2EEAnnotationPropertiesPage ============ -->
+
+<!--
+	<extension point="org.eclipse.ui.propertyPages">
+       <page
+            objectClass="org.eclipse.core.resources.IProject"
+            name="%J2EEAnnotationPropertiesPage.name"
+            class="org.eclipse.jst.j2ee.ejb.annotation.ui.internal.preferences.AnnotationPreferencePage"
+            id="J2EEAnnotationPropertiesPage">
+         <filter
+               name="nature"
+               value="org.eclipse.wst.common.modulecore.ModuleCoreNature">
+         </filter>
+      </page>
+
+      <page
+            objectClass="org.eclipse.jdt.core.IJavaProject"
+            name="%J2EEAnnotationPropertiesPage.name"
+            class="org.eclipse.jst.j2ee.ejb.annotation.ui.internal.preferences.AnnotationPreferencePage"
+            id="J2EEAnnotationPropertiesPage">
+         <filter
+               name="nature" 
+               value="org.eclipse.wst.common.modulecore.ModuleCoreNature">
+         </filter>
+      </page> 
+   </extension>    
+-->  
+</plugin>
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/pom.xml b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/pom.xml
new file mode 100644
index 0000000..4f33602
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/pom.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Copyright (c) 2012, 2013 Eclipse Foundation and others.
+  All rights reserved. This program and the accompanying materials
+  are made available under the terms of the Eclipse Distribution License v1.0
+  which accompanies this distribution, and is available at
+  http://www.eclipse.org/org/documents/edl-v10.php
+ 
+  Contributors:
+    Thanh Ha (Eclipse Foundation) - initial implementation
+-->
+
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.eclipse.webtools.javaee</groupId>
+    <artifactId>javaee.plugins</artifactId>
+    <version>3.6.0-SNAPSHOT</version>
+  </parent>
+
+  <groupId>org.eclipse.webtools.ejb</groupId>
+  <artifactId>org.eclipse.jst.j2ee.ejb.annotations.ui</artifactId>
+  <version>1.1.300-SNAPSHOT</version>
+  <packaging>eclipse-plugin</packaging>
+</project>
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/schema/ProviderPreferenceMapping.exsd b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/schema/ProviderPreferenceMapping.exsd
new file mode 100644
index 0000000..5f9559b
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/schema/ProviderPreferenceMapping.exsd
@@ -0,0 +1,114 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.jst.j2ee.ejb.annotations.ui">
+<annotation>
+      <appInfo>
+         <meta.schema plugin="org.eclipse.jst.j2ee.ejb.annotations.ui" id="ProviderPreferenceMapping" name="org.eclipse.jst.j2ee.ejb.annotations.ui.providerPreferenceMapping"/>
+      </appInfo>
+      <documentation>
+         [Enter description of this extension point.]
+      </documentation>
+   </annotation>
+
+   <element name="extension">
+      <complexType>
+		 <sequence>
+			<element ref="mapping"/>
+		 </sequence>
+         <attribute name="point" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="name" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appInfo>
+                  <meta.attribute translatable="true"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="mapping">
+      <annotation>
+         <documentation>
+            Provide a mapping between an annotation type and it's preference page
+         </documentation>
+      </annotation>
+      <complexType>
+         <attribute name="name" type="string" use="required">
+            <annotation>
+               <documentation>
+                  The name of the provider. 
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="preferencePage" type="string" use="required">
+            <annotation>
+               <documentation>
+                  The preference page key. 
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+   
+   <annotation>
+      <appInfo>
+         <meta.section type="since"/>
+      </appInfo>
+      <documentation>
+         [Enter the first release in which this extension point appears.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="examples"/>
+      </appInfo>
+      <documentation>
+         [Enter extension point usage example here.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="apiInfo"/>
+      </appInfo>
+      <documentation>
+         [Enter API information here.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="implementation"/>
+      </appInfo>
+      <documentation>
+         [Enter information about supplied implementation of this extension point.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="copyright"/>
+      </appInfo>
+      <documentation>
+         
+      </documentation>
+   </annotation>
+
+</schema>
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/EjbAnnotationsUiPlugin.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/EjbAnnotationsUiPlugin.java
new file mode 100644
index 0000000..0b3c68d
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/EjbAnnotationsUiPlugin.java
@@ -0,0 +1,101 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotation.ui.internal;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The main plugin class to be used in the desktop.
+ */
+public class EjbAnnotationsUiPlugin extends AbstractUIPlugin {
+	
+	public static final String PLUGINID= "org.eclipse.jst.j2ee.ejb.annotations.ui";
+	//The shared instance.
+	private static EjbAnnotationsUiPlugin plugin;
+	//Resource bundle.
+	private ResourceBundle resourceBundle;
+	
+	/**
+	 * The constructor.
+	 */
+	public EjbAnnotationsUiPlugin() {
+		super();
+		plugin = this;
+	}
+
+	/**
+	 * This method is called upon plug-in activation
+	 */
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+	}
+
+	/**
+	 * This method is called when the plug-in is stopped
+	 */
+	public void stop(BundleContext context) throws Exception {
+		super.stop(context);
+		plugin = null;
+		resourceBundle = null;
+	}
+
+	/**
+	 * Returns the shared instance.
+	 */
+	public static EjbAnnotationsUiPlugin getDefault() {
+		return plugin;
+	}
+
+	/**
+	 * Returns the string from the plugin's resource bundle,
+	 * or 'key' if not found.
+	 */
+	public static String getResourceString(String key) {
+		ResourceBundle bundle = EjbAnnotationsUiPlugin.getDefault().getResourceBundle();
+		try {
+			return (bundle != null) ? bundle.getString(key) : key;
+		} catch (MissingResourceException e) {
+			return key;
+		}
+	}
+
+	/**
+	 * This gets a .gif from the icons folder.
+	 */
+	public ImageDescriptor getImageDescriptor(String path) {
+		ImageDescriptor imageDescriptor = EjbAnnotationsUiPlugin.imageDescriptorFromPlugin(PLUGINID,path);
+		return imageDescriptor;
+	}
+
+	/**
+	 * Returns the plugin's resource bundle,
+	 */
+	public ResourceBundle getResourceBundle() {
+		try {
+			if (resourceBundle == null)
+				resourceBundle = ResourceBundle.getBundle("org.eclipse.jst.j2ee.ejb.annotations.internal.emitter.model.ui.EjbAnnotationsUiPluginResources");
+		} catch (MissingResourceException x) {
+			resourceBundle = null;
+		}
+		return resourceBundle;
+	}
+	
+	public static void log(String message, Throwable throwable)
+	{
+		getDefault().getLog().log(new Status(IStatus.ERROR,PLUGINID,message,throwable ));
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/cmp/wizards/AddContainerManagedEntityBeanWizardPage.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/cmp/wizards/AddContainerManagedEntityBeanWizardPage.java
new file mode 100644
index 0000000..0bd4950
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/cmp/wizards/AddContainerManagedEntityBeanWizardPage.java
@@ -0,0 +1,184 @@
+
+/***************************************************************************************************
+ * Copyright (c) 2005, 2006 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ *				 David Schneider, david.schneider@unisys.com - [142500] WTP properties pages fonts don't follow Eclipse preferences
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotation.ui.internal.cmp.wizards;
+
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jst.j2ee.ejb.ContainerManagedEntity;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.messages.IEJBAnnotationConstants;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.model.IContainerManagedEntityBeanDataModelProperties;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.model.IEnterpriseBeanClassDataModelProperties;
+import org.eclipse.jst.j2ee.ejb.annotation.ui.internal.wizards.IBeanWizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.wst.common.componentcore.internal.operation.IArtifactEditOperationDataModelProperties;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizardPage;
+import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
+
+
+public class AddContainerManagedEntityBeanWizardPage extends DataModelWizardPage implements IBeanWizardPage{
+
+
+
+	private Text ejbNameText;
+	private Text displayNameText;
+	private Combo usecaseButton;
+	private Combo versionButton;
+	private Text schemaText;
+
+	
+
+	public AddContainerManagedEntityBeanWizardPage(IDataModel model, String pageName) {
+		super(model, pageName);
+		setDescription(IEJBAnnotationConstants.ADD_EJB_CMPWIZARD_PAGE_DESC);
+		this.setTitle(IEJBAnnotationConstants.ADD_EJB_CMPWIZARD_PAGE_TITLE);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.ibm.wtp.common.ui.wizard.WTPWizardPage#getValidationPropertyNames()
+	 */
+	protected String[] getValidationPropertyNames() {
+		return new String[]{
+				IEnterpriseBeanClassDataModelProperties.EJB_NAME, 
+				IContainerManagedEntityBeanDataModelProperties.DATASOURCE, 
+				IContainerManagedEntityBeanDataModelProperties.SCHEMA, 
+				IContainerManagedEntityBeanDataModelProperties.VERSION, 
+				IEnterpriseBeanClassDataModelProperties.DISPLAY_NAME, 				
+				IEnterpriseBeanClassDataModelProperties.DESCRIPTION};
+	}
+
+	protected Composite createTopLevelComposite(Composite parent) {
+		Composite composite = new Composite(parent, SWT.NULL);
+		composite.setLayout(new GridLayout());
+		GridData data = new GridData(GridData.FILL_BOTH);
+		data.widthHint = 300;
+		composite.setLayoutData(data);
+
+		Composite group = new Composite(composite, SWT.NULL);
+		group.setLayout(new GridLayout(2, false));
+		group.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+		createNameDescription(group);
+		createVersionGroup(group);
+		createUsecaseTypeGroup(group);
+		displayNameText.setFocus();
+
+		IStatus projectStatus = validateProjectName();
+		if (!projectStatus.isOK()) {
+			setErrorMessage(projectStatus.getMessage());
+			composite.setEnabled(false);
+		}
+		Dialog.applyDialogFont(parent);
+		return composite;
+	}
+
+	protected IStatus validateProjectName() {
+		// check for empty
+		if (model.getStringProperty(IArtifactEditOperationDataModelProperties.PROJECT_NAME) == null || model.getStringProperty(IArtifactEditOperationDataModelProperties.PROJECT_NAME).trim().length() == 0) {
+			return WTPCommonPlugin.createErrorStatus(IEJBAnnotationConstants.NO_EJB_PROJECTS);
+		}
+		return WTPCommonPlugin.OK_STATUS;
+	}
+
+	protected void createNameDescription(Composite composite) {
+		// ejb name
+		Label ejbNameLabel = new Label(composite, SWT.LEFT);
+		ejbNameLabel.setText(IEJBAnnotationConstants.EJB_NAME_LABEL);
+		ejbNameLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
+		ejbNameText = new Text(composite, SWT.SINGLE | SWT.BORDER);
+		ejbNameText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		synchHelper.synchText(ejbNameText, IEnterpriseBeanClassDataModelProperties.EJB_NAME, null);
+
+
+		Label schemaLabel = new Label(composite, SWT.LEFT);
+		schemaLabel.setText(IEJBAnnotationConstants.SCHEMA_NAME_LABEL);
+		schemaLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
+		schemaText = new Text(composite, SWT.SINGLE | SWT.BORDER);
+		schemaText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		synchHelper.synchText(schemaText, IContainerManagedEntityBeanDataModelProperties.SCHEMA, null);
+
+		// display name
+		Label displayNameLabel = new Label(composite, SWT.LEFT);
+		displayNameLabel.setText(IEJBAnnotationConstants.DISPLAY_NAME_LABEL);
+		displayNameLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
+		displayNameText = new Text(composite, SWT.SINGLE | SWT.BORDER);
+		displayNameText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		synchHelper.synchText(displayNameText, IEnterpriseBeanClassDataModelProperties.DISPLAY_NAME, null);
+
+		// description
+		Label descLabel = new Label(composite, SWT.LEFT);
+		descLabel.setText(IEJBAnnotationConstants.DESCRIPTION_LABEL);
+		descLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
+		final Text descText = new Text(composite, SWT.SINGLE | SWT.BORDER);
+		descText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		synchHelper.synchText(descText, IEnterpriseBeanClassDataModelProperties.DESCRIPTION, null);
+	}
+
+	protected void createUsecaseTypeGroup(Composite composite) {
+
+		// description
+		Label usecaseTypeLabel = new Label(composite, SWT.LEFT);
+		usecaseTypeLabel.setText(IEJBAnnotationConstants.ENTITY_USECASE_LABEL);
+		usecaseTypeLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
+		
+		usecaseButton = new Combo(composite,SWT.DROP_DOWN |  SWT.READ_ONLY);
+		usecaseButton.setItems(new String[]{IEJBAnnotationConstants.CMP_FROM_TABLE,IEJBAnnotationConstants.CMP_FROM_BEAN});
+		usecaseButton.setText(IEJBAnnotationConstants.CMP_FROM_TABLE);
+		usecaseButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		usecaseButton.select(0);
+		//synchHelper.synchCombo(usecaseTypeLabel, IContainerManagedEntityBeanDataModelProperties.TYPE, null);
+
+	}
+	protected void createVersionGroup(Composite composite) {
+
+		// description
+		Label versionLabel = new Label(composite, SWT.LEFT);
+		versionLabel.setText(IEJBAnnotationConstants.ENTITY_VERSION_LABEL);
+		versionLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
+		
+		versionButton = new Combo(composite,SWT.DROP_DOWN |  SWT.READ_ONLY);
+		versionButton.setItems(new String[]{ContainerManagedEntity.VERSION_1_X,ContainerManagedEntity.VERSION_2_X});
+		versionButton.setText(IEJBAnnotationConstants.CMP_FROM_TABLE);
+		versionButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		versionButton.select(0);
+		synchHelper.synchCombo(versionButton, IContainerManagedEntityBeanDataModelProperties.VERSION, null);
+
+	}
+
+	public boolean canFlipToNextPage() {
+		return super.canFlipToNextPage();
+	}
+
+
+	public String getDisplayName() {
+		return displayNameText.getText();
+	}
+
+	public String getEjbName() {
+		return model.getStringProperty(IEnterpriseBeanClassDataModelProperties.EJB_NAME);
+	}
+
+	public boolean isJavaBean() {
+		if( usecaseButton == null)
+			return false;
+		return usecaseButton.getSelectionIndex() == 1;
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/cmp/wizards/AddContainerManagedEntityEjbWizard.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/cmp/wizards/AddContainerManagedEntityEjbWizard.java
new file mode 100644
index 0000000..ed82dd5
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/cmp/wizards/AddContainerManagedEntityEjbWizard.java
@@ -0,0 +1,265 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+package org.eclipse.jst.j2ee.ejb.annotation.ui.internal.cmp.wizards;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.datatools.connectivity.IConnectionProfile;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.messages.IEJBAnnotationConstants;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.model.ContainerManagedEntityBeanDataModelProvider;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.model.IContainerManagedEntityBeanDataModelProperties;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.model.IEnterpriseBeanClassDataModelProperties;
+import org.eclipse.jst.j2ee.ejb.annotation.ui.internal.EjbAnnotationsUiPlugin;
+import org.eclipse.jst.j2ee.ejb.annotation.ui.internal.wizards.IEJBUIContextIds;
+import org.eclipse.jst.j2ee.ejb.annotation.ui.internal.wizards.NewEjbClassOptionsWizardPage;
+import org.eclipse.jst.j2ee.ejb.annotation.ui.internal.wizards.NewEjbClassWizardPage;
+import org.eclipse.jst.j2ee.ejb.annotation.ui.internal.wizards.NewEjbWizard;
+import org.eclipse.jst.j2ee.internal.common.operations.INewJavaClassDataModelProperties;
+import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.wst.common.componentcore.internal.operation.IArtifactEditOperationDataModelProperties;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelEvent;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelListener;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider;
+import org.eclipse.wst.common.frameworks.internal.datamodel.ui.IDMPageHandler;
+
+public class AddContainerManagedEntityEjbWizard extends NewEjbWizard {
+	protected NewEjbClassWizardPage newJavaClassWizardPage = null;
+
+	protected AddContainerManagedEntityBeanWizardPage addEntityBeanWizardPage = null;
+
+	protected NewEjbClassOptionsWizardPage newEjbClassOptionsWizardPage = null;
+
+	private ConnectionSelectionPage connectionPage;
+
+	private ChooseTableWizardPage tablePage;
+
+	public static final String PAGE_ONE_NAME = "entity.pageOne"; //$NON-NLS-1$
+
+	public static final String PAGE_TWO_NAME = "entity.pageTwo"; //$NON-NLS-1$
+
+	public static final String PAGE_THREE_NAME = "entity.pageThree"; //$NON-NLS-1$
+
+	public static final String CMP_TABLE_PAGE = "org.eclipse.jst.ejb.ui.cmp.TablePage";
+
+	public static final String JDBCPAGE = "org.eclipse.jst.ejb.ui.cmp.NewCWJDBCPage";
+
+	public static final String CONNECTION_PAGE = "org.eclipse.jst.ejb.ui.cmp.ConnectionPage";
+
+	/**
+	 * @param model
+	 */
+	public AddContainerManagedEntityEjbWizard(IDataModel model) {
+		super(model);
+		setWindowTitle(IEJBAnnotationConstants.ADD_EJB_WIZARD_WINDOW_TITLE);
+		setDefaultPageImageDescriptor(EjbAnnotationsUiPlugin.getDefault()
+				.getImageDescriptor("icons/full/wizban/newejb_wiz_ban.gif")); //$NON-NLS-1$
+	}
+
+	public AddContainerManagedEntityEjbWizard() {
+		this(null);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench,
+	 *      org.eclipse.jface.viewers.IStructuredSelection)
+	 */
+	public void init(IWorkbench workbench, IStructuredSelection selection) {
+		super.init(workbench, selection);
+		IProject project = getDefaultEjbProject();
+		if (project != null) {
+			getDataModel().setProperty(
+					IArtifactEditOperationDataModelProperties.PROJECT_NAME,
+					project.getName());
+		}
+		initializeEjbNameListener(getDataModel());
+	}
+
+	private void initializeEjbNameListener(final IDataModel dataModel) {
+		dataModel.addListener(new IDataModelListener() {
+
+			public void propertyChanged(DataModelEvent event) {
+				if (INewJavaClassDataModelProperties.CLASS_NAME.equals(event
+						.getPropertyName())) {
+					String className = (String) event.getProperty();
+					int i = className.toLowerCase().indexOf("bean");
+					if (i < 0)
+						i = className.toLowerCase().indexOf("ejb");
+					if (i >= 0)
+						className = className.substring(0, i);
+					if (className.length() > 0) {
+						// Unset these properties. They will be set with new
+						// values when EJB_NAME property is set.
+						dataModel
+								.setProperty(
+										IContainerManagedEntityBeanDataModelProperties.DATASOURCE,
+										null);
+						dataModel
+								.setProperty(
+										IEnterpriseBeanClassDataModelProperties.DISPLAY_NAME,
+										null);
+						dataModel
+								.setProperty(
+										IEnterpriseBeanClassDataModelProperties.DESCRIPTION,
+										null);
+						dataModel
+								.setProperty(
+										IContainerManagedEntityBeanDataModelProperties.SCHEMA,
+										null);
+
+						// Set the EJB_NAME property. Call to
+						// DataModelProvider.propertySet() will be triggered
+						// that will reset the above properties.
+						dataModel
+								.setProperty(
+										IEnterpriseBeanClassDataModelProperties.EJB_NAME,
+										className);
+					}
+				}
+			}
+		});
+	}
+
+	protected IDataModelProvider getDefaultProvider() {
+		return new ContainerManagedEntityBeanDataModelProvider();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.wizard.Wizard#addPages()
+	 */
+	public void doAddPages() {
+		try {
+			newJavaClassWizardPage = new NewEjbClassWizardPage(
+					getDataModel(),
+					PAGE_ONE_NAME,
+					IEJBAnnotationConstants.NEW_JAVA_CLASS_DESTINATION_WIZARD_PAGE_DESC,
+					IEJBAnnotationConstants.ADD_EJB_WIZARD_PAGE_TITLE,
+					J2EEProjectUtilities.EJB);
+			newJavaClassWizardPage
+					.setInfopopID(IEJBUIContextIds.ANNOTATION_EJB_PAGE_ADD_ADD_WIZARD_2);
+			addPage(newJavaClassWizardPage);
+
+			addEntityBeanWizardPage = new AddContainerManagedEntityBeanWizardPage(
+					getDataModel(), PAGE_TWO_NAME);
+			addEntityBeanWizardPage
+					.setInfopopID(IEJBUIContextIds.ANNOTATION_EJB_PAGE_ADD_ADD_WIZARD_4);
+			addPage(addEntityBeanWizardPage);
+			addEntityBeanWizardPage.setPageComplete(false);
+
+			// This adds the JDBC connection configuration page which allows
+			// user to
+			// configure the properties for a new JDBC connection.
+			connectionPage = new ConnectionSelectionPage(getDataModel(),
+					AddContainerManagedEntityEjbWizard.CONNECTION_PAGE);
+			addPage(connectionPage);
+
+			// This adds the JDBC connection configuration page which allows
+			// user to
+			// configure the properties for a new JDBC connection.
+			tablePage = new ChooseTableWizardPage(getDataModel(),
+					AddContainerManagedEntityEjbWizard.CMP_TABLE_PAGE);
+			addPage(tablePage);
+			tablePage.setWizard(this);
+
+			newEjbClassOptionsWizardPage = new NewEjbClassOptionsWizardPage(
+					getDataModel(),
+					PAGE_THREE_NAME,
+					IEJBAnnotationConstants.NEW_JAVA_CLASS_OPTIONS_WIZARD_PAGE_DESC,
+					IEJBAnnotationConstants.ADD_EJB_WIZARD_PAGE_TITLE);
+			newEjbClassOptionsWizardPage
+					.setInfopopID(IEJBUIContextIds.ANNOTATION_EJB_PAGE_ADD_ADD_WIZARD_3);
+			addPage(newEjbClassOptionsWizardPage);
+		} catch (NoClassDefFoundError noClassDef) {
+			//TODO: Externalize this string past 2.0
+			EjbAnnotationsUiPlugin.log("Ejb 2.1 cmp wizard needs DTP. Please install eclipse data tools.", noClassDef);
+		}
+
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.ibm.wtp.common.ui.wizard.WTPWizard#runForked()
+	 */
+	protected boolean runForked() {
+		return true;
+	}
+
+	public IConnectionProfile getConnectionInfo() {
+		return connectionPage.getSelectedConnection();
+	}
+
+	public void updateTables() {
+		if (tablePage != null)
+			tablePage.updateTables();
+	}
+
+	public boolean isJavaBean() {
+		if (addEntityBeanWizardPage != null)
+			return addEntityBeanWizardPage.isJavaBean();
+		return false;
+	}
+
+	public boolean canFinish() {
+		if (newJavaClassWizardPage != null
+				&& newJavaClassWizardPage.isPageComplete()
+				&& addEntityBeanWizardPage != null
+				&& connectionPage != null
+				&& tablePage != null
+				&& addEntityBeanWizardPage.isPageComplete()
+				&& (addEntityBeanWizardPage.isJavaBean() || connectionPage
+						.isPageComplete()) && tablePage.isPageComplete()) {
+			return true;
+		}
+
+		return false;
+	}
+
+	public IWizardPage getNextPage(IWizardPage page) {
+
+		IWizardPage next = super.getNextPage(page);
+		if (next == tablePage)
+			this.updateTables();
+		return next;
+	}
+
+	public String getNextPage(String currentPageName,
+			String expectedNextPageName) {
+		if (null != expectedNextPageName
+				&& expectedNextPageName.equals(CONNECTION_PAGE)
+				&& addEntityBeanWizardPage.isJavaBean()) {
+			return IDMPageHandler.PAGE_AFTER + CONNECTION_PAGE;
+		}
+		return super.getNextPage(currentPageName, expectedNextPageName);
+	}
+
+	public String getPreviousPage(String currentPageName,
+			String expectedPreviousPageName) {
+		if (expectedPreviousPageName.equals(CONNECTION_PAGE)
+				&& addEntityBeanWizardPage.isJavaBean()) {
+			return IDMPageHandler.PAGE_BEFORE + CONNECTION_PAGE;
+		}
+		return super.getPreviousPage(currentPageName, expectedPreviousPageName);
+	}
+
+	public boolean testConnection() {
+		return true;
+	}
+
+	public IProject getDefaultEjbProject() {
+		return super.getDefaultEjbProject();
+	}
+
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/cmp/wizards/CMPUtils.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/cmp/wizards/CMPUtils.java
new file mode 100644
index 0000000..91b0600
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/cmp/wizards/CMPUtils.java
@@ -0,0 +1,163 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotation.ui.internal.cmp.wizards;
+
+import java.sql.Types;
+
+public class CMPUtils {
+
+	protected static String[] jdbcTypes = { "ARRAY", "BIGINT", "BINARY", "BIT", "BLOB", "BOOLEAN", "CHAR", "CLOB", "DATALINK", "DATE",
+			"DECIMAL", "DISTINCT", "DOUBLE", "FLOAT", "INTEGER", "JAVA_OBJECT", "LONGVARBINARY", "LONGVARCHAR", "NULL", "NUMERIC",
+			"OTHER", "REAL", "REF", "SMALLINT", "STRUCT", "TIME", "TIMESTAMP", "TINYINT", "VARBINARY", "VARCHAR" };// EjbConstants.LABEL_JDBCTYPES;
+	protected static String[] sqlTypes = { "BIGINT", "BINARY", "BIT", "BLOB", "BOOLEAN", "CHAR", "CLOB", "DATE", "DECIMAL", "DOUBLE",
+			"FLOAT", "INTEGER", "JAVA_OBJECT", "LONGVARBINARY", "LONGVARCHAR", "NULL", "NUMERIC", "REAL", "REF", "SMALLINT", "STRUCT",
+			"TIME", "TIMESTAMP", "TINYINT", "VARBINARY", "VARCHAR" };
+
+	public static String getSqlType(int type) {
+		switch (type) {
+		case Types.ARRAY:
+			return "ARRAY";
+		case Types.BIGINT:
+			return "BIGINT";
+		case Types.BINARY:
+			return "BINARY";
+		case Types.BIT:
+			return "BIT";
+		case Types.BLOB:
+			return "BLOB";
+		case Types.BOOLEAN:
+			return "BOOLEAN";
+		case Types.CHAR:
+			return "CHAR";
+		case Types.CLOB:
+			return "CLOB";
+		case Types.DATALINK:
+			return "DATALINK";
+		case Types.DATE:
+			return "DATE";
+		case Types.DECIMAL:
+			return "DECIMAL";
+		case Types.DISTINCT:
+			return "DISTINCT";
+		case Types.DOUBLE:
+			return "DOUBLE";
+		case Types.FLOAT:
+			return "FLOAT";
+		case Types.INTEGER:
+			return "INTEGER";
+		case Types.JAVA_OBJECT:
+			return "JAVA_OBJECT";
+		case Types.LONGVARBINARY:
+			return "LONGVARBINARY";
+		case Types.LONGVARCHAR:
+			return "LONGVARCHAR";
+		case Types.NULL:
+			return "NULL";
+		case Types.NUMERIC:
+			return "NUMERIC";
+		case Types.OTHER:
+			return "OTHER";
+		case Types.REAL:
+			return "REAL";
+		case Types.REF:
+			return "REF";
+		case Types.SMALLINT:
+			return "SMALLINT";
+		case Types.STRUCT:
+			return "STRUCT";
+		case Types.TIME:
+			return "TIME";
+		case Types.TIMESTAMP:
+			return "TIMESTAMP";
+		case Types.VARBINARY:
+			return "VARBINARY";
+		case Types.VARCHAR:
+			return "VARCHAR";
+
+		}
+		return "NULL";
+	}
+
+	public static String getAttributeType(int type) {
+		switch (type) {
+		case Types.ARRAY:
+			return "java.lang.Object[]";
+		case Types.BIGINT:
+			return "java.lang.Long";
+		case Types.BINARY:
+			return "java.lang.Byte[]";
+		case Types.BIT:
+			return "java.lang.Byte";
+		case Types.BLOB:
+			return "java.lang.Byte[]";
+		case Types.BOOLEAN:
+			return "java.lang.Boolean";
+		case Types.CHAR:
+			return "java.lang.Character";
+		case Types.CLOB:
+			return "java.lang.Character[]";
+		case Types.DATALINK:
+			return "java.lang.String";
+		case Types.DATE:
+			return "java.sql.Date";
+		case Types.DECIMAL:
+			return "java.math.BigDecimal";
+		case Types.DISTINCT:
+			return "java.lang.String";
+		case Types.DOUBLE:
+			return "java.lang.Double";
+		case Types.FLOAT:
+			return "java.lang.Float";
+		case Types.INTEGER:
+			return "java.lang.Integer";
+		case Types.JAVA_OBJECT:
+			return "java.lang.Object";
+		case Types.LONGVARBINARY:
+			return "java.lang.String";
+		case Types.LONGVARCHAR:
+			return "java.lang.String";
+		case Types.NULL:
+			return "java.lang.String";
+		case Types.NUMERIC:
+			return "java.math.BigDecimal";
+		case Types.OTHER:
+			return "java.lang.String";
+		case Types.REAL:
+			return "java.math.BigDecimal";
+		case Types.REF:
+			return "java.lang.String";
+		case Types.SMALLINT:
+			return "java.lang.Integer";
+		case Types.STRUCT:
+			return "java.lang.Object";
+		case Types.TIME:
+			return "java.sql.Time";
+		case Types.TIMESTAMP:
+			return "java.sql.Timestamp";
+		case Types.VARBINARY:
+			return "java.lang.Object";
+		case Types.VARCHAR:
+		return "java.lang.String";
+
+		}
+		return "java.lang.String";
+	}
+	
+	public static int getSqlTypeFromJDBC(int jdbcType)
+	{
+		for (int i = 0; i < sqlTypes.length; i++) {
+			String sqlType = sqlTypes[i];
+			if(sqlType.equals(jdbcTypes[jdbcType]))
+				return i;
+		}
+		return -1;
+	}
+	
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/cmp/wizards/ChooseTableWizardPage.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/cmp/wizards/ChooseTableWizardPage.java
new file mode 100644
index 0000000..ca6271c
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/cmp/wizards/ChooseTableWizardPage.java
@@ -0,0 +1,718 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotation.ui.internal.cmp.wizards;
+
+import java.sql.Connection;
+import java.sql.DatabaseMetaData;
+import java.sql.ResultSet;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.datatools.connectivity.IConnection;
+import org.eclipse.datatools.connectivity.IConnectionProfile;
+import org.eclipse.jdt.core.IPackageFragmentRoot;
+import org.eclipse.jdt.internal.ui.refactoring.contentassist.ControlContentAssistHelper;
+import org.eclipse.jdt.internal.ui.refactoring.contentassist.JavaTypeCompletionProcessor;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.CheckboxCellEditor;
+import org.eclipse.jface.viewers.ComboBoxCellEditor;
+import org.eclipse.jface.viewers.ICellModifier;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TextCellEditor;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.messages.IEJBAnnotationConstants;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.model.CMPAttributeDelegate;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.model.IContainerManagedEntityBeanDataModelProperties;
+import org.eclipse.jst.j2ee.ejb.annotation.ui.internal.EjbAnnotationsUiPlugin;
+import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizardPage;
+
+public class ChooseTableWizardPage extends DataModelWizardPage {
+
+	protected final Image fChecked = EjbAnnotationsUiPlugin.getDefault().getImageDescriptor("icons/checked.gif").createImage();
+
+	protected final Image fUnchecked = EjbAnnotationsUiPlugin.getDefault().getImageDescriptor("icons/unchecked.gif").createImage();
+
+	private String[] sqlTypes = CMPUtils.sqlTypes;
+
+	private Combo catalogButton;
+
+	private Table attributeTable;
+
+	private TableViewer attributeTableViewer;
+
+	private Button add;
+
+	private Button remove;
+
+	private ArrayList tableList = new ArrayList();
+
+	public void dispose() {
+		super.dispose();
+		fUnchecked.dispose();
+		fChecked.dispose();
+	}
+
+	public ChooseTableWizardPage(IDataModel model, String pageName) {
+		super(model, pageName);
+		setDescription(IEJBAnnotationConstants.ADD_CMP_TABLE_WIZARD_PAGE_DESC);
+		this.setTitle(IEJBAnnotationConstants.ADD_CMP_TABLE_WIZARD_PAGE_TITLE);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.ibm.wtp.common.ui.wizard.WTPWizardPage#getValidationPropertyNames()
+	 */
+	protected String[] getValidationPropertyNames() {
+		return new String[] { IContainerManagedEntityBeanDataModelProperties.ATTRIBUTES,
+				IContainerManagedEntityBeanDataModelProperties.TABLE };
+	}
+
+	protected List getAttributes() {
+		List attr = (List) this.getDataModel().getProperty(IContainerManagedEntityBeanDataModelProperties.ATTRIBUTES);
+		if (!this.getDataModel().isPropertySet(IContainerManagedEntityBeanDataModelProperties.ATTRIBUTES)) {
+			this.getDataModel().setProperty(IContainerManagedEntityBeanDataModelProperties.ATTRIBUTES, attr);
+		}
+		return attr;
+	}
+
+	protected Composite createTopLevelComposite(Composite parent) {
+		Composite composite = new Composite(parent, SWT.NULL);
+		composite.setLayout(new GridLayout());
+		GridData data = new GridData(GridData.FILL_BOTH);
+		data.widthHint = 300;
+		composite.setLayoutData(data);
+
+		Composite group = new Composite(composite, SWT.NULL);
+		group.setLayout(new GridLayout(2, false));
+		group.setLayoutData(new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL));
+
+		createCatalogGroup(group);
+		attributeTable = createTable(composite);
+		attributeTableViewer = createTableViewer(attributeTable);
+
+		return composite;
+	}
+
+	protected void createCatalogGroup(Composite composite) {
+
+		// description
+		Label catalogLabel = new Label(composite, SWT.LEFT);
+		catalogLabel.setText(IEJBAnnotationConstants.CMP_TABLE_CHOOSE_TABLE);
+		catalogLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
+
+		if (((AddContainerManagedEntityEjbWizard) this.getWizard()).isJavaBean()) {
+			catalogButton = new Combo(composite, SWT.DROP_DOWN);
+
+		} else {
+			catalogButton = new Combo(composite, SWT.DROP_DOWN);// |
+			// SWT.READ_ONLY)
+		}
+		synchHelper.synchCombo(catalogButton, IContainerManagedEntityBeanDataModelProperties.TABLE, null);
+		catalogButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_VERTICAL));
+		catalogButton.addSelectionListener(new SelectionListener() {
+			public void widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent e) {
+				if (tableList.size() >= 1 && catalogButton.getSelectionIndex() != -1) {
+					fillTableWith((String) tableList.get(catalogButton.getSelectionIndex()));
+					attributeTable.removeAll();
+					attributeTable.setData(getAttributes());
+					attributeTableViewer.setInput(getAttributes());
+					attributeTableViewer.refresh();
+				}
+			}
+
+			public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
+				this.widgetDefaultSelected(e);
+			}
+		});
+		updateTables();
+
+	}
+
+	private void fillTableWith(String tableName) {
+		Connection connection = null;
+		ArrayList attributes = new ArrayList();
+		if (!((AddContainerManagedEntityEjbWizard) this.getWizard()).isJavaBean()) {
+			try {
+				IConnectionProfile connectionInfo = getConnectionInfo();
+				if (connectionInfo == null)
+					return;
+//				String passw = connectionInfo.getPassword();
+//				if (passw == null || passw.length() == 0)
+//					passw = "password";
+//				connectionInfo.setPassword(passw);
+
+				IStatus connectionStatus = connectionInfo.connect();
+
+				if (! connectionStatus.isOK())
+					return;
+				IConnection dbConnection = connectionInfo.getManagedConnection("java.sql.Connection").getConnection();
+				connection = (Connection)dbConnection.getRawConnection();
+				
+				DatabaseMetaData metaData = connection.getMetaData();
+				String schema = null;
+				int scIndex = tableName.indexOf(".");
+				if (scIndex >= 0) {
+					schema = tableName.substring(0, scIndex);
+					tableName = tableName.substring(scIndex + 1);
+				}
+
+				ResultSet columns = metaData.getColumns(null, schema, tableName, "%");
+				while (columns.next()) {
+					int datasize = columns.getInt("COLUMN_SIZE");
+					int digits = columns.getInt("DECIMAL_DIGITS");
+
+					CMPAttributeDelegate atr = new CMPAttributeDelegate();
+					atr.setName(columns.getString("COLUMN_NAME").toLowerCase());
+					atr.setAttributeType(CMPUtils.getAttributeType(columns.getInt("DATA_TYPE")));
+					atr.setJdbcType(CMPUtils.getSqlType(columns.getInt("DATA_TYPE")));
+					atr.setSqlType(columns.getString("TYPE_NAME"));
+					atr.setColumnName(columns.getString("COLUMN_NAME"));
+					atr.setDecimalDigits(digits);
+					atr.setColumnSize(datasize);
+					attributes.add(atr);
+				}
+				ResultSet primaryKeys = metaData.getPrimaryKeys(null, schema, tableName);
+				while (primaryKeys.next()) {
+					String key = primaryKeys.getString("COLUMN_NAME");
+					Iterator iterator = attributes.iterator();
+					while (iterator.hasNext()) {
+						CMPAttributeDelegate attr = (CMPAttributeDelegate) iterator.next();
+						if (key.equals(attr.getColumnName()))
+							attr.setKey(true);
+					}
+				}
+
+			} catch (Throwable ex) {
+				ex.printStackTrace();
+				MessageDialog.openError(this.getShell(), IEJBAnnotationConstants.CANNOT_CONNECT,
+						IEJBAnnotationConstants.CHECK_PROPERTIES);
+			} finally {
+//				if (connection != null)
+//					try {
+//						connection.close();
+//					} catch (SQLException e) {
+//					}
+			}
+		}
+		this.getDataModel().setProperty(IContainerManagedEntityBeanDataModelProperties.ATTRIBUTES, attributes);
+
+	}
+
+	public void updateTables() {
+		if (catalogButton == null)
+			return;
+		if (((AddContainerManagedEntityEjbWizard) this.getWizard()).isJavaBean()) {
+			catalogButton.removeAll();
+			return;
+		}
+		Connection connection = null;
+		tableList = new ArrayList();
+		try {
+			IConnectionProfile connectionInfo = getConnectionInfo();
+			if (connectionInfo == null)
+				return;
+
+			IStatus connectionStatus = connectionInfo.connect();
+
+			if (! connectionStatus.isOK())
+				return;
+			
+			IConnection dbConnection = connectionInfo.getManagedConnection("java.sql.Connection").getConnection();
+			connection = (Connection)dbConnection.getRawConnection();
+			DatabaseMetaData metaData = connection.getMetaData();
+			String[] names = { "TABLE" };
+			ResultSet rs = metaData.getSchemas();
+			ResultSet tableNames = null;
+			while (rs.next()) {
+
+				tableNames = metaData.getTables(null, rs.getString(1), "%", names);
+				while (tableNames.next()) {
+					tableList.add(rs.getString(1) + "." + tableNames.getString("TABLE_NAME"));
+				}
+			}
+
+			ResultSet sqlTypeNames = metaData.getTypeInfo();
+			ArrayList types = new ArrayList();
+			while (sqlTypeNames.next()) {
+				types.add(sqlTypeNames.getString("TYPE_NAME"));
+			}
+
+			sqlTypeNames = metaData.getUDTs(null, "%", "%", null);
+			while (sqlTypeNames.next()) {
+				types.remove(sqlTypeNames.getString("TYPE_NAME"));
+			}
+			sqlTypes = (String[]) types.toArray(new String[types.size()]);
+
+		} catch (Throwable ex) {
+			ex.printStackTrace();
+			MessageDialog.openError(this.getShell(), IEJBAnnotationConstants.CANNOT_CONNECT, IEJBAnnotationConstants.CHECK_PROPERTIES);
+		} finally {
+//			if (dbConnection != null)
+//				try {
+//					connection.close();
+//				} catch (SQLException e) {
+//				}
+		}
+		catalogButton.setItems((String[]) tableList.toArray(new String[tableList.size()]));
+		catalogButton.select(0);
+		if (tableList.size() > 0) {
+			fillTableWith((String) tableList.get(0));
+			catalogButton.setEnabled(true);
+			if (attributeTableViewer != null)
+				attributeTableViewer.refresh();
+		}
+
+		if (remove != null)
+			remove.setEnabled(false);
+
+	}
+
+	public IConnectionProfile getConnectionInfo() {
+		return ((AddContainerManagedEntityEjbWizard) getWizard()).getConnectionInfo();
+	}
+
+	/**
+	 * Create the Table
+	 */
+	private Table createTable(Composite parent) {
+		int style = SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.HIDE_SELECTION;
+
+		GridLayout layout;
+		GridData gridData;
+		Group libraryPanel = new Group(parent, SWT.NONE);
+		libraryPanel.setText(IEJBAnnotationConstants.CMP_MANAGED_FIELDS);
+		layout = new GridLayout(2, false);
+		libraryPanel.setLayout(layout);
+		gridData = new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL);
+		gridData.horizontalSpan = 2;
+		gridData.heightHint = 300;
+		libraryPanel.setLayoutData(gridData);
+
+		attributeTable = new Table(libraryPanel, style);
+		gridData = new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL);
+		gridData.horizontalSpan = 2;
+		attributeTable.setLayoutData(gridData);
+
+		attributeTable.setLinesVisible(true);
+		attributeTable.setHeaderVisible(true);
+
+		// 1st column with image/checkboxes - NOTE: The SWT.CENTER has no
+		// effect!!
+		TableColumn column = new TableColumn(attributeTable, SWT.LEFT, 0);
+		column.setText(IEJBAnnotationConstants.ATTRIBUTE_NAME);
+		column.setWidth(60);
+
+		// 2 column with task Description
+		column = new TableColumn(attributeTable, SWT.LEFT, 1);
+		column.setText(IEJBAnnotationConstants.ATTRIBUTE_COLUMN);
+		column.setWidth(60);
+
+		column = new TableColumn(attributeTable, SWT.LEFT, 2);
+		column.setText(IEJBAnnotationConstants.ATTRIBUTE_TYPE);
+		column.setWidth(120);
+
+		column = new TableColumn(attributeTable, SWT.LEFT, 3);
+		column.setText(IEJBAnnotationConstants.ATTRIBUTE_JDBCTYPE);
+		column.setWidth(80);
+
+		column = new TableColumn(attributeTable, SWT.LEFT, 4);
+		column.setText(IEJBAnnotationConstants.ATTRIBUTE_SQLTYPE);
+		column.setWidth(80);
+
+		// 2 column with task Description
+		column = new TableColumn(attributeTable, SWT.LEFT, 5);
+		column.setText(IEJBAnnotationConstants.ATTRIBUTE_COLUMNSIZE);
+		column.setWidth(60);
+
+		column = new TableColumn(attributeTable, SWT.LEFT, 6);
+		column.setText(IEJBAnnotationConstants.ATTRIBUTE_DECIMALDIGITS);
+		column.setWidth(60);
+
+		column = new TableColumn(attributeTable, SWT.CENTER, 7);
+		column.setText(IEJBAnnotationConstants.ATTRIBUTE_READONLY);
+		column.setWidth(80);
+
+		column = new TableColumn(attributeTable, SWT.CENTER, 8);
+		column.setText(IEJBAnnotationConstants.ATTRIBUTE_ISKEY);
+		column.setWidth(80);
+		addAttributeButtons(libraryPanel);
+		attributeTable.addSelectionListener(new SelectionListener() {
+
+			public void widgetSelected(SelectionEvent e) {
+				attributeTable.getSelectionCount();
+				remove.setEnabled(attributeTable.getSelectionCount() > 0);
+			}
+
+			public void widgetDefaultSelected(SelectionEvent e) {
+				widgetSelected(e);
+
+			}
+		});
+		return attributeTable;
+	}
+
+	private void addAttributeButtons(Composite parent) {
+		add = new Button(parent, SWT.PUSH);
+		add.setText(IEJBAnnotationConstants.ATTRIBUTE_ADD); //$NON-NLS-1$
+		GridData data = new GridData();
+		data.horizontalSpan = 1;
+		data.horizontalAlignment = GridData.BEGINNING;
+		add.setLayoutData(data);
+		add.addSelectionListener(new SelectionListener() {
+			public void widgetDefaultSelected(SelectionEvent e) {
+				widgetSelected(e);
+			}
+
+			public void widgetSelected(SelectionEvent e) {
+				CMPAttributeDelegate atr = new CMPAttributeDelegate();
+				getAttributes().add(atr);
+				ChooseTableWizardPage.this.validatePage();
+				attributeTableViewer.refresh();
+			}
+		});
+		remove = new Button(parent, SWT.PUSH);
+		remove.setText(IEJBAnnotationConstants.ATTRIBUTE_REMOVE); //$NON-NLS-1$
+		data = new GridData();
+		data.horizontalSpan = 1;
+		data.horizontalAlignment = GridData.BEGINNING;
+		remove.setLayoutData(data);
+		remove.addSelectionListener(new SelectionListener() {
+			public void widgetDefaultSelected(SelectionEvent e) {
+				widgetSelected(e);
+			}
+
+			public void widgetSelected(SelectionEvent e) {
+				TableItem ti = attributeTable.getSelection()[0];
+				CMPAttributeDelegate attributeDelegate = (CMPAttributeDelegate) ti.getData();
+				getAttributes().remove(attributeDelegate);
+				ChooseTableWizardPage.this.validatePage();
+				attributeTableViewer.refresh();
+				remove.setEnabled(false);
+
+			}
+		});
+		remove.setEnabled(false);
+	}
+
+	/**
+	 * Create the TableViewer
+	 */
+	private TableViewer createTableViewer(Table table) {
+
+		TableViewer tableViewer = new TableViewer(table);
+		tableViewer.setUseHashlookup(true);
+
+		tableViewer.setColumnProperties(columnNames);
+		tableViewer.setLabelProvider(new FieldLabelProvider());
+		tableViewer.setContentProvider(new FieldContentProvider());
+
+		CellEditor[] editors = new CellEditor[columnNames.length];
+
+		TextCellEditor textEditor = new TextCellEditor(table);
+		((Text) textEditor.getControl()).setTextLimit(200);
+		editors[0] = textEditor;
+
+		TextCellEditor textEditor2 = new TextCellEditor(table);
+		((Text) textEditor2.getControl()).setTextLimit(200);
+		editors[1] = textEditor2;
+
+		// //$NON-NLS-1$
+		//
+		TextCellEditor textEditor3 = new TextCellEditor(table);
+		((Text) textEditor3.getControl()).setTextLimit(200);
+		IProject project = ((AddContainerManagedEntityEjbWizard) this.getWizard()).getDefaultEjbProject();
+		IPackageFragmentRoot[] sources = J2EEProjectUtilities.getSourceContainers(project);
+		if (sources != null && sources.length >= 1) {
+			JavaTypeCompletionProcessor fFieldTypeCompletionProcessor = new JavaTypeCompletionProcessor(false, false);
+			fFieldTypeCompletionProcessor.setPackageFragment(sources[0].getPackageFragment(""));
+			ControlContentAssistHelper.createTextContentAssistant(((Text) textEditor3.getControl()), fFieldTypeCompletionProcessor);
+		}
+		editors[2] = textEditor3;
+
+		editors[3] = new ComboBoxCellEditor(table, CMPUtils.jdbcTypes, SWT.READ_ONLY);
+
+		// TextCellEditor textEditor4 = new TextCellEditor(table);
+		// ((Text) textEditor4.getControl()).setTextLimit(100);
+		// editors[4] = textEditor4;
+		editors[4] = new ComboBoxCellEditor(table, sqlTypes, SWT.READ_ONLY);
+
+		TextCellEditor textEditor5 = new TextCellEditor(table);
+		((Text) textEditor5.getControl()).setTextLimit(200);
+		editors[5] = textEditor5;
+
+		TextCellEditor textEditor6 = new TextCellEditor(table);
+		((Text) textEditor6.getControl()).setTextLimit(200);
+		editors[6] = textEditor6;
+
+		editors[7] = new CheckboxCellEditor(table, SWT.CENTER);
+
+		editors[8] = new CheckboxCellEditor(table, SWT.CENTER);
+
+		// Assign the cell editors to the viewer
+		tableViewer.setCellEditors(editors);
+		// Set the cell modifier for the viewer
+		tableViewer.setCellModifier(new FieldCellModifier());
+		tableViewer.setInput(getAttributes());
+		return tableViewer;
+	}
+
+	protected static String[] columnNames = { IEJBAnnotationConstants.ATTRIBUTE_NAME, IEJBAnnotationConstants.ATTRIBUTE_COLUMN,
+			IEJBAnnotationConstants.ATTRIBUTE_TYPE, IEJBAnnotationConstants.ATTRIBUTE_SQLTYPE,
+			IEJBAnnotationConstants.ATTRIBUTE_JDBCTYPE, IEJBAnnotationConstants.ATTRIBUTE_COLUMNSIZE,
+			IEJBAnnotationConstants.ATTRIBUTE_DECIMALDIGITS, IEJBAnnotationConstants.ATTRIBUTE_READONLY,
+			IEJBAnnotationConstants.ATTRIBUTE_ISKEY };
+
+	protected int getColumnIndex(String columName) {
+		if (columName == null)
+			return -1;
+		for (int i = 0; i < columnNames.length; i++) {
+			String col = columnNames[i];
+			if (columName.equals(col))
+				return i;
+
+		}
+		return -1;
+	}
+
+	public class FieldContentProvider implements IStructuredContentProvider {
+		public void dispose() {
+		}
+
+		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+		}
+
+		public Object[] getElements(Object parent) {
+			return getAttributes().toArray();
+		}
+	}
+
+	public class FieldLabelProvider extends LabelProvider implements ITableLabelProvider {
+		public String getColumnText(Object obj, int index) {
+
+			CMPAttributeDelegate fieldMapping = (CMPAttributeDelegate) obj;
+			switch (index) {
+			case 0: // Local
+				return fieldMapping.getName();
+			case 1: // Local
+				return fieldMapping.getColumnName();
+			case 2: // Local
+				return fieldMapping.getAttributeType();
+			case 3: // Local
+				return fieldMapping.getJdbcType();
+			case 4: // Local
+				return fieldMapping.getSqlType();
+			case 5:
+				if (fieldMapping.isVariableSizedType()) {
+					return "" + fieldMapping.getColumnSize();
+				}
+				return "";
+			case 6:
+				if (fieldMapping.isDecimal()) {
+					return "" + fieldMapping.getDecimalDigits();
+				}
+				return "";
+			case 7: // Local
+				return "";
+			case 8: // Local
+				return "";
+			}
+			return "";
+		}
+
+		public String getColumnText(Viewer v, Object obj, int index) {
+			return getColumnText(obj, index);
+		}
+
+		public Image getColumnImage(Object obj, int index) {
+			CMPAttributeDelegate fieldMapping = (CMPAttributeDelegate) obj;
+			switch (index) {
+			case 7: // Local
+				if (fieldMapping.isReadOnly())
+					return fChecked;
+				else
+					return fUnchecked;
+
+			case 8: // Local
+				if (fieldMapping.isKey())
+					return fChecked;
+				else
+					return fUnchecked;
+			case 9: // Local
+				if (fieldMapping.isTransient())
+					return fChecked;
+				else
+					return fUnchecked;
+			}
+			return null;
+		}
+
+		public Image getColumnImage(Viewer v, Object obj, int index) {
+			return getColumnImage(obj, index);
+		}
+	}
+
+	public class FieldCellModifier implements ICellModifier {
+
+		public boolean canModify(Object element, String property) {
+			CMPAttributeDelegate attribute = (CMPAttributeDelegate) element;
+			if (IEJBAnnotationConstants.ATTRIBUTE_DECIMALDIGITS.equals(property)) {
+				if (attribute.isDecimal())
+					return true;
+				return false;
+			}
+			if (IEJBAnnotationConstants.ATTRIBUTE_COLUMNSIZE.equals(property)) {
+				if (attribute.isVariableSizedType())
+					return true;
+				return false;
+			}
+			return true;
+		}
+
+		public Object getValue(Object element, String property) {
+			int columnIndex = getColumnIndex(property);
+			CMPAttributeDelegate fieldMapping = (CMPAttributeDelegate) element;
+
+			Object result = "";
+			switch (columnIndex) {
+
+			case 0:
+				return fieldMapping.getName();
+
+			case 1:
+				return fieldMapping.getColumnName();
+			case 2:
+				return fieldMapping.getAttributeType();
+			case 3:
+				String val = fieldMapping.getJdbcType();
+				for (int i = 0; i < CMPUtils.jdbcTypes.length; i++) {
+					String t = CMPUtils.jdbcTypes[i];
+					if (t.equals(val))
+						return new Integer(i);
+				}
+				return new Integer(0);
+			case 4:
+				val = fieldMapping.getSqlType();
+				for (int i = 0; i < sqlTypes.length; i++) {
+					String t = sqlTypes[i];
+					if (t.equals(val))
+						return new Integer(i);
+				}
+				return new Integer(0);
+			case 5:
+				if (fieldMapping.isVariableSizedType()) {
+					return "" + fieldMapping.getColumnSize();
+				}
+				return "";
+			case 6:
+				if (fieldMapping.isDecimal()) {
+					return "" + fieldMapping.getDecimalDigits();
+				}
+				return "";
+			case 7:
+				return Boolean.valueOf(fieldMapping.isReadOnly());
+			case 8:
+				return Boolean.valueOf(fieldMapping.isKey());
+			case 9:
+				return Boolean.valueOf(fieldMapping.isTransient());
+			default:
+				result = "";
+			}
+			return result;
+		}
+
+		/**
+		 * @see org.eclipse.jface.viewers.ICellModifier#modify(java.lang.Object,
+		 *      java.lang.String, java.lang.Object)
+		 */
+		public void modify(Object element, String property, Object value) {
+			int columnIndex = getColumnIndex(property);
+			TableItem tItem = (TableItem) element;
+			CMPAttributeDelegate fieldMapping = (CMPAttributeDelegate) tItem.getData();
+
+			switch (columnIndex) {
+
+			case 0:
+				fieldMapping.setName((String) value);
+				break;
+
+			case 1:
+				fieldMapping.setColumnName((String) value);
+				break;
+			case 2:
+				fieldMapping.setAttributeType((String) value);
+				break;
+			case 3:
+				fieldMapping.setJdbcType(CMPUtils.jdbcTypes[((Integer) value).intValue()]);
+				int sqli = CMPUtils.getSqlTypeFromJDBC(((Integer) value).intValue());
+				if (sqli >= 0) {
+					fieldMapping.setSqlType(sqlTypes[sqli]);
+					tItem.getParent().redraw();
+				}
+				break;
+			case 4:
+				String sqlType = sqlTypes[((Integer) value).intValue()];
+				fieldMapping.setSqlType(sqlType);
+				break;
+			case 5:
+				if (fieldMapping.isVariableSizedType()) {
+					int colSize = Integer.parseInt((String) value);
+					fieldMapping.setColumnSize(colSize);
+				}
+				break;
+			case 6:
+				if (fieldMapping.isDecimal()) {
+					int decDigits = Integer.parseInt((String) value);
+					fieldMapping.setDecimalDigits(decDigits);
+				}
+				break;
+			case 7:
+				boolean readValue = ((Boolean) value).booleanValue();
+				fieldMapping.setReadOnly(readValue);
+				break;
+			case 8:
+				boolean newValue = ((Boolean) value).booleanValue();
+				fieldMapping.setKey(newValue);
+				break;
+			case 9:
+				fieldMapping.setTransient(((Boolean) value).booleanValue());
+				break;
+			}
+			ChooseTableWizardPage.this.validatePage();
+			attributeTableViewer.refresh();
+		}
+
+	}
+
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/cmp/wizards/ConnectionSelectionPage.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/cmp/wizards/ConnectionSelectionPage.java
new file mode 100644
index 0000000..1dd86c6
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/cmp/wizards/ConnectionSelectionPage.java
@@ -0,0 +1,387 @@
+/***************************************************************************************************
+ * Copyright (c) 2005, 2006 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ *				 David Schneider, david.schneider@unisys.com - [142500] WTP properties pages fonts don't follow Eclipse preferences
+ **************************************************************************************************/
+package org.eclipse.jst.j2ee.ejb.annotation.ui.internal.cmp.wizards;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.Properties;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.datatools.connectivity.IConnectionProfile;
+import org.eclipse.datatools.connectivity.ProfileManager;
+import org.eclipse.datatools.connectivity.ui.actions.AddProfileViewAction;
+import org.eclipse.datatools.connectivity.ui.wizards.NewConnectionProfileWizard;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.messages.IEJBAnnotationConstants;
+import org.eclipse.jst.j2ee.ejb.annotation.ui.internal.EjbAnnotationsUiPlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.List;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.swt.widgets.Widget;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizardPage;
+
+
+public class ConnectionSelectionPage extends DataModelWizardPage implements SelectionListener {
+
+	protected boolean myFirstTime = true;
+
+	protected Button reconnectButton;
+
+	private Button newConnectionButton;
+
+	private boolean connected;
+
+	private List existingConnectionsList;
+
+	private Hashtable existingConnections;
+
+	private Label propertiesLabel;
+
+	private Table connectionPropertiesTable;
+
+	public ConnectionSelectionPage(IDataModel model, String pageName, String title, ImageDescriptor titleImage) {
+		super(model, pageName, title, titleImage);
+	}
+
+	public ConnectionSelectionPage(IDataModel model, String pageName) {
+		super(model, pageName);
+		setDescription(IEJBAnnotationConstants.CMP_CONNECTION_PAGE_DESC);
+		this.setTitle(IEJBAnnotationConstants.CMP_CONNECTION_PAGE_TITLE);
+	}
+
+	public Composite createTopLevelComposite(Composite parent) {
+		Composite composite = new Composite(parent, SWT.NONE);
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 1;
+		layout.verticalSpacing = 5;
+		composite.setLayout(layout);
+		composite.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+		newConnectionButton = new Button(composite, SWT.PUSH);
+		newConnectionButton.setText(IEJBAnnotationConstants.CMP_CONNECTION_NEW_BUTTON); //$NON-NLS-1$
+		GridData gd = new GridData();
+		gd.verticalAlignment = GridData.BEGINNING;
+		newConnectionButton.setLayoutData(gd);
+
+		Composite indentationComposite = new Composite(composite, SWT.NONE);
+		layout = new GridLayout();
+		layout.numColumns = 2;
+		layout.verticalSpacing = 5;
+		indentationComposite.setLayout(layout);
+		indentationComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+		Group existingConnectionsGroup = new Group(indentationComposite, SWT.NONE);
+		existingConnectionsGroup.setText(IEJBAnnotationConstants.CMP_CONNECTION_AVAILABLE); //$NON-NLS-1$
+		layout = new GridLayout();
+		layout.numColumns = 1;
+		layout.verticalSpacing = 5;
+		existingConnectionsGroup.setLayout(layout);
+		gd = new GridData(GridData.FILL_BOTH);
+		existingConnectionsGroup.setLayoutData(gd);
+
+		existingConnectionsList = new List(existingConnectionsGroup, SWT.BORDER | SWT.V_SCROLL);
+		gd = new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL);
+		gd.heightHint = 100;
+		existingConnectionsList.setLayoutData(gd);
+
+		propertiesLabel = new Label(existingConnectionsGroup, SWT.NONE);
+		propertiesLabel.setText(IEJBAnnotationConstants.CMP_CONNECTION_PROPERTIES); //$NON-NLS-1$
+		gd = new GridData();
+		propertiesLabel.setLayoutData(gd);
+
+		connectionPropertiesTable = new Table(existingConnectionsGroup, SWT.BORDER);
+		gd = new GridData(GridData.FILL_BOTH);
+		connectionPropertiesTable.setLayoutData(gd);
+		connectionPropertiesTable.setLinesVisible(true);
+		connectionPropertiesTable.setHeaderVisible(true);
+
+		TableColumn tc1 = new TableColumn(connectionPropertiesTable, SWT.NONE);
+		tc1.setText(IEJBAnnotationConstants.CMP_CONNECTION_PROPERTY); //$NON-NLS-1$
+		tc1.setResizable(true);
+		tc1.setWidth(140);
+
+		TableColumn tc2 = new TableColumn(connectionPropertiesTable, SWT.NONE);
+		tc2.setText(IEJBAnnotationConstants.CMP_CONNECTION_VALUE); //$NON-NLS-1$
+		tc2.setResizable(true);
+		tc2.setWidth(250);
+
+		initializeDialogUnits(composite);
+		setControl(composite);
+
+		newConnectionButton.addListener(SWT.Selection, this);
+		existingConnectionsList.addListener(SWT.Selection, this);
+
+		newConnectionButton.setSelection(true);
+		initializeValues();
+		setPageComplete(true);
+		addReconnectButton(composite);
+		Dialog.applyDialogFont(parent);
+		return composite;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
+	 */
+	class NewConnectionWizard extends NewConnectionProfileWizard {
+
+		public void addCustomPages() {
+		}
+
+		public Properties getProfileProperties() {
+			return new Properties();
+		}
+
+	}
+
+	public void handleEvent(Event event) {
+		Widget source = event.widget;
+		if (source == newConnectionButton) {
+			try {
+				EjbAnnotationsUiPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage().showView(
+						"org.eclipse.wst.rdb.server.ui.navigator.serverExplorer");
+			} catch (PartInitException e) {
+			}
+			IConnectionProfile[] profiles = ProfileManager.getInstance().getProfilesByCategory(
+					"org.eclipse.datatools.connectivity.db.category");
+			// ConnectionInfo[] infos =
+			// ProfileConnectionManager.getProfileConnectionManagerInstance().getAllNamedConnectionInfo();
+			java.util.List nameList = new ArrayList(profiles.length);
+			for (int i = 0, n = profiles.length; i < n; i++) {
+				if (!nameList.contains(profiles[i].getName())) {
+					nameList.add(profiles[i].getName().toLowerCase());
+				}
+			}
+			String[] names = (String[]) nameList.toArray(new String[nameList.size()]);
+			AddProfileViewAction action = new AddProfileViewAction("org.eclipse.datatools.connectivity.db.category");
+			action.run();
+			// NewConnectionProfileWizard wizard = new NewConnectionWizard();
+			// wizard.init(PlatformUI.getWorkbench(), null);
+			// wizard.setNeedsProgressMonitor(false);
+			// WizardDialog dialog = new WizardDialog(this.getShell(), wizard);
+			// dialog.create();
+			// dialog.open();
+			initializeValues();
+		} else if (source == existingConnectionsList) {
+			updateConnectionProperties();
+			setPageComplete(true);
+			reconnectButton.setEnabled(true);
+		}
+
+		reconnectButton.setEnabled(true);
+		isValidConnection();
+	}
+
+	/**
+	 * Adds the reconnection button
+	 * 
+	 * @param parent
+	 *            the parent composite
+	 */
+	private void addReconnectButton(Composite parent) {
+		reconnectButton = new Button(parent, SWT.PUSH);
+		reconnectButton.setText(IEJBAnnotationConstants.CMP_CONNECTION_VALUE_BUTTON); 
+		GridData data = new GridData();
+		data.horizontalSpan = 2;
+		data.horizontalAlignment = GridData.BEGINNING;
+		reconnectButton.setLayoutData(data);
+		reconnectButton.addSelectionListener(this);
+	}
+
+	public boolean isConnected() {
+		return connected;
+	}
+
+	/**
+	 * Calls when default selection occurs (eg return in Text)
+	 * 
+	 * @param evt
+	 *            the Selection event
+	 */
+	public void widgetDefaultSelected(SelectionEvent evt) {
+		// ignore
+	}
+
+	/**
+	 * Calls when selection occurs
+	 * 
+	 * @param evt
+	 *            the selection event
+	 */
+	public void widgetSelected(SelectionEvent evt) {
+		Object source = evt.getSource();
+		if (source == reconnectButton) {
+			IConnectionProfile info = getSelectedConnection();
+			if (true) {
+				// if (userDialog.open() == Window.OK) {
+				// String us = userDialog.getUserNameInformation();
+				// String pa = userDialog.getPasswordInformation();
+				// info.setUserName(us);
+				// info.setPassword(pa);
+				// // try to connect
+				try {
+					this.getSelectedConnection().connect(null);
+					reconnectButton.setEnabled(false);
+					connected = true;
+				} catch (Exception ex) {
+					reconnectButton.setEnabled(true);
+					connected = false;
+					MessageDialog.openError(this.getShell(), "Cannot connect", // TODO:
+							// TRANSLATE
+							ex.getMessage());
+				}
+				isValidConnection();
+			}
+		}
+	}
+
+	private void initializeValues() {
+		existingConnectionsList.removeAll();
+		IConnectionProfile[] connInfos = getConnectionsToDisplay();
+		if (connInfos != null) {
+			existingConnections = new Hashtable();
+			java.util.List sortedConnections = Arrays.asList(connInfos);
+			sortConnections(sortedConnections);
+			Iterator connections = sortedConnections.iterator();
+			while (connections.hasNext()) {
+				IConnectionProfile con = (IConnectionProfile) connections.next();
+				existingConnections.put(con.getName(), con);
+				existingConnectionsList.add(con.getName());
+			}
+		}
+
+		if (existingConnectionsList.getItemCount() > 0) {
+			existingConnectionsList.select(0);
+			updateConnectionProperties();
+		}
+		newConnectionButton.setSelection(true);
+	}
+
+	protected void sortConnections(java.util.List connections) {
+		Comparator c = new Comparator() {
+			public int compare(Object o1, Object o2) {
+				String s1 = ((IConnectionProfile) o1).getName();
+				String s2 = ((IConnectionProfile) o2).getName();
+				return s1.compareToIgnoreCase(s2);
+			}
+		};
+
+		Collections.sort(connections, c);
+	}
+
+	/**
+	 * Returns either the existing connection selected by the user. If the user
+	 * has indicated they would like to use a new connection then this method
+	 * returns null.
+	 * 
+	 * @return A ConnectionInfo object representing the users selection in the
+	 *         wizard page
+	 */
+	public IConnectionProfile getSelectedConnection() {
+		if (existingConnections == null || existingConnectionsList == null || existingConnectionsList.getSelection().length == 0)
+			return null;
+		IConnectionProfile connection = (IConnectionProfile) existingConnections.get(existingConnectionsList.getSelection()[0]);
+		return connection;
+	}
+
+	/**
+	 * Returns the list of existing connections to display to the user. Override
+	 * this method to provide a filtered list of connections.
+	 * 
+	 * @return A array of ConnectionInfo objects that should be displayed in the
+	 *         existing connections list
+	 */
+	protected IConnectionProfile[] getConnectionsToDisplay() {
+		return ProfileManager.getInstance().getProfilesByCategory("org.eclipse.datatools.connectivity.db.category");
+	}
+
+	/**
+	 * Refreshes this page
+	 */
+	public void refresh() {
+		reconnectButton.setEnabled(true);
+		connected = false;
+		initializeValues();
+		isValidConnection();
+	}
+
+	private void updateConnectionProperties() {
+		connectionPropertiesTable.removeAll();
+		if (existingConnectionsList.getSelectionIndex() > -1) {
+			IConnectionProfile selectedConnection = (IConnectionProfile) existingConnections.get((String) existingConnectionsList
+					.getSelection()[0]);
+			if (selectedConnection != null) {
+				Properties properties = selectedConnection.getBaseProperties();
+				if (properties != null) {
+					Enumeration keys = properties.keys();
+					while (keys.hasMoreElements()) {
+						Object pkey = keys.nextElement();
+						TableItem tableItem = new TableItem(connectionPropertiesTable, SWT.NONE);
+						tableItem.setText(new String[] { pkey.toString(), "" + properties.getProperty((String) pkey) });
+					}
+				}
+			}
+		}
+	}
+
+	protected String[] getValidationPropertyNames() {
+		return null;
+	}
+
+	public boolean isPageComplete() {
+		return connected;
+		// return this.isValidConnection();
+	}
+
+	protected boolean isValidConnection() {
+		boolean isOK = false;
+		try {
+			IConnectionProfile connectionInfo = this.getSelectedConnection();
+			if (connectionInfo != null) {
+				isOK = this.getSelectedConnection().isConnected();
+			}
+		} catch (Throwable e) {
+		}
+		if (isOK) {
+			this.setErrorMessage(null);
+			setMessage("Connected succesfully", IStatus.OK);// TODO: TRANSLATE
+			connected = true;
+			this.setPageComplete(true);
+			return true;
+		}
+		this.setErrorMessage("No Connection"); // TODO: TRANSLATE
+		connected = false;
+		this.setPageComplete(false);
+		return false;
+
+	}
+
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/preferences/AnnotationPreferencePage.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/preferences/AnnotationPreferencePage.java
new file mode 100644
index 0000000..81c0c2a
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/preferences/AnnotationPreferencePage.java
@@ -0,0 +1,203 @@
+/*******************************************************************************
+ * Copyright (c) 2002, 2003,2004,2005 Eteration Bilisim A.S.
+ * 
+ * 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:
+ *     Eteration Bilisim A.S. - initial API and implementation
+ *     Naci Dai
+ * For more information on eteration, please see
+ * <http://www.eteration.com/>.
+ ***************************************************************************/
+package org.eclipse.jst.j2ee.ejb.annotation.ui.internal.preferences;
+
+import java.util.Map;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.jface.preference.PreferencePage;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.preferences.AnnotationPreferenceStore;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.utility.AnnotationUtilities;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+import org.eclipse.ui.IWorkbenchPropertyPage;
+
+public class AnnotationPreferencePage extends PreferencePage implements
+		IWorkbenchPreferencePage,IWorkbenchPropertyPage, SelectionListener {
+
+	DialogPanel panel;
+
+	public AnnotationPreferencePage() {
+		super();
+		fProject= null;
+		fData= null;
+
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
+	 */
+	public void init(IWorkbench workbench) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+	 */
+	public void widgetSelected(SelectionEvent e) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
+	 */
+	public void widgetDefaultSelected(SelectionEvent e) {
+	}
+
+	protected Composite createContainer(Composite parent) {
+		panel = new DialogPanel(parent, SWT.NONE);
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 2;
+		layout.makeColumnsEqualWidth = false;
+		panel.setLayout(layout);
+		GridData gridData = new GridData(GridData.FILL_BOTH
+				| GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL);
+		panel.setLayoutData(gridData);
+		return panel;
+	}
+
+	/*
+	 * @see PreferencePage#createContents(Composite)
+	 */
+	protected Control createContents(Composite parent) {
+		// noDefaultAndApplyButton();
+		Composite composite = createContainer(parent);
+		GridLayout gridLayout = new GridLayout();
+		gridLayout.marginHeight = 0;
+		gridLayout.marginWidth = 0;
+		composite.setLayout(gridLayout);
+
+		Composite defPanel = new Composite(composite, SWT.NONE);
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 4;
+		defPanel.setLayout(layout);
+		GridData gridData = new GridData(GridData.FILL_BOTH
+				| GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL);
+		defPanel.setLayoutData(gridData);
+
+		//ResourceBundle bundle = ResourceBundle.getBundle("org.eclipse.jst.j2ee.ejb.annotation.ui.internal.preferences.preferences");
+
+		Label label = new Label(defPanel, SWT.WRAP);
+		gridData = new GridData();
+		gridData.horizontalSpan = 4;
+		label.setLayoutData(gridData);
+		label.setText(Messages.label_set_j2ee_annotation_preference);
+
+		panel.preferences = new Control[1];
+		panel.preferences[0] = panel
+				.createLabeledCombo(
+						1,
+						false,
+						true,
+						Messages.label_active_annotation_provider,
+						Messages.desc_active_annotation_provider,
+						AnnotationPreferenceStore
+								.getProperty(AnnotationPreferenceStore.ANNOTATIONPROVIDER),
+						AnnotationUtilities.getProviderNames(), defPanel);
+		final Combo annotationProvider = (Combo) panel.preferences[0];
+		ModifyListener listener = new ModifyListener() {
+
+			public void modifyText(ModifyEvent e) {
+				String provider = annotationProvider.getText();
+				AnnotationPreferencePage.this.setValid(provider != null);
+
+			}
+		};
+
+		annotationProvider.addModifyListener(listener);
+		return composite;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.preference.PreferencePage#isValid()
+	 */
+	public boolean isValid() {
+		return true;
+	}
+
+	public boolean performOk() {
+
+		String itemValue = "";
+
+		Combo combo = ((Combo) panel.preferences[0]);
+		itemValue = combo.getItem(combo.getSelectionIndex());
+		AnnotationPreferenceStore.setProperty(
+				AnnotationPreferenceStore.ANNOTATIONPROVIDER, itemValue);
+		return super.performOk();
+	}
+
+	private IProject fProject; // project or null
+	private Map fData; // page data
+		
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.IWorkbenchPropertyPage#getElement()
+	 */
+	public IAdaptable getElement() {
+		return fProject;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.IWorkbenchPropertyPage#setElement(org.eclipse.core.runtime.IAdaptable)
+	 */
+	public void setElement(IAdaptable element) {
+		fProject= (IProject) element.getAdapter(IResource.class);
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.preference.PreferencePage#applyData(java.lang.Object)
+	 */
+	public void applyData(Object data) {
+		if (data instanceof Map) {
+			fData= (Map) data;
+		}
+		
+ 	}
+	
+	protected Map getData() {
+		return fData;
+	}	
+	
+	protected boolean useProjectSettings() {
+		return isProjectPreferencePage();
+	}
+	
+	protected boolean isProjectPreferencePage() {
+		return fProject != null;
+	}
+	
+	protected IProject getProject() {
+		return fProject;
+	}
+
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/preferences/DialogPanel.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/preferences/DialogPanel.java
new file mode 100644
index 0000000..f712774
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/preferences/DialogPanel.java
@@ -0,0 +1,184 @@
+/*******************************************************************************
+ * Copyright (c) 2002, 2003,2004,2005 Eteration Bilisim A.S.
+ * 
+ * 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:
+ *     Eteration Bilisim A.S. - initial API and implementation
+ *     Naci Dai
+ * For more information on eteration, please see
+ * <http://www.eteration.com/>.
+ ***************************************************************************/
+package org.eclipse.jst.j2ee.ejb.annotation.ui.internal.preferences;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.DirectoryDialog;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+
+
+
+public class DialogPanel extends Composite {
+
+	public Control preferences[] = null;
+
+	public Button fActive[] = null;
+
+	public DialogPanel(Composite parent, int style) {
+		super(parent, style);
+	}
+
+	public Text createLabeledText(int i, boolean checked, String title,
+			String tip, String value, Composite defPanel) {
+		return this.createLabeledText(i, true, checked, title, tip, value,
+				defPanel);
+	}
+
+	public Text createLabeledText(int i, boolean addActiveButton,
+			boolean checked, String title, String tip, String value,
+			Composite defPanel) {
+		GridData gridData;
+		Label label = new Label(defPanel, SWT.WRAP);
+		gridData = new GridData();
+		label.setLayoutData(gridData);
+		label.setText(title);
+		label.setToolTipText(tip);
+
+		if (addActiveButton) {
+			Button fButton = new Button(defPanel, SWT.CHECK);
+
+			gridData = new GridData(GridData.BEGINNING);
+			gridData.horizontalSpan = 1;
+			fButton.setLayoutData(gridData);
+			fButton.setSelection(checked);
+			fActive[i] = fButton;
+		}
+		Text fText = new Text(defPanel, SWT.SHADOW_IN | SWT.BORDER);
+		gridData = new GridData(GridData.FILL_HORIZONTAL
+				| GridData.GRAB_HORIZONTAL);
+		gridData.horizontalSpan = (addActiveButton ? 2 : 3);
+		fText.setLayoutData(gridData);
+		fText.setText(value);
+		fText.setToolTipText(tip);
+		return fText;
+	}
+
+	public Button createLabeledCheck(int i, boolean checked, String title,
+			String tip, boolean value, Composite defPanel) {
+		return createLabeledCheck(i, true, checked, title, tip, value, defPanel);
+	}
+
+	public Button createLabeledCheck(int i, boolean addActiveButton,
+			boolean checked, String title, String tip, boolean value,
+			Composite defPanel) {
+		GridData gridData;
+		Label label = new Label(defPanel, SWT.WRAP);
+		gridData = new GridData();
+		label.setLayoutData(gridData);
+		label.setText(title);
+		label.setToolTipText(tip);
+
+		Button fButton = new Button(defPanel, SWT.CHECK);
+		gridData = new GridData();
+		gridData.horizontalSpan = 3;
+		fButton.setLayoutData(gridData);
+		fButton.setSelection(value);
+		fButton.setToolTipText(tip);
+		fButton.setSelection(checked);
+		fActive[i] = fButton;
+		return fButton;
+	}
+
+	public Combo createLabeledCombo(int itemI, boolean checked, String title,
+			String tip, String value, String[] choices, Composite defPanel) {
+
+		return createLabeledCombo(itemI, true, checked, title, tip, value,
+				choices, defPanel);
+	}
+
+	public Combo createLabeledCombo(int itemI, boolean addActiveButton,
+			boolean checked, String title, String tip, String value,
+			String[] choices, Composite defPanel) {
+
+		GridData gridData;
+		Label label = new Label(defPanel, SWT.WRAP);
+		gridData = new GridData();
+		label.setLayoutData(gridData);
+		label.setText(title);
+		label.setToolTipText(tip);
+
+		if (addActiveButton) {
+			Button fButton = new Button(defPanel, SWT.CHECK);
+			gridData = new GridData();
+			gridData.horizontalSpan = 1;
+			fButton.setLayoutData(gridData);
+			fButton.setSelection(checked);
+			fActive[itemI] = fButton;
+		}
+
+		Combo fCombo = new Combo(defPanel, SWT.BORDER);
+		gridData = new GridData(GridData.FILL_HORIZONTAL
+				| GridData.GRAB_HORIZONTAL);
+		gridData.horizontalSpan = (addActiveButton ? 2 : 3);
+		fCombo.setLayoutData(gridData);
+		fCombo.setToolTipText(tip);
+		int selected = 0;
+		for (int i = 0; i < choices.length; i++) {
+			String item = choices[i];
+			if (value.equals(item))
+				selected = i;
+			fCombo.add(item);
+		}
+		fCombo.select(selected);
+		return fCombo;
+	}
+
+	public Text createLabeledPath(int i, boolean checked, String title,
+			String tip, String value, Composite defPanel) {
+		GridData gridData;
+		Label label = new Label(defPanel, SWT.WRAP);
+		gridData = new GridData();
+		// gridData.horizontalSpan = 1;
+		label.setLayoutData(gridData);
+		label.setText(title);
+
+		final Text fText = new Text(defPanel, SWT.SHADOW_IN | SWT.BORDER);
+		gridData = new GridData(GridData.FILL_HORIZONTAL
+				| GridData.GRAB_HORIZONTAL);
+		gridData.horizontalSpan = 1;
+		fText.setLayoutData(gridData);
+		fText.setText(value);
+		Button fButton = new Button(defPanel, SWT.PUSH);
+		fButton.setText("Browse...");
+		fButton.setLayoutData(new GridData());
+		fButton.addSelectionListener(new SelectionListener() {
+			public void widgetSelected(SelectionEvent e) {
+				DirectoryDialog dlg = new DirectoryDialog(DialogPanel.this
+						.getShell());
+				dlg.setFilterPath(fText.getText());
+				String res = dlg.open();
+				if (res != null) {
+					fText.setText(res);
+				}
+			}
+
+			public void widgetDefaultSelected(SelectionEvent e) {
+				widgetSelected(e);
+			}
+
+		});
+
+		return fText;
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/preferences/Messages.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/preferences/Messages.java
new file mode 100644
index 0000000..0f5a9c4
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/preferences/Messages.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.ejb.annotation.ui.internal.preferences;
+
+import org.eclipse.osgi.util.NLS;
+
+public final class Messages extends NLS {
+
+	private static final String BUNDLE_NAME = "org.eclipse.jst.j2ee.ejb.annotation.ui.internal.preferences.preferences";//$NON-NLS-1$
+
+	private Messages() {
+		// Do not instantiate
+	}
+
+	public static String label_set_j2ee_annotation_preference;
+	public static String label_active_annotation_provider;
+	public static String desc_active_annotation_provider;
+
+	static {
+		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/preferences/preferences.properties b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/preferences/preferences.properties
new file mode 100644
index 0000000..217e0ae
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/preferences/preferences.properties
@@ -0,0 +1,3 @@
+label_set_j2ee_annotation_preference=Set J2EE Annotation Preferences
+label_active_annotation_provider=Active Annotation Provider:
+desc_active_annotation_provider=Choose the annotation provider that you will use for J2EE development and artifacts
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/wizards/AddEjbWizard.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/wizards/AddEjbWizard.java
new file mode 100644
index 0000000..355b6a5
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/wizards/AddEjbWizard.java
@@ -0,0 +1,140 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+package org.eclipse.jst.j2ee.ejb.annotation.ui.internal.wizards;
+
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.IWizard;
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.messages.IEJBAnnotationConstants;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.model.IEnterpriseBeanClassDataModelProperties;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.model.SessionBeanDataModelProvider;
+import org.eclipse.jst.j2ee.ejb.annotation.ui.internal.EjbAnnotationsUiPlugin;
+import org.eclipse.jst.j2ee.ejb.annotation.ui.internal.cmp.wizards.AddContainerManagedEntityEjbWizard;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider;
+
+
+public class AddEjbWizard extends NewEjbWizard {
+	protected ChooseEjbTypeWizardPage chooseEjbTypeWizardPage = null;
+	private static final String PAGE_ONE = "pageOne"; //$NON-NLS-1$
+	private AddSessionEjbWizard sessionEjbWizard;
+	private AddMessageDrivenEjbWizard messageDrivenEjbWizard;
+	private AddContainerManagedEntityEjbWizard containerManagedEntityEjbWizard;
+	
+	
+	/**
+	 * @param model
+	 */
+	public AddEjbWizard(IDataModel model) {
+		super(model);
+		setWindowTitle(IEJBAnnotationConstants.ADD_EJB_WIZARD_WINDOW_TITLE);
+		setDefaultPageImageDescriptor(EjbAnnotationsUiPlugin.getDefault().getImageDescriptor("icons/full/wizban/newejb_wiz_ban.gif")); //$NON-NLS-1$
+	}
+	
+	public AddEjbWizard() {
+	    this(null);
+	}
+
+	public void init(IWorkbench workbench, IStructuredSelection selection) {
+		super.init(workbench, selection);
+		this.setForcePreviousAndNextButtons(true);  
+		// Otherwise number of pages will be used (1) without the nested wizards
+		this.sessionEjbWizard =  new AddSessionEjbWizard();
+		this.messageDrivenEjbWizard = new AddMessageDrivenEjbWizard();
+		this.containerManagedEntityEjbWizard = new AddContainerManagedEntityEjbWizard();
+		
+		sessionEjbWizard.init(workbench, selection);
+		sessionEjbWizard.addPages();
+		messageDrivenEjbWizard.init(workbench, selection);
+		messageDrivenEjbWizard.addPages();
+		containerManagedEntityEjbWizard.init(workbench, selection);
+		containerManagedEntityEjbWizard.addPages();
+	}
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.wizard.Wizard#addPages()
+	 */
+	public void doAddPages() {
+		chooseEjbTypeWizardPage = new ChooseEjbTypeWizardPage(getDataModel(),PAGE_ONE);
+		chooseEjbTypeWizardPage.setInfopopID(IEJBUIContextIds.ANNOTATION_EJB_PAGE_ADD_ADD_WIZARD_0);
+		addPage(chooseEjbTypeWizardPage);
+
+	}
+	
+
+	
+	public boolean canFinish() {
+		if( "SessionBean".equals(chooseEjbTypeWizardPage.getEJBType())){
+			if (sessionEjbWizard != null && sessionEjbWizard.canFinish()) {
+				return true;
+			}
+		}else if( "MessageDrivenBean".equals(chooseEjbTypeWizardPage.getEJBType())){
+			if (messageDrivenEjbWizard != null && messageDrivenEjbWizard.canFinish()) {
+				return true;
+			}
+		}else if( "ContainerManagedEntityBean".equals(chooseEjbTypeWizardPage.getEJBType())){
+			if (containerManagedEntityEjbWizard != null && containerManagedEntityEjbWizard.canFinish()) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	public IWizardPage getNextPage(IWizardPage page) {
+		IWizardPage nextPage = super.getNextPage(page);
+		IWizard wizard = this;
+		if( page == chooseEjbTypeWizardPage && "SessionBean".equals(chooseEjbTypeWizardPage.getEJBType())){
+			wizard = sessionEjbWizard;
+			sessionEjbWizard.getDataModel().setProperty(IEnterpriseBeanClassDataModelProperties.ANNOTATIONPROVIDER,getDataModel().getProperty(IEnterpriseBeanClassDataModelProperties.ANNOTATIONPROVIDER));
+		} else if( page == chooseEjbTypeWizardPage && "MessageDrivenBean".equals(chooseEjbTypeWizardPage.getEJBType())){
+			wizard = messageDrivenEjbWizard;
+			sessionEjbWizard.getDataModel().setProperty(IEnterpriseBeanClassDataModelProperties.ANNOTATIONPROVIDER,getDataModel().getProperty(IEnterpriseBeanClassDataModelProperties.ANNOTATIONPROVIDER));
+		}else if( page == chooseEjbTypeWizardPage && "ContainerManagedEntityBean".equals(chooseEjbTypeWizardPage.getEJBType())){
+			wizard = containerManagedEntityEjbWizard;
+			containerManagedEntityEjbWizard.getDataModel().setProperty(IEnterpriseBeanClassDataModelProperties.ANNOTATIONPROVIDER,getDataModel().getProperty(IEnterpriseBeanClassDataModelProperties.ANNOTATIONPROVIDER));
+		}
+		if( wizard != this  && wizard !=null)
+			nextPage = wizard.getStartingPage();
+		return nextPage;
+	}
+	
+	public IWizardPage getPreviousPage(IWizardPage page) {
+		IWizardPage previousPage = super.getPreviousPage(page);
+		return previousPage;
+	}
+	
+	protected IDataModelProvider getDefaultProvider() {
+		return new SessionBeanDataModelProvider();
+	}
+
+	/**
+	 * Subclasses should override to return false if the running operation cannot be run forked.
+	 * 
+	 * @return
+	 */
+	protected boolean runForked() {
+		return true;
+	}
+	
+	protected boolean prePerformFinish() {
+		// Sub wizards for ejb types will run the operations.
+		return false;
+	}
+
+	public void dispose() {
+		super.dispose();
+		if (sessionEjbWizard != null)
+			sessionEjbWizard.dispose();
+		if (messageDrivenEjbWizard != null)
+			messageDrivenEjbWizard.dispose();
+		if (containerManagedEntityEjbWizard != null)
+			containerManagedEntityEjbWizard.dispose();
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/wizards/AddMessageDrivenBeanWizardPage.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/wizards/AddMessageDrivenBeanWizardPage.java
new file mode 100644
index 0000000..bfdbce8
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/wizards/AddMessageDrivenBeanWizardPage.java
@@ -0,0 +1,181 @@
+
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotation.ui.internal.wizards;
+
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jst.j2ee.ejb.DestinationType;
+import org.eclipse.jst.j2ee.ejb.TransactionType;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.messages.IEJBAnnotationConstants;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.model.IEnterpriseBeanClassDataModelProperties;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.model.IMessageDrivenBeanDataModelProperties;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.wst.common.componentcore.internal.operation.IArtifactEditOperationDataModelProperties;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizardPage;
+import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
+
+
+public class AddMessageDrivenBeanWizardPage extends DataModelWizardPage implements IBeanWizardPage{
+
+
+	private Text ejbNameText;
+	private Text jndiNameText;
+	private Text displayNameText;
+
+	private Combo destinationButton;
+
+	
+	private Combo transactionButton;
+
+	public AddMessageDrivenBeanWizardPage(IDataModel model, String pageName) {
+		super(model, pageName);
+		setDescription(IEJBAnnotationConstants.ADD_EJB_WIZARD_PAGE_DESC);
+		this.setTitle(IEJBAnnotationConstants.ADD_EJB_WIZARD_PAGE_TITLE);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.ibm.wtp.common.ui.wizard.WTPWizardPage#getValidationPropertyNames()
+	 */
+	protected String[] getValidationPropertyNames() {
+		return new String[]{
+				IEnterpriseBeanClassDataModelProperties.EJB_NAME, 
+				IMessageDrivenBeanDataModelProperties.DESTINATIONNAME, 
+				IEnterpriseBeanClassDataModelProperties.DISPLAY_NAME, 				
+				IEnterpriseBeanClassDataModelProperties.DESCRIPTION};
+	}
+
+	protected Composite createTopLevelComposite(Composite parent) {
+		Composite composite = new Composite(parent, SWT.NULL);
+		composite.setLayout(new GridLayout());
+		GridData data = new GridData(GridData.FILL_BOTH);
+		data.widthHint = 300;
+		composite.setLayoutData(data);
+
+		Composite group = new Composite(composite, SWT.NULL);
+		group.setLayout(new GridLayout(2, false));
+		group.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+		createNameDescription(group);
+		createDestinationGroup(group);
+		createTransactionGroup(group);
+		displayNameText.setFocus();
+
+		IStatus projectStatus = validateProjectName();
+		if (!projectStatus.isOK()) {
+			setErrorMessage(projectStatus.getMessage());
+			composite.setEnabled(false);
+		}
+		
+		return composite;
+	}
+
+	protected IStatus validateProjectName() {
+		// check for empty
+		if (model.getStringProperty(IArtifactEditOperationDataModelProperties.PROJECT_NAME) == null || model.getStringProperty(IArtifactEditOperationDataModelProperties.PROJECT_NAME).trim().length() == 0) {
+			return WTPCommonPlugin.createErrorStatus(IEJBAnnotationConstants.NO_EJB_PROJECTS);
+		}
+		return WTPCommonPlugin.OK_STATUS;
+	}
+
+	protected void createNameDescription(Composite composite) {
+		// ejb name
+		Label ejbNameLabel = new Label(composite, SWT.LEFT);
+		ejbNameLabel.setText(IEJBAnnotationConstants.EJB_NAME_LABEL);
+		ejbNameLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
+		ejbNameText = new Text(composite, SWT.SINGLE | SWT.BORDER);
+		ejbNameText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		synchHelper.synchText(ejbNameText, IEnterpriseBeanClassDataModelProperties.EJB_NAME, null);
+
+		// jndi name
+		Label jndiNameLabel = new Label(composite, SWT.LEFT);
+		jndiNameLabel.setText(IEJBAnnotationConstants.DESTINATION_NAME_LABEL);
+		jndiNameLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
+		jndiNameText = new Text(composite, SWT.SINGLE | SWT.BORDER);
+		jndiNameText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		synchHelper.synchText(jndiNameText, IMessageDrivenBeanDataModelProperties.DESTINATIONNAME, null);
+
+		// display name
+		Label displayNameLabel = new Label(composite, SWT.LEFT);
+		displayNameLabel.setText(IEJBAnnotationConstants.DISPLAY_NAME_LABEL);
+		displayNameLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
+		displayNameText = new Text(composite, SWT.SINGLE | SWT.BORDER);
+		displayNameText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		synchHelper.synchText(displayNameText, IEnterpriseBeanClassDataModelProperties.DISPLAY_NAME, null);
+
+		// description
+		Label descLabel = new Label(composite, SWT.LEFT);
+		descLabel.setText(IEJBAnnotationConstants.DESCRIPTION_LABEL);
+		descLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
+		final Text descText = new Text(composite, SWT.SINGLE | SWT.BORDER);
+		descText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		synchHelper.synchText(descText, IEnterpriseBeanClassDataModelProperties.DESCRIPTION, null);
+	}
+
+	protected void createDestinationGroup(Composite composite) {
+
+		// description
+		Label destinationLabel = new Label(composite, SWT.LEFT);
+		destinationLabel.setText(IEJBAnnotationConstants.DESTINATION_LABEL);
+		destinationLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
+		
+		destinationButton = new Combo(composite,SWT.DROP_DOWN |  SWT.READ_ONLY);
+		destinationButton.setItems(new String[]{DestinationType.QUEUE_LITERAL.getName(),DestinationType.TOPIC_LITERAL.getName()});
+		destinationButton.setText(DestinationType.QUEUE_LITERAL.getName());
+		destinationButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		destinationButton.select(0);
+		synchHelper.synchCombo(destinationButton, IMessageDrivenBeanDataModelProperties.DESTINATIONTYPE, null);
+
+	}
+
+	protected void createTransactionGroup(Composite composite) {
+	
+		// description
+		Label txLabel = new Label(composite, SWT.LEFT);
+		txLabel.setText(IEJBAnnotationConstants.TRANSACTION_LABEL);
+		txLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
+		transactionButton = new Combo(composite, SWT.DROP_DOWN |  SWT.READ_ONLY);
+		transactionButton.setItems(new String[]{TransactionType.CONTAINER_LITERAL.getName(),TransactionType.BEAN_LITERAL.getName()});
+		transactionButton.setText(TransactionType.CONTAINER_LITERAL.getName());
+		transactionButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		transactionButton.select(0);
+		synchHelper.synchCombo(transactionButton, IEnterpriseBeanClassDataModelProperties.TRANSACTIONTYPE, null);
+
+	}
+
+
+
+	public boolean canFlipToNextPage() {
+		return super.canFlipToNextPage();
+	}
+
+	public boolean canFinish() {
+		return false;
+	}
+
+
+
+	public String getDisplayName() {
+		return displayNameText.getText();
+	}
+
+	public String getEjbName() {
+		return model.getStringProperty(IEnterpriseBeanClassDataModelProperties.EJB_NAME);
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/wizards/AddMessageDrivenEjbWizard.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/wizards/AddMessageDrivenEjbWizard.java
new file mode 100644
index 0000000..3465d3b
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/wizards/AddMessageDrivenEjbWizard.java
@@ -0,0 +1,138 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+package org.eclipse.jst.j2ee.ejb.annotation.ui.internal.wizards;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.messages.IEJBAnnotationConstants;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.model.IEnterpriseBeanClassDataModelProperties;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.model.IMessageDrivenBeanDataModelProperties;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.model.MessageDrivenBeanDataModelProvider;
+import org.eclipse.jst.j2ee.ejb.annotation.ui.internal.EjbAnnotationsUiPlugin;
+import org.eclipse.jst.j2ee.internal.common.operations.INewJavaClassDataModelProperties;
+import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.wst.common.componentcore.internal.operation.IArtifactEditOperationDataModelProperties;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelEvent;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelListener;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider;
+
+public class AddMessageDrivenEjbWizard extends NewEjbWizard {
+	protected NewEjbClassWizardPage newJavaClassWizardPage = null;
+	protected AddMessageDrivenBeanWizardPage addMessageDrivenBeanWizardPage = null;
+	protected NewEjbClassOptionsWizardPage newEjbClassOptionsWizardPage = null;
+
+	public static final String PAGE_ONE_NAME = "message.pageOne"; //$NON-NLS-1$
+	public static final String PAGE_TWO_NAME = "message.pageTwo"; //$NON-NLS-1$
+	public static final String PAGE_THREE_NAME = "message.pageThree"; //$NON-NLS-1$
+
+	/**
+	 * @param model
+	 */
+	public AddMessageDrivenEjbWizard(IDataModel model) {
+		super(model);
+		setWindowTitle(IEJBAnnotationConstants.ADD_EJB_WIZARD_WINDOW_TITLE);
+		setDefaultPageImageDescriptor(EjbAnnotationsUiPlugin.getDefault().getImageDescriptor("icons/full/wizban/newejb_wiz_ban.gif")); //$NON-NLS-1$
+	}
+
+	public AddMessageDrivenEjbWizard() {
+		this(null);
+	}
+
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench,
+	 *      org.eclipse.jface.viewers.IStructuredSelection)
+	 */
+	public void init(IWorkbench workbench, IStructuredSelection selection) {
+		super.init(workbench,selection);
+		IProject project = getDefaultEjbProject();
+		if (project != null) {
+		    getDataModel().setProperty(IArtifactEditOperationDataModelProperties.PROJECT_NAME, project.getName());
+		}
+		initializeEjbNameListener(getDataModel());
+	}
+
+	protected IDataModelProvider getDefaultProvider() {
+		return new MessageDrivenBeanDataModelProvider();
+	}
+	
+	private void initializeEjbNameListener(final IDataModel dataModel) {
+		dataModel.addListener(new IDataModelListener(){
+
+			public void propertyChanged(DataModelEvent event) {
+				if( INewJavaClassDataModelProperties.CLASS_NAME.equals(event.getPropertyName()))
+				{
+					String className = (String)event.getProperty();
+					int i = className.toLowerCase().indexOf("bean");
+					if (i < 0)
+						i= className.toLowerCase().indexOf("ejb");
+					if (i >= 0)
+						className = className.substring(0,i);
+					if (className.length() > 0) {
+						// Unset these properties. They will be set with new 
+						// values when EJB_NAME property is set. 
+						dataModel.setProperty(IMessageDrivenBeanDataModelProperties.DESTINATIONNAME, null);
+						dataModel.setProperty(IEnterpriseBeanClassDataModelProperties.DISPLAY_NAME, null);
+						dataModel.setProperty(IEnterpriseBeanClassDataModelProperties.DESCRIPTION, null);
+						
+						// Set the EJB_NAME property. Call to 
+						// DataModelProvider.propertySet() will be triggered 
+						// that will reset the above properties.
+						dataModel.setProperty(IEnterpriseBeanClassDataModelProperties.EJB_NAME, className);
+					}
+				}
+			}});
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.wizard.Wizard#addPages()
+	 */
+	public void doAddPages() {
+		newJavaClassWizardPage = new NewEjbClassWizardPage(getDataModel(), PAGE_ONE_NAME,
+				IEJBAnnotationConstants.NEW_JAVA_CLASS_DESTINATION_WIZARD_PAGE_DESC,
+				IEJBAnnotationConstants.ADD_EJB_WIZARD_PAGE_TITLE, J2EEProjectUtilities.EJB);
+		newJavaClassWizardPage.setInfopopID(IEJBUIContextIds.ANNOTATION_EJB_PAGE_ADD_ADD_WIZARD_2);
+		addPage(newJavaClassWizardPage);
+
+		addMessageDrivenBeanWizardPage = new AddMessageDrivenBeanWizardPage(getDataModel(), PAGE_TWO_NAME);
+		addMessageDrivenBeanWizardPage.setInfopopID(IEJBUIContextIds.ANNOTATION_EJB_PAGE_ADD_ADD_WIZARD_1);
+		addPage(addMessageDrivenBeanWizardPage);
+		addMessageDrivenBeanWizardPage.setPageComplete(false);
+
+		newEjbClassOptionsWizardPage = new NewEjbClassOptionsWizardPage(getDataModel(), PAGE_THREE_NAME,
+				IEJBAnnotationConstants.NEW_JAVA_CLASS_OPTIONS_WIZARD_PAGE_DESC, IEJBAnnotationConstants.ADD_EJB_WIZARD_PAGE_TITLE);
+		newEjbClassOptionsWizardPage.setInfopopID(IEJBUIContextIds.ANNOTATION_EJB_PAGE_ADD_ADD_WIZARD_3);
+		addPage(newEjbClassOptionsWizardPage);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.ibm.wtp.common.ui.wizard.WTPWizard#runForked()
+	 */
+	protected boolean runForked() {
+		return true;
+	}
+
+	public boolean canFinish() {
+		if (newJavaClassWizardPage != null && newJavaClassWizardPage.isPageComplete() && addMessageDrivenBeanWizardPage != null
+				&& addMessageDrivenBeanWizardPage.isPageComplete()) {
+			return true;
+		}
+
+		return false;
+	}
+
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/wizards/AddSessionBeanWizardPage.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/wizards/AddSessionBeanWizardPage.java
new file mode 100644
index 0000000..df484e5
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/wizards/AddSessionBeanWizardPage.java
@@ -0,0 +1,185 @@
+
+/***************************************************************************************************
+ * Copyright (c) 2005, 2006 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ *				 David Schneider, david.schneider@unisys.com - [142500] WTP properties pages fonts don't follow Eclipse preferences
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotation.ui.internal.wizards;
+
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jst.j2ee.ejb.SessionType;
+import org.eclipse.jst.j2ee.ejb.TransactionType;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.messages.IEJBAnnotationConstants;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.model.IEnterpriseBeanClassDataModelProperties;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.model.ISessionBeanDataModelProperties;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.wst.common.componentcore.internal.operation.IArtifactEditOperationDataModelProperties;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizardPage;
+import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
+
+
+public class AddSessionBeanWizardPage extends DataModelWizardPage implements IBeanWizardPage{
+
+
+	private Text ejbNameText;
+	private Text jndiNameText;
+	private Text displayNameText;
+
+	private Combo statelessButton;
+
+	
+	private Combo transactionButton;
+
+	public AddSessionBeanWizardPage(IDataModel model, String pageName) {
+		super(model, pageName);
+		setDescription(IEJBAnnotationConstants.ADD_EJB_WIZARD_PAGE_DESC);
+		this.setTitle(IEJBAnnotationConstants.ADD_EJB_WIZARD_PAGE_TITLE);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.ibm.wtp.common.ui.wizard.WTPWizardPage#getValidationPropertyNames()
+	 */
+	protected String[] getValidationPropertyNames() {
+		return new String[]{
+				IEnterpriseBeanClassDataModelProperties.EJB_NAME, 
+				IEnterpriseBeanClassDataModelProperties.JNDI_NAME, 
+				IEnterpriseBeanClassDataModelProperties.DISPLAY_NAME, 				
+				IEnterpriseBeanClassDataModelProperties.DESCRIPTION};
+	}
+
+	protected Composite createTopLevelComposite(Composite parent) {
+		Composite composite = new Composite(parent, SWT.NULL);
+		composite.setLayout(new GridLayout());
+		GridData data = new GridData(GridData.FILL_BOTH);
+		data.widthHint = 300;
+		composite.setLayoutData(data);
+
+		Composite fields = new Composite(composite, SWT.NULL);
+		fields.setLayout(new GridLayout(2, false));
+		fields.setLayoutData(new GridData(GridData.FILL_BOTH));
+		
+		createNameDescription(fields);
+		createStatelessGroup(fields);
+		createTransactionGroup(fields);
+		displayNameText.setFocus();
+
+		IStatus projectStatus = validateProjectName();
+		if (!projectStatus.isOK()) {
+			setErrorMessage(projectStatus.getMessage());
+			composite.setEnabled(false);
+		}
+		Dialog.applyDialogFont(parent);
+		return composite;
+	}
+
+	protected IStatus validateProjectName() {
+		// check for empty
+		if (model.getStringProperty(IArtifactEditOperationDataModelProperties.PROJECT_NAME) == null || model.getStringProperty(IArtifactEditOperationDataModelProperties.PROJECT_NAME).trim().length() == 0) {
+			return WTPCommonPlugin.createErrorStatus(IEJBAnnotationConstants.NO_EJB_PROJECTS);
+		}
+		return WTPCommonPlugin.OK_STATUS;
+	}
+
+	protected void createNameDescription(Composite composite) {
+		// ejb name
+		Label ejbNameLabel = new Label(composite, SWT.LEFT);
+		ejbNameLabel.setText(IEJBAnnotationConstants.EJB_NAME_LABEL);
+		ejbNameLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
+		ejbNameText = new Text(composite, SWT.SINGLE | SWT.BORDER);
+		ejbNameText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		synchHelper.synchText(ejbNameText, IEnterpriseBeanClassDataModelProperties.EJB_NAME, null);
+
+		// jndi name
+		Label jndiNameLabel = new Label(composite, SWT.LEFT);
+		jndiNameLabel.setText(IEJBAnnotationConstants.JNDI_NAME_LABEL);
+		jndiNameLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
+		jndiNameText = new Text(composite, SWT.SINGLE | SWT.BORDER);
+		jndiNameText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		synchHelper.synchText(jndiNameText, IEnterpriseBeanClassDataModelProperties.JNDI_NAME, null);
+
+		// display name
+		Label displayNameLabel = new Label(composite, SWT.LEFT);
+		displayNameLabel.setText(IEJBAnnotationConstants.DISPLAY_NAME_LABEL);
+		displayNameLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
+		displayNameText = new Text(composite, SWT.SINGLE | SWT.BORDER);
+		displayNameText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		synchHelper.synchText(displayNameText, IEnterpriseBeanClassDataModelProperties.DISPLAY_NAME, null);
+
+		// description
+		Label descLabel = new Label(composite, SWT.LEFT);
+		descLabel.setText(IEJBAnnotationConstants.DESCRIPTION_LABEL);
+		descLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
+		final Text descText = new Text(composite, SWT.SINGLE | SWT.BORDER);
+		descText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		synchHelper.synchText(descText, IEnterpriseBeanClassDataModelProperties.DESCRIPTION, null);
+	}
+
+	protected void createStatelessGroup(Composite composite) {
+
+		// description
+		Label statelessLabel = new Label(composite, SWT.LEFT);
+		statelessLabel.setText(IEJBAnnotationConstants.STATELESS_LABEL);
+		statelessLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
+		statelessButton = new Combo(composite, SWT.DROP_DOWN |  SWT.READ_ONLY);
+		statelessButton.setItems(new String[]{SessionType.STATELESS_LITERAL.getName(),SessionType.STATEFUL_LITERAL.getName()});
+		statelessButton.setText(SessionType.STATELESS_LITERAL.getName());
+		statelessButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));		
+		synchHelper.synchCombo(statelessButton, ISessionBeanDataModelProperties.STATELESS, null);
+		statelessButton.select(0);
+
+	}
+
+	protected void createTransactionGroup(Composite composite) {
+		// description
+		Label txLabel = new Label(composite, SWT.LEFT);
+		txLabel.setText(IEJBAnnotationConstants.TRANSACTION_LABEL);
+		txLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
+		transactionButton = new Combo(composite, SWT.DROP_DOWN |  SWT.READ_ONLY);
+		transactionButton.setItems(new String[]{TransactionType.CONTAINER_LITERAL.getName(),TransactionType.BEAN_LITERAL.getName()});
+		transactionButton.setText(TransactionType.CONTAINER_LITERAL.getName());
+		transactionButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+		synchHelper.synchCombo(transactionButton, IEnterpriseBeanClassDataModelProperties.TRANSACTIONTYPE, null);
+		transactionButton.select(0);
+
+	}
+
+
+
+	public boolean canFlipToNextPage() {
+		return super.canFlipToNextPage();
+	}
+
+	public boolean canFinish() {
+		return false;
+	}
+
+
+
+	public String getDisplayName() {
+		return displayNameText.getText();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jst.j2ee.ejb.annotation.ui.internal.IBeanWizardPage#getEjbName()
+	 */
+	public String getEjbName() {
+		return model.getStringProperty(IEnterpriseBeanClassDataModelProperties.EJB_NAME);
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/wizards/AddSessionEjbWizard.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/wizards/AddSessionEjbWizard.java
new file mode 100644
index 0000000..a451024
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/wizards/AddSessionEjbWizard.java
@@ -0,0 +1,141 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+package org.eclipse.jst.j2ee.ejb.annotation.ui.internal.wizards;
+
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.messages.IEJBAnnotationConstants;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.model.IEnterpriseBeanClassDataModelProperties;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.model.SessionBeanDataModelProvider;
+import org.eclipse.jst.j2ee.ejb.annotation.ui.internal.EjbAnnotationsUiPlugin;
+import org.eclipse.jst.j2ee.internal.common.operations.INewJavaClassDataModelProperties;
+import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.wst.common.componentcore.internal.operation.IArtifactEditOperationDataModelProperties;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelEvent;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelListener;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider;
+
+public class AddSessionEjbWizard extends NewEjbWizard {
+	protected NewEjbClassWizardPage  newJavaClassWizardPage = null;
+	protected AddSessionBeanWizardPage addSessionBeanWizardPage = null;
+	protected NewEjbClassOptionsWizardPage newEjbClassOptionsWizardPage = null;
+	
+	public static final String PAGE_ONE_NAME = "session.pageOne"; //$NON-NLS-1$
+	public static final String PAGE_TWO_NAME = "session.pageTwo"; //$NON-NLS-1$
+	public static final String PAGE_THREE_NAME = "session.pageThree"; //$NON-NLS-1$
+	
+	
+	/**
+	 * @param model
+	 */
+	public AddSessionEjbWizard(IDataModel model) {
+		super(model);
+		
+		setWindowTitle(IEJBAnnotationConstants.ADD_EJB_WIZARD_WINDOW_TITLE);
+		setDefaultPageImageDescriptor(EjbAnnotationsUiPlugin.getDefault().getImageDescriptor("icons/full/wizban/newejb_wiz_ban.gif")); //$NON-NLS-1$
+	}
+	
+	public AddSessionEjbWizard() {
+	    this(null);
+	}
+	
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench,
+	 *      org.eclipse.jface.viewers.IStructuredSelection)
+	 */
+	public void init(IWorkbench workbench, IStructuredSelection selection) {
+		super.init(workbench,selection);
+		IProject project = getDefaultEjbProject();
+		if (project != null) {
+		    getDataModel().setProperty(IArtifactEditOperationDataModelProperties.PROJECT_NAME, project.getName());
+		}
+		initializeEjbNameListener(getDataModel());
+	}
+	
+	protected IDataModelProvider getDefaultProvider() {
+		return new SessionBeanDataModelProvider();
+	}
+	
+	private void initializeEjbNameListener(final IDataModel dataModel) {
+		dataModel.addListener(new IDataModelListener(){
+
+			public void propertyChanged(DataModelEvent event) {
+				if( INewJavaClassDataModelProperties.CLASS_NAME.equals(event.getPropertyName()))
+				{
+					String className = (String)event.getProperty();
+					int i = className.toLowerCase().indexOf("bean");
+					if(i < 0 )
+						i= className.toLowerCase().indexOf("ejb");
+					if( i >= 0)
+						className = className.substring(0,i);
+					if( className.length() > 0 ) {
+						// Unset these properties. They will be set with new 
+						// values when EJB_NAME property is set. 
+						dataModel.setProperty(IEnterpriseBeanClassDataModelProperties.JNDI_NAME, null);
+						dataModel.setProperty(IEnterpriseBeanClassDataModelProperties.DISPLAY_NAME, null);
+						dataModel.setProperty(IEnterpriseBeanClassDataModelProperties.DESCRIPTION, null);
+						
+						// Set the EJB_NAME property. Call to 
+						// DataModelProvider.propertySet() will be triggered 
+						// that will reset the above properties.
+						dataModel.setProperty(IEnterpriseBeanClassDataModelProperties.EJB_NAME, className);
+					}
+				}
+			}});
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.wizard.Wizard#addPages()
+	 */
+	public void doAddPages() {
+		newJavaClassWizardPage = new NewEjbClassWizardPage(
+				getDataModel(), 
+				PAGE_ONE_NAME,
+				IEJBAnnotationConstants.NEW_JAVA_CLASS_DESTINATION_WIZARD_PAGE_DESC,
+				IEJBAnnotationConstants.ADD_EJB_WIZARD_PAGE_TITLE,
+				J2EEProjectUtilities.EJB);
+		newJavaClassWizardPage.setInfopopID(IEJBUIContextIds.ANNOTATION_EJB_PAGE_ADD_ADD_WIZARD_2);
+		addPage(newJavaClassWizardPage);
+		
+		
+		addSessionBeanWizardPage = new AddSessionBeanWizardPage(getDataModel(), PAGE_TWO_NAME);
+		addSessionBeanWizardPage.setInfopopID(IEJBUIContextIds.ANNOTATION_EJB_PAGE_ADD_ADD_WIZARD_1);
+		addPage(addSessionBeanWizardPage);
+		addSessionBeanWizardPage.setPageComplete(false);
+
+		newEjbClassOptionsWizardPage = new NewEjbClassOptionsWizardPage(
+				getDataModel(), 
+				PAGE_THREE_NAME,
+				IEJBAnnotationConstants.NEW_JAVA_CLASS_OPTIONS_WIZARD_PAGE_DESC,
+				IEJBAnnotationConstants.ADD_EJB_WIZARD_PAGE_TITLE);
+		newEjbClassOptionsWizardPage.setInfopopID(IEJBUIContextIds.ANNOTATION_EJB_PAGE_ADD_ADD_WIZARD_3);
+		addPage(newEjbClassOptionsWizardPage);
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.ibm.wtp.common.ui.wizard.WTPWizard#runForked()
+	 */
+	protected boolean runForked() {
+		return true;
+	}
+	
+	public boolean canFinish() {
+		if ( newJavaClassWizardPage != null && newJavaClassWizardPage.isPageComplete() && addSessionBeanWizardPage != null && addSessionBeanWizardPage.isPageComplete() ) {
+				return true;
+			}
+
+
+		return false;
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/wizards/ChooseEjbTypeWizardPage.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/wizards/ChooseEjbTypeWizardPage.java
new file mode 100644
index 0000000..9e42de1
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/wizards/ChooseEjbTypeWizardPage.java
@@ -0,0 +1,266 @@
+/***************************************************************************************************
+ * Copyright (c) 2005, 2006 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ *				 David Schneider, david.schneider@unisys.com - [142500] WTP properties pages fonts don't follow Eclipse preferences
+ **************************************************************************************************/
+
+
+package org.eclipse.jst.j2ee.ejb.annotation.ui.internal.wizards;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.messages.IEJBAnnotationConstants;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.model.IEnterpriseBeanClassDataModelProperties;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.preferences.AnnotationPreferenceStore;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.provider.IAnnotationProvider;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.utility.AnnotationUtilities;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Link;
+import org.eclipse.ui.dialogs.PreferencesUtil;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizardPage;
+
+/**
+ * @author naci
+ */
+public class ChooseEjbTypeWizardPage extends DataModelWizardPage {
+
+	protected Button sessionType;
+	protected Button messageDrivenType;
+	protected Button containerManagedEntityType;
+
+	protected ChooseEjbTypeWizardPage(IDataModel model, String pageName) {
+		super(model, pageName);
+		this.setDescription(IEJBAnnotationConstants.ADD_EJB_WIZARD_PAGE_DESC);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.common.frameworks.internal.ui.WTPWizardPage#getValidationPropertyNames()
+	 */
+	protected String[] getValidationPropertyNames() {
+		return new String[] { IEnterpriseBeanClassDataModelProperties.EJB_TYPE };
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.common.frameworks.internal.ui.WTPWizardPage#createTopLevelComposite(org.eclipse.swt.widgets.Composite)
+	 */
+	protected Composite createTopLevelComposite(Composite parent) {
+		Composite aComposite = new Composite(parent, SWT.NULL);
+		aComposite.setLayout(new GridLayout());
+		aComposite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL | GridData.HORIZONTAL_ALIGN_FILL));
+		aComposite.setSize(aComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
+		aComposite.setFont(parent.getFont());
+		createEjbTypeGroup(aComposite);
+		createAnnotationProviderGroup(aComposite);
+		addPreferenceLink(aComposite);
+
+		setControl(aComposite);
+		Dialog.applyDialogFont(parent);
+		return aComposite;
+
+	}
+
+	protected void createEjbTypeGroup(Composite parent) {
+		Composite ejbTypeGroup = new Composite(parent, SWT.NONE);
+		GridLayout layout = new GridLayout();
+		ejbTypeGroup.setLayout(layout);
+		ejbTypeGroup.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL));
+
+		sessionType = new Button(ejbTypeGroup, SWT.RADIO);
+		sessionType.setText(Messages.label_session_bean); //$NON-NLS-1$
+		sessionType.setSelection(true);
+		sessionType.addSelectionListener(new SelectionListener() {
+
+			public void widgetSelected(SelectionEvent e) {
+				if (sessionType.getSelection()) {
+					ChooseEjbTypeWizardPage.this.model.setProperty(IEnterpriseBeanClassDataModelProperties.EJB_TYPE, "SessionBean");
+					validateProvider();
+				}
+			}
+
+			public void widgetDefaultSelected(SelectionEvent e) {
+				this.widgetSelected(e);
+			}
+		});
+
+		messageDrivenType = new Button(ejbTypeGroup, SWT.RADIO);
+		messageDrivenType.setText(Messages.label_message_driven_bean); //$NON-NLS-1$
+		messageDrivenType.setSelection(false);
+		messageDrivenType.addSelectionListener(new SelectionListener() {
+
+			public void widgetSelected(SelectionEvent e) {
+				if (messageDrivenType.getSelection()) {
+					ChooseEjbTypeWizardPage.this.model.setProperty(IEnterpriseBeanClassDataModelProperties.EJB_TYPE,
+							"MessageDrivenBean");
+					validateProvider();
+				}
+			}
+
+			public void widgetDefaultSelected(SelectionEvent e) {
+				this.widgetSelected(e);
+			}
+		});
+
+
+		containerManagedEntityType = new Button(ejbTypeGroup, SWT.RADIO);
+		containerManagedEntityType.setText(Messages.label_container_managed_entity_bean); //$NON-NLS-1$
+		containerManagedEntityType.setSelection(false);
+		containerManagedEntityType
+				.addSelectionListener(new SelectionListener() {
+
+					public void widgetSelected(SelectionEvent e) {
+						if (containerManagedEntityType.getSelection()) {
+							ChooseEjbTypeWizardPage.this.model
+									.setProperty(
+											IEnterpriseBeanClassDataModelProperties.EJB_TYPE,
+											"ContainerManagedEntityBean");
+							validateProvider();
+						}
+					}
+
+					public void widgetDefaultSelected(SelectionEvent e) {
+						this.widgetSelected(e);
+					}
+				});
+	}
+
+	protected void createAnnotationProviderGroup(Composite parent) {
+		Composite annotationGroup = new Composite(parent, SWT.NONE);
+		GridLayout layout = new GridLayout(2, false);
+		annotationGroup.setLayout(layout);
+		annotationGroup.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL));
+
+		//Label label = new Label(annotationGroup, SWT.WRAP);
+		//label.setText("Annotation Provider:");
+		//label.setToolTipText("Choose the annotation provider that will be used to create java classes and J2EE artifacts");
+
+		// annotationProvider = new Combo(annotationGroup, SWT.RADIO);
+		String preferred = AnnotationPreferenceStore.getProperty(AnnotationPreferenceStore.ANNOTATIONPROVIDER);
+		ChooseEjbTypeWizardPage.this.model.setProperty(IEnterpriseBeanClassDataModelProperties.ANNOTATIONPROVIDER, preferred);
+		// String providerS = provider[0];
+		// for (int i = 0; i < provider.length; i++) {
+		// String name = provider[i];
+		// annotationProvider.add(name);
+		// if (preferred.equals(name)) {
+		// providerS = name;
+		// annotationProvider.select(i);
+		// selected = true;
+		// }
+		//
+		// }
+		// if (!selected) {
+		// providerS = provider[0];
+		// annotationProvider.select(0);
+		// }
+
+		validateProvider();
+
+		if (model != null)
+			model.setProperty(IEnterpriseBeanClassDataModelProperties.ANNOTATIONPROVIDER, preferred);
+
+	}
+
+	public String getEJBType() {
+		return model.getStringProperty(IEnterpriseBeanClassDataModelProperties.EJB_TYPE);
+	}
+
+	public boolean isPageComplete() {
+		String provider = AnnotationPreferenceStore.getProperty(AnnotationPreferenceStore.ANNOTATIONPROVIDER);
+		IAnnotationProvider annotationProvider = null;
+		try {
+			annotationProvider = AnnotationUtilities.findAnnotationProviderByName(provider);
+		} catch (Exception e) {
+			return false;
+		}
+
+		return (annotationProvider != null && annotationProvider.isValid());
+	}
+
+	private void addPreferenceLink(final Composite composite) {
+		/*
+		 * TODO: Bug 161150
+		 * 
+		 * If there's no preference mapping, don't link to a nonexistant page?
+		 * Perhaps add a combo here, letting the user select from the list of 
+		 * annotation providers, with a button next to it allowing them to edit 
+		 * that provider's preferences? 
+		 * 
+		 * Would we need eventually project-specific preferences? I don't know. 
+		 */
+		if( getPreferencePageId() != null ) {
+			Link link = new Link(composite, SWT.NONE);
+			link.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false, 3, 1));
+			link.setText(Messages.label_change_your_provider_preference);
+	
+			link.addSelectionListener(new SelectionAdapter() {
+				public void widgetSelected(SelectionEvent e) {
+					if (showPreferencePage(composite)) {
+					}
+					validateProvider();
+				}
+	
+				public void widgetDefaultSelected(SelectionEvent e) {
+					widgetSelected(e);
+				}
+			});
+		}
+	}
+
+	protected boolean showPreferencePage(Composite composite) {
+		return PreferencesUtil.createPreferenceDialogOn(composite.getShell(), getPreferencePageId(), null, null)
+				.open() == Window.OK;
+	}
+	
+	private String getPreferencePageId() {
+		String provider = AnnotationPreferenceStore.getProperty(AnnotationPreferenceStore.ANNOTATIONPROVIDER);
+		IConfigurationElement[] configurationElements = Platform.getExtensionRegistry().getConfigurationElementsFor(
+		"org.eclipse.jst.j2ee.ejb.annotations.ui.ProviderPreferenceMapping");
+		
+		for( int i = 0; i < configurationElements.length; i++ ) {
+			if( provider.equals(configurationElements[i].getAttribute("name"))) {
+				return configurationElements[i].getAttribute("preferencePage");
+			}
+		}
+		
+		return null;
+	}
+
+	private void validateProvider() {
+		String provider = AnnotationPreferenceStore.getProperty(AnnotationPreferenceStore.ANNOTATIONPROVIDER);
+		ChooseEjbTypeWizardPage.this.model.setProperty(IEnterpriseBeanClassDataModelProperties.ANNOTATIONPROVIDER, provider);
+		IAnnotationProvider annotationProvider = null;
+		try {
+			annotationProvider = AnnotationUtilities.findAnnotationProviderByName(provider);
+		} catch (Exception ex) {
+		}
+		if (annotationProvider != null && annotationProvider.isValid()) {
+			this.setErrorMessage(null);
+			this.setPageComplete(true);
+		} else
+			this.setErrorMessage(Messages.msg_err_annotation_provider_not_valid);
+		getContainer().updateMessage();
+	}
+
+	public boolean canFlipToNextPage() {
+		return isPageComplete();// &&
+		// wizard.getPageGroupManager().hasNextPage();
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/wizards/IBeanWizardPage.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/wizards/IBeanWizardPage.java
new file mode 100644
index 0000000..3e5df2f
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/wizards/IBeanWizardPage.java
@@ -0,0 +1,18 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+
+package org.eclipse.jst.j2ee.ejb.annotation.ui.internal.wizards;
+
+
+public interface IBeanWizardPage {
+	
+	public String getEjbName();
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/wizards/IEJBUIContextIds.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/wizards/IEJBUIContextIds.java
new file mode 100644
index 0000000..26961c6
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/wizards/IEJBUIContextIds.java
@@ -0,0 +1,23 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotation.ui.internal.wizards;
+
+public interface IEJBUIContextIds {
+
+	public static final String PLUGIN_SERVLET_UI = "org.eclipse.jst.j2ee.infopop."; //$NON-NLS-1$
+	
+	public static final String ANNOTATION_EJB_PAGE_ADD_ADD_WIZARD_0 = PLUGIN_SERVLET_UI + "antejb0000"; //$NON-NLS-1$
+	public static final String ANNOTATION_EJB_PAGE_ADD_ADD_WIZARD_1 = PLUGIN_SERVLET_UI + "antejb1000"; //$NON-NLS-1$
+	public static final String ANNOTATION_EJB_PAGE_ADD_ADD_WIZARD_2 = PLUGIN_SERVLET_UI + "antejb1100"; //$NON-NLS-1$
+	public static final String ANNOTATION_EJB_PAGE_ADD_ADD_WIZARD_3 = PLUGIN_SERVLET_UI + "antejb1200"; //$NON-NLS-1$
+	public static final String ANNOTATION_EJB_PAGE_ADD_ADD_WIZARD_4 = PLUGIN_SERVLET_UI + "antejb4000"; //$NON-NLS-1$
+	
+	
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/wizards/Messages.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/wizards/Messages.java
new file mode 100644
index 0000000..9b0a011
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/wizards/Messages.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.ejb.annotation.ui.internal.wizards;
+
+import org.eclipse.osgi.util.NLS;
+
+public final class Messages extends NLS {
+
+	private static final String BUNDLE_NAME = "org.eclipse.jst.j2ee.ejb.annotation.ui.internal.wizards.wizards";//$NON-NLS-1$
+
+	private Messages() {
+		// Do not instantiate
+	}
+
+	public static String label_session_bean;
+	public static String label_message_driven_bean;
+	public static String label_container_managed_entity_bean;
+	public static String label_change_your_provider_preference;
+	public static String msg_err_annotation_provider_not_valid;
+
+	static {
+		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/wizards/NewEjbClassOptionsWizardPage.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/wizards/NewEjbClassOptionsWizardPage.java
new file mode 100644
index 0000000..8d7ada3
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/wizards/NewEjbClassOptionsWizardPage.java
@@ -0,0 +1,29 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotation.ui.internal.wizards;
+
+import org.eclipse.jst.j2ee.internal.wizard.NewJavaClassOptionsWizardPage;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+/**
+ * @author naci
+ *
+ */
+public class NewEjbClassOptionsWizardPage extends NewJavaClassOptionsWizardPage {
+
+	public NewEjbClassOptionsWizardPage(IDataModel model, String pageName, String pageDesc, String pageTitle) {
+		super(model, pageName, pageDesc, pageTitle);
+	}
+	
+	public void refreshInterfaces(Object interfaces)
+	{
+		interfaceViewer.setInput(interfaces);
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/wizards/NewEjbClassWizardPage.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/wizards/NewEjbClassWizardPage.java
new file mode 100644
index 0000000..f752ee6
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/wizards/NewEjbClassWizardPage.java
@@ -0,0 +1,74 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotation.ui.internal.wizards;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.jst.ejb.ui.project.facet.EjbProjectWizard;
+import org.eclipse.jst.j2ee.internal.ejb.project.operations.EjbFacetProjectCreationDataModelProvider;
+import org.eclipse.jst.j2ee.internal.ejb.project.operations.IEjbFacetInstallDataModelProperties;
+import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
+import org.eclipse.jst.j2ee.internal.wizard.NewJavaClassWizardPage;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEModuleFacetInstallDataModelProperties;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties.FacetDataModelMap;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.project.facet.core.IFacetedProject;
+import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
+
+
+public class NewEjbClassWizardPage extends NewJavaClassWizardPage {
+
+	public NewEjbClassWizardPage(IDataModel model, String pageName, String pageDesc, String pageTitle, String moduleType) {
+		super(model, pageName, pageDesc, pageTitle, moduleType);
+	}
+	protected Composite createTopLevelComposite(Composite parent) {
+		 Composite composite =  super.createTopLevelComposite(parent);
+		 return composite;
+	}
+	
+	protected void createNewComponent() {
+		IDataModel aModel = DataModelFactory.createDataModel(new EjbFacetProjectCreationDataModelProvider());
+		FacetDataModelMap map = (FacetDataModelMap) aModel.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
+		IDataModel ejbModel = map.getFacetDataModel(J2EEProjectUtilities.EJB);
+		ejbModel.setBooleanProperty(IJ2EEModuleFacetInstallDataModelProperties.ADD_TO_EAR, false);
+		ejbModel.setBooleanProperty(IEjbFacetInstallDataModelProperties.CREATE_CLIENT, false);
+		EjbProjectWizard componentCreationWizard = new EjbProjectWizard(aModel);
+			
+		WizardDialog dialog = new WizardDialog(getShell(), componentCreationWizard);
+		if (Window.OK == dialog.open()) {
+			String newProjectName = aModel.getStringProperty( IFacetProjectCreationDataModelProperties.FACET_PROJECT_NAME);
+			this.setProjectName(newProjectName);
+		}
+	}
+	
+	protected boolean isProjectValid(IProject project) {
+		boolean result = super.isProjectValid(project);
+		if (result) {
+			// check additionally if the project has the jst.ejb.xdoclet facet
+			result = false;
+			IFacetedProject faceted = null;
+			try {
+				faceted = ProjectFacetsManager.create(project);
+				if (faceted != null && 
+					(faceted.hasProjectFacet(ProjectFacetsManager.getProjectFacet("jst.ejb.xdoclet")))) {
+					result = true;
+				}
+			} catch (CoreException e) {
+			}
+		}
+		return result;
+	}
+	
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/wizards/NewEjbWizard.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/wizards/NewEjbWizard.java
new file mode 100644
index 0000000..83b39e9
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/wizards/NewEjbWizard.java
@@ -0,0 +1,85 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotation.ui.internal.wizards;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPlugin;
+import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
+import org.eclipse.ui.INewWizard;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizard;
+
+public abstract class NewEjbWizard extends DataModelWizard implements INewWizard {
+
+	/**
+	 * @param model
+	 */
+	public NewEjbWizard(IDataModel model) {
+		super(model);
+	}
+
+	/**
+	 * Default constructor
+	 */
+	public NewEjbWizard() {
+		super();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench,
+	 *      org.eclipse.jface.viewers.IStructuredSelection)
+	 */
+	public void init(IWorkbench workbench, IStructuredSelection selection) {
+		
+	}
+
+	protected IProject getDefaultEjbProject() {
+		IProject project = null;
+		IStructuredSelection selection = getCurrentSelection();
+		if (selection != null && selection.getFirstElement() != null) {
+			project = ProjectUtilities.getProject(selection.getFirstElement());
+			if(project == null  && selection.getFirstElement() instanceof IAdaptable){
+				IResource res= (IResource) ((IAdaptable) selection.getFirstElement()).getAdapter(IResource.class);
+				if(res != null)
+					project = res.getProject();
+			}
+				
+		}
+		if (project == null) {
+			IProject[] projects = ProjectUtilities.getAllProjects();
+			for (int i = 0; i < projects.length; i++) {
+				if (J2EEProjectUtilities.isEJBProject(projects[i]))
+					project = projects[i];
+			}
+		}
+		return project;
+	}
+
+	protected IStructuredSelection getCurrentSelection() {
+		IWorkbenchWindow window = J2EEUIPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow();
+		if (window != null) {
+			ISelection selection = window.getSelectionService().getSelection();
+			if (selection instanceof IStructuredSelection) {
+				return (IStructuredSelection) selection;
+			}
+		}
+		return null;
+	}
+
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/wizards/wizards.properties b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/wizards/wizards.properties
new file mode 100644
index 0000000..bc0ef4e
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.ui/src/org/eclipse/jst/j2ee/ejb/annotation/ui/internal/wizards/wizards.properties
@@ -0,0 +1,6 @@
+label_session_bean=&Session bean
+label_message_driven_bean=&Message-driven bean
+label_container_managed_entity_bean=&Container-managed entity bean
+label_change_your_provider_preference=You can change your &provider <a>preferences</a>. 
+
+msg_err_annotation_provider_not_valid=Annotation provider definition is not valid, please check the preferences. 
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/.classpath b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/.classpath
new file mode 100644
index 0000000..304e861
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/.cvsignore b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/.cvsignore
new file mode 100644
index 0000000..52e14e1
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/.cvsignore
@@ -0,0 +1,7 @@
+bin
+temp.folder
+build.xml
+xdocletAnnotation.jar
+@dot
+src.zip
+javaCompiler...args
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/.project b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/.project
new file mode 100644
index 0000000..4e87526
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.jst.j2ee.ejb.annotations.xdoclet</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/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/.settings/org.eclipse.jdt.core.prefs b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..c1ec977
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+#Thu May 10 18:34:39 EDT 2007
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.5
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/META-INF/MANIFEST.MF b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..bb99d90
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/META-INF/MANIFEST.MF
@@ -0,0 +1,48 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name.0
+Bundle-SymbolicName: org.eclipse.jst.j2ee.ejb.annotations.xdoclet; singleton:=true
+Bundle-Version: 1.2.300.qualifier
+Bundle-ClassPath: .
+Bundle-Activator: org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.XDocletAnnotationPlugin
+Bundle-Vendor: %Bundle-Vendor.0
+Bundle-Localization: plugin
+Export-Package: org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet;x-internal:=true,
+ org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.action;x-internal:=true,
+ org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.facet;x-internal:=true,
+ org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.provider;x-internal:=true,
+ org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.ui;x-internal:=true,
+ org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.util;x-internal:=true
+Require-Bundle: org.eclipse.jst.j2ee.ejb.annotations.emitter;bundle-version="[1.1.0,1.2.0)";visibility:=reexport,
+ org.eclipse.jdt;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.emf.common;bundle-version="[2.2.0,3.0.0)",
+ org.eclipse.emf.ecore;bundle-version="[2.2.0,3.0.0)",
+ org.eclipse.jdt.core;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.jst.j2ee.core;bundle-version="[1.1.0,2.0.0)",
+ org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.core.resources;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.ui;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.jdt.launching;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.jst.j2ee;bundle-version="[1.1.0,1.3.0)",
+ org.eclipse.jst.j2ee.ejb;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.wst.common.emfworkbench.integration;bundle-version="[1.1.0,2.0.0)",
+ org.eclipse.jst.j2ee.web;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.wst.common.modulecore;bundle-version="[1.1.0,2.0.0)",
+ org.eclipse.jem.workbench;bundle-version="[2.0.0,3.0.0)",
+ org.eclipse.jem.util;bundle-version="[2.0.0,3.0.0)",
+ org.eclipse.jst.common.annotations.controller;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.jst.j2ee.ejb.annotation.model;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.jst.common.frameworks;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.wst.common.frameworks;bundle-version="[1.1.0,2.0.0)",
+ org.eclipse.ant.core;bundle-version="[3.1.100,4.0.0)",
+ org.eclipse.debug.core;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.ant.ui;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.debug.ui;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.jdt.debug.ui;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.jem;bundle-version="[2.0.0,3.0.0)",
+ org.eclipse.emf.ecore.xmi;bundle-version="[2.2.0,3.0.0)",
+ org.eclipse.wst.common.project.facet.core;bundle-version="[1.1.0,2.0.0)",
+ org.eclipse.jst.common.project.facet.core;bundle-version="[1.1.0,2.0.0)",
+ org.eclipse.wst.common.project.facet.ui;bundle-version="[1.1.0,2.0.0)"
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/plugins/org.eclipse.wst.web.ui/about.html b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/about.html
similarity index 100%
copy from plugins/org.eclipse.wst.web.ui/about.html
copy to plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/about.html
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/build.properties b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/build.properties
new file mode 100644
index 0000000..6ec8755
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/build.properties
@@ -0,0 +1,10 @@
+bin.includes = plugin.xml,\
+               .,\
+               ejb-merge.xml,\
+               templates/,\
+               META-INF/,\
+               about.html,\
+               plugin.properties,\
+               schema/,\
+               icons/
+source.. = src/
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/ejb-merge.xml b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/ejb-merge.xml
new file mode 100644
index 0000000..e0bff6e
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/ejb-merge.xml
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<merge:options 
+	  indent="  "  
+	  braceStyle="matching"  
+	  block="\s*@\s*generated\s*NOT\s*\n"
+      xmlns:merge="http://www.eclipse.org/org/eclipse/emf/codegen/jmerge/Options">
+
+
+	<merge:dictionaryPattern
+	   name="generatedMember" 
+	   select="Member/getComment" 
+	   match="\s*@\s*(gen)erated\s*\n"/>
+
+
+	<merge:dictionaryPattern
+	   name="modifiedMember" 
+	   select="Member/getComment" 
+	   match="\s*@\s*(modify)\s*\n"/>
+
+
+
+	<merge:pull 
+	   targetMarkup="^gen$"
+	   sourceGet="Method/getBody"
+	   sourceTransfer="(\s*//\s*begin-user-code.*?//\s*end-user-code\s*)\n"
+	   targetPut="Method/setBody"/>
+
+	<!-- copy comments except between the begin-user-doc
+	     and end-user-doc tags -->
+	<merge:pull 
+	  sourceMarkup="^gen$"
+	  sourceGet="Member/getComment"
+	  sourceTransfer="(\s*&lt;!--\s*begin-user-doc.*?end-user-doc\s*-->\s*)"
+	  targetMarkup="^gen$"
+	  targetPut="Member/setComment"/>
+
+
+
+	<!-- Requests generator to replace the complete comment -->
+	<merge:pull 
+	  sourceMarkup="^gen$"
+	  sourceGet="Member/getComment"
+	  targetMarkup="^modify$"
+	  targetPut="Member/setComment"/>
+
+    <merge:pull 
+      sourceGet="Member/getFlags"
+      targetMarkup="^gen$"
+      targetPut="Member/setFlags"/>
+
+    <merge:pull 
+      sourceGet="Initializer/getBody"
+      targetMarkup="^gen$"
+      targetPut="Initializer/setBody"/>
+
+    <merge:pull 
+      sourceGet="Type/getSuperclass"
+      targetMarkup="^gen$"
+      targetPut="Type/setSuperclass"/>
+
+    <merge:pull 
+      sourceGet="Type/getSuperInterfaces"
+      sourceTransfer="(\s*@\s*extends|\s*@\s*implements)(.*?)\n"
+      targetMarkup="^gen$"
+      targetPut="Type/addSuperInterface"/>
+
+    <merge:pull 
+      sourceGet="Field/getType"
+      targetMarkup="^gen$"
+      targetPut="Field/setType"/>
+    <merge:pull 
+      sourceGet="Field/getInitializer"
+      targetMarkup="^gen$"
+      targetPut="Field/setInitializer"/>
+
+    <merge:pull 
+      sourceGet="Method/getReturnType"
+      targetMarkup="^gen$"
+      targetPut="Method/setReturnType"/>
+    <merge:pull 
+      sourceGet="Method/getExceptions"
+      targetMarkup="^gen$"
+      targetPut="Method/addException"/>
+ 
+ 
+ 
+    <!-- if there are generated code fragments that are not in the 
+         new generated code remove them. Usefule when renaming methods/fields -->
+    <merge:sweep markup="^gen$" select="Member"/>
+    <merge:sweep markup="^gen$" select="Type"/>
+ 
+</merge:options>
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/icons/xdoclet.gif b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/icons/xdoclet.gif
new file mode 100644
index 0000000..0703c30
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/icons/xdoclet.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/icons/xdoclet.jpg b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/icons/xdoclet.jpg
new file mode 100644
index 0000000..3f180ae
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/icons/xdoclet.jpg
Binary files differ
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/plugin.properties b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/plugin.properties
new file mode 100644
index 0000000..872ad3d
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/plugin.properties
@@ -0,0 +1,24 @@
+name_xdoclet=XDoclet
+name_ejbdoclet=ejbdoclet
+name_webdoclet=webdoclet
+XDocletPropertiesPage.name=XDoclet
+XDocletEJBPropertiesPage.name=ejbdoclet
+XDocletWebPropertiesPage.name=webdoclet
+
+
+action.runxdoclet=Run XDoclet
+
+facet.webdoclet=WebDoclet (XDoclet)
+facet.webdoclet.description=Enables the project to run Webdoclet post-processing on annotated servlets.
+
+facet.ejbdoclet=EJBDoclet (XDoclet)
+facet.ejbdoclet.description=Enables the project to run EjbDoclet post-processing on annotated ejbs
+
+preset.webdoclet=Dynamic Web Project with XDoclet
+preset.webdoclet.description=Web project with XDoclet authoring support.
+
+preset.ejbdoclet=EJB Project with XDoclet
+
+validationMarkerName = XDoclet Facet Problem
+Bundle-Name.0 = Xdoclet Annotations Plug-in
+Bundle-Vendor.0 = Eclipse Web Tools Platform
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/plugin.xml b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/plugin.xml
new file mode 100644
index 0000000..fae899b
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/plugin.xml
@@ -0,0 +1,818 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+   <extension-point id="xdocletRuntime" name="XDoclet Runtime" schema="schema/xdocletRuntime.exsd"/>
+   <extension-point id="webdocletTaskProvider" name="Task providers for webdoclet" schema="schema/webdocletTaskProvider.exsd"/>
+   <extension-point id="ejbDocletTaskProvider" name="A task  provider class for ejbdoclet" schema="schema/ejbDocletTaskProvider.exsd"/>
+
+     <extension point="org.eclipse.core.resources.builders"
+       id="xdocletbuilder"
+       name="XDoclet Builder">
+      <builder>
+         <run
+         	class="org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.XDocletBuilder" >
+         </run>
+      </builder>
+   </extension>
+
+  <extension 
+    point="org.eclipse.core.resources.markers"
+    id="xdoclet.marker"
+    name="%validationMarkerName">
+    <super type="org.eclipse.core.resources.problemmarker"/>
+    <persistent value="true"/>
+  </extension>
+  
+  
+   <extension
+         point="org.eclipse.ui.preferencePages">
+     <page
+           category="org.eclipse.jst.j2ee.ui.preferencePages.JavaEE"
+           class="org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.ui.XDocletPreferencePage"
+           id="org.eclipse.jst.j2ee.ejb.annotations.xdoclet.preference"
+           name="%name_xdoclet">
+      </page>
+     <page
+            name="%name_ejbdoclet"
+            category="org.eclipse.jst.j2ee.ejb.annotations.xdoclet.preference"
+            class="org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.ui.XDocletEJBPreferencePage"
+            id="org.eclipse.jst.j2ee.ejb.annotations.xdoclet.ejb.preference">
+     </page>
+     <page
+            name="%name_webdoclet"
+            category="org.eclipse.jst.j2ee.ejb.annotations.xdoclet.preference"
+            class="org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.ui.XDocletWebPreferencePage"
+            id="org.eclipse.jst.j2ee.ejb.annotations.xdoclet.web.preference">
+     </page>
+   </extension>
+
+
+<!-- =========== org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.ui.XDocletPreferencePage ============ -->
+
+
+	<extension point="org.eclipse.ui.propertyPages">
+       <page
+            adaptable="true"
+            objectClass="org.eclipse.core.resources.IProject"
+            name="%XDocletPropertiesPage.name"
+            class="org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.ui.XDocletPreferencePage"
+            id="XDocletPropertiesPage">
+          <filter
+             name="nature"
+             value="org.eclipse.wst.common.project.facet.core.nature">
+          </filter>
+      </page> 
+
+<!-- =========== org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.ui.XDocletEJBPreferencePage ============ -->
+
+      <page
+            adaptable="true"
+            objectClass="org.eclipse.core.resources.IProject"
+            name="%XDocletEJBPropertiesPage.name"
+            category="XDocletPropertiesPage"
+            class="org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.ui.XDocletEJBPreferencePage"
+            id="XDocletEJBPropertiesPage">
+          <filter
+             name="nature"
+             value="org.eclipse.wst.common.project.facet.core.nature">
+          </filter>
+      </page> 
+   
+<!-- =========== org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.ui.XDocletWebPreferencePage ============ -->
+
+      <page
+            adaptable="true"
+            objectClass="org.eclipse.core.resources.IProject"
+            name="%XDocletWebPropertiesPage.name"
+            category="XDocletPropertiesPage"
+            class="org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.ui.XDocletWebPreferencePage"
+            id="XDocletWebPropertiesPage">
+          <filter
+             name="nature"
+             value="org.eclipse.wst.common.project.facet.core.nature">
+          </filter>
+      </page> 
+   </extension>    
+   
+   
+<!-- =========== XDoclet Code Emmitters ============ -->
+
+   <extension
+         point="org.eclipse.jst.j2ee.ejb.annotations.emitter.template">
+      <emitter
+      
+            name="XDoclet"
+            classpathProvider="org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.ClasspathProvider"
+            builderId="xdocletbuilder"
+            ejbIntrospector="org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.XdocletIntrospector"
+            mergeController="ejb-merge.xml"
+            entityTemplates="templates/ejb/entity"
+            messageTemplates="templates/ejb/message"
+            sessionTemplates="templates/ejb/session">
+      </emitter>
+   </extension>
+   
+    <extension
+         point="org.eclipse.jst.j2ee.ejb.annotation.model.ejbGenerator">
+         
+         <provider
+            name="XDoclet"
+            class="org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.provider.XDocletAnnotationProvider" />
+         <ejbGenerator
+            name="XDoclet"
+            class="org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.provider.XDocletAnnotationProvider" />
+   </extension>
+   
+  
+   <!-- -->
+   
+	  <extension
+	    point="org.eclipse.ui.popupMenus">
+	    <objectContribution
+	      adaptable="true"
+	      objectClass="org.eclipse.core.resources.IProject"
+	      nameFilter="*"
+	      id="org.eclipse.jst.j2ee.ejb.annotations.xdoclet">
+	      <filter name="nature" value="org.eclipse.wst.common.project.facet.core.nature"/>
+          <enablement>
+            <or>
+              <test property="org.eclipse.wst.common.project.facet.core.projectFacet" value="jst.web.xdoclet"/>
+              <test property="org.eclipse.wst.common.project.facet.core.projectFacet" value="jst.ejb.xdoclet"/>
+            </or>
+	      </enablement>
+	      <action
+	        label="%action.runxdoclet"
+	        class="org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.action.RunXDocletAction"
+	        menubarPath="additions"
+	        enablesFor="+"
+	        id="org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.action.RunXDocletAction">
+	      </action>
+	    </objectContribution>
+	  </extension>
+   
+    <!-- ================================================ -->
+    <!--  XDoclet PROJECT WEB FACETS                      -->
+    <!-- ================================================ -->
+ 
+
+  <extension point="org.eclipse.wst.common.project.facet.core.facets">
+
+    <project-facet id="jst.web.xdoclet">
+      <label>%facet.webdoclet</label>
+      <description>%facet.webdoclet.description</description>
+      <icon>icons/xdoclet.gif</icon>
+    </project-facet>
+
+    <project-facet-version facet="jst.web.xdoclet" version="1.2.1">
+      <constraint>
+        <and>
+          <requires facet="jst.web" version="[2.2-2.3]"/>
+        </and>
+      </constraint>
+     </project-facet-version>
+
+    <project-facet-version facet="jst.web.xdoclet" version="1.2.2">
+      <constraint>
+        <and>
+          <requires facet="jst.web" version="[2.2-2.3]"/>
+        </and>
+      </constraint>
+    </project-facet-version>
+
+    <project-facet-version facet="jst.web.xdoclet" version="1.2.3">
+      <constraint>
+        <and>
+          <requires facet="jst.web" version="[2.2"/>
+        </and>
+      </constraint>
+   </project-facet-version>
+    
+
+    
+    <action type="install" facet="jst.web.xdoclet" version="[1.2.1-1.2.3]">
+      <delegate class="org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.facet.XDocletFacetInstallDelegate"/>
+      <config-factory class="org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.facet.XDocletWebFacetInstallDataModelProvider"/>
+    </action>
+    <action type="uninstall" facet="jst.web.xdoclet" version="[1.2.1-1.2.3]">
+      <delegate class="org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.facet.XDocletFacetUninstallDelegate"/>
+    </action>
+    
+	<event-handler type="RUNTIME_CHANGED" facet="jst.web.xdoclet" version="[1.2.1-1.2.3]">
+	  <delegate class="org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.facet.XDocletFacetRuntimeChangedDelegate"/>
+	</event-handler>
+	
+	<action type="version-change" facet="jst.web.xdoclet" version="[1.2.1-1.2.3]">
+	  <delegate class="org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.facet.XDocletFacetVersionChangeDelegate"/>
+	</action>
+
+
+	  <preset id="preset.jst.web.xdoclet">
+	      <label>%preset.webdoclet</label>
+	      <description>%preset.webdoclet.description</description>
+	      <facet id="jst.java" version="1.4" />
+	      <facet id="jst.web" version="2.4"/>
+	      <facet id="jst.web.xdoclet" version="1.2.3" />
+	  </preset>    
+
+   <!-- ================================================ -->
+    <!--  XDoclet PROJECT EJB FACETS                      -->
+    <!-- ================================================ -->
+  
+    <project-facet id="jst.ejb.xdoclet">
+      <label>%facet.ejbdoclet</label>
+      <description>%facet.ejbdoclet.description</description>
+      <icon>icons/xdoclet.gif</icon>
+    </project-facet>
+
+    <project-facet-version facet="jst.ejb.xdoclet" version="1.2.1">
+      <constraint>
+        <and>
+          <requires facet="jst.ejb" version="1.1,2.0"/>
+          <conflicts group="ejb.annotated.generation"/>
+        </and>
+      </constraint>
+      <group-member id="ejb.annotated.generation"/>
+     </project-facet-version>
+
+    <project-facet-version facet="jst.ejb.xdoclet" version="1.2.2">
+      <constraint>
+        <and>
+          <requires facet="jst.ejb" version="1.1,2.0"/>
+          <conflicts group="ejb.annotated.generation"/>
+        </and>
+      </constraint>
+      <group-member id="ejb.annotated.generation"/>
+    </project-facet-version>
+
+    <project-facet-version facet="jst.ejb.xdoclet" version="1.2.3">
+      <constraint>
+        <and>
+          <requires facet="jst.ejb" version="[1.1-2.1]"/>
+          <conflicts group="ejb.annotated.generation"/>
+        </and>
+      </constraint>
+      <group-member id="ejb.annotated.generation"/>
+   </project-facet-version>
+   
+    <action type="install" facet="jst.ejb.xdoclet" version="[1.2.1-1.2.3]">
+      <delegate class="org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.facet.XDocletFacetInstallDelegate"/>
+      <config-factory class="org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.facet.XDocletEjbFacetInstallDataModelProvider"/>
+    </action>
+    <action type="uninstall" facet="jst.ejb.xdoclet" version="[1.2.1-1.2.3]">
+      <delegate class="org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.facet.XDocletFacetUninstallDelegate"/>
+    </action>
+	<event-handler type="RUNTIME_CHANGED" facet="jst.ejb.xdoclet" version="[1.2.1-1.2.3]">
+	  <delegate class="org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.facet.XDocletFacetRuntimeChangedDelegate"/>
+	</event-handler>
+	<action type="version-change" facet="jst.ejb.xdoclet" version="[1.2.1-1.2.3]">
+	  <delegate class="org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.facet.XDocletFacetVersionChangeDelegate"/>
+	</action>
+
+
+	  <preset id="preset.jst.ejb.xdoclet">
+	      <label>%preset.ejbdoclet</label>
+	      <facet id="jst.java" version="1.4" />
+	      <facet id="jst.ejb" version="2.1"/>
+	      <facet id="jst.ejb.xdoclet" version="1.2.3" />
+	  </preset>    
+  </extension>
+  
+
+  <extension point="org.eclipse.wst.common.project.facet.core.runtimes">
+    <supported>
+      <runtime-component any="true"/>
+      <facet id="jst.web.xdoclet" version="1.2.1,1.2.2,1.2.3"/>
+    </supported>
+    <supported>
+      <runtime-component any="true"/>
+      <facet id="jst.ejb.xdoclet" version="1.2.1,1.2.2,1.2.3"/>
+    </supported>
+  </extension>
+  
+
+    <!-- ================================================ -->
+    <!--  EJB Tag set definitions for XDoclet             -->
+    <!-- ================================================ -->
+    <extension
+         id="EJBTagSets"
+         point="org.eclipse.jst.common.annotations.controller.AnnotationTagSet">
+      <AnnotationTagSet
+            name="ejb">
+      </AnnotationTagSet>
+   </extension>
+   <extension
+         id="EJBAnnotationInfo"
+         point="org.eclipse.jst.common.annotations.controller.AnnotationTagInfo">
+      <AnnotationTagInfo tagSet="ejb" tagName="value-object" scope="type"
+      			multiplicity="*">
+      	<attrib name="abstract" type="bool"/>
+      	<attrib name="extends"/>
+      	<attrib name="implements"/>
+      	<attrib name="match"/>
+      	<attrib name="name">
+      		<unique scope="type"/>
+      	</attrib>
+      	<attrib name="generatePKConstructor" type="bool"/>
+      </AnnotationTagInfo>
+      
+      <AnnotationTagInfo tagSet="ejb" tagName="value-object" scope="method">
+      	<attrib name="match"/>
+      	<attrib name="compose"/>
+      	<attrib name="compose-name"/>
+      	<attrib name="aggregate"/>
+      	<attrib name="aggregate-name"/>
+      	<attrib name="members"/>
+      	<attrib name="members-name"/>
+      	<attrib name="relation"/>
+      	<attrib name="type"/>
+      </AnnotationTagInfo>
+      <AnnotationTagInfo
+            tagSet="ejb"
+            tagName="session"
+            scope="type">
+         <attrib
+               use="required"
+               name="name">
+               <unique scope="module"/>
+         </attrib>
+         <attrib
+               name="description">
+         </attrib>
+         <attrib
+               name="display-name">
+         </attrib>
+         <attrib
+               name="small-icon">
+         </attrib>
+         <attrib
+               name="large-icon">
+         </attrib>
+         <attrib
+               name="generate"
+               type="bool">
+         </attrib>
+         <attrib
+               name="jndi-name">
+         </attrib>
+         <attrib
+               name="local-jndi-name">
+         </attrib>
+         <attrib
+               name="view-type" type="enum">
+               <enumValues value="local"/>
+               <enumValues value="remote"/>
+               <enumValues value="both"/>
+         </attrib>
+         <attrib
+               name="type" type="enum">
+               <enumValues value="Stateless"/>
+         </attrib>
+         <attrib
+               name="transaction-type" type="enum">
+               <enumValues value="Container"/>
+               <enumValues value="Bean"/>
+         </attrib>     
+         <attrib
+               name="remote-business-interface"
+               type="javaType">
+         </attrib>
+         <attrib
+               name="local-business-interface"
+               type="javaType">
+         </attrib>
+      </AnnotationTagInfo>
+      <AnnotationTagInfo tagSet="ejb" tagName="relation" scope="method">
+      		<attrib name="name" use="required"/>
+      		<attrib name="role-name" use="required"/>
+      		<attrib name="cascade-delete"/>
+      		<attrib name="target-ejb"/>
+      		<attrib name="target-role-name"/>
+      		<attrib name="target-cascade-delete"/>
+      		<attrib name="target-multiple"/>
+      </AnnotationTagInfo>
+      <AnnotationTagInfo
+            tagSet="ejb"
+            tagName="bean"
+            scope="type">
+         <attrib
+               use="required"
+               name="name">
+               <unique scope="module"/>
+         </attrib>
+         <attrib
+               name="description">
+         </attrib>
+         <attrib
+               name="display-name">
+         </attrib>
+         <attrib
+               name="small-icon">
+         </attrib>
+         <attrib
+               name="large-icon">
+         </attrib>
+         <attrib
+               name="generate"
+               type="bool">
+         </attrib>
+         <attrib
+               name="jndi-name">
+         </attrib>
+         <attrib
+               name="local-jndi-name">
+         </attrib>
+         <attrib
+               name="view-type" type="enum">
+               <enumValues value="local"/>
+               <enumValues value="remote"/>
+               <enumValues value="both"/>
+         </attrib>
+         <attrib
+               name="type" type="enum">
+               <enumValues value="CMP"/>
+               <enumValues value="BMP"/>
+               <enumValues value="Stateless"/>
+               <enumValues value="Stateful"/>
+         </attrib>
+         <attrib
+               name="transaction-type" type="enum">
+               <enumValues value="Container"/>
+               <enumValues value="Bean"/>
+         </attrib>
+         <attrib
+               name="reentrant"
+               type="bool">
+         </attrib>
+         <attrib
+               name="cmp-version" type="enum">
+               <enumValues value="2.x"/>
+         </attrib>
+         <attrib
+               name="schema">
+         </attrib>
+         <attrib
+               name="primkey-field">
+         </attrib>
+         <attrib
+               name="use-soft-locking"
+               type="bool">
+         </attrib>
+         <attrib
+               name="message-selector">
+         </attrib>
+         <attrib
+               name="acknowledge-mode" type="enum">
+               <enumValues value="Auto-acknowledge"/>
+               <enumValues value="Dups-ok-acknowledge"/>
+         </attrib>
+         <attrib
+               name="destination-type" type="enum">
+               <enumValues value="javax.jms.Queue"/>
+               <enumValues value="javax.jms.Topic"/>
+         </attrib>
+         <attrib
+               name="subscription-durability" type="enum">
+               <enumValues value="Durable"/>
+               <enumValues value="NonDurable"/>
+         </attrib>
+         <attrib
+               name="remote-business-interface"
+               type="javaType">
+         </attrib>
+         <attrib
+               name="local-business-interface"
+               type="javaType">
+         </attrib>
+      </AnnotationTagInfo>
+      <AnnotationTagInfo tagSet="ejb" tagName="select" scope="method" multiplicity="*">
+      	<attrib name="query" use="required"/>
+      	<attrib name="result-type-mapping" type="enum">
+      		<enumValues value="none"/>
+      		<enumValues value="Local"/>
+      		<enumValues value="Remote"/>
+      	</attrib>
+      </AnnotationTagInfo>
+      <AnnotationTagInfo tagSet="ejb" tagName="ejb-external-ref" scope="type" multiplicity="*">
+      	<attrib name="ref-name" use="required"/>
+      	<attrib name="view-type" use="required" type="enum">
+      		<enumValues value="local"/>
+      		<enumValues value="remote"/>
+      	</attrib>
+      	<attrib name="link" use="required"/>
+      	<attrib name="type" use="required" type="enum">
+      		<enumValues value="Entity"/>
+      		<enumValues value="Session"/>
+      	</attrib>
+      	<attrib name="home" type="javaType" use="required"/>
+      	<attrib name="business" type="javaType" use="required"/>
+      </AnnotationTagInfo>
+      <AnnotationTagInfo
+            tagSet="ejb"
+            tagName="home-method"
+            scope="method">
+         <attrib
+               name="view-type"
+               description="ath.view-type.home-method"
+               type="enum">
+               <enumValues value="local"/>
+               <enumValues value="remote"/>
+         </attrib>
+      </AnnotationTagInfo>
+      <AnnotationTagInfo
+            tagSet="ejb"
+            tagName="interface-method"
+            scope="method">
+         <attrib
+               name="view-type"
+               description="ath.view-type.interface-method"
+               type="enum">
+               <enumValues value="local"/>
+               <enumValues value="remote"/>
+               <enumValues value="both"/>
+         </attrib>
+      </AnnotationTagInfo>
+      <AnnotationTagInfo
+            tagSet="ejb"
+            tagName="create-method"
+            scope="method">
+         <attrib
+               name="view-type"
+               description="ath.view-type.create-method"
+               type="enum">
+               <enumValues value="local"/>
+               <enumValues value="remote"/>
+         </attrib>
+      </AnnotationTagInfo>
+      <AnnotationTagInfo
+            tagSet="ejb"
+            tagName="env-entry"
+            scope="type" multiplicity="*">
+            <attrib name="name" use="required">
+            </attrib>
+            <attrib name="description"/>
+            <attrib name="type" type="enum">
+            	<enumValues value="java.lang.Boolean"/>
+            	<enumValues value="java.lang.Byte"/>
+				<enumValues value="java.lang.Character"/>
+				<enumValues value="java.lang.String"/>
+				<enumValues value="java.lang.Short"/>
+				<enumValues value="java.lang.Integer"/>
+				<enumValues value="java.lang.Long"/>
+				<enumValues value="java.lang.Float"/>
+				<enumValues value="java.lang.Double"/>
+			</attrib>
+            <attrib name="value"/>
+      </AnnotationTagInfo>
+      <AnnotationTagInfo
+            tagSet="ejb"
+            tagName="ejb-ref"
+            scope="type" multiplicity="*">
+          	
+          <attrib name="ejb-name" use="required"/>
+          <attrib name="view-type" use="required" type="enum">
+          	<enumValues value="local"/>
+          	<enumValues value="remote"/>
+          </attrib>
+          <attrib name="ref-name"/>
+      </AnnotationTagInfo>
+      <AnnotationTagInfo
+            tagSet="ejb"
+            tagName="security-role-ref"
+            scope="type" multiplicity="*">
+         <attrib name="role-name" use="required"/>
+         <attrib name="role-link" use="required"/>
+      </AnnotationTagInfo>
+      <AnnotationTagInfo
+            tagSet="ejb"
+            tagName="security-identity"
+            scope="type">
+         <attrib name="description"/>
+         <attrib name="use-caller-identity" type="bool"/>
+         <attrib name="run-as"/>
+      </AnnotationTagInfo>
+      <AnnotationTagInfo
+            tagSet="ejb"
+            tagName="resource-ref"
+            scope="type" multiplicity="*">
+         <attrib name="res-ref-name" use="required"/>
+         <attrib name="res-type" use="required" type="javaType"/>
+         <attrib name="res-auth" use="required" type="enum">
+         	<enumValues value="Container"/>
+         	<enumValues value="Application"/>
+         </attrib>
+         <attrib name="res-sharing-scope" type="enum">
+         	<enumValues value="Shareable"/>
+         	<enumValues value="Unshareable"/>
+         </attrib>
+         <attrib name="jndi-name"/>
+      </AnnotationTagInfo>
+      <AnnotationTagInfo
+            tagSet="ejb"
+            tagName="resource-env-ref"
+            scope="type" multiplicity="*">
+            <attrib name="name" use="required"/>
+            <attrib name="type" use="required" type="javaType"/>
+      </AnnotationTagInfo>
+      <AnnotationTagInfo
+            tagSet="ejb"
+            tagName="interface"
+            scope="type">
+          <attrib name="extends"/>
+          <attrib name="local-extends"/>
+          <attrib name="generate" type="bool"/>
+          <attrib name="remote-class"/>
+          <attrib name="local-class"/>
+          <attrib name="remote-pattern"/>
+          <attrib name="local-pattern"/>
+          <attrib name="pattern"/>
+          <attrib name="remote-package"/>
+          <attrib name="local-package"/>
+          <attrib name="package"/>
+      </AnnotationTagInfo>
+      <AnnotationTagInfo
+            tagSet="ejb"
+            tagName="home"
+            scope="type">
+          <attrib name="extends"/>
+          <attrib name="local-extends"/>
+          <attrib name="generate" type="bool"/>
+          <attrib name="remote-class"/>
+          <attrib name="local-class"/>
+          <attrib name="remote-pattern"/>
+          <attrib name="local-pattern"/>
+          <attrib name="pattern"/>
+          <attrib name="remote-package"/>
+          <attrib name="local-package"/>
+          <attrib name="package"/>
+      </AnnotationTagInfo>
+      <AnnotationTagInfo
+            tagSet="ejb"
+            tagName="pk"
+            scope="type">
+         <attrib name="class" use="required"/>
+         <attrib name="pattern"/>
+         <attrib name="package"/>
+         <attrib name="generate" type="bool"/>
+         <attrib name="extends" type="javaType"/>
+         <attrib name="implements" type="javaType"/>
+         <attrib name="role-name"/>
+         <attrib name="unchecked" type="bool"/>
+         <attrib name="method-intf" type="enum">
+         	<enumValues value="Home"/>
+         	<enumValues value="LocalHome"/>
+         </attrib>
+      </AnnotationTagInfo>
+      <AnnotationTagInfo
+            tagSet="ejb"
+            tagName="pk-field"
+            scope="method">
+      </AnnotationTagInfo>
+      <AnnotationTagInfo
+            tagSet="ejb"
+            tagName="persistence"
+            scope="type">
+         <attrib name="table-name"/>
+      </AnnotationTagInfo>
+      <AnnotationTagInfo
+            tagSet="ejb"
+            tagName="persistence"
+            scope="method">
+          <attrib name="column-name"/>
+          <attrib name="jdbc-type" type="enum">
+          	<enumValues value="ARRAY"/>
+          	<enumValues value="BIGINT"/>
+          	<enumValues value="BINARY"/>
+          	<enumValues value="BIT"/>
+          	<enumValues value="BLOB"/>
+          	<enumValues value="BOOLEAN"/>
+          	<enumValues value="CHAR"/>
+          	<enumValues value="CLOB"/>
+          	<enumValues value="DATALINK"/>
+          	<enumValues value="DATE"/>
+          	<enumValues value="DECIMAL"/>
+          	<enumValues value="DISTINCT"/>
+          	<enumValues value="DOUBLE"/>
+          	<enumValues value="FLOAT"/>
+          	<enumValues value="INTEGER"/>
+          	<enumValues value="JAVA_OBJECT"/>
+          	<enumValues value="LONGVARBINARY"/>
+          	<enumValues value="LONGVARCHAR"/>
+          	<enumValues value="NULL"/>
+          	<enumValues value="NUMERIC"/>
+          	<enumValues value="OTHER"/>
+          	<enumValues value="REAL"/>
+          	<enumValues value="REF"/>
+          	<enumValues value="SMALLINT"/>
+          	<enumValues value="STRUCT"/>
+          	<enumValues value="TIME"/>
+          	<enumValues value="TIMESTAMP"/>
+          	<enumValues value="TINYINT"/>
+          	<enumValues value="VARBINARY"/>
+          	<enumValues value="VARCHAR"/>
+		  </attrib>
+          <attrib name="sql-type"/>
+          <attrib name="read-only"/>
+      </AnnotationTagInfo>
+      <AnnotationTagInfo
+            tagSet="ejb"
+            tagName="finder"
+            scope="type"
+            multiplicity="*">
+          <attrib name="view-type" type="enum">
+          	<enumValues value="local"/>
+          	<enumValues value="remote"/>
+          	<enumValues value="both"/>
+          </attrib>
+          <attrib name="description"/>
+          <attrib name="signature" use="required"/>
+          <attrib name="unchecked" type="bool"/>
+          <attrib name="role-name"/>
+          <attrib name="query" use="required"/>
+          <attrib name="result-type-mapping" type="enum">
+          	<enumValues value="none"/>
+          	<enumValues value="Local"/>
+          	<enumValues value="Remote"/>
+          </attrib>
+          <attrib name="transaction-type"/>
+          <attrib name="method-intf" type="enum">
+          	<enumValues value="Home"/>
+          	<enumValues value="LocalHome"/>
+          </attrib>
+      </AnnotationTagInfo>
+      <AnnotationTagInfo tagSet="ejb" tagName="transaction" scope="method">
+      	<attrib name="type" use="required" type="enum">
+      		<enumValues value="NotSupported"/>
+      		<enumValues value="Supports"/>
+      		<enumValues value="Required"/>
+      		<enumValues value="RequiresNew"/>
+      		<enumValues value="Mandatory"/>
+      		<enumValues value="Never"/>
+      	</attrib>
+      </AnnotationTagInfo>
+      <AnnotationTagInfo tagSet="ejb" tagName="transaction" scope="type">
+      	<attrib name="type" use="required" type="enum">
+      		<enumValues value="NotSupported"/>
+      		<enumValues value="Supports"/>
+      		<enumValues value="Required"/>
+      		<enumValues value="RequiresNew"/>
+      		<enumValues value="Mandatory"/>
+      		<enumValues value="Never"/>
+      	</attrib>
+      </AnnotationTagInfo>
+      <AnnotationTagInfo tagSet="ejb" tagName="facade-method" scope="method">
+      	<attrib name="invalidate" type="bool"/>
+      	<attrib name="cache" type="bool"/>
+      	<attrib name="immutable" type="bool"/>
+      </AnnotationTagInfo>
+      <AnnotationTagInfo
+      		tagSet="ejb"
+      		tagName="util"
+      		scope="type">
+      		
+      	  <attrib name="generate" use="required" type="enum">
+      	  	<enumValues value="no"/>
+      	  	<enumValues value="logical"/>
+      	  	<enumValues value="physical"/>
+      	  </attrib>
+      </AnnotationTagInfo>
+      <AnnotationTagInfo tagSet="ejb" tagName="facade" scope="type">
+      	<attrib name="name"/>
+      	<attrib name="description"/>
+      	<attrib name="display-name"/>
+      	<attrib name="small-icon"/>
+      	<attrib name="large-icon"/>
+      	<attrib name="jndi-name"/>
+      	<attrib name="local-jndi-name"/>
+      	<attrib name="view-type" type="enum">
+      		<enumValues value="local"/>
+      		<enumValues value="remote"/>
+      		<enumValues value="both"/>
+      	</attrib>
+      	<attrib name="type" use="required" type="enum">
+      		<enumValues value="Stateless"/>
+      		<enumValues value="Stateful"/>
+      	</attrib>
+      	<attrib name="transaction-type" type="enum">
+      		<enumValues value="Bean"/>
+      		<enumValues value="Container"/>
+      	</attrib>
+      </AnnotationTagInfo>
+      <AnnotationTagInfo tagSet="ejb" tagName="remote-facade" scope="type"/>
+      <AnnotationTagInfo tagSet="ejb" tagName="permission" scope="method">
+      	<attrib name="role-name"/>
+      	<attrib name="unchecked" type="bool"/>
+      </AnnotationTagInfo>
+      <AnnotationTagInfo tagSet="ejb" tagName="permission" scope="type">
+      	<attrib name="role-name"/>
+      	<attrib name="unchecked" type="bool"/>
+      </AnnotationTagInfo>
+      
+    </extension>
+
+   <extension
+         point="org.eclipse.jst.j2ee.ejb.annotations.ui.ProviderPreferenceMapping">
+      <mapping
+            name="XDoclet"
+            preferencePage="org.eclipse.jst.j2ee.ejb.annotations.xdoclet.preference"/>
+   </extension>
+</plugin>
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/pom.xml b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/pom.xml
new file mode 100644
index 0000000..25389d1
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/pom.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Copyright (c) 2012, 2013 Eclipse Foundation and others.
+  All rights reserved. This program and the accompanying materials
+  are made available under the terms of the Eclipse Distribution License v1.0
+  which accompanies this distribution, and is available at
+  http://www.eclipse.org/org/documents/edl-v10.php
+ 
+  Contributors:
+    Thanh Ha (Eclipse Foundation) - initial implementation
+-->
+
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.eclipse.webtools.javaee</groupId>
+    <artifactId>javaee.plugins</artifactId>
+    <version>3.6.0-SNAPSHOT</version>
+  </parent>
+
+  <groupId>org.eclipse.webtools.ejb</groupId>
+  <artifactId>org.eclipse.jst.j2ee.ejb.annotations.xdoclet</artifactId>
+  <version>1.2.300-SNAPSHOT</version>
+  <packaging>eclipse-plugin</packaging>
+</project>
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/schema/ejbDocletTaskProvider.exsd b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/schema/ejbDocletTaskProvider.exsd
new file mode 100644
index 0000000..2837c5e
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/schema/ejbDocletTaskProvider.exsd
@@ -0,0 +1,289 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.jst.j2ee.ejb.annotations.xdoclet">
+<annotation>
+      <appInfo>
+         <meta.schema plugin="org.eclipse.jst.j2ee.ejb.annotations.xdoclet" id="ejbDocletTaskProvider" name="EJB Doclet Task Provider"/>
+      </appInfo>
+      <documentation>
+         Allows extenders to define tasks that can run during ejbdoclet processing.  The task must be supported by XDoclet.  Task properties editable by a dynamic UI generated from the extension point.
+      </documentation>
+   </annotation>
+
+   <element name="extension">
+      <complexType>
+         <sequence>
+            <element ref="EjbdocletTaskProvider"/>
+            <element ref="TaskProperty" minOccurs="0" maxOccurs="unbounded"/>
+            <element ref="AnnotationProvider" minOccurs="0" maxOccurs="3"/>
+         </sequence>
+         <attribute name="point" type="string" use="required">
+            <annotation>
+               <documentation>
+                  a fully qualified identifier of the target extension point
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string">
+            <annotation>
+               <documentation>
+                  an optional identifier of the extension instance
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="name" type="string">
+            <annotation>
+               <documentation>
+                  an optional name of the extension instance
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="EjbdocletTaskProvider">
+      <complexType>
+         <attribute name="name" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appInfo>
+                  <meta.attribute translatable="true"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+         <attribute name="class" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appInfo>
+                  <meta.attribute kind="java"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+         <attribute name="description" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appInfo>
+                  <meta.attribute translatable="true"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="defaultSelection" type="boolean" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="TaskProperty">
+      <complexType>
+         <attribute name="id" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="label" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appInfo>
+                  <meta.attribute translatable="true"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+         <attribute name="default" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="type">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+            <simpleType>
+               <restriction base="string">
+                  <enumeration value="string">
+                  </enumeration>
+                  <enumeration value="boolean">
+                  </enumeration>
+                  <enumeration value="enum">
+                  </enumeration>
+                  <enumeration value="file">
+                  </enumeration>
+                  <enumeration value="dir">
+                  </enumeration>
+               </restriction>
+            </simpleType>
+         </attribute>
+         <attribute name="restriction" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="include" type="boolean" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="description" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appInfo>
+                  <meta.attribute translatable="true"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="AnnotationProvider">
+      <complexType>
+         <attribute name="class" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appInfo>
+                  <meta.attribute kind="java" basedOn="org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.IXDocletRuntimeAnnotation"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+         <attribute name="type" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+            <simpleType>
+               <restriction base="string">
+                  <enumeration value="entity">
+                  </enumeration>
+                  <enumeration value="session">
+                  </enumeration>
+                  <enumeration value="mdb">
+                  </enumeration>
+               </restriction>
+            </simpleType>
+         </attribute>
+         <attribute name="include" type="boolean" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="since"/>
+      </appInfo>
+      <documentation>
+         &lt;b&gt;This extension point is part of an interim API that is still under development and expected to change significantly before reaching stability. It is being made available at this early stage to solicit feedback from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken (repeatedly) as the API evolves.&lt;/b&gt;
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="examples"/>
+      </appInfo>
+      <documentation>
+         &lt;pre&gt;
+   &lt;extension
+         id=&quot;org.eclipse.jst.j2ee.xdoclet.ejbDocletTaskProvider.utilobject&quot;
+         name=&quot;%ejbdoclet.UtilObject&quot;
+         point=&quot;org.eclipse.jst.j2ee.ejb.annotations.xdoclet.ejbDocletTaskProvider&quot;&gt;
+      &lt;EjbdocletTaskProvider
+            class=&quot;org.eclipse.jst.j2ee.xdoclet.runtime.internal.tasks.UtilObjectEjbdocletTaskProvider&quot;
+            defaultSelection=&quot;true&quot;
+            description=&quot;%ejbdoclet.UtilObject.desc&quot;
+            id=&quot;org.eclipse.jst.j2ee.xdoclet.runtime.internal.tasks.UtilObjectEjbdocletTaskProvider&quot;
+            name=&quot;UtilObject&quot;/&gt;
+      &lt;TaskProperty
+            default=&quot;true&quot;
+            id=&quot;ejbdoclet.utilobject.cacheHomes&quot;
+            label=&quot;cacheHomes&quot;
+            include=&quot;true&quot;            
+            type=&quot;boolean&quot;
+            description=&quot;%ejbdoclet.utilobject.cacheHomes&quot;/&gt;            
+      &lt;TaskProperty
+            default=&quot;true&quot;
+            id=&quot;ejbdoclet.utilobject.includeGUID&quot;
+            label=&quot;includeGUID&quot;
+            include=&quot;true&quot;            
+            type=&quot;boolean&quot;
+            description=&quot;%ejbdoclet.utilobject.includeGUID&quot;/&gt; 
+      &lt;TaskProperty
+            default=&quot;physical&quot;
+            id=&quot;ejbdoclet.utilobject.kind&quot;
+            label=&quot;kind&quot;
+            include=&quot;true&quot;            
+            restriction=&quot;physical,logical&quot;
+            type=&quot;enum&quot;
+            description=&quot;%ejbdoclet.utilobject.kind&quot;/&gt;                       
+   &lt;/extension&gt;
+&lt;/pre&gt;
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="apiInfo"/>
+      </appInfo>
+      <documentation>
+         
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="implementation"/>
+      </appInfo>
+      <documentation>
+         org.eclipse.jst.j2ee.ejb.annotations.xdoclet.runtime plugin
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="copyright"/>
+      </appInfo>
+      <documentation>
+         Copyright (c) 2005 Eteration A.S. and others.&lt;br&gt;
+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 &lt;a
+href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
+      </documentation>
+   </annotation>
+
+</schema>
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/schema/webdocletTaskProvider.exsd b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/schema/webdocletTaskProvider.exsd
new file mode 100644
index 0000000..be54597
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/schema/webdocletTaskProvider.exsd
@@ -0,0 +1,269 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.jst.j2ee.ejb.annotations.xdoclet">
+<annotation>
+      <appInfo>
+         <meta.schema plugin="org.eclipse.jst.j2ee.ejb.annotations.xdoclet" id="webdocletTaskProvider" name="Web Doclet Task Provider"/>
+      </appInfo>
+      <documentation>
+         Allows extenders to define tasks that can run during webdoclet processing.  The task must be supported by XDoclet.  Task properties editable by a dynamic UI generated from the extension point.
+      </documentation>
+   </annotation>
+
+   <element name="extension">
+      <complexType>
+         <sequence>
+            <element ref="WebdocletTaskProvider"/>
+            <element ref="TaskProperty" minOccurs="0" maxOccurs="unbounded"/>
+         </sequence>
+         <attribute name="point" type="string" use="required">
+            <annotation>
+               <documentation>
+                  a fully qualified identifier of the target extension point
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string">
+            <annotation>
+               <documentation>
+                  an optional identifier of the extension instance
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="name" type="string">
+            <annotation>
+               <documentation>
+                  an optional name of the extension instance
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="WebdocletTaskProvider">
+      <complexType>
+         <attribute name="name" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appInfo>
+                  <meta.attribute translatable="true"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+         <attribute name="class" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appInfo>
+                  <meta.attribute kind="java"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+         <attribute name="description" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appInfo>
+                  <meta.attribute translatable="true"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="defaultSelection" type="boolean" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="TaskProperty">
+      <complexType>
+         <attribute name="id" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="label" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appInfo>
+                  <meta.attribute translatable="true"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+         <attribute name="default" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="type">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+            <simpleType>
+               <restriction base="string">
+                  <enumeration value="string">
+                  </enumeration>
+                  <enumeration value="boolean">
+                  </enumeration>
+                  <enumeration value="enum">
+                  </enumeration>
+                  <enumeration value="file">
+                  </enumeration>
+                  <enumeration value="dir">
+                  </enumeration>
+               </restriction>
+            </simpleType>
+         </attribute>
+         <attribute name="description" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appInfo>
+                  <meta.attribute translatable="true"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+         <attribute name="include" type="boolean" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="restriction" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="since"/>
+      </appInfo>
+      <documentation>
+         &lt;b&gt;This extension point is part of an interim API that is still under development and expected to change significantly before reaching stability. It is being made available at this early stage to solicit feedback from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken (repeatedly) as the API evolves.&lt;/b&gt;
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="examples"/>
+      </appInfo>
+      <documentation>
+         &lt;pre&gt;
+   &lt;extension
+         id=&quot;org.eclipse.jst.j2ee.xdoclet.webdocletTaskProvider.deploymentdescriptor&quot;
+         name=&quot;%webdoclet.deploymentdesc&quot;
+         point=&quot;org.eclipse.jst.j2ee.ejb.annotations.xdoclet.webdocletTaskProvider&quot;&gt;
+      &lt;WebdocletTaskProvider
+            class=&quot;org.eclipse.jst.j2ee.xdoclet.runtime.internal.tasks.DeploymentDescriptorWebdocletTaskProvider&quot;
+            defaultSelection=&quot;true&quot;
+            description=&quot;%webdoclet.deploymentdesc.desc&quot;
+            id=&quot;org.eclipse.jst.j2ee.xdoclet.runtime.internal.tasks.DeploymentDescriptorWebdocletTaskProvider&quot;
+            name=&quot;DeploymentDescriptor&quot;/&gt;
+      &lt;TaskProperty
+            default=&quot;true&quot;
+            id=&quot;webdoclet.deploymentdescriptor.useIds&quot;
+            include=&quot;true&quot;
+            label=&quot;useIds&quot;
+            type=&quot;boolean&quot;
+            description=&quot;%webdoclet.deploymentdesc.useIds&quot; /&gt;
+      &lt;TaskProperty
+            default=&quot;${servlet.spec.version}&quot;
+            id=&quot;webdoclet.deploymentdescriptor.servletspec&quot;
+            include=&quot;true&quot;
+            label=&quot;servletspec&quot;
+            type=&quot;string&quot;
+            description=&quot;%webdoclet.deploymentdesc.servletspec&quot; /&gt;
+     &lt;TaskProperty
+            default=&quot;XDoclet Generated Name&quot;
+            id=&quot;webdoclet.deploymentdescriptor.displayname&quot;
+            include=&quot;true&quot;
+            label=&quot;displayname&quot;
+            type=&quot;string&quot;
+            description=&quot;%webdoclet.deploymentdesc.displayname&quot;/&gt;
+      &lt;TaskProperty
+            default=&quot;false&quot;
+            id=&quot;webdoclet.deploymentdescriptor.validatexml&quot;
+            include=&quot;true&quot;
+            label=&quot;validatexml&quot;
+            type=&quot;boolean&quot;
+            description=&quot;%webdoclet.deploymentdesc.validatexml&quot;/&gt;
+      &lt;TaskProperty
+            default=&quot;${web.module.webinf}&quot;
+            id=&quot;webdoclet.deploymentdescriptor.mergedir&quot;
+            include=&quot;true&quot;
+            label=&quot;mergedir&quot;
+            type=&quot;string&quot;
+            description=&quot;%webdoclet.deploymentdesc.mergedir&quot;/&gt;
+      &lt;TaskProperty
+            default=&quot;${web.module.webinf}&quot;
+            id=&quot;weboclet.deploymentdescriptor.destdir&quot;
+            include=&quot;true&quot;
+            label=&quot;destdir&quot;
+            type=&quot;string&quot;
+            description=&quot;%webdoclet.deploymentdesc.destdir&quot;/&gt;
+   &lt;/extension&gt;
+&lt;/pre&gt;
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="apiInfo"/>
+      </appInfo>
+      <documentation>
+         
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="implementation"/>
+      </appInfo>
+      <documentation>
+         org.eclipse.jst.j2ee.ejb.annotations.xdoclet.runtime plugin
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="copyright"/>
+      </appInfo>
+      <documentation>
+         Copyright (c) 2005 Eteration A.S. and others.&lt;br&gt;
+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 &lt;a
+href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
+      </documentation>
+   </annotation>
+
+</schema>
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/schema/xdocletRuntime.exsd b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/schema/xdocletRuntime.exsd
new file mode 100644
index 0000000..808c52d
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/schema/xdocletRuntime.exsd
@@ -0,0 +1,161 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.jst.j2ee.ejb.annotations.xdoclet">
+<annotation>
+      <appInfo>
+         <meta.schema plugin="org.eclipse.jst.j2ee.ejb.annotations.xdoclet" id="xdocletRuntime" name="XDoclet Runtime"/>
+      </appInfo>
+      <documentation>
+         xDocletRuntime Extension allows us to add new xdoclet runtimes as extensions.  For example to add XDoclet 2 support we will only need to define an extension.
+      </documentation>
+   </annotation>
+
+   <element name="extension">
+      <complexType>
+         <sequence>
+            <element ref="RuntimeVersion"/>
+            <element ref="RuntimeLib" minOccurs="1" maxOccurs="unbounded"/>
+         </sequence>
+         <attribute name="point" type="string" use="required">
+            <annotation>
+               <documentation>
+                  a fully qualified identifier of the target extension point
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string">
+            <annotation>
+               <documentation>
+                  an optional identifier of the extension instance
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="name" type="string">
+            <annotation>
+               <documentation>
+                  an optional name of the extension instance
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="RuntimeVersion">
+      <complexType>
+         <attribute name="xdoclet" type="string">
+            <annotation>
+               <documentation>
+                  XDoclet Version
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="ejb" type="string">
+            <annotation>
+               <documentation>
+                  Supported EJB Versions
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="servlet" type="string">
+            <annotation>
+               <documentation>
+                  Supported Servlet Version
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="jsp" type="string">
+            <annotation>
+               <documentation>
+                  Supported Servlet Version
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="RuntimeLib">
+      <complexType>
+         <attribute name="name" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="location" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="since"/>
+      </appInfo>
+      <documentation>
+         &lt;b&gt;This extension point is part of an interim API that is still under development and expected to change significantly before reaching stability. It is being made available at this early stage to solicit feedback from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken (repeatedly) as the API evolves.&lt;/b&gt;
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="examples"/>
+      </appInfo>
+      <documentation>
+         &lt;pre&gt;
+   &lt;extension
+         id=&quot;org.eclipse.jst.j2ee.xdoclet.xdocletRuntime.121&quot;
+         name=&quot;%xdoclet.121&quot;
+         point=&quot;org.eclipse.jst.j2ee.ejb.annotations.xdoclet.xdocletRuntime&quot;&gt;
+      &lt;RuntimeVersion
+            ejb=&quot;2.0&quot;
+            jsp=&quot;1.1&quot;
+            servlet=&quot;2.3&quot;
+            xdoclet=&quot;1.2.1&quot;/&gt;
+      &lt;RuntimeLib
+            location=&quot;xdoclet-1.2.1.jar&quot;
+            name=&quot;xdoclet-1.2.1.jar&quot;/&gt;
+      &lt;RuntimeLib
+            location=&quot;xjavadoc-1.0.3.jar&quot;
+            name=&quot;xjavadoc-1.0.3.jar&quot;/&gt;
+   &lt;/extension&gt;
+&lt;/pre&gt;
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="apiInfo"/>
+      </appInfo>
+      <documentation>
+         
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="implementation"/>
+      </appInfo>
+      <documentation>
+         org.eclipse.jst.j2ee.ejb.annotations.xdoclet.runtime plugin
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="copyright"/>
+      </appInfo>
+      <documentation>
+         Copyright (c) 2005 Eteration A.S. and others.&lt;br&gt;
+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 &lt;a
+href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
+      </documentation>
+   </annotation>
+
+</schema>
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/ClasspathProvider.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/ClasspathProvider.java
new file mode 100644
index 0000000..9bd8873
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/ClasspathProvider.java
@@ -0,0 +1,39 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet;
+
+import java.util.List;
+
+import org.eclipse.jst.j2ee.ejb.annotations.internal.emitter.DefaultClasspathProvider;
+
+/**
+ * @author naci
+ * 
+ * TODO To change the template for this generated type comment go to Window -
+ * Preferences - Java - Code Generation - Code and Comments
+ */
+public class ClasspathProvider extends DefaultClasspathProvider {
+	public ClasspathProvider() {
+		// Default constructor
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jst.j2ee.ejb.annotations.internal.emitter.model.internal.emitter.DefaultClasspathProvider#getClasspathItems()
+	 */
+	public List getClasspathItems() {
+		List list  = super.getClasspathItems();
+		list.add("org.eclipse.jst.j2ee.ejb.annotations.xdoclet");	
+		list.add("org.eclipse.jst.common.frameworks");
+		list.add("org.eclipse.wst.common.frameworks");
+		return list;
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/IXDocletRuntimeAnnotation.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/IXDocletRuntimeAnnotation.java
new file mode 100644
index 0000000..f3c3740
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/IXDocletRuntimeAnnotation.java
@@ -0,0 +1,18 @@
+package org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.model.IEnterpriseBean;
+
+public interface IXDocletRuntimeAnnotation {
+
+	public final static String entity = "entity";
+
+	public final static String session = "session";
+
+	public final static String mdb = "mdb";
+
+	String getTypeAnnotations(IProject project, IEnterpriseBean beanModel);
+	public abstract void setPreferenceStore(XDocletPreferenceStore preferenceStore);
+	public abstract XDocletPreferenceStore getPreferenceStore();
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/Logger.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/Logger.java
new file mode 100644
index 0000000..5c8a642
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/Logger.java
@@ -0,0 +1,144 @@
+/*******************************************************************************
+ * Copyright (c) 2004 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet;
+
+import java.util.StringTokenizer;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.osgi.framework.Bundle;
+
+/**
+ * Small convenience class to log messages to plugin's log file and also, if desired,
+ * the console. This class should only be used by classes in this plugin. Other
+ * plugins should make their own copy, with appropriate ID.
+ */
+public class Logger {
+	private static final String PLUGIN_ID = "org.eclipse.jst.j2ee.ejb.annotations.xdoclet"; //$NON-NLS-1$
+
+	private static final String TRACEFILTER_LOCATION = "/debug/tracefilter"; //$NON-NLS-1$
+
+	public static final int OK = IStatus.OK; // 0
+	public static final int INFO = IStatus.INFO; // 1
+	public static final int WARNING = IStatus.WARNING; // 2
+	public static final int ERROR = IStatus.ERROR; // 4
+
+	public static final int OK_DEBUG = 200 + OK;
+	public static final int INFO_DEBUG = 200 + INFO;
+	public static final int WARNING_DEBUG = 200 + WARNING;
+	public static final int ERROR_DEBUG = 200 + ERROR;
+
+	/**
+	 * Adds message to log.
+	 * @param level severity level of the message (OK, INFO, WARNING, ERROR, OK_DEBUG, INFO_DEBUG, WARNING_DEBUG, ERROR_DEBUG)
+	 * @param message text to add to the log
+	 * @param exception exception thrown
+	 */
+	protected static void _log(int level, String message, Throwable exception) {
+		if (level == OK_DEBUG || level == INFO_DEBUG || level == WARNING_DEBUG || level == ERROR_DEBUG) {
+			if (!isDebugging())
+				return;
+		}
+
+		int severity = IStatus.OK;
+		switch (level) {
+			case INFO_DEBUG :
+			case INFO :
+				severity = IStatus.INFO;
+				break;
+			case WARNING_DEBUG :
+			case WARNING :
+				severity = IStatus.WARNING;
+				break;
+			case ERROR_DEBUG :
+			case ERROR :
+				severity = IStatus.ERROR;
+		}
+		message = (message != null) ? message : "null"; //$NON-NLS-1$
+		Status statusObj = new Status(severity, PLUGIN_ID, severity, message, exception);
+		Bundle bundle = Platform.getBundle(PLUGIN_ID);
+		if (bundle != null) 
+			Platform.getLog(bundle).log(statusObj);
+	}
+
+	/**
+	 * Prints message to log if category matches /debug/tracefilter option.
+	 * @param message text to print
+	 * @param category category of the message, to be compared with /debug/tracefilter
+	 */
+	protected static void _trace(String category, String message, Throwable exception) {
+		if (isTracing(category)) {
+			message = (message != null) ? message : "null"; //$NON-NLS-1$
+			Status statusObj = new Status(IStatus.OK, PLUGIN_ID, IStatus.OK, message, exception);
+			Bundle bundle = Platform.getBundle(PLUGIN_ID);
+			if (bundle != null) 
+				Platform.getLog(bundle).log(statusObj);
+		}
+	}
+
+	/**
+	 * @return true if the platform is debugging
+	 */
+	public static boolean isDebugging() {
+		return Platform.inDebugMode();
+	}
+
+	/**
+	 * Determines if currently tracing a category
+	 * @param category
+	 * @return true if tracing category, false otherwise
+	 */
+	public static boolean isTracing(String category) {
+		if (!isDebugging())
+			return false;
+
+		String traceFilter = Platform.getDebugOption(PLUGIN_ID + TRACEFILTER_LOCATION);
+		if (traceFilter != null) {
+			StringTokenizer tokenizer = new StringTokenizer(traceFilter, ","); //$NON-NLS-1$
+			while (tokenizer.hasMoreTokens()) {
+				String cat = tokenizer.nextToken().trim();
+				if (category.equals(cat)) {
+					return true;
+				}
+			}
+		}
+		return false;
+	}
+
+	public static void log(int level, String message) {
+		_log(level, message, null);
+	}
+
+	public static void log(int level, String message, Throwable exception) {
+		_log(level, message, exception);
+	}
+
+	public static void logException(String message, Throwable exception) {
+		_log(ERROR, message, exception);
+	}
+
+	public static void logException(Throwable exception) {
+		_log(ERROR, exception.getMessage(), exception);
+	}
+
+	public static void traceException(String category, String message, Throwable exception) {
+		_trace(category, message, exception);
+	}
+
+	public static void traceException(String category, Throwable exception) {
+		_trace(category, exception.getMessage(), exception);
+	}
+
+	public static void trace(String category, String message) {
+		_trace(category, message, null);
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/XDocletAnnotationPlugin.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/XDocletAnnotationPlugin.java
new file mode 100644
index 0000000..d519abe
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/XDocletAnnotationPlugin.java
@@ -0,0 +1,108 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The main plugin class to be used in the desktop.
+ */
+public class XDocletAnnotationPlugin extends AbstractUIPlugin {
+	//The shared instance.
+	private static XDocletAnnotationPlugin plugin;
+	//Resource bundle.
+	private ResourceBundle resourceBundle;
+	public static final String PLUGINID = "org.eclipse.jst.j2ee.ejb.annotations.xdoclet";
+	/**
+	 * The constructor.
+	 */
+	public XDocletAnnotationPlugin() {
+		super();
+		plugin = this;
+	}
+
+	/**
+	 * This method is called upon plug-in activation
+	 */
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+	}
+
+	/**
+	 * This method is called when the plug-in is stopped
+	 */
+	public void stop(BundleContext context) throws Exception {
+		super.stop(context);
+		plugin = null;
+		resourceBundle = null;
+	}
+
+	/**
+	 * Returns the shared instance.
+	 */
+	public static XDocletAnnotationPlugin getDefault() {
+		return plugin;
+	}
+
+	/**
+	 * Returns the string from the plugin's resource bundle,
+	 * or 'key' if not found.
+	 */
+	public static String getResourceString(String key) {
+		ResourceBundle bundle = XDocletAnnotationPlugin.getDefault().getResourceBundle();
+		try {
+			return (bundle != null) ? bundle.getString(key) : key;
+		} catch (MissingResourceException e) {
+			return key;
+		}
+	}
+
+	/**
+	 * Returns the plugin's resource bundle,
+	 */
+	public ResourceBundle getResourceBundle() {
+		try {
+			if (resourceBundle == null)
+				resourceBundle = ResourceBundle.getBundle("org.eclipse.jst.j2ee.ejb.annotations.internal.emitter.model.xdoclet.XDocletAnnotationPluginResources");
+		} catch (MissingResourceException x) {
+			resourceBundle = null;
+		}
+		return resourceBundle;
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#initializeDefaultPreferences(org.eclipse.jface.preference.IPreferenceStore)
+	 */
+	protected void initializeDefaultPreferences(IPreferenceStore store) {
+		XDocletPreferenceStore.initializeDefaultPreferences(store);
+	}
+	
+
+	public static ImageDescriptor createImageDescriptor(URL root, String file) {
+		try {
+			URL urlToImage =
+				new URL(root,file);
+			return ImageDescriptor.createFromURL(urlToImage);
+		} catch (MalformedURLException e) {
+			Logger.logException(e);
+			return null;
+		}
+
+	}	
+	
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/XDocletAntProjectBuilder.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/XDocletAntProjectBuilder.java
new file mode 100644
index 0000000..2cf5db5
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/XDocletAntProjectBuilder.java
@@ -0,0 +1,218 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+package org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet;
+
+import java.io.File;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Properties;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.IWorkspaceRunnable;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IPackageFragmentRoot;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.launching.JavaRuntime;
+import org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.util.AntLauncherUtility;
+import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.resources.IVirtualResource;
+
+public abstract class XDocletAntProjectBuilder {
+
+	protected URL templateUrl;
+
+	XDocletPreferenceStore preferenceStore = null;
+
+	IProject project;
+
+	IResource resource;
+
+	Properties properties;
+
+	public static class Factory {
+
+		public static XDocletAntProjectBuilder newInstance(IResource resource) {
+			IVirtualResource[] vResources = ComponentCore.createResources(resource);
+			XDocletAntProjectBuilder antProjectBuilder = null;
+			if (vResources.length == 0)
+				return null;
+			if (J2EEProjectUtilities.isEJBProject(vResources[0].getComponent().getProject()))
+				antProjectBuilder = new XDocletEjbAntProjectBuilder();
+
+			else if (J2EEProjectUtilities.isDynamicWebProject(vResources[0].getComponent().getProject()))
+				antProjectBuilder = new XDocletWebAntProjectBuilder();
+			antProjectBuilder.setProject(vResources[0].getComponent().getProject());
+			antProjectBuilder.setResource(resource);
+			return antProjectBuilder;
+		}
+
+	}
+
+	public XDocletAntProjectBuilder() {
+		super();
+	}
+
+	private XDocletPreferenceStore initPreferenceStore(IProject project) {
+		if (preferenceStore == null) {
+			preferenceStore = XDocletPreferenceStore.forProject(project);
+
+		}
+		return preferenceStore;
+	}
+
+	protected String asClassPath(IJavaProject project) throws CoreException {
+		String[] cp = createClassPath(project);
+		StringBuffer buf = new StringBuffer(256);
+		for (int i = 0; i < cp.length; i++) {
+			String string = cp[i];
+			buf.append(string);
+			if (i != cp.length - 1)
+				buf.append(File.pathSeparatorChar);
+		}
+		return buf.toString();
+	}
+
+	protected String[] createClassPath(IJavaProject project) throws CoreException {
+		String[] cp = JavaRuntime.computeDefaultRuntimeClassPath(project);
+		return cp;
+	}
+
+
+	public void buildUsingAnt(final IResource beanClass,final IProgressMonitor monitor) throws CoreException {
+		initPreferenceStore(beanClass.getProject());
+		IWorkspaceRunnable runnable = new IWorkspaceRunnable() {
+
+
+
+			public void run(IProgressMonitor aMonitor) throws CoreException {
+				IJavaProject javaProject = JavaCore.create(beanClass.getProject());
+				try {
+					IPackageFragmentRoot packageFragmentRoot = getPackageFragmentRootOrFirst(beanClass);
+					String beanPath = constructAnnotatedClassList(packageFragmentRoot, beanClass);
+
+					Properties properties = createAntBuildProperties(beanClass, javaProject, packageFragmentRoot, beanPath);
+					XDocletAntProjectBuilder.this.setProperties(properties);
+					HashMap templates = createTemplates(beanPath);
+
+					AntLauncherUtility antLauncher = new AntLauncherUtility(templateUrl, beanClass.getParent().getLocation(), properties,
+							templates);
+					antLauncher.setUseLauncher(true);
+					antLauncher.launch(getTaskName(), aMonitor);
+					XDocletAntProjectBuilder.this.refreshProjects(beanClass.getProject(), aMonitor);
+				} catch (Exception e) {
+					Logger.logException(e);
+				}
+			}
+		};
+
+		ResourcesPlugin.getWorkspace().run(runnable, null, IWorkspace.AVOID_UPDATE, monitor);
+
+	}
+
+	private IPackageFragmentRoot getPackageFragmentRootOrFirst(IResource beanClass) throws JavaModelException {
+		try {
+			ICompilationUnit compilationUnit = JavaCore.createCompilationUnitFrom((IFile) beanClass);
+			return this.getPackageFragmentRoot(compilationUnit);
+		} catch (RuntimeException e) {
+		}
+
+		IContainer container = J2EEProjectUtilities.getSourceFolderOrFirst(beanClass.getProject(), "ejbModule");
+		return JavaCore.create(beanClass.getProject()).findPackageFragmentRoot(container.getFullPath());
+	}
+
+	protected abstract String getTaskName();
+
+	protected abstract void refreshProjects(IProject project, IProgressMonitor monitor) throws CoreException;
+
+	protected abstract HashMap createTemplates(String beanPath);
+
+	protected abstract Properties createAntBuildProperties(IResource resource, IJavaProject javaProject,
+			IPackageFragmentRoot packageFragmentRoot, String beanPath);
+
+	protected abstract String constructAnnotatedClassList(IPackageFragmentRoot root, IResource changedBean);
+
+	/**
+	 * @param path2
+	 * @param root
+	 * @return
+	 */
+	protected IPath makeRelativeTo(IPath path, IPackageFragmentRoot root) {
+		if (root == null)
+			return path;
+		try {
+			IPath rpath = root.getCorrespondingResource().getProjectRelativePath();
+			if (rpath.isPrefixOf(path))
+				return path.removeFirstSegments(rpath.matchingFirstSegments(path));
+		} catch (JavaModelException e) {
+			Logger.logException(e);
+		}
+
+		return path;
+	}
+
+	protected IPackageFragmentRoot getPackageFragmentRoot(ICompilationUnit res) {
+		IJavaElement current = res;
+		do {
+			if (current instanceof IPackageFragmentRoot)
+				return (IPackageFragmentRoot) current;
+			current = current.getParent();
+		} while (current != null);
+		return null;
+	}
+
+	protected IPath getJavaProjectOutputContainer(IJavaProject proj) throws JavaModelException {
+		IPath path = proj.getOutputLocation();
+		if (path == null)
+			return null;
+		if (path.segmentCount() == 1)
+			return path;
+		return ((IContainer) proj.getProject()).getFolder(path.removeFirstSegments(1)).getProjectRelativePath();
+	}
+
+	public XDocletPreferenceStore getPreferenceStore() {
+		return preferenceStore;
+	}
+
+	public IProject getProject() {
+		return project;
+	}
+
+	public void setProject(IProject project) {
+		this.project = project;
+	}
+
+	public Properties getProperties() {
+		return properties;
+	}
+
+	public void setProperties(Properties properties) {
+		this.properties = properties;
+	}
+
+	public IResource getResource() {
+		return resource;
+	}
+
+	public void setResource(IResource resource) {
+		this.resource = resource;
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/XDocletBuildUtility.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/XDocletBuildUtility.java
new file mode 100644
index 0000000..da23943
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/XDocletBuildUtility.java
@@ -0,0 +1,132 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+package org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet;
+
+import org.eclipse.core.resources.ICommand;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.resources.IncrementalProjectBuilder;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+
+public class XDocletBuildUtility {
+
+	public static final Object FAMILY_MANUAL_BUILD = new Object();
+	private static final String XDOCLETBUILDER = "org.eclipse.jst.j2ee.ejb.annotations.xdoclet.xdocletbuilder";
+
+	class BuildJob extends Job {
+		
+		private final IProject fProject;
+		ICommand xdocletBuilder;
+	
+		private BuildJob(String name, IProject project) {
+			super(name);
+			fProject = project;
+			xdocletBuilder = getXDocletBuilder(project);
+	
+	
+		}
+	
+		public boolean isCoveredBy(IProject aProject) {
+	
+			return fProject != null && fProject.equals(aProject);
+		}
+	
+		public boolean belongsTo(Object family) {
+			return family == XDocletBuildUtility.FAMILY_MANUAL_BUILD;
+		}
+		
+		protected IStatus run(IProgressMonitor monitor) {
+			if (xdocletBuilder != null) {
+				try {
+					fProject.build(IncrementalProjectBuilder.INCREMENTAL_BUILD, monitor);
+				} catch (CoreException e) {
+					Logger.logException(e);
+					return Status.CANCEL_STATUS;
+				}
+			}
+			return Status.OK_STATUS;
+		}
+	
+		protected ICommand getXDocletBuilder(IProject aProject) {
+			IProjectDescription description;
+			try {
+				description = aProject.getDescription();
+	
+				if (description == null) {
+					return null;
+				}
+	
+				ICommand[] commands = description.getBuildSpec();
+				for (int i = 0; i < commands.length; ++i) {
+					if (commands[i].getBuilderName().equals(XDOCLETBUILDER)) {
+						return commands[i];
+					}
+				}
+			} catch (CoreException e) {
+				Logger.logException(e);
+			}
+			return null;
+	
+		}
+	
+	}
+
+	public static void runNecessaryBuilders(IProgressMonitor monitor, IProject project) throws CoreException {
+		if (project != null)
+			runNecessaryBuildersForProject(project, monitor);
+		else {
+			IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
+			for (int i = 0; i < projects.length; i++) {
+				runNecessaryBuildersForProject(projects[i], monitor);
+			}
+	
+		}
+	}
+
+	private static void runNecessaryBuildersForProject(IProject aProject, IProgressMonitor monitor) throws CoreException {
+	
+		Job[] buildJobs = Platform.getJobManager().find(FAMILY_MANUAL_BUILD);
+		for (int i = 0; i < buildJobs.length; i++) {
+			Job curr = buildJobs[i];
+			if (curr instanceof BuildJob) {
+				BuildJob job = (BuildJob) curr;
+				if (job.isCoveredBy(aProject)) {
+					curr.cancel(); // cancel all other build jobs of our kind
+				}
+			}
+		}
+	
+		XDocletBuildUtility buildUtility = new XDocletBuildUtility();
+		XDocletBuildUtility.BuildJob buildJob = buildUtility.new BuildJob("XDoclet Build", aProject);
+		buildJob.schedule(1000L);
+		
+	}
+
+	protected ICommand getXDocletBuilder(IProjectDescription description) throws CoreException {
+		if (description == null) {
+			return null;
+		}
+	
+		ICommand[] commands = description.getBuildSpec();
+		for (int i = 0; i < commands.length; ++i) {
+			if (commands[i].getBuilderName().equals(XDOCLETBUILDER)) {
+				return commands[i];
+			}
+		}
+		return null;
+	
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/XDocletBuilder.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/XDocletBuilder.java
new file mode 100644
index 0000000..24424b0
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/XDocletBuilder.java
@@ -0,0 +1,384 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+package org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet;
+
+import java.util.Map;
+
+import org.eclipse.core.resources.ICommand;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceDelta;
+import org.eclipse.core.resources.IResourceDeltaVisitor;
+import org.eclipse.core.resources.IResourceVisitor;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.IncrementalProjectBuilder;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExecutableExtension;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.content.IContentDescription;
+import org.eclipse.core.runtime.content.IContentType;
+import org.eclipse.core.runtime.jobs.ISchedulingRule;
+import org.eclipse.core.runtime.jobs.Job;
+
+public class XDocletBuilder extends IncrementalProjectBuilder implements IExecutableExtension {
+
+	private static final String JAVASOURCE_TYPE = "org.eclipse.jdt.core.javaSource"; //$NON-NLS-1$
+
+	private static final boolean performValidateEdit = false;
+
+	private static final String[] XDOCLETBUILDINCLUDEFILES = { "ejb-jar.xml", "web.xml", "bean.java", "servlet.java",
+			"controller.java", "ejb.java", "mdb.java" };
+
+	private static boolean isGloballyEnabled = true;
+
+	/**
+	 * Add the XDocletBuilder to the build spec of a single IProject
+	 * 
+	 * @param project -
+	 *            the IProject to add to, when needed
+	 */
+	public static void add(IProgressMonitor monitor, IProject project, Object validateEditContext) {
+		if (project == null || !project.isAccessible()) {
+			return;
+		}
+		boolean isBuilderPresent = false;
+		try {
+			IFile descriptionFile = project.getFile(IProjectDescription.DESCRIPTION_FILE_NAME);
+			if (descriptionFile.exists() && descriptionFile.isAccessible()) {
+				IProjectDescription description = project.getDescription();
+				ICommand[] commands = description.getBuildSpec();
+				if (commands != null) {
+					for (int i = 0; i < commands.length; i++) {
+						String builderName = commands[i].getBuilderName();
+						// builder name will be null if it has not been set
+						if (builderName != null && builderName.equals(getBuilderId())) {
+							isBuilderPresent = true;
+							break;
+						}
+					}
+				}
+				if (!isBuilderPresent && !monitor.isCanceled()) {
+					// validate for edit
+					IStatus status = null;
+					if (performValidateEdit) {
+						ISchedulingRule validateEditRule = null;
+						try {
+
+							IFile[] validateFiles = new IFile[] { descriptionFile };
+							IWorkspace workspace = descriptionFile.getWorkspace();
+							validateEditRule = workspace.getRuleFactory().validateEditRule(validateFiles);
+							Job.getJobManager().beginRule(validateEditRule, monitor);
+							status = workspace.validateEdit(validateFiles, null);
+						} finally {
+							if (validateEditRule != null) {
+								Job.getJobManager().endRule(validateEditRule);
+							}
+						}
+					}
+					if (status == null || status.isOK()) {
+						// add the builder
+						ICommand newCommand = description.newCommand();
+						newCommand.setBuilderName(getBuilderId());
+						ICommand[] newCommands = null;
+						if (commands != null) {
+							newCommands = new ICommand[commands.length + 1];
+							System.arraycopy(commands, 0, newCommands, 0, commands.length);
+							newCommands[commands.length] = newCommand;
+						} else {
+							newCommands = new ICommand[1];
+							newCommands[0] = newCommand;
+						}
+						description.setBuildSpec(newCommands);
+						/*
+						 * This 'refresh' was added since unit tests were
+						 * throwing exceptions about being out of sync. That may
+						 * indicate a "deeper" problem such as needing to use
+						 * scheduling rules, (although there don't appear to be
+						 * examples of that) or something similar.
+						 */
+						// project.refreshLocal(IResource.DEPTH_ZERO,
+						// subMonitorFor(monitor, 1,
+						// IProgressMonitor.UNKNOWN));
+						try {
+							project.setDescription(description, monitor);
+						} catch (CoreException e) {
+							if (performValidateEdit) {
+								Logger
+										.log(
+												Logger.WARNING,
+												"Description for project \"" + project.getName() + "\" could not be updated despite successful build"); //$NON-NLS-2$//$NON-NLS-1$					
+							} else {
+								Logger.log(Logger.WARNING,
+										"Description for project \"" + project.getName() + "\" could not be updated"); //$NON-NLS-2$//$NON-NLS-1$					
+							}
+						}
+					}
+				}
+			} else {
+				Logger.log(Logger.WARNING, "Description for project \"" + project.getName() + "\" could not be updated"); //$NON-NLS-2$//$NON-NLS-1$
+			}
+		} catch (Exception e) {
+			// if we can't read the information, the project isn't open,
+			// so it can't run auto-validate
+			Logger.logException("Exception caught when adding Model Builder", e); //$NON-NLS-1$
+		}
+	}
+
+	/**
+	 * Adds the Builder to every project in the Workspace
+	 * 
+	 * @param root
+	 */
+	public synchronized static void add(IProgressMonitor monitor, IWorkspaceRoot root, Object validateEditContext) {
+		IProject[] allProjects = root.getProjects();
+		IProgressMonitor localMonitor = monitor;
+		localMonitor.beginTask("Starting to add builder to projects with EJB modules", 1); //$NON-NLS-1$
+		for (int i = 0; i < allProjects.length && !monitor.isCanceled(); i++) {
+			if (XDocletPreferenceStore.forProject(allProjects[i]).getBooleanProperty(XDocletPreferenceStore.XDOCLETBUILDERACTIVE)) {
+				add(localMonitor, allProjects[i], validateEditContext);
+			}
+			localMonitor.worked(1);
+		}
+		localMonitor.done();
+	}
+
+	public static String getBuilderId() {
+		return "org.eclipse.jst.j2ee.ejb.annotations.internal.emitter.model.xdocletbuilder"; //$NON-NLS-1$
+	}
+
+	public static IProgressMonitor monitorFor(IProgressMonitor monitor) {
+		if (monitor == null)
+			return new NullProgressMonitor();
+		return monitor;
+	}
+
+	private String fName = "XDoclet Builder"; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	public XDocletBuilder() {
+		super();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.core.internal.events.InternalBuilder#build(int,
+	 *      java.util.Map, org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	protected IProject[] build(int kind, Map args, IProgressMonitor monitor) throws CoreException {
+		IProject currentProject = getProject();
+		// Currently, just use the Task Tags preference
+		boolean locallyEnabled = XDocletPreferenceStore.forProject(currentProject).getBooleanProperty(
+				XDocletPreferenceStore.XDOCLETBUILDERACTIVE);
+		if (!locallyEnabled || currentProject == null || !currentProject.isAccessible()  || !isValidRuntime(currentProject)) {
+			return new IProject[] { currentProject };
+		}
+
+		IResourceDelta delta = getDelta(currentProject);
+		IProgressMonitor localMonitor = monitor;
+		localMonitor.beginTask(getDisplayName(), 1);
+
+		if (!localMonitor.isCanceled()) {
+			// check the kind of delta if one was given
+			if (kind == FULL_BUILD || kind == CLEAN_BUILD || delta == null) {
+				doFullBuild(kind, args, localMonitor, getProject());
+			} else {
+				doIncrementalBuild(kind, args, localMonitor);
+			}
+		}
+		localMonitor.worked(1);
+		localMonitor.done();
+
+		return new IProject[] { getProject() };
+	}
+
+	void build(int kind, Map args, IResource resource, IContentType[] types, IProgressMonitor monitor) throws CoreException {
+		boolean validRuntime = resource != null && isValidRuntime(resource.getProject());
+		if (!monitor.isCanceled() && resource.getType() == IResource.FILE && validRuntime) {
+			XDocletAntProjectBuilder antProjectBuilder = XDocletAntProjectBuilder.Factory.newInstance(resource);
+			if (antProjectBuilder != null)
+				antProjectBuilder.buildUsingAnt(resource, monitor);
+
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.core.resources.IncrementalProjectBuilder#clean(org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	protected void clean(IProgressMonitor monitor) throws CoreException {
+		super.clean(monitor);
+		IProject currentProject = getProject();
+		if (!isGloballyEnabled || currentProject == null || !currentProject.isAccessible()) {
+			return;
+		}
+		// doFullBuild(IncrementalProjectBuilder.CLEAN_BUILD, new HashMap(0),
+		// monitor, getProject());
+	}
+
+	boolean isXDocletAnnotatedResource(IResource resource) {
+		IContentType[] types = null;
+		if (resource.getType() == IResource.FILE && resource.isAccessible()) {
+			IContentDescription d = null;
+			try {
+				// optimized description lookup, might not succeed
+				d = ((IFile) resource).getContentDescription();
+				if (d != null && JAVASOURCE_TYPE.equals(d.getContentType().getId())) {
+					return XDoxletAnnotationUtil.isXDocletAnnotatedResource(resource);
+				}
+			} catch (CoreException e) {
+				// should not be possible given the accessible and file type
+				// check above
+			}
+			if (types == null) {
+				types = Platform.getContentTypeManager().findContentTypesFor(resource.getName());
+				for (int i = 0; i < types.length; i++) {
+					IContentType type = types[i];
+					if (JAVASOURCE_TYPE.equals(type.getId())) {
+						return XDoxletAnnotationUtil.isXDocletAnnotatedResource(resource);
+					}
+				}
+			}
+			return false;
+		} else if (resource.getType() == IResource.FILE && !resource.isAccessible()) {
+			// Deleted - Check to see if this is an xdoclet bean!
+			// This is a crude hack to make sure the build runs is a resource is
+			// deleted.
+			// **Bean.java **Servlet.java **Mdb.java and deployment descriptors
+			String name = resource.getName();
+			for (int i = 0; name != null && i < XDOCLETBUILDINCLUDEFILES.length; i++) {
+				String fileName = XDOCLETBUILDINCLUDEFILES[i];
+				if (name.toLowerCase().endsWith(fileName))
+					return true;
+
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * Iterate through the list of resources and build each one
+	 * 
+	 * @param monitor
+	 * @param resources
+	 */
+	protected void doFullBuild(int kind, Map args, IProgressMonitor monitor, IProject project) {
+
+		final IProgressMonitor subMonitor = monitor;
+		final int localKind = kind;
+		final Map localArgs = args;
+
+		final IProgressMonitor visitorMonitor = monitor;
+		IResourceVisitor internalBuilder = new IResourceVisitor() {
+			// xdoclet builder completes the whole project at once so no need to
+			// repeat the build with each annotated bean. Stop after the first
+			// one
+			boolean buildComplete = false;
+
+			public boolean visit(IResource resource) throws CoreException {
+				if (resource.getType() == IResource.FILE && buildComplete == false) {
+					// for any supported file type, record the resource
+					if (!buildComplete && isXDocletAnnotatedResource(resource)) {
+						build(localKind, localArgs, resource, null, subMonitor);
+						buildComplete = true;
+						visitorMonitor.worked(1);
+					}
+					return false;
+				}
+				return true;
+			}
+
+		};
+		try {
+			project.accept(internalBuilder);
+		} catch (CoreException e) {
+			Logger.logException(e);
+		}
+	}
+
+	/**
+	 * 
+	 */
+	protected void doIncrementalBuild(int kind, Map args, IProgressMonitor monitor) {
+		IResourceDelta projectDelta = getDelta(getProject());
+		if (projectDelta == null) {
+			throw new IllegalArgumentException("delta is null, should do a full build"); //$NON-NLS-1$
+		}
+
+		final Map localArgs = args;
+		final int localKind = kind;
+		final IProgressMonitor localMonitor = monitor;
+		IResourceDeltaVisitor participantVisitor = new IResourceDeltaVisitor() {
+			// xdoclet builder completes the whole project at once so no need to
+			// repeat the build with each annotated bean. Stop after the first
+			// one
+			boolean buildComplete = false;
+
+			public boolean visit(IResourceDelta delta) throws CoreException {
+				if (!localMonitor.isCanceled() && delta.getResource().getType() == IResource.FILE) {
+					if (!buildComplete && isXDocletAnnotatedResource(delta.getResource())) {
+						build(localKind, localArgs, delta.getResource(), null, localMonitor);
+						buildComplete = true;
+					}
+				}
+				return delta.getAffectedChildren().length > 0;
+			}
+		};
+		try {
+			projectDelta.accept(participantVisitor);
+		} catch (CoreException e) {
+			Logger.logException(e);
+		}
+		monitor.worked(1);
+	}
+
+	private String getDisplayName() {
+		return fName;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.core.runtime.IExecutableExtension#setInitializationData(org.eclipse.core.runtime.IConfigurationElement,
+	 *      java.lang.String, java.lang.Object)
+	 */
+	public void setInitializationData(IConfigurationElement config, String propertyName, Object data) throws CoreException {
+		if (config != null) {
+			fName = config.getDeclaringExtension().getLabel();
+		}
+	}
+
+	public static void shutdown() {
+		// Default
+	}
+
+	public static void startup() {
+		// Default
+	}
+	
+	public boolean isValidRuntime(IProject currentProject) {
+		XDocletBuilderValidator validator = new XDocletBuilderValidator();
+		boolean valid = false;
+		try {
+			valid = validator.validate(currentProject);
+		} catch (CoreException e) {
+		}
+		return valid;
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/XDocletBuilderValidator.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/XDocletBuilderValidator.java
new file mode 100644
index 0000000..cd87775
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/XDocletBuilderValidator.java
@@ -0,0 +1,98 @@
+/***************************************************************************************************
+ * Copyright (c) 2006 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.ui.Messages;
+
+public class XDocletBuilderValidator {
+
+	public static final String MARKER_ID = XDocletAnnotationPlugin.PLUGINID
+			+ ".xdoclet.marker"; //$NON-NLS-1$
+
+	public boolean validate(final IProject currentProject) throws CoreException
+
+	{
+		final boolean isValidRuntime = isValidRuntime(currentProject);
+		clearMarkers(currentProject, MARKER_ID);
+
+		if (!isValidRuntime) {
+			createWarningMarker(currentProject, MARKER_ID,
+					Messages.xdoclet_runtime_invalid);
+		}
+		return isValidRuntime;
+	}
+
+	public IMarker createWarningMarker(IProject project, String type,
+			final String message)
+
+	throws CoreException
+
+	{
+		return createMarker(project, IMarker.SEVERITY_ERROR, type, message);
+	}
+
+	public void clearMarkers(IProject project)
+			throws CoreException {
+		clearMarkers(project,MARKER_ID);
+	}
+
+	private void clearMarkers(IProject project, String type)
+			throws CoreException {
+		final IMarker[] existing = project.findMarkers(type, false,
+				IResource.DEPTH_ZERO);
+		for (int i = 0; i < existing.length; i++) {
+			IMarker marker = existing[i];
+			marker.delete();
+
+		}
+	}
+
+	private IMarker createMarker(IProject project, int severity, String type,
+			String message)
+
+	throws CoreException
+
+	{
+		final IMarker[] existing = project.findMarkers(type, false,
+				IResource.DEPTH_ZERO);
+
+		for (int i = 0; i < existing.length; i++) {
+			final IMarker m = existing[i];
+
+			if (m.getAttribute(IMarker.SEVERITY, -1) == severity
+					&& m.getAttribute(IMarker.MESSAGE, "").equals(message)) //$NON-NLS-1$
+			{
+				return m;
+			}
+		}
+
+		final IMarker m = project.createMarker(type);
+
+		m.setAttribute(IMarker.MESSAGE, message);
+		m.setAttribute(IMarker.SEVERITY, severity);
+
+		return m;
+	}
+
+	public boolean isValidRuntime(IProject currentProject) {
+
+		XDocletPreferenceStore store = XDocletPreferenceStore
+				.forProject(currentProject);
+		XDocletRuntime runtime = XDocletExtensionUtil.getRuntime(store
+				.getProperty(XDocletPreferenceStore.XDOCLETVERSION));
+		runtime.setHome(store.getProperty(XDocletPreferenceStore.XDOCLETHOME));
+		return runtime.isValid();
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/XDocletEjbAntProjectBuilder.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/XDocletEjbAntProjectBuilder.java
new file mode 100644
index 0000000..1930c64
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/XDocletEjbAntProjectBuilder.java
@@ -0,0 +1,319 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+package org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet;
+
+import java.io.File;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Properties;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IPackageFragment;
+import org.eclipse.jdt.core.IPackageFragmentRoot;
+import org.eclipse.jdt.core.IParent;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
+import org.eclipse.jem.workbench.utility.JemProjectUtilities;
+import org.eclipse.jst.j2ee.ejb.componentcore.util.EJBArtifactEdit;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.UnresolveableURIException;
+import org.eclipse.wst.common.componentcore.internal.ComponentResource;
+import org.eclipse.wst.common.componentcore.internal.ReferencedComponent;
+import org.eclipse.wst.common.componentcore.internal.StructureEdit;
+import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
+
+public class XDocletEjbAntProjectBuilder extends XDocletAntProjectBuilder {
+	IProject clientProject;
+
+	public XDocletEjbAntProjectBuilder() {
+		super();
+		templateUrl = Platform.getBundle(XDocletAnnotationPlugin.PLUGINID).getEntry("/templates/builder/xdoclet.xml"); //$NON-NLS-1$
+
+	}
+
+	/**
+	 * @return
+	 */
+	protected String getTaskName() {
+		return "ejbdoclet"; //$NON-NLS-1$
+	}
+
+	/**
+	 * @param beanPath
+	 * @return
+	 */
+	protected HashMap createTemplates(String beanPath) {
+		HashMap templates = new HashMap();
+		templates.put("@beans@", beanPath); //$NON-NLS-1$
+
+		templates.put("@docletTasks@", createDocletTasks()); //$NON-NLS-1$
+
+		return templates;
+	}
+
+	private String createDocletTasks() {
+		IExtension[] extensions = Platform.getExtensionRegistry().getExtensionPoint(
+				"org.eclipse.jst.j2ee.ejb.annotations.xdoclet.ejbDocletTaskProvider").getExtensions();
+		StringBuffer tasks = new StringBuffer(512);
+		for (int i = 0; extensions != null && i < extensions.length; i++) {
+			IExtension extension = extensions[i];
+			IConfigurationElement[] elements = extension.getConfigurationElements();
+			if (elements == null)
+				continue;
+			try {
+				String pluginDescriptor = elements[0].getDeclaringExtension().getContributor().getName();
+
+				org.osgi.framework.Bundle bundle = Platform.getBundle(pluginDescriptor);
+				Class c = bundle.loadClass(elements[0].getAttribute("class"));
+				if (c != null) {
+					XDocletTaskProvider docletTaskProvider = (XDocletTaskProvider) c.newInstance();
+
+					docletTaskProvider.setClientProject(clientProject);
+					docletTaskProvider.setPreferenceStore(this.preferenceStore);
+					docletTaskProvider.setExtension(extension);
+					docletTaskProvider.setProperties(this.getProperties());
+					docletTaskProvider.setProject(this.getProject());
+					if (preferenceStore.getBooleanProperty(elements[0].getAttribute("id") + ".defaultSelection")) {
+						tasks.append("\n");
+						tasks.append(docletTaskProvider.getTask());
+						tasks.append("\n");
+					}
+				}
+			} catch (Exception e) {
+				Logger.logException(e);
+			}
+		}
+		return tasks.toString();
+	}
+
+	/**
+	 * @param resource
+	 * @param javaProject
+	 * @param packageFragmentRoot
+	 * @param beanPath
+	 * @return
+	 * @throws JavaModelException
+	 */
+	public Properties createAntBuildProperties(IResource resource, IJavaProject javaProject, IPackageFragmentRoot packageFragmentRoot,
+			String beanPath) {
+		Properties properties = new Properties();
+		StructureEdit core = null;
+		EJBArtifactEdit ejbEdit = null;
+		try {
+			core = StructureEdit.getStructureEditForRead(javaProject.getProject());
+			List ejbs = new ArrayList();
+			getAllAnnotatedEjbs(packageFragmentRoot, ejbs);
+
+			String projectDir = resource.getProject().getLocation().toString();
+			String moduleDir = packageFragmentRoot.getResource().getLocation().toString();
+
+			properties.put("ejb", resource.getProject().getName()); //$NON-NLS-1$
+			properties.put("ejb.project.dir", projectDir); //$NON-NLS-1$
+			properties.put("ejb.project.classpath", asClassPath(javaProject)); //$NON-NLS-1$
+			properties.put("ejb.module.src", moduleDir); //$NON-NLS-1$
+			properties.put("ejb.module.gen", packageFragmentRoot.getResource().getLocation().toString()); //$NON-NLS-1$
+			properties.put("ejb.bin.dir", this.getJavaProjectOutputContainer(javaProject).toString()); //$NON-NLS-1$
+
+			properties.put("xdoclet.home", getPreferenceStore().getProperty(XDocletPreferenceStore.XDOCLETHOME)); //$NON-NLS-1$
+			URL url = Platform.getBundle("org.apache.ant").getEntry("/"); //$NON-NLS-1$ //$NON-NLS-2$
+			url = FileLocator.toFileURL(url);
+			File file = new File(url.getFile());
+			properties.put("ant.home", file.getAbsolutePath()); //$NON-NLS-1$
+			WorkbenchComponent ejbModule = core.getComponent();
+			// For deleted resources we cannot find the module
+			// So assume the first module in the project (currently)
+			// there is only one anyway...
+			IProject proj = javaProject.getProject();
+
+			ejbEdit = EJBArtifactEdit.getEJBArtifactEditForRead(proj);
+
+			int ejbLevelI = J2EEVersionConstants.EJB_2_0_ID;
+			try {
+				ejbLevelI = ejbEdit.getEJBJarXmiResource().getModuleVersionID();
+			} catch (RuntimeException e) {
+			}
+			String ejbLevel = J2EEProjectUtilities.getJ2EEProjectVersion(proj);
+			if ((ejbLevel == null || ejbLevel.length() == 0) && ejbLevelI == J2EEVersionConstants.EJB_2_0_ID)
+				ejbLevel = J2EEVersionConstants.VERSION_2_0_TEXT;
+			else if ((ejbLevel == null || ejbLevel.length() == 0) && ejbLevelI == J2EEVersionConstants.EJB_2_1_ID)
+				ejbLevel = J2EEVersionConstants.VERSION_2_1_TEXT;
+
+			setEjbClientJarProperties(properties, core, ejbModule);
+			IPath metaInfPath = getMetaInfFolder(ejbModule);
+			String metaInf = moduleDir + "/META-INF";
+			if (metaInfPath != null)
+				metaInf = projectDir + "/" + metaInfPath.toString();
+
+			properties.put("ejb.spec.version", ejbLevel); //$NON-NLS-1$
+			properties.put("ejb.metainf.dir", metaInf); //$NON-NLS-1$
+			properties.put("xdoclet.merge.dir", metaInf);
+
+			properties.put("java.class.path", ""); //$NON-NLS-1$ //$NON-NLS-2$
+			properties.put("project.class.path", ""); //$NON-NLS-1$ //$NON-NLS-2$
+			properties.put("project.path", ""); //$NON-NLS-1$ //$NON-NLS-2$
+
+			properties.put("ejb.dd.displayname", ejbModule.getName()); //$NON-NLS-1$
+			properties.put("ejb.dd.description", ejbModule.getName() + " generated by eclipse wtp xdoclet extension."); //$NON-NLS-1$
+
+		} catch (Exception e) {
+			Logger.logException(e);
+		} finally {
+			if (core != null)
+				core.dispose();
+			if (ejbEdit != null)
+				ejbEdit.dispose();
+		}
+		return properties;
+	}
+
+	private void setEjbClientJarProperties(Properties properties, StructureEdit core, WorkbenchComponent ejbModule)
+			throws UnresolveableURIException {
+		clientProject = null;
+		IVirtualReference[] refs = null;
+		IProject ejbProject = ProjectUtilities.getProject(ejbModule);
+		IVirtualComponent ejbComp = ComponentCore.createComponent(ejbProject);
+		if (ejbComp != null) {
+			refs = ejbComp.getReferences();
+		}
+		
+		if (refs != null) {
+			for (int i = 0; i < refs.length; i++) {
+				IVirtualReference refComp = refs[i];
+				IVirtualComponent referencedComp = refComp.getReferencedComponent();
+				IProject project = referencedComp.getProject();
+				if (J2EEProjectUtilities.isUtilityProject(project)) {
+					properties.put("ejb.dd.clientjar", refComp.getArchiveName()); //$NON-NLS-1$
+					setClientJarSourcepath(properties, ejbModule, refComp);
+				}
+			}
+
+		}
+	}
+
+	private void setClientJarSourcepath(Properties properties, WorkbenchComponent ejbModule, IVirtualReference refComp) {
+		// TODO: THIS API DOES NOT WORK YET
+		// IProject clientProj = StructureEdit.getContainingProject(component);
+		// ComponentResource[] sourceContainers =
+		// core.getSourceContainers(component);
+		IVirtualComponent referencedComp = refComp.getReferencedComponent();
+	    clientProject = referencedComp.getProject();
+	    
+		IContainer[] clientJarResources = referencedComp.getRootFolder().getUnderlyingFolders();
+		List sourcePaths = JemProjectUtilities.getSourceContainers(clientProject);
+		for (int i = 0; i < clientJarResources.length; i++) {
+			IContainer folder = clientJarResources[i];
+			IPath sPath = folder.getProjectRelativePath();
+			Iterator projSPaths = sourcePaths.iterator();
+			while (projSPaths.hasNext()) {
+				IFolder pSPath = (IFolder) projSPaths.next();
+				if (sPath.makeRelative().equals(pSPath.getProjectRelativePath())) {
+					properties.put("ejb.client.module.src", pSPath.getLocation().toString()); //$NON-NLS-1$
+					return;
+				}
+			}
+		}
+	}
+
+	/**
+	 * XDoclet ejb task requires the names of the files in the fileset to be
+	 * relative to the source folder (i.e. root of the classpath) Se wee need to
+	 * find porvide them relative to the package fragment root
+	 * 
+	 * @param changedBean
+	 * @return
+	 */
+	protected String constructAnnotatedClassList(IPackageFragmentRoot root, IResource changedBean) {
+
+		List ejbs = new ArrayList();
+		getAllAnnotatedEjbs(root, ejbs);
+		String beans = ""; //$NON-NLS-1$
+		try {
+			Iterator iterator = ejbs.iterator();
+			while (iterator.hasNext()) {
+				ICompilationUnit cu = (ICompilationUnit) iterator.next();
+				IResource bean;
+				bean = cu.getCorrespondingResource();
+				IPath path = bean.getProjectRelativePath();
+				path = makeRelativeTo(path, root);
+				beans += "\t<include name=\"" + path.toString() + "\" />\n"; //$NON-NLS-1$ //$NON-NLS-2$
+			}
+		} catch (JavaModelException e) {
+			Logger.logException(e);
+		}
+		return beans;
+	}
+
+	/**
+	 * @param root
+	 * @return
+	 */
+	private void getAllAnnotatedEjbs(IParent root, List list) {
+		IJavaElement[] elements = null;
+		try {
+			if (root == null)
+				return;
+			elements = root.getChildren();
+			if (elements == null)
+				return;
+			for (int i = 0; i < elements.length; i++) {
+				IJavaElement element = elements[i];
+
+				if (XDoxletAnnotationUtil.isXDocletAnnotatedEjbClass(element)) {
+					list.add(element);
+				} else if (element.getElementType() == IJavaElement.PACKAGE_FRAGMENT) {
+					getAllAnnotatedEjbs((IPackageFragment) element, list);
+				}
+			}
+		} catch (JavaModelException e) {
+			Logger.logException(e);
+		}
+	}
+
+	protected void refreshProjects(IProject project, IProgressMonitor monitor) throws CoreException {
+		project.refreshLocal(IResource.DEPTH_INFINITE, monitor);
+
+		if (clientProject != null)
+			clientProject.refreshLocal(IResource.DEPTH_INFINITE, monitor);
+
+	}
+
+	protected IPath getMetaInfFolder(WorkbenchComponent ejbModule) {
+		ComponentResource[] METAINF = ejbModule.findResourcesByRuntimePath(new Path("/META-INF"));
+		for (int i = 0; i < METAINF.length; i++) {
+			ComponentResource resource = METAINF[i];
+			if (resource.getRuntimePath().toString().equals("/META-INF"))
+				return resource.getSourcePath();
+		}
+		if (METAINF.length > 0)
+			return METAINF[0].getSourcePath();
+		return null;
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/XDocletExtensionUtil.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/XDocletExtensionUtil.java
new file mode 100644
index 0000000..f4de353
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/XDocletExtensionUtil.java
@@ -0,0 +1,192 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet;
+
+import java.util.ArrayList;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.model.IEnterpriseBean;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.model.IEnterpriseBeanClassDataModelProperties;
+import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
+
+public class XDocletExtensionUtil {
+
+	public static XDocletRuntime[] getRuntimes() {
+		IExtension[] extensions = Platform
+				.getExtensionRegistry()
+				.getExtensionPoint(
+						"org.eclipse.jst.j2ee.ejb.annotations.xdoclet.xdocletRuntime")
+				.getExtensions();
+
+		XDocletRuntime[] runtimes = new XDocletRuntime[extensions.length];
+		for (int i = 0; i < extensions.length; i++) {
+			runtimes[i] = new XDocletRuntime();
+
+			IExtension extension = extensions[i];
+			IConfigurationElement configurationElement = getRuntimeElement(extension);
+			if (configurationElement != null) {
+				runtimes[i].setVersion(configurationElement
+						.getAttribute("xdoclet"));
+				IConfigurationElement[] libs = getRuntimeLibraries(extension);
+				String[] libsArray = new String[libs.length];
+				for (int j = 0; j < libs.length; j++) {
+					IConfigurationElement aLibrary = libs[j];
+					libsArray[j] = aLibrary.getAttribute("location");
+				}
+				runtimes[i].setLibs(libsArray);
+			}
+		}
+		return runtimes;
+	}
+
+	public static XDocletRuntime getRuntime(String versionID) {
+		IExtension[] extensions = Platform
+				.getExtensionRegistry()
+				.getExtensionPoint(
+						"org.eclipse.jst.j2ee.ejb.annotations.xdoclet.xdocletRuntime")
+				.getExtensions();
+
+		for (int i = 0; i < extensions.length; i++) {
+			XDocletRuntime runtime = new XDocletRuntime();
+
+			IExtension extension = extensions[i];
+			IConfigurationElement configurationElement = getRuntimeElement(extension);
+			if (configurationElement != null) {
+				if (versionID.equals(configurationElement
+						.getAttribute("xdoclet"))) {
+					runtime.setVersion(configurationElement
+							.getAttribute("xdoclet"));
+					IConfigurationElement[] libs = getRuntimeLibraries(extension);
+					String[] libsArray = new String[libs.length];
+					for (int j = 0; j < libs.length; j++) {
+						IConfigurationElement aLibrary = libs[j];
+						libsArray[j] = aLibrary.getAttribute("location");
+					}
+					runtime.setLibs(libsArray);
+					return runtime;
+				}
+			}
+		}
+		return null;
+	}
+
+	public static IConfigurationElement getRuntimeElement(IExtension extension) {
+		IConfigurationElement[] elements = extension.getConfigurationElements();
+		if (elements != null) {
+			for (int j = 0; j < elements.length; j++) {
+				IConfigurationElement element = elements[j];
+				if ("RuntimeVersion".equals(element.getName()))
+					return element;
+			}
+		}
+		return null;
+	}
+
+	public static IConfigurationElement[] getRuntimeLibraries(
+			IExtension extension) {
+		ArrayList arrayList = new ArrayList();
+		IConfigurationElement[] elements = extension.getConfigurationElements();
+		if (elements != null) {
+			for (int j = 0; j < elements.length; j++) {
+				IConfigurationElement element = elements[j];
+				if ("RuntimeLib".equals(element.getName()))
+					arrayList.add(element);
+			}
+		}
+		return (IConfigurationElement[]) arrayList
+				.toArray(new IConfigurationElement[arrayList.size()]);
+	}
+
+	public static String getRuntimeTypeAnnotations(IEnterpriseBean beanModel) {
+
+		IProject project = (IProject) beanModel.getDataModel().getProperty(
+				IEnterpriseBeanClassDataModelProperties.PROJECT);
+
+		if (!J2EEProjectUtilities.isEJBProject(project))
+			return "";
+
+		IExtension[] extensions = Platform
+				.getExtensionRegistry()
+				.getExtensionPoint(
+						"org.eclipse.jst.j2ee.ejb.annotations.xdoclet.ejbDocletTaskProvider")
+				.getExtensions();
+		StringBuffer annotations = new StringBuffer(512);
+		for (int i = 0; extensions != null && i < extensions.length; i++) {
+			IExtension extension = extensions[i];
+			IConfigurationElement[] elements = extension
+					.getConfigurationElements();
+			if (elements == null)
+				continue;
+			try {
+				XDocletPreferenceStore preferenceStore = new XDocletPreferenceStore(project);
+				if (! preferenceStore.getBooleanProperty(elements[0].getAttribute("id") + ".defaultSelection")) 
+					continue;	
+				for (int j = 0; j < elements.length; j++) {
+					IConfigurationElement element = elements[j];
+					if ("AnnotationProvider".equals(element.getName())) {
+
+						String pluginDescriptor = element
+								.getDeclaringExtension().getContributor()
+								.getName();
+
+						org.osgi.framework.Bundle bundle = Platform
+						.getBundle(pluginDescriptor);
+
+						
+						if (isRuntimeAnnotationApplicable(beanModel, element)) {
+							Class c = bundle.loadClass(element
+									.getAttribute("class"));
+
+							if (c != null) {
+								IXDocletRuntimeAnnotation annotationProvider = (IXDocletRuntimeAnnotation) c
+										.newInstance();
+								annotationProvider.setPreferenceStore(preferenceStore);
+								annotations
+										.append(annotationProvider
+												.getTypeAnnotations(project,
+														beanModel));
+								annotations.append("\n");
+
+							}
+						}
+					}
+				}
+
+			} catch (Exception e) {
+				Logger.logException(e);
+			}
+		}
+		return annotations.toString();
+	}
+
+	private static boolean isRuntimeAnnotationApplicable(IEnterpriseBean beanModel, IConfigurationElement element) {
+		boolean include = Boolean.valueOf(
+				element.getAttribute("include")).booleanValue();
+		if(!include)
+			return false;
+		String type = element.getAttribute("type");
+		boolean generate = false;
+		if (IXDocletRuntimeAnnotation.entity.equals(type)
+				&& beanModel.getEnterpriseBean().isEntity())
+			generate = true;
+		if (IXDocletRuntimeAnnotation.session.equals(type)
+				&& beanModel.getEnterpriseBean().isSession())
+			generate = true;
+		if (IXDocletRuntimeAnnotation.mdb.equals(type)
+				&& beanModel.getEnterpriseBean()
+						.isMessageDriven())
+			generate = true;
+		return generate;
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/XDocletPreferenceStore.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/XDocletPreferenceStore.java
new file mode 100644
index 0000000..be4871e
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/XDocletPreferenceStore.java
@@ -0,0 +1,244 @@
+/*******************************************************************************
+ * Copyright (c) 2002, 2003,2004 Eteration Bilisim A.S.
+ * Naci Dai and others.
+ * 
+ * Parts developed under contract ref:FT/R&D/MAPS/AMS/2004-09-09/AL are 
+ * Copyright France Telecom, 2004.
+ * 
+ * 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:
+ *     Eteration Bilisim A.S. - initial API and implementation
+ *     Naci Dai
+ * For more information on eteration, please see
+ * <http://www.eteration.com/>.
+ ***************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet;
+
+import java.util.HashMap;
+import java.util.Iterator;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ProjectScope;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.preferences.DefaultScope;
+import org.eclipse.core.runtime.preferences.IEclipsePreferences;
+import org.eclipse.core.runtime.preferences.IPreferencesService;
+import org.eclipse.core.runtime.preferences.IScopeContext;
+import org.eclipse.core.runtime.preferences.InstanceScope;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.osgi.service.prefs.BackingStoreException;
+
+public final class XDocletPreferenceStore {
+
+	private static IPreferencesService preferencesService = null;
+
+	private IProject project = null;
+
+	private ProjectScope projectScope;
+
+	private InstanceScope instanceScope;
+
+	private boolean useGlobal;
+
+	private IScopeContext[] lookupOrder;
+
+	private IScopeContext[] projectLookupOrder;
+
+	private IScopeContext[] instanceLookupOrder;
+
+	private IEclipsePreferences instanceNode;
+
+	private IEclipsePreferences projectNode;
+
+	public static final String XDOCLETBUILDERACTIVE = "XDOCLETBUILDERACTIVE";
+
+	public static final String XDOCLETUSEGLOBAL = "XDOCLETUSEGLOBAL";
+
+	public static final String XDOCLETFORCE = "XDOCLETFORCE";
+
+	public static final String XDOCLETHOME = "XDOCLETHOME";
+
+	public static final String XDOCLETVERSION = "XDOCLETVERSION";
+
+	private HashMap temporaryStore;
+
+	public XDocletPreferenceStore(IProject project) {
+		this.project = project;
+		this.temporaryStore = new HashMap();
+		init();
+
+	}
+
+	private void init() {
+		if (instanceScope == null)
+			instanceScope = new InstanceScope();
+		instanceNode = instanceScope.getNode(getPreferencePrefix());
+
+		if (project != null) {
+			if (projectScope == null)
+				projectScope = new ProjectScope(project);
+			projectNode = projectScope.getNode(getPreferencePrefix());
+			useGlobal = projectNode.getBoolean(XDOCLETUSEGLOBAL, false);
+		}
+
+		instanceLookupOrder = new IScopeContext[] { instanceScope, new DefaultScope() };
+		if (project != null)
+			projectLookupOrder = new IScopeContext[] { projectScope, instanceScope, new DefaultScope() };
+		if (useGlobal)
+			lookupOrder = instanceLookupOrder;
+		else
+			lookupOrder = projectLookupOrder;
+
+	}
+
+	protected static String getPreferencePrefix() {
+		return XDocletAnnotationPlugin.getDefault().getBundle().getSymbolicName();
+	}
+
+	private IPreferencesService getPreferencesService() {
+
+		if (preferencesService == null) {
+			preferencesService = Platform.getPreferencesService();
+
+		}
+		return preferencesService;
+	}
+
+	public void setProperty(String item, boolean value) {
+
+		temporaryStore.put(item, Boolean.valueOf(value));
+		// IEclipsePreferences node = getPreferenceNode();
+		// node.putBoolean(item, value);
+
+	}
+
+	public void setProperty(String item, String value) {
+		temporaryStore.put(item, value);
+		// IEclipsePreferences node = getPreferenceNode();
+		// node.put(item, value);
+	}
+
+	public String getProperty(String item) {
+		init();
+		if (temporaryStore != null && temporaryStore.containsKey(item))
+			return (String) temporaryStore.get(item);
+		return this.getPreferencesService().getString(getPreferencePrefix(), item, "", lookupOrder);
+	}
+
+	public String getPropertyNoGlobal(String item) {
+		init();
+		if (project != null)
+			lookupOrder = projectLookupOrder;
+		if (temporaryStore != null && temporaryStore.containsKey(item))
+			return (String) temporaryStore.get(item);
+		return this.getPreferencesService().getString(getPreferencePrefix(), item, "", lookupOrder);
+	}
+
+	public boolean getBooleanProperty(String item) {
+		init();
+		if (temporaryStore != null && temporaryStore.containsKey(item))
+			return ((Boolean) temporaryStore.get(item)).booleanValue();
+		return this.getPreferencesService().getBoolean(getPreferencePrefix(), item, false, lookupOrder);
+	}
+
+	public boolean getBooleanPropertyNoGlobal(String item) {
+		init();
+		if (project != null)
+			lookupOrder = projectLookupOrder;
+		if (temporaryStore != null && temporaryStore.containsKey(item))
+			return ((Boolean) temporaryStore.get(item)).booleanValue();
+		return this.getPreferencesService().getBoolean(getPreferencePrefix(), item, false, lookupOrder);
+	}
+
+	private IEclipsePreferences getPreferenceNode() {
+		init();
+		IEclipsePreferences node = projectNode;
+		if (node == null)
+			node = instanceNode;
+		return node;
+	}
+
+	public void save() {
+		try {
+			IEclipsePreferences node = getPreferenceNode();
+			Iterator tempProps = temporaryStore.keySet().iterator();
+			while (tempProps.hasNext()) {
+				String key = (String) tempProps.next();
+				Object value = temporaryStore.get(key);
+				if (value instanceof Boolean) {
+					Boolean bValue = (Boolean) value;
+					node.putBoolean(key, bValue.booleanValue());
+				} else if (value instanceof String) {
+					node.put(key, (String) value);
+				}
+			}
+			temporaryStore.clear();
+
+			if (projectNode != null)
+				projectNode.flush();
+			if (instanceNode != null)
+				instanceNode.flush();
+		} catch (BackingStoreException e) {
+			Logger.logException(e);
+		}
+	}
+
+	public void clear() {
+		try {
+			temporaryStore.clear();
+			if (projectNode != null)
+				projectNode.clear();
+			if (instanceNode != null)
+				instanceNode.clear();
+		} catch (BackingStoreException e) {
+			Logger.logException(e);
+		}
+	}
+
+	protected static void initializeDefaultPreferences(IPreferenceStore store) {
+
+		store.setDefault(XDOCLETFORCE, true);
+		store.setDefault(XDOCLETVERSION, "1.2.1");
+		store.setDefault(XDOCLETHOME, "");
+		store.setDefault(XDOCLETUSEGLOBAL, true);
+		store.setDefault(XDOCLETBUILDERACTIVE, true);
+
+		initDoclet(store, "org.eclipse.jst.j2ee.ejb.annotations.xdoclet.ejbDocletTaskProvider");
+		initDoclet(store, "org.eclipse.jst.j2ee.ejb.annotations.xdoclet.webdocletTaskProvider");
+	}
+
+	private static void initDoclet(IPreferenceStore store, String extensionID) {
+		IExtension[] extensions = Platform.getExtensionRegistry().getExtensionPoint(extensionID).getExtensions();
+		for (int i = 0; extensions != null && i < extensions.length; i++) {
+			IExtension extension = extensions[i];
+			IConfigurationElement[] elements = extension.getConfigurationElements();
+			if (elements == null)
+				continue;
+
+			String id = elements[0].getAttribute("id");
+			boolean selected = Boolean.valueOf(elements[0].getAttribute("defaultSelection")).booleanValue();
+			store.setDefault(id + ".defaultSelection", selected);
+			for (int j = 1; j < elements.length; j++) {
+				IConfigurationElement param = elements[j];
+				if ("TaskProperty".equals(param.getName())) {
+					String paramId = param.getAttribute("id");
+					String paramValue = param.getAttribute("default");
+					boolean include = Boolean.valueOf(param.getAttribute("include")).booleanValue();
+					store.setDefault(paramId, paramValue);
+					store.setDefault(paramId + ".include", include);
+				}
+			}
+		}
+	}
+
+	public static XDocletPreferenceStore forProject(IProject currentProject) {
+		return new XDocletPreferenceStore(currentProject);
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/XDocletRuntime.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/XDocletRuntime.java
new file mode 100644
index 0000000..ded4e06
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/XDocletRuntime.java
@@ -0,0 +1,170 @@
+/*******************************************************************************
+ * Copyright (c) 2002, 2003,2004,2005 Eteration Bilisim A.S.
+ * 
+ * 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:
+ *     Eteration Bilisim A.S. - initial API and implementation
+ *     Naci Dai
+ * For more information on eteration, please see
+ * <http://www.eteration.com/>.
+ ***************************************************************************/
+package org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet;
+
+import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.ui.Messages;
+
+public class XDocletRuntime {
+
+
+	public final static String LIBPATH = "lib";
+
+	// 1.2.2
+	private String version = "1.2.2";
+
+	// location of the axis installation
+	private String home = "";
+
+	private String libs[];
+	/**
+	 * @return Returns the home.
+	 */
+	public String getHome() {
+		return home;
+	}
+
+	/**
+	 * @param home
+	 *            The home to set.
+	 */
+	public void setHome(String home) {
+		this.home = home;
+	}
+
+	/**
+	 * @return Returns the version.
+	 */
+	public String getVersion() {
+		return version;
+	}
+
+	/**
+	 * @param version
+	 *            The version to set.
+	 */
+	public void setVersion(String version) {
+		this.version = version;
+	}
+
+	/**
+	 * @return Returns the libs.
+	 */
+	public String[] getLibs() {
+		
+		return libs;
+	}
+	
+	public void setLibs(String[] libs) {
+		
+		this.libs = libs;
+	}
+
+
+	/**
+	 * @param runtime
+	 * @param id2
+	 */
+	public IClasspathEntry[] resolveClasspathContainer() {
+		List list = new ArrayList();
+		addLibraryEntries(list, new File(home + File.separator + LIBPATH),
+				false);
+		return resolveList(list);
+	}
+
+	protected static void addJarFiles(File dir, List list,
+			boolean includeSubdirectories) {
+		int depth = 0;
+		if (includeSubdirectories)
+			depth = 2;
+		addJarFiles(dir, list, depth);
+	}
+
+	private static void addJarFiles(File dir, List list, int depth) {
+		File[] files = dir.listFiles();
+		if (files != null) {
+			int size = files.length;
+			for (int i = 0; i < size; i++) {
+				if (files[i].isDirectory() && depth > 0) {
+					addJarFiles(files[i], list, depth - 1);
+				} else if (files[i].getAbsolutePath().endsWith(".jar")
+						|| files[i].getAbsolutePath().endsWith(".zip")) {
+					IPath path = new Path(files[i].getAbsolutePath());
+					list.add(JavaCore.newLibraryEntry(path, null, null));
+				}
+			}
+		}
+	}
+
+	protected static void addLibraryEntries(List list, File dir,
+			boolean includeSubdirectories) {
+		addJarFiles(dir, list, includeSubdirectories);
+	}
+
+	protected static IClasspathEntry[] resolveList(List list) {
+		IClasspathEntry[] entries = new IClasspathEntry[list.size()];
+		list.toArray(entries);
+		return entries;
+	}
+
+	/**
+	 * @return
+	 */
+	public URL getHomeURL() throws MalformedURLException {
+		return (new File(getHome())).toURL();
+	}
+
+	public IStatus[] validate() {
+		ArrayList errors = new ArrayList();
+		String[] vLibs = this.getLibs();
+		if (vLibs == null)
+			errors.add(new Status(IStatus.ERROR,
+					XDocletAnnotationPlugin.PLUGINID, 0,
+					Messages.error_message_no_lib+ version, null));
+		else {
+			for (int i = 0; i < vLibs.length; i++) {
+				String jar = vLibs[i];
+				File libFile = new File(getHome() + File.separator + LIBPATH
+						+ File.separator + jar);
+
+				// This is fo people who change the location of the files
+				// from the original distribution. It is unncessary but
+				// makes people happy!
+				File libFile2 = new File(getHome() + File.separator + jar);
+
+				if (!libFile.exists() && !libFile2.exists())
+					errors.add(new Status(IStatus.ERROR,
+							XDocletAnnotationPlugin.PLUGINID, 0,
+							Messages.error_message_no_lib + jar +". "+ Messages.error_xdoclet_home_message+version, null));
+			}
+		}
+		return (IStatus[]) errors.toArray(new IStatus[errors.size()]);
+	}
+
+	public boolean isValid() {
+		return validate().length == 0;
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/XDocletTaskProvider.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/XDocletTaskProvider.java
new file mode 100644
index 0000000..38833ad
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/XDocletTaskProvider.java
@@ -0,0 +1,44 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+package org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet;
+
+import java.util.Properties;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IStatus;
+
+public interface XDocletTaskProvider {
+	
+	public abstract String getNamespace();
+
+	public abstract String getTask();
+
+	public abstract IStatus validate();
+
+	public abstract IExtension getExtension();
+
+	public abstract void setExtension(IExtension extension);
+
+	public abstract Properties getProperties();
+
+	public abstract void setProperties(Properties properties);
+
+	public abstract void setPreferenceStore(XDocletPreferenceStore preferenceStore);
+
+	public abstract XDocletPreferenceStore getPreferenceStore();
+
+	public abstract IProject getClientProject();
+
+	public abstract void setClientProject(IProject clientProject);
+
+	public abstract IProject getProject();
+
+	public abstract void setProject(IProject project);
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/XDocletWebAntProjectBuilder.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/XDocletWebAntProjectBuilder.java
new file mode 100644
index 0000000..ad0bebc
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/XDocletWebAntProjectBuilder.java
@@ -0,0 +1,211 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+package org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet;
+
+import java.io.File;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Properties;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IPackageFragment;
+import org.eclipse.jdt.core.IPackageFragmentRoot;
+import org.eclipse.jdt.core.IParent;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
+import org.eclipse.jst.j2ee.web.componentcore.util.WebArtifactEdit;
+import org.eclipse.wst.common.componentcore.internal.ComponentResource;
+import org.eclipse.wst.common.componentcore.internal.StructureEdit;
+import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent;
+
+public class XDocletWebAntProjectBuilder extends XDocletAntProjectBuilder {
+
+	String contextRoot = ""; //$NON-NLS-1$
+
+	public XDocletWebAntProjectBuilder() {
+		super();
+		templateUrl = Platform.getBundle(XDocletAnnotationPlugin.PLUGINID).getEntry("/templates/builder/xdocletweb.xml"); //$NON-NLS-1$
+	}
+
+	protected String getTaskName() {
+		return "webdoclet"; //$NON-NLS-1$
+	}
+
+	protected HashMap createTemplates(String beanPath) {
+		HashMap templates = new HashMap();
+		templates.put("@servlets@", beanPath); //$NON-NLS-1$
+
+		templates.put("@webDoclet@", createDocletTasks()); //$NON-NLS-1$
+		return templates;
+	}
+
+	private String createDocletTasks() {
+		IExtension[] extensions = Platform.getExtensionRegistry().getExtensionPoint(
+				"org.eclipse.jst.j2ee.ejb.annotations.xdoclet.webdocletTaskProvider").getExtensions();
+		StringBuffer tasks = new StringBuffer(512);
+		for (int i = 0; extensions != null && i < extensions.length; i++) {
+			IExtension extension = extensions[i];
+			IConfigurationElement[] elements = extension.getConfigurationElements();
+			if (elements == null)
+				continue;
+			try {
+				String pluginDescriptor = elements[0].getDeclaringExtension().getContributor().getName();
+
+				org.osgi.framework.Bundle bundle = Platform.getBundle(pluginDescriptor);
+				Class c = bundle.loadClass(elements[0].getAttribute("class"));
+				if (c != null) {
+					XDocletTaskProvider docletTaskProvider = (XDocletTaskProvider) c.newInstance();
+
+					docletTaskProvider.setClientProject(null);
+					docletTaskProvider.setPreferenceStore(this.preferenceStore);
+					docletTaskProvider.setExtension(extension);
+					docletTaskProvider.setProperties(this.getProperties());
+					docletTaskProvider.setProject(this.getProject());
+					if (preferenceStore.getBooleanProperty(elements[0].getAttribute("id") + ".defaultSelection")) {
+						tasks.append("\n");
+						tasks.append(docletTaskProvider.getTask());
+						tasks.append("\n");
+					}
+				}
+			} catch (Exception e) {
+				Logger.logException(e);
+			}
+		}
+		return tasks.toString();
+	}
+
+	protected Properties createAntBuildProperties(IResource resource, IJavaProject javaProject,
+			IPackageFragmentRoot packageFragmentRoot, String beanPath) {
+		Properties properties = new Properties();
+		StructureEdit moduleCore = null;
+		WebArtifactEdit webEdit = null;
+		try {
+			moduleCore = StructureEdit.getStructureEditForRead(javaProject.getProject());
+
+			WorkbenchComponent wbModule = moduleCore.getComponent();
+			IProject proj = javaProject.getProject();
+			webEdit = WebArtifactEdit.getWebArtifactEditForRead(proj);
+
+			if (webEdit != null) {
+				if ((contextRoot = webEdit.getServerContextRoot()) == null)
+					contextRoot = "";//$NON-NLS-1$
+			}
+			String projectDir = resource.getProject().getLocation().toString();
+			IPath webInf = getWebInfFolder(wbModule);
+			properties.put("web.module.webinf", projectDir + "/" + webInf.toString()); //$NON-NLS-1$
+			properties.put("web", contextRoot); //$NON-NLS-1$
+			properties.put("web.project.dir", projectDir); //$NON-NLS-1$
+			properties.put("web.project.classpath", asClassPath(javaProject)); //$NON-NLS-1$
+			properties.put("web.module.src", packageFragmentRoot.getResource().getLocation().toString()); //$NON-NLS-1$
+			properties.put("web.module.gen", packageFragmentRoot.getResource().getLocation().toString()); //$NON-NLS-1$
+			properties.put("web.bin.dir", this.getJavaProjectOutputContainer(javaProject).toString()); //$NON-NLS-1$
+			properties.put("xdoclet.home", getPreferenceStore().getProperty(XDocletPreferenceStore.XDOCLETHOME)); //$NON-NLS-1$
+			properties.put("xdoclet.merge.dir", projectDir + "/" + webInf.toString());
+			// getPreferenceStore().getProperty(projectDir
+			// +"/"+XDocletPreferenceStore.XDOCLEMERGEDIR)); //$NON-NLS-1$
+			URL url = Platform.getBundle("org.apache.ant").getEntry("/"); //$NON-NLS-1$ //$NON-NLS-2$
+			url = FileLocator.toFileURL(url);
+			File file = new File(url.getFile());
+			properties.put("ant.home", file.getAbsolutePath()); //$NON-NLS-1$
+
+			String servletLevel = J2EEProjectUtilities.getJ2EEProjectVersion(proj);
+
+			properties.put("servlet.spec.version", servletLevel); //$NON-NLS-1$
+			properties.put("java.class.path", ""); //$NON-NLS-1$ //$NON-NLS-2$
+		} catch (Exception e) {
+			Logger.logException(e);
+		} finally {
+			if (moduleCore != null)
+				moduleCore.dispose();
+			if (webEdit != null)
+				webEdit.dispose();
+		}
+		return properties;
+	}
+
+	protected String constructAnnotatedClassList(IPackageFragmentRoot root, IResource changedBean) {
+
+		List webClasses = new ArrayList();
+		getAllAnnotatedWebClasses(root, webClasses);
+		String beans = ""; //$NON-NLS-1$
+		try {
+			Iterator iterator = webClasses.iterator();
+			while (iterator.hasNext()) {
+				ICompilationUnit cu = (ICompilationUnit) iterator.next();
+				IResource bean;
+				bean = cu.getCorrespondingResource();
+				IPath path = bean.getProjectRelativePath();
+				path = makeRelativeTo(path, root);
+				beans += "\t<include name=\"" + path.toString() + "\" />\n"; //$NON-NLS-1$ //$NON-NLS-2$
+
+			}
+		} catch (JavaModelException e) {
+			Logger.logException(e);
+		}
+		return beans;
+	}
+
+	/**
+	 * @param root
+	 * @return
+	 */
+	private void getAllAnnotatedWebClasses(IParent root, List list) {
+		IJavaElement[] elements = null;
+		try {
+			elements = root.getChildren();
+			if (elements == null)
+				return;
+			for (int i = 0; i < elements.length; i++) {
+				IJavaElement element = elements[i];
+
+				if (XDoxletAnnotationUtil.isXDocletAnnotatedWebClass(element)) {
+					list.add(element);
+				} else if (element.getElementType() == IJavaElement.PACKAGE_FRAGMENT) {
+					getAllAnnotatedWebClasses((IPackageFragment) element, list);
+				}
+			}
+		} catch (JavaModelException e) {
+			Logger.logException(e);
+		}
+	}
+
+	protected void refreshProjects(IProject project, IProgressMonitor monitor) throws CoreException {
+		if (project != null)
+			project.refreshLocal(IResource.DEPTH_INFINITE, monitor);
+
+	}
+
+	protected IPath getWebInfFolder(WorkbenchComponent webModule) {
+		ComponentResource[] webXML = webModule.findResourcesByRuntimePath(new Path("/WEB-INF"));
+		for (int i = 0; i < webXML.length; i++) {
+			ComponentResource resource = webXML[i];
+			if (resource.getRuntimePath().toString().equals("/WEB-INF"))
+				return resource.getSourcePath();
+		}
+		if (webXML.length > 0)
+			return webXML[0].getSourcePath();
+		return null;
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/XDoxletAnnotationUtil.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/XDoxletAnnotationUtil.java
new file mode 100644
index 0000000..c897101
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/XDoxletAnnotationUtil.java
@@ -0,0 +1,95 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet;
+
+import java.util.Iterator;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.dom.AST;
+import org.eclipse.jdt.core.dom.ASTParser;
+import org.eclipse.jdt.core.dom.ASTVisitor;
+import org.eclipse.jdt.core.dom.CompilationUnit;
+import org.eclipse.jdt.core.dom.TagElement;
+import org.eclipse.jdt.core.dom.TypeDeclaration;
+
+
+public class XDoxletAnnotationUtil {
+	private static final String XDOCLET_EJB_BEAN_TAG = "@ejb.bean"; //$NON-NLS-1$
+	private static final String XDOCLET_WEB_TAG = "@web"; //$NON-NLS-1$
+	public static class XDocletFinder extends ASTVisitor {
+		boolean isXDocletBean = false;
+		boolean isXDocletWebBean = false;
+	
+		public XDocletFinder(boolean visitDocTags) {
+			super(visitDocTags);
+		}
+
+		public boolean visit(TypeDeclaration type) {
+			if (type.getJavadoc() == null)
+				return true;
+			Iterator tags = type.getJavadoc().tags().iterator();
+			while (tags.hasNext()) {
+				TagElement element = (TagElement) tags.next();
+				if (XDOCLET_EJB_BEAN_TAG.equals(element.getTagName())) {
+					isXDocletBean=true;
+					return false;
+				}else	if (element.getTagName() != null && element.getTagName().startsWith(XDOCLET_WEB_TAG)) {
+					isXDocletWebBean=true;
+					return false;
+				}
+			}
+			return true;
+		}
+	}
+
+	public static boolean isXDocletAnnotatedResource(IResource resource) {
+		ICompilationUnit compilationUnit = JavaCore.createCompilationUnitFrom((IFile) resource);
+		return isXDocletAnnotated(compilationUnit);
+	}
+
+	
+	public static boolean isXDocletAnnotatedEjbClass(IJavaElement compilationUnit) {
+		if (compilationUnit != null && compilationUnit.getElementType() == IJavaElement.COMPILATION_UNIT){
+			ASTParser parser = ASTParser.newParser(AST.JLS3);
+			parser.setSource((ICompilationUnit)compilationUnit);
+			CompilationUnit ast = (CompilationUnit) parser.createAST(null);
+			XDoxletAnnotationUtil.XDocletFinder docletFinder = new XDoxletAnnotationUtil.XDocletFinder(true);
+			ast.accept(docletFinder);
+			return docletFinder.isXDocletBean;
+		}
+		return false;
+	}
+	public static boolean isXDocletAnnotatedWebClass(IJavaElement compilationUnit) {
+		if (compilationUnit != null && compilationUnit.getElementType() == IJavaElement.COMPILATION_UNIT){
+			ASTParser parser = ASTParser.newParser(AST.JLS3);
+			parser.setSource((ICompilationUnit)compilationUnit);
+			CompilationUnit ast = (CompilationUnit) parser.createAST(null);
+			XDoxletAnnotationUtil.XDocletFinder docletFinder = new XDoxletAnnotationUtil.XDocletFinder(true);
+			ast.accept(docletFinder);
+			return docletFinder.isXDocletWebBean;
+		}
+		return false;
+	}
+	public static boolean isXDocletAnnotated(IJavaElement compilationUnit) {
+		if (compilationUnit != null && compilationUnit.getElementType() == IJavaElement.COMPILATION_UNIT){
+			ASTParser parser = ASTParser.newParser(AST.JLS3);
+			parser.setSource((ICompilationUnit)compilationUnit);
+			CompilationUnit ast = (CompilationUnit) parser.createAST(null);
+			XDoxletAnnotationUtil.XDocletFinder docletFinder = new XDoxletAnnotationUtil.XDocletFinder(true);
+			ast.accept(docletFinder);
+			return docletFinder.isXDocletWebBean || docletFinder.isXDocletBean ;
+		}
+		return false;
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/XdocletIntrospector.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/XdocletIntrospector.java
new file mode 100644
index 0000000..b53cb74
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/XdocletIntrospector.java
@@ -0,0 +1,59 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet;
+
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jst.j2ee.ejb.EjbFactory;
+import org.eclipse.jst.j2ee.ejb.EnterpriseBean;
+import org.eclipse.jst.j2ee.ejb.annotations.internal.emitter.DefaultEjbIntrospector;
+
+
+
+public class XdocletIntrospector extends DefaultEjbIntrospector {
+
+
+	
+
+	protected ICompilationUnit compilationUnit;
+	protected EnterpriseBean docRoot;
+	
+	public XdocletIntrospector() {
+		super();
+		this.compilationUnit = null; 
+		this.docRoot = null; 
+	}
+
+	
+	
+	public EnterpriseBean getEnterpriseBean() {
+		EnterpriseBean bean = null;
+		if( isSessionBean(this.getCompilationUnit())){
+			bean = EjbFactory.eINSTANCE.createSession();
+		}else if( isMDBBean(this.getCompilationUnit()))
+		{
+			bean = EjbFactory.eINSTANCE.createMessageDriven();
+		}else if( isEntityBean(this.getCompilationUnit()))
+		{
+			bean = EjbFactory.eINSTANCE.createEntity();
+		}
+
+		return bean;
+
+	}
+
+	
+	public ICompilationUnit getCompilationUnit() {
+		return compilationUnit;
+	}
+	public void setCompilationUnit(ICompilationUnit compilationUnit) {
+		this.compilationUnit = compilationUnit;
+	}
+
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/action/AddBuilderAction.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/action/AddBuilderAction.java
new file mode 100644
index 0000000..e53a865
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/action/AddBuilderAction.java
@@ -0,0 +1,37 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.action;
+
+import org.eclipse.core.resources.IncrementalProjectBuilder;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
+
+public class AddBuilderAction extends XDocletActionDelegate {
+
+	public void run(IAction action) {
+
+		if (project != null
+				&& (J2EEProjectUtilities.isEJBProject(project.getProject()) || J2EEProjectUtilities.isDynamicWebProject(project
+						.getProject()))) {
+			try {
+				if (!ProjectUtilities.hasBuilder(project.getProject(), BUILDERID)) {
+					ProjectUtilities.addToBuildSpecBefore(BUILDERID, JavaCore.BUILDER_ID, project.getProject());
+					project.getProject().build(IncrementalProjectBuilder.FULL_BUILD, new NullProgressMonitor());
+				}
+			} catch (CoreException e) {
+			}
+		}
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/action/RemoveBuilderAction.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/action/RemoveBuilderAction.java
new file mode 100644
index 0000000..d2f6e0d
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/action/RemoveBuilderAction.java
@@ -0,0 +1,31 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.action;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
+
+public class RemoveBuilderAction extends XDocletActionDelegate {
+
+	public void run(IAction action) {
+
+		if (project != null
+				&& (J2EEProjectUtilities.isEJBProject(project.getProject()) || J2EEProjectUtilities.isDynamicWebProject(project
+						.getProject()))) {
+			try {
+				ProjectUtilities.removeFromBuildSpec(BUILDERID, project.getProject());
+			} catch (CoreException e) {
+			}
+		}
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/action/RunXDocletAction.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/action/RunXDocletAction.java
new file mode 100644
index 0000000..581d48e
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/action/RunXDocletAction.java
@@ -0,0 +1,64 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.action;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.Logger;
+import org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.XDocletAnnotationPlugin;
+import org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.XDocletAntProjectBuilder;
+import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
+
+public class RunXDocletAction extends XDocletActionDelegate {
+
+	public void run(IAction action) {
+
+		if (project != null && (J2EEProjectUtilities.isEJBProject(project) || J2EEProjectUtilities.isDynamicWebProject(project))) {
+
+			Job buildJob = new Job("XDoclet") {
+				protected IStatus run(IProgressMonitor monitor) {
+					IStatus result = Status.OK_STATUS;
+					try {
+						XDocletAntProjectBuilder builder = XDocletAntProjectBuilder.Factory.newInstance(project);
+						IFile sourceFile = getFirstSourceFile();
+
+						builder.buildUsingAnt(sourceFile, new NullProgressMonitor());
+					} catch (Exception e) {
+						result = new Status(IStatus.ERROR, XDocletAnnotationPlugin.PLUGINID, IStatus.ERROR, "", e); //$NON-NLS-1$
+						Logger.logException(e);
+					} finally {
+
+					}
+					return result;
+				}
+			};
+
+			try {
+				buildJob.setUser(true);
+				buildJob.schedule();
+			} catch (Exception e) {
+			}
+		}
+
+	}
+
+	public void selectionChanged(IAction action, ISelection selection) {
+		super.selectionChanged(action, selection);
+		IFile sourceFile = getFirstSourceFile();
+		action.setEnabled(sourceFile != null);
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/action/XDocletActionDelegate.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/action/XDocletActionDelegate.java
new file mode 100644
index 0000000..5555a96
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/action/XDocletActionDelegate.java
@@ -0,0 +1,84 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.action;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceVisitor;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
+import org.eclipse.ui.actions.ActionDelegate;
+
+public abstract class XDocletActionDelegate extends ActionDelegate {
+
+	public static final String BUILDERID = "org.eclipse.jst.j2ee.ejb.annotations.xdoclet.xdocletbuilder";
+	protected IProject project;
+	protected IFile aFile = null;
+
+	class SourceFinder implements IResourceVisitor {
+		IFile sourceFile = null;
+
+		public boolean visit(IResource resource) throws org.eclipse.core.runtime.CoreException {
+			if (sourceFile != null)
+				return false;
+			if (resource instanceof IFile) {
+				sourceFile = (IFile) resource;
+				return false;
+			}
+			return true;
+		}
+
+		public IFile getSourceFile() {
+			return sourceFile;
+		}
+
+	}
+
+	public void selectionChanged(IAction action, ISelection selection) {
+		super.selectionChanged(action, selection);
+		if (selection == null)
+			return;
+
+		if (selection instanceof IStructuredSelection) {
+			Object firstSelection = ((IStructuredSelection) selection).getFirstElement();
+			if (firstSelection instanceof IProject)
+				project = (IProject) firstSelection;
+			if (firstSelection instanceof IFile) {
+				aFile = (IFile) firstSelection;
+				project = aFile.getProject();
+			}
+		}
+	}
+
+	public IProject getProject() {
+		return project;
+	}
+
+	protected IFile getFirstSourceFile() {
+		IFolder resource = (IFolder) J2EEProjectUtilities.getSourceFolderOrFirst(project, null);
+		SourceFinder finder = new SourceFinder();
+		try {
+			if (resource != null)
+				resource.accept(finder);
+		} catch (CoreException e) {
+		}
+		return finder.getSourceFile();
+	}
+
+	public IFile getFile() {
+		return aFile;
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/facet/IXDocletFacetInstallDataModelProperties.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/facet/IXDocletFacetInstallDataModelProperties.java
new file mode 100644
index 0000000..7221b70
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/facet/IXDocletFacetInstallDataModelProperties.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.facet;
+
+import org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.XDocletPreferenceStore;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEModuleFacetInstallDataModelProperties;
+
+
+
+public interface IXDocletFacetInstallDataModelProperties extends IJ2EEModuleFacetInstallDataModelProperties {
+
+
+	public static final String XDOCLETHOME = XDocletPreferenceStore.XDOCLETHOME; 
+	
+	public static final String XDOCLETVERSION = XDocletPreferenceStore.XDOCLETVERSION; 
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/facet/XDocletEjbFacetInstallDataModelProvider.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/facet/XDocletEjbFacetInstallDataModelProvider.java
new file mode 100644
index 0000000..59915d3
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/facet/XDocletEjbFacetInstallDataModelProvider.java
@@ -0,0 +1,16 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.facet;
+
+public class XDocletEjbFacetInstallDataModelProvider extends XDocletFacetInstallDataModelProvider {
+	protected String getFacetID() {
+		return "jst.ejb.xdoclet";
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/facet/XDocletFacetInstallDataModelProvider.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/facet/XDocletFacetInstallDataModelProvider.java
new file mode 100644
index 0000000..cc72fcc
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/facet/XDocletFacetInstallDataModelProvider.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.facet;
+
+import java.util.Set;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.XDocletPreferenceStore;
+import org.eclipse.wst.common.componentcore.datamodel.FacetInstallDataModelProvider;
+
+public abstract class XDocletFacetInstallDataModelProvider extends FacetInstallDataModelProvider implements
+		IXDocletFacetInstallDataModelProperties {
+
+	public Set getPropertyNames() {
+		Set names = super.getPropertyNames();
+		names.add(XDOCLETHOME);
+		names.add(XDOCLETVERSION);
+		return names;
+	}
+
+	public Object getDefaultProperty(String propertyName) {
+		XDocletPreferenceStore store = new XDocletPreferenceStore(null);
+		if (propertyName.equals(XDOCLETHOME)) {
+			return store.getProperty(XDOCLETHOME);
+		} else if (propertyName.equals(XDOCLETVERSION)) {
+			return store.getProperty(XDOCLETVERSION);
+		} else if (propertyName.equals(FACET_ID)) {
+			return getFacetID();
+		}
+		return super.getDefaultProperty(propertyName);
+	}
+
+	protected abstract String getFacetID();
+
+	public boolean propertySet(String propertyName, Object propertyValue) {
+		return super.propertySet(propertyName, propertyValue);
+	}
+
+	public boolean isPropertyEnabled(String propertyName) {
+		return super.isPropertyEnabled(propertyName);
+	}
+
+	public IStatus validate(String name) {
+		return super.validate(name);
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/facet/XDocletFacetInstallDelegate.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/facet/XDocletFacetInstallDelegate.java
new file mode 100644
index 0000000..1b7cdd8
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/facet/XDocletFacetInstallDelegate.java
@@ -0,0 +1,52 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.facet;
+
+import org.eclipse.core.resources.IProject;import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
+import org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.action.XDocletActionDelegate;
+import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
+import org.eclipse.jst.j2ee.project.facet.J2EEFacetInstallDelegate;
+import org.eclipse.wst.common.project.facet.core.IDelegate;
+import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
+
+public final class XDocletFacetInstallDelegate extends J2EEFacetInstallDelegate implements IDelegate {
+
+	public void execute(final IProject project, final IProjectFacetVersion fv, final Object cfg, final IProgressMonitor monitor)
+			throws CoreException {
+		if (monitor != null) {
+			monitor.beginTask("", 1);
+		}
+
+		try {
+
+			if (project != null
+					&& (J2EEProjectUtilities.isEJBProject(project.getProject()) || J2EEProjectUtilities.isDynamicWebProject(project
+							.getProject()))) {
+				try {
+					if (!ProjectUtilities.hasBuilder(project.getProject(), XDocletActionDelegate.BUILDERID)) {
+						ProjectUtilities.addToBuildSpec(XDocletActionDelegate.BUILDERID, project.getProject());
+					}
+				} catch (CoreException e) {
+				}
+			}
+
+			if (monitor != null) {
+				monitor.worked(1);
+			}
+		} finally {
+			if (monitor != null) {
+				monitor.done();
+			}
+		}
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/facet/XDocletFacetRuntimeChangedDelegate.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/facet/XDocletFacetRuntimeChangedDelegate.java
new file mode 100644
index 0000000..9a89adb
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/facet/XDocletFacetRuntimeChangedDelegate.java
@@ -0,0 +1,48 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.facet;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.wst.common.project.facet.core.IDelegate;
+import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
+
+/**
+ * @author <a href="mailto:kosta@bea.com">Konstantin Komissarchik</a>
+ */
+
+public final class XDocletFacetRuntimeChangedDelegate
+
+implements IDelegate
+
+{
+	public void execute(final IProject project, final IProjectFacetVersion fv, final Object cfg, final IProgressMonitor monitor)
+
+	throws CoreException
+
+	{
+		if (monitor != null) {
+			monitor.beginTask("", 1);
+		}
+
+		try {
+
+			if (monitor != null) {
+				monitor.worked(1);
+			}
+		} finally {
+			if (monitor != null) {
+				monitor.done();
+			}
+		}
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/facet/XDocletFacetUninstallDelegate.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/facet/XDocletFacetUninstallDelegate.java
new file mode 100644
index 0000000..6a46503
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/facet/XDocletFacetUninstallDelegate.java
@@ -0,0 +1,56 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+
+package org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.facet;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
+import org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.XDocletBuilderValidator;
+import org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.action.XDocletActionDelegate;
+import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
+import org.eclipse.jst.j2ee.project.facet.J2EEFacetInstallDelegate;
+import org.eclipse.wst.common.project.facet.core.IDelegate;
+import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
+
+public final class XDocletFacetUninstallDelegate extends J2EEFacetInstallDelegate implements IDelegate {
+
+
+	public void execute(final IProject project, final IProjectFacetVersion fv, final Object cfg, final IProgressMonitor monitor)
+			throws CoreException {
+		if (monitor != null) {
+			monitor.beginTask("", 1);
+		}
+
+		try {
+			
+			if (project != null
+					&& (J2EEProjectUtilities.isEJBProject(project.getProject()) || J2EEProjectUtilities.isDynamicWebProject(project
+							.getProject()))) {
+				try {
+					ProjectUtilities.removeFromBuildSpec(XDocletActionDelegate.BUILDERID, project.getProject());
+					XDocletBuilderValidator validator = new XDocletBuilderValidator();
+					validator.clearMarkers(project);
+				} catch (CoreException e) {
+				}
+			}			
+
+			if (monitor != null) {
+				monitor.worked(1);
+			}
+		} finally {
+			if (monitor != null) {
+				monitor.done();
+			}
+		}
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/facet/XDocletFacetUtils.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/facet/XDocletFacetUtils.java
new file mode 100644
index 0000000..4c5d076
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/facet/XDocletFacetUtils.java
@@ -0,0 +1,22 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.facet;
+
+import org.eclipse.wst.common.componentcore.internal.util.IModuleConstants;
+import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
+import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
+
+public class XDocletFacetUtils {
+
+	public static final IProjectFacetVersion WEB_22 = ProjectFacetsManager.getProjectFacet(IModuleConstants.JST_WEB_MODULE).getVersion("2.2"); //$NON-NLS-1$
+	public static final IProjectFacetVersion WEB_23 = ProjectFacetsManager.getProjectFacet(IModuleConstants.JST_WEB_MODULE).getVersion("2.3"); //$NON-NLS-1$
+	public static final IProjectFacetVersion WEB_24 = ProjectFacetsManager.getProjectFacet(IModuleConstants.JST_WEB_MODULE).getVersion("2.4"); //$NON-NLS-1$
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/facet/XDocletFacetVersionChangeDelegate.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/facet/XDocletFacetVersionChangeDelegate.java
new file mode 100644
index 0000000..680d162
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/facet/XDocletFacetVersionChangeDelegate.java
@@ -0,0 +1,51 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+
+package org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.facet;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.wst.common.project.facet.core.IDelegate;
+import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
+
+public final class XDocletFacetVersionChangeDelegate
+
+implements IDelegate
+
+{
+	public void execute(final IProject project, final IProjectFacetVersion fv, final Object cfg, final IProgressMonitor monitor)
+
+	throws CoreException
+
+	{
+		if (monitor != null) {
+			monitor.beginTask("", 1);
+		}
+
+		try {
+			// Find the version that's currently installed.
+
+//			final IFacetedProject fproj = ProjectFacetsManager.create(project);
+//
+//			// final IProjectFacetVersion oldver =
+//			// fproj.getInstalledVersion(fv.getProjectFacet());
+
+			if (monitor != null) {
+				monitor.worked(1);
+			}
+		} finally {
+			if (monitor != null) {
+				monitor.done();
+			}
+		}
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/facet/XDocletWebFacetInstallDataModelProvider.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/facet/XDocletWebFacetInstallDataModelProvider.java
new file mode 100644
index 0000000..ac4ae8e
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/facet/XDocletWebFacetInstallDataModelProvider.java
@@ -0,0 +1,16 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.facet;
+
+public class XDocletWebFacetInstallDataModelProvider extends XDocletFacetInstallDataModelProvider {
+	public String getFacetID() {
+		return "jst.web.xdoclet";
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/provider/XDocletAnnotationProvider.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/provider/XDocletAnnotationProvider.java
new file mode 100644
index 0000000..b5f616d
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/provider/XDocletAnnotationProvider.java
@@ -0,0 +1,303 @@
+/*******************************************************************************
+ * Copyright (c) 2002, 2003,2004,2005 Eteration Bilisim A.S.
+ * 
+ * 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:
+ *     Eteration Bilisim A.S. - initial API and implementation
+ *     Naci Dai
+ * For more information on eteration, please see
+ * <http://www.eteration.com/>.
+ ***************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.provider;
+
+import java.util.Iterator;
+import java.util.Set;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jdt.core.IPackageFragmentRoot;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.model.IContainerManagedEntityBean;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.model.IEnterpriseBean;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.model.IMessageDrivenBean;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.model.ISessionBean;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.model.ModelPlugin;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.provider.IAnnotationProvider;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.provider.IEJBGenerator;
+import org.eclipse.jst.j2ee.ejb.annotations.internal.classgen.EjbBuilder;
+import org.eclipse.jst.j2ee.ejb.annotations.internal.emitter.EjbEmitter;
+import org.eclipse.jst.j2ee.ejb.annotations.internal.emitter.EmitterUtilities;
+import org.eclipse.jst.j2ee.ejb.annotations.internal.emitter.EntityEjbEmitter;
+import org.eclipse.jst.j2ee.ejb.annotations.internal.emitter.MessageDrivenEjbEmitter;
+import org.eclipse.jst.j2ee.ejb.annotations.internal.emitter.SessionEjbEmitter;
+import org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.Logger;
+import org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.XDocletBuildUtility;
+import org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.XDocletExtensionUtil;
+import org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.XDocletPreferenceStore;
+import org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.XDocletRuntime;
+import org.eclipse.jst.j2ee.internal.common.operations.INewJavaClassDataModelProperties;
+import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
+import org.eclipse.wst.common.componentcore.datamodel.FacetInstallDataModelProvider;
+import org.eclipse.wst.common.componentcore.datamodel.FacetProjectCreationDataModelProvider;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties.FacetDataModelMap;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.project.facet.core.IFacetedProject;
+import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
+import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
+
+public class XDocletAnnotationProvider implements IAnnotationProvider, IEJBGenerator {
+
+	private static final String END_XDOCLET_DEFINITION = " * <!-- end-xdoclet-definition -->";
+
+	public boolean isEjbAnnotationProvider() {
+		return true;
+	}
+
+	public boolean isServletAnnotationProvider() {
+		return true;
+	}
+
+	public boolean isWebServiceAnnotationProvider() {
+		return false;
+	}
+
+	public boolean isValid() {
+
+		XDocletPreferenceStore store = XDocletPreferenceStore.forProject(null);
+		XDocletRuntime runtime = XDocletExtensionUtil.getRuntime(store.getProperty(XDocletPreferenceStore.XDOCLETVERSION));
+		runtime.setHome(store.getProperty(XDocletPreferenceStore.XDOCLETHOME));
+		return runtime.isValid();
+	}
+
+	public String getName() {
+		return "XDocletAnnotionProvider"; //$NON-NLS-1$
+	}
+
+	public void generateSession(ISessionBean delegate, IProgressMonitor monitor) throws CoreException, InterruptedException {
+
+		IDataModel dataModel = delegate.getDataModel();
+
+		String comment = ""; //$NON-NLS-1$
+		String stub = ""; //$NON-NLS-1$
+		String method = ""; //$NON-NLS-1$
+		String fields = ""; //$NON-NLS-1$
+
+		IConfigurationElement preferredAnnotation = EmitterUtilities.findEmitter("XDoclet"); //$NON-NLS-1$
+
+		try {
+			EjbEmitter ejbEmitter = new SessionEjbEmitter(preferredAnnotation);
+			ejbEmitter.setMonitor(monitor);
+			comment = ejbEmitter.emitTypeComment(delegate);
+			comment = applyRuntimeAnnotations(delegate, comment);
+			stub = ejbEmitter.emitTypeStub(delegate);
+			method = ejbEmitter.emitInterfaceMethods(delegate);
+			fields = ejbEmitter.emitFields(delegate);
+			ejbEmitter.deleteProject();
+		} catch (CoreException e) {
+			throw e;
+		} catch (Exception e) {
+			throw new CoreException(new Status(IStatus.ERROR, ModelPlugin.PLUGINID, 0, "Session EJB Emitters Failed", e));
+		}
+
+		EjbBuilder ejbBuilder = new EjbBuilder();
+		ejbBuilder.setConfigurationElement(preferredAnnotation);
+		ejbBuilder.setMonitor(monitor);
+		ejbBuilder.setPackageFragmentRoot((IPackageFragmentRoot) dataModel
+				.getProperty(INewJavaClassDataModelProperties.JAVA_PACKAGE_FRAGMENT_ROOT));
+		ejbBuilder.setTypeName(dataModel.getStringProperty(INewJavaClassDataModelProperties.CLASS_NAME));
+		ejbBuilder.setPackageName(dataModel.getStringProperty(INewJavaClassDataModelProperties.JAVA_PACKAGE));
+
+		ejbBuilder.setTypeComment(comment);
+		ejbBuilder.setTypeStub(stub);
+		ejbBuilder.setMethodStub(method);
+		ejbBuilder.setFields(fields);
+		ejbBuilder.setCreateInheritedMethods(dataModel.getBooleanProperty(INewJavaClassDataModelProperties.ABSTRACT_METHODS));
+		ejbBuilder.setCreateInheritedConstructors(dataModel.getBooleanProperty(INewJavaClassDataModelProperties.CONSTRUCTOR));
+
+		ejbBuilder.createType();
+
+		IType bean = ejbBuilder.getCreatedType();
+		IResource javaFile = bean.getCorrespondingResource();
+		IProject project = (IProject) dataModel.getProperty(INewJavaClassDataModelProperties.PROJECT);
+		initializeBuilder(monitor, preferredAnnotation, javaFile, project);
+		XDocletBuildUtility.runNecessaryBuilders(monitor, project);
+
+	}
+
+	public void generateCMP(IContainerManagedEntityBean delegate, IProgressMonitor monitor) throws CoreException, InterruptedException {
+
+		IDataModel dataModel = delegate.getDataModel();
+
+		String comment = ""; //$NON-NLS-1$
+		String stub = ""; //$NON-NLS-1$
+		String method = ""; //$NON-NLS-1$
+		String fields = ""; //$NON-NLS-1$
+
+		IConfigurationElement preferredAnnotation = EmitterUtilities.findEmitter("XDoclet"); //$NON-NLS-1$
+
+		try {
+			EjbEmitter ejbEmitter = new EntityEjbEmitter(preferredAnnotation);
+			ejbEmitter.setMonitor(monitor);
+			comment = ejbEmitter.emitTypeComment(delegate);
+			comment = applyRuntimeAnnotations(delegate, comment);
+			stub = ejbEmitter.emitTypeStub(delegate);
+			method = ejbEmitter.emitInterfaceMethods(delegate);
+			fields = ejbEmitter.emitFields(delegate);
+			ejbEmitter.deleteProject();
+		} catch (CoreException e) {
+			throw e;
+		} catch (Exception e) {
+			throw new CoreException(new Status(IStatus.ERROR, ModelPlugin.PLUGINID, 0, "CMP EJB Emitters Failed", e));
+		}
+
+		EjbBuilder ejbBuilder = new EjbBuilder();
+		ejbBuilder.setConfigurationElement(preferredAnnotation);
+		ejbBuilder.setMonitor(monitor);
+		ejbBuilder.setPackageFragmentRoot((IPackageFragmentRoot) dataModel
+				.getProperty(INewJavaClassDataModelProperties.JAVA_PACKAGE_FRAGMENT_ROOT));
+		ejbBuilder.setTypeName(dataModel.getStringProperty(INewJavaClassDataModelProperties.CLASS_NAME));
+		ejbBuilder.setPackageName(dataModel.getStringProperty(INewJavaClassDataModelProperties.JAVA_PACKAGE));
+
+		ejbBuilder.setTypeComment(comment);
+		ejbBuilder.setTypeStub(stub);
+		ejbBuilder.setMethodStub(method);
+		ejbBuilder.setFields(fields);
+		ejbBuilder.setCreateInheritedMethods(dataModel.getBooleanProperty(INewJavaClassDataModelProperties.ABSTRACT_METHODS));
+		ejbBuilder.setCreateInheritedConstructors(dataModel.getBooleanProperty(INewJavaClassDataModelProperties.CONSTRUCTOR));
+
+		ejbBuilder.createType();
+
+		IType bean = ejbBuilder.getCreatedType();
+		IResource javaFile = bean.getCorrespondingResource();
+		IProject project = (IProject) dataModel.getProperty(INewJavaClassDataModelProperties.PROJECT);
+		initializeBuilder(monitor, preferredAnnotation, javaFile, project);
+		XDocletBuildUtility.runNecessaryBuilders(monitor, project);
+
+	}
+
+	private String applyRuntimeAnnotations(IEnterpriseBean delegate, String comment) {
+		String commentRuntime = XDocletExtensionUtil.getRuntimeTypeAnnotations(delegate);
+		int i = comment.indexOf(END_XDOCLET_DEFINITION);
+		if (commentRuntime == null || i < 0)
+			return comment;
+
+		comment = comment.substring(0, i) + commentRuntime + comment.substring(i);
+		return comment;
+	}
+
+	public void generateMessageDriven(IMessageDrivenBean delegate, IProgressMonitor monitor) throws CoreException,
+			InterruptedException {
+
+		IDataModel dataModel = delegate.getDataModel();
+
+		String comment = "";
+		String stub = "";
+		String method = "";
+		String fields = "";
+		IConfigurationElement emitterConfiguration = EmitterUtilities.findEmitter("XDoclet");
+
+		try {
+			EjbEmitter ejbEmitter = new MessageDrivenEjbEmitter(emitterConfiguration);
+			ejbEmitter.setMonitor(monitor);
+			fields = ejbEmitter.emitFields(delegate);
+			comment = ejbEmitter.emitTypeComment(delegate);
+			comment = applyRuntimeAnnotations(delegate, comment);
+			stub = ejbEmitter.emitTypeStub(delegate);
+			method = ejbEmitter.emitInterfaceMethods(delegate);
+			ejbEmitter.deleteProject();
+		} catch (CoreException e) {
+			throw e;
+		} catch (Exception e) {
+			throw new CoreException(new Status(IStatus.ERROR, ModelPlugin.PLUGINID, 0, "MessageDriven EJB Emitters Failed", e));
+		}
+
+		EjbBuilder ejbBuilder = new EjbBuilder();
+		ejbBuilder.setConfigurationElement(emitterConfiguration);
+		ejbBuilder.setMonitor(monitor);
+		ejbBuilder.setPackageFragmentRoot((IPackageFragmentRoot) dataModel
+				.getProperty(INewJavaClassDataModelProperties.JAVA_PACKAGE_FRAGMENT_ROOT));
+		ejbBuilder.setTypeName(dataModel.getStringProperty(INewJavaClassDataModelProperties.CLASS_NAME));
+		ejbBuilder.setPackageName(dataModel.getStringProperty(INewJavaClassDataModelProperties.JAVA_PACKAGE));
+
+		ejbBuilder.setTypeComment(comment);
+		ejbBuilder.setTypeStub(stub);
+		ejbBuilder.setMethodStub(method);
+		ejbBuilder.setFields(fields);
+		ejbBuilder.setCreateInheritedMethods(dataModel.getBooleanProperty(INewJavaClassDataModelProperties.ABSTRACT_METHODS));
+		ejbBuilder.setCreateInheritedConstructors(dataModel.getBooleanProperty(INewJavaClassDataModelProperties.CONSTRUCTOR));
+
+		ejbBuilder.createType();
+		IType bean = ejbBuilder.getCreatedType();
+		IResource javaFile = bean.getCorrespondingResource();
+		IProject project = (IProject) dataModel.getProperty(INewJavaClassDataModelProperties.PROJECT);
+		initializeBuilder(monitor, emitterConfiguration, javaFile, project);
+		XDocletBuildUtility.runNecessaryBuilders(monitor, project);
+
+	}
+
+	protected void initializeBuilder(IProgressMonitor monitor, IConfigurationElement emitterConfiguration, IResource javaFile,
+			IProject project) throws CoreException {
+		addXDocletFacet(project, monitor);
+		// To add an xdoclet builder we must use a
+		// a facet now.
+		// EmitterUtilities.addAnnotationBuilderToProject(emitterConfiguration,
+		// project);
+	}
+
+	private void addXDocletFacet(IProject project, IProgressMonitor monitor) {
+		if (J2EEProjectUtilities.isDynamicWebProject(project)) {
+			installXDocletFacets(project, monitor, "jst.web.xdoclet");
+		} else if (J2EEProjectUtilities.isEJBProject(project)) {
+			installXDocletFacets(project, monitor, "jst.ejb.xdoclet");
+		}
+	}
+
+	private void installXDocletFacets(IProject project, IProgressMonitor monitor, String docletType) {
+
+		try {
+			IFacetedProject facetedProject = ProjectFacetsManager.create(project);
+			Set facets = facetedProject.getProjectFacets();
+			Set fixedFacets = facetedProject.getFixedProjectFacets();
+			boolean shouldInstallFacet = true;
+			for (Iterator iter = facets.iterator(); iter.hasNext();) {
+				IProjectFacetVersion facetVersion = (IProjectFacetVersion) iter.next();
+				String facetID = facetVersion.getProjectFacet().getId();
+				if (docletType.equals(facetID)) {
+					shouldInstallFacet = false;
+				}
+			}
+			if (!shouldInstallFacet)
+				return;
+
+			IDataModel dm = DataModelFactory.createDataModel(new FacetInstallDataModelProvider());
+			dm.setProperty(IFacetDataModelProperties.FACET_ID, docletType);
+			dm.setProperty(IFacetDataModelProperties.FACET_PROJECT_NAME, project.getName());
+			dm.setProperty(IFacetDataModelProperties.FACET_VERSION_STR, "1.2.3"); //$NON-NLS-1$
+			IDataModel fdm = DataModelFactory.createDataModel(new FacetProjectCreationDataModelProvider());
+			fdm.setProperty(IFacetProjectCreationDataModelProperties.FACET_PROJECT_NAME, project.getName());
+
+			FacetDataModelMap map = (FacetDataModelMap) fdm.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
+			map.add(dm);
+
+			fdm.getDefaultOperation().execute(monitor, null);
+			facetedProject.setFixedProjectFacets(fixedFacets);
+		} catch (Exception e) {
+			Logger.logException(e);
+		}
+
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/ui/AttributeWizardPage.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/ui/AttributeWizardPage.java
new file mode 100644
index 0000000..a0ae4e2
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/ui/AttributeWizardPage.java
@@ -0,0 +1,58 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+package org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.ui;
+
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.XDocletPreferenceStore;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+
+public class AttributeWizardPage extends WizardPage {
+
+	IExtension extension;
+	XDocletPreferenceStore preferenceStore;
+	AttributesDecorator attributesDecorator;
+
+	public AttributeWizardPage(String pageName, String title, ImageDescriptor titleImage) {
+		super(pageName, title, titleImage);
+	}
+
+	public AttributeWizardPage(String pageName, IExtension extension, XDocletPreferenceStore preferenceStore) {
+		super(pageName);
+		this.preferenceStore = preferenceStore;
+		this.extension = extension;
+	}
+
+	public void createControl(Composite parent) {
+
+		Composite composite = new Composite(parent, SWT.NULL);
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 1;
+		composite.setLayout(layout);
+
+		GridData data = new GridData(SWT.FILL, SWT.FILL, true, true);
+		composite.setLayoutData(data);
+
+		initializeDialogUnits(composite);
+
+		attributesDecorator = new AttributesDecorator(extension, preferenceStore);
+		attributesDecorator.decorate(composite);
+		setControl(composite);
+
+	}
+
+	public void doFinish() {
+		attributesDecorator.save();
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/ui/AttributesDecorator.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/ui/AttributesDecorator.java
new file mode 100644
index 0000000..aa38306
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/ui/AttributesDecorator.java
@@ -0,0 +1,210 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+package org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.ui;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.StringTokenizer;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.XDocletPreferenceStore;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+
+public class AttributesDecorator {
+
+	private IExtension extension;
+
+	private IConfigurationElement tag;
+
+	private IConfigurationElement[] params;
+
+	HashMap allProperties = new HashMap();
+
+	private XDocletPreferenceStore preferenceStore;
+
+	public AttributesDecorator(IExtension extension, XDocletPreferenceStore preferenceStore) {
+		super();
+
+		this.extension = extension;
+		params = this.extension.getConfigurationElements();
+		tag = params[0];
+		this.preferenceStore = preferenceStore;
+	}
+
+	public void decorate(final Composite composite) {
+
+		Group attributes = new Group(composite, SWT.NONE);
+		attributes.setText(Messages.label_attributes + " "+ tag.getAttribute("name"));
+		attributes.setToolTipText(tag.getAttribute("description"));
+
+		GridLayout layout = new GridLayout(6, false);
+		attributes.setLayout(layout);
+		GridData attributesGrid = new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL);
+		attributes.setLayoutData(attributesGrid);
+
+		allProperties = new HashMap();
+		// The first configuration is the tag provider so skip
+		for (int i = 0; i < params.length; i++) {
+			final IConfigurationElement attribute = params[i];
+
+			if (!"TaskProperty".equals(attribute.getName()))
+				continue;
+//			Group attributeGroup = new Group(attributes, SWT.NONE);
+//			attributeGroup.setText(attribute.getAttribute("label"));
+//			attributeGroup.setToolTipText(attribute.getAttribute("description"));
+//			layout = new GridLayout(3, false);
+//			attributeGroup.setLayout(layout);
+//			GridData gridData = new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL);
+//			attributeGroup.setLayoutData(gridData);
+			createAttributeControl(attributes, attribute);
+			String includeId = attribute.getAttribute("id") + ".include";
+			Button bool = createLabeledCheck(Messages.label_include, preferenceStore.getBooleanPropertyNoGlobal(includeId), attributes);
+			bool.setData(attribute);
+			allProperties.put(includeId, bool);
+			bool.addSelectionListener(new SelectionListener() {
+				public void widgetSelected(SelectionEvent e) {
+
+					String id = attribute.getAttribute("id");
+					preferenceStore.setProperty(id + ".include", ((Button) e.item).getSelection());
+				}
+
+				public void widgetDefaultSelected(SelectionEvent e) {
+					widgetSelected(e);
+				}
+			});
+
+		}
+		Dialog.applyDialogFont(composite);
+	}
+
+	private void createAttributeControl(Composite parent, IConfigurationElement attribute) {
+		String type = attribute.getAttribute("type");
+		if ("string".equals(type)) {
+			Text str = createLabeledText(attribute.getAttribute("label"), preferenceStore.getPropertyNoGlobal(attribute.getAttribute("id")), parent);
+			str.setData(attribute);
+			allProperties.put(attribute.getAttribute("id"), str);
+		} else if ("boolean".equals(type)) {
+			Button bool = createLabeledCheck(attribute.getAttribute("label"), preferenceStore.getBooleanPropertyNoGlobal(attribute.getAttribute("id")), parent);
+			bool.setData(attribute);
+			allProperties.put(attribute.getAttribute("id"), bool);
+		} else if ("enum".equals(type)) {
+			Combo combo = createLabeledCombo(parent, attribute);
+			combo.setData(attribute);
+			allProperties.put(attribute.getAttribute("id"), combo);
+		}
+
+	}
+
+	private Combo createLabeledCombo(Composite defPanel, IConfigurationElement attribute) {
+
+		GridData gridData;
+		Label label = new Label(defPanel, SWT.WRAP);
+		gridData = new GridData();
+		label.setLayoutData(gridData);
+		label.setText(attribute.getAttribute("label"));
+
+		Combo combo = new Combo(defPanel, SWT.READ_ONLY);
+		gridData = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL);
+		gridData.horizontalSpan = 2;
+		combo.setLayoutData(gridData);
+		String value = preferenceStore.getPropertyNoGlobal(attribute.getAttribute("id"));
+		StringTokenizer tokenizer = new StringTokenizer(attribute.getAttribute("restriction"), ",");
+		int i = 0;
+		int sel = 0;
+		while (tokenizer.hasMoreTokens()) {
+			String item = tokenizer.nextToken().trim();
+			if (item.equals(value))
+				sel = i;
+			combo.add(item);
+			++i;
+
+		}
+		if (combo.getItemCount() > 0)
+			combo.select(sel);
+		return combo;
+	}
+
+	private Button createLabeledCheck(String title, boolean value, Composite defPanel) {
+		GridData gridData;
+		Label label = new Label(defPanel, SWT.WRAP);
+		gridData = new GridData();
+		label.setLayoutData(gridData);
+		label.setText(title);
+
+		Button fButton = new Button(defPanel, SWT.CHECK);
+
+		gridData = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL);
+		gridData.horizontalSpan = 2;
+		fButton.setLayoutData(gridData);
+		fButton.setSelection(value);
+		fButton.addSelectionListener(new SelectionListener() {
+			public void widgetSelected(SelectionEvent e) {
+
+			}
+
+			public void widgetDefaultSelected(SelectionEvent e) {
+
+			}
+		});
+
+		return fButton;
+	}
+
+	private Text createLabeledText(String title, String value, Composite defPanel) {
+		GridData gridData;
+		Label label = new Label(defPanel, SWT.WRAP);
+		gridData = new GridData();
+		label.setLayoutData(gridData);
+		label.setText(title);
+
+		Text text = new Text(defPanel, SWT.SHADOW_IN | SWT.BORDER);
+		gridData = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL);
+		gridData.horizontalSpan = 2;
+		text.setLayoutData(gridData);
+		text.setText(value);
+
+		return text;
+	}
+
+	public void save() {
+		Iterator iterator = allProperties.keySet().iterator();
+		while (iterator.hasNext()) {
+			String key = (String) iterator.next();
+			Object widget = allProperties.get(key);
+			if (widget instanceof Text) {
+				Text text = (Text) widget;
+				String value = text.getText();
+				preferenceStore.setProperty(key, value);
+			} else if (widget instanceof Button) {
+				Button bool = (Button) widget;
+				preferenceStore.setProperty(key, bool.getSelection());
+			} else if (widget instanceof Combo) {
+				Combo combo = (Combo) widget;
+				if (combo.getSelectionIndex() >= 0) {
+					String value = combo.getItem(combo.getSelectionIndex());
+					preferenceStore.setProperty(key, value);
+				}
+			}
+		}
+
+	}
+
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/ui/DialogPanel.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/ui/DialogPanel.java
new file mode 100644
index 0000000..fc788d8
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/ui/DialogPanel.java
@@ -0,0 +1,186 @@
+/*******************************************************************************
+ * Copyright (c) 2002, 2003,2004,2005 Eteration Bilisim A.S.
+ * 
+ * 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:
+ *     Eteration Bilisim A.S. - initial API and implementation
+ *     Naci Dai
+ * For more information on eteration, please see
+ * <http://www.eteration.com/>.
+ ***************************************************************************/
+package org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.ui;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.DirectoryDialog;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+
+
+
+public class DialogPanel extends Composite {
+
+	public Control preferences[] = null;
+
+	public Button fActive[] = null;
+
+	public DialogPanel(Composite parent, int style) {
+		super(parent, style);
+	}
+
+	public Text createLabeledText(int i, boolean checked, String title,
+			String tip, String value, Composite defPanel) {
+		return this.createLabeledText(i, true, checked, title, tip, value,
+				defPanel);
+	}
+
+	public Text createLabeledText(int i, boolean addActiveButton,
+			boolean checked, String title, String tip, String value,
+			Composite defPanel) {
+		GridData gridData;
+		Label label = new Label(defPanel, SWT.WRAP);
+		gridData = new GridData();
+		label.setLayoutData(gridData);
+		label.setText(title);
+		label.setToolTipText(tip);
+
+		if (addActiveButton) {
+			Button fButton = new Button(defPanel, SWT.CHECK);
+
+			gridData = new GridData(GridData.BEGINNING);
+			gridData.horizontalSpan = 1;
+			fButton.setLayoutData(gridData);
+			fButton.setSelection(checked);
+			fActive[i] = fButton;
+		}
+		Text fText = new Text(defPanel, SWT.SHADOW_IN | SWT.BORDER);
+		gridData = new GridData(GridData.FILL_HORIZONTAL
+				| GridData.GRAB_HORIZONTAL);
+		gridData.horizontalSpan = (addActiveButton ? 2 : 3);
+		fText.setLayoutData(gridData);
+		fText.setText(value);
+		fText.setToolTipText(tip);
+		return fText;
+	}
+
+	public Button createLabeledCheck(int i, boolean checked, String title,
+			String tip, boolean value, Composite defPanel) {
+		return createLabeledCheck(i, true, checked, title, tip, value, defPanel);
+	}
+
+	public Button createLabeledCheck(int i, boolean addActiveButton,
+			boolean checked, String title, String tip, boolean value,
+			Composite defPanel) {
+		GridData gridData;
+		Label label = new Label(defPanel, SWT.WRAP);
+		gridData = new GridData();
+		label.setLayoutData(gridData);
+		label.setText(title);
+		label.setToolTipText(tip);
+
+		Button fButton = new Button(defPanel, SWT.CHECK);
+		gridData = new GridData();
+		gridData.horizontalSpan = 3;
+		fButton.setLayoutData(gridData);
+		fButton.setSelection(value);
+		fButton.setToolTipText(tip);
+		fButton.setSelection(checked);
+		fActive[i] = fButton;
+		return fButton;
+	}
+
+	public Combo createLabeledCombo(int itemI, boolean checked, String title,
+			String tip, String value, String[] choices, Composite defPanel) {
+
+		return createLabeledCombo(itemI, true, checked, title, tip, value,
+				choices, defPanel);
+	}
+
+	public Combo createLabeledCombo(int itemI, boolean addActiveButton,
+			boolean checked, String title, String tip, String value,
+			String[] choices, Composite defPanel) {
+
+		GridData gridData;
+		Label label = new Label(defPanel, SWT.WRAP);
+		gridData = new GridData();
+		label.setLayoutData(gridData);
+		label.setText(title);
+		label.setToolTipText(tip);
+
+		if (addActiveButton) {
+			Button fButton = new Button(defPanel, SWT.CHECK);
+			gridData = new GridData();
+			gridData.horizontalSpan = 1;
+			fButton.setLayoutData(gridData);
+			fButton.setSelection(checked);
+			fActive[itemI] = fButton;
+		}
+
+		Combo fCombo = new Combo(defPanel, SWT.BORDER);
+		gridData = new GridData(GridData.FILL_HORIZONTAL
+				| GridData.GRAB_HORIZONTAL);
+		gridData.horizontalSpan = (addActiveButton ? 2 : 3);
+		fCombo.setLayoutData(gridData);
+		fCombo.setToolTipText(tip);
+		int selected = 0;
+		for (int i = 0; i < choices.length; i++) {
+			String item = choices[i];
+			if (value.equals(item))
+				selected = i;
+			fCombo.add(item);
+		}
+		fCombo.select(selected);
+		return fCombo;
+	}
+
+	public Text createLabeledPath(int i, boolean checked, String title,
+			final String tip, String value, Composite defPanel) {
+		GridData gridData;
+		Label label = new Label(defPanel, SWT.WRAP);
+		gridData = new GridData();
+		// gridData.horizontalSpan = 1;
+		label.setLayoutData(gridData);
+		label.setText(title);
+
+		final Text fText = new Text(defPanel, SWT.SHADOW_IN | SWT.BORDER);
+		gridData = new GridData(GridData.FILL_HORIZONTAL
+				| GridData.GRAB_HORIZONTAL);
+		gridData.horizontalSpan = 2;
+		fText.setLayoutData(gridData);
+		fText.setText(value);
+		//ResourceBundle bundle = ResourceBundle.getBundle("org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.ui.preferences");
+		Button fButton = new Button(defPanel, SWT.PUSH);
+		fButton.setText(Messages.label_browse);
+		fButton.setLayoutData(new GridData());
+		fButton.addSelectionListener(new SelectionListener() {
+			public void widgetSelected(SelectionEvent e) {
+				DirectoryDialog dlg = new DirectoryDialog(DialogPanel.this
+						.getShell());
+				dlg.setFilterPath(fText.getText());
+				dlg.setMessage(tip);
+				String res = dlg.open();
+				if (res != null) {
+					fText.setText(res);
+				}
+			}
+
+			public void widgetDefaultSelected(SelectionEvent e) {
+				widgetSelected(e);
+			}
+
+		});
+
+		return fText;
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/ui/Messages.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/ui/Messages.java
new file mode 100644
index 0000000..d0f4a2b
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/ui/Messages.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.ui;
+
+import org.eclipse.osgi.util.NLS;
+
+public final class Messages extends NLS {
+
+	private static final String BUNDLE_NAME = "org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.ui.preferences";//$NON-NLS-1$
+
+	private Messages() {
+		// Do not instantiate
+	}
+
+	public static String label_set_xdoclet_runtime_preference;
+	public static String label_enable_xdoclet_builder;
+	public static String desc_enable_xdoclet_builder;
+	public static String label_xdoclet_home;
+	public static String desc_xdoclet_home;
+	public static String label_browse;
+	public static String label_xdoclet_version;
+	public static String desc_xdoclet_version;
+	public static String label_global_pref;
+	public static String desc_global_pref;
+	
+	public static String label_attributes;
+	public static String label_include;
+	public static String label_tasks;
+	public static String label_task;
+	public static String label_edit;
+	public static String error_message_no_lib;
+	public static String error_xdoclet_home_message;
+	
+	public static String xdoclet_runtime_invalid;	
+
+	static {
+		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/ui/PropertyPreferencePage.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/ui/PropertyPreferencePage.java
new file mode 100644
index 0000000..93aaf15
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/ui/PropertyPreferencePage.java
@@ -0,0 +1,46 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.ui;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.jface.preference.PreferencePage;
+import org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.XDocletPreferenceStore;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+import org.eclipse.ui.IWorkbenchPropertyPage;
+
+public abstract class PropertyPreferencePage extends PreferencePage implements IWorkbenchPreferencePage, IWorkbenchPropertyPage {
+
+	protected IProject fProject = null;
+	protected XDocletPreferenceStore store = null;
+
+	public IAdaptable getElement() {
+		return fProject;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.IWorkbenchPropertyPage#setElement(org.eclipse.core.runtime.IAdaptable)
+	 */
+	public void setElement(IAdaptable element) {
+		fProject = (IProject) element.getAdapter(IResource.class);
+
+	}
+
+	public XDocletPreferenceStore getStore() {
+		if (store == null) {
+			store = XDocletPreferenceStore.forProject(fProject);
+		}
+		return store;
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/ui/TagPropertiesWizard.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/ui/TagPropertiesWizard.java
new file mode 100644
index 0000000..e10ff64
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/ui/TagPropertiesWizard.java
@@ -0,0 +1,52 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+package org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.ui;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.XDocletAnnotationPlugin;
+import org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.XDocletPreferenceStore;
+
+public class TagPropertiesWizard extends Wizard {
+
+	IExtension extension;
+	IConfigurationElement[] params;
+	IConfigurationElement tag;
+	AttributeWizardPage mainPage;
+	private XDocletPreferenceStore preferenceStore;
+	
+	public TagPropertiesWizard(IExtension extension, XDocletPreferenceStore store)
+	{
+		this.extension = extension;
+		this.preferenceStore = store;
+		params = extension.getConfigurationElements();
+		tag = params[0];
+		
+		setDefaultPageImageDescriptor(XDocletAnnotationPlugin.createImageDescriptor(XDocletAnnotationPlugin.getDefault().getBundle().getEntry("/"),"icons/xdoclet.jpg"));
+		setWindowTitle(tag.getAttribute("name"));
+	}
+	public boolean performFinish() {
+		mainPage.doFinish();
+		return true;
+	}
+	
+	
+	public void addPages() {
+		try {
+			super.addPages();
+			mainPage = new AttributeWizardPage(tag.getAttribute("name") + " attributes", extension, preferenceStore);
+			mainPage.setWizard(this);
+			addPage(mainPage);
+		} catch (Throwable ex) {
+			ex.printStackTrace();
+		}		
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/ui/TaskProviderDecorator.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/ui/TaskProviderDecorator.java
new file mode 100644
index 0000000..06e317f
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/ui/TaskProviderDecorator.java
@@ -0,0 +1,243 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+package org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.ui;
+
+import java.util.ArrayList;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.viewers.CheckStateChangedEvent;
+import org.eclipse.jface.viewers.CheckboxTableViewer;
+import org.eclipse.jface.viewers.ICheckStateListener;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.XDocletPreferenceStore;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+
+public class TaskProviderDecorator {
+
+	private IExtension[] extensions;
+
+	private XDocletPreferenceStore preferenceStore;
+
+	private Table table;
+	private Button edit;
+	private CheckboxTableViewer tableViewer; 
+	
+	public TaskProviderDecorator(IExtension[] extensions, XDocletPreferenceStore preferenceStore) {
+		super();
+		this.extensions = extensions;
+		this.preferenceStore = preferenceStore;
+	}
+
+	public void decorate(final Composite composite) {
+
+		createTableViewer(createTable(composite));
+		Dialog.applyDialogFont(composite);
+	}
+
+	private Table createTable(final Composite parent) {
+		int style = SWT.CHECK | SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.HIDE_SELECTION;
+
+		GridLayout layout;
+		GridData gridData;
+		Group libraryPanel = new Group(parent, SWT.NONE);
+		libraryPanel.setText(Messages.label_tasks);
+		layout = new GridLayout(3, false);
+		libraryPanel.setLayout(layout);
+		gridData = new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL);
+		gridData.horizontalSpan = 3;
+		libraryPanel.setLayoutData(gridData);
+
+		table = new Table(libraryPanel, style);
+		gridData = new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL);
+		gridData.horizontalSpan = 1;
+		table.setLayoutData(gridData);
+
+		table.setLinesVisible(true);
+		table.setHeaderVisible(true);
+
+		TableColumn column = new TableColumn(table, SWT.CENTER, 0);
+		column.setText(columnNames[0]);
+		column.setWidth(60);
+
+		column = new TableColumn(table, SWT.LEFT, 1);
+		column.setText(columnNames[1]);
+		column.setWidth(200);
+
+		edit = new Button(libraryPanel, SWT.PUSH);
+		edit.setText(Messages.label_edit);
+		GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_BEGINNING);
+		edit.setLayoutData(data);
+		edit.setEnabled(false);
+		edit.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				IExtension extension = (IExtension) table.getSelection()[0].getData();
+				if (extension != null) {
+					if (showWizard(extension, parent.getShell()) != Window.CANCEL) {
+					}
+				}
+			}
+		});
+
+		return table;
+	}
+
+	/**
+	 * Create the TableViewer
+	 */
+	private TableViewer createTableViewer(Table table) {
+
+		tableViewer = new CheckboxTableViewer(table);
+		tableViewer.setUseHashlookup(true);
+
+		tableViewer.setColumnProperties(columnNames);
+		tableViewer.setLabelProvider(new FieldLabelProvider());
+		tableViewer.setContentProvider(new FieldContentProvider());
+		tableViewer.addCheckStateListener(new ICheckStateListener() {
+			public void checkStateChanged(CheckStateChangedEvent event) {
+				IExtension extension = (IExtension) event.getElement();
+
+				IConfigurationElement[] elements = extension.getConfigurationElements();
+				if (elements == null)
+					return;
+
+				String id = elements[0].getAttribute("id");
+				String selection = id + ".defaultSelection";
+				TaskProviderDecorator.this.preferenceStore.setProperty(selection, event.getChecked());
+			}
+		});
+		tableViewer.setInput(extensions);
+		tableViewer.setCheckedElements(getCheckedTasks());
+
+		tableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
+			public void selectionChanged(SelectionChangedEvent event) {
+				Object obj = getSelection(event.getSelection());
+				boolean enabled = false;
+				if (obj != null && obj instanceof IExtension)
+					enabled = ((IExtension) obj).getConfigurationElements().length > 1;
+				edit.setEnabled(enabled);
+			}
+		});
+
+		return tableViewer;
+	}
+
+	protected Object getSelection(ISelection sele) {
+		IStructuredSelection sel = (IStructuredSelection) sele;
+		return sel.getFirstElement();
+	}
+
+	private Object[] getCheckedTasks() {
+		ArrayList checked = new ArrayList(extensions.length);
+		for (int i = 0; i < extensions.length; i++) {
+			IExtension extension = extensions[i];
+			IConfigurationElement[] elements = extension.getConfigurationElements();
+			if (elements != null) {
+				String id = elements[0].getAttribute("id");
+				String selection = id + ".defaultSelection";
+				if (preferenceStore.getBooleanPropertyNoGlobal(selection))
+					checked.add(extension);
+			}
+		}
+
+		return checked.toArray();
+	}
+
+	protected static String[] columnNames = { Messages.label_include, Messages.label_task };
+
+	protected int getColumnIndex(String columName) {
+		if (columName == null)
+			return -1;
+		for (int i = 0; i < columnNames.length; i++) {
+			String col = columnNames[i];
+			if (columName.equals(col))
+				return i;
+
+		}
+		return -1;
+	}
+
+	public class FieldContentProvider implements IStructuredContentProvider {
+		public void dispose() {
+		}
+
+		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+		}
+
+		public Object[] getElements(Object parent) {
+			return (IExtension[]) parent;
+		}
+	}
+
+	public class FieldLabelProvider extends LabelProvider implements ITableLabelProvider {
+
+		public String getColumnText(Viewer v, Object obj, int index) {
+			return getColumnText(obj, index);
+		}
+
+		public Image getColumnImage(Viewer v, Object obj, int index) {
+			return getColumnImage(obj, index);
+		}
+
+		public Image getColumnImage(Object obj, int index) {
+			return null; // unchecked
+		}
+
+		public String getColumnText(Object obj, int index) {
+
+			IExtension extension = (IExtension) obj;
+			IConfigurationElement[] elements = extension.getConfigurationElements();
+			if (elements == null)
+				return "";
+
+			switch (index) {
+			case 0: // Local
+				return "";
+			case 1: // Local
+				return elements[0].getAttribute("name");
+			}
+			return "";
+		}
+
+	}
+
+	protected int showWizard(final IExtension extension, Shell shell) {
+		Wizard wizard = new TagPropertiesWizard(extension, preferenceStore);
+		wizard.setForcePreviousAndNextButtons(true);
+		WizardDialog dialog = new WizardDialog(shell, wizard);
+		return dialog.open();
+	}
+
+	public void refresh() {
+		tableViewer.setCheckedElements(getCheckedTasks());
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/ui/XDocletEJBPreferencePage.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/ui/XDocletEJBPreferencePage.java
new file mode 100644
index 0000000..390bdd3
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/ui/XDocletEJBPreferencePage.java
@@ -0,0 +1,121 @@
+/*******************************************************************************
+ * Copyright (c) 2002, 2003,2004 Eteration Bilisim A.S.
+ * Naci Dai and others.
+ * 
+ * Parts developed under contract ref:FT/R&D/MAPS/AMS/2004-09-09/AL are 
+ * Copyright France Telecom, 2004.
+ * 
+ * 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:
+ *     Eteration Bilisim A.S. - initial API and implementation
+ *     Naci Dai
+ * For more information on eteration, please see
+ * <http://www.eteration.com/>.
+ ***************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.ui;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.Logger;
+import org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.XDocletBuildUtility;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.IWorkbench;
+
+public class XDocletEJBPreferencePage extends PropertyPreferencePage implements SelectionListener {
+
+	DialogPanel panel;
+
+	private TaskProviderDecorator descriptionProvider;
+
+	public XDocletEJBPreferencePage() {
+		super();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
+	 */
+	public void init(IWorkbench workbench) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+	 */
+	public void widgetSelected(SelectionEvent e) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
+	 */
+	public void widgetDefaultSelected(SelectionEvent e) {
+	}
+
+	protected Composite createContainer(Composite parent) {
+		panel = new DialogPanel(parent, SWT.NONE);
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 2;
+		layout.makeColumnsEqualWidth = false;
+		panel.setLayout(layout);
+		GridData gridData = new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL);
+		panel.setLayoutData(gridData);
+		return panel;
+	}
+
+	/*
+	 * @see PreferencePage#createContents(Composite)
+	 */
+	protected Control createContents(Composite parent) {
+		// noDefaultAndApplyButton();
+		Composite composite = createContainer(parent);
+		IExtension[] extensions = Platform.getExtensionRegistry().getExtensionPoint(
+				"org.eclipse.jst.j2ee.ejb.annotations.xdoclet.ejbDocletTaskProvider").getExtensions();
+
+		descriptionProvider = new TaskProviderDecorator(extensions, getStore());
+		descriptionProvider.decorate(composite);
+
+		return composite;
+	}
+
+	public void performDefaults() {
+		super.performDefaults();
+		getStore().clear();
+		getStore().save();
+		descriptionProvider.refresh();
+		try {
+			XDocletBuildUtility.runNecessaryBuilders(new NullProgressMonitor(), (IProject) getElement());
+		} catch (CoreException e) {
+			Logger.logException(e);
+		}		
+	}
+	
+	public boolean performOk() {
+
+		getStore().save();
+		try {
+			XDocletBuildUtility.runNecessaryBuilders(new NullProgressMonitor(), (IProject) getElement());
+		} catch (CoreException e) {
+			Logger.logException(e);
+		}
+		return super.performOk();
+	}
+
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/ui/XDocletPreferencePage.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/ui/XDocletPreferencePage.java
new file mode 100644
index 0000000..470e119
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/ui/XDocletPreferencePage.java
@@ -0,0 +1,245 @@
+/*******************************************************************************
+ * Copyright (c) 2002, 2003,2004,2005 Eteration Bilisim A.S.
+ * 
+ * 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:
+ *     Eteration Bilisim A.S. - initial API and implementation
+ *     Naci Dai
+ * For more information on eteration, please see
+ * <http://www.eteration.com/>.
+ ***************************************************************************/
+package org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.ui;
+
+import java.util.Map;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.Logger;
+import org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.XDocletBuildUtility;
+import org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.XDocletExtensionUtil;
+import org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.XDocletPreferenceStore;
+import org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.XDocletRuntime;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.IWorkbench;
+
+public class XDocletPreferencePage extends PropertyPreferencePage implements SelectionListener {
+
+	DialogPanel panel;
+
+	private Map fData; // page data
+
+	private XDocletRuntime[] runtimes;
+
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.preference.PreferencePage#applyData(java.lang.Object)
+	 */
+	public void applyData(Object data) {
+		if (data instanceof Map) {
+			fData = (Map) data;
+		}
+
+	}
+
+	protected Map getData() {
+		return fData;
+	}
+
+	protected boolean useProjectSettings() {
+		return isProjectPreferencePage();
+	}
+
+	protected boolean isProjectPreferencePage() {
+		return fProject != null;
+	}
+
+	protected IProject getProject() {
+		return fProject;
+	}
+
+	public XDocletPreferencePage() {
+		super();
+		setDescription(Messages.label_set_xdoclet_runtime_preference);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
+	 */
+	public void init(IWorkbench workbench) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+	 */
+	public void widgetSelected(SelectionEvent e) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
+	 */
+	public void widgetDefaultSelected(SelectionEvent e) {
+	}
+
+	protected Composite createContainer(Composite parent) {
+		panel = new DialogPanel(parent, SWT.NONE);
+		GridLayout layout = new GridLayout();
+		layout.marginHeight = 0;
+		layout.marginWidth = 0;
+		layout.numColumns = 4;
+		layout.makeColumnsEqualWidth = false;
+		panel.setLayout(layout);
+		GridData gridData = new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL);
+		panel.setLayoutData(gridData);
+		return panel;
+	}
+
+	/*
+	 * @see PreferencePage#createContents(Composite)
+	 */
+	protected Control createContents(Composite parent) {
+		runtimes = XDocletExtensionUtil.getRuntimes();
+
+		Composite composite = createContainer(parent);
+		
+		// add separator
+		new Label(composite, SWT.NONE).setLayoutData(new GridData(SWT.BEGINNING, SWT.TOP, false, false, 4, 1));
+
+		int numCont = 3;
+		if (isProjectPreferencePage())
+			numCont = 4;
+
+		panel.preferences = new Control[numCont];
+		panel.fActive = new Button[numCont];
+
+		if (isProjectPreferencePage())
+			panel.preferences[3] = panel.createLabeledCheck(3, getStore().getBooleanPropertyNoGlobal(
+					XDocletPreferenceStore.XDOCLETUSEGLOBAL), Messages.label_global_pref, Messages.desc_global_pref, getStore()
+					.getBooleanPropertyNoGlobal(XDocletPreferenceStore.XDOCLETUSEGLOBAL), composite);
+
+		panel.preferences[0] = panel.createLabeledCheck(0, false, getStore().getBooleanPropertyNoGlobal(
+				XDocletPreferenceStore.XDOCLETBUILDERACTIVE), Messages.label_enable_xdoclet_builder,
+				Messages.desc_enable_xdoclet_builder, getStore().getBooleanPropertyNoGlobal(
+						XDocletPreferenceStore.XDOCLETBUILDERACTIVE), composite);
+		panel.preferences[2] = panel.createLabeledPath(2, true, Messages.label_xdoclet_home, Messages.desc_xdoclet_home,
+				getStore().getPropertyNoGlobal(XDocletPreferenceStore.XDOCLETHOME), composite);
+
+		String[] versions = new String[runtimes.length];
+		for (int i = 0; i < versions.length; i++) {
+			versions[i] = runtimes[i].getVersion();
+		}
+		panel.preferences[1] = panel.createLabeledCombo(1, false, true, Messages.label_xdoclet_version,
+				Messages.desc_xdoclet_version, getStore().getPropertyNoGlobal(XDocletPreferenceStore.XDOCLETVERSION), versions,
+				composite);
+		final Text xDocletPath = (Text) panel.preferences[2];
+		final Combo xDocletVersion = (Combo) panel.preferences[1];
+
+		validateCurrentPreferences(xDocletPath, xDocletVersion);
+
+		ModifyListener listener = new ModifyListener() {
+
+			public void modifyText(ModifyEvent e) {
+				validateCurrentPreferences(xDocletPath, xDocletVersion);
+
+			}
+		};
+
+		xDocletPath.addModifyListener(listener);
+		xDocletVersion.addModifyListener(listener);
+		applyDialogFont(composite);
+
+		return composite;
+	}
+
+	public boolean performOk() {
+
+		String itemValue = "";
+		itemValue = ((Text) panel.preferences[2]).getText();
+		getStore().setProperty(XDocletPreferenceStore.XDOCLETHOME, itemValue);
+
+		if (isProjectPreferencePage()) {
+			getStore().setProperty(XDocletPreferenceStore.XDOCLETUSEGLOBAL, ((Button) panel.preferences[3]).getSelection());
+		}
+
+		Combo combo = ((Combo) panel.preferences[1]);
+		int itemIndex = combo.getSelectionIndex();
+		if (itemIndex != -1) {
+			itemValue = combo.getItem(combo.getSelectionIndex());
+			getStore().setProperty(XDocletPreferenceStore.XDOCLETVERSION, itemValue);
+		} else {
+			getStore().save();
+			return false;
+		}
+
+		getStore().setProperty(XDocletPreferenceStore.XDOCLETBUILDERACTIVE, ((Button) panel.preferences[0]).getSelection());
+		getStore().save();
+		try {
+			XDocletBuildUtility.runNecessaryBuilders(new NullProgressMonitor(), (IProject) getElement());
+		} catch (CoreException e) {
+			Logger.logException(e);
+		}
+		return super.performOk();
+	}
+
+	protected void performDefaults() {
+
+		getStore().clear();
+		((Button) panel.preferences[0]).setSelection(getStore().getBooleanPropertyNoGlobal(
+				XDocletPreferenceStore.XDOCLETBUILDERACTIVE));
+		((Combo) panel.preferences[1]).select(0);
+		((Text) panel.preferences[2]).setText(getStore().getPropertyNoGlobal(XDocletPreferenceStore.XDOCLETHOME));
+		if (isProjectPreferencePage())
+			((Button) panel.preferences[3]).setSelection(getStore().getBooleanPropertyNoGlobal(
+					XDocletPreferenceStore.XDOCLETUSEGLOBAL));
+		getStore().save();
+
+		try {
+			XDocletBuildUtility.runNecessaryBuilders(new NullProgressMonitor(), (IProject) getElement());
+		} catch (CoreException e) {
+			Logger.logException(e);
+		}
+		super.performDefaults();
+	}
+
+	protected void validateCurrentPreferences(final Text xDocletPath, final Combo xDocletVersion) {
+		int selection = xDocletVersion.getSelectionIndex();
+		if (selection < 0 || selection >= runtimes.length)
+			return;
+		runtimes[selection].setHome(xDocletPath.getText());
+		IStatus[] result = runtimes[selection].validate();
+		// Clear the message
+		XDocletPreferencePage.this.setErrorMessage(null);
+		if (result.length > 0) {
+			XDocletPreferencePage.this.setErrorMessage(result[0].getMessage());
+		} else {
+			setMessage("All libraries found", IMessageProvider.INFORMATION);
+		}
+	}
+
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/ui/XDocletWebPreferencePage.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/ui/XDocletWebPreferencePage.java
new file mode 100644
index 0000000..e24ad28
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/ui/XDocletWebPreferencePage.java
@@ -0,0 +1,119 @@
+/*******************************************************************************
+ * Copyright (c) 2002, 2003,2004 Eteration Bilisim A.S.
+ * Naci Dai and others.
+ * 
+ * Parts developed under contract ref:FT/R&D/MAPS/AMS/2004-09-09/AL are 
+ * Copyright France Telecom, 2004.
+ * 
+ * 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:
+ *     Eteration Bilisim A.S. - initial API and implementation
+ *     Naci Dai
+ * For more information on eteration, please see
+ * <http://www.eteration.com/>.
+ ***************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.ui;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.Logger;
+import org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.XDocletBuildUtility;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.IWorkbench;
+
+public class XDocletWebPreferencePage extends PropertyPreferencePage implements SelectionListener {
+
+	DialogPanel panel;
+	TaskProviderDecorator taskProviderDecorator;
+
+	public XDocletWebPreferencePage() {
+		super();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
+	 */
+	public void init(IWorkbench workbench) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+	 */
+	public void widgetSelected(SelectionEvent e) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
+	 */
+	public void widgetDefaultSelected(SelectionEvent e) {
+	}
+
+	protected Composite createContainer(Composite parent) {
+		panel = new DialogPanel(parent, SWT.NONE);
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 2;
+		layout.makeColumnsEqualWidth = false;
+		panel.setLayout(layout);
+		GridData gridData = new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL);
+		panel.setLayoutData(gridData);
+		return panel;
+	}
+
+	/*
+	 * @see PreferencePage#createContents(Composite)
+	 */
+	protected Control createContents(Composite parent) {
+		// noDefaultAndApplyButton();
+		Composite composite = createContainer(parent);
+		IExtension[] extensions = Platform.getExtensionRegistry().getExtensionPoint(
+				"org.eclipse.jst.j2ee.ejb.annotations.xdoclet.webdocletTaskProvider").getExtensions();
+
+		taskProviderDecorator = new TaskProviderDecorator(extensions, getStore());
+		taskProviderDecorator.decorate(composite);
+
+		return composite;
+	}
+
+	public void performDefaults() {
+		super.performDefaults();
+		getStore().clear();
+		getStore().save();
+		taskProviderDecorator.refresh();
+		try {
+			XDocletBuildUtility.runNecessaryBuilders(new NullProgressMonitor(), (IProject) getElement());
+		} catch (CoreException e) {
+			Logger.logException(e);
+		}		
+	}
+	
+	public boolean performOk() {
+
+		getStore().save();
+		try {
+			XDocletBuildUtility.runNecessaryBuilders(new NullProgressMonitor(), (IProject) getElement());
+		} catch (CoreException e) {
+			Logger.logException(e);
+		}
+		return super.performOk();
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/ui/preferences.properties b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/ui/preferences.properties
new file mode 100644
index 0000000..1310191
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/ui/preferences.properties
@@ -0,0 +1,21 @@
+label_set_xdoclet_runtime_preference=Set XDoclet runtime preferences.
+label_enable_xdoclet_builder=Enable XDoclet builder:
+desc_enable_xdoclet_builder=Enables XDoclet builder for automatic generation of java classes. 
+label_xdoclet_home=XDoclet home:
+desc_xdoclet_home=Select the root directory of the XDoclet isntallation:  
+label_browse=Browse...
+label_xdoclet_version=Version:
+desc_xdoclet_version=XDoclet version
+
+label_global_pref=Use global xdoclet preferences. 
+desc_global_pref=Use global xdoclet preferences instead of project scoped preferences. 
+
+label_attributes=Attributes 
+label_include=Include 
+label_tasks=Tasks 
+label_task=Task 
+label_edit=Edit...
+error_message_no_lib=Missing library: 
+error_xdoclet_home_message=Select the home directory for XDoclet. 
+
+xdoclet_runtime_invalid=The preferences for the xdoclet runtime does not point to a valid installation.
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/util/AntLauncherUtility.java b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/util/AntLauncherUtility.java
new file mode 100644
index 0000000..820fa1d
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/src/org/eclipse/jst/j2ee/ejb/annotations/internal/xdoclet/util/AntLauncherUtility.java
@@ -0,0 +1,255 @@
+/*******************************************************************************
+ * Copyright (c) 2002, 2003,2004 Eteration Bilisim A.S.
+ * Naci Dai and others.
+ * 
+ * Parts developed under contract ref:FT/R&D/MAPS/AMS/2004-09-09/AL are 
+ * Copyright France Telecom, 2004.
+ * 
+ * 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:
+ *     Eteration Bilisim A.S. - initial API and implementation
+ *     Naci Dai
+ * For more information on eteration, please see
+ * <http://www.eteration.com/>.
+ ***************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.util;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Properties;
+
+import org.eclipse.ant.core.AntRunner;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.debug.core.DebugPlugin;
+import org.eclipse.debug.core.ILaunchConfiguration;
+import org.eclipse.debug.core.ILaunchConfigurationType;
+import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
+import org.eclipse.debug.core.ILaunchManager;
+import org.eclipse.debug.ui.CommonTab;
+import org.eclipse.debug.ui.DebugUITools;
+import org.eclipse.debug.ui.IDebugUIConstants;
+import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
+import org.eclipse.jdt.launching.IVMInstall;
+import org.eclipse.jdt.launching.JavaRuntime;
+import org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.XDocletAnnotationPlugin;
+
+public class AntLauncherUtility {
+
+	private static final int MAX_TARGET_APPEND_LENGTH = 30;
+	public static final String ID_ANT_LAUNCH_CONFIGURATION_TYPE = "org.eclipse.ant.AntLaunchConfigurationType"; //$NON-NLS-1$
+	public static final String ATTR_LOCATION = "org.eclipse.ui.externaltools.ATTR_LOCATION"; //$NON-NLS-1$
+	// IExternalToolConstants.ATTR_LOCATION
+	public static final String ATTR_ANT_TARGETS = "org.eclipse.ui.externaltools.ATTR_ANT_TARGETS"; //$NON-NLS-1$
+	// IExternalToolConstants.ATTR_ANT_TARGETS
+	public static final String REMOTE_ANT_PROCESS_FACTORY_ID = "org.eclipse.ant.ui.remoteAntProcessFactory"; //$NON-NLS-1$
+
+	private URL url;
+
+	private Properties properties;
+
+	private Map templates;
+
+	private boolean useLauncher = false;
+
+	public AntLauncherUtility(URL templateUrl, IPath outputFolder, Properties properties, Map templates) {
+		this.url = templateUrl;
+		this.properties = properties;
+		this.templates = templates;
+	}
+
+	public String getBuildFile() throws Exception {
+		BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));
+		StringBuffer buildFile = new StringBuffer(512);
+		int c;
+		do {
+			c = reader.read();
+			if (c != -1)
+				buildFile.append((char) c);
+		} while (c != -1);
+		String build = buildFile.toString();
+		Iterator keys = templates.keySet().iterator();
+		while (keys.hasNext()) {
+			String key = (String) keys.next();
+			build = build.replaceAll(key, (String) templates.get(key));
+		}
+		return build;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wtp.server.core.model.IPublisher#publish(org.eclipse.wtp.server.core.resources.IModuleResource[],
+	 *      org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	public IStatus[] launch(String target, IProgressMonitor monitor) throws Exception {
+		String build = this.getBuildFile();
+
+		if (build == null || build.length() < 1)
+			return new IStatus[] { new Status(IStatus.ERROR, XDocletAnnotationPlugin.PLUGINID, 0, "AntBuildFileDoesNotExist", null) };
+
+		IPath file = XDocletAnnotationPlugin.getDefault().getStateLocation().append("tempAnt.xml");
+		try {
+			createNewFile(file.toFile(), build.getBytes());
+		} catch (IOException e) {
+		}
+
+		runAnt(file, new String[] { target }, this.properties, monitor);
+
+		// file.toFile().delete();
+		return new IStatus[] { new Status(IStatus.OK, XDocletAnnotationPlugin.PLUGINID, 0, "Finished", null) };
+	}
+
+	private void runAnt(IPath buildFile, String[] targets, Properties properties, final IProgressMonitor monitor) throws Exception {
+		IPath propfile = XDocletAnnotationPlugin.getDefault().getStateLocation().append("build.properties");
+		File buildProp = propfile.toFile();
+		if (buildProp.exists())
+			buildProp.delete();
+		FileOutputStream fileOutputStream = new FileOutputStream(propfile.toFile());
+		properties.store(fileOutputStream, "WTP BUILD FILE PROPERTIES- UPDATED:" + (new Date()));
+		fileOutputStream.close();
+
+		if (useLauncher)
+			runUsingLauncher(buildFile, targets, monitor);
+		else {
+			AntRunner antRunner = new AntRunner();
+
+			antRunner.setBuildFileLocation(buildFile.toString());
+			antRunner.setExecutionTargets(targets);
+			antRunner.run(monitor);
+		}
+
+	}
+
+	/**
+	 * @param buildFile
+	 * @param targets
+	 * @param monitor
+	 * @throws CoreException
+	 */
+	private void runUsingLauncher(IPath buildFile, String[] targets, final IProgressMonitor monitor) throws CoreException {
+		ILaunchConfiguration configuration = createDefaultLaunchConfiguration(buildFile, null, targets[0]);
+//		JavaLaunchDelegate javaLaunchDelegate = new JavaLaunchDelegate();
+//		javaLaunchDelegate.launch(configuration, "run", configuration., monitor);
+		DebugUITools.buildAndLaunch(configuration, "run", monitor);
+	}
+
+	public ILaunchConfiguration createDefaultLaunchConfiguration(IPath filePath, IProject project, String targetAttribute)
+			throws CoreException {
+		ILaunchManager manager = DebugPlugin.getDefault().getLaunchManager();
+		ILaunchConfigurationType type = manager.getLaunchConfigurationType(ID_ANT_LAUNCH_CONFIGURATION_TYPE);
+
+		String projectName = project != null ? project.getName() : null;
+		String name = getNewLaunchConfigurationName(filePath, projectName, targetAttribute);
+		ILaunchConfigurationWorkingCopy workingCopy = type.newInstance(null, name);
+		workingCopy.setAttribute(ATTR_LOCATION, filePath.toString());
+		workingCopy.setAttribute(IJavaLaunchConfigurationConstants.ATTR_CLASSPATH_PROVIDER, "org.eclipse.ant.ui.AntClasspathProvider"); //$NON-NLS-1$
+		workingCopy.setAttribute(ATTR_ANT_TARGETS, targetAttribute);
+
+		// set default for common settings
+		CommonTab tab = new CommonTab();
+		tab.setDefaults(workingCopy);
+		tab.dispose();
+		workingCopy.setAttribute(IDebugUIConstants.ATTR_CAPTURE_IN_CONSOLE, true);
+		workingCopy.setAttribute(IDebugUIConstants.ATTR_PRIVATE, true);
+
+		IVMInstall vmInstall = getDefaultVMInstall(workingCopy);
+		workingCopy.setAttribute(IJavaLaunchConfigurationConstants.ATTR_SOURCE_PATH_PROVIDER,
+				"org.eclipse.ant.ui.AntClasspathProvider");
+		workingCopy.setAttribute(IJavaLaunchConfigurationConstants.ATTR_VM_INSTALL_NAME, vmInstall.getName());
+		workingCopy.setAttribute(IJavaLaunchConfigurationConstants.ATTR_VM_INSTALL_TYPE, vmInstall.getVMInstallType().getId());
+		workingCopy.setAttribute(IJavaLaunchConfigurationConstants.ATTR_MAIN_TYPE_NAME,
+				"org.eclipse.ant.internal.ui.antsupport.InternalAntRunner");
+		workingCopy.setAttribute(DebugPlugin.ATTR_PROCESS_FACTORY_ID, REMOTE_ANT_PROCESS_FACTORY_ID);
+
+		workingCopy.setAttribute(IDebugUIConstants.ATTR_LAUNCH_IN_BACKGROUND, false);
+		return workingCopy;
+	}
+
+	private IVMInstall getDefaultVMInstall(ILaunchConfiguration config) {
+		IVMInstall defaultVMInstall;
+		try {
+			defaultVMInstall = JavaRuntime.computeVMInstall(config);
+		} catch (CoreException e) {
+			// core exception thrown for non-Java project
+			defaultVMInstall = JavaRuntime.getDefaultVMInstall();
+		}
+		return defaultVMInstall;
+	}
+
+	/**
+	 * Returns a unique name for a copy of the given launch configuration with
+	 * the given targets. The name seed is the same as the name for a new launch
+	 * configuration with " [targetList]" appended to the end.
+	 * 
+	 * @param config
+	 * @param targetAttribute
+	 * @return
+	 */
+	public String getNewLaunchConfigurationName(IPath filePath, String projectName, String targetAttribute) {
+		StringBuffer buffer = new StringBuffer();
+		if (projectName != null) {
+			buffer.append(projectName);
+			buffer.append(' ');
+			buffer.append(filePath.lastSegment());
+		} else {
+			buffer.append(filePath.toOSString());
+		}
+
+		if (targetAttribute != null) {
+			buffer.append(" ["); //$NON-NLS-1$
+			if (targetAttribute.length() > MAX_TARGET_APPEND_LENGTH + 3) {
+				// The target attribute can potentially be a long,
+				// comma-separated list
+				// of target. Make sure the generated name isn't extremely long.
+				buffer.append(targetAttribute.substring(0, MAX_TARGET_APPEND_LENGTH));
+				buffer.append("..."); //$NON-NLS-1$
+			} else {
+				buffer.append(targetAttribute);
+			}
+			buffer.append(']');
+		}
+
+		String name = DebugPlugin.getDefault().getLaunchManager().generateLaunchConfigurationName(buffer.toString());
+		return name;
+	}
+
+	public boolean createNewFile(File f, byte[] content) throws IOException {
+		if (f != null) {
+			if (f.exists()) {
+				f.delete();
+			}
+			FileOutputStream fos = null;
+			try {
+				fos = new FileOutputStream(f);
+				fos.write(content);
+			} finally {
+				if (fos != null) {
+					fos.close();
+				}
+			}
+			return true;
+		}
+		return false;
+	}
+
+	public void setUseLauncher(boolean useLauncher) {
+		this.useLauncher = useLauncher;
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/templates/builder/xdoclet.xml b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/templates/builder/xdoclet.xml
new file mode 100644
index 0000000..6578d16
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/templates/builder/xdoclet.xml
@@ -0,0 +1,99 @@
+<?xml version="1.0"?>
+
+<!-- 
+  Copyright (c) 2002, 2003,2004 Eteration Bilisim A.S.
+  Naci Dai 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:
+      Eteration Bilisim A.S. - initial API and implementation
+      Naci Dai
+  For more information on eteration, please see
+  <http://www.eteration.com/>.
+ -->
+
+
+
+<project name="xdocletBuild" default="ejbdoclet" basedir=".">
+
+   <!-- Init -->
+   <target name="init">
+      <property file="build.properties"/>
+
+      <!-- property name="ejb.dd.dir" value="${ejb.project.dir}/${ejb.module.src}/META-INF"/ -->
+      <property name="ejb.dd.dir" value="${ejb.metainf.dir}" />
+   	  <property name="xdoclet.force" value="true"/>
+      <property name="container.type" value="ejb-jar"/>
+      
+   	  <!-- Set up java.class.path -->
+      <path id="project.class.path">
+        <pathelement location="${ejb.project.dir}/${ejb.bin.dir}" />
+        <pathelement path="${ejb.project.classpath}" />
+
+
+     	<fileset dir="${ant.home}">
+        	<include name="*/**/ant.jar"/>
+      	</fileset>
+        <fileset dir="${xdoclet.home}">
+            	<include name="**/*.jar"/>
+        </fileset>
+
+        <!-- append the external classpath lastly -->
+        <pathelement path="${java.class.path}" />
+                
+     </path>
+
+
+   </target>
+
+   <!-- Run EJBDoclet -->
+   <target name="ejbdoclet" depends="init">
+
+    <taskdef name="ejbdoclet" classname="xdoclet.modules.ejb.EjbDocletTask">
+		<classpath refid="project.class.path"/>
+	</taskdef>
+
+
+      <ejbdoclet
+            destdir="${ejb.module.gen}"
+            mergedir="${xdoclet.merge.dir}"
+            excludedtags="@version,@author,@todo"
+            addedtags="@wtp generated"
+            ejbspec="${ejb.spec.version}"
+            force="${xdoclet.force}"
+            verbose="true" >
+
+
+<!-- BEANS START -->
+ 	   <fileset dir="${ejb.module.src}" defaultexcludes="yes"> 
+   	    @beans@
+ 	   </fileset>
+<!-- BEANS END -->
+ 
+      	@docletTasks@
+              
+         
+      </ejbdoclet>
+   	  <antcall target="client.jar" />
+   	
+    </target>
+	
+	<target name="client.jar" if="ejb.client.module.src">
+	  	  <move todir="${ejb.client.module.src}" >
+			<fileset dir="${ejb.module.src}" id="id">
+			    <include name="**/*.java"/>
+			    <exclude name="**/*Bean.java"/>
+			    <exclude name="**/*EJB.java"/>
+			    <exclude name="**/*Session.java"/>
+			    <exclude name="**/*Mdb.java"/>
+				<exclude name="**/*CMP.java"/>
+			</fileset>
+	   	  </move>		
+	</target>
+
+</project>
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/templates/builder/xdocletweb.xml b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/templates/builder/xdocletweb.xml
new file mode 100644
index 0000000..a2b6e82
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/templates/builder/xdocletweb.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0"?>
+
+<!-- 
+  Copyright (c) 2002, 2003,2004 Eteration Bilisim A.S.
+  Naci Dai 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:
+      Eteration Bilisim A.S. - initial API and implementation
+      Naci Dai
+  For more information on eteration, please see
+  <http://www.eteration.com/>.
+ -->
+
+
+
+<project name="xdocletBuild" default="webdoclet" basedir=".">
+
+   <!-- Init -->
+   <target name="init">
+      <property file="build.properties"/>
+
+      <property name="web.dd.dir" value="${web.module.webinf}"/>
+      <property name="xdoclet.force" value="true"/>
+      <property name="container.type" value="web-war"/>
+      
+   	  <!-- Set up java.class.path -->
+      <path id="project.class.path">
+        <pathelement location="${web.project.dir}/${web.bin.dir}" />
+        <pathelement path="${web.project.classpath}" />
+
+
+     	<fileset dir="${ant.home}">
+        	<include name="*/**/ant.jar"/>
+      	</fileset>
+        <fileset dir="${xdoclet.home}">
+            	<include name="**/*.jar"/>
+        </fileset>
+
+        <!-- append the external classpath lastly -->
+        <pathelement path="${java.class.path}" />
+                
+     </path>
+
+
+   </target>
+
+   <!-- Run EJBDoclet -->
+   <target name="webdoclet" depends="init">
+
+    <taskdef name="webdoclet" classname="xdoclet.modules.web.WebDocletTask">
+		<classpath refid="project.class.path"/>
+	</taskdef>
+
+    <webdoclet 
+    		destdir="${web.module.webinf}"
+    		mergedir="${xdoclet.merge.dir}"
+    	    excludedtags="@version,@author,@todo"
+    	    addedtags="@wtp generated"
+    	    force="${xdoclet.force}"
+    	    verbose="true" >
+    	
+    	<!-- SERVLETS START -->
+    	 	   <fileset dir="${web.module.src}" defaultexcludes="yes"> 
+    	   	    @servlets@
+    	 	   </fileset>
+    	<!-- SERVLETS END -->
+     	
+
+
+    	  @webDoclet@
+            
+
+    	
+   	</webdoclet>
+ 
+   </target>
+
+</project>
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/templates/ejb/entity/fields.javajet b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/templates/ejb/entity/fields.javajet
new file mode 100644
index 0000000..83aab64
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/templates/ejb/entity/fields.javajet
@@ -0,0 +1,13 @@
+<%@ jet package="org.eclipse.jst.j2ee.ejb.gmf.templates.entity" class="FieldsGenerator" imports="java.util.* org.eclipse.jst.j2ee.ejb.annotation.internal.model.*"%>
+<%  IContainerManagedEntityBean cmp  = (IContainerManagedEntityBean)argument;
+    boolean isCMP = true;
+   
+   String primaryKeyType = cmp.getPrimaryKeyClass();
+   List attributes = cmp.getAttributes();
+   List keyAttributes = cmp.getKeyAttributes();
+   int pkCount=keyAttributes.size();
+   boolean isComposite = keyAttributes.size() > 1;
+   boolean createCompositeKey = false;
+   String primaryKeyField = ( (CMPAttributeDelegate)keyAttributes.get(0)).getName();
+ 
+%>
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/templates/ejb/entity/methodStubs.javajet b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/templates/ejb/entity/methodStubs.javajet
new file mode 100644
index 0000000..edaf19b
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/templates/ejb/entity/methodStubs.javajet
@@ -0,0 +1,109 @@
+<%@ jet package="org.eclipse.jst.j2ee.ejb.gmf.templates.entity" class="MethodStubsGenerator" imports="java.util.* org.eclipse.jst.j2ee.ejb.annotation.internal.model.* org.eclipse.jst.j2ee.ejb.*"%>
+<%  IContainerManagedEntityBean cmp  = (IContainerManagedEntityBean)argument;
+    boolean isCMP = true;
+   
+   String primaryKeyType = cmp.getPrimaryKeyClass();
+   List attributes = cmp.getAttributes();
+   List keyAttributes = cmp.getKeyAttributes();
+   int pkCount=keyAttributes.size();
+   boolean isComposite = keyAttributes.size() > 1;
+   boolean createCompositeKey = false;
+   String primaryKeyField = ( (CMPAttributeDelegate)keyAttributes.get(0)).getName();
+   ContainerManagedEntity entity = (ContainerManagedEntity) cmp.getEnterpriseBean();
+    
+%>
+
+
+
+/**
+ *
+ * <!-- begin-user-doc -->
+ * The  ejbCreate method.
+ * <!-- end-user-doc -->
+ *
+ * <!-- begin-xdoclet-definition --> 
+ * @ejb.create-method 
+ * <!-- end-xdoclet-definition --> 
+ * @generated
+ */
+public <%= primaryKeyType %> ejbCreate() throws javax.ejb.CreateException {
+	// EJB 2.0 spec says return null for CMP ejbCreate methods.
+	// TODO: YOU MUST INITIALIZE THE FIELDS FOR THE BEAN HERE. 
+	// setMyField("Something"); 
+	// begin-user-code
+	return null;
+	// end-user-code
+}
+
+/**
+ * <!-- begin-user-doc -->
+ * The container invokes this method immediately after it calls ejbCreate.
+ * <!-- end-user-doc -->
+ * 
+ * @generated
+ */
+public void ejbPostCreate() throws javax.ejb.CreateException {
+	// begin-user-code
+	// end-user-code
+}
+	
+<% 
+   Iterator attrs = attributes.iterator();
+   while(attrs.hasNext()){
+      CMPAttributeDelegate mapping = (CMPAttributeDelegate) attrs.next();
+
+%>
+
+/**
+*
+*
+* <!-- begin-user-doc -->
+* CMP Field <%= mapping.getName() %>
+*
+* Returns the <%= mapping.getName() %>
+* @return the <%= mapping.getName() %>
+* 
+* <!-- end-user-doc -->
+*
+* <!-- begin-xdoclet-definition --> 
+*
+* @ejb.persistent-field 
+* @ejb.persistence
+*    column-name="<%= mapping.getColumnName() %>"
+*     jdbc-type="<%= mapping.getJdbcType() %>"
+*     sql-type="<%= mapping.getSqlTypeDecl() %>"
+*     read-only="<%= mapping.isReadOnly() %>"
+* <%= (mapping.isKey() ? "@ejb.pk-field" : "" ) %> 
+*
+* @ejb.interface-method
+* 
+* <!-- end-xdoclet-definition --> 
+* @generated
+*/
+<%
+			String methodName = mapping.getName();
+			methodName = Character.toUpperCase(methodName.charAt(0)) + methodName.substring(1,methodName.length());
+
+%>
+public abstract <%= mapping.getAttributeType() %> get<%= methodName %>();
+
+
+/**
+* <!-- begin-user-doc -->
+* Sets the <%= mapping.getName() %>
+* 
+* @param <%=mapping.getAttributeType()%> the new <%= mapping.getName() %> value
+* <!-- end-user-doc -->
+* 
+* <!-- begin-xdoclet-definition --> 
+* @ejb.interface-method
+* <!-- end-xdoclet-definition -->
+* @generated 
+*/
+public abstract void set<%= methodName %>(<%= mapping.getAttributeType() %> <%= mapping.getName() %>);
+
+
+
+<% 
+}
+%>
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/templates/ejb/entity/typeComment.javajet b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/templates/ejb/entity/typeComment.javajet
new file mode 100644
index 0000000..fcd7a0f
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/templates/ejb/entity/typeComment.javajet
@@ -0,0 +1,39 @@
+<%@ jet package="org.eclipse.jst.j2ee.ejb.gmf.templates.entity" class="TypeCommentGenerator" imports="java.util.* org.eclipse.jst.j2ee.ejb.annotation.internal.model.*  org.eclipse.jst.j2ee.ejb.* org.eclipse.jst.j2ee.ejb.annotations.internal.* org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.*"%>
+<%  IContainerManagedEntityBean cmp  = (IContainerManagedEntityBean)argument;
+    boolean isCMP = true;
+   
+   String primaryKeyType = cmp.getPrimaryKeyClass();
+   List keyAttributes = cmp.getKeyAttributes();
+   int pkCount=keyAttributes.size();
+   boolean isComposite = keyAttributes.size() > 1;
+   boolean createCompositeKey = false;
+   String primaryKeyField = ( (CMPAttributeDelegate)keyAttributes.get(0)).getName();
+   ContainerManagedEntity entity = (ContainerManagedEntity) cmp.getEnterpriseBean();
+ 
+%>
+
+
+ 
+/**
+ * <!-- begin-xdoclet-definition -->
+ * @ejb.bean name="<%=cmp.getEjbName()%>" 
+ *	jndi-name="<%=cmp.getEjbName()%>"
+ *	type="CMP" 
+ *  primkey-field="<%= primaryKeyField %>" 
+ *  schema="<%= cmp.getSchema() %>" 
+ *  cmp-version="<%= cmp.getVersion() %>"
+ *
+ *  @ejb.persistence 
+ *   table-name="<%=cmp.getTable()%>" 
+ * 
+ * @ejb.finder 
+ *    query="SELECT OBJECT(a) FROM <%= cmp.getSchema() %> as a"  
+ *    signature="java.util.Collection findAll()"  
+ *
+ * @ejb.pk class="<%= primaryKeyType %>"
+ *
+ *
+ * <!-- end-xdoclet-definition -->
+ * @generated
+ **/
+
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/templates/ejb/entity/typeStub.javajet b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/templates/ejb/entity/typeStub.javajet
new file mode 100644
index 0000000..ac185c9
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/templates/ejb/entity/typeStub.javajet
@@ -0,0 +1,49 @@
+<%@ jet package="org.eclipse.jst.j2ee.ejb.gmf.templates.entity" class="TypeStubGenerator" imports="java.util.* org.eclipse.jst.j2ee.ejb.annotation.internal.model.*   org.eclipse.jst.j2ee.internal.common.operations.*"%>
+<%  IContainerManagedEntityBean cmp  = (IContainerManagedEntityBean)argument;
+    boolean isCMP = true;
+   
+   String primaryKeyType = cmp.getPrimaryKeyClass();
+   List keyAttributes = cmp.getKeyAttributes();
+   int pkCount=keyAttributes.size();
+   boolean isComposite = keyAttributes.size() > 1;
+   
+    String superclass = ""+cmp.getDataModel().getProperty(INewJavaClassDataModelProperties.SUPERCLASS);
+      if(superclass == null || superclass.length() == 0 )
+        superclass = "java.lang.Object";
+      Boolean modifier =  ((Boolean)(cmp.getDataModel().getProperty(INewJavaClassDataModelProperties.MODIFIER_PUBLIC)));
+      boolean isPublic  = ( modifier != null && modifier.booleanValue());
+      modifier =  ((Boolean)(cmp.getDataModel().getProperty(INewJavaClassDataModelProperties.MODIFIER_ABSTRACT)));
+      boolean isAbstract = ( modifier != null && modifier.booleanValue());
+      modifier =  ((Boolean)(cmp.getDataModel().getProperty(INewJavaClassDataModelProperties.MODIFIER_FINAL)));
+      boolean isFinal = ( modifier != null && modifier.booleanValue());
+
+      String publicStr = (isPublic ? "public": "");
+      String abstractStr = (isAbstract ? "abstract": "");
+      String finalStr = (isFinal ? "final": "");
+      String extendsStr = (superclass.equals("java.lang.Object") ? "": "extends " + superclass);   
+  
+%>
+
+<%= publicStr %> <%= finalStr %> <%= abstractStr %> class <%= cmp.getSimpleClassName()%> <%= extendsStr %> implements <%= cmp.getInterfaces() %>
+{
+    
+<% 	   if(isComposite ){ %>
+    /**
+     * Generated Primary Key Class
+     * @generated
+     */
+    public class PrimaryKey {
+<%
+	  Iterator keys = keyAttributes.iterator();
+      while(keys.hasNext()){
+	      CMPAttributeDelegate key = (CMPAttributeDelegate) keys.next();
+%>
+		  /**
+		  * @generated
+		  */	       
+	      public <%= key.getAttributeType() %> <%= key.getName() %> ;
+<%    } %>
+	}
+<%	}%>
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/templates/ejb/message/fields.javajet b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/templates/ejb/message/fields.javajet
new file mode 100644
index 0000000..2ccec2e
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/templates/ejb/message/fields.javajet
@@ -0,0 +1,17 @@
+<%@ jet package="org.eclipse.gmf.templates.messageDriven" class="FieldGenerator" %>
+
+/** 
+ * <!-- begin-xdoclet-definition --> 
+ * <!-- end-xdoclet-definition --> 
+ * @generated
+ */
+private static final long serialVersionUID = 1L;
+
+/** 
+* <!-- begin-user-doc -->
+* <!-- end-user-doc -->
+* The context for the message-driven bean, set by the EJB container. 
+* @generated
+*/
+private javax.ejb.MessageDrivenContext messageContext = null;
+
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/templates/ejb/message/methodStubs.javajet b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/templates/ejb/message/methodStubs.javajet
new file mode 100644
index 0000000..b4d8911
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/templates/ejb/message/methodStubs.javajet
@@ -0,0 +1,62 @@
+<%@ jet package="org.eclipse.jst.j2ee.ejb.gmf.templates.messageDriven" class="MethodGenerator" %>
+
+/** 
+ * Required method for container to set context.
+ * @generated 
+ */
+public void setMessageDrivenContext(javax.ejb.MessageDrivenContext messageContext) 
+   throws javax.ejb.EJBException { 
+        this.messageContext = messageContext;
+}
+
+
+/** 
+ * Required creation method for message-driven beans. 
+ *
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * <!-- begin-xdoclet-definition -->
+ * @ejb.create-method 
+ * <!-- end-xdoclet-definition -->
+ * @generated
+ */ 
+public void ejbCreate() { 
+	//no specific action required for message-driven beans 
+}
+
+
+/** 
+ * Required removal method for message-driven beans. 
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */ 
+public void ejbRemove() { 
+	messageContext = null; 
+}
+ 
+
+/** 
+ * This method implements the business logic for the EJB. 
+ * 
+ * <p>Make sure that the business logic accounts for asynchronous message processing. 
+ * For example, it cannot be assumed that the EJB receives messages in the order they were 
+ * sent by the client. Instance pooling within the container means that messages are not 
+ * received or processed in a sequential order, although individual onMessage() calls to 
+ * a given message-driven bean instance are serialized. 
+ * 
+ * <p>The <code>onMessage()</code> method is required, and must take a single parameter 
+ * of type javax.jms.Message. The throws clause (if used) must not include an application 
+ * exception. Must not be declared as final or static. 
+ *
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */ 
+public void onMessage(javax.jms.Message message) { 
+    // begin-user-code
+    System.out.println("Message Driven Bean got message " + message); 
+    // TODO:  do business logic here 
+    // end-user-code
+} 
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/templates/ejb/message/typeComment.javajet b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/templates/ejb/message/typeComment.javajet
new file mode 100644
index 0000000..255c9c7
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/templates/ejb/message/typeComment.javajet
@@ -0,0 +1,20 @@
+<%@ jet package="org.eclipse.gmf.templates.messageDriven" class="TypeCommentGenerator" imports="org.eclipse.jst.j2ee.ejb.annotation.internal.model.*"%>
+<% IMessageDrivenBean mdb  = (IMessageDrivenBean)argument; %>
+
+
+ 
+/**
+ * <!-- begin-xdoclet-definition -->
+ * @ejb.bean name="<%=mdb.getEjbName()%>" 
+ *     acknowledge-mode="Auto-acknowledge"
+ *     destination-type="javax.jms.<%= mdb.getDestinationType() %>"
+ *     <%= "Queue".equals(mdb.getDestinationType()) ? "" : "subscription-durability=\"NonDurable\""%>
+ *     transaction-type="<%= mdb.getTransactionType() %>"
+ *     destination-jndi-name="<%= mdb.getDestinationJndiName() %>"
+ *
+ *  @ejb.transaction="Supports"
+ *
+ * <!-- end-xdoclet-definition -->
+ * @generated
+ **/
+ 
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/templates/ejb/message/typeStub.javajet b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/templates/ejb/message/typeStub.javajet
new file mode 100644
index 0000000..30baf7e
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/templates/ejb/message/typeStub.javajet
@@ -0,0 +1,25 @@
+<%@ jet package="org.eclipse.gmf.templates.messageDriven" class="TypeStubGenerator" imports="org.eclipse.jst.j2ee.ejb.annotation.internal.model.*  org.eclipse.jst.j2ee.internal.common.operations.*"%>
+<% IMessageDrivenBean mdb  = (IMessageDrivenBean)argument; 
+
+     String superclass = ""+mdb.getDataModel().getProperty(INewJavaClassDataModelProperties.SUPERCLASS);
+      if(superclass == null || superclass.length() == 0 )
+        superclass = "java.lang.Object";
+      Boolean modifier =  ((Boolean)(mdb.getDataModel().getProperty(INewJavaClassDataModelProperties.MODIFIER_PUBLIC)));
+      boolean isPublic  = ( modifier != null && modifier.booleanValue());
+      modifier =  ((Boolean)(mdb.getDataModel().getProperty(INewJavaClassDataModelProperties.MODIFIER_ABSTRACT)));
+      boolean isAbstract = ( modifier != null && modifier.booleanValue());
+      modifier =  ((Boolean)(mdb.getDataModel().getProperty(INewJavaClassDataModelProperties.MODIFIER_FINAL)));
+      boolean isFinal = ( modifier != null && modifier.booleanValue());
+
+      String publicStr = (isPublic ? "public": "");
+      String abstractStr = (isAbstract ? "abstract": "");
+      String finalStr = (isFinal ? "final": "");
+      String extendsStr = (superclass.equals("java.lang.Object") ? "": "extends " + superclass);
+ 
+
+%>
+ 
+ 
+<%= publicStr %> <%= finalStr %> <%= abstractStr %> class <%= mdb.getSimpleClassName()%> <%= extendsStr %> implements <%= mdb.getInterfaces() %>
+{
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/templates/ejb/session/fields.javajet b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/templates/ejb/session/fields.javajet
new file mode 100644
index 0000000..c04a0aa
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/templates/ejb/session/fields.javajet
@@ -0,0 +1,8 @@
+<%@ jet package="org.eclipse.jst.j2ee.ejb.gmf.templates.session" class="FieldGenerator" %>
+
+/** 
+ * <!-- begin-xdoclet-definition --> 
+ * <!-- end-xdoclet-definition --> 
+ * @generated
+ */
+private static final long serialVersionUID = 1L;
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/templates/ejb/session/methodStubs.javajet b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/templates/ejb/session/methodStubs.javajet
new file mode 100644
index 0000000..3b40bea
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/templates/ejb/session/methodStubs.javajet
@@ -0,0 +1,28 @@
+<%@ jet package="org.eclipse.jst.j2ee.ejb.gmf.templates.session" class="MethodGenerator" %>
+
+/** 
+ *
+ * <!-- begin-xdoclet-definition --> 
+ * @ejb.create-method view-type="remote"
+ * <!-- end-xdoclet-definition --> 
+ * @generated
+ *
+ * //TODO: Must provide implementation for bean create stub
+ */
+public void ejbCreate()
+{
+}
+
+/** 
+ *
+ * <!-- begin-xdoclet-definition --> 
+ * @ejb.interface-method view-type="remote"
+ * <!-- end-xdoclet-definition --> 
+ * @generated
+ *
+ * //TODO: Must provide implementation for bean method stub
+ */
+public String foo(String param)
+{
+ 	return null;
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/templates/ejb/session/typeComment.javajet b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/templates/ejb/session/typeComment.javajet
new file mode 100644
index 0000000..3c4f340
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/templates/ejb/session/typeComment.javajet
@@ -0,0 +1,19 @@
+<%@ jet package="org.eclipse.jst.j2ee.ejb.gmf.templates.session" class="TypeCommentGenerator" imports="org.eclipse.jst.j2ee.ejb.annotation.internal.model.*"%>
+<%  ISessionBean session  = (ISessionBean)argument; %>
+/**
+ *
+ * <!-- begin-user-doc -->
+ * A generated session bean
+ * <!-- end-user-doc -->
+ * *
+ * <!-- begin-xdoclet-definition --> 
+ * @ejb.bean name="<%=session.getEjbName() %>"	
+ *           description="<%=session.getDescription()%>"
+ *           display-name="<%=session.getDisplayName()%>"
+ *           jndi-name="<%=session.getJndiName()%>"
+ *           type="<%=session.getSessionType() %>" 
+ *           transaction-type="<%= session.getTransactionType()%>"
+ * 
+ * <!-- end-xdoclet-definition --> 
+ * @generated
+ */
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/templates/ejb/session/typeStub.javajet b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/templates/ejb/session/typeStub.javajet
new file mode 100644
index 0000000..c268d6e
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/templates/ejb/session/typeStub.javajet
@@ -0,0 +1,25 @@
+<%@ jet package="org.eclipse.jst.j2ee.ejb.gmf.templates.session" class="TypeStubGenerator" imports="org.eclipse.jst.j2ee.ejb.annotation.internal.model.* org.eclipse.jst.j2ee.internal.common.operations.*"%>
+<%  ISessionBean session  = (ISessionBean)argument; 
+
+      String superclass = ""+session.getDataModel().getProperty(INewJavaClassDataModelProperties.SUPERCLASS);
+      if(superclass == null || superclass.length() == 0 )
+        superclass = "java.lang.Object";
+      Boolean modifier =  ((Boolean)(session.getDataModel().getProperty(INewJavaClassDataModelProperties.MODIFIER_PUBLIC)));
+      boolean isPublic  = ( modifier != null && modifier.booleanValue());
+      modifier =  ((Boolean)(session.getDataModel().getProperty(INewJavaClassDataModelProperties.MODIFIER_ABSTRACT)));
+      boolean isAbstract = ( modifier != null && modifier.booleanValue());
+      modifier =  ((Boolean)(session.getDataModel().getProperty(INewJavaClassDataModelProperties.MODIFIER_FINAL)));
+      boolean isFinal = ( modifier != null && modifier.booleanValue());
+
+      String publicStr = (isPublic ? "public": "");
+      String abstractStr = (isAbstract ? "abstract": "");
+      String finalStr = (isFinal ? "final": "");
+      String extendsStr = (superclass.equals("java.lang.Object") ? "": "extends " + superclass);
+ 
+
+%>
+ 
+ 
+<%= publicStr %> <%= finalStr %> <%= abstractStr %> class <%= session.getSimpleClassName()%> <%= extendsStr %> implements <%= session.getInterfaces() %>
+{
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/templates/test.javajet b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/templates/test.javajet
new file mode 100644
index 0000000..1ee5a7c
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/templates/test.javajet
@@ -0,0 +1,21 @@
+<%@ jet package="translated" class="HelloWorld" imports="java.util.* com.objectlearn.lomboz.xml.lomboz.DocumentRoot com.sun.java.xml.ns.j2ee.SessionBeanType"%>
+
+
+<% DocumentRoot root = (DocumentRoot)argument;
+
+Iterator sessionBeans = root.getEjb().getSession().iterator();
+while (sessionBeans.hasNext()) {
+	SessionBeanType sb = (SessionBeanType) sessionBeans.next();
+%>
+/**
+ * @author Lomboz Auto-generated
+ *
+<%= " * @lomboz.sessionbean.name " +sb.getEjbName().getValue() %>
+<%= " * @lomboz.sessionbean.class " +sb.getEjbClass() %>
+<%= " * @lomboz.sessionbean.displayname " +sb.getDisplayName() %>
+
+<%
+}
+%>
+
+*/
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/.classpath b/plugins/org.eclipse.jst.j2ee.ejb/.classpath
new file mode 100644
index 0000000..4837779
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/.classpath
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="ejb/"/>
+	<classpathentry kind="src" path="ejbedit/"/>
+	<classpathentry kind="src" path="ejbcreation/"/>
+	<classpathentry kind="src" path="ejbarchive/"/>
+	<classpathentry kind="src" path="ejbvalidator/"/>
+	<classpathentry kind="src" path="property_files"/>
+	<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="output" path="bin"/>
+</classpath>
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/.cvsignore b/plugins/org.eclipse.jst.j2ee.ejb/.cvsignore
new file mode 100644
index 0000000..590084f
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/.cvsignore
@@ -0,0 +1,7 @@
+bin
+runtime
+temp.folder
+build.xml
+@dot
+src.zip
+javaCompiler...args
diff --git "a/plugins/org.eclipse.jst.j2ee.ejb/.externalToolBuilders/org.eclipse.emf.codegen.JETBuilder \0501\051.launch" "b/plugins/org.eclipse.jst.j2ee.ejb/.externalToolBuilders/org.eclipse.emf.codegen.JETBuilder \0501\051.launch"
new file mode 100644
index 0000000..ca1988c
--- /dev/null
+++ "b/plugins/org.eclipse.jst.j2ee.ejb/.externalToolBuilders/org.eclipse.emf.codegen.JETBuilder \0501\051.launch"
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?><launchConfiguration type="org.eclipse.ant.AntBuilderLaunchConfigurationType">
+<booleanAttribute key="org.eclipse.ui.externaltools.ATTR_BUILDER_ENABLED" value="false"/>
+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_DISABLED_BUILDER" value="org.eclipse.emf.codegen.JETBuilder"/>
+<mapAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS"/>
+<booleanAttribute key="org.eclipse.ui.externaltools.ATTR_TRIGGERS_CONFIGURED" value="true"/>
+</launchConfiguration>
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/.jetproperties b/plugins/org.eclipse.jst.j2ee.ejb/.jetproperties
new file mode 100644
index 0000000..15f2838
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/.jetproperties
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<jet-settings>
+	<template-container>templates</template-container>	<source-container>ejb</source-container>
+</jet-settings>
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/.project b/plugins/org.eclipse.jst.j2ee.ejb/.project
new file mode 100644
index 0000000..01eafee
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/.project
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.jst.j2ee.ejb</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.ui.externaltools.ExternalToolBuilder</name>
+			<triggers>full,incremental,</triggers>
+			<arguments>
+				<dictionary>
+					<key>LaunchConfigHandle</key>
+					<value>&lt;project&gt;/.externalToolBuilders/org.eclipse.emf.codegen.JETBuilder (1).launch</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+		<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.emf.codegen.jet.IJETNature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/.settings/org.eclipse.jdt.core.prefs b/plugins/org.eclipse.jst.j2ee.ejb/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..9205d11
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,95 @@
+#Wed Jun 10 15:59:22 EDT 2009
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=error
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=error
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=error
+org.eclipse.jdt.core.compiler.problem.unusedLocal=error
+org.eclipse.jdt.core.compiler.problem.emptyStatement=error
+org.eclipse.jdt.core.compiler.problem.unusedLabel=error
+org.eclipse.jdt.core.compiler.problem.unusedParameter=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=error
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
+org.eclipse.jdt.core.builder.cleanOutputFolder=clean
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=error
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=enabled
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=error
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=error
+org.eclipse.jdt.core.compiler.problem.unusedImport=error
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=error
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=error
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=error
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=error
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=error
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=error
+eclipse.preferences.version=1
+org.eclipse.jdt.core.incompleteClasspath=error
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=error
+org.eclipse.jdt.core.compiler.problem.deadCode=error
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=enabled
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeUncheckedExceptions=disabled
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=error
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=warning
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=error
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=error
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/META-INF/MANIFEST.MF b/plugins/org.eclipse.jst.j2ee.ejb/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..4d39e4d
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/META-INF/MANIFEST.MF
@@ -0,0 +1,48 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name.0
+Bundle-SymbolicName: org.eclipse.jst.j2ee.ejb; singleton:=true
+Bundle-Version: 1.1.900.qualifier
+Bundle-Activator: org.eclipse.jst.j2ee.ejb.internal.plugin.EjbPlugin
+Bundle-Vendor: %Bundle-Vendor.0
+Bundle-Localization: plugin
+Export-Package: org.eclipse.jst.j2ee.ejb.archiveoperations,
+ org.eclipse.jst.j2ee.ejb.componentcore.util,
+ org.eclipse.jst.j2ee.ejb.datamodel.properties,
+ org.eclipse.jst.j2ee.ejb.internal.deployables;x-internal:=true,
+ org.eclipse.jst.j2ee.ejb.internal.modulecore.util;x-internal:=true,
+ org.eclipse.jst.j2ee.ejb.internal.operations,
+ org.eclipse.jst.j2ee.ejb.internal.plugin;x-internal:=true,
+ org.eclipse.jst.j2ee.ejb.project.facet,
+ org.eclipse.jst.j2ee.ejb.project.operations,
+ org.eclipse.jst.j2ee.internal.ejb.archiveoperations;x-internal:=true,
+ org.eclipse.jst.j2ee.internal.ejb.project;x-internal:=true,
+ org.eclipse.jst.j2ee.internal.ejb.project.operations;x-internal:=true,
+ org.eclipse.jst.j2ee.internal.ejb.provider;x-internal:=true,
+ org.eclipse.jst.j2ee.internal.ejb.refactor;x-internal:=true,
+ org.eclipse.jst.j2ee.internal.ejb.workbench.validation;x-internal:=true
+Require-Bundle: org.eclipse.jst.j2ee;bundle-version="[1.1.501,1.3.0)",
+ org.eclipse.core.commands;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.wst.common.frameworks;bundle-version="[1.1.0,2.0.0)",
+ org.eclipse.emf.ecore.xmi;bundle-version="[2.2.0,3.0.0)",
+ org.eclipse.jem.workbench;bundle-version="[2.0.0,3.0.0)",
+ org.eclipse.wst.common.emfworkbench.integration;bundle-version="[1.1.0,2.0.0)",
+ org.eclipse.core.resources;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.jst.j2ee.core;bundle-version="[1.1.0,2.0.0)",
+ org.eclipse.wst.validation;bundle-version="[1.1.0,2.0.0)",
+ org.eclipse.wst.common.emf;bundle-version="[1.1.0,2.0.0)",
+ org.eclipse.jem;bundle-version="[2.0.0,3.0.0)",
+ org.eclipse.emf.ecore.edit;bundle-version="[2.2.0,3.0.0)",
+ org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.jdt.core;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.wst.server.core;bundle-version="[1.0.102,2.0.0)",
+ org.eclipse.jst.server.core;bundle-version="[1.0.102,2.0.0)",
+ org.eclipse.jst.common.frameworks;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.jem.util;bundle-version="[2.0.0,3.0.0)",
+ org.eclipse.wst.common.project.facet.core;bundle-version="[1.1.0,2.0.0)",
+ org.eclipse.jst.common.project.facet.core;bundle-version="[1.1.0,2.0.0)",
+ org.eclipse.wst.web;bundle-version="[1.1.600,1.2.0)",
+ org.eclipse.emf.codegen;bundle-version="[2.4.0,3.0.0)",
+ org.eclipse.jst.jee;bundle-version="[1.0.0,1.1.0)"
+Eclipse-LazyStart: true
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/plugins/org.eclipse.wst.web/about.html b/plugins/org.eclipse.jst.j2ee.ejb/about.html
similarity index 100%
rename from plugins/org.eclipse.wst.web/about.html
rename to plugins/org.eclipse.jst.j2ee.ejb/about.html
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/build.properties b/plugins/org.eclipse.jst.j2ee.ejb/build.properties
new file mode 100644
index 0000000..b1bfefb
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/build.properties
@@ -0,0 +1,26 @@
+###############################################################################
+# Copyright (c) 2003, 2006 IBM 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:
+# IBM Corporation - initial API and implementation
+###############################################################################
+bin.includes = plugin.xml,\
+               plugin.properties,\
+               icons/,\
+               .,\
+               META-INF/,\
+               about.html,\
+               templates/
+jars.compile.order = .
+source.. = ejb/,\
+           ejbedit/,\
+           ejbcreation/,\
+           ejbarchive/,\
+           ejbvalidator/,\
+           property_files/
+output.. = bin/
+src.includes = component.xml
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/build/buildcontrol.properties b/plugins/org.eclipse.jst.j2ee.ejb/build/buildcontrol.properties
new file mode 100644
index 0000000..3270ed0
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/build/buildcontrol.properties
@@ -0,0 +1,16 @@
+###############################################################################
+# Copyright (c) 2003, 2004 IBM 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:
+# IBM Corporation - initial API and implementation
+###############################################################################
+CONTACT=danberg@us.ibm.com
+ComponentShortName=ejb
+ComponentFullName=EJB
+ComponentCompetency=EMF
+JavaCompile.1=srcjar
+BuildVerification.1=dir
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/build/package.xml b/plugins/org.eclipse.jst.j2ee.ejb/build/package.xml
new file mode 100644
index 0000000..154d2fa
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/build/package.xml
@@ -0,0 +1,17 @@
+<project name="com.ibm.etools.emf.workbench" default="packagingPlugin" basedir="./..">
+    <target name="init">
+        <property name="packageDir" value=""/>
+        <property name="plugin.directory"  value="${basedir}"/>
+        <property name="plugin.id" value="com.ibm.etools.ejb"/>
+        <property name="plugin.version"  value=""/>
+    </target>
+    <target name="packagingPlugin" depends="init">
+        <echo message="${plugin.id}"/>
+        <copy todir="${packageDir}/plugins/${plugin.id}_${plugin.version}">
+            <fileset dir="${plugin.directory}">
+                <include name="plugin.xml"/>
+                <include name="runtime/ejb.jar"/>
+            </fileset>
+        </copy>
+    </target>
+</project>
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/build/wsBuild.xml b/plugins/org.eclipse.jst.j2ee.ejb/build/wsBuild.xml
new file mode 100644
index 0000000..77c0b82
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/build/wsBuild.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0"?>
+<!DOCTYPE project [
+	<!ENTITY baseBuild SYSTEM "file:../../wsBuildDef.xml">
+]>
+
+<project name="buildPlugin" default="build" basedir="./..">
+
+<!-- include the common xml build file -->
+&baseBuild;
+
+<target name="build" depends="prepare" if="plugin.id">
+	<antcall target="buildjar">
+		<param name="jarname" value="${defaultjarname}"/>
+		<param name="jarclasspath" value="${plugin.classpath}"/>
+	</antcall>
+</target>
+</project>
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/component.xml b/plugins/org.eclipse.jst.j2ee.ejb/component.xml
new file mode 100644
index 0000000..217da9d
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/component.xml
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><component  xmlns="http://eclipse.org/wtp/releng/tools/component-model" name="org.eclipse.jst.j2ee.ejb"><component-depends unrestricted="true"></component-depends><plugin id="org.eclipse.jst.j2ee.ejb" fragment="false"/><plugin id="org.eclipse.jst.j2ee.ejb.annotation.model" fragment="false"/><plugin id="org.eclipse.jst.j2ee.xdoclet.runtime" fragment="false"/><plugin id="org.eclipse.jst.j2ee.ejb.annotations.emitter" fragment="false"/><plugin id="org.eclipse.jst.j2ee.ejb.annotations.ui" fragment="false"/><plugin id="org.eclipse.jst.j2ee.ejb.annotations.xdoclet" fragment="false"/><plugin id="org.eclipse.jst.ejb.ui" fragment="false"/></component>
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/deployables/EJBDeployableArtifactAdapterUtil.java b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/deployables/EJBDeployableArtifactAdapterUtil.java
new file mode 100644
index 0000000..46b9852
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/deployables/EJBDeployableArtifactAdapterUtil.java
@@ -0,0 +1,233 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2007 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.ejb.internal.deployables;
+
+import java.util.Arrays;
+import java.util.Iterator;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jem.java.JavaClass;
+import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
+import org.eclipse.jem.workbench.utility.JemProjectUtilities;
+import org.eclipse.jst.j2ee.ejb.EJBJar;
+import org.eclipse.jst.j2ee.ejb.EnterpriseBean;
+import org.eclipse.jst.j2ee.ejb.componentcore.util.EJBArtifactEdit;
+import org.eclipse.jst.j2ee.ejb.internal.plugin.EjbPlugin;
+import org.eclipse.jst.j2ee.internal.J2EEConstants;
+import org.eclipse.jst.j2ee.internal.deployables.J2EEFlexProjDeployable;
+import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
+import org.eclipse.jst.j2ee.project.JavaEEProjectUtilities;
+import org.eclipse.jst.server.core.EJBBean;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualResource;
+import org.eclipse.wst.common.internal.emfworkbench.WorkbenchResourceHelper;
+import org.eclipse.wst.server.core.IModule;
+import org.eclipse.wst.server.core.IModuleArtifact;
+import org.eclipse.wst.server.core.ServerUtil;
+import org.eclipse.wst.server.core.model.ModuleDelegate;
+import org.eclipse.wst.server.core.util.NullModuleArtifact;
+
+/**
+ * @version 1.0
+ * @author
+ */
+public class EJBDeployableArtifactAdapterUtil {
+	/**
+	 * Constructor for EJBDeployableObjectAdapter.
+	 */
+	public EJBDeployableArtifactAdapterUtil() {
+		super();
+	}
+
+	public static IModuleArtifact getModuleObject(Object obj) {
+		if (obj == null)
+			return null;
+		else if (obj instanceof EJBJar)
+			return getModuleObject((EJBJar) obj);
+		else if (obj instanceof EnterpriseBean)
+			return getModuleObject((EnterpriseBean) obj);
+		else if (obj instanceof IProject) 
+			return  getModuleObject((IProject) obj);
+		else if (obj instanceof IJavaProject) 
+			return  getModuleObject(((IJavaProject) obj).getProject());
+		else if (obj instanceof IFile)
+			return getModuleObject((IFile) obj);
+		else if (obj instanceof ICompilationUnit)
+			return getModuleObject((ICompilationUnit) obj);
+		return null;
+	}
+
+	protected static boolean hasInterestedComponents(IProject project) {
+		return JavaEEProjectUtilities.isEJBProject(project);
+	}
+
+	protected static IModuleArtifact getModuleObject(ICompilationUnit cu) {
+
+		try {
+			IFile file = (IFile) cu.getCorrespondingResource();
+			IProject project = file.getProject();
+			if (hasInterestedComponents(project)) {
+				return getModuleJavaObject(file);
+			}
+
+		} catch (JavaModelException e) {
+			EjbPlugin.logError(e);
+		}
+		return null;
+	}
+
+	protected static IModuleArtifact getModuleObject(EJBJar ejbJar) {
+		IModule dep = getModule(ejbJar);
+		return createModuleObject(dep, null, false, false);
+	}
+
+	protected static IModuleArtifact getModuleObject(EnterpriseBean ejb) {
+
+		IModule dep = getModule(ejb);
+		return createModuleObject(dep, ejb.getName(), ejb.hasRemoteClient(), ejb.hasLocalClient());
+	}
+
+	protected static IModuleArtifact getModuleObject(IProject project) {
+		if (hasInterestedComponents(project)) {
+			IModule dep = getModule(project, null);
+			return createModuleObject(dep, null, false, false);
+		}
+		return null;
+	}
+
+	protected static IModuleArtifact getModuleObject(IFile file) {
+		IVirtualResource[] resources = ComponentCore.createResources(file);
+		IVirtualComponent component = null;
+		if (resources[0] != null || resources.length <= 0)
+			component = resources[0].getComponent();
+		if (hasInterestedComponents(file.getProject())) {
+			String ext = file.getFileExtension();
+			if ("java".equals(ext) || "class".equals(ext)) //$NON-NLS-1$ //$NON-NLS-2$
+				return getModuleJavaObject(file);
+			if (file.getProjectRelativePath().toString().endsWith(J2EEConstants.EJBJAR_DD_URI))
+				return createModuleObject(getModule(file.getProject(), component), null, false, false);
+		}
+		return null;
+	}
+
+	protected static IModule getModule(EObject refObject) {
+		IProject proj = ProjectUtilities.getProject(refObject);
+		if (proj == null)
+			return null;
+		Resource refResource = refObject.eResource();
+		IVirtualResource[] resources = null;
+		IVirtualComponent component = null;
+		try {
+			IResource eclipeServResoruce = WorkbenchResourceHelper.getFile(refResource);
+			resources = ComponentCore.createResources(eclipeServResoruce);
+			if (resources[0] != null)
+				component = resources[0].getComponent();
+		} catch (Exception e) {
+			EjbPlugin.logError(e);
+		}
+		return getModule(proj, component);
+	}
+
+	protected static IModule getModule(IProject project, IVirtualComponent component) {
+		IModule deployable = null;
+		Iterator iterator = Arrays.asList(ServerUtil.getModules(J2EEProjectUtilities.EJB)).iterator();  
+		String componentName = null;
+		if (component != null)
+			componentName = component.getName();
+		else
+			return getModuleProject(project, iterator);
+		while (iterator.hasNext()) {
+			Object next = iterator.next();
+			if (next instanceof IModule) {
+				deployable = (IModule) next;
+				if (deployable.getName().equals(componentName)) {
+					return deployable;
+				}
+			}
+		}
+		return null;
+	}
+	
+	protected static IModule getModuleProject(IProject project, Iterator iterator) {
+		IModule deployable = null;
+		while (iterator.hasNext()) {
+			Object next = iterator.next();
+			if (next instanceof IModule) {
+				deployable = (IModule) next;
+				if (deployable.getProject().equals(project))
+					return deployable;
+			}
+		}
+		return null;
+	}
+
+
+	protected static IModuleArtifact getModuleJavaObject(IFile file) {
+
+			IVirtualComponent comp = file.getAdapter(IVirtualComponent.class);
+			if (comp != null) {
+			JavaClass javaClass = JemProjectUtilities.getJavaClass(file);
+			if (javaClass != null) {
+				EJBArtifactEdit edit = null;
+				try {
+				edit = EJBArtifactEdit.getEJBArtifactEditForRead(comp);
+				EJBJar jar = edit.getEJBJar();
+				if (jar != null) {
+					EnterpriseBean ejb = jar.getEnterpriseBeanWithReference(javaClass);
+					return createModuleObject(getModule(comp.getProject(), comp), ejb.getName(), isRemote(ejb, javaClass), isLocal(ejb, javaClass));
+				}
+				} finally {
+					if (edit != null)
+						edit.dispose();
+				}
+			}
+			}
+		return null;
+	}
+
+	protected static boolean isRemote(EnterpriseBean ejb, JavaClass javaClass) {
+		if (javaClass.equals(ejb.getHomeInterface()) || javaClass.equals(ejb.getRemoteInterface()))
+			return true;
+		return false;
+	}
+
+	protected static boolean isLocal(EnterpriseBean ejb, JavaClass javaClass) {
+		if (javaClass.equals(ejb.getLocalHomeInterfaceName()) || javaClass.equals(ejb.getLocalInterface()))
+			return true;
+		return false;
+	}
+
+	protected static IModuleArtifact createModuleObject(IModule module, String ejbName, boolean remote, boolean local) {
+		if (module != null) {
+			String jndiName = null;
+			if (ejbName != null) {
+				module.loadAdapter(ModuleDelegate.class, new NullProgressMonitor());
+				J2EEFlexProjDeployable moduleDelegate = (J2EEFlexProjDeployable)module.getAdapter(ModuleDelegate.class);
+				jndiName = moduleDelegate.getJNDIName(ejbName);
+				return new EJBBean(module, jndiName, remote, local);
+			}
+			return new NullModuleArtifact(module);
+		}
+		return null;
+	}
+
+
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/deployables/IEJBModuleArtifact.java b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/deployables/IEJBModuleArtifact.java
new file mode 100644
index 0000000..935005a
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/deployables/IEJBModuleArtifact.java
@@ -0,0 +1,18 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ * to be removed for M4
+ */
+package org.eclipse.jst.j2ee.ejb.internal.deployables;
+
+public interface IEJBModuleArtifact {
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/AddEjbTimerClassOperation.java b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/AddEjbTimerClassOperation.java
new file mode 100644
index 0000000..7a4c3d0
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/AddEjbTimerClassOperation.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Oracle 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:
+ * Ludovic Champenois ludo@java.net
+ *******************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.internal.operations;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.emf.codegen.jet.JETException;
+import org.eclipse.jdt.core.IPackageFragment;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.internal.enablement.nonui.WFTWrappedException;
+
+@SuppressWarnings("restriction")
+public class AddEjbTimerClassOperation extends NewEnterpriseBeanClassOperation {
+
+	/**
+	 * folder location of the EJB Timer creation templates directory
+	 */
+	protected static final String TEMPLATE_FILE = "/templates/ejbtimer.javajet"; //$NON-NLS-1$
+
+	public AddEjbTimerClassOperation(IDataModel dataModel) {
+		super(dataModel);
+	}
+
+	@Override
+	protected void generateUsingTemplates(IProgressMonitor monitor,
+			IPackageFragment fragment) throws WFTWrappedException,
+			CoreException {
+		// Create the enterprise bean template model
+		AddEjbTimerTemplateModel tempModel = new AddEjbTimerTemplateModel(model);
+		// Using the WTPJetEmitter, generate the java source based on the bean
+		// template model
+		try {
+			if (fragment != null) {
+				// Create the EJB Timer java file
+				EjbTimerTemplate tempImpl = EjbTimerTemplate.create(null);
+
+				try {
+					Method method = tempImpl.getClass().getMethod("generate", //$NON-NLS-1$
+							new Class[] { Object.class });
+					String source = (String) method.invoke(tempImpl, tempModel);
+					String javaFileName = tempModel.getClassName() + ".java"; //$NON-NLS-1$
+					createJavaFile(monitor, fragment, source, javaFileName);
+				} catch (SecurityException e) {
+					throw new JETException(e);
+				} catch (NoSuchMethodException e) {
+					throw new JETException(e);
+				} catch (IllegalArgumentException e) {
+					throw new JETException(e);
+				} catch (IllegalAccessException e) {
+					throw new JETException(e);
+				} catch (InvocationTargetException e) {
+					throw new JETException(e);
+				}
+			}
+		} catch (Exception e) {
+			throw new WFTWrappedException(e);
+		}
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/AddEjbTimerDataModelProvider.java b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/AddEjbTimerDataModelProvider.java
new file mode 100644
index 0000000..768f35d
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/AddEjbTimerDataModelProvider.java
@@ -0,0 +1,131 @@
+/*******************************************************************************
+ * Copyright (c) 2011, 2014 Oracle 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:
+ * Ludovic Champenois ludo@java.net
+ * IBM - Async and Non-persistent support
+ *******************************************************************************/
+
+
+package org.eclipse.jst.j2ee.ejb.internal.operations;
+
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewEnterpriseBeanClassDataModelProperties.EJB_NAME;
+
+import java.util.Set;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jst.j2ee.ejb.internal.plugin.EjbPlugin;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.j2ee.internal.common.operations.NewJavaClassDataModelProvider;
+import org.eclipse.jst.j2ee.internal.common.operations.NewJavaEEArtifactClassOperation;
+import org.eclipse.jst.j2ee.internal.ejb.project.operations.EJBCreationResourceHandler;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider;
+import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
+
+
+@SuppressWarnings("restriction")
+public class AddEjbTimerDataModelProvider extends
+		NewEnterpriseBeanClassDataModelProvider {
+
+	public static final String SCHEDULE = "AddEjbTimer.SCHEDULE"; //$NON-NLS-1$
+	
+	public static final String NON_PERSISTENT = "AddEjbTimer.NON_PERSISTENT"; //$NON-NLS-1$
+	
+
+	@Override
+	public IDataModelOperation getDefaultOperation() {
+		return new AddEnterpriseBeanOperation(getDataModel()) {
+
+			@Override
+			protected NewJavaEEArtifactClassOperation getNewClassOperation() {
+				return new AddEjbTimerClassOperation(getDataModel());
+			}
+		};
+	}
+
+	/**
+	 * Subclasses may extend this method to add their own data model's
+	 * properties as valid base properties.
+	 * 
+	 * @see org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider#getPropertyNames()
+	 */
+	@Override
+	public Set<String> getPropertyNames() {
+		// Add Bean specific properties defined in this data model
+		Set<String> propertyNames = super.getPropertyNames();
+
+		propertyNames.add(SCHEDULE);
+		propertyNames.add(NON_PERSISTENT);
+
+		return propertyNames;
+	}
+
+	/**
+	 * Subclasses may extend this method to provide their own default values for
+	 * any of the properties in the data model hierarchy. This method does not
+	 * accept a null parameter. It may return null.
+	 * 
+	 * @see NewJavaClassDataModelProvider#getDefaultProperty(String)
+	 * @see IDataModelProvider#getDefaultProperty(String)
+	 * 
+	 * @param propertyName
+	 * @return Object default value of property
+	 */
+	@Override
+	public Object getDefaultProperty(String propertyName) {
+		if (propertyName.equals(SCHEDULE)) {
+			return EJBCreationResourceHandler.timerScheduleDefault;
+		} else if (propertyName.equals(NON_PERSISTENT)) {
+			return Boolean.FALSE;
+		}
+		
+		// Otherwise check super for default value for property
+		return super.getDefaultProperty(propertyName);
+	}
+	
+	@Override
+	public boolean isPropertyEnabled(String propertyName) {
+		if (propertyName.equals(SCHEDULE)) {
+			return Boolean.TRUE;
+		} else if (propertyName.equals(NON_PERSISTENT)) {
+			return ejb3xOrLater(J2EEVersionConstants.VERSION_3_1);
+		}
+		return super.isPropertyEnabled(propertyName);
+	}
+
+	@Override
+	public IStatus validate(String propertyName) {
+		// we need to override to remove the error condition for EJB_NAME
+		if (EJB_NAME.equals(propertyName)){
+			return null;
+		}
+
+		if (SCHEDULE.equals(propertyName)) {
+			String value = (String) getProperty(SCHEDULE);
+			if (value == null || value.trim().length() == 0) {
+				return WTPCommonPlugin.createErrorStatus(EJBCreationResourceHandler.errorTimerScheduleMissing);
+			}
+		} else if (NON_PERSISTENT.equals(propertyName) && ejb3xOrLater(J2EEVersionConstants.VERSION_3_1) && !ejb3xOrLater(J2EEVersionConstants.VERSION_3_2)) {
+			return  new Status(IStatus.WARNING, EjbPlugin.PLUGIN_ID, EJBCreationResourceHandler.WRN_EJB31_NON_PERSISTENT_NO_SUPPORTED);
+		}
+		IStatus status = super.validate(propertyName);
+		return status;
+	}
+	
+	@Override
+	public boolean propertySet(String propertyName, Object propertyValue) {
+		boolean result = super.propertySet(propertyName, propertyValue);
+		
+		if (PROJECT_NAME.equals(propertyName)) {
+			getDataModel().notifyPropertyChange(NON_PERSISTENT, IDataModel.DEFAULT_CHG);
+		}
+		return result;
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/AddEjbTimerTemplateModel.java b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/AddEjbTimerTemplateModel.java
new file mode 100644
index 0000000..a6dc2f8
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/AddEjbTimerTemplateModel.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * Copyright (c) 2011, 2014 Oracle 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:
+ * Ludovic Champenois ludo@java.net
+ * IBM - Async and Non-persistent support
+ *******************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.internal.operations;
+
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewEnterpriseBeanClassDataModelProperties.EJB_NAME;
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewEnterpriseBeanClassDataModelProperties.MAPPED_NAME;
+
+import java.util.Collection;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.eclipse.jst.j2ee.internal.common.operations.Method;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+@SuppressWarnings("restriction")
+public class AddEjbTimerTemplateModel extends CreateEnterpriseBeanTemplateModel {
+
+	public static final String QUALIFIED_SCHEDULE = "javax.ejb.Schedule"; //$NON-NLS-1$
+	public static final String QUALIFIED_TIMER = "javax.ejb.Timer"; //$NON-NLS-1$
+	public static final String QUALIFIED_STATELESS = "javax.ejb.Stateless"; //$NON-NLS-1$
+
+	public static final String SCHEDULED_TIMEOUT = "scheduledTimeout"; //$NON-NLS-1$
+
+	public AddEjbTimerTemplateModel(IDataModel adataModel) {
+		super(adataModel);
+	}
+
+	@Override
+	public Collection<String> getImports() {
+		Collection<String> collection = super.getImports();
+
+		collection.add(QUALIFIED_SCHEDULE);
+		collection.add(QUALIFIED_STATELESS);
+		collection.add(QUALIFIED_TIMER);
+
+		return collection;
+	}
+
+	public Map<String, String> getClassAnnotationParams() {
+		Map<String, String> result = new Hashtable<String, String>();
+
+		String dispName = getProperty(EJB_NAME).trim();
+		if (!dispName.equals(getClassName()) && (dispName.length() > 0)) {
+			result.put(ATT_NAME, QUOTATION_STRING + dispName + QUOTATION_STRING);
+		}
+		String mappedName = getProperty(MAPPED_NAME).trim();
+		if (mappedName != null && mappedName.length() > 0) {
+			result.put(ATT_MAPPED_NAME, QUOTATION_STRING + mappedName + QUOTATION_STRING);
+		}
+
+		return result;
+	}
+
+	@Override
+	public String getProperty(String propertyName) {
+		return dataModel.getStringProperty(propertyName);
+	}
+
+	@Override
+	public Collection<Method> getUnimplementedMethods() {
+		Collection<Method> unimplementedMethods = super
+				.getUnimplementedMethods();
+		Iterator<Method> iterator = unimplementedMethods.iterator();
+
+		while (iterator.hasNext()) {
+			Method method = iterator.next();
+			if (SCHEDULED_TIMEOUT.equals(method.getName())) {
+				iterator.remove();
+			}
+		}
+
+		return unimplementedMethods;
+	}
+	
+	public boolean isNonPersistent() {
+		return (Boolean) dataModel.getProperty(AddEjbTimerDataModelProvider.NON_PERSISTENT);
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/AddEnterpriseBeanOperation.java b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/AddEnterpriseBeanOperation.java
new file mode 100644
index 0000000..05f52c3
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/AddEnterpriseBeanOperation.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2008 SAP AG 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:
+ * Kaloyan Raev, kaloyan.raev@sap.com - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.ejb.internal.operations;
+
+import org.eclipse.jst.j2ee.internal.common.operations.AddJavaEEArtifactOperation;
+import org.eclipse.wst.common.componentcore.internal.operation.ArtifactEditProviderOperation;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+public abstract class AddEnterpriseBeanOperation extends AddJavaEEArtifactOperation {
+
+	/**
+	 * This is the constructor which should be used when creating the operation.
+	 * It will not accept null parameter. It will not return null.
+	 * 
+	 * @see ArtifactEditProviderOperation#ArtifactEditProviderOperation(IDataModel)
+	 * 
+	 * @param dataModel
+	 * @return AddBeansOperation
+	 */
+	public AddEnterpriseBeanOperation(IDataModel dataModel) {
+		super(dataModel);
+	}
+	
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/AddMessageDrivenBeanOperation.java b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/AddMessageDrivenBeanOperation.java
new file mode 100644
index 0000000..9aa9bec
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/AddMessageDrivenBeanOperation.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2008 SAP AG 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:
+ * Kaloyan Raev, kaloyan.raev@sap.com - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.ejb.internal.operations;
+
+import org.eclipse.jst.j2ee.internal.common.operations.NewJavaEEArtifactClassOperation;
+import org.eclipse.wst.common.componentcore.internal.operation.ArtifactEditProviderOperation;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+public class AddMessageDrivenBeanOperation extends AddEnterpriseBeanOperation {
+
+	/**
+	 * This is the constructor which should be used when creating the operation.
+	 * It will not accept null parameter. It will not return null.
+	 * 
+	 * @see ArtifactEditProviderOperation#ArtifactEditProviderOperation(IDataModel)
+	 * 
+	 * @param dataModel
+	 * @return AddBeansOperation
+	 */
+	public AddMessageDrivenBeanOperation(IDataModel dataModel) {
+		super(dataModel);
+	}
+
+	@Override
+	protected NewJavaEEArtifactClassOperation getNewClassOperation() {
+		return new NewMessageDrivenBeanClassOperation(getDataModel());
+	}
+	
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/AddSessionBeanOperation.java b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/AddSessionBeanOperation.java
new file mode 100644
index 0000000..f7a03e9
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/AddSessionBeanOperation.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 SAP AG 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:
+ * Kaloyan Raev, kaloyan.raev@sap.com - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.ejb.internal.operations;
+
+import org.eclipse.jst.j2ee.internal.common.operations.NewJavaEEArtifactClassOperation;
+import org.eclipse.wst.common.componentcore.internal.operation.ArtifactEditProviderOperation;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+public class AddSessionBeanOperation extends AddEnterpriseBeanOperation {
+
+	/**
+	 * This is the constructor which should be used when creating the operation.
+	 * It will not accept null parameter. It will not return null.
+	 * 
+	 * @see ArtifactEditProviderOperation#ArtifactEditProviderOperation(IDataModel)
+	 * 
+	 * @param dataModel
+	 * @return AddBeansOperation
+	 */
+	public AddSessionBeanOperation(IDataModel dataModel) {
+		super(dataModel);
+	}
+
+	@Override
+	protected NewJavaEEArtifactClassOperation getNewClassOperation() {
+		return new NewSessionBeanClassOperation(getDataModel());
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/BusinessInterface.java b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/BusinessInterface.java
new file mode 100644
index 0000000..36e6f97
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/BusinessInterface.java
@@ -0,0 +1,113 @@
+/*******************************************************************************
+ * Copyright (c) 2007 SAP AG 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:
+ * Kaloyan Raev, kaloyan.raev@sap.com - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.ejb.internal.operations;
+
+import org.eclipse.jdt.core.Flags;
+import org.eclipse.jdt.core.IMethod;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.core.Signature;
+
+public class BusinessInterface {
+	
+	public enum BusinessInterfaceType {
+		LOCAL, REMOTE;
+	}
+	
+	private IType javaType;
+    private String name;
+    
+    private BusinessInterfaceType type;
+    
+    public BusinessInterface(IType javaType, BusinessInterfaceType type) {
+        this(javaType.getFullyQualifiedName(), type); 
+        this.javaType = javaType;
+    }
+    
+    public BusinessInterface(String name, BusinessInterfaceType type) {
+        this.name = name; 
+        this.type = type;
+    }
+    
+    public String getFullyQualifiedName() {
+        return name;
+    }
+    
+    public String getSimpleName() {
+		return Signature.getSimpleName(name);
+	}
+    
+    public IType getJavaType() {
+        return javaType;
+    }
+    
+    public boolean exists() {
+    	return javaType != null;
+    }
+    
+    public BusinessInterfaceType getType() {
+    	return type;
+    }
+    
+    public boolean isLocal() {
+        return type == BusinessInterfaceType.LOCAL;
+    }
+    
+    public boolean isRemote() {
+        return type == BusinessInterfaceType.REMOTE;
+    }
+    
+    public boolean hasUnimplementedMethod() throws JavaModelException {
+    	if (javaType != null) {
+    		IMethod[] methods = javaType.getMethods();
+    		for (IMethod method : methods) {
+    			boolean resolved = method.isResolved();
+    			if (!resolved) {
+    				int flags = method.getFlags();
+    				if (Flags.isAbstract(flags) || Flags.isInterface(flags)) {
+    					method.getParameterTypes();
+    				}
+    			}
+    		}
+    	}
+    	return false;
+    }
+
+    public void setFullyQualifiedName(String newName) {
+        name = newName;
+    }
+
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = 1;
+		result = prime * result + ((name == null) ? 0 : name.hashCode());
+		return result;
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj)
+			return true;
+		if (obj == null)
+			return false;
+		if (getClass() != obj.getClass())
+			return false;
+		BusinessInterface other = (BusinessInterface) obj;
+		if (name == null) {
+			if (other.name != null)
+				return false;
+		} else if (!name.equals(other.name))
+			return false;
+		return true;
+	}
+    
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/BusinessInterfaceAnnotationLocationType.java b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/BusinessInterfaceAnnotationLocationType.java
new file mode 100644
index 0000000..25185c3
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/BusinessInterfaceAnnotationLocationType.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2012 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.internal.operations;
+
+public enum BusinessInterfaceAnnotationLocationType {
+	/**
+	 * The business interface annotations <code>(javax.ejb.Local and javax.ejb.Remote) </code> should be added to the 
+	 * bean class of the EJB being created. 
+	 */
+	BEAN_CLASS_ONLY,
+	
+	/**
+	 * The business interface annotations <code>(javax.ejb.Local and javax.ejb.Remote) </code> should be added to the 
+	 * business interfaces of the EJB being created. 
+	 */
+	INTERFACE_ONLY,
+	
+	/**
+	 * The business interface annotations <code>(javax.ejb.Local and javax.ejb.Remote) </code> should be added to both the 
+	 * business interfaces and the bean class of the EJB being created. 
+	 */
+	BEAN_CLASS_AND_INTERFACE,
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/CreateEnterpriseBeanTemplateModel.java b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/CreateEnterpriseBeanTemplateModel.java
new file mode 100644
index 0000000..4ea3b42
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/CreateEnterpriseBeanTemplateModel.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2008 SAP AG 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:
+ * Kaloyan Raev, kaloyan.raev@sap.com - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.ejb.internal.operations;
+
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewEnterpriseBeanClassDataModelProperties.TRANSACTION_TYPE;
+
+import org.eclipse.jst.j2ee.internal.common.operations.CreateJavaEEArtifactTemplateModel;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+public class CreateEnterpriseBeanTemplateModel extends
+		CreateJavaEEArtifactTemplateModel {
+	
+	protected static final String ATT_MAPPED_NAME = "mappedName"; //$NON-NLS-1$
+	
+	protected static final String QUOTATION_STRING = "\""; //$NON-NLS-1$
+	
+	public CreateEnterpriseBeanTemplateModel(IDataModel dataModel) {
+		super(dataModel);
+	}
+    
+    public boolean isContainerType() {
+		String transactionType = dataModel.getStringProperty(TRANSACTION_TYPE);
+		if (transactionType.equals(TransactionType.CONTAINER.toString()))
+			return true;
+		else if (transactionType.equals(TransactionType.BEAN.toString()))
+			return false;
+		else 
+			throw new IllegalStateException("illegal transaction type: " + transactionType); //$NON-NLS-1$
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/CreateMessageDrivenBeanTemplateModel.java b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/CreateMessageDrivenBeanTemplateModel.java
new file mode 100644
index 0000000..4dce21f
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/CreateMessageDrivenBeanTemplateModel.java
@@ -0,0 +1,124 @@
+/*******************************************************************************
+ * Copyright (c) 2008 SAP AG 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:
+ * Kaloyan Raev, kaloyan.raev@sap.com - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.ejb.internal.operations;
+
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewEnterpriseBeanClassDataModelProperties.EJB_NAME;
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewEnterpriseBeanClassDataModelProperties.MAPPED_NAME;
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewMessageDrivenBeanClassDataModelProperties.DESTINATION_TYPE;
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewMessageDrivenBeanClassDataModelProperties.JMS;
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewMessageDrivenBeanClassDataModelProperties.MESSAGE_LISTENER_INTERFACE;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.jdt.core.Signature;
+import org.eclipse.jst.j2ee.internal.common.operations.Method;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+public class CreateMessageDrivenBeanTemplateModel extends
+		CreateEnterpriseBeanTemplateModel {
+
+	public static final String QUALIFIED_ACTIVATION_CONFIG_PROPERTY = "javax.ejb.ActivationConfigProperty"; //$NON-NLS-1$
+	public static final String QUALIFIED_TRANSACTION_MANAGEMENT = "javax.ejb.TransactionManagement"; //$NON-NLS-1$
+	public static final String QUALIFIED_TRANSACTION_MANAGEMENT_TYPE = "javax.ejb.TransactionManagementType"; //$NON-NLS-1$
+	public static final String QUALIFIED_JSM_MESSAGE = "javax.jms.Message"; //$NON-NLS-1$
+	public static final String QUALIFIED_MESSAGE_DRIVEN = "javax.ejb.MessageDriven"; //$NON-NLS-1$
+	public static final String ATT_ACTIVATION_CONFIG = "activationConfig"; //$NON-NLS-1$
+	public static final String ATT_MESSAGE_LISTENER_INTERFACE = "messageListenerInterface"; //$NON-NLS-1$
+	public static final String ON_MESSAGE = "onMessage"; //$NON-NLS-1$
+	public static final String ON_MESSAGE_SIGNATURE = "(Ljavax/jms/Message;)V"; //$NON-NLS-1$
+	public static final String PROP_DESTINATION_TYPE = "destinationType"; //$NON-NLS-1$
+	public static final String PROP_DESTINATION = "destination"; //$NON-NLS-1$
+
+	private static final String CLASS_SUFFIX = ".class"; //$NON-NLS-1$
+	
+	public CreateMessageDrivenBeanTemplateModel(IDataModel dataModel) {
+		super(dataModel);
+	}
+
+	@Override
+	public Collection<String> getImports() {
+		Collection<String> collection = super.getImports();
+
+		collection.add(QUALIFIED_MESSAGE_DRIVEN);
+		if (isJMS()){
+			collection.add(QUALIFIED_ACTIVATION_CONFIG_PROPERTY);
+			collection.add(NewMessageDrivenBeanClassDataModelProvider.QUALIFIED_JMS_MESSAGELISTENER);
+			collection.add(QUALIFIED_JSM_MESSAGE);
+		}
+		if (!isContainerType()) {
+			collection.add(QUALIFIED_TRANSACTION_MANAGEMENT);
+			collection.add(QUALIFIED_TRANSACTION_MANAGEMENT_TYPE);
+		}
+		
+		collection.add(dataModel.getStringProperty(MESSAGE_LISTENER_INTERFACE));
+
+		return collection;
+	}
+
+	public Map<String, Object> getClassAnnotationParams() {
+		Map<String, Object> result = new HashMap<String, Object>();
+		Map<String, String> activationConfigProperties = new HashMap<String, String>();
+		result.put(ATT_ACTIVATION_CONFIG, activationConfigProperties);
+		
+		if (isJMS()){
+			String destinationType = dataModel.getStringProperty(DESTINATION_TYPE);
+			if (destinationType.equals(DestinationType.QUEUE.toString())) 
+				activationConfigProperties.put(PROP_DESTINATION_TYPE, "javax.jms.Queue"); //$NON-NLS-1$
+			else if (destinationType.equals(DestinationType.TOPIC.toString())) 
+				activationConfigProperties.put(PROP_DESTINATION_TYPE, "javax.jms.Topic"); //$NON-NLS-1$
+			else 
+				throw new IllegalStateException("illegal destination type: " + destinationType); //$NON-NLS-1$
+		}
+		String dispName = getProperty(EJB_NAME).trim();
+		if (!dispName.equals(getClassName()) && (dispName.length() > 0))
+			result.put(ATT_NAME, QUOTATION_STRING + dispName + QUOTATION_STRING);
+		String mappedName = getProperty(MAPPED_NAME).trim();
+		if (mappedName != null && mappedName.length() > 0) {
+			result.put(ATT_MAPPED_NAME, QUOTATION_STRING + mappedName + QUOTATION_STRING);
+			if (isJMS()) {
+				activationConfigProperties.put(PROP_DESTINATION, mappedName);
+			}
+		}
+		String messageListenerInterface = getProperty(MESSAGE_LISTENER_INTERFACE);
+		
+		List<String> interfaces = getQualifiedInterfaces();
+		if (interfaces.size() != 1 || !interfaces.contains(messageListenerInterface)) {
+			result.put(ATT_MESSAGE_LISTENER_INTERFACE, 
+					Signature.getSimpleName(messageListenerInterface) + CLASS_SUFFIX);
+		}
+			
+		return result;
+	}
+
+	public boolean isJMS(){
+		return dataModel.getBooleanProperty(JMS);
+	}
+
+	@Override
+	public Collection<Method> getUnimplementedMethods() {
+		Collection<Method> unimplementedMethods = super.getUnimplementedMethods();
+		Iterator<Method> iterator = unimplementedMethods.iterator();
+		
+		while (iterator.hasNext()) {
+			Method method = iterator.next();
+			if (ON_MESSAGE.equals(method.getName()) && ON_MESSAGE_SIGNATURE.equals(method.getSignature())) {
+				iterator.remove();
+			}
+		}
+		
+		return unimplementedMethods;
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/CreateSessionBeanTemplateModel.java b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/CreateSessionBeanTemplateModel.java
new file mode 100644
index 0000000..fa24710
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/CreateSessionBeanTemplateModel.java
@@ -0,0 +1,327 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2014 SAP AG 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:
+ * Kaloyan Raev, kaloyan.raev@sap.com - initial API and implementation
+ * Roberto Sanchez, rsanchez@mx1.ibm.com - Add remote and local annotations to bean class
+ * IBM - Async and Non-persistent support
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.ejb.internal.operations;
+
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewEnterpriseBeanClassDataModelProperties.EJB_NAME;
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewEnterpriseBeanClassDataModelProperties.MAPPED_NAME;
+import static org.eclipse.jst.j2ee.internal.common.operations.INewJavaClassDataModelProperties.INTERFACES;
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewSessionBeanClassDataModelProperties.LOCAL_HOME;
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewSessionBeanClassDataModelProperties.*;
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewSessionBeanClassDataModelProperties.STATE_TYPE;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.jdt.core.Signature;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+public class CreateSessionBeanTemplateModel extends
+		CreateEnterpriseBeanTemplateModel {
+
+	public static final String QUALIFIED_STATELESS = "javax.ejb.Stateless"; //$NON-NLS-1$
+	public static final String QUALIFIED_STATEFUL = "javax.ejb.Stateful"; //$NON-NLS-1$
+	public static final String QUALIFIED_SINGLETON = "javax.ejb.Singleton"; //$NON-NLS-1$
+	public static final String QUALIFIED_LOCAL_BEAN = "javax.ejb.LocalBean"; //$NON-NLS-1$
+	public static final String QUALIFIED_LOCAL = "javax.ejb.Local"; //$NON-NLS-1$
+	public static final String QUALIFIED_REMOTE = "javax.ejb.Remote"; //$NON-NLS-1$
+	public static final String QUALIFIED_REMOTE_HOME = "javax.ejb.RemoteHome"; //$NON-NLS-1$
+	public static final String QUALIFIED_LOCAL_HOME = "javax.ejb.LocalHome"; //$NON-NLS-1$
+	public static final String QUALIFIED_ASYNCHRONOUS = "javax.ejb.Asynchronous"; //$NON-NLS-1$
+	 
+	public static final String QUALIFIED_TRANSACTION_MANAGEMENT = "javax.ejb.TransactionManagement"; //$NON-NLS-1$
+	public static final String QUALIFIED_TRANSACTION_MANAGEMENT_TYPE = "javax.ejb.TransactionManagementType"; //$NON-NLS-1$
+	
+	public static final String STATELESS_ANNOTATION = "@Stateless"; //$NON-NLS-1$
+	public static final String STATEFUL_ANNOTATION = "@Stateful"; //$NON-NLS-1$
+	public static final String SINGLETON_ANNOTATION = "@Singleton"; //$NON-NLS-1$
+
+	protected BusinessInterface currentBusinessInterface = null;
+	protected String localHomeClassName = null;
+	protected String localComponentClassName = null;
+	protected String remoteHomeClassName = null;
+	protected String remoteComponentClassName = null;
+	
+	public CreateSessionBeanTemplateModel(IDataModel dataModel) {
+		super(dataModel);
+	}
+
+	@Override
+	public Collection<String> getImports() {
+		Collection<String> collection = super.getImports();
+		
+		String stateType = dataModel.getStringProperty(STATE_TYPE);
+		if (stateType.equals(StateType.STATELESS.toString())) {
+			collection.add(QUALIFIED_STATELESS);
+		} else if (stateType.equals(StateType.STATEFUL.toString())) {
+			collection.add(QUALIFIED_STATEFUL);
+		} else if (stateType.equals(StateType.SINGLETON.toString())) {
+			collection.add(QUALIFIED_SINGLETON);
+		} else {
+			throw new IllegalStateException("illegal state type: " + stateType); //$NON-NLS-1$
+		}
+		
+		if (!isContainerType()) {
+			collection.add(QUALIFIED_TRANSACTION_MANAGEMENT);
+			collection.add(QUALIFIED_TRANSACTION_MANAGEMENT_TYPE);
+		}
+		
+		if (isRemoteHomeChecked()) {
+			collection.add(QUALIFIED_REMOTE_HOME);
+			collection.add(remoteHomeClassName);
+		}
+		
+		if (isLocalHomeChecked()) {
+			collection.add(QUALIFIED_LOCAL_HOME);
+			collection.add(localHomeClassName);
+		}
+		
+		if (isNoInterfaceChecked()) {
+			collection.add(QUALIFIED_LOCAL_BEAN);
+		}
+		
+		if (isAsynchronous()) {
+			collection.add(QUALIFIED_ASYNCHRONOUS);
+		}
+		
+		List<BusinessInterface> interfaces = getBusinessInterfaces();
+		if (addBusinessAnnotationToBeanClass()){
+			for (BusinessInterface iface : interfaces) {
+				if (iface.isLocal()) {
+					collection.add(QUALIFIED_LOCAL);
+				} else if (iface.isRemote()) { 
+					collection.add(QUALIFIED_REMOTE);
+				}
+			}
+		}
+		else {
+			for (BusinessInterface iface : interfaces) {
+				if (iface.isLocal() && iface.exists()) {
+					collection.add(QUALIFIED_LOCAL);
+				} else if (iface.isRemote() && iface.exists()) { 
+					collection.add(QUALIFIED_REMOTE);
+				}
+			}
+		}
+		
+		return collection;
+	}
+	
+	@Override
+	public List<String> getQualifiedInterfaces() {
+		List<String> result = new ArrayList<String>();
+		
+		List<BusinessInterface> interfaces = getBusinessInterfaces();
+		for (BusinessInterface iface : interfaces) {
+			result.add(iface.getFullyQualifiedName());
+		}
+		
+		return result;
+	}
+	
+	public String getClassAnnotation() {
+		String stateType = dataModel.getStringProperty(STATE_TYPE);
+		
+		String beanType;
+		if (stateType.equals(StateType.STATELESS.toString())) {
+			beanType = STATELESS_ANNOTATION;
+		} else if (stateType.equals(StateType.STATEFUL.toString())) {
+			beanType = STATEFUL_ANNOTATION;
+		} else if (stateType.equals(StateType.SINGLETON.toString())) {
+			beanType = SINGLETON_ANNOTATION;
+		} else { 
+			throw new IllegalStateException("illegal state type: " + stateType); //$NON-NLS-1$
+		}
+		
+		return beanType;
+	}
+	
+	@SuppressWarnings("unchecked")
+	public List<BusinessInterface> getBusinessInterfaces() {
+		return (List<BusinessInterface>) dataModel.getProperty(INTERFACES);
+	}
+	
+	public List<BusinessInterface> getLocalBusinessInterfaces() {
+		List<BusinessInterface> result = new ArrayList<BusinessInterface>();
+		
+		List<BusinessInterface> interfaces = getBusinessInterfaces();
+		for (BusinessInterface iface : interfaces) {
+			if (iface.isLocal())
+				result.add(iface);
+		}
+		
+		return result;
+	}
+	
+	public List<BusinessInterface> getExistingLocalBusinessInterfaces() {
+		List<BusinessInterface> result = new ArrayList<BusinessInterface>();
+		
+		List<BusinessInterface> interfaces = getBusinessInterfaces();
+		for (BusinessInterface iface : interfaces) {
+			if (iface.isLocal() && iface.exists())
+				result.add(iface);
+		}
+		
+		return result;
+	}
+	
+	public List<BusinessInterface> getRemoteBusinessInterfaces() {
+		List<BusinessInterface> result = new ArrayList<BusinessInterface>();
+		
+		List<BusinessInterface> interfaces = getBusinessInterfaces();
+		for (BusinessInterface iface : interfaces) {
+			if (iface.isRemote())
+				result.add(iface);
+		}
+		
+		return result;
+	}
+	
+	public List<BusinessInterface> getExistingRemoteBusinessInterfaces() {
+		List<BusinessInterface> result = new ArrayList<BusinessInterface>();
+		
+		List<BusinessInterface> interfaces = getBusinessInterfaces();
+		for (BusinessInterface iface : interfaces) {
+			if (iface.isRemote() && iface.exists())
+				result.add(iface);
+		}
+		
+		return result;
+	}
+	
+	public boolean isLocalHomeChecked() {
+		return dataModel.getBooleanProperty(LOCAL_HOME);
+	}
+	
+	public boolean isRemoteHomeChecked() {
+		return dataModel.getBooleanProperty(REMOTE_HOME);
+	}
+
+	public boolean isNoInterfaceChecked() {
+		return dataModel.getBooleanProperty(NO_INTERFACE);
+	}
+	
+	public boolean isAsynchronous() {
+		return dataModel.getBooleanProperty(ASYNC);
+	}
+	
+	public Map<String, String> getClassAnnotationParams() {
+		Map<String, String> result = new Hashtable<String, String>();
+		String dispName = getProperty(EJB_NAME).trim();
+		if (!dispName.equals(getClassName()) && (dispName.length() > 0))
+			result.put(ATT_NAME, dispName);
+		String mappedName = getProperty(MAPPED_NAME).trim();
+		if (mappedName != null && mappedName.length() > 0) {
+			result.put(ATT_MAPPED_NAME, mappedName);
+		}
+		return result;
+	}
+
+	public void setCurrentBusinessInterface(BusinessInterface newBI)
+	{
+		currentBusinessInterface = newBI;
+	}
+
+	public String getBusinessInterfaceJavaPackageName() {
+		String packageName = null;
+		if (currentBusinessInterface != null)
+		{
+			packageName = Signature.getQualifier(currentBusinessInterface.getFullyQualifiedName());
+		}
+		return packageName;
+	}
+
+	public String getBusinessInterfaceClassName() {
+		String className = null;
+		if (currentBusinessInterface != null)
+		{
+			className = currentBusinessInterface.getSimpleName();
+		}
+		return className;
+	}
+
+	public String getLocalHomePackage() {
+		return Signature.getQualifier(localHomeClassName);
+	}
+
+	public String getLocalHomeClassSimpleName()
+	{
+		return Signature.getSimpleName(localHomeClassName);
+	}
+
+	public void setLocalHomeClassName(String localHomeClassName) {
+		this.localHomeClassName = localHomeClassName;
+	}
+
+	
+	
+	public String getLocalComponentPackage() {
+		return Signature.getQualifier(localComponentClassName);
+	}
+
+	public String getLocalComponentClassSimpleName()
+	{
+		return Signature.getSimpleName(localComponentClassName);
+	}
+
+	public void setLocalComponentClassName(String localComponentClassName) {
+		this.localComponentClassName = localComponentClassName;
+	}
+
+	
+	
+	
+	public String getRemoteHomePackage() {
+		return Signature.getQualifier(remoteHomeClassName);
+	}
+
+	public String getRemoteHomeClassSimpleName()
+	{
+		return Signature.getSimpleName(remoteHomeClassName);
+	}
+
+	public void setRemoteHomeClassName(String remoteHomeClassName) {
+		this.remoteHomeClassName = remoteHomeClassName;
+	}
+	
+	
+	
+	
+	
+	public String getRemoteComponentPackage() {
+		return Signature.getQualifier(remoteComponentClassName);
+	}
+
+	public String getRemoteComponentClassSimpleName()
+	{
+		return Signature.getSimpleName(remoteComponentClassName);
+	}
+
+	public void setRemoteComponentClassName(String remoteComponentClassName) {
+		this.remoteComponentClassName = remoteComponentClassName;
+	}
+	
+	public boolean addBusinessAnnotationToBeanClass(){
+		String prop = dataModel.getStringProperty(BUSINESS_INTERFACE_ANNOTATION_LOCATION);
+		return (prop.equals(BusinessInterfaceAnnotationLocationType.BEAN_CLASS_ONLY.toString()) ||
+				prop.equals(BusinessInterfaceAnnotationLocationType.BEAN_CLASS_AND_INTERFACE.toString()));	
+	}
+	
+	public boolean addBusinessAnnotationToInterface(){
+		String prop = dataModel.getStringProperty(BUSINESS_INTERFACE_ANNOTATION_LOCATION);
+		return (prop.equals(BusinessInterfaceAnnotationLocationType.INTERFACE_ONLY.toString()) ||
+				prop.equals(BusinessInterfaceAnnotationLocationType.BEAN_CLASS_AND_INTERFACE.toString()));	
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/DestinationType.java b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/DestinationType.java
new file mode 100644
index 0000000..eb396b4
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/DestinationType.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2008 SAP AG 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:
+ * Kaloyan Raev, kaloyan.raev@sap.com - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.ejb.internal.operations;
+
+/**
+ * Enumerates the destination type values of a message-driven bean. 
+ */
+public enum DestinationType {
+
+	/**
+	 * Represents the <code>javax.jms.Queue</code> destination type. 
+	 */
+	QUEUE,
+	
+	/**
+	 * Represents the <code>javax.jms.Topic</code> destination type.
+	 */
+	TOPIC;
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/EjbTimerTemplate.java b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/EjbTimerTemplate.java
new file mode 100644
index 0000000..c973f90
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/EjbTimerTemplate.java
@@ -0,0 +1,242 @@
+package org.eclipse.jst.j2ee.ejb.internal.operations;
+
+import java.util.*;
+
+import org.eclipse.jst.j2ee.internal.common.operations.*;
+
+
+
+@SuppressWarnings("restriction")
+public class EjbTimerTemplate {
+  protected static String nl;
+  public static synchronized EjbTimerTemplate create(String lineSeparator)
+  {
+    nl = lineSeparator;
+    EjbTimerTemplate result = new EjbTimerTemplate();
+    nl = null;
+    return result;
+  }
+
+  public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl; //$NON-NLS-1$
+  protected final String TEXT_1 = "package "; //$NON-NLS-1$
+  protected final String TEXT_2 = ";"; //$NON-NLS-1$
+  protected final String TEXT_3 = NL;
+  protected final String TEXT_4 = NL + "import "; //$NON-NLS-1$
+  protected final String TEXT_5 = ";"; //$NON-NLS-1$
+  protected final String TEXT_6 = NL + NL + "@Stateless"; //$NON-NLS-1$
+  protected final String TEXT_7 = NL + "public "; //$NON-NLS-1$
+  protected final String TEXT_8 = "abstract "; //$NON-NLS-1$
+  protected final String TEXT_9 = "final "; //$NON-NLS-1$
+  protected final String TEXT_10 = "class "; //$NON-NLS-1$
+  protected final String TEXT_11 = " extends "; //$NON-NLS-1$
+  protected final String TEXT_12 = " implements "; //$NON-NLS-1$
+  protected final String TEXT_13 = ", "; //$NON-NLS-1$
+  protected final String TEXT_14 = " {"; //$NON-NLS-1$
+  protected final String TEXT_15 = NL + NL + "    /**" + NL + "     * Default constructor. " + NL + "     */" + NL + "    public "; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+  protected final String TEXT_16 = "() {" + NL + "        // TODO Auto-generated constructor stub" + NL + "    }"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+  protected final String TEXT_17 = NL + "       " + NL + "    /**" + NL + "     * @see "; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+  protected final String TEXT_18 = "#"; //$NON-NLS-1$
+  protected final String TEXT_19 = "("; //$NON-NLS-1$
+  protected final String TEXT_20 = ")" + NL + "     */" + NL + "    public "; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+  protected final String TEXT_21 = "("; //$NON-NLS-1$
+  protected final String TEXT_22 = ") {" + NL + "        super("; //$NON-NLS-1$ //$NON-NLS-2$
+  protected final String TEXT_23 = ");" + NL + "        // TODO Auto-generated constructor stub" + NL + "    }"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+  protected final String TEXT_24 = NL + NL + "\t/**" + NL + "     * @see "; //$NON-NLS-1$ //$NON-NLS-2$
+  protected final String TEXT_25 = "#"; //$NON-NLS-1$
+  protected final String TEXT_26 = "("; //$NON-NLS-1$
+  protected final String TEXT_27 = ")" + NL + "     */" + NL + "    public "; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+  protected final String TEXT_28 = " "; //$NON-NLS-1$
+  protected final String TEXT_29 = "("; //$NON-NLS-1$
+  protected final String TEXT_30 = ") {" + NL + "        // TODO Auto-generated method stub"; //$NON-NLS-1$ //$NON-NLS-2$
+  protected final String TEXT_31 = NL + "\t\t\treturn "; //$NON-NLS-1$
+  protected final String TEXT_32 = ";"; //$NON-NLS-1$
+  protected final String TEXT_33 = NL + "    }"; //$NON-NLS-1$
+  protected final String TEXT_34 = NL + "\t"; //$NON-NLS-1$
+  protected final String TEXT_35 = NL + "\t@SuppressWarnings(\"unused\")" + NL + "\t@Schedule("; //$NON-NLS-1$ //$NON-NLS-2$
+  protected final String TEXT_36 = ")" + NL + "    private void scheduledTimeout(final Timer t) {" + NL + "        System.out.println(\"@Schedule called at: \" + new java.util.Date());" + NL + "    }" + NL + "}"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
+
+	public String generate(Object argument)
+  {
+    final StringBuffer stringBuffer = new StringBuffer();
+     AddEjbTimerTemplateModel model = (AddEjbTimerTemplateModel) argument; 
+     /* This Content is provided under the terms and conditions of the Eclipse Public License Version 1.0 
+("EPL"). A copy of the EPL is available at http://www.eclipse.org/org/documents/epl-v10.php 
+For purposes of the EPL, "Program" will mean the Content. 
+
+Copied from org.eclipse.jst.j2ee.ejb plugin. */ 
+    
+	model.removeFlags(CreateJavaEEArtifactTemplateModel.FLAG_QUALIFIED_SUPERCLASS_NAME); 
+
+     /* This Content is provided under the terms and conditions of the Eclipse Public License Version 1.0 
+("EPL"). A copy of the EPL is available at http://www.eclipse.org/org/documents/epl-v10.php 
+For purposes of the EPL, "Program" will mean the Content. 
+
+Copied from org.eclipse.jst.j2ee.ejb plugin. */ 
+    
+	if (model.getJavaPackageName() != null && model.getJavaPackageName().length() > 0) {
+
+    stringBuffer.append(TEXT_1);
+    stringBuffer.append( model.getJavaPackageName() );
+    stringBuffer.append(TEXT_2);
+    
+	}
+
+    stringBuffer.append(TEXT_3);
+     /* This Content is provided under the terms and conditions of the Eclipse Public License Version 1.0 
+("EPL"). A copy of the EPL is available at http://www.eclipse.org/org/documents/epl-v10.php 
+For purposes of the EPL, "Program" will mean the Content. 
+
+Copied from org.eclipse.jst.j2ee.ejb plugin. */ 
+     
+	Collection<String> imports = model.getImports();
+	for (String anImport : imports) { 
+
+    stringBuffer.append(TEXT_4);
+    stringBuffer.append( anImport );
+    stringBuffer.append(TEXT_5);
+     
+	}
+
+    stringBuffer.append(TEXT_6);
+     /* This Content is provided under the terms and conditions of the Eclipse Public License Version 1.0 
+("EPL"). A copy of the EPL is available at http://www.eclipse.org/org/documents/epl-v10.php 
+For purposes of the EPL, "Program" will mean the Content. 
+
+Copied from org.eclipse.jst.j2ee.ejb plugin. */ 
+    
+	if (model.isPublic()) { 
+
+    stringBuffer.append(TEXT_7);
+     
+	} 
+
+	if (model.isAbstract()) { 
+
+    stringBuffer.append(TEXT_8);
+    
+	}
+
+	if (model.isFinal()) {
+
+    stringBuffer.append(TEXT_9);
+    
+	}
+
+    stringBuffer.append(TEXT_10);
+    stringBuffer.append( model.getClassName() );
+    
+	String superClass = model.getSuperclassName();
+ 	if (superClass != null && superClass.length() > 0) {
+
+    stringBuffer.append(TEXT_11);
+    stringBuffer.append( superClass );
+    
+	}
+
+	List<String> interfaces = model.getInterfaces(); 
+ 	if ( interfaces.size() > 0) { 
+
+    stringBuffer.append(TEXT_12);
+    
+	}
+	
+ 	for (int i = 0; i < interfaces.size(); i++) {
+   		String INTERFACE = interfaces.get(i);
+   		if (i > 0) {
+
+    stringBuffer.append(TEXT_13);
+    
+		}
+
+    stringBuffer.append( INTERFACE );
+    
+	}
+
+    stringBuffer.append(TEXT_14);
+     /* This Content is provided under the terms and conditions of the Eclipse Public License Version 1.0 
+("EPL"). A copy of the EPL is available at http://www.eclipse.org/org/documents/epl-v10.php 
+For purposes of the EPL, "Program" will mean the Content. 
+
+Copied from org.eclipse.jst.j2ee.ejb plugin. */ 
+     
+	if (!model.hasEmptySuperclassConstructor()) { 
+
+    stringBuffer.append(TEXT_15);
+    stringBuffer.append( model.getClassName() );
+    stringBuffer.append(TEXT_16);
+     
+	} 
+
+	if (model.shouldGenSuperclassConstructors()) {
+		List<Constructor> constructors = model.getConstructors();
+		for (Constructor constructor : constructors) {
+			if (constructor.isPublic() || constructor.isProtected()) { 
+
+    stringBuffer.append(TEXT_17);
+    stringBuffer.append( model.getSuperclassName() );
+    stringBuffer.append(TEXT_18);
+    stringBuffer.append( model.getSuperclassName() );
+    stringBuffer.append(TEXT_19);
+    stringBuffer.append( constructor.getParamsForJavadoc() );
+    stringBuffer.append(TEXT_20);
+    stringBuffer.append( model.getClassName() );
+    stringBuffer.append(TEXT_21);
+    stringBuffer.append( constructor.getParamsForDeclaration() );
+    stringBuffer.append(TEXT_22);
+    stringBuffer.append( constructor.getParamsForCall() );
+    stringBuffer.append(TEXT_23);
+    
+			} 
+		} 
+	} 
+
+     /* This Content is provided under the terms and conditions of the Eclipse Public License Version 1.0 
+("EPL"). A copy of the EPL is available at http://www.eclipse.org/org/documents/epl-v10.php 
+For purposes of the EPL, "Program" will mean the Content. 
+
+Copied from org.eclipse.jst.j2ee.ejb plugin. */ 
+    
+	if (model.shouldImplementAbstractMethods()) {
+		for (Method method : model.getUnimplementedMethods()) { 
+
+    stringBuffer.append(TEXT_24);
+    stringBuffer.append( method.getContainingJavaClass() );
+    stringBuffer.append(TEXT_25);
+    stringBuffer.append( method.getName() );
+    stringBuffer.append(TEXT_26);
+    stringBuffer.append( method.getParamsForJavadoc() );
+    stringBuffer.append(TEXT_27);
+    stringBuffer.append( method.getReturnType() );
+    stringBuffer.append(TEXT_28);
+    stringBuffer.append( method.getName() );
+    stringBuffer.append(TEXT_29);
+    stringBuffer.append( method.getParamsForDeclaration() );
+    stringBuffer.append(TEXT_30);
+     
+			String defaultReturnValue = method.getDefaultReturnValue();
+			if (defaultReturnValue != null) { 
+
+    stringBuffer.append(TEXT_31);
+    stringBuffer.append( defaultReturnValue );
+    stringBuffer.append(TEXT_32);
+    
+			} 
+
+    stringBuffer.append(TEXT_33);
+     
+		}
+	} 
+
+    stringBuffer.append(TEXT_34);
+    
+		StringBuilder schedule = new StringBuilder(model.getProperty(AddEjbTimerDataModelProvider.SCHEDULE));
+		if (model.isNonPersistent()) {
+			schedule.append(", persistent=false"); //$NON-NLS-1$
+		}
+	
+    stringBuffer.append(TEXT_35);
+    stringBuffer.append( schedule.toString().trim() );
+    stringBuffer.append(TEXT_36);
+    return stringBuffer.toString();
+  }
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/INewEnterpriseBeanClassDataModelProperties.java b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/INewEnterpriseBeanClassDataModelProperties.java
new file mode 100644
index 0000000..731c5a8
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/INewEnterpriseBeanClassDataModelProperties.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 SAP AG 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:
+ * Kaloyan Raev, kaloyan.raev@sap.com - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.ejb.internal.operations;
+
+import org.eclipse.jst.j2ee.application.internal.operations.IAnnotationsDataModel;
+import org.eclipse.jst.j2ee.internal.common.operations.INewJavaClassDataModelProperties;
+
+public interface INewEnterpriseBeanClassDataModelProperties extends INewJavaClassDataModelProperties, IAnnotationsDataModel {
+	
+		
+	/**
+	 * Required, String property of the EJB name for the enterprise bean. 
+	 */
+	public static final String EJB_NAME = "INewEnterpriseBeanClassDataModelProperties.EJB_NAME"; //$NON-NLS-1$
+
+	/**
+	 * Optional, String property of the EJB mapped name for the enterprise bean. 
+	 */
+	public static final String MAPPED_NAME = "INewEnterpriseBeanClassDataModelProperties.MAPPED_NAME"; //$NON-NLS-1$
+
+	/**
+	 * Required, String property that determines the transaction type of the
+	 * enterprise bean. Valid values are the string representation of the
+	 * <code>TransactionType<code> enumeration.
+	 * 
+	 * @see TransactionType
+	 */
+	public static final String TRANSACTION_TYPE = "INewEnterpriseBeanClassDataModelProperties.TRANSACTION_TYPE"; //$NON-NLS-1$
+	
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/INewMessageDrivenBeanClassDataModelProperties.java b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/INewMessageDrivenBeanClassDataModelProperties.java
new file mode 100644
index 0000000..aa4216c
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/INewMessageDrivenBeanClassDataModelProperties.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2008 SAP AG 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:
+ * Kaloyan Raev, kaloyan.raev@sap.com - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.ejb.internal.operations;
+
+public interface INewMessageDrivenBeanClassDataModelProperties extends
+		INewEnterpriseBeanClassDataModelProperties {
+
+	/**
+	 * Optional, boolean property used to specify whether to generate a JMS
+	 * interface. The default is false.
+	 */
+	public static final String JMS = "INewMessageDrivenBeanClassDataModelProperties.JMS"; //$NON-NLS-1$
+
+	/**
+	 * Required, <code>DestinationType</code> enumeration property that
+	 * determines the destination type of the message-driven bean. The default
+	 * is <code>DestinationType.QUEUE</code>.
+	 * 
+	 * @see DestinationType
+	 */
+	public static final String DESTINATION_TYPE = "INewMessageDrivenBeanClassDataModelProperties.DESTINATION_TYPE"; //$NON-NLS-1$
+
+	/**
+	 * Required, String property used to specify the fully qualified name of the
+	 * message listener interface of the message-driven bean.
+	 * 
+	 * <p>
+	 * There is no default value. If the JMS property is set to
+	 * <code>true</code>, then this property is automatically set to
+	 * <code>javax.jms.MessageListener</code>. 
+	 * </p>
+	 */
+	public static final String MESSAGE_LISTENER_INTERFACE = "INewMessageDrivenBeanClassDataModelProperties.MESSAGE_LISTENER_INTERFACE"; //$NON-NLS-1$
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/INewSessionBeanClassDataModelProperties.java b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/INewSessionBeanClassDataModelProperties.java
new file mode 100644
index 0000000..04b6afd
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/INewSessionBeanClassDataModelProperties.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2014 SAP AG 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:
+ * Kaloyan Raev, kaloyan.raev@sap.com - initial API and implementation
+ * Roberto Sanchez, rsanchez@mx1.ibm.com - Add remote and local annotations to bean class
+ * IBM - Async and Non-persistent support
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.ejb.internal.operations;
+
+public interface INewSessionBeanClassDataModelProperties extends INewEnterpriseBeanClassDataModelProperties {
+	
+	public static final String REMOTE_BUSINESS_INTERFACE = "INewSessionBeanClassDataModelProperties.REMOTE_BUSINESS_INTERFACE"; //$NON-NLS-1$
+	
+	public static final String LOCAL_BUSINESS_INTERFACE = "INewSessionBeanClassDataModelProperties.LOCAL_BUSINESS_INTERFACE"; //$NON-NLS-1$
+
+	public static final String REMOTE_HOME_INTERFACE = "INewSessionBeanClassDataModelProperties.REMOTE_HOME_INTERFACE"; //$NON-NLS-1$
+	
+	public static final String LOCAL_HOME_INTERFACE = "INewSessionBeanClassDataModelProperties.LOCAL_HOME_INTERFACE"; //$NON-NLS-1$
+	
+	public static final String LOCAL_COMPONENT_INTERFACE = "INewSessionBeanClassDataModelProperties.LOCAL_COMPONENT_INTERFACE"; //$NON-NLS-1$
+	
+	public static final String REMOTE_COMPONENT_INTERFACE = "INewSessionBeanClassDataModelProperties.REMOTE_COMPONENT_INTERFACE"; //$NON-NLS-1$
+	
+	/**
+	 * Optional, boolean property used to specify whether to generate a remote
+	 * business interface. The default is false.
+	 */
+	public static final String REMOTE = "INewSessionBeanClassDataModelProperties.REMOTE"; //$NON-NLS-1$
+
+	/**
+	 * Optional, boolean property used to specify whether to generate a local
+	 * business interface. The default is true for EJB 3.0 projects, otherwise -
+	 * false.
+	 */
+	public static final String LOCAL = "INewSessionBeanClassDataModelProperties.LOCAL"; //$NON-NLS-1$
+
+	/**
+	 * Optional, boolean property used to specify whether to generate a
+	 * no-interface client view. The default is true for EJB 3.1 projects and
+	 * later, otherwise - false.
+	 * 
+	 * @since 3.2
+	 */
+	public static final String NO_INTERFACE = "INewSessionBeanClassDataModelProperties.NO_INTERFACE"; //$NON-NLS-1$
+	
+	/**
+	 * Optional, boolean property used to specify whether to generate a EJB 2.x
+	 * compatible local home and components interfaces. The default is false.
+	 */
+	public static final String LOCAL_HOME = "INewSessionBeanClassDataModelProperties.LOCAL_HOME"; //$NON-NLS-1$
+	
+	/**
+	 * Optional, boolean property used to specify whether to generate a EJB 2.x
+	 * compatible remote home and components interfaces. The default is false.
+	 */
+	public static final String REMOTE_HOME = "INewSessionBeanClassDataModelProperties.REMOTE_HOME"; //$NON-NLS-1$
+
+	/**
+	 * Required, String property that determines the state type of the session
+	 * bean. Valid values are the string representation of the
+	 * <code>StateType<code> enumeration.
+	 * 
+	 * @see StateType
+	 */
+	public static final String STATE_TYPE = "INewSessionBeanClassDataModelProperties.STATE_TYPE"; //$NON-NLS-1$
+	
+	public static final String BUSINESS_INTERFACE_ANNOTATION_LOCATION = "INewSessionBeanClassDataModelProperties.BUSINESS_INTERFACE_ANNOTATION_LOCATION"; //$NON-NLS-1$
+	
+	/**
+	 * Optional, boolean property used to specify whether add the Asynchronous annotation to the class definition or not. 
+	 * The default value is false.
+	 * 
+	 * @since 3.6
+	 */
+	public static final String ASYNC = "INewSessionBeanClassDataModelProperties.ASYNC"; //$NON-NLS-1$
+	
+	/**
+	 * Optional, boolean property used to specify whether to define the timer as non-persistent or not.
+	 * The default value is false.
+	 * 
+	 * @since 3.6
+	 */
+	public static final String NON_PERSISTENT = "INewSessionBeanClassDataModelProperties.NON_PERSISTENT"; //$NON-NLS-1$
+	
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/LocalBusinessInterfaceTemplate.java b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/LocalBusinessInterfaceTemplate.java
new file mode 100644
index 0000000..bdfad51
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/LocalBusinessInterfaceTemplate.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2012 SAP AG 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
+ *
+ * This class has been generated from a javajet template. 
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.ejb.internal.operations;
+
+public class LocalBusinessInterfaceTemplate
+{
+  protected static String nl;
+  public static synchronized LocalBusinessInterfaceTemplate create(String lineSeparator)
+  {
+    nl = lineSeparator;
+    LocalBusinessInterfaceTemplate result = new LocalBusinessInterfaceTemplate();
+    nl = null;
+    return result;
+  }
+
+  public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl; //$NON-NLS-1$
+  protected final String TEXT_1 = "package "; //$NON-NLS-1$
+  protected final String TEXT_2 = ";"; //$NON-NLS-1$
+  protected final String TEXT_3 = NL;
+  protected final String TEXT_4 = NL + "import javax.ejb.Local;" + NL + "" + NL + "@Local"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+  protected final String TEXT_5 = NL + "public interface "; //$NON-NLS-1$
+  protected final String TEXT_6 = " {" + NL + "" + NL + "}"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+  protected final String TEXT_7 = NL;
+
+  public String generate(Object argument)
+  {
+    final StringBuffer stringBuffer = new StringBuffer();
+     CreateSessionBeanTemplateModel model = (CreateSessionBeanTemplateModel) argument; 
+    
+	if (model.getBusinessInterfaceJavaPackageName() != null && model.getBusinessInterfaceJavaPackageName().length() > 0) {
+
+    stringBuffer.append(TEXT_1);
+    stringBuffer.append(model.getBusinessInterfaceJavaPackageName());
+    stringBuffer.append(TEXT_2);
+    
+	}
+
+    stringBuffer.append(TEXT_3);
+    
+	if (model.addBusinessAnnotationToInterface()) {
+
+    stringBuffer.append(TEXT_4);
+    
+	}
+
+    stringBuffer.append(TEXT_5);
+    stringBuffer.append(model.getBusinessInterfaceClassName());
+    stringBuffer.append(TEXT_6);
+    stringBuffer.append(TEXT_7);
+    return stringBuffer.toString();
+  }
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/LocalComponentInterfaceTemplate.java b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/LocalComponentInterfaceTemplate.java
new file mode 100644
index 0000000..d86dd75
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/LocalComponentInterfaceTemplate.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2012 SAP AG 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
+ *
+ * This class has been generated from a javajet template. 
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.ejb.internal.operations;
+
+public class LocalComponentInterfaceTemplate
+{
+  protected static String nl;
+  public static synchronized LocalComponentInterfaceTemplate create(String lineSeparator)
+  {
+    nl = lineSeparator;
+    LocalComponentInterfaceTemplate result = new LocalComponentInterfaceTemplate();
+    nl = null;
+    return result;
+  }
+
+  public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl; //$NON-NLS-1$
+  protected final String TEXT_1 = "package "; //$NON-NLS-1$
+  protected final String TEXT_2 = ";"; //$NON-NLS-1$
+  protected final String TEXT_3 = NL + NL + "import javax.ejb.EJBLocalObject;" + NL + "" + NL + "public interface "; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+  protected final String TEXT_4 = " extends EJBLocalObject {" + NL + "" + NL + "}"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+  protected final String TEXT_5 = NL;
+
+  public String generate(Object argument)
+  {
+    final StringBuffer stringBuffer = new StringBuffer();
+     CreateSessionBeanTemplateModel model = (CreateSessionBeanTemplateModel) argument; 
+    
+	if (model.getLocalComponentPackage() != null && model.getLocalComponentPackage().length() > 0) {
+
+    stringBuffer.append(TEXT_1);
+    stringBuffer.append(model.getLocalComponentPackage());
+    stringBuffer.append(TEXT_2);
+    
+	}
+
+    stringBuffer.append(TEXT_3);
+    stringBuffer.append( model.getLocalComponentClassSimpleName() );
+    stringBuffer.append(TEXT_4);
+    stringBuffer.append(TEXT_5);
+    return stringBuffer.toString();
+  }
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/LocalHomeInterfaceTemplate.java b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/LocalHomeInterfaceTemplate.java
new file mode 100644
index 0000000..89bbbb1
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/LocalHomeInterfaceTemplate.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2011 SAP AG 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
+ *
+ * This class has been generated from a javajet template. 
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.ejb.internal.operations;
+
+public class LocalHomeInterfaceTemplate
+{
+  protected static String nl;
+  public static synchronized LocalHomeInterfaceTemplate create(String lineSeparator)
+  {
+    nl = lineSeparator;
+    LocalHomeInterfaceTemplate result = new LocalHomeInterfaceTemplate();
+    nl = null;
+    return result;
+  }
+
+  public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl; //$NON-NLS-1$
+  protected final String TEXT_1 = "package "; //$NON-NLS-1$
+  protected final String TEXT_2 = ";"; //$NON-NLS-1$
+  protected final String TEXT_3 = NL + "" + NL + "import javax.ejb.CreateException;" + NL + "import javax.ejb.EJBLocalHome;"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+  protected final String TEXT_4 = NL + "import "; //$NON-NLS-1$
+  protected final String TEXT_5 = "."; //$NON-NLS-1$
+  protected final String TEXT_6 = ";"; //$NON-NLS-1$
+  protected final String TEXT_7 = NL + NL + "public interface "; //$NON-NLS-1$
+  protected final String TEXT_8 = " extends EJBLocalHome {" + NL + "" + NL + "\tpublic "; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+  protected final String TEXT_9 = " create() throws CreateException;" + NL + "\t" + NL + "}"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+  protected final String TEXT_10 = NL;
+
+  public String generate(Object argument)
+  {
+    final StringBuffer stringBuffer = new StringBuffer();
+     CreateSessionBeanTemplateModel model = (CreateSessionBeanTemplateModel) argument; 
+    
+	if (model.getLocalHomePackage() != null && model.getLocalHomePackage().length() > 0) {
+
+    stringBuffer.append(TEXT_1);
+    stringBuffer.append(model.getLocalHomePackage());
+    stringBuffer.append(TEXT_2);
+    
+	}
+
+    stringBuffer.append(TEXT_3);
+     if(!model.getLocalComponentPackage().equals(model.getLocalHomePackage())){
+    stringBuffer.append(TEXT_4);
+    stringBuffer.append( model.getLocalComponentPackage());
+    stringBuffer.append(TEXT_5);
+    stringBuffer.append( model.getLocalComponentClassSimpleName());
+    stringBuffer.append(TEXT_6);
+    }
+    stringBuffer.append(TEXT_7);
+    stringBuffer.append(model.getLocalHomeClassSimpleName());
+    stringBuffer.append(TEXT_8);
+    stringBuffer.append( model.getLocalComponentClassSimpleName() );
+    stringBuffer.append(TEXT_9);
+    stringBuffer.append(TEXT_10);
+    return stringBuffer.toString();
+  }
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/MessageDrivenBeanTemplate.java b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/MessageDrivenBeanTemplate.java
new file mode 100644
index 0000000..54cf1a5
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/MessageDrivenBeanTemplate.java
@@ -0,0 +1,309 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2011 SAP AG 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
+ *
+ * This class has been generated from a javajet template. 
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.ejb.internal.operations;
+
+import java.util.*;
+import org.eclipse.jst.j2ee.internal.common.operations.*;
+
+public class MessageDrivenBeanTemplate
+{
+  protected static String nl;
+  public static synchronized MessageDrivenBeanTemplate create(String lineSeparator)
+  {
+    nl = lineSeparator;
+    MessageDrivenBeanTemplate result = new MessageDrivenBeanTemplate();
+    nl = null;
+    return result;
+  }
+
+  public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl; //$NON-NLS-1$
+  protected final String TEXT_1 = "package "; //$NON-NLS-1$
+  protected final String TEXT_2 = ";"; //$NON-NLS-1$
+  protected final String TEXT_3 = NL;
+  protected final String TEXT_4 = NL + "import "; //$NON-NLS-1$
+  protected final String TEXT_5 = ";"; //$NON-NLS-1$
+  protected final String TEXT_6 = NL;
+  protected final String TEXT_7 = NL;
+  protected final String TEXT_8 = "/**" + NL + " * Message-Driven Bean implementation class for: "; //$NON-NLS-1$ //$NON-NLS-2$
+  protected final String TEXT_9 = NL + " */" + NL + "@MessageDriven"; //$NON-NLS-1$ //$NON-NLS-2$
+  protected final String TEXT_10 = "("; //$NON-NLS-1$
+  protected final String TEXT_11 = NL + "\t\tactivationConfig = { "; //$NON-NLS-1$
+  protected final String TEXT_12 = ", "; //$NON-NLS-1$
+  protected final String TEXT_13 = "@ActivationConfigProperty(" + NL + "\t\t\t\tpropertyName = \""; //$NON-NLS-1$ //$NON-NLS-2$
+  protected final String TEXT_14 = "\", propertyValue = \""; //$NON-NLS-1$
+  protected final String TEXT_15 = "\")"; //$NON-NLS-1$
+  protected final String TEXT_16 = NL + "\t\t}"; //$NON-NLS-1$
+  protected final String TEXT_17 = ", "; //$NON-NLS-1$
+  protected final String TEXT_18 = NL + "\t\t"; //$NON-NLS-1$
+  protected final String TEXT_19 = " = "; //$NON-NLS-1$
+  protected final String TEXT_20 = ")"; //$NON-NLS-1$
+  protected final String TEXT_21 = NL + "@TransactionManagement(TransactionManagementType.BEAN)"; //$NON-NLS-1$
+  protected final String TEXT_22 = NL + "public "; //$NON-NLS-1$
+  protected final String TEXT_23 = "abstract "; //$NON-NLS-1$
+  protected final String TEXT_24 = "final "; //$NON-NLS-1$
+  protected final String TEXT_25 = "class "; //$NON-NLS-1$
+  protected final String TEXT_26 = " extends "; //$NON-NLS-1$
+  protected final String TEXT_27 = " implements "; //$NON-NLS-1$
+  protected final String TEXT_28 = ", "; //$NON-NLS-1$
+  protected final String TEXT_29 = " {"; //$NON-NLS-1$
+  protected final String TEXT_30 = NL + NL + "    /**" + NL + "     * Default constructor. " + NL + "     */" + NL + "    public "; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+  protected final String TEXT_31 = "() {" + NL + "        // TODO Auto-generated constructor stub" + NL + "    }"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+  protected final String TEXT_32 = NL + "       " + NL + "    /**" + NL + "     * @see "; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+  protected final String TEXT_33 = "#"; //$NON-NLS-1$
+  protected final String TEXT_34 = "("; //$NON-NLS-1$
+  protected final String TEXT_35 = ")" + NL + "     */" + NL + "    public "; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+  protected final String TEXT_36 = "("; //$NON-NLS-1$
+  protected final String TEXT_37 = ") {" + NL + "        super("; //$NON-NLS-1$ //$NON-NLS-2$
+  protected final String TEXT_38 = ");" + NL + "        // TODO Auto-generated constructor stub" + NL + "    }"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+  protected final String TEXT_39 = NL + NL + "\t/**" + NL + "     * @see "; //$NON-NLS-1$ //$NON-NLS-2$
+  protected final String TEXT_40 = "#"; //$NON-NLS-1$
+  protected final String TEXT_41 = "("; //$NON-NLS-1$
+  protected final String TEXT_42 = ")" + NL + "     */" + NL + "    public "; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+  protected final String TEXT_43 = " "; //$NON-NLS-1$
+  protected final String TEXT_44 = "("; //$NON-NLS-1$
+  protected final String TEXT_45 = ") {" + NL + "        // TODO Auto-generated method stub"; //$NON-NLS-1$ //$NON-NLS-2$
+  protected final String TEXT_46 = NL + "\t\t\treturn "; //$NON-NLS-1$
+  protected final String TEXT_47 = ";"; //$NON-NLS-1$
+  protected final String TEXT_48 = NL + "    }"; //$NON-NLS-1$
+  protected final String TEXT_49 = NL + "\t" + NL + "\t/**" + NL + "     * @see MessageListener#onMessage(Message)" + NL + "     */" + NL + "    public void onMessage(Message message) {" + NL + "        // TODO Auto-generated method stub" + NL + "        " + NL + "    }"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
+  protected final String TEXT_50 = NL + NL + "}"; //$NON-NLS-1$
+  protected final String TEXT_51 = NL;
+
+  public String generate(Object argument)
+  {
+    final StringBuffer stringBuffer = new StringBuffer();
+     CreateMessageDrivenBeanTemplateModel model = (CreateMessageDrivenBeanTemplateModel) argument; 
+    
+	model.removeFlags(CreateJavaEEArtifactTemplateModel.FLAG_QUALIFIED_SUPERCLASS_NAME); 
+
+    
+	if (model.getJavaPackageName() != null && model.getJavaPackageName().length() > 0) {
+
+    stringBuffer.append(TEXT_1);
+    stringBuffer.append( model.getJavaPackageName() );
+    stringBuffer.append(TEXT_2);
+    
+	}
+
+    stringBuffer.append(TEXT_3);
+     
+	Collection<String> imports = model.getImports();
+	for (String anImport : imports) { 
+
+    stringBuffer.append(TEXT_4);
+    stringBuffer.append( anImport );
+    stringBuffer.append(TEXT_5);
+     
+	}
+
+    stringBuffer.append(TEXT_6);
+    stringBuffer.append(TEXT_7);
+    stringBuffer.append(TEXT_8);
+    stringBuffer.append(model.getClassName());
+    stringBuffer.append(TEXT_9);
+    
+	Map<String, Object> params = model.getClassAnnotationParams();
+	if (!params.isEmpty()) { 
+
+    stringBuffer.append(TEXT_10);
+    
+		boolean needComma = false;
+		boolean needNewLine = false;
+		Map<String, String> activationConfigProperties = (Map<String, String>) params.get(CreateMessageDrivenBeanTemplateModel.ATT_ACTIVATION_CONFIG);
+		if (activationConfigProperties.size() > 0) {
+
+    stringBuffer.append(TEXT_11);
+    
+			Set<String> props = activationConfigProperties.keySet();
+			for (String prop : props) {
+				if (needComma) {
+
+    stringBuffer.append(TEXT_12);
+    
+				}
+				
+				String value = activationConfigProperties.get(prop);
+
+    stringBuffer.append(TEXT_13);
+    stringBuffer.append( prop );
+    stringBuffer.append(TEXT_14);
+    stringBuffer.append( value );
+    stringBuffer.append(TEXT_15);
+    				
+				needComma = true;
+			}
+
+    stringBuffer.append(TEXT_16);
+    
+			needNewLine = true;
+		}
+		
+		Set<String> keys = params.keySet();
+		for (String key : keys) {
+			Object obj = params.get(key);
+			if (obj instanceof String) {
+				if (needComma) { 
+
+    stringBuffer.append(TEXT_17);
+    
+					if (needNewLine) {
+
+    stringBuffer.append(TEXT_18);
+    
+					}
+				}
+				String value = (String) obj;
+
+    stringBuffer.append( key );
+    stringBuffer.append(TEXT_19);
+    stringBuffer.append( value );
+    
+			}
+			needComma = true;
+		} 
+
+    stringBuffer.append(TEXT_20);
+    
+	}
+	
+	if (!model.isContainerType()) {
+
+    stringBuffer.append(TEXT_21);
+    
+	}
+
+    
+	if (model.isPublic()) { 
+
+    stringBuffer.append(TEXT_22);
+     
+	} 
+
+	if (model.isAbstract()) { 
+
+    stringBuffer.append(TEXT_23);
+    
+	}
+
+	if (model.isFinal()) {
+
+    stringBuffer.append(TEXT_24);
+    
+	}
+
+    stringBuffer.append(TEXT_25);
+    stringBuffer.append( model.getClassName() );
+    
+	String superClass = model.getSuperclassName();
+ 	if (superClass != null && superClass.length() > 0) {
+
+    stringBuffer.append(TEXT_26);
+    stringBuffer.append( superClass );
+    
+	}
+
+	List<String> interfaces = model.getInterfaces(); 
+ 	if ( interfaces.size() > 0) { 
+
+    stringBuffer.append(TEXT_27);
+    
+	}
+	
+ 	for (int i = 0; i < interfaces.size(); i++) {
+   		String INTERFACE = interfaces.get(i);
+   		if (i > 0) {
+
+    stringBuffer.append(TEXT_28);
+    
+		}
+
+    stringBuffer.append( INTERFACE );
+    
+	}
+
+    stringBuffer.append(TEXT_29);
+     
+	if (!model.hasEmptySuperclassConstructor()) { 
+
+    stringBuffer.append(TEXT_30);
+    stringBuffer.append( model.getClassName() );
+    stringBuffer.append(TEXT_31);
+     
+	} 
+
+	if (model.shouldGenSuperclassConstructors()) {
+		List<Constructor> constructors = model.getConstructors();
+		for (Constructor constructor : constructors) {
+			if (constructor.isPublic() || constructor.isProtected()) { 
+
+    stringBuffer.append(TEXT_32);
+    stringBuffer.append( model.getSuperclassName() );
+    stringBuffer.append(TEXT_33);
+    stringBuffer.append( model.getSuperclassName() );
+    stringBuffer.append(TEXT_34);
+    stringBuffer.append( constructor.getParamsForJavadoc() );
+    stringBuffer.append(TEXT_35);
+    stringBuffer.append( model.getClassName() );
+    stringBuffer.append(TEXT_36);
+    stringBuffer.append( constructor.getParamsForDeclaration() );
+    stringBuffer.append(TEXT_37);
+    stringBuffer.append( constructor.getParamsForCall() );
+    stringBuffer.append(TEXT_38);
+    
+			} 
+		} 
+	} 
+
+    
+	if (model.shouldImplementAbstractMethods()) {
+		for (Method method : model.getUnimplementedMethods()) { 
+
+    stringBuffer.append(TEXT_39);
+    stringBuffer.append( method.getContainingJavaClass() );
+    stringBuffer.append(TEXT_40);
+    stringBuffer.append( method.getName() );
+    stringBuffer.append(TEXT_41);
+    stringBuffer.append( method.getParamsForJavadoc() );
+    stringBuffer.append(TEXT_42);
+    stringBuffer.append( method.getReturnType() );
+    stringBuffer.append(TEXT_43);
+    stringBuffer.append( method.getName() );
+    stringBuffer.append(TEXT_44);
+    stringBuffer.append( method.getParamsForDeclaration() );
+    stringBuffer.append(TEXT_45);
+     
+			String defaultReturnValue = method.getDefaultReturnValue();
+			if (defaultReturnValue != null) { 
+
+    stringBuffer.append(TEXT_46);
+    stringBuffer.append( defaultReturnValue );
+    stringBuffer.append(TEXT_47);
+    
+			} 
+
+    stringBuffer.append(TEXT_48);
+     
+		}
+	} 
+
+    
+	if (model.shouldImplementAbstractMethods()) {
+		if (model.isJMS()) { 
+
+    stringBuffer.append(TEXT_49);
+    
+		}
+	}
+
+    stringBuffer.append(TEXT_50);
+    stringBuffer.append(TEXT_51);
+    return stringBuffer.toString();
+  }
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/NewEnterpriseBeanClassDataModelProvider.java b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/NewEnterpriseBeanClassDataModelProvider.java
new file mode 100644
index 0000000..c6f3f44
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/NewEnterpriseBeanClassDataModelProvider.java
@@ -0,0 +1,235 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2014 SAP AG 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:
+ * Kaloyan Raev, kaloyan.raev@sap.com - initial API and implementation
+ * IBM - Async and Non-persistent support
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.ejb.internal.operations;
+
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewEnterpriseBeanClassDataModelProperties.EJB_NAME;
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewEnterpriseBeanClassDataModelProperties.MAPPED_NAME;
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewEnterpriseBeanClassDataModelProperties.TRANSACTION_TYPE;
+import static org.eclipse.jst.j2ee.internal.common.operations.INewJavaClassDataModelProperties.CLASS_NAME;
+import static org.eclipse.jst.j2ee.internal.common.operations.INewJavaClassDataModelProperties.JAVA_PACKAGE;
+import static org.eclipse.jst.j2ee.internal.common.operations.INewJavaClassDataModelProperties.SUPERCLASS;
+
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jst.j2ee.ejb.internal.plugin.EjbPlugin;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.j2ee.internal.common.J2EEVersionUtil;
+import org.eclipse.jst.j2ee.internal.common.operations.NewJavaClassDataModelProvider;
+import org.eclipse.jst.j2ee.internal.ejb.project.operations.EJBCreationResourceHandler;
+import org.eclipse.jst.j2ee.model.IModelProvider;
+import org.eclipse.jst.j2ee.model.ModelProviderManager;
+import org.eclipse.jst.j2ee.project.JavaEEProjectUtilities;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetConstants;
+import org.eclipse.jst.javaee.ejb.EJBJar;
+import org.eclipse.jst.javaee.ejb.EnterpriseBeans;
+import org.eclipse.jst.javaee.ejb.SessionBean;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelPropertyDescriptor;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider;
+import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
+import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
+
+public class NewEnterpriseBeanClassDataModelProvider extends NewJavaClassDataModelProvider {
+
+	/**
+	 * Subclasses may extend this method to add their own data model's properties as valid base
+	 * properties.
+	 * 
+	 * @see org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider#getPropertyNames()
+	 */
+	@Override
+	public Set<String> getPropertyNames() {
+		// Add Bean specific properties defined in this data model
+		Set<String> propertyNames = super.getPropertyNames();
+
+		propertyNames.add(EJB_NAME);
+		propertyNames.add(MAPPED_NAME);
+		propertyNames.add(TRANSACTION_TYPE);
+
+		return propertyNames;
+	}
+
+	/**
+	 * Subclasses may extend this method to provide their own default values for any of the
+	 * properties in the data model hierarchy. This method does not accept a null parameter. It may
+	 * return null. 
+	 * 
+	 * @see NewJavaClassDataModelProvider#getDefaultProperty(String)
+	 * @see IDataModelProvider#getDefaultProperty(String)
+	 * 
+	 * @param propertyName
+	 * @return Object default value of property
+	 */
+	@Override
+	public Object getDefaultProperty(String propertyName) {
+		if (propertyName.equals(EJB_NAME)) {
+			String className = getStringProperty(CLASS_NAME);
+			int index = className.lastIndexOf("."); //$NON-NLS-1$
+			className = className.substring(index+1);
+			return className;
+		} else if (propertyName.equals(SUPERCLASS)){
+			return ""; //$NON-NLS-1$
+		} else if (propertyName.equals(TRANSACTION_TYPE)) {
+			return TransactionType.CONTAINER.toString();
+		} 
+
+		// Otherwise check super for default value for property
+		return super.getDefaultProperty(propertyName);
+	}
+
+	@Override
+	public IStatus validate(String propertyName) {
+
+		if (propertyName.equals(SUPERCLASS)) {
+			String value = getStringProperty(propertyName);
+			if (value == null || value.trim().length() == 0)
+				return WTPCommonPlugin.OK_STATUS;
+		} else if (propertyName.equals(JAVA_PACKAGE)) {
+			String value = getStringProperty(propertyName);
+			if (value == null || value.trim().length() == 0) {
+				String msg = EJBCreationResourceHandler.Bean_Class_Cannot_Be_In_UI_;
+				return WTPCommonPlugin.createErrorStatus(msg);
+			}
+		} else if (EJB_NAME.equals(propertyName)) {
+			String value = getStringProperty(propertyName).trim();
+			if (value == null || value.trim().length() == 0){
+				return WTPCommonPlugin.createWarningStatus(EJBCreationResourceHandler.WRN_BEAN_NAME_IS_EMPTY);
+			}
+			return validateEjbName();
+		}
+		return super.validate(propertyName);
+	}
+
+	/**
+	 * Subclasses may extend this method to add their own specific behavior when a certain property
+	 * in the data model hierarchy is set. This method does not accept null for the property name,
+	 * but it will for propertyValue. It will not return null. It will return false if the set
+	 * fails. This implementation verifies the display name is set to the classname, that the
+	 * annotations is disabled/enabled properly, and that the target project name is determined from
+	 * the source folder setting.
+	 * 
+	 * @see org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider#propertySet(String,
+	 *      Object)
+	 * 
+	 * @param propertyName
+	 * @param propertyValue
+	 * @return boolean was property set?
+	 */
+	@Override
+	public boolean propertySet(String propertyName, Object propertyValue) {
+
+		// Call super to set the property on the data model
+		boolean result = super.propertySet(propertyName, propertyValue);
+		// If class name is changed, update the display name to be the same
+		if (propertyName.equals(CLASS_NAME) && !getDataModel().isPropertySet(EJB_NAME)) {
+			getDataModel().notifyPropertyChange(EJB_NAME, IDataModel.DEFAULT_CHG);
+		}
+		return result;
+	}
+	
+	@Override
+	public DataModelPropertyDescriptor[] getValidPropertyDescriptors(String propertyName) {
+		if (propertyName.equals(TRANSACTION_TYPE)) {
+			return DataModelPropertyDescriptor.createDescriptors(
+					new String[] { 
+							TransactionType.CONTAINER.toString(), 
+							TransactionType.BEAN.toString()
+					}, 
+					new String[] {
+							EJBCreationResourceHandler.TRANSACTION_TYPE_CONTAINER, 
+							EJBCreationResourceHandler.TRANSACTION_TYPE_BEAN
+					});
+		} 
+		
+		return super.getValidPropertyDescriptors(propertyName);
+	}
+
+	protected IStatus validateEjbName() {
+		// check if an EJB with the same name already exists
+		String projectName = getStringProperty(PROJECT_NAME);
+		if (projectName != null && projectName.length() > 0) {
+			IProject project = getTargetProject();
+			if (JavaEEProjectUtilities.isEJBProject(project))
+			{
+				IModelProvider provider = ModelProviderManager.getModelProvider(ResourcesPlugin.getWorkspace().getRoot().getProject(projectName));
+				EJBJar modelObject = (EJBJar) provider.getModelObject();
+				EnterpriseBeans enterpriseBeans = modelObject.getEnterpriseBeans();
+				if (enterpriseBeans != null)
+				{
+					List sessionBeans = enterpriseBeans.getSessionBeans();
+					for (Object object : sessionBeans) {
+						SessionBean session = (SessionBean) object;
+						if ((session.getEjbName() != null && getDataModel().getStringProperty(EJB_NAME) != null) && 
+						        session.getEjbName().equals(getDataModel().getStringProperty(EJB_NAME).trim())){
+							return new Status(IStatus.ERROR, EjbPlugin.PLUGIN_ID, EJBCreationResourceHandler.ERR_BEAN_ALREADY_EXISTS);
+						}
+					}
+				}
+			}
+			// TODO - load/check the validity of the name in a web project/ web fragment
+		}
+		return Status.OK_STATUS;
+	}
+
+	// constant array used for version tolerance: EJB version, Web version, Web Fragment version
+	private static final int EJB31_VERSIONS[] = {J2EEVersionConstants.VERSION_3_1, J2EEVersionConstants.VERSION_3_0, J2EEVersionConstants.VERSION_3_0};
+	private static final int EJB32_VERSIONS[] = {J2EEVersionConstants.VERSION_3_2, J2EEVersionConstants.VERSION_3_1, J2EEVersionConstants.VERSION_3_1};
+
+	protected boolean ejb3xOrLater(int ejbVersion) {
+		boolean retVal = false;
+		IProject project = getTargetProject();
+		// default to EJB 31
+		int ejbVersions[] = EJB31_VERSIONS;
+		IProjectFacetVersion facetVersion = null;
+		int versionToCheck = ejbVersion;
+
+		switch (ejbVersion) {
+			case J2EEVersionConstants.VERSION_3_1:
+				ejbVersions = EJB31_VERSIONS;
+				break;
+			case J2EEVersionConstants.VERSION_3_2:
+				ejbVersions = EJB32_VERSIONS;
+				break;
+		}
+
+		if (project != null)
+		{
+			if (JavaEEProjectUtilities.isEJBProject(project))
+			{
+				facetVersion = JavaEEProjectUtilities.getProjectFacetVersion(project, IJ2EEFacetConstants.EJB);
+				versionToCheck = ejbVersions[0];
+			}
+			else if (JavaEEProjectUtilities.isDynamicWebProject(project))
+			{
+				facetVersion = JavaEEProjectUtilities.getProjectFacetVersion(project, IJ2EEFacetConstants.DYNAMIC_WEB);
+				versionToCheck = ejbVersions[1];
+			}
+			else if (JavaEEProjectUtilities.isWebFragmentProject(project))
+			{
+				facetVersion = JavaEEProjectUtilities.getProjectFacetVersion(project, IJ2EEFacetConstants.WEBFRAGMENT);
+				versionToCheck = ejbVersions[2];
+			}
+			if (facetVersion != null)
+			{
+				int version = J2EEVersionUtil.convertVersionStringToInt(facetVersion.getVersionString());
+				retVal = version >= versionToCheck;
+			}
+		}
+		return retVal;
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/NewEnterpriseBeanClassOperation.java b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/NewEnterpriseBeanClassOperation.java
new file mode 100644
index 0000000..55b4fb2
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/NewEnterpriseBeanClassOperation.java
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * Copyright (c) 2008 SAP AG 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:
+ * Kaloyan Raev, kaloyan.raev@sap.com - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.ejb.internal.operations;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.IPackageFragment;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jst.j2ee.internal.common.operations.NewJavaEEArtifactClassOperation;
+import org.eclipse.wst.common.componentcore.internal.operation.ArtifactEditProviderOperation;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+/**
+ * The NewMessageDrivenBeanClassOperation is an IDataModelOperation following the
+ * IDataModel wizard and operation framework.
+ * 
+ * @see org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation
+ * @see org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider
+ * 
+ * It extends ArtifactEditProviderOperation to provide enterprise bean specific java
+ * class generation.
+ * @see org.eclipse.wst.common.componentcore.internal.operation.ArtifactEditProviderOperation
+ * 
+ * This operation is used by the AddMessageDrivenBeanOperation to generate an
+ * non annotated java class for an added enterprise bean. It shares the
+ * NewMessageDrivenBeanClassDataModelProvider with the AddMessageDrivenBeanOperation to store the
+ * appropriate properties required to generate the new message-driven bean.
+ * @see org.eclipse.jst.j2ee.ejb.internal.operations.AddMessageDrivenBeanOperation
+ * @see org.eclipse.jst.j2ee.ejb.internal.operations.NewMessageDrivenBeanClassDataModelProvider
+ * 
+ * A WTPJetEmitter bean template is used to create the class with the bean template. 
+ * @see org.eclipse.jst.j2ee.internal.project.WTPJETEmitter
+ * @see org.eclipse.jst.j2ee.ejb.internal.operations.CreateMessageDrivenBeanTemplateModel
+ * 
+ * Subclasses may extend this operation to provide their own specific bean
+ * java class generation. The execute method may be extended to do so. Also,
+ * generateUsingTemplates is exposed.
+ * 
+ */
+public abstract class NewEnterpriseBeanClassOperation extends NewJavaEEArtifactClassOperation {
+
+	/**
+	 * Constructor taking an IDataModel
+	 * 
+	 * @see ArtifactEditProviderOperation#ArtifactEditProviderOperation(IDataModel)
+	 * @see NewEnterpriseBeanClassOperation
+	 * 
+	 * @param dataModel
+	 * @return NewEnterpriseBeanClassOperation
+	 */
+	public NewEnterpriseBeanClassOperation(IDataModel dataModel) {
+		super(dataModel);
+	}
+
+	protected IFile createJavaFile(IProgressMonitor monitor, IPackageFragment fragment, String source, String localBeanName) throws JavaModelException {
+		if (fragment != null) {
+			ICompilationUnit cu = fragment.getCompilationUnit(localBeanName);
+			// Add the compilation unit to the java file
+			if (cu == null || !cu.exists())
+				cu = fragment.createCompilationUnit(localBeanName, source,
+						true, monitor);
+			return (IFile) cu.getResource();
+		}
+		return null;
+	}
+	
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/NewMessageDrivenBeanClassDataModelProvider.java b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/NewMessageDrivenBeanClassDataModelProvider.java
new file mode 100644
index 0000000..c3fc832
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/NewMessageDrivenBeanClassDataModelProvider.java
@@ -0,0 +1,187 @@
+/*******************************************************************************
+ * Copyright (c) 2008 SAP AG 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:
+ * Kaloyan Raev, kaloyan.raev@sap.com - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.ejb.internal.operations;
+
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewMessageDrivenBeanClassDataModelProperties.DESTINATION_TYPE;
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewMessageDrivenBeanClassDataModelProperties.JMS;
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewMessageDrivenBeanClassDataModelProperties.MESSAGE_LISTENER_INTERFACE;
+import static org.eclipse.jst.j2ee.internal.common.operations.INewJavaClassDataModelProperties.INTERFACES;
+import static org.eclipse.jst.j2ee.internal.common.operations.INewJavaClassDataModelProperties.SUPERCLASS;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jst.j2ee.internal.common.operations.NewJavaClassDataModelProvider;
+import org.eclipse.jst.j2ee.internal.ejb.project.operations.EJBCreationResourceHandler;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelEvent;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelPropertyDescriptor;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider;
+import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
+
+public class NewMessageDrivenBeanClassDataModelProvider extends NewEnterpriseBeanClassDataModelProvider {
+
+	public static final String QUALIFIED_JMS_MESSAGELISTENER = "javax.jms.MessageListener"; //$NON-NLS-1$
+
+	@Override
+	public IDataModelOperation getDefaultOperation() {
+		return new AddMessageDrivenBeanOperation(getDataModel());
+	}
+
+	/**
+	 * Subclasses may extend this method to add their own data model's properties as valid base
+	 * properties.
+	 * 
+	 * @see org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider#getPropertyNames()
+	 */
+	@Override
+	public Set<String> getPropertyNames() {
+		// Add Bean specific properties defined in this data model
+		Set<String> propertyNames = super.getPropertyNames();
+
+		propertyNames.add(DESTINATION_TYPE);
+		propertyNames.add(JMS);
+		propertyNames.add(MESSAGE_LISTENER_INTERFACE);
+
+		return propertyNames;
+	}
+
+	/**
+	 * Subclasses may extend this method to provide their own default values for any of the
+	 * properties in the data model hierarchy. This method does not accept a null parameter. It may
+	 * return null. 
+	 * 
+	 * @see NewJavaClassDataModelProvider#getDefaultProperty(String)
+	 * @see IDataModelProvider#getDefaultProperty(String)
+	 * 
+	 * @param propertyName
+	 * @return Object default value of property
+	 */
+	@Override
+	public Object getDefaultProperty(String propertyName) {
+		if (propertyName.equals(INTERFACES)){
+			List<String> list = new ArrayList<String>();
+			list.add(QUALIFIED_JMS_MESSAGELISTENER);
+			return list;
+		} else if (propertyName.equals(SUPERCLASS)) {
+			return ""; //$NON-NLS-1$
+		} else if (propertyName.equals(JMS)) {
+			return Boolean.TRUE;
+		} else if (propertyName.equals(DESTINATION_TYPE)) {
+			return DestinationType.QUEUE.toString();
+		} else if (propertyName.equals(MESSAGE_LISTENER_INTERFACE)) {
+			return QUALIFIED_JMS_MESSAGELISTENER;
+		}
+		// Otherwise check super for default value for property
+		return super.getDefaultProperty(propertyName);
+	}
+
+	/**
+	 * Subclasses may extend this method to add their own specific behavior when a certain property
+	 * in the data model hierarchy is set. This method does not accept null for the property name,
+	 * but it will for propertyValue. It will not return null. It will return false if the set
+	 * fails. This implementation verifies the display name is set to the classname, that the
+	 * annotations is disabled/enabled properly, and that the target project name is determined from
+	 * the source folder setting.
+	 * 
+	 * @see org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider#propertySet(String,
+	 *      Object)
+	 * 
+	 * @param propertyName
+	 * @param propertyValue
+	 * @return boolean was property set?
+	 */
+	@Override
+	public boolean propertySet(String propertyName, Object propertyValue) {
+		boolean result = false;
+		
+		if (propertyName.equals(JMS)) {
+			updateInterfaces();
+			updateMessageListenerInterfaces();
+			result = true;
+		}
+		
+		if (propertyName.equals(INTERFACES)) {
+			updateMessageListenerInterfaces();
+		}
+		
+		if (propertyName.equals(MESSAGE_LISTENER_INTERFACE)) {
+			boolean needSetJMS = QUALIFIED_JMS_MESSAGELISTENER.equals(propertyValue);
+			if (getDataModel().getBooleanProperty(JMS) != needSetJMS)
+				getDataModel().setProperty(JMS, needSetJMS);
+			result = true;
+		}
+		
+		return result || super.propertySet(propertyName, propertyValue);
+	}
+
+	@Override
+	public DataModelPropertyDescriptor[] getValidPropertyDescriptors(String propertyName) {
+		if (propertyName.equals(DESTINATION_TYPE)) {
+			return DataModelPropertyDescriptor.createDescriptors(
+					new String[] { 
+							DestinationType.QUEUE.toString(), 
+							DestinationType.TOPIC.toString()
+					}, 
+					new String[] {
+							EJBCreationResourceHandler.DESTINATION_TYPE_QUEUE, 
+							EJBCreationResourceHandler.DESTINATION_TYPE_TOPIC
+					});
+		} 
+
+		return super.getValidPropertyDescriptors(propertyName);
+	}
+
+	@Override
+	public IStatus validate(String propertyName) {
+		if (propertyName.equals(MESSAGE_LISTENER_INTERFACE)) {
+			String value = (String) getProperty(MESSAGE_LISTENER_INTERFACE);
+			if (value == null || value.trim().length() == 0){
+				getProperty(INTERFACES);
+				return WTPCommonPlugin.createErrorStatus(EJBCreationResourceHandler.ERR_NO_MESSAGE_LISTENER_INTERFACE);
+			}
+		}
+		return super.validate(propertyName);
+	}
+
+	private void updateInterfaces() {
+		List<String> interfacesList = (List<String>) getDataModel().getProperty(INTERFACES);
+		boolean isJMS = getDataModel().getBooleanProperty(JMS);
+		if (isJMS) {
+			if (!interfacesList.contains(QUALIFIED_JMS_MESSAGELISTENER))
+				interfacesList.add(QUALIFIED_JMS_MESSAGELISTENER);
+		} else {
+			interfacesList.remove(QUALIFIED_JMS_MESSAGELISTENER);
+		}
+		getDataModel().setProperty(INTERFACES, interfacesList);
+		getDataModel().notifyPropertyChange(INTERFACES, DataModelEvent.VALUE_CHG);
+	}
+
+	private void updateMessageListenerInterfaces() {
+		boolean isJMS = getDataModel().getBooleanProperty(JMS);
+		if (isJMS){
+			getDataModel().setProperty(MESSAGE_LISTENER_INTERFACE, QUALIFIED_JMS_MESSAGELISTENER);
+		} else {
+			String value = getStringProperty(MESSAGE_LISTENER_INTERFACE);
+			if (value == null || value.length() == 0 || QUALIFIED_JMS_MESSAGELISTENER.equals(value)) {
+				List<String> interfaces = (List<String>) getProperty(INTERFACES);
+				String messageListenerInterface = ""; //$NON-NLS-1$
+				if (interfaces.size() > 0) {
+					messageListenerInterface = interfaces.get(0);
+				}
+				getDataModel().setProperty(MESSAGE_LISTENER_INTERFACE, messageListenerInterface);
+			}
+		}
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/NewMessageDrivenBeanClassOperation.java b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/NewMessageDrivenBeanClassOperation.java
new file mode 100644
index 0000000..dc9cdc8
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/NewMessageDrivenBeanClassOperation.java
@@ -0,0 +1,122 @@
+/*******************************************************************************
+ * Copyright (c) 2008 SAP AG 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:
+ * Kaloyan Raev, kaloyan.raev@sap.com - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.ejb.internal.operations;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jdt.core.IPackageFragment;
+import org.eclipse.jst.j2ee.ejb.internal.plugin.EjbPlugin;
+import org.eclipse.wst.common.componentcore.internal.operation.ArtifactEditProviderOperation;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.internal.enablement.nonui.WFTWrappedException;
+
+/**
+ * The NewMessageDrivenBeanClassOperation is an IDataModelOperation following the
+ * IDataModel wizard and operation framework.
+ * 
+ * @see org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation
+ * @see org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider
+ * 
+ * It extends ArtifactEditProviderOperation to provide enterprise bean specific java
+ * class generation.
+ * @see org.eclipse.wst.common.componentcore.internal.operation.ArtifactEditProviderOperation
+ * 
+ * This operation is used by the AddMessageDrivenBeanOperation to generate an
+ * non annotated java class for an added enterprise bean. It shares the
+ * NewMessageDrivenBeanClassDataModelProvider with the AddMessageDrivenBeanOperation to store the
+ * appropriate properties required to generate the new message-driven bean.
+ * @see org.eclipse.jst.j2ee.ejb.internal.operations.AddMessageDrivenBeanOperation
+ * @see org.eclipse.jst.j2ee.ejb.internal.operations.NewMessageDrivenBeanClassDataModelProvider
+ * 
+ * A WTPJetEmitter bean template is used to create the class with the bean template. 
+ * @see org.eclipse.jst.j2ee.internal.project.WTPJETEmitter
+ * @see org.eclipse.jst.j2ee.ejb.internal.operations.CreateMessageDrivenBeanTemplateModel
+ * 
+ * Subclasses may extend this operation to provide their own specific bean
+ * java class generation. The execute method may be extended to do so. Also,
+ * generateUsingTemplates is exposed.
+ * 
+ */
+public class NewMessageDrivenBeanClassOperation extends NewEnterpriseBeanClassOperation {
+
+	/**
+	 * folder location of the enterprise bean creation templates directory
+	 */
+	protected static final String TEMPLATE_FILE = "/templates/messageDrivenBean.javajet"; //$NON-NLS-1$
+
+
+	/**
+	 * This is the constructor which should be used when creating a
+	 * NewMessageDrivenBeanClassOperation. An instance of the NewMessageDrivenBeanClassDataModelProvider
+	 * should be passed in. This does not accept null parameter. It will not
+	 * return null.
+	 * 
+	 * @see ArtifactEditProviderOperation#ArtifactEditProviderOperation(IDataModel)
+	 * @see NewMessageDrivenClassDataModel
+	 * 
+	 * @param dataModel
+	 * @return NewMessageDrivenClassOperation
+	 */
+	public NewMessageDrivenBeanClassOperation(IDataModel dataModel) {
+		super(dataModel);
+	}
+
+	/**
+	 * Subclasses may extend this method to provide their own template based
+	 * creation of an annotated bean java class file. This implementation uses
+	 * the creation of a CreateMessageDrivenBeanTemplateModel and the WTPJetEmitter to
+	 * create the java class with the annotated tags. This method accepts null
+	 * for monitor, it does not accept null for fragment. If annotations are not
+	 * being used the tags will be omitted from the class.
+	 * 
+	 * @see CreateMessageDrivenBeanTemplateModel
+	 * @see NewMessageDrivenBeanClassOperation#generateTemplateSource(CreateMessageDrivenBeanTemplateModel,
+	 *      IProgressMonitor)
+	 * 
+	 * @param monitor
+	 * @param fragment
+	 * @throws CoreException
+	 * @throws WFTWrappedException
+	 */
+	@Override
+	protected void generateUsingTemplates(IProgressMonitor monitor, IPackageFragment fragment) throws WFTWrappedException, CoreException {
+		// Create the enterprise bean template model
+		CreateMessageDrivenBeanTemplateModel tempModel = createTemplateModel();
+		// Using the WTPJetEmitter, generate the java source based on the bean template model
+		try {
+			if (fragment != null) {
+				// Create the message-driven bean java file
+				MessageDrivenBeanTemplate tempImpl = MessageDrivenBeanTemplate.create(null);
+				String source = generateTemplateSource(EjbPlugin.getPlugin(), tempModel, TEMPLATE_FILE, tempImpl, monitor);
+				String javaFileName = tempModel.getClassName() + DOT_JAVA;
+				createJavaFile(monitor, fragment, source, javaFileName);
+			}
+		} catch (Exception e) {
+			throw new WFTWrappedException(e);
+		}
+	}
+
+	/**
+	 * This method is intended for internal use only. This method will create an
+	 * instance of the CreateMessageDrivenBeanTemplate model to be used in conjunction
+	 * with the WTPJETEmitter. This method will not return null.
+	 * 
+	 * @see CreateMessageDrivenBeanTemplateModel
+	 * @see NewMessageDrivenBeanClassOperation#generateUsingTemplates(IProgressMonitor,
+	 *      IPackageFragment)
+	 * 
+	 * @return CreateBeanTemplateModel
+	 */
+	private CreateMessageDrivenBeanTemplateModel createTemplateModel() {
+		return new CreateMessageDrivenBeanTemplateModel(model);
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/NewSessionBeanClassDataModelProvider.java b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/NewSessionBeanClassDataModelProvider.java
new file mode 100644
index 0000000..a8d35e5
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/NewSessionBeanClassDataModelProvider.java
@@ -0,0 +1,566 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2014 SAP AG 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:
+ * Kaloyan Raev, kaloyan.raev@sap.com - initial API and implementation
+ * Roberto Sanchez, rsanchez@mx1.ibm.com - Add remote and local annotations to bean class
+ * Roberto Sanchez, rsanchez@mx1.ibm.com - Allow adopter to change default value of package for interfaces
+ * IBM - Async and Non-persistent support
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.ejb.internal.operations;
+
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewSessionBeanClassDataModelProperties.LOCAL;
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewSessionBeanClassDataModelProperties.LOCAL_BUSINESS_INTERFACE;
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewSessionBeanClassDataModelProperties.LOCAL_COMPONENT_INTERFACE;
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewSessionBeanClassDataModelProperties.LOCAL_HOME;
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewSessionBeanClassDataModelProperties.LOCAL_HOME_INTERFACE;
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewSessionBeanClassDataModelProperties.NO_INTERFACE;
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewSessionBeanClassDataModelProperties.ASYNC;
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewSessionBeanClassDataModelProperties.REMOTE;
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewSessionBeanClassDataModelProperties.REMOTE_BUSINESS_INTERFACE;
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewSessionBeanClassDataModelProperties.REMOTE_COMPONENT_INTERFACE;
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewSessionBeanClassDataModelProperties.REMOTE_HOME;
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewSessionBeanClassDataModelProperties.REMOTE_HOME_INTERFACE;
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewSessionBeanClassDataModelProperties.STATE_TYPE;
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewSessionBeanClassDataModelProperties.BUSINESS_INTERFACE_ANNOTATION_LOCATION;
+import static org.eclipse.jst.j2ee.internal.common.operations.INewJavaClassDataModelProperties.CLASS_NAME;
+import static org.eclipse.jst.j2ee.internal.common.operations.INewJavaClassDataModelProperties.INTERFACES;
+import static org.eclipse.jst.j2ee.internal.common.operations.INewJavaClassDataModelProperties.JAVA_PACKAGE;
+import static org.eclipse.jst.j2ee.internal.common.operations.INewJavaClassDataModelProperties.QUALIFIED_CLASS_NAME;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IMethod;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaConventions;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.core.Signature;
+import org.eclipse.jst.j2ee.ejb.internal.operations.BusinessInterface.BusinessInterfaceType;
+import org.eclipse.jst.j2ee.ejb.internal.plugin.EjbPlugin;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.j2ee.internal.common.J2EECommonMessages;
+import org.eclipse.jst.j2ee.internal.common.operations.NewJavaClassDataModelProvider;
+import org.eclipse.jst.j2ee.internal.ejb.project.operations.EJBCreationResourceHandler;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelPropertyDescriptor;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider;
+import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
+import org.eclipse.wst.project.facet.IProductConstants;
+
+public class NewSessionBeanClassDataModelProvider extends NewEnterpriseBeanClassDataModelProvider {
+
+	private static final String LOCAL_SUFFIX = "Local"; //$NON-NLS-1$
+	private static final String REMOTE_SUFFIX = "Remote"; //$NON-NLS-1$
+	private static final String LOCAL_HOME_SUFFIX = "LocalHome"; //$NON-NLS-1$
+	private static final String REMOTE_HOME_SUFFIX = "RemoteHome"; //$NON-NLS-1$
+	private static final String LOCAL_COMPONENT_SUFFIX = "LocalComponent"; //$NON-NLS-1$
+	private static final String REMOTE_COMPONENT_SUFFIX = "RemoteComponent"; //$NON-NLS-1$
+	
+	
+	@Override
+	public IDataModelOperation getDefaultOperation() {
+		return new AddSessionBeanOperation(getDataModel());
+	}
+
+	/**
+	 * Subclasses may extend this method to add their own data model's properties as valid base
+	 * properties.
+	 * 
+	 * @see org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider#getPropertyNames()
+	 */
+	@Override
+	public Set<String> getPropertyNames() {
+		// Add Bean specific properties defined in this data model
+		Set<String> propertyNames = super.getPropertyNames();
+
+		propertyNames.add(REMOTE_BUSINESS_INTERFACE);
+		propertyNames.add(LOCAL_BUSINESS_INTERFACE);
+		propertyNames.add(REMOTE);
+		propertyNames.add(LOCAL);
+		propertyNames.add(NO_INTERFACE);
+		propertyNames.add(ASYNC);
+		propertyNames.add(STATE_TYPE);
+		propertyNames.add(REMOTE_HOME);
+		propertyNames.add(LOCAL_HOME);
+		propertyNames.add(REMOTE_HOME_INTERFACE);
+		propertyNames.add(LOCAL_HOME_INTERFACE);
+		propertyNames.add(LOCAL_COMPONENT_INTERFACE);
+		propertyNames.add(REMOTE_COMPONENT_INTERFACE);
+		propertyNames.add(BUSINESS_INTERFACE_ANNOTATION_LOCATION);
+
+		return propertyNames;
+	}
+
+	/**
+	 * Subclasses may extend this method to provide their own default values for any of the
+	 * properties in the data model hierarchy. This method does not accept a null parameter. It may
+	 * return null. 
+	 * 
+	 * @see NewJavaClassDataModelProvider#getDefaultProperty(String)
+	 * @see IDataModelProvider#getDefaultProperty(String)
+	 * 
+	 * @param propertyName
+	 * @return Object default value of property
+	 */
+	@Override
+	public Object getDefaultProperty(String propertyName) {
+		if (propertyName.equals(REMOTE_HOME))
+			return Boolean.FALSE;
+		else if (propertyName.equals(LOCAL_HOME))
+			return Boolean.FALSE;
+		else if (propertyName.equals(REMOTE))
+			return Boolean.FALSE;
+		else if (propertyName.equals(LOCAL))
+			return new Boolean(!ejb3xOrLater(J2EEVersionConstants.VERSION_3_1));
+		else if (propertyName.equals(NO_INTERFACE)) 
+			return new Boolean(ejb3xOrLater(J2EEVersionConstants.VERSION_3_1));
+		else if (ASYNC.equals(propertyName))
+			return Boolean.FALSE;
+		else if (propertyName.equals(STATE_TYPE))
+			return StateType.STATELESS.toString(); 
+		else if (propertyName.equals(INTERFACES)) {
+			List<BusinessInterface> listResult = new ArrayList<BusinessInterface>();
+			String className = getStringProperty(QUALIFIED_CLASS_NAME);
+			if (getBooleanProperty(REMOTE) && className.length() > 0) {
+				BusinessInterface remoteInterface = new BusinessInterface(getStringProperty(REMOTE_BUSINESS_INTERFACE), BusinessInterfaceType.REMOTE);
+				listResult.add(remoteInterface);
+			}
+			if (getBooleanProperty(LOCAL) && className.length() > 0) {
+				BusinessInterface localInterface = new BusinessInterface(getStringProperty(LOCAL_BUSINESS_INTERFACE), BusinessInterfaceType.LOCAL);
+				listResult.add(localInterface);
+			}
+			return listResult;
+		}
+		else if (REMOTE_BUSINESS_INTERFACE.equals(propertyName)) {		
+			String className = getStringProperty(QUALIFIED_CLASS_NAME);			
+			String packageSuffix = J2EEPlugin.getDefault().getJ2EEPreferences().getString(IProductConstants.EJB_INTERFACE_PACKAGE_SUFFIX);
+			return buildInterfaceName(className, REMOTE_SUFFIX, packageSuffix);
+ 		}
+		else if (LOCAL_BUSINESS_INTERFACE.equals(propertyName)) {
+			String className = getStringProperty(QUALIFIED_CLASS_NAME);
+			String packageSuffix = J2EEPlugin.getDefault().getJ2EEPreferences().getString(IProductConstants.EJB_INTERFACE_PACKAGE_SUFFIX);
+			return buildInterfaceName(className, LOCAL_SUFFIX, packageSuffix);
+		}
+		else if (REMOTE_HOME_INTERFACE.equals(propertyName))
+		{
+			String className = getStringProperty(QUALIFIED_CLASS_NAME);
+			String packageSuffix = J2EEPlugin.getDefault().getJ2EEPreferences().getString(IProductConstants.EJB_INTERFACE_PACKAGE_SUFFIX);
+			return buildInterfaceName(className, REMOTE_HOME_SUFFIX, packageSuffix);
+		}
+		else if (LOCAL_HOME_INTERFACE.equals(propertyName))
+		{
+			String className = getStringProperty(QUALIFIED_CLASS_NAME);
+			String packageSuffix = J2EEPlugin.getDefault().getJ2EEPreferences().getString(IProductConstants.EJB_INTERFACE_PACKAGE_SUFFIX);
+			return buildInterfaceName(className, LOCAL_HOME_SUFFIX, packageSuffix);
+		}
+		else if (LOCAL_COMPONENT_INTERFACE.equals(propertyName))
+		{
+			String className = getStringProperty(QUALIFIED_CLASS_NAME);
+			String packageSuffix = J2EEPlugin.getDefault().getJ2EEPreferences().getString(IProductConstants.EJB_INTERFACE_PACKAGE_SUFFIX);
+			return buildInterfaceName(className, LOCAL_COMPONENT_SUFFIX, packageSuffix);
+		}
+		else if (REMOTE_COMPONENT_INTERFACE.equals(propertyName))
+		{
+			String className = getStringProperty(QUALIFIED_CLASS_NAME);
+			String packageSuffix = J2EEPlugin.getDefault().getJ2EEPreferences().getString(IProductConstants.EJB_INTERFACE_PACKAGE_SUFFIX);
+			return buildInterfaceName(className, REMOTE_COMPONENT_SUFFIX, packageSuffix);
+		}
+		else if (BUSINESS_INTERFACE_ANNOTATION_LOCATION.equals(propertyName))
+		{
+			boolean inInterface = J2EEPlugin.getDefault().getJ2EEPreferences().getBoolean(IProductConstants.EJB_BUSINESS_INTERFACE_ANNOTATION_IN_INTERFACE);
+			boolean inBean = J2EEPlugin.getDefault().getJ2EEPreferences().getBoolean(IProductConstants.EJB_BUSINESS_INTERFACE_ANNOTATION_IN_BEAN);
+			if (inInterface && inBean){
+				return BusinessInterfaceAnnotationLocationType.BEAN_CLASS_AND_INTERFACE.toString();
+			}
+			if (inBean){
+				return BusinessInterfaceAnnotationLocationType.BEAN_CLASS_ONLY.toString();
+			}
+			return BusinessInterfaceAnnotationLocationType.INTERFACE_ONLY.toString();
+			
+		}
+		// Otherwise check super for default value for property
+		return super.getDefaultProperty(propertyName);
+	}
+
+	
+	private String buildInterfaceName(final String qualifiedBeanClassName, final String interfaceSuffix,
+			final String interfacePackageSuffix) {
+
+		boolean usePackageSuffix = (interfacePackageSuffix != null  && interfacePackageSuffix.length() > 0);
+		String interfaceName = qualifiedBeanClassName + ((qualifiedBeanClassName != null && qualifiedBeanClassName.length() > 0) ? interfaceSuffix : ""); //$NON-NLS-1$	
+
+		if (!usePackageSuffix || interfaceName.equals("")){ //$NON-NLS-1$
+			return interfaceName;
+		}
+		StringBuffer buf = new StringBuffer(interfaceName);
+
+		int index = buf.lastIndexOf("."); //$NON-NLS-1$
+		if (index == -1){
+			return buf.insert(0, interfacePackageSuffix + ".").toString(); //$NON-NLS-1$
+		}
+		return buf.insert(index, "." + interfacePackageSuffix).toString(); //$NON-NLS-1$
+	}
+		
+
+	
+	/**
+	 * Subclasses may extend this method to add their own specific behavior when a certain property
+	 * in the data model hierarchy is set. This method does not accept null for the property name,
+	 * but it will for propertyValue. It will not return null. It will return false if the set
+	 * fails. This implementation verifies the display name is set to the classname, that the
+	 * annotations is disabled/enabled properly, and that the target project name is determined from
+	 * the source folder setting.
+	 * 
+	 * @see org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider#propertySet(String,
+	 *      Object)
+	 * 
+	 * @param propertyName
+	 * @param propertyValue
+	 * @return boolean was property set?
+	 */
+	@Override
+	public boolean propertySet(String propertyName, Object propertyValue) {
+		// Call super to set the property on the data model
+		boolean result = super.propertySet(propertyName, propertyValue);
+
+		if (PROJECT_NAME.equals(propertyName)) {
+			IDataModel dataModel = getDataModel();
+			dataModel.notifyPropertyChange(REMOTE, IDataModel.DEFAULT_CHG);
+			dataModel.notifyPropertyChange(LOCAL, IDataModel.DEFAULT_CHG);
+			dataModel.notifyPropertyChange(NO_INTERFACE, IDataModel.DEFAULT_CHG);
+			dataModel.notifyPropertyChange(ASYNC, IDataModel.DEFAULT_CHG);
+			dataModel.notifyPropertyChange(REMOTE_BUSINESS_INTERFACE, IDataModel.DEFAULT_CHG);
+			dataModel.notifyPropertyChange(LOCAL_BUSINESS_INTERFACE, IDataModel.DEFAULT_CHG);
+		} else if (CLASS_NAME.equals(propertyName) || JAVA_PACKAGE.equals(propertyName)) {
+			IDataModel dataModel = getDataModel();
+			dataModel.notifyPropertyChange(REMOTE_BUSINESS_INTERFACE, IDataModel.DEFAULT_CHG);
+			dataModel.notifyPropertyChange(LOCAL_BUSINESS_INTERFACE, IDataModel.DEFAULT_CHG);
+			dataModel.notifyPropertyChange(REMOTE_HOME_INTERFACE, IDataModel.DEFAULT_CHG);
+			dataModel.notifyPropertyChange(LOCAL_HOME_INTERFACE, IDataModel.DEFAULT_CHG);
+			dataModel.notifyPropertyChange(REMOTE_COMPONENT_INTERFACE, IDataModel.DEFAULT_CHG);
+			dataModel.notifyPropertyChange(LOCAL_COMPONENT_INTERFACE, IDataModel.DEFAULT_CHG);
+		} else if (propertyName.equals(REMOTE)) {
+			if (!getDataModel().isPropertySet(INTERFACES)) {
+				getDataModel().notifyPropertyChange(INTERFACES, IDataModel.DEFAULT_CHG);
+			} else {
+				updateBusinessInterfaces(REMOTE);
+			}
+			getDataModel().notifyPropertyChange(REMOTE_BUSINESS_INTERFACE, IDataModel.ENABLE_CHG);
+
+		} else if (propertyName.equals(LOCAL)) {
+			if (!getDataModel().isPropertySet(INTERFACES)) {
+				getDataModel().notifyPropertyChange(INTERFACES, IDataModel.DEFAULT_CHG);
+			} else {
+				updateBusinessInterfaces(LOCAL);
+			}
+			getDataModel().notifyPropertyChange(LOCAL_BUSINESS_INTERFACE, IDataModel.ENABLE_CHG);
+		} else if (REMOTE_BUSINESS_INTERFACE.equals(propertyName)) {
+			if(getRemoteProperty() != null){
+				getRemoteProperty().setFullyQualifiedName(propertyValue.toString());
+			}
+		} else if (LOCAL_BUSINESS_INTERFACE.equals(propertyName)) {
+			if(getLocalProperty() != null){
+				getLocalProperty().setFullyQualifiedName(propertyValue.toString());
+			}
+		} else if (propertyName.equals(ASYNC)) {
+			getDataModel().notifyPropertyChange(ASYNC, IDataModel.DEFAULT_CHG);
+		} 
+
+		return result;
+	}
+	
+	@Override
+	public boolean isPropertyEnabled(String propertyName) {
+		if (REMOTE_BUSINESS_INTERFACE.equals(propertyName))	{
+			return getDataModel().getBooleanProperty(REMOTE);
+		} else if (LOCAL_BUSINESS_INTERFACE.equals(propertyName)) {
+			return getDataModel().getBooleanProperty(LOCAL);
+		} else if (ASYNC.equals(propertyName)) {
+			return ejb3xOrLater(J2EEVersionConstants.VERSION_3_1);
+		}
+		
+		return super.isPropertyEnabled(propertyName);
+	}
+	
+	@Override
+	public DataModelPropertyDescriptor[] getValidPropertyDescriptors(String propertyName) {
+		if (propertyName.equals(STATE_TYPE)) {
+			return DataModelPropertyDescriptor.createDescriptors(
+					new String[] {
+							StateType.STATELESS.toString(), 
+							StateType.STATEFUL.toString(), 
+							StateType.SINGLETON.toString()
+					}, 
+					new String[] {
+							EJBCreationResourceHandler.STATE_TYPE_STATELESS, 
+							EJBCreationResourceHandler.STATE_TYPE_STATEFUL, 
+							EJBCreationResourceHandler.STATE_TYPE_SINGLETON
+					}
+			);
+		} 
+		
+		return super.getValidPropertyDescriptors(propertyName);
+	}
+
+	private void updateBusinessInterfaces(String propertyName) {
+		List<BusinessInterface> list = (List<BusinessInterface>) getProperty(INTERFACES);
+		if (propertyName.equals(REMOTE)) {
+			if (getBooleanProperty(propertyName)) {
+				list.add(new BusinessInterface(getStringProperty(REMOTE_BUSINESS_INTERFACE), BusinessInterfaceType.REMOTE));
+			} else {
+				BusinessInterface remoteInterface = getRemoteProperty();
+				int indexOf = list.indexOf(remoteInterface);
+				list.remove(indexOf);
+			}
+		} else if (propertyName.equals(LOCAL)) {
+			if (getBooleanProperty(propertyName)) {
+				list.add(new BusinessInterface(getStringProperty(LOCAL_BUSINESS_INTERFACE), BusinessInterfaceType.LOCAL));
+			} else {
+				BusinessInterface localInterface = getLocalProperty();
+				int indexOf = list.indexOf(localInterface);
+				list.remove(indexOf);
+			}
+		}
+	}
+
+	private BusinessInterface getRemoteProperty() {
+		List<BusinessInterface> businessInterfaces = (List<BusinessInterface>) getProperty(INTERFACES);
+		for (BusinessInterface iface : businessInterfaces) {
+			if ((iface.getJavaType() == null) && (iface.isRemote())) {
+				return iface;
+			}
+		}
+		return null;
+	}
+	private BusinessInterface getLocalProperty() {
+		List<BusinessInterface> businessInterfaces = (List<BusinessInterface>) getProperty(INTERFACES);
+		for (BusinessInterface iface : businessInterfaces) {
+			if ((iface.getJavaType() == null) && (iface.isLocal())) {
+				return iface;
+			}
+		}
+		return null;
+	}
+
+	@Override
+	public IStatus validate(String propertyName) {
+		if (STATE_TYPE.equals(propertyName)) {
+			return validateStateType();			
+		} else if (NO_INTERFACE.equals(propertyName)) {
+			if (getBooleanProperty(NO_INTERFACE)) {
+				return validateNoInterface();
+			}
+		} else if (LOCAL_BUSINESS_INTERFACE.equals(propertyName)) {
+			if (getBooleanProperty(LOCAL)) {
+				return validateEjbInterface(getStringProperty(propertyName));
+			}
+		} else if (REMOTE_BUSINESS_INTERFACE.equals(propertyName)) {
+			if (getBooleanProperty(REMOTE)) {
+				return validateEjbInterface(getStringProperty(propertyName));
+			}
+		} else if (LOCAL_COMPONENT_INTERFACE.equals(propertyName) || 
+				REMOTE_COMPONENT_INTERFACE.equals(propertyName) || 
+				LOCAL_HOME_INTERFACE.equals(propertyName) || 
+				REMOTE_HOME_INTERFACE.equals(propertyName)) {
+			return validateComponentHomeInterfaces();
+		} else if (INTERFACES.equals(propertyName)) {
+			return validateInterfacesList();
+		} else if (ASYNC.equals(propertyName) && getBooleanProperty(ASYNC)) {
+			return validateAsynchronous();
+		}
+			
+		return super.validate(propertyName);
+	}
+
+	protected IStatus validateStateType() {
+		String value = getStringProperty(STATE_TYPE);
+		if (StateType.SINGLETON.toString().equals(value) && !ejb3xOrLater(J2EEVersionConstants.VERSION_3_1)) {
+			return WTPCommonPlugin.createErrorStatus(EJBCreationResourceHandler.ERR_SINGLETON_NOT_ALLOWED);
+		}
+		return Status.OK_STATUS;
+	}
+
+	protected IStatus validateNoInterface() {
+		if (!ejb3xOrLater(J2EEVersionConstants.VERSION_3_1)) {
+			return WTPCommonPlugin.createErrorStatus(EJBCreationResourceHandler.ERR_NO_INTERFACE_NOT_ALLOWED);
+		}
+		return Status.OK_STATUS;
+	}
+	
+	protected IStatus validateAsynchronous() {
+		IStatus retVal = Status.OK_STATUS;
+		if (getBooleanProperty(ASYNC)) {
+			if (ejb3xOrLater(J2EEVersionConstants.VERSION_3_1) && !ejb3xOrLater(J2EEVersionConstants.VERSION_3_2)) {
+				retVal = new Status(IStatus.WARNING, EjbPlugin.PLUGIN_ID, EJBCreationResourceHandler.WRN_EJB31_ASYNC_NOT_SUPPORTED);
+			}
+		}
+		return retVal;
+	}
+
+	protected IStatus validateEjbInterface(String fullyQualifiedName) {
+		IStatus status = validateJavaTypeName(fullyQualifiedName);
+		if (status.getSeverity() != IStatus.ERROR) {
+			IStatus existsStatus = canCreateTypeInClasspath(
+					Signature.getQualifier(fullyQualifiedName), 
+					Signature.getSimpleName(fullyQualifiedName));
+			if (existsStatus.matches(IStatus.ERROR | IStatus.WARNING))
+				status = existsStatus;
+		}
+		return status;
+	}
+
+	protected IStatus validateComponentHomeInterfaces() {
+		IStatus result = Status.OK_STATUS;
+		String projectName = getStringProperty(PROJECT_NAME);
+		if (projectName != null && projectName.length() > 0) {
+			IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
+			IJavaProject javaProject = JavaCore.create(project);
+			try {
+				if (getBooleanProperty(LOCAL_HOME)) {
+					String localHomeInterface = getStringProperty(LOCAL_HOME_INTERFACE);
+					String localComponentInterface = getStringProperty(LOCAL_COMPONENT_INTERFACE);
+					result = validate2xInterfaces(javaProject, localHomeInterface, localComponentInterface, true);
+					if (!result.isOK()) return result;
+					
+					IType findType = javaProject.findType(localComponentInterface);
+					if ((findType == null || !findType.exists()) && result.isOK()) {
+						result = validateEjbInterface(localComponentInterface);
+						if (!result.isOK()) return result;
+					}
+					
+					findType = javaProject.findType(localHomeInterface);
+					if (findType == null || !findType.exists()) {
+						result = validateEjbInterface(localHomeInterface);
+						if (!result.isOK()) return result;
+					}
+				}
+				if (getBooleanProperty(REMOTE_HOME)) {
+					String remoteHomeInterface = getStringProperty(REMOTE_HOME_INTERFACE);
+					String remoteComponentInterface = getStringProperty(REMOTE_COMPONENT_INTERFACE);
+					result = validate2xInterfaces(javaProject, remoteHomeInterface, remoteComponentInterface, false);
+					if (!result.isOK()) return result;
+					
+					IType findType = javaProject.findType(remoteComponentInterface);
+					if ((findType == null || !findType.exists()) && result.isOK()) {
+						result = validateEjbInterface(remoteComponentInterface);
+						if (!result.isOK()) return result;
+					}
+					findType = javaProject.findType(remoteHomeInterface);
+					if (findType == null || !findType.exists()) {
+						result = validateEjbInterface(remoteHomeInterface);
+						if (!result.isOK()) return result;
+					}
+				}
+			} catch (JavaModelException e) {
+				return WTPCommonPlugin.createErrorStatus(NLS.bind(
+						EJBCreationResourceHandler.ERR_COULD_NOT_RESOLVE_INTERFACE, 
+						new Object[] { e.getMessage() }));
+			}
+		}
+		return result;
+	}
+
+	private IStatus validate2xInterfaces(IJavaProject javaProject, String rhI, String rI, boolean isLocal) throws JavaModelException {
+
+		IType home = javaProject.findType(rhI);
+		IType component = javaProject.findType(rI);
+
+		if (home != null && 
+				(!home.isInterface() || 
+						!hasRequiredElementInSignature(home.getSuperInterfaceTypeSignatures(), new String[] { isLocal ? "EJBLocalHome" : "EJBHome" }))) { //$NON-NLS-1$ //$NON-NLS-2$
+			String msg = (isLocal) ? EJBCreationResourceHandler.ERR_LOCAL_HOME_NOT_INTERFACE : EJBCreationResourceHandler.ERR_REMOTE_HOME_NOT_INTERFACE;
+			return new Status(IStatus.ERROR, EjbPlugin.PLUGIN_ID, msg);
+		}
+
+		if (component != null && 
+				(!component.isInterface() 
+						|| !hasRequiredElementInSignature(component.getSuperInterfaceTypeSignatures(), new String[] { isLocal ? "EJBLocalObject" : "EJBObject" }))) { //$NON-NLS-1$ //$NON-NLS-2$
+			String msg = (isLocal) ? EJBCreationResourceHandler.ERR_LOCAL_COMPONENT_NOT_INTERFACE : EJBCreationResourceHandler.ERR_REMOTE_COMPONENT_NOT_INTERFACE;
+			return new Status(IStatus.ERROR, EjbPlugin.PLUGIN_ID, msg);
+		}
+
+		if (home == null){
+			return Status.OK_STATUS;
+		}
+
+
+		IMethod createMehod = home.getMethod("create", null); //$NON-NLS-1$
+		if (createMehod == null || !createMehod.exists() || !hasRequiredElementInSignature(createMehod.getExceptionTypes(), new String[]{"CreateException", "RemoteException"})){ //$NON-NLS-1$ //$NON-NLS-2$
+			String msg = (isLocal) ? EJBCreationResourceHandler.ERR_LOCAL_HOME_MISSING_CREATE_METHOD: EJBCreationResourceHandler.ERR_REMOTE_HOME_MISSING_CREATE_METHOD;
+			return new Status(IStatus.ERROR, EjbPlugin.PLUGIN_ID, msg);
+		}
+
+		if (component == null && !rI.endsWith("."+Signature.getSignatureSimpleName(createMehod.getReturnType()))){ //$NON-NLS-1$
+			String msg = (isLocal) ? EJBCreationResourceHandler.ERR_LOCAL_HOME_CREATE_METHOD_RETURN_TYPE_INVALID: EJBCreationResourceHandler.ERR_REMOTE_HOME_CREATE_METHOD_RETURN_TYPE_INVALID;
+			return new Status(IStatus.ERROR, EjbPlugin.PLUGIN_ID, msg);
+		}
+		if (component != null && !component.getElementName().equals(Signature.getSignatureSimpleName(createMehod.getReturnType()))){
+			String msg = (isLocal) ? EJBCreationResourceHandler.ERR_LOCAL_HOME_CREATE_METHOD_RETURN_TYPE_INVALID: EJBCreationResourceHandler.ERR_REMOTE_HOME_CREATE_METHOD_RETURN_TYPE_INVALID;
+			return new Status(IStatus.ERROR, EjbPlugin.PLUGIN_ID, msg);
+		}
+		return Status.OK_STATUS;
+	}
+
+	protected IStatus validateInterfacesList() {
+		List<BusinessInterface> list = (List<BusinessInterface>) getProperty(INTERFACES);
+		if (list.isEmpty() && !ejb3xOrLater(J2EEVersionConstants.VERSION_3_1)) {
+			return new Status(IStatus.WARNING, EjbPlugin.PLUGIN_ID, EJBCreationResourceHandler.WRN_NO_CLIENT_VIEW); 
+		}
+		return Status.OK_STATUS;
+	}
+
+	private boolean hasRequiredElementInSignature(String[] allElementNames, String[] wanted) {
+		if (allElementNames == null || allElementNames.length == 0){
+			return false;
+		}
+		int found = 0;
+		for (int j = 0; j < wanted.length; j++) {
+			if(wanted[j] == null){
+				continue;
+			}
+			for (int i = 0; i < allElementNames.length; i++) {
+				if(allElementNames[i] == null){
+					continue;
+				}
+				if(wanted[j].equals(Signature.toString(allElementNames[i]))){
+					found++;
+					if (found == wanted.length){
+						return true;
+					}
+					break;
+				}
+
+			}
+
+		}
+		return false;
+	}
+
+	protected IStatus validateJavaTypeName(String className) {
+		// Check Java class name by standard java conventions
+		IStatus javaStatus = JavaConventions.validateJavaTypeName(className);
+		if (javaStatus.getSeverity() == IStatus.ERROR) {
+			String msg = J2EECommonMessages.ERR_JAVA_CLASS_NAME_INVALID + javaStatus.getMessage();
+			return WTPCommonPlugin.createErrorStatus(msg);
+		} else if (javaStatus.getSeverity() == IStatus.WARNING) {
+			String msg = J2EECommonMessages.ERR_JAVA_CLASS_NAME_WARNING + javaStatus.getMessage();
+			return WTPCommonPlugin.createWarningStatus(msg);
+		}
+		return WTPCommonPlugin.OK_STATUS;
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/NewSessionBeanClassOperation.java b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/NewSessionBeanClassOperation.java
new file mode 100644
index 0000000..d9aaf6c
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/NewSessionBeanClassOperation.java
@@ -0,0 +1,478 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2012 SAP AG 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:
+ * Kaloyan Raev, kaloyan.raev@sap.com - initial API and implementation
+ * Roberto Sanchez, rsanchez@mx1.ibm.com - Allow more flexibility for source folder in EJB client
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.ejb.internal.operations;
+
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewSessionBeanClassDataModelProperties.LOCAL_HOME;
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewSessionBeanClassDataModelProperties.REMOTE_HOME;
+import static org.eclipse.jst.j2ee.internal.common.operations.INewJavaClassDataModelProperties.INTERFACES;
+import static org.eclipse.jst.j2ee.internal.common.operations.INewJavaClassDataModelProperties.JAVA_PACKAGE;
+import static org.eclipse.jst.j2ee.internal.common.operations.INewJavaClassDataModelProperties.JAVA_PACKAGE_FRAGMENT_ROOT;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.emf.codegen.jet.JETException;
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IPackageFragment;
+import org.eclipse.jdt.core.IPackageFragmentRoot;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.core.Signature;
+import org.eclipse.jst.common.jdt.internal.javalite.JavaLiteUtilities;
+import org.eclipse.jst.j2ee.ejb.internal.plugin.EjbPlugin;
+import org.eclipse.jst.j2ee.internal.common.operations.INewJavaClassDataModelProperties;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
+import org.eclipse.jst.j2ee.project.EJBUtilities;
+import org.eclipse.jst.j2ee.project.JavaEEProjectUtilities;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.internal.operation.ArtifactEditProviderOperation;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.internal.enablement.nonui.WFTWrappedException;
+
+/**
+ * The NewSessionBeanClassOperation is an IDataModelOperation following the
+ * IDataModel wizard and operation framework.
+ * 
+ * @see org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation
+ * @see org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider
+ * 
+ * It extends ArtifactEditProviderOperation to provide enterprise bean specific java
+ * class generation.
+ * @see org.eclipse.wst.common.componentcore.internal.operation.ArtifactEditProviderOperation
+ * 
+ * This operation is used by the AddSessionBeanOperation to generate an
+ * non annotated java class for an added enterprise bean. It shares the
+ * NewSessionBeanClassDataModelProvider with the AddSessionBeanOperation to store the
+ * appropriate properties required to generate the new enterprise bean.
+ * @see org.eclipse.jst.j2ee.ejb.internal.operations.AddSessionBeanOperation
+ * @see org.eclipse.jst.j2ee.ejb.internal.operations.NewSessionBeanClassDataModelProvider
+ * 
+ * A WTPJetEmitter bean template is used to create the class with the bean template. 
+ * @see org.eclipse.jst.j2ee.internal.project.WTPJETEmitter
+ * @see org.eclipse.jst.j2ee.ejb.internal.operations.CreateSessionBeanTemplateModel
+ * 
+ * Subclasses may extend this operation to provide their own specific bean
+ * java class generation. The execute method may be extended to do so. Also,
+ * generateUsingTemplates is exposed.
+ * 
+ */
+public class NewSessionBeanClassOperation extends NewEnterpriseBeanClassOperation {
+
+	/**
+	 * folder location of the enterprise bean creation templates directory
+	 */
+	protected static final String TEMPLATE_FILE = "/templates/sessionBean.javajet"; //$NON-NLS-1$
+
+	protected static final String TEMPLATE_LOCAL_FILE = "/templates/localBusinessInterface.javajet"; //$NON-NLS-1$
+	protected static final String TEMPLATE_REMOTE_FILE = "/templates/remoteBusinessInterface.javajet"; //$NON-NLS-1$
+
+	protected static final String TEMPLATE_LOCALHOME_FILE = "/templates/localHomeInterface.javajet"; //$NON-NLS-1$
+	protected static final String TEMPLATE_REMOTEHOME_FILE = "/templates/remoteHomeInterface.javajet"; //$NON-NLS-1$
+
+	protected static final String TEMPLATE_LOCALCOMPONENT_FILE = "/templates/localComponentInterface.javajet"; //$NON-NLS-1$
+	protected static final String TEMPLATE_REMOTECOMPONENT_FILE = "/templates/remoteComponentInterface.javajet"; //$NON-NLS-1$
+	
+	protected IPackageFragment clientPack;
+	protected IPackageFragment pack;
+	
+	/**
+	 * This is the constructor which should be used when creating a
+	 * NewSessionBeanClassOperation. An instance of the NewSessionBeanClassDataModelProvider
+	 * should be passed in. This does not accept null parameter. It will not
+	 * return null.
+	 * 
+	 * @see ArtifactEditProviderOperation#ArtifactEditProviderOperation(IDataModel)
+	 * @see NewBeansClassDataModel
+	 * 
+	 * @param dataModel
+	 * @return NewBeanClassOperation
+	 */
+	public NewSessionBeanClassOperation(IDataModel dataModel) {
+		super(dataModel);
+	}
+
+	/**
+	 * Subclasses may extend this method to add their own actions during
+	 * execution. The implementation of the execute method drives the running of
+	 * the operation. This implementation will create the java source folder,
+	 * create the java package, and then the enterprise bean java class file will be created 
+	 * using templates. Optionally, subclasses may extend the
+	 * generateUsingTemplates or createJavaFile method rather than extend the
+	 * execute method. This method will accept a null parameter.
+	 * 
+	 * @see org.eclipse.wst.common.frameworks.internal.operation.WTPOperation#execute(org.eclipse.core.runtime.IProgressMonitor)
+	 * @see NewSessionBeanClassOperation#generateUsingTemplates(IProgressMonitor,
+	 *      IPackageFragment)
+	 * 
+	 * @param monitor
+	 * @throws CoreException
+	 * @throws InterruptedException
+	 * @throws InvocationTargetException
+	 */
+	@Override
+	public IStatus doExecute(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+		// Retrieve the package name from the java class data model
+		String packageName = model.getStringProperty(JAVA_PACKAGE);
+		// Create java package if it does not exist
+		pack = createJavaPackage(packageName);
+		if (hasInterfacesToGenerate() && EJBUtilities.hasEJBClientJARProject(getTargetProject())) {					
+			IFolder folder = getClientSourceFolder();
+			if (!folder.exists()){
+				// If the source folder used by the EJB project does not exist in the
+				// client project, try to use the first source folder available
+				folder = getFirstJavaSourceFolderInClientJar();
+			
+				if (folder == null) {
+					// If the is no source folder available, create the source
+					// folder used by the EJB project.
+					createJavaSourceFolderInClientJar();
+				}
+			}
+			clientPack = createJavaPackageInClientJar(packageName);
+		}
+		
+		return super.doExecute(monitor, info);
+	}
+
+	@Override
+	protected void generateUsingTemplates(IProgressMonitor monitor, IPackageFragment fragment) 
+			throws WFTWrappedException, CoreException {
+		this.generateUsingTemplates(monitor, pack, clientPack);
+	}
+
+	/**
+	 * Subclasses may extend this method to provide their own template based
+	 * creation of an annotated bean java class file. This implementation uses
+	 * the creation of a CreateSessionBeanTemplateModel and the WTPJetEmitter to
+	 * create the java class with the annotated tags. This method accepts null
+	 * for monitor, it does not accept null for fragment. If annotations are not
+	 * being used the tags will be omitted from the class.
+	 * 
+	 * @see CreateSessionBeanTemplateModel
+	 * @see NewSessionBeanClassOperation#generateTemplateSource(CreateSessionBeanTemplateModel,
+	 *      IProgressMonitor)
+	 * 
+	 * @param monitor
+	 * @param fragment
+	 * @throws CoreException
+	 * @throws WFTWrappedException
+	 */
+	protected void generateUsingTemplates(IProgressMonitor monitor, IPackageFragment fragment, IPackageFragment clientFragment) throws WFTWrappedException, CoreException {
+		// Create the enterprise bean template model
+		CreateSessionBeanTemplateModel tempModel = createTemplateModel();
+		getTargetProject();
+		// Using the WTPJetEmitter, generate the java source based on the bean template model
+		try {
+			if (fragment != null) {
+				if (hasInterfacesToGenerate() && EJBUtilities.hasEJBClientJARProject(getTargetProject())) {
+					generateInterfacesUsingTemplates(monitor, clientFragment, tempModel);
+				} else {
+					generateInterfacesUsingTemplates(monitor, fragment, tempModel);
+				}
+				
+				// Create the session bean java file
+				SessionBeanTemplate tempImpl = SessionBeanTemplate.create(null);
+				String source = generateTemplateSource(EjbPlugin.getPlugin(), tempModel, TEMPLATE_FILE, tempImpl, monitor);
+				String javaFileName = tempModel.getClassName() + DOT_JAVA;
+				createJavaFile(monitor, fragment, source, javaFileName);
+			}
+		} catch (Exception e) {
+			throw new WFTWrappedException(e);
+		}
+	}
+	
+	protected void generateInterfacesUsingTemplates(IProgressMonitor monitor, IPackageFragment fragment, CreateSessionBeanTemplateModel tempModel) 
+			throws JETException, JavaModelException {
+		IProject project = getTargetProject();
+		boolean useClientJar = false;
+		if (JavaEEProjectUtilities.isEJBProject(project))
+		{
+			useClientJar = EJBUtilities.hasEJBClientJARProject(getTargetProject());
+		}
+		List<BusinessInterface> interfaces = tempModel.getBusinessInterfaces();
+		for (BusinessInterface iface : interfaces) {
+			if (!iface.exists()) {
+				tempModel.setCurrentBusinessInterface(iface);
+				if (iface.isLocal()) {
+					// Create the java files for the non-exising Local Business interfaces
+					LocalBusinessInterfaceTemplate tempImpl = LocalBusinessInterfaceTemplate.create(null);
+					String src = generateTemplateSource(EjbPlugin.getPlugin(), tempModel, TEMPLATE_LOCAL_FILE, tempImpl, monitor);
+					String fileName = iface.getSimpleName() + DOT_JAVA;
+					createJavaFile(monitor, getPackageFragment(useClientJar, iface.getFullyQualifiedName()), src, fileName);
+				} else if (iface.isRemote()) {
+					// Create the java files for the non-exising Remote Business interfaces
+					RemoteBusinessInterfaceTemplate tempImpl = RemoteBusinessInterfaceTemplate.create(null);
+					String src = generateTemplateSource(EjbPlugin.getPlugin(), tempModel, TEMPLATE_REMOTE_FILE, tempImpl, monitor);
+					String fileName = iface.getSimpleName() + DOT_JAVA;
+					createJavaFile(monitor, getPackageFragment(useClientJar, iface.getFullyQualifiedName()), src, fileName);
+				}
+			}
+		}
+
+		// Create the EJB 2.x compatible Remote Home and Component interface java files
+		if (model.getBooleanProperty(REMOTE_HOME)) {
+			String remoteFullName =  model.getStringProperty(INewSessionBeanClassDataModelProperties.REMOTE_HOME_INTERFACE);
+			String remoteComponentFullName = model.getStringProperty(INewSessionBeanClassDataModelProperties.REMOTE_COMPONENT_INTERFACE);
+			
+			IJavaProject javaProject = JavaCore.create(project);
+			IType type = javaProject.findType(remoteFullName);
+			
+			IPackageFragment remoteFragment = null;
+			String fileName = Signature.getSimpleName(remoteFullName)+ DOT_JAVA;
+			
+			tempModel.setRemoteHomeClassName(remoteFullName);
+			tempModel.setRemoteComponentClassName(remoteComponentFullName);
+			String src = ""; //$NON-NLS-1$
+			if(type == null){
+				remoteFragment = getPackageFragment(useClientJar, remoteFullName);
+				RemoteHomeInterfaceTemplate tempImpl = RemoteHomeInterfaceTemplate.create(null);
+				src = generateTemplateSource(EjbPlugin.getPlugin(), tempModel, TEMPLATE_REMOTEHOME_FILE, tempImpl, monitor);
+				createJavaFile(monitor, remoteFragment, src, fileName);
+			}
+			
+			String fileComponentName = Signature.getSimpleName(remoteComponentFullName)+ DOT_JAVA;			
+			
+			type = javaProject.findType(remoteComponentFullName);
+			if(type == null){
+				IPackageFragment remoteComponentFragment = getPackageFragment(useClientJar, remoteComponentFullName);
+				RemoteComponentInterfaceTemplate tempImpl = RemoteComponentInterfaceTemplate.create(null);
+				src = generateTemplateSource(EjbPlugin.getPlugin(), tempModel, TEMPLATE_REMOTECOMPONENT_FILE, tempImpl, monitor);
+				createJavaFile(monitor, remoteComponentFragment, src, fileComponentName);
+			}
+		}
+		
+		// Create the EJB 2.x compatible Local Home and Component interface java files
+		if (model.getBooleanProperty(LOCAL_HOME)) {
+			String localFullName =  model.getStringProperty(INewSessionBeanClassDataModelProperties.LOCAL_HOME_INTERFACE);
+			String localComponentFullName = model.getStringProperty(INewSessionBeanClassDataModelProperties.LOCAL_COMPONENT_INTERFACE);
+			
+			IJavaProject javaProject = JavaCore.create(project);
+			IType type = javaProject.findType(localFullName);			
+			
+			IPackageFragment localFragment = null;
+			String fileName = Signature.getSimpleName(localFullName)+ DOT_JAVA;
+			tempModel.setLocalHomeClassName(localFullName);
+			tempModel.setLocalComponentClassName(localComponentFullName);
+			
+			String src = ""; //$NON-NLS-1$
+			if(type == null){
+				localFragment = getPackageFragment(useClientJar, localFullName);
+				LocalHomeInterfaceTemplate tempImpl = LocalHomeInterfaceTemplate.create(null);
+				src = generateTemplateSource(EjbPlugin.getPlugin(), tempModel, TEMPLATE_LOCALHOME_FILE, tempImpl, monitor);
+				createJavaFile(monitor, localFragment, src, fileName);
+			}
+			
+			String fileComponentName = Signature.getSimpleName(localComponentFullName)+ DOT_JAVA;
+			
+			type = javaProject.findType(localComponentFullName);
+			if(type == null){
+				IPackageFragment localComponentFragment = getPackageFragment(useClientJar, localComponentFullName);
+				LocalComponentInterfaceTemplate tempImpl = LocalComponentInterfaceTemplate.create(null);
+				src = generateTemplateSource(EjbPlugin.getPlugin(), tempModel, TEMPLATE_LOCALCOMPONENT_FILE, tempImpl, monitor);
+				createJavaFile(monitor, localComponentFragment, src, fileComponentName);
+			}
+		}
+	}
+
+	protected IPackageFragment getPackageFragment(boolean useClientJar, String fullName) {
+		IPackageFragment fragment;
+		String packageName = Signature.getQualifier(fullName);
+		if (useClientJar) {
+			fragment = createJavaPackageInClientJar(packageName);
+		}
+		else
+		{
+			fragment = createJavaPackage(packageName);
+		}
+		return fragment;
+	}
+
+	// Returns the first java source folder found in the client jar project, or null if no source folder exists.
+	private IFolder getFirstJavaSourceFolderInClientJar(){
+		IFolder result = null;
+		
+		IProject clientProject = EJBUtilities.getEJBClientJar(getTargetProject()).getProject();
+		
+		IVirtualComponent clientVc = ComponentCore.createComponent(clientProject);
+		List<IContainer> sourceCointainers = JavaLiteUtilities.getJavaSourceContainers(clientVc);
+		
+		for (IContainer container:sourceCointainers){
+			if (container instanceof IFolder && !container.getName().startsWith(".")) { //$NON-NLS-1$
+				// We only want source folders which are not hidden (i.e. its name does not begin with ".")
+				result = (IFolder)container;
+				break;
+			}			
+		}
+		return result;
+	}
+	
+	protected IFolder createJavaSourceFolderInClientJar() {
+		// Get the source folder name from the data model
+		IFolder folder = getClientSourceFolder();
+		// If folder does not exist, create the folder with the specified path
+		if (!folder.exists()) {
+			try {
+				createFolder( folder, false );
+			} catch (CoreException e) {
+				EjbPlugin.logError(e);
+			}
+
+			IProject  clientProject = EJBUtilities.getEJBClientJar(getTargetProject()).getProject();
+			IJavaProject  jProject = JavaCore.create( clientProject );
+			if( jProject != null ){
+				IClasspathEntry newEntry = JavaCore.newSourceEntry( folder.getFullPath() );
+				
+				List<IClasspathEntry> cp = new ArrayList<IClasspathEntry>();
+				IClasspathEntry[] classPath;
+				try {
+					classPath = jProject.getRawClasspath();
+					cp.addAll( Arrays.asList( classPath ) );
+					cp.add( newEntry );
+		            jProject.setRawClasspath( cp.toArray( new IClasspathEntry[ cp.size() ] ), null );					
+				} catch (JavaModelException e) {
+					EjbPlugin.logError(e);
+				}
+
+			}
+	        
+		}
+		// Return the source folder
+		return folder;
+	}	
+
+	protected IPackageFragment createJavaPackageInClientJar(String packageName) {
+		IPackageFragmentRoot packRoot = getClientPackageFragmentRoot();
+		
+		IPackageFragment pack = packRoot.getPackageFragment(packageName);
+		// Handle default package
+		if (pack == null) {
+			pack = packRoot.getPackageFragment(""); //$NON-NLS-1$
+		}
+
+		// Create the package fragment if it does not exist
+		if (!pack.exists()) {
+			String packName = pack.getElementName();
+			try {
+				pack = packRoot.createPackageFragment(packName, true, null);
+			} catch (JavaModelException e) {
+				EjbPlugin.logError(e);
+			}
+		}
+		// Return the package
+		return pack;
+	}
+
+	/**
+	 * This method is intended for internal use only. This method will create an
+	 * instance of the CreateSessionBeanTemplate model to be used in conjunction
+	 * with the WTPJETEmitter. This method will not return null.
+	 * 
+	 * @see CreateSessionBeanTemplateModel
+	 * @see NewSessionBeanClassOperation#generateUsingTemplates(IProgressMonitor,
+	 *      IPackageFragment)
+	 * 
+	 * @return CreateBeanTemplateModel
+	 */
+	private CreateSessionBeanTemplateModel createTemplateModel() {
+		// Create the CreateBeanTemplateModel instance with the new bean
+		// class data model
+		CreateSessionBeanTemplateModel templateModel = new CreateSessionBeanTemplateModel(model);
+		return templateModel;
+	}
+
+	private boolean hasInterfacesToGenerate() {
+		List<BusinessInterface> businessInterfaces = (List<BusinessInterface>) model.getProperty(INTERFACES);
+		boolean remoteHome = model.getBooleanProperty(REMOTE_HOME);
+		boolean localHome = model.getBooleanProperty(LOCAL_HOME);
+		return businessInterfaces.size() > 0 || remoteHome || localHome;
+	}
+	
+	private IFolder getClientSourceFolder() {
+		IFolder folder = getSourceFolder();
+		IPath folderRelativePath = folder.getProjectRelativePath();
+		IPath clientProjectPath = EJBUtilities.getEJBClientJar(getTargetProject()).getProject().getFullPath();
+		return ResourcesPlugin.getWorkspace().getRoot().getFolder(clientProjectPath.append(folderRelativePath));
+	}
+	
+	private IPackageFragmentRoot getClientPackageFragmentRoot() {
+		IFolder folder = getClientSourceFolder();
+		if (!folder.exists())
+			folder = getFirstJavaSourceFolderInClientJar();
+		if (folder == null)
+			return null;
+		IProject clientProject = EJBUtilities.getEJBClientJar(getTargetProject()).getProject();
+		IJavaProject clientJavaProject = JavaCore.create(clientProject);
+		return clientJavaProject.getPackageFragmentRoot(folder);
+	}
+
+	/**
+	 * This method will return the java package as specified by the new java
+	 * class data model. If the package does not exist, it will create the
+	 * package. This method should not return null.
+	 * 
+	 * @see INewJavaClassDataModelProperties#JAVA_PACKAGE
+	 * @see IPackageFragmentRoot#createPackageFragment(java.lang.String,
+	 *      boolean, org.eclipse.core.runtime.IProgressMonitor)
+	 * 
+	 * @return IPackageFragment the java package
+	 */
+	protected IPackageFragment createJavaPackage(String packageName) {
+		IPackageFragmentRoot packRoot = (IPackageFragmentRoot) model.getProperty(JAVA_PACKAGE_FRAGMENT_ROOT);
+		IPackageFragment pack = packRoot.getPackageFragment(packageName);
+		// Handle default package
+		if (pack == null) {
+			pack = packRoot.getPackageFragment(""); //$NON-NLS-1$
+		}
+
+		// Create the package fragment if it does not exist
+		if (!pack.exists()) {
+			String packName = pack.getElementName();
+			try {
+				pack = packRoot.createPackageFragment(packName, true, null);
+			} catch (JavaModelException e) {
+				J2EEPlugin.logError(e);
+			}
+		}
+		// Return the package
+		return pack;
+	}
+	
+	private static void createFolder( final IFolder folder,
+	            final boolean isDerived )	throws CoreException {
+		if( ! folder.exists() ){
+
+			final IContainer parent = folder.getParent();
+		
+			if( parent instanceof IFolder ){
+				createFolder( (IFolder) parent, isDerived );
+			}
+		
+			folder.create( true, true, null );
+			folder.setDerived( isDerived );
+		}
+	}	
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/RemoteBusinessInterfaceTemplate.java b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/RemoteBusinessInterfaceTemplate.java
new file mode 100644
index 0000000..89eb3b7
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/RemoteBusinessInterfaceTemplate.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2012 SAP AG 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
+ *
+ * This class has been generated from a javajet template. 
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.ejb.internal.operations;
+
+public class RemoteBusinessInterfaceTemplate
+{
+  protected static String nl;
+  public static synchronized RemoteBusinessInterfaceTemplate create(String lineSeparator)
+  {
+    nl = lineSeparator;
+    RemoteBusinessInterfaceTemplate result = new RemoteBusinessInterfaceTemplate();
+    nl = null;
+    return result;
+  }
+
+  public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl; //$NON-NLS-1$
+  protected final String TEXT_1 = "package "; //$NON-NLS-1$
+  protected final String TEXT_2 = ";"; //$NON-NLS-1$
+  protected final String TEXT_3 = NL;
+  protected final String TEXT_4 = NL + "import javax.ejb.Remote;" + NL + "" + NL + "@Remote"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+  protected final String TEXT_5 = NL + "public interface "; //$NON-NLS-1$
+  protected final String TEXT_6 = " {" + NL + "" + NL + "}"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+  protected final String TEXT_7 = NL;
+
+  public String generate(Object argument)
+  {
+    final StringBuffer stringBuffer = new StringBuffer();
+     CreateSessionBeanTemplateModel model = (CreateSessionBeanTemplateModel) argument; 
+    
+	if (model.getBusinessInterfaceJavaPackageName() != null && model.getBusinessInterfaceJavaPackageName().length() > 0) {
+
+    stringBuffer.append(TEXT_1);
+    stringBuffer.append(model.getBusinessInterfaceJavaPackageName());
+    stringBuffer.append(TEXT_2);
+    
+	}
+
+    stringBuffer.append(TEXT_3);
+    
+	if (model.addBusinessAnnotationToInterface()) {
+
+    stringBuffer.append(TEXT_4);
+    
+	}
+
+    stringBuffer.append(TEXT_5);
+    stringBuffer.append(model.getBusinessInterfaceClassName());
+    stringBuffer.append(TEXT_6);
+    stringBuffer.append(TEXT_7);
+    return stringBuffer.toString();
+  }
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/RemoteComponentInterfaceTemplate.java b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/RemoteComponentInterfaceTemplate.java
new file mode 100644
index 0000000..7bf3e08
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/RemoteComponentInterfaceTemplate.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2012 SAP AG 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
+ *
+ * This class has been generated from a javajet template. 
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.ejb.internal.operations;
+
+public class RemoteComponentInterfaceTemplate
+{
+  protected static String nl;
+  public static synchronized RemoteComponentInterfaceTemplate create(String lineSeparator)
+  {
+    nl = lineSeparator;
+    RemoteComponentInterfaceTemplate result = new RemoteComponentInterfaceTemplate();
+    nl = null;
+    return result;
+  }
+
+  public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl; //$NON-NLS-1$
+  protected final String TEXT_1 = "package "; //$NON-NLS-1$
+  protected final String TEXT_2 = ";"; //$NON-NLS-1$
+  protected final String TEXT_3 = NL + NL + "import javax.ejb.EJBObject;" + NL + "" + NL + "public interface "; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+  protected final String TEXT_4 = " extends EJBObject {" + NL + "" + NL + "}"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+  protected final String TEXT_5 = NL;
+
+  public String generate(Object argument)
+  {
+    final StringBuffer stringBuffer = new StringBuffer();
+     CreateSessionBeanTemplateModel model = (CreateSessionBeanTemplateModel) argument; 
+    
+	if (model.getRemoteComponentPackage() != null && model.getRemoteComponentPackage().length() > 0) {
+
+    stringBuffer.append(TEXT_1);
+    stringBuffer.append(model.getRemoteComponentPackage());
+    stringBuffer.append(TEXT_2);
+    
+	}
+
+    stringBuffer.append(TEXT_3);
+    stringBuffer.append( model.getRemoteComponentClassSimpleName() );
+    stringBuffer.append(TEXT_4);
+    stringBuffer.append(TEXT_5);
+    return stringBuffer.toString();
+  }
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/RemoteHomeInterfaceTemplate.java b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/RemoteHomeInterfaceTemplate.java
new file mode 100644
index 0000000..2710e6d
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/RemoteHomeInterfaceTemplate.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2011 SAP AG 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
+ *
+ * This class has been generated from a javajet template. 
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.ejb.internal.operations;
+
+public class RemoteHomeInterfaceTemplate
+{
+  protected static String nl;
+  public static synchronized RemoteHomeInterfaceTemplate create(String lineSeparator)
+  {
+    nl = lineSeparator;
+    RemoteHomeInterfaceTemplate result = new RemoteHomeInterfaceTemplate();
+    nl = null;
+    return result;
+  }
+
+  public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl; //$NON-NLS-1$
+  protected final String TEXT_1 = "package "; //$NON-NLS-1$
+  protected final String TEXT_2 = ";"; //$NON-NLS-1$
+  protected final String TEXT_3 = NL + NL + "import java.rmi.RemoteException;" + NL + "" + NL + "import javax.ejb.CreateException;" + NL + "import javax.ejb.EJBHome;"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+  protected final String TEXT_4 = NL + "import "; //$NON-NLS-1$
+  protected final String TEXT_5 = "."; //$NON-NLS-1$
+  protected final String TEXT_6 = ";"; //$NON-NLS-1$
+  protected final String TEXT_7 = NL + NL + "public interface "; //$NON-NLS-1$
+  protected final String TEXT_8 = " extends EJBHome {" + NL + "" + NL + "\tpublic "; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+  protected final String TEXT_9 = " create() throws CreateException, RemoteException;" + NL + "\t" + NL + "}"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+  protected final String TEXT_10 = NL;
+
+  public String generate(Object argument)
+  {
+    final StringBuffer stringBuffer = new StringBuffer();
+     CreateSessionBeanTemplateModel model = (CreateSessionBeanTemplateModel) argument; 
+    
+	if (model.getRemoteHomePackage() != null && model.getRemoteHomePackage().length() > 0) {
+
+    stringBuffer.append(TEXT_1);
+    stringBuffer.append(model.getRemoteHomePackage());
+    stringBuffer.append(TEXT_2);
+    
+	}
+
+    stringBuffer.append(TEXT_3);
+     if(!model.getRemoteComponentPackage().equals(model.getRemoteHomePackage())){
+    stringBuffer.append(TEXT_4);
+    stringBuffer.append( model.getRemoteComponentPackage() );
+    stringBuffer.append(TEXT_5);
+    stringBuffer.append( model.getRemoteComponentClassSimpleName() );
+    stringBuffer.append(TEXT_6);
+    }
+    stringBuffer.append(TEXT_7);
+    stringBuffer.append(model.getRemoteHomeClassSimpleName());
+    stringBuffer.append(TEXT_8);
+    stringBuffer.append( model.getRemoteComponentClassSimpleName() );
+    stringBuffer.append(TEXT_9);
+    stringBuffer.append(TEXT_10);
+    return stringBuffer.toString();
+  }
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/SessionBeanTemplate.java b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/SessionBeanTemplate.java
new file mode 100644
index 0000000..8693ded
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/SessionBeanTemplate.java
@@ -0,0 +1,376 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2014 SAP AG 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
+ *
+ * This class has been generated from a javajet template.
+ * IBM - Async and Non-persistent support 
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.ejb.internal.operations;
+
+import java.util.*;
+import org.eclipse.jst.j2ee.internal.common.operations.*;
+
+public class SessionBeanTemplate
+{
+  protected static String nl;
+  public static synchronized SessionBeanTemplate create(String lineSeparator)
+  {
+    nl = lineSeparator;
+    SessionBeanTemplate result = new SessionBeanTemplate();
+    nl = null;
+    return result;
+  }
+
+  public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl; //$NON-NLS-1$
+  protected final String TEXT_1 = "package "; //$NON-NLS-1$
+  protected final String TEXT_2 = ";"; //$NON-NLS-1$
+  protected final String TEXT_3 = NL;
+  protected final String TEXT_4 = NL + "import "; //$NON-NLS-1$
+  protected final String TEXT_5 = ";"; //$NON-NLS-1$
+  protected final String TEXT_6 = NL;
+  protected final String TEXT_7 = NL;
+  protected final String TEXT_8 = "/**" + NL + " * Session Bean implementation class "; //$NON-NLS-1$ //$NON-NLS-2$
+  protected final String TEXT_9 = NL + " */"; //$NON-NLS-1$
+  protected final String TEXT_10 = NL;
+  protected final String TEXT_11 = "("; //$NON-NLS-1$
+  protected final String TEXT_12 = ", "; //$NON-NLS-1$
+  protected final String TEXT_13 = " = \""; //$NON-NLS-1$
+  protected final String TEXT_14 = "\""; //$NON-NLS-1$
+  protected final String TEXT_15 = ")"; //$NON-NLS-1$
+  protected final String TEXT_16 = NL + "@TransactionManagement(TransactionManagementType.BEAN)"; //$NON-NLS-1$
+  protected final String TEXT_17 = NL + "@Local("; //$NON-NLS-1$
+  protected final String TEXT_18 = ", "; //$NON-NLS-1$
+  protected final String TEXT_19 = ".class"; //$NON-NLS-1$
+  protected final String TEXT_20 = ")"; //$NON-NLS-1$
+  protected final String TEXT_21 = NL + "@Remote("; //$NON-NLS-1$
+  protected final String TEXT_22 = ", "; //$NON-NLS-1$
+  protected final String TEXT_23 = ".class"; //$NON-NLS-1$
+  protected final String TEXT_24 = ")"; //$NON-NLS-1$
+  protected final String TEXT_25 = NL + "@LocalBean"; //$NON-NLS-1$
+  protected final String TEXT_26 = NL + "@LocalHome("; //$NON-NLS-1$
+  protected final String TEXT_27 = ".class)"; //$NON-NLS-1$
+  protected final String TEXT_28 = NL + "@RemoteHome("; //$NON-NLS-1$
+  protected final String TEXT_29 = ".class)"; //$NON-NLS-1$
+  protected final String TEXT_30 = NL + "@Asynchronous"; //$NON-NLS-1$
+  protected final String TEXT_31 = NL + "public "; //$NON-NLS-1$
+  protected final String TEXT_32 = "abstract "; //$NON-NLS-1$
+  protected final String TEXT_33 = "final "; //$NON-NLS-1$
+  protected final String TEXT_34 = "class "; //$NON-NLS-1$
+  protected final String TEXT_35 = " extends "; //$NON-NLS-1$
+  protected final String TEXT_36 = " implements "; //$NON-NLS-1$
+  protected final String TEXT_37 = ", "; //$NON-NLS-1$
+  protected final String TEXT_38 = " {"; //$NON-NLS-1$
+  protected final String TEXT_39 = NL + NL + "    /**" + NL + "     * Default constructor. " + NL + "     */" + NL + "    public "; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+  protected final String TEXT_40 = "() {" + NL + "        // TODO Auto-generated constructor stub" + NL + "    }"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+  protected final String TEXT_41 = NL + "       " + NL + "    /**" + NL + "     * @see "; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+  protected final String TEXT_42 = "#"; //$NON-NLS-1$
+  protected final String TEXT_43 = "("; //$NON-NLS-1$
+  protected final String TEXT_44 = ")" + NL + "     */" + NL + "    public "; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+  protected final String TEXT_45 = "("; //$NON-NLS-1$
+  protected final String TEXT_46 = ") {" + NL + "        super("; //$NON-NLS-1$ //$NON-NLS-2$
+  protected final String TEXT_47 = ");" + NL + "        // TODO Auto-generated constructor stub" + NL + "    }"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+  protected final String TEXT_48 = NL + NL + "\t/**" + NL + "     * @see "; //$NON-NLS-1$ //$NON-NLS-2$
+  protected final String TEXT_49 = "#"; //$NON-NLS-1$
+  protected final String TEXT_50 = "("; //$NON-NLS-1$
+  protected final String TEXT_51 = ")" + NL + "     */" + NL + "    public "; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+  protected final String TEXT_52 = " "; //$NON-NLS-1$
+  protected final String TEXT_53 = "("; //$NON-NLS-1$
+  protected final String TEXT_54 = ") {" + NL + "        // TODO Auto-generated method stub"; //$NON-NLS-1$ //$NON-NLS-2$
+  protected final String TEXT_55 = NL + "\t\t\treturn "; //$NON-NLS-1$
+  protected final String TEXT_56 = ";"; //$NON-NLS-1$
+  protected final String TEXT_57 = NL + "    }"; //$NON-NLS-1$
+  protected final String TEXT_58 = NL + NL + "}"; //$NON-NLS-1$
+  protected final String TEXT_59 = NL;
+
+  public String generate(Object argument)
+  {
+    final StringBuffer stringBuffer = new StringBuffer();
+     CreateSessionBeanTemplateModel model = (CreateSessionBeanTemplateModel) argument; 
+    
+	model.removeFlags(CreateJavaEEArtifactTemplateModel.FLAG_QUALIFIED_SUPERCLASS_NAME); 
+
+    
+	if (model.getJavaPackageName() != null && model.getJavaPackageName().length() > 0) {
+
+    stringBuffer.append(TEXT_1);
+    stringBuffer.append( model.getJavaPackageName() );
+    stringBuffer.append(TEXT_2);
+    
+	}
+
+    stringBuffer.append(TEXT_3);
+     
+	Collection<String> imports = model.getImports();
+	for (String anImport : imports) { 
+
+    stringBuffer.append(TEXT_4);
+    stringBuffer.append( anImport );
+    stringBuffer.append(TEXT_5);
+     
+	}
+
+    stringBuffer.append(TEXT_6);
+    stringBuffer.append(TEXT_7);
+    stringBuffer.append(TEXT_8);
+    stringBuffer.append( model.getClassName() );
+    stringBuffer.append(TEXT_9);
+    stringBuffer.append(TEXT_10);
+    stringBuffer.append( model.getClassAnnotation() );
+    
+	Map<String, String> params = model.getClassAnnotationParams();
+	if (!params.isEmpty()) { 
+
+    stringBuffer.append(TEXT_11);
+    
+		Set<String> keys = params.keySet();
+		boolean needComma = false;
+		for (String key : keys) {
+			if (needComma) {
+
+    stringBuffer.append(TEXT_12);
+    
+			}
+			
+			String value = params.get(key);
+
+    stringBuffer.append( key );
+    stringBuffer.append(TEXT_13);
+    stringBuffer.append( value );
+    stringBuffer.append(TEXT_14);
+    
+			needComma = true;
+  		}
+
+    stringBuffer.append(TEXT_15);
+    
+	}
+
+	if (!model.isContainerType()) {
+
+    stringBuffer.append(TEXT_16);
+    
+	}
+
+	List<BusinessInterface> localInterfaces = null;
+	if (model.addBusinessAnnotationToBeanClass()){
+		localInterfaces = model.getLocalBusinessInterfaces();
+	}
+	else {
+		localInterfaces = model.getExistingLocalBusinessInterfaces();
+	}
+	if (!localInterfaces.isEmpty()) {
+		String open = "", close = ""; //$NON-NLS-1$ //$NON-NLS-2$
+		if (localInterfaces.size() > 1){
+			open = "{"; //$NON-NLS-1$
+			close = "}"; //$NON-NLS-1$
+		}
+
+    stringBuffer.append(TEXT_17);
+    stringBuffer.append( open );
+    
+		boolean needComma = false;
+		for (BusinessInterface iface : localInterfaces) {
+			if (needComma) {
+
+    stringBuffer.append(TEXT_18);
+    
+			}
+
+    stringBuffer.append( iface.getSimpleName() );
+    stringBuffer.append(TEXT_19);
+    
+			needComma = true;
+ 		}
+
+    stringBuffer.append( close );
+    stringBuffer.append(TEXT_20);
+    
+	}
+
+	List<BusinessInterface> remoteInterfaces = null;
+	if (model.addBusinessAnnotationToBeanClass()){
+		remoteInterfaces = model.getRemoteBusinessInterfaces();
+	}
+	else{
+		remoteInterfaces = model.getExistingRemoteBusinessInterfaces();
+	}
+	if (!remoteInterfaces.isEmpty()) {
+		String open = "", close = ""; //$NON-NLS-1$ //$NON-NLS-2$
+		if (remoteInterfaces.size() > 1){
+			open = "{"; //$NON-NLS-1$
+			close = "}"; //$NON-NLS-1$
+		}
+
+    stringBuffer.append(TEXT_21);
+    stringBuffer.append( open );
+    
+		boolean needComma = false;
+		for (BusinessInterface iface : remoteInterfaces) {
+			if (needComma) {
+
+    stringBuffer.append(TEXT_22);
+    
+			}
+
+    stringBuffer.append( iface.getSimpleName() );
+    stringBuffer.append(TEXT_23);
+    
+			needComma = true;
+		}
+
+    stringBuffer.append( close );
+    stringBuffer.append(TEXT_24);
+    
+	}
+	
+	if (model.isNoInterfaceChecked()) {
+
+    stringBuffer.append(TEXT_25);
+    
+	}
+		
+	if (model.isLocalHomeChecked()) {
+
+    stringBuffer.append(TEXT_26);
+    stringBuffer.append(model.getLocalHomeClassSimpleName());
+    stringBuffer.append(TEXT_27);
+    
+	}
+
+	if (model.isRemoteHomeChecked()) {
+
+    stringBuffer.append(TEXT_28);
+    stringBuffer.append(model.getRemoteHomeClassSimpleName());
+    stringBuffer.append(TEXT_29);
+    
+	}
+
+    
+	if (model.isAsynchronous()) {
+
+    stringBuffer.append(TEXT_30);
+    
+	}
+
+    
+	if (model.isPublic()) { 
+
+    stringBuffer.append(TEXT_31);
+     
+	} 
+
+	if (model.isAbstract()) { 
+
+    stringBuffer.append(TEXT_32);
+    
+	}
+
+	if (model.isFinal()) {
+
+    stringBuffer.append(TEXT_33);
+    
+	}
+
+    stringBuffer.append(TEXT_34);
+    stringBuffer.append( model.getClassName() );
+    
+	String superClass = model.getSuperclassName();
+ 	if (superClass != null && superClass.length() > 0) {
+
+    stringBuffer.append(TEXT_35);
+    stringBuffer.append( superClass );
+    
+	}
+
+	List<String> interfaces = model.getInterfaces(); 
+ 	if ( interfaces.size() > 0) { 
+
+    stringBuffer.append(TEXT_36);
+    
+	}
+	
+ 	for (int i = 0; i < interfaces.size(); i++) {
+   		String INTERFACE = interfaces.get(i);
+   		if (i > 0) {
+
+    stringBuffer.append(TEXT_37);
+    
+		}
+
+    stringBuffer.append( INTERFACE );
+    
+	}
+
+    stringBuffer.append(TEXT_38);
+     
+	if (!model.hasEmptySuperclassConstructor()) { 
+
+    stringBuffer.append(TEXT_39);
+    stringBuffer.append( model.getClassName() );
+    stringBuffer.append(TEXT_40);
+     
+	} 
+
+	if (model.shouldGenSuperclassConstructors()) {
+		List<Constructor> constructors = model.getConstructors();
+		for (Constructor constructor : constructors) {
+			if (constructor.isPublic() || constructor.isProtected()) { 
+
+    stringBuffer.append(TEXT_41);
+    stringBuffer.append( model.getSuperclassName() );
+    stringBuffer.append(TEXT_42);
+    stringBuffer.append( model.getSuperclassName() );
+    stringBuffer.append(TEXT_43);
+    stringBuffer.append( constructor.getParamsForJavadoc() );
+    stringBuffer.append(TEXT_44);
+    stringBuffer.append( model.getClassName() );
+    stringBuffer.append(TEXT_45);
+    stringBuffer.append( constructor.getParamsForDeclaration() );
+    stringBuffer.append(TEXT_46);
+    stringBuffer.append( constructor.getParamsForCall() );
+    stringBuffer.append(TEXT_47);
+    
+			} 
+		} 
+	} 
+
+    
+	if (model.shouldImplementAbstractMethods()) {
+		for (Method method : model.getUnimplementedMethods()) { 
+
+    stringBuffer.append(TEXT_48);
+    stringBuffer.append( method.getContainingJavaClass() );
+    stringBuffer.append(TEXT_49);
+    stringBuffer.append( method.getName() );
+    stringBuffer.append(TEXT_50);
+    stringBuffer.append( method.getParamsForJavadoc() );
+    stringBuffer.append(TEXT_51);
+    stringBuffer.append( method.getReturnType() );
+    stringBuffer.append(TEXT_52);
+    stringBuffer.append( method.getName() );
+    stringBuffer.append(TEXT_53);
+    stringBuffer.append( method.getParamsForDeclaration() );
+    stringBuffer.append(TEXT_54);
+     
+			String defaultReturnValue = method.getDefaultReturnValue();
+			if (defaultReturnValue != null) { 
+
+    stringBuffer.append(TEXT_55);
+    stringBuffer.append( defaultReturnValue );
+    stringBuffer.append(TEXT_56);
+    
+			} 
+
+    stringBuffer.append(TEXT_57);
+     
+		}
+	} 
+
+    stringBuffer.append(TEXT_58);
+    stringBuffer.append(TEXT_59);
+    return stringBuffer.toString();
+  }
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/StateType.java b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/StateType.java
new file mode 100644
index 0000000..a379220
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/StateType.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2008 SAP AG 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:
+ * Kaloyan Raev, kaloyan.raev@sap.com - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.ejb.internal.operations;
+
+/**
+ * Enumerates the session state type values of a session bean. 
+ * 
+ * @since 3.0
+ */
+public enum StateType {
+
+	/**
+	 * Represents the <code>Stateless</code> session state type.
+	 * 
+	 * @since 3.0
+	 */
+	STATELESS,
+	
+	/**
+	 * Represents the <code>Stateful</code> session state type.
+	 * 
+	 * @since 3.0
+	 */
+	STATEFUL, 
+	
+	/**
+	 * Represents the <code>Singleton</code> session state type.
+	 * 
+	 * @since 3.2
+	 */
+	SINGLETON;
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/TransactionType.java b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/TransactionType.java
new file mode 100644
index 0000000..3181fb6
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/TransactionType.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2008 SAP AG 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:
+ * Kaloyan Raev, kaloyan.raev@sap.com - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.ejb.internal.operations;
+
+/**
+ * Enumerates the transaction type values of an enterprise bean. 
+ */
+public enum TransactionType {
+
+	/**
+	 * Represents the <code>Container</code> transaction type.
+	 */
+	CONTAINER,
+	
+	/**
+	 * Represents the <code>Bean</code> transaction type. 
+	 */
+	BEAN;
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/plugin/Assert.java b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/plugin/Assert.java
new file mode 100644
index 0000000..1b612d1
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/plugin/Assert.java
@@ -0,0 +1,110 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.ejb.internal.plugin;
+
+/**
+ * <code>Assert</code> is useful for for embedding runtime sanity checks
+ * in code.
+ * The predicate methods all test a condition and throw some
+ * type of unchecked exception if the condition does not hold.
+ * <p>
+ * Assertion failure exceptions, like most runtime exceptions, are
+ * thrown when something is misbehaving. Assertion failures are invariably
+ * unspecified behavior; consequently, clients should never rely on
+ * these being thrown (and certainly should not being catching them
+ * specifically).
+ * </p>
+ */
+public final class Assert {
+	/* This class is not intended to be instantiated. */
+	private Assert() {
+		// not allowed
+	}
+
+	/** Asserts that an argument is legal. If the given boolean is
+	 * not <code>true</code>, an <code>IllegalArgumentException</code>
+	 * is thrown.
+	 *
+	 * @param expression the outcode of the check
+	 * @return <code>true</code> if the check passes (does not return
+	 *    if the check fails)
+	 * @exception IllegalArgumentException if the legality test failed
+	 */
+	public static boolean isLegal(boolean expression) {
+		return isLegal(expression, ""); //$NON-NLS-1$
+	}
+
+	/** Asserts that an argument is legal. If the given boolean is
+	 * not <code>true</code>, an <code>IllegalArgumentException</code>
+	 * is thrown.
+	 * The given message is included in that exception, to aid debugging.
+	 *
+	 * @param expression the outcode of the check
+	 * @param message the message to include in the exception
+	 * @return <code>true</code> if the check passes (does not return
+	 *    if the check fails)
+	 * @exception IllegalArgumentException if the legality test failed
+	 */
+	public static boolean isLegal(boolean expression, String message) {
+		if (!expression)
+			throw new IllegalArgumentException(message);
+		return expression;
+	}
+
+	/** Asserts that the given object is not <code>null</code>. If this
+	 * is not the case, some kind of unchecked exception is thrown.
+	 * 
+	 * @param object the value to test
+	 * @exception IllegalArgumentException if the object is <code>null</code>
+	 */
+	public static void isNotNull(Object object) {
+		isNotNull(object, ""); //$NON-NLS-1$
+	}
+
+	/** Asserts that the given object is not <code>null</code>. If this
+	 * is not the case, some kind of unchecked exception is thrown.
+	 * The given message is included in that exception, to aid debugging.
+	 *
+	 * @param object the value to test
+	 * @param message the message to include in the exception
+	 * @exception IllegalArgumentException if the object is <code>null</code>
+	 */
+	public static void isNotNull(Object object, String message) {
+		if (object == null)
+			throw new AssertionFailedException("null argument:" + message); //$NON-NLS-1$
+	}
+
+	/** Asserts that the given boolean is <code>true</code>. If this
+	 * is not the case, some kind of unchecked exception is thrown.
+	 *
+	 * @param expression the outcode of the check
+	 * @return <code>true</code> if the check passes (does not return
+	 *    if the check fails)
+	 */
+	public static boolean isTrue(boolean expression) {
+		return isTrue(expression, ""); //$NON-NLS-1$
+	}
+
+	/** Asserts that the given boolean is <code>true</code>. If this
+	 * is not the case, some kind of unchecked exception is thrown.
+	 * The given message is included in that exception, to aid debugging.
+	 *
+	 * @param expression the outcode of the check
+	 * @param message the message to include in the exception
+	 * @return <code>true</code> if the check passes (does not return
+	 *    if the check fails)
+	 */
+	public static boolean isTrue(boolean expression, String message) {
+		if (!expression)
+			throw new AssertionFailedException("assertion failed: " + message); //$NON-NLS-1$
+		return expression;
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/plugin/AssertionFailedException.java b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/plugin/AssertionFailedException.java
new file mode 100644
index 0000000..d1325e6
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/plugin/AssertionFailedException.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.ejb.internal.plugin;
+
+/**
+ * <code>AssertionFailedException</code> is a runtime exception thrown
+ * by some of the methods in <code>Assert</code>.
+ * <p>
+ * This class is not declared public to prevent some misuses; programs that catch 
+ * or otherwise depend on assertion failures are susceptible to unexpected
+ * breakage when assertions in the code are added or removed.
+ * </p>
+ */
+/* package */
+class AssertionFailedException extends RuntimeException {
+	/**
+	 * All serializable objects should have a stable serialVersionUID
+	 */
+	private static final long serialVersionUID = 1L;
+
+	/** Constructs a new exception with the given message.
+	 */
+	public AssertionFailedException(String detail) {
+		super(detail);
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/plugin/EjbModuleExtensionImpl.java b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/plugin/EjbModuleExtensionImpl.java
new file mode 100644
index 0000000..cf27101
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/plugin/EjbModuleExtensionImpl.java
@@ -0,0 +1,180 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ * Created on Sep 29, 2003
+ * 
+ * To change the template for this generated file go to Window&gt;Preferences&gt;Java&gt;Code
+ * Generation&gt;Code and Comments
+ */
+package org.eclipse.jst.j2ee.ejb.internal.plugin;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jst.j2ee.ejb.EJBJar;
+import org.eclipse.jst.j2ee.ejb.componentcore.util.EJBArtifactEdit;
+import org.eclipse.jst.j2ee.ejb.internal.modulecore.util.EJBArtifactEditUtilities;
+import org.eclipse.jst.j2ee.internal.archive.operations.ImportOption;
+import org.eclipse.jst.j2ee.internal.ejb.archiveoperations.EjbClientJarCreationDataModelProvider;
+import org.eclipse.jst.j2ee.internal.ejb.archiveoperations.EjbClientProjectCreationDataModelProvider;
+import org.eclipse.jst.j2ee.internal.ejb.archiveoperations.EjbClientProjectCreationOperation;
+import org.eclipse.jst.j2ee.internal.ejb.archiveoperations.IEjbClientProjectCreationDataModelProperties;
+import org.eclipse.jst.j2ee.internal.ejb.project.operations.EJBComponentImportDataModelProvider;
+import org.eclipse.jst.j2ee.internal.ejb.project.operations.EjbFacetProjectCreationDataModelProvider;
+import org.eclipse.jst.j2ee.internal.ejb.project.operations.IEjbFacetInstallDataModelProperties;
+import org.eclipse.jst.j2ee.internal.moduleextension.EarModuleExtensionImpl;
+import org.eclipse.jst.j2ee.internal.moduleextension.EjbModuleExtension;
+import org.eclipse.jst.j2ee.internal.project.IJ2EEProjectTypes;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
+
+
+public class EjbModuleExtensionImpl extends EarModuleExtensionImpl implements EjbModuleExtension {
+
+	public EjbModuleExtensionImpl() {
+		super();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jst.j2ee.internal.internal.moduleextension.EjbModuleExtension#initializeEjbReferencesToModule(org.eclipse.jst.j2ee.internal.internal.j2eeproject.J2EENature)
+	 */
+//	public void initializeEjbReferencesToModule(J2EENature nature, UpdateModuleReferencesInEARProjectCommand cmd) {
+//		
+//		IVirtualComponent[] comps = ComponentUtilities.getComponentsForProject(nature.getProject());
+//		if (comps.length == 0)
+//			return;
+//		EJBArtifactEdit edit = EJBArtifactEdit.getEJBArtifactEditForRead(comps[0]);
+//		boolean foundRef = false;
+//		try {
+//			EJBJar jar = edit.getEJBJar();
+//			if (jar != null) {
+//				List ejbs = jar.getEnterpriseBeans();
+//				int size = ejbs.size();
+//				EnterpriseBean ejb;
+//				for (int i = 0; i < size; i++) {
+//					ejb = (EnterpriseBean) ejbs.get(i);
+//					foundRef = foundRef || cmd.initializeEjbReferencesToModule(ejb.getEjbRefs());
+//					foundRef = foundRef || cmd.initializeEjbReferencesToModule(ejb.getEjbLocalRefs());
+//				}
+//			}
+//			if (foundRef)
+//				cmd.addNestedEditModel((J2EEEditModel)edit.getAdapter(ArtifactEditModel.class));
+//		} finally {
+//			if (edit != null)
+//				edit.dispose();
+//		}
+//	}
+
+	public EJBJar getEJBJar(IProject aProject) {
+		
+		IVirtualComponent comp = ComponentCore.createComponent(aProject);
+		return EJBArtifactEditUtilities.getEJBJar(comp);
+	}
+
+	public IProject getDefinedEJBClientJARProject(IProject anEJBProject) {
+		IVirtualComponent comp = ComponentCore.createComponent(anEJBProject);
+		EJBArtifactEdit edit = null;
+		IVirtualComponent clientComp = null;
+		try {
+			edit = EJBArtifactEdit.getEJBArtifactEditForRead(comp);
+			clientComp = edit.getEJBClientJarModule();
+		} finally {
+			if (edit != null)
+				edit.dispose();
+		}
+		if (clientComp == null)
+			return null;
+		return clientComp.getProject();
+	}
+
+	public IDataModelOperation createEJBClientJARProject(
+			final String clientProjectName,
+			final String srcFolderName,
+			final String ejbProjectName,
+			final String earProjectName,
+			final org.eclipse.wst.common.project.facet.core.runtime.IRuntime runtime){
+		
+		IDataModel dm = DataModelFactory.createDataModel(new EjbClientProjectCreationDataModelProvider());
+		dm.setProperty(IEjbClientProjectCreationDataModelProperties.PROJECT_NAME,
+				clientProjectName );
+		
+		dm.setProperty(IEjbClientProjectCreationDataModelProperties.EJB_PROJECT_NAME,
+				ejbProjectName );
+		
+		dm.setProperty(IEjbClientProjectCreationDataModelProperties.SOURCE_FOLDER,
+				srcFolderName );
+		
+		dm.setProperty(IEjbClientProjectCreationDataModelProperties.EAR_PROJECT_NAME,
+				earProjectName );
+		
+		dm.setProperty(IEjbClientProjectCreationDataModelProperties.RUNTIME,
+				runtime );
+		
+		EjbClientProjectCreationOperation op = new EjbClientProjectCreationOperation(dm);
+		return op;		
+	}
+
+	public IDataModelOperation createEJBClientJARProject(IProject ejbProject){
+		IDataModel dm = DataModelFactory.createDataModel( new EjbClientJarCreationDataModelProvider());
+		dm.setStringProperty(EjbClientJarCreationDataModelProvider.EJB_PROJECT_NAME, ejbProject.getName());
+		return dm.getDefaultOperation();
+	}
+	
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jst.j2ee.internal.internal.moduleextension.EarModuleExtension#createProjectDataModel()
+	 */
+	public IDataModel createProjectDataModel() {
+		//IDataModel model = DataModelFactory.createDataModel(new EjbComponentCreationDataModelProvider());
+
+		// Added this property so Application Creation Wizard, will not create a
+		// EJB client jar, when a EJB module is created.
+		//model.setProperty(IEjbComponentCreationDataModelProperties.CREATE_CLIENT, Boolean.FALSE);
+
+		// Override the default to not create a default session bean.
+		// This is necessary when creating a default EJB project from an EAR project wizard.
+		//model.setProperty(IEjbComponentCreationDataModelProperties.CREATE_DEFAULT_SESSION_BEAN, Boolean.FALSE);
+		
+		
+		IDataModel model = DataModelFactory.createDataModel(new EjbFacetProjectCreationDataModelProvider());
+		return model;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jst.j2ee.internal.internal.moduleextension.EarModuleExtension#createImportDataModel()
+	 */
+	public IDataModel createImportDataModel() {
+		return DataModelFactory.createDataModel(new EJBComponentImportDataModelProvider());
+	}
+
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jst.j2ee.internal.internal.moduleextension.EarModuleExtension#createProjectCreationOperation(com.ibm.etools.archive.ear.operations.ImportOption)
+	 */
+	@Override
+	public IDataModelOperation  createProjectCreationOperation(ImportOption option) {
+		if (option.getArchiveType() == IJ2EEProjectTypes.EJB_CLIENT) {
+            IDataModel model = option.getModel();
+			model.setProperty(IEjbFacetInstallDataModelProperties.CREATE_CLIENT, Boolean.TRUE);
+			return createProjectCreationOperation(model);
+		}
+		return super.createProjectCreationOperation(option);
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/plugin/EjbPlugin.java b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/plugin/EjbPlugin.java
new file mode 100644
index 0000000..4162852
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/plugin/EjbPlugin.java
@@ -0,0 +1,243 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2007 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.ejb.internal.plugin;
+
+import java.io.IOException;
+import java.net.URL;
+import java.text.MessageFormat;
+
+import org.eclipse.core.internal.boot.PlatformURLConnection;
+import org.eclipse.core.resources.IResourceStatus;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.emf.common.util.ResourceLocator;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
+import org.eclipse.wst.common.frameworks.internal.WTPPlugin;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+
+
+/**
+ * This is a top-level class of the j2ee plugin.
+ * 
+ * @see AbstractUIPlugin for additional information on UI plugins
+ */
+public class EjbPlugin extends WTPPlugin implements ResourceLocator {
+	// Default instance of the receiver
+	private static EjbPlugin inst;
+	protected final IPath iconsFolder = new Path(Platform.getBundle(PLUGIN_ID).getEntry("icons").getPath());//$NON-NLS-1$
+	// Links View part of the plugin
+	public static final String PLUGIN_ID = "org.eclipse.jst.j2ee.ejb";//$NON-NLS-1$
+	private static IPath location;
+
+	/**
+	 * Create the J2EE plugin and cache its default instance
+	 */
+	public EjbPlugin() {
+		super();
+		if (inst == null)
+			inst = this;
+	}
+
+	/**
+	 * Get the plugin singleton.
+	 */
+	static public EjbPlugin getDefault() {
+		return inst;
+	}
+
+	/*
+	 * Javadoc copied from interface.
+	 */
+	public URL getBaseURL() {
+		return getBundle().getEntry("/"); //$NON-NLS-1$
+	}
+
+	/**
+	 * This gets a .gif from the icons folder.
+	 */
+	public Object getImage(String key) {
+		return J2EEPlugin.getImageURL(key, getBundle());
+	}
+
+	public static IPath getInstallLocation() {
+		if (location == null) {
+			URL url = getInstallURL();
+			try {
+				String installLocation = ((PlatformURLConnection) url.openConnection()).getURLAsLocal().getFile();
+				location = new Path(installLocation);
+			} catch (IOException e) {
+				logError(e);
+			}
+		}
+		return location;
+	}
+
+	public static URL getInstallURL() {
+		return getDefault().getBundle().getEntry("/"); //$NON-NLS-1$
+	}
+
+	public static EjbPlugin getPlugin() {
+		return inst;
+	}
+
+	/**
+	 * Return the plugin directory location- the directory that all the plugins are located in (i.e.
+	 * d:\installdir\plugin)
+	 */
+	public static IPath getPluginLocation(String pluginId) {
+//		IExtensionRegistry registry = Platform.getExtensionRegistry();
+		Bundle bundle = Platform.getBundle(pluginId);
+		if (bundle != null) {
+			try {
+				IPath installPath = new Path(bundle.getEntry("/").toExternalForm()).removeTrailingSeparator(); //$NON-NLS-1$
+				String installStr = Platform.asLocalURL(new URL(installPath.toString())).getFile();
+				return new Path(installStr);
+			} catch (IOException e) {
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * If this is called from an operation, in response to some other exception that was caught,
+	 * then the client code should throw {@link com.ibm.etools.wft.util.WFTWrappedException};
+	 * otherwise this can still be used to signal some other error condition within the operation,
+	 * or to throw a core exception in a context other than executing an operation
+	 * 
+	 * Create a new IStatus of type ERROR, code OPERATION_FAILED, using the EjbPlugin ID
+	 */
+	public static IStatus createErrorStatus(String aMessage, Throwable exception) {
+		return createErrorStatus(0, aMessage, exception);
+	}
+
+	/**
+	 * If this is called from an operation, in response to some other exception that was caught,
+	 * then the client code should throw {@link com.ibm.etools.wft.util.WFTWrappedException};
+	 * otherwise this can still be used to signal some other error condition within the operation.
+	 * 
+	 * Create a new IStatus of type ERROR, code OPERATION_FAILED, using the EjbPlugin ID
+	 */
+	public static IStatus newOperationFailedStatus(String aMessage, Throwable exception) {
+		return createStatus(IStatus.ERROR, IResourceStatus.OPERATION_FAILED, aMessage, exception);
+	}
+
+	/**
+	 * Create a new IStatus with a severity using the EjbPlugin ID. aCode is just an internal code.
+	 */
+	public static IStatus createStatus(int severity, int aCode, String aMessage, Throwable exception) {
+		return new Status(severity, PLUGIN_ID, aCode, aMessage, exception);
+	}
+
+	public static IStatus createStatus(int severity, String message, Throwable exception) {
+		return new Status(severity, PLUGIN_ID, message, exception);
+	}
+
+	public static IStatus createStatus(int severity, String message) {
+		return createStatus(severity, message, null);
+	}
+
+	/*
+	 * Javadoc copied from interface.
+	 */
+	public String getString(String key) {
+		return Platform.getResourceString(getBundle(), key);
+	}
+
+	/*
+	 * Javadoc copied from interface.
+	 */
+	public String getString(String key, Object[] substitutions) {
+		return MessageFormat.format(getString(key), substitutions);
+	}
+
+	@Override
+	public String getPluginID() {
+		return PLUGIN_ID;
+	}
+
+	/**
+	 * If this is called from an operation, in response to some other exception that was caught,
+	 * then the client code should throw {@link com.ibm.etools.wft.util.WFTWrappedException};
+	 * otherwise this can still be used to signal some other error condition within the operation,
+	 * or to throw a core exception in a context other than executing an operation
+	 * 
+	 * Create a new IStatus of type ERROR using the EjbPlugin ID. aCode is just an internal code.
+	 */
+	public static IStatus createErrorStatus(int aCode, String aMessage, Throwable exception) {
+		return createStatus(IStatus.ERROR, aCode, aMessage != null ? aMessage : exception.toString(), exception);
+	}
+
+	@Override
+	public void start(BundleContext context) throws Exception {
+		super.start(context); 
+	}
+
+	public String getString(String key, boolean translate) {
+		// TODO For now...  translate not supported
+		return getString(key);
+	}
+
+	public String getString(String key, Object[] substitutions, boolean translate) {
+		// TODO For now...  translate not supported
+		return getString(key,substitutions);
+	}
+	
+	/**
+	 * Record an error against this plugin's log. 
+	 * 
+	 * @param aCode
+	 * @param aMessage
+	 * @param anException
+	 */
+	public static void logError(int aCode, String aMessage,
+			Throwable anException) {
+		getDefault().getLog().log(
+				createErrorStatus(aCode, aMessage, anException));
+	}
+
+	/**
+	 * 
+	 * Record a message against this plugin's log. 
+	 * 
+	 * @param severity
+	 * @param aCode
+	 * @param aMessage
+	 * @param exception
+	 */
+	public static void log(int severity, int aCode, String aMessage,
+			Throwable exception) {
+		log(createStatus(severity, aCode, aMessage, exception));
+	}
+
+	/**
+	 * 
+	 * Record a status against this plugin's log. 
+	 * 
+	 * @param aStatus
+	 */
+	public static void log(IStatus aStatus) {
+		getDefault().getLog().log(aStatus);
+	}
+
+	public static void logError(Throwable exception) {
+		Platform.getLog(Platform.getBundle(PLUGIN_ID)).log( createStatus(IStatus.ERROR, exception.getMessage(), exception));
+	}
+
+	public static void logError(CoreException exception) {
+		Platform.getLog(Platform.getBundle(PLUGIN_ID)).log( exception.getStatus() );
+	} 
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/ejb/archiveoperations/IEjbClientProjectCreationDataModelProperties.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/ejb/archiveoperations/IEjbClientProjectCreationDataModelProperties.java
new file mode 100644
index 0000000..7619698
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/ejb/archiveoperations/IEjbClientProjectCreationDataModelProperties.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.ejb.archiveoperations;
+
+import org.eclipse.jst.j2ee.internal.ejb.archiveoperations.EjbClientProjectCreationDataModelProvider;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEModuleFacetInstallDataModelProperties;
+import org.eclipse.jst.j2ee.project.facet.IJavaUtilityProjectCreationDataModelProperties;
+
+public interface IEjbClientProjectCreationDataModelProperties extends IJavaUtilityProjectCreationDataModelProperties{
+	/**
+	 * This field should not be used.  It is not part of the API and may be modified in the future.
+	 */
+	public static Class _provider_class = EjbClientProjectCreationDataModelProvider.class;
+
+	public static final String EJB_PROJECT_NAME = "IEjbClientProjectCreationDataModelProperties.EJB_PROJECT_NAME"; //$NON-NLS-1$
+	public static final String CLIENT_URI = "IEjbClientProjectCreationDataModelProperties.CLIENT_URI ";//$NON-NLS-1$	
+	public static final String ADD_TO_EAR = IJ2EEModuleFacetInstallDataModelProperties.ADD_TO_EAR;
+	public static final String DEFAULT_OUTPUT_FOLDER = "IEjbClientProjectCreationDataModelProperties.DEFAULT_OUTPUT_FOLDER";//$NON-NLS-1$
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/ejb/datamodel/properties/IEJBComponentExportDataModelProperties.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/ejb/datamodel/properties/IEJBComponentExportDataModelProperties.java
new file mode 100644
index 0000000..2614ba3
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/ejb/datamodel/properties/IEJBComponentExportDataModelProperties.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.ejb.datamodel.properties;
+
+import org.eclipse.jst.j2ee.datamodel.properties.IJ2EEComponentExportDataModelProperties;
+/**
+ * <p>
+ * IEJBComponentExportDataModelProperties provides properties to the IDataModel associated with the 
+ * EJBComponentExportDataModelProvider.
+ * NOTE: The associated Provider and Operations will be created during M5
+ * </p>
+ * <p>
+ * This interface is not intended to be implemented by clients.
+ * </p>
+ * 
+ * @see org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider
+ * @see org.eclipse.wst.common.frameworks.datamodel.DataModelFactory
+ * @see org.eclipse.wst.common.frameworks.datamodel.IDataModelProperties
+ * 
+ * @plannedfor 1.0
+ */
+public interface IEJBComponentExportDataModelProperties extends IJ2EEComponentExportDataModelProperties {
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/ejb/datamodel/properties/IEJBComponentImportDataModelProperties.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/ejb/datamodel/properties/IEJBComponentImportDataModelProperties.java
new file mode 100644
index 0000000..4785d50
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/ejb/datamodel/properties/IEJBComponentImportDataModelProperties.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.ejb.datamodel.properties;
+
+import org.eclipse.jst.j2ee.datamodel.properties.IJ2EEModuleImportDataModelProperties;
+/**
+ * <p>
+ * IEJBComponentImportDataModelProperties provides properties to the IDataModel associated with the 
+ * EJBComponentImportDataModelProvider.
+ * NOTE: The associated Provider and Operations will be created during M5
+ * </p>
+ * <p>
+ * This interface is not intended to be implemented by clients.
+ * </p>
+ * 
+ * @see org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider
+ * @see org.eclipse.wst.common.frameworks.datamodel.DataModelFactory
+ * @see org.eclipse.wst.common.frameworks.datamodel.IDataModelProperties
+ * 
+ * @plannedfor 1.0
+ */
+public interface IEJBComponentImportDataModelProperties extends IJ2EEModuleImportDataModelProperties {
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/ejb/datamodel/properties/package.xml b/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/ejb/datamodel/properties/package.xml
new file mode 100644
index 0000000..24dd5f3
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/ejb/datamodel/properties/package.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<html>
+    <head>
+        <meta
+            name="root"
+            content="../../../../../../../" />
+        <title>ejb module data model api overview</title>
+    </head>
+
+    <body>  
+		<abstract>
+        This package includes the api to create, import and export ejb modules. The interfaces in this package
+        define the properties that can be set on the ejb modules data models that are use to run the data model operations and drive the wizard data, validation.
+		</abstract>
+
+	<a href="#top">top</a>
+    </body>
+</html>    
+    
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/BatchDeploySaveFilter.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/BatchDeploySaveFilter.java
new file mode 100644
index 0000000..9862232
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/BatchDeploySaveFilter.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.internal.ejb.archiveoperations;
+
+
+
+import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.File;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.SaveFilter;
+
+
+/**
+ * Insert the type's description here. Creation date: (05/04/01 9:19:09 PM)
+ * 
+ * @author: Administrator
+ */
+public class BatchDeploySaveFilter implements SaveFilter {
+	protected SaveFilter target;
+
+	/**
+	 * Insert the method's description here. Creation date: (05/04/01 9:23:36 PM)
+	 * 
+	 * @param targetFilter
+	 *            com.ibm.etools.archive.SaveFilter
+	 */
+	public BatchDeploySaveFilter(SaveFilter targetFilter) {
+		super();
+		target = targetFilter;
+	}
+
+	/**
+	 * Answer whether an element in the archive having the uri should be saved; the uri may be for a
+	 * file, a nested archive, or a loaded mof resource. For deployed jars, if the file came was
+	 * copied from the orignal jar file, always save
+	 */
+	public boolean shouldSave(java.lang.String uri, Archive anArchive) {
+		File aFile = null;
+		try {
+			aFile = anArchive.getFile(uri);
+		} catch (java.io.FileNotFoundException mustBeAResource) {
+			//Ignore
+		}
+		if (aFile == null)
+			return targetShouldSave(uri, anArchive);
+		return aFile.getLoadingContainer() != anArchive || targetShouldSave(uri, anArchive);
+	}
+
+	protected boolean targetShouldSave(String uri, Archive anArchive) {
+		return target == null || target.shouldSave(uri, anArchive);
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/EJBArchiveOpsResourceHandler.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/EJBArchiveOpsResourceHandler.java
new file mode 100644
index 0000000..6b4f8c9
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/EJBArchiveOpsResourceHandler.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.internal.ejb.archiveoperations;
+
+import org.eclipse.osgi.util.NLS;
+
+public final class EJBArchiveOpsResourceHandler extends NLS {
+
+	private static final String BUNDLE_NAME = "ejbarchiveops";//$NON-NLS-1$
+
+	private EJBArchiveOpsResourceHandler() {
+		// Do not instantiate
+	}
+
+	public static String ARCHIVE_OPERATION_SaveMofResources;
+	public static String ARCHIVE_OPERATION_SaveFile;
+	public static String ARCHIVE_OPERATION_ProjectNature;
+	public static String ARCHIVE_OPERATION_SaveManifest;
+	public static String ARCHIVE_OPERATION_FileNotFound;
+	public static String ARCHIVE_OPERATION_FileContents;
+	public static String ARCHIVE_OPERATION_ErroOccured;
+	public static String ARCHIVE_OPERATION_FilesFromProject;
+	public static String ARCHIVE_OPERATION_OpeningArchive;
+	public static String ARCHIVE_OPERATION_InvalidEJBJar;
+	public static String ARCHIVE_OPERATION_InvalidImportEJBJar;
+	public static String ARCHIVE_OPERATION_ImportOperation;
+	public static String EJB_IMPORT_OPERATION_STRING;
+	public static String EJB_IMPORT_FILE_STRING;
+	public static String IMPORT_MOFRESOURCE_STRING;
+	public static String IMPORT_OPERATION_STRING;
+	public static String ERROR_COPYING_FILES_FROM_ORIGINAL_JAR;
+	public static String ERROR_IMPORTING_MODULE_FILE;
+	public static String Yes_UI;
+	public static String No_UI;
+	public static String Yes_To_All_UI;
+	public static String Cancel_UI_;
+	public static String Error_exporting__UI_;
+	public static String EJB_Jar_File_UI_;
+	public static String Copy_Dep_JARS_UI;
+
+	static {
+		NLS.initializeMessages(BUNDLE_NAME, EJBArchiveOpsResourceHandler.class);
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/EJBClientJARRemovalOperation.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/EJBClientJARRemovalOperation.java
new file mode 100644
index 0000000..92151c2
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/EJBClientJARRemovalOperation.java
@@ -0,0 +1,581 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.jst.j2ee.internal.ejb.archiveoperations;
+
+import java.lang.reflect.InvocationTargetException;
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.internal.resources.ResourceException;
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceVisitor;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
+import org.eclipse.jem.workbench.utility.JemProjectUtilities;
+import org.eclipse.jst.j2ee.application.internal.operations.UpdateManifestOperation;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveManifest;
+import org.eclipse.jst.j2ee.ejb.internal.plugin.EjbPlugin;
+import org.eclipse.jst.j2ee.internal.J2EEConstants;
+import org.eclipse.jst.j2ee.internal.ejb.project.operations.ClientJARCreationConstants;
+import org.eclipse.jst.j2ee.internal.plugin.IJ2EEModuleConstants;
+import org.eclipse.jst.j2ee.internal.plugin.LibCopyBuilder;
+import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
+import org.eclipse.jst.j2ee.model.IModelProvider;
+import org.eclipse.jst.j2ee.model.ModelProviderManager;
+import org.eclipse.jst.j2ee.project.EarUtilities;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.datamodel.properties.ICreateReferenceComponentsDataModelProperties;
+import org.eclipse.wst.common.componentcore.internal.operation.RemoveReferenceComponentsDataModelProvider;
+import org.eclipse.wst.common.componentcore.internal.util.IModuleConstants;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.internal.operations.IOperationHandler;
+
+
+/**
+ * @author schacher
+ * 
+ * To change the template for this generated type comment go to Window - Preferences - Java - Code
+ * Generation - Code and Comments
+ */
+public class EJBClientJARRemovalOperation extends AbstractDataModelOperation 
+ implements IEjbClientProjectRemovalDataModelProperties{
+
+	protected IProject ejbProject;
+	
+	protected IProject clientProject;
+	
+	protected IPath clientProjectPath, ejbProjectPath;
+
+	protected List sourceContainers, libraryContainers;
+
+	protected IContainer ejbSourceContainer;
+
+	protected IPath ejbSourcePath;
+
+	protected IPath outputPath;
+
+	protected boolean shouldDelete;
+
+	protected boolean yesToAll = false;
+	
+	protected IWorkspace workspace;
+	
+	protected IProgressMonitor monitor;
+	
+	protected IProgressMonitor moveResourceMonitor;
+	
+	protected IOperationHandler operationHandler;
+
+	public EJBClientJARRemovalOperation(IDataModel dataModel) {
+		super(dataModel);
+		shouldDelete = true;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jst.j2ee.internal.internal.ejb.clientjarcreation.AbstractEJBClientJAROperation#initialize()
+	 */
+	protected void initialize() {
+//		super.initialize();
+		ejbProject = (IProject) model.getProperty( IEjbClientProjectRemovalDataModelProperties.EJB_PROJECT );
+		clientProject = (IProject) model.getProperty( IEjbClientProjectRemovalDataModelProperties.EJB_CLIENT_VIEW_PROJECT );
+		operationHandler = (IOperationHandler)model.getProperty( IEjbClientProjectRemovalDataModelProperties.OP_HANDLER );
+		
+		workspace = ejbProject.getWorkspace();
+		clientProjectPath = clientProject.getFullPath();
+		ejbProjectPath = ejbProject.getFullPath();
+		sourceContainers = JemProjectUtilities.getSourceContainers(clientProject);
+		libraryContainers = JemProjectUtilities.getLibraryContainers(clientProject);
+		IJavaProject proj = JavaCore.create(clientProject);
+		try {
+			outputPath = proj.getOutputLocation().removeFirstSegments(1);
+		} catch (JavaModelException e) {
+			//Ignore
+		}
+
+		IContainer container = J2EEProjectUtilities.getSourceFolderOrFirst( ejbProject, null );
+		if( container.getType() == IResource.FOLDER ){
+			ejbSourceContainer = container;
+		}
+
+		ejbSourcePath = ejbSourceContainer.getFullPath();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jst.j2ee.internal.internal.ejb.clientjarcreation.AbstractEJBClientJAROperation#addAdditionalFilesForValidateEdit(java.util.List)
+	 */
+	protected void addAdditionalFilesForValidateEdit(final List roFiles) throws CoreException {
+		IResourceVisitor visitor = new IResourceVisitor() {
+			public boolean visit(IResource resource) throws CoreException {
+				if (resource.isDerived())
+					return false;
+				switch (resource.getType()) {
+					case IResource.PROJECT :
+						return true;
+					case IResource.FOLDER :
+						return true;
+					case IResource.FILE :
+						if (resource.isReadOnly())
+							roFiles.add(resource);
+						break;
+					default :
+						break;
+				}
+				return false;
+			}
+		};
+
+		clientProject.accept(visitor);
+	}
+
+
+	
+	@Override
+	public IStatus execute(IProgressMonitor aMonitor, IAdaptable info) throws ExecutionException {
+		monitor = aMonitor;
+		initialize();
+		try{
+			if (!verifyFilesInSync()) {
+				monitor.done();
+				throw new OperationCanceledException();
+			}
+			monitor.beginTask(ClientJARCreationConstants.REMOVING_CLIENT_JAR, 10);
+			//It would be nice to only make one pass through the EARs. However, we can't.
+			//The reason is that both JARs must be in the EAR when moving JAR dependencies.
+			//Then when we are done we can remove the client JARs from the EARs.
+			ensureEJBJARInAllEARs();
+			updateEJBModuleJARDependencies();
+			EJBClientJarCreationHelper.copyOutgoingClasspathEntries(clientProject, ejbProject, false);
+			moveIncomingJARDependencies();
+			updateDD();
+			removeClientProjectFromEARs();
+			moveFiles();
+			// add all the source containers to the class path
+			// add the root to the class path
+			addSourceContainersToClassPath();
+			//
+			if (moveResourceMonitor.isCanceled())
+				throw new InterruptedException();
+			deleteClientProject();
+		}catch(CoreException e){
+			EjbPlugin.logError( e );
+		}catch(InvocationTargetException e){
+			EjbPlugin.logError( e );
+		}catch(InterruptedException e){
+			EjbPlugin.logError( e );
+		}
+
+		return OK_STATUS;
+	}
+
+
+	/**
+	 * @throws JavaModelException
+	 *  
+	 */
+	private void addSourceContainersToClassPath() throws JavaModelException {
+		for (int x = 0; x < sourceContainers.size(); ++x) {
+			if (sourceContainers.get(x) instanceof IResource) {
+				IResource resource = (IResource) sourceContainers.get(x);
+				if (clientProject == resource)
+					return;
+				IPath srcPath = ejbProjectPath.append(resource.getProjectRelativePath());
+				IFolder existing = workspace.getRoot().getFolder(srcPath);
+				if (existing != null && existing.exists())
+					JemProjectUtilities.appendJavaClassPath(ejbProject, JavaCore.newSourceEntry(srcPath));
+			}
+		}
+	}
+
+	/*
+	 * Remove the client JAR entry from the deployment descriptor
+	 */
+	private void updateDD() {
+		IModelProvider ejbModel = ModelProviderManager.getModelProvider(ejbProject);
+        ejbModel.modify(new Runnable() {
+            public void run() {
+                IModelProvider writableEjbModel = ModelProviderManager.getModelProvider(ejbProject);
+                Object modelObject = writableEjbModel.getModelObject();
+                
+                if (modelObject instanceof org.eclipse.jst.javaee.ejb.EJBJar) {
+                    org.eclipse.jst.javaee.ejb.EJBJar ejbres = (org.eclipse.jst.javaee.ejb.EJBJar) writableEjbModel.getModelObject();
+                    if (ejbres != null)
+                    	ejbres.setEjbClientJar(null);
+                }
+                else {
+                    org.eclipse.jst.j2ee.ejb.EJBJar ejbres = (org.eclipse.jst.j2ee.ejb.EJBJar) writableEjbModel.getModelObject();
+                    ejbres.setEjbClientJar(null);
+                }
+            }
+        },null);
+	}
+
+	/*
+	 * In cross EAR references, it is possible the EJB module is not included in the referencing
+	 * EAR. If so, then we must add the EJB module as a utility JAR to the referencing EAR.
+	 */
+	private void ensureEJBJARInAllEARs() {
+		//TODO switch to use component API
+//		for (int i = 0; i < earNatures.length; i++) {
+//			ensureEJBJARInEAR(earNatures[i]);
+//		}
+	}
+
+	//TODO fix up ensure method to use component API
+//	private void ensureEJBJARInEAR(EARNatureRuntime runtime) {
+//		String ejbURI = runtime.getJARUri(ejbProject);
+//		if (ejbURI != null)
+//			return;
+//		ejbURI = J2EEProjectUtilities.getUtilityJARUriInFirstEAR(ejbProject);
+//		EAREditModel model = null;
+//		try {
+//			model = runtime.getEarEditModelForWrite(this);
+//			AddUtilityJARMapCommand cmd = new AddUtilityJARMapCommand(model, ejbURI, ejbProject);
+//			model.getCommandStack().execute(cmd);
+//			IProgressMonitor subMonitor = createSubProgressMonitor(1);
+//			model.saveIfNecessary(subMonitor, this);
+//		} finally {
+//			if (model != null)
+//				model.releaseAccess(this);
+//		}
+//	}
+
+	/*
+	 * copy all JAR dependencies not already contained by the ejb module,
+	 * from the client JAR to the ejb module,
+	 * and remove the module dependency from the EJB module
+	 */
+	private void updateEJBModuleJARDependencies() throws InvocationTargetException, InterruptedException {
+
+		
+		ArrayList list = new ArrayList();
+		list.add(clientProject.getName() + IJ2EEModuleConstants.JAR_EXT);
+		
+		IProject[] earProjects = EarUtilities.getReferencingEARProjects( ejbProject );
+		if (earProjects != null && earProjects.length > 0)
+		{
+			UpdateManifestOperation removeOp = new EJBClientManifestUtility().getRemoveOperation(ejbProject, earProjects[0], list, clientProject);
+			
+			try {
+				removeOp.execute( createSubProgressMonitor(1), null);
+			} catch (ExecutionException e) {
+				EjbPlugin.logError( e );
+			}
+			
+			ArchiveManifest clientMf = J2EEProjectUtilities.readManifest(clientProject);
+			if (clientMf == null)
+				return;
+			String[] mfEntries = clientMf.getClassPathTokenized();
+			if (mfEntries.length == 0)
+				return;
+			
+			createSubProgressMonitor( earProjects.length );
+			
+			//copy all JAR dependencies not already contained by the ejb module,
+			//from the client JAR to the ejb module	
+	
+			for (int i = 0; i < earProjects.length; i++) {
+				List result = EJBClientJarCreationHelper.normalize(mfEntries, earProjects[i], ejbProject, false);
+				UpdateManifestOperation addOp = new EJBClientManifestUtility().getAddOperation(ejbProject, earProjects[0], result);
+				
+				try{
+					addOp.execute( createSubProgressMonitor(1), null );
+				}catch (ExecutionException e) {
+					EjbPlugin.logError( e );
+				}
+			}
+		}
+	}
+
+	/*
+	 * For each module or JAR in each EAR that references the client JAR, replace the dependency
+	 * from the client JAR to the EJB module
+	 */
+	private void moveIncomingJARDependencies() throws InvocationTargetException, InterruptedException {
+		
+		IProject[] earProjects = EarUtilities.getReferencingEARProjects( ejbProject );
+		if (earProjects != null && earProjects.length > 0)
+		{
+			InvertClientJARDependencyCompoundOperation op = 
+				new InvertClientJARDependencyCompoundOperation( earProjects,
+							clientProject,
+							ejbProject );
+			try {
+				op.execute(createSubProgressMonitor(1), null);
+			} catch (ExecutionException e) {
+				EjbPlugin.logError( e );
+			}
+		}
+	}
+
+	/*
+	 * move all the non-derived files from the client JAR project into the EJB project. Use an
+	 * overwrite handler to deal with collisions.
+	 */
+	private void moveFiles() throws CoreException {
+		moveResourceMonitor = createSubProgressMonitor(1);
+		IResourceVisitor visitor = getRootResourceVisitor();
+		clientProject.accept(visitor);
+	}
+
+	private IResourceVisitor getRootResourceVisitor() {
+
+		return new IResourceVisitor() {
+			private boolean projectIsSource = sourceContainers.contains(clientProject);
+
+			public boolean visit(IResource resource) throws CoreException {
+				if (moveResourceMonitor.isCanceled())
+					return false;
+				switch (resource.getType()) {
+					case IResource.FILE :
+						if (!resource.isDerived())
+							visitFile((IFile) resource);
+						return false;
+					case IResource.FOLDER :
+						return visitFolder((IFolder) resource);
+					case IResource.PROJECT :
+						return true;
+					default :
+						return false;
+				}
+			}
+
+			private void visitFile(IFile file) throws CoreException {
+				if (isMetaFile(file))
+					return;
+				else if (projectIsSource)
+					moveFile(file, clientProjectPath, ejbSourcePath);
+				else
+					moveFile(file, clientProjectPath, ejbProjectPath);
+
+			}
+
+			private boolean isMetaFile(IFile file) {
+				String segment = file.getProjectRelativePath().toString();
+				return ProjectUtilities.DOT_CLASSPATH.equals(segment) ||
+						ProjectUtilities.DOT_PROJECT.equals(segment) ||
+						segment.endsWith(IModuleConstants.COMPONENT_FILE_NAME) ||
+						segment.startsWith(".settings"); //$NON-NLS-1$ 
+			}
+
+			private boolean visitFolder(IFolder folder) throws CoreException {
+				if (isSourceFolder(folder)) {
+					visitSourceFolder(folder);
+					return false;
+				} else if (isOutputFolder(folder)) {
+					return false;
+				} else if (isClassesFolder(folder)) {
+					visitClassesFolder(folder);
+					return false;
+				} else
+					return true;
+			}
+
+			private boolean isOutputFolder(IFolder folder) {
+				IPath path = folder.getProjectRelativePath();
+				while (path.segmentCount() > 0 && null != outputPath) {
+					if (path.equals(outputPath)) {
+						return true;
+					}
+					path = path.removeLastSegments(1);
+				}
+				return false;
+			}
+
+			private boolean isSourceFolder(IFolder folder) {
+				return sourceContainers.contains(folder);
+			}
+
+			private void visitSourceFolder(IFolder folder) throws CoreException {
+				folder.accept(getFolderResourceVisitor(folder.getFullPath(), computeEJBSourceFolder(folder)));
+			}
+
+			private IPath computeEJBSourceFolder(IFolder clientProjectFolder) {
+				IPath clientFolderRelativePath = clientProjectFolder.getProjectRelativePath();
+				return ejbProjectPath.append(clientFolderRelativePath);
+			}
+
+			private boolean isClassesFolder(IFolder folder) {
+				return libraryContainers.contains(folder);
+			}
+
+			protected void visitClassesFolder(IFolder folder) throws CoreException {
+				IPath classesPath = getEJBClassesPath();
+				folder.accept(getFolderResourceVisitor(folder.getFullPath(), classesPath));
+			}
+
+			private IPath getEJBClassesPath() throws CoreException {
+				IFolder folder = ejbProject.getFolder(LibCopyBuilder.IMPORTED_CLASSES_PATH);
+				if (!folder.exists())
+					folder.create(true, true, null);
+				JemProjectUtilities.appendJavaClassPath(ejbProject, JavaCore.newLibraryEntry(folder.getFullPath(), null, null, true));
+				return folder.getFullPath();
+			}
+		};
+	}
+
+	private IResourceVisitor getFolderResourceVisitor(final IPath sourceRoot, final IPath destinationRoot) {
+		return new IResourceVisitor() {
+			public boolean visit(IResource resource) throws CoreException {
+				if (moveResourceMonitor.isCanceled())
+					return false;
+				switch (resource.getType()) {
+					case IResource.FILE :
+						if (!resource.isDerived() && !isManifest(sourceRoot, resource.getFullPath()))
+							moveFile((IFile) resource, sourceRoot, destinationRoot);
+						return false;
+					case IResource.FOLDER :
+						return true;
+					default :
+						return false;
+				}
+			}
+
+			private boolean isManifest(IPath new_sourceRoot, IPath path) {
+				String relativeURI = path.removeFirstSegments(new_sourceRoot.segmentCount()).toString();
+				return J2EEConstants.MANIFEST_URI.equals(relativeURI);
+			}
+		};
+	}
+
+	private void moveFile(IFile file, IPath sourceRoot, IPath destinationRoot) throws CoreException {
+		IPath filePath = file.getFullPath();
+		IPath relativeFilePath = filePath.removeFirstSegments(sourceRoot.segmentCount());
+		IPath newPath = destinationRoot.append(relativeFilePath);
+		mkdirs(newPath, workspace.getRoot());
+		IFile existing = workspace.getRoot().getFile(newPath);
+		if (!yesToAll && existing.exists()) {
+			String message = MessageFormat.format(ClientJARCreationConstants.SHOULD_OVERWRITE, new Object[]{filePath.toString(), newPath.toString()});
+			int answer = IOperationHandler.YES_TO_ALL;
+			if (operationHandler != null)
+				answer = operationHandler.canContinueWithAllCheckAllowCancel(message);
+			switch (answer) {
+				case IOperationHandler.YES :
+					break;
+				case IOperationHandler.YES_TO_ALL :
+					yesToAll = true;
+					break;
+				case IOperationHandler.NO :
+					return;
+				case IOperationHandler.CANCEL :
+					moveResourceMonitor.setCanceled(true);
+					return;
+				default :
+					break;
+			}
+		}
+		if (!existing.exists())
+			file.move(newPath, true, moveResourceMonitor);
+		else
+			existing.setContents(file.getContents(), true, true, moveResourceMonitor);
+	}
+
+
+	private void removeClientProjectFromEARs() {
+
+		IProject[] earProjects = EarUtilities.getReferencingEARProjects( clientProject );
+		for (int i = 0; i < earProjects.length; i++) {
+			removeClientProjectFromEAR( earProjects[i] );
+		}
+	}
+
+
+	private void removeClientProjectFromEAR( IProject earProject ) {
+		
+		IVirtualComponent earComp = ComponentCore.createComponent(earProject);
+		IVirtualComponent component = ComponentCore.createComponent(clientProject);
+
+		if (earComp.exists() && component.exists()) {
+			IDataModel dm = DataModelFactory.createDataModel(new RemoveReferenceComponentsDataModelProvider());
+			dm.setProperty(ICreateReferenceComponentsDataModelProperties.SOURCE_COMPONENT, earComp);
+
+			List modList = (List) dm.getProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENT_LIST);
+			modList.add(component);
+			dm.setProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENT_LIST, modList);
+			try {
+				dm.getDefaultOperation().execute(monitor, null);
+			} catch (ExecutionException e) {
+				EjbPlugin.logError(e);
+			}
+		}
+		
+	}
+
+	/*
+	 * remove the client project from the workspace
+	 */
+	private void deleteClientProject() throws CoreException {
+		if (shouldDelete)
+			try{
+				clientProject.delete(true, true, createSubProgressMonitor(1));
+			}catch(ResourceException e){
+				clientProject.delete(false, true, createSubProgressMonitor(1));
+			}
+	}
+
+	protected IProgressMonitor createSubProgressMonitor(int ticks) {
+		return new SubProgressMonitor(monitor, ticks);
+	}
+	
+	protected boolean verifyFilesInSync() throws CoreException {
+		if (verifyFilesInSync(ejbProject))
+			return verifyFilesInSync(clientProject);
+		return false;
+	}
+	
+	protected boolean verifyFilesInSync(IProject project) throws CoreException {
+		if (!project.exists())
+			return true;
+		if (!project.isSynchronized(IResource.DEPTH_INFINITE)) {
+			String message = MessageFormat.format(ClientJARCreationConstants.FILES_OUT_OF_SYNC, new Object[]{project.getName()});
+			if (operationHandler == null || operationHandler.canContinue(message)) 
+				ejbProject.refreshLocal(IResource.DEPTH_INFINITE, createSubProgressMonitor(1));
+			else 
+				return false;
+		}
+		return true;
+	}	
+	
+	protected void mkdirs(IPath newPath, IWorkspaceRoot root) throws CoreException {
+		if (newPath.segmentCount() <= 2)
+			return;
+		IPath parentPath = newPath.removeLastSegments(1);
+		IFolder folder = root.getFolder(parentPath);
+		if (!folder.exists()) {
+			mkdirs(parentPath, root);
+			folder.create(true, true, null);
+		}
+	}	
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/EJBClientJarCreationHelper.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/EJBClientJarCreationHelper.java
new file mode 100644
index 0000000..aa76b5a
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/EJBClientJarCreationHelper.java
@@ -0,0 +1,423 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2011 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.jst.j2ee.internal.ejb.archiveoperations;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IPackageFragment;
+import org.eclipse.jdt.core.IPackageFragmentRoot;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.core.search.SearchEngine;
+import org.eclipse.jdt.core.search.SearchMatch;
+import org.eclipse.jdt.core.search.SearchRequestor;
+import org.eclipse.jem.internal.adapters.jdom.JDOMSearchHelper;
+import org.eclipse.jem.java.JavaClass;
+import org.eclipse.jem.workbench.utility.JemProjectUtilities;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.util.ArchiveUtil;
+import org.eclipse.jst.j2ee.componentcore.util.EARArtifactEdit;
+import org.eclipse.jst.j2ee.ejb.EJBJar;
+import org.eclipse.jst.j2ee.ejb.EnterpriseBean;
+import org.eclipse.jst.j2ee.ejb.Entity;
+import org.eclipse.jst.j2ee.ejb.componentcore.util.EJBArtifactEdit;
+import org.eclipse.jst.j2ee.ejb.internal.plugin.EjbPlugin;
+import org.eclipse.jst.j2ee.internal.ejb.project.operations.ClientJARCreationConstants;
+import org.eclipse.jst.j2ee.model.IModelProvider;
+import org.eclipse.jst.j2ee.model.ModelProviderManager;
+import org.eclipse.jst.j2ee.project.JavaEEProjectUtilities;
+import org.eclipse.jst.javaee.ejb.EnterpriseBeans;
+import org.eclipse.jst.javaee.ejb.EntityBean;
+import org.eclipse.jst.javaee.ejb.SessionBean;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+
+public class EJBClientJarCreationHelper {
+	
+	protected static final String SERVICE_LOCATOR_JAR_NAME = "serviceLocatorMgr.jar"; //$NON-NLS-1$	
+	private IProject ejbProject = null;
+	protected Map javaFilesToMove = new HashMap();
+	protected Set visitedJavaTypes = new HashSet();
+	protected int moveResourceCount = 0;
+	protected SearchEngine searchEngine = new SearchEngine();
+	private MySearchHelper searchHelper = null;	
+	
+	public EJBClientJarCreationHelper(IProject aEjbProject){
+		ejbProject = aEjbProject;
+	}
+	
+	public Map getFilesToMove() {
+		
+	    searchHelper = new MySearchHelper(searchEngine, computeBeanTypeNames());
+	
+		if( ejbProject.exists() && ejbProject.isAccessible()){
+			if (JavaEEProjectUtilities.isLegacyJ2EEComponent(ComponentCore.createComponent(ejbProject))) { // the project is older than Java EE 5, i.e. EJB 2.1			
+			EJBArtifactEdit edit = null;
+			try {
+					edit = EJBArtifactEdit.getEJBArtifactEditForRead(ejbProject);
+					EJBJar ejbJar = edit.getEJBJar();
+					if (ejbJar != null) {
+						List enterpriseBeans = ejbJar.getEnterpriseBeans();
+						for (int i = 0; i < enterpriseBeans.size(); i++) {
+							EnterpriseBean ejb = (EnterpriseBean) enterpriseBeans.get(i);
+							computeJavaTypes(ejb);
+						}
+					}
+					computeRMICJavaTypes();					
+
+			} finally {
+				if(edit != null)
+					edit.dispose();
+					  
+			}
+			} else { // we have an EJB 3.x project, so use the new model for the EJB module
+				IModelProvider modelProvider = ModelProviderManager.getModelProvider(ejbProject);
+				org.eclipse.jst.javaee.ejb.EJBJar ejbJar = (org.eclipse.jst.javaee.ejb.EJBJar) modelProvider.getModelObject();
+				
+				if (ejbJar != null) {
+					EnterpriseBeans enterpriseBeans = ejbJar.getEnterpriseBeans();
+					if (enterpriseBeans != null){
+						List<SessionBean> sessionBeans = enterpriseBeans.getSessionBeans();
+						for (SessionBean sessionBean : sessionBeans) {
+							computeJavaTypes(sessionBean);
+						}
+						
+						List<EntityBean> entityBeans = enterpriseBeans.getEntityBeans();
+						for (EntityBean entityBean : entityBeans) {
+							computeJavaTypes(entityBean);
+						}
+					}
+				}
+				computeRMICJavaTypes();			
+				
+			}
+			
+		}
+		return javaFilesToMove;
+	}
+	
+	public static void copyOutgoingClasspathEntries(IProject source, IProject target, boolean filterServiceLocator) throws JavaModelException {
+		IJavaProject sourceJProject = JemProjectUtilities.getJavaProject(source);
+		IJavaProject targetJProject = JemProjectUtilities.getJavaProject(target);
+		IClasspathEntry[] sourceCp = sourceJProject.getRawClasspath();
+		List targetCp = new ArrayList(Arrays.asList(targetJProject.getRawClasspath()));
+		for (int i = 0; i < sourceCp.length; i++) {
+			IClasspathEntry entry = sourceCp[i];
+			if (!isContainedInProject(entry, source) && !contains(targetCp, entry) && (!isServiceLocator(entry) || !filterServiceLocator))
+				targetCp.add(entry);
+		}
+		IClasspathEntry[] newCp = (IClasspathEntry[]) targetCp.toArray(new IClasspathEntry[targetCp.size()]);
+		targetJProject.setRawClasspath(newCp, null);
+	}
+	
+	private static boolean isContainedInProject(IClasspathEntry entry, IProject project) {
+		return !entry.getPath().isEmpty() && project.getName().equals(entry.getPath().segment(0));
+	}
+	
+	private static boolean contains(List cp, IClasspathEntry entry) {
+		for (int i = 0; i < cp.size(); i++) {
+			IClasspathEntry elmt = (IClasspathEntry) cp.get(i);
+			if (elmt.getEntryKind() == entry.getEntryKind() && elmt.getPath().equals(entry.getPath()))
+				return true;
+		}
+		return false;
+	}
+	
+	private static boolean isServiceLocator(IClasspathEntry entry) {
+		IPath path = entry.getPath();
+		return path != null && SERVICE_LOCATOR_JAR_NAME.equals(path.lastSegment());
+	}	
+	
+	public static List normalize(String[] mfEntries, IProject earProject, IProject ejbProject, 
+				boolean filterServiceLocator) {
+		
+		String jarURI = null;
+		EARArtifactEdit edit = null;
+		try {
+			edit = EARArtifactEdit.getEARArtifactEditForRead( earProject );
+			if (edit != null){
+				jarURI = edit.getModuleURI( ComponentCore.createComponent( ejbProject ));
+				if (jarURI == null)
+					return Collections.EMPTY_LIST;				
+			}
+		} finally {
+			if(edit != null)
+				edit.dispose();
+				  
+		}
+		
+		List result = new ArrayList(mfEntries.length);
+		for (int i = 0; i < mfEntries.length; i++) {
+			String norm = ArchiveUtil.deriveEARRelativeURI(mfEntries[i], jarURI);
+			if (norm == null)
+				norm = mfEntries[i];
+			//We know this is an implementation dependency so we don't want to move it
+			if (!SERVICE_LOCATOR_JAR_NAME.equals(norm) || !filterServiceLocator)
+				result.add(norm);
+		}
+		return result;
+	}
+	
+	
+	private void computeJavaTypes(EnterpriseBean ejb) {
+		computeJavaTypes(ejb.getHomeInterface());
+		computeJavaTypes(ejb.getRemoteInterface());
+		computeJavaTypes(ejb.getLocalInterface());
+		computeJavaTypes(ejb.getLocalHomeInterface());
+		if (ejb.isEntity())
+			computeJavaTypes(((Entity)ejb).getPrimaryKey());
+	}
+	
+	private void computeJavaTypes(EntityBean entityBean) {
+		
+		computeJavaTypes(entityBean.getHome());
+		computeJavaTypes(entityBean.getLocalHome());
+		computeJavaTypes(entityBean.getLocal());
+		computeJavaTypes(entityBean.getRemote());
+		
+		computeJavaTypes(entityBean.getPrimkeyField());
+		
+	}
+
+	private void computeJavaTypes(String fqClassName) {
+		if (fqClassName == null) {
+			return;
+		}
+		IJavaProject jProj = JemProjectUtilities.getJavaProject(ejbProject);
+		IType type;
+		try {
+			type = jProj.findType(fqClassName);
+			computeJavaTypes(type);
+		} catch (JavaModelException e) {
+			EjbPlugin.logError(e);
+		}
+		
+		
+	}
+
+	// Dedicated for a session bean representation in the EJB 3.x model
+	private void computeJavaTypes(SessionBean sessionBean) {
+		
+		// do as in the EJB 2.x case
+		computeJavaTypes(sessionBean.getHome());
+		computeJavaTypes(sessionBean.getLocalHome());
+		computeJavaTypes(sessionBean.getLocal());
+		computeJavaTypes(sessionBean.getRemote());
+		
+		
+		// process additionally local business interfaces ...
+		List<String> businessLocals = sessionBean.getBusinessLocals();
+		for (String string : businessLocals) {
+			computeJavaTypes(string);
+		}
+		
+		// ... and remote business interfaces
+		List<String> businessRemotes = sessionBean.getBusinessRemotes();
+		for (String string : businessRemotes) {
+			computeJavaTypes(string);
+		}		
+	}
+	
+	
+	private void computeJavaTypes(JavaClass javaClass) {
+		if (javaClass == null)
+			return;
+		//javaClass.isInterface();//force reflection prior to the move.
+		IJavaProject jProj = JemProjectUtilities.getJavaProject(ejbProject);
+		IType type = JDOMSearchHelper.findType(javaClass.getJavaPackage().getName(), javaClass.getSimpleName(), jProj);
+		computeJavaTypes(type);
+	}
+
+	private void computeJavaTypes(IType type) {
+		if (type == null || visitedJavaTypes.contains(type))
+			return;
+		visitedJavaTypes.add(type);
+		//String qualifiedName = type.getFullyQualifiedName();
+		try {
+			IFile file = (IFile)type.getUnderlyingResource();
+			if (file != null && ejbProject.equals(file.getProject())) {
+				if (!file.isDerived())
+					cacheType(type, file);
+				computeRequiredReferencedJavaTypes(type);
+			}
+		} catch (JavaModelException e) {
+			EjbPlugin.logError(e);
+			return;
+		} 
+	}
+	
+	private void cacheType(IType type, IFile file) {
+		this.moveResourceCount++;
+		IPackageFragmentRoot root = (IPackageFragmentRoot) type.getPackageFragment().getParent();
+		cacheFile(root, file);
+	}
+	
+	private void cacheFile(IPackageFragmentRoot root, IFile file) {
+		Set files = (Set) javaFilesToMove.get(root);
+		if (files == null) {
+			files = new HashSet();
+			javaFilesToMove.put(root, files);
+		}
+		files.add(file);
+	}
+	
+	private void computeRequiredReferencedJavaTypes(IType type)  throws JavaModelException {
+		Collection result = new HashSet();
+		searchHelper.searchForReferences(type, result);
+		if (!result.isEmpty()) {
+			Iterator iter = result.iterator();
+			while (iter.hasNext())
+				computeJavaTypes(((IType)iter.next()));
+		}
+	}	
+	
+	private Collection computeBeanTypeNames() {
+		Collection names = null;
+
+		if( ejbProject.exists() && ejbProject.isAccessible()){
+			EJBArtifactEdit edit = null;
+			try {
+					edit = EJBArtifactEdit.getEJBArtifactEditForRead(ejbProject);
+					EJBJar ejbJar = edit.getEJBJar();
+					if (ejbJar != null) {
+						List beans = ejbJar.getEnterpriseBeans();
+						if (!beans.isEmpty()) {
+							names = new HashSet(beans.size());
+							for (int i = 0; i < beans.size(); i++) {
+								EnterpriseBean bean = (EnterpriseBean) beans.get(i);
+								names.add(bean.getEjbClassName());
+							}
+						}
+					}
+				
+
+			} finally {
+				if(edit != null)
+					edit.dispose();
+					  
+			}
+		}
+		if (names == null)
+			names = Collections.EMPTY_LIST;
+		return names;			
+	}
+	
+	private void computeRMICJavaTypes() {
+		
+		try{
+			List roots = getResourcePackageFragmentRoots();
+			for (int i = 0; i < roots.size(); i++) {
+				IPackageFragmentRoot root = (IPackageFragmentRoot) roots.get(i);
+				computeRMICJavaTypes(root);
+			}
+		}catch(CoreException e){
+			EjbPlugin.logError(e);
+		}
+	}
+	
+	private List getResourcePackageFragmentRoots() throws JavaModelException {
+		IJavaProject javaProj = JemProjectUtilities.getJavaProject(ejbProject);
+		List result = new ArrayList();
+		IPackageFragmentRoot[] roots = javaProj.getPackageFragmentRoots();
+		for (int i = 0; i < roots.length; i++) {
+			IPackageFragmentRoot root = roots[i];
+			if (root.getKind() == IPackageFragmentRoot.K_SOURCE || isClassesFolder(root)) 
+				result.add(root);
+		}
+		return result;
+	}
+	
+	private boolean isClassesFolder(IPackageFragmentRoot root) throws JavaModelException {
+		return root.getKind() == IPackageFragmentRoot.K_BINARY &&
+			!root.isArchive() && !root.isExternal();
+	}	
+	
+	private void computeRMICJavaTypes(IPackageFragmentRoot root) throws JavaModelException {
+		IJavaElement[] pkgFragments = root.getChildren();
+		IFile aFile = null;
+		for (int i = 0; i < pkgFragments.length; i++) {
+			IJavaElement[] elements = ((IPackageFragment)pkgFragments[i]).getChildren();
+			for (int j = 0; j < elements.length; j++) {
+				IJavaElement unit = elements[j];
+				aFile = (IFile)unit.getUnderlyingResource();
+				if (isRMICStub(aFile) && isFileForClientJar(aFile))
+					cacheFile(root, aFile);
+			}
+		}
+	}
+	
+	private boolean isRMICStub(IFile aFile) {
+		String name = aFile.getName();
+		String ext = aFile.getFileExtension();
+
+		if (name != null && ext != null)
+			name = name.substring(0, name.length()-ext.length()-1); 
+		return name != null && 
+			name.startsWith(ClientJARCreationConstants.UNDERSCORE) &&
+			name.endsWith(ClientJARCreationConstants._STUB);
+	}
+	
+	private boolean isFileForClientJar(IFile aFile){
+		String name = aFile.getName();
+//		 special case the was stubs  that is needed in the server side
+        if(name.startsWith("_EJS") || (name.startsWith("_") && name.indexOf("InternalHome_") > 0 )) //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+        	return false;
+        return true;
+	}
+
+	
+	private static class MySearchHelper extends SearchRequestor  {
+		SearchEngine engine;
+		Collection results;
+		Collection beanTypeNames;
+		MySearchHelper(SearchEngine engine, Collection beanTypeNames) {
+			this.engine = engine;
+			this.beanTypeNames = beanTypeNames;
+		}
+		void searchForReferences(IType type, Collection results) throws JavaModelException {
+			this.results = results;
+			//Hack because of a bug in the search engine in eclipse 2.1.1
+			try {
+				engine.searchDeclarationsOfReferencedTypes(type, this, null);
+			} catch (ClassCastException ex) {
+				EjbPlugin.logError(ex);
+			}
+		}
+		@Override
+		public void acceptSearchMatch(SearchMatch match) throws CoreException {
+			if(match.getAccuracy() == SearchMatch.A_ACCURATE && !(match.isInsideDocComment() || isBeanType((IType) match.getElement())))
+				results.add(match.getElement());
+		}
+		/**
+		 * @param type
+		 * @return
+		 */
+		private boolean isBeanType(IType type) {
+			return beanTypeNames.contains(type.getFullyQualifiedName());
+		}		
+		
+	}	
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/EJBClientJarFileMoveDataModelProvider.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/EJBClientJarFileMoveDataModelProvider.java
new file mode 100644
index 0000000..d7c3204
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/EJBClientJarFileMoveDataModelProvider.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.jst.j2ee.internal.ejb.archiveoperations;
+
+import java.util.Set;
+
+import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelProvider;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
+
+
+public class EJBClientJarFileMoveDataModelProvider
+ 						extends AbstractDataModelProvider
+ 						implements IEJBClientJarFileMoveDataModelProperties{
+    
+	@Override
+	public Set getPropertyNames() {
+		Set propertyNames = super.getPropertyNames();
+		propertyNames.add(EJB_CLIENTVIEW_PROJECT_NAME);
+		propertyNames.add(EJB_PROJECT_NAME);
+		propertyNames.add(FILES_TO_MOVE_MAP);
+		return propertyNames;
+	}
+	
+
+	@Override
+	public IDataModelOperation getDefaultOperation() {
+		return new EJBClientJarFileMoveOperation( model );
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/EJBClientJarFileMoveOperation.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/EJBClientJarFileMoveOperation.java
new file mode 100644
index 0000000..90d5573
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/EJBClientJarFileMoveOperation.java
@@ -0,0 +1,209 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.internal.ejb.archiveoperations;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.Map.Entry;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IPackageFragmentRoot;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jem.workbench.utility.JemProjectUtilities;
+import org.eclipse.jst.j2ee.ejb.internal.plugin.EjbPlugin;
+import org.eclipse.jst.j2ee.internal.plugin.LibCopyBuilder;
+import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+
+
+/**
+ *
+ * TODO To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+public class EJBClientJarFileMoveOperation extends AbstractDataModelOperation
+  implements IEJBClientJarFileMoveDataModelProperties{
+	protected IProject clientProject;
+	protected IProject ejbProject;
+	protected IWorkspace workspace;
+	protected IProgressMonitor monitor;
+	protected IProgressMonitor moveResourceMonitor;
+	protected Map javaFilesToMove = new HashMap();
+	
+
+
+
+	public EJBClientJarFileMoveOperation(IDataModel model){
+		super(model); 
+		initialize();
+	}
+	
+	@Override
+	public IStatus execute(IProgressMonitor aMonitor, IAdaptable info) throws ExecutionException {
+        monitor = aMonitor;
+        return moveRequiredFiles();
+	}
+	
+
+	protected void initialize() {
+		ejbProject = getEJBProject(model.getStringProperty(EJB_PROJECT_NAME));
+		if(ejbProject == null) return;
+        workspace = ejbProject.getWorkspace();
+		clientProject = workspace.getRoot().getProject( model.getStringProperty( EJB_CLIENTVIEW_PROJECT_NAME));
+		javaFilesToMove = (Map)model.getProperty( FILES_TO_MOVE_MAP );
+	}
+	
+	private IStatus moveRequiredFiles() {
+		
+		IStatus status = OK_STATUS;
+		try{
+	        moveResourceMonitor = createSubProgressMonitor(1);
+	        Iterator iter = javaFilesToMove.entrySet().iterator();
+	        IPackageFragmentRoot packageFragmentRoot;
+	        Set types;
+	        while (iter.hasNext()) {
+	            Map.Entry entry = (Entry) iter.next();
+	            packageFragmentRoot = (IPackageFragmentRoot) entry.getKey();
+	            types = (Set) entry.getValue();
+	            try {
+	                if (packageFragmentRoot.getKind() == IPackageFragmentRoot.K_SOURCE)
+	                    moveFiles(packageFragmentRoot, types);
+	                else
+	                    moveClassFiles(packageFragmentRoot, types);
+	            } catch (JavaModelException e) {
+	                EjbPlugin.logError(e);
+	            }
+	        }
+	        IJavaProject javaProject = JemProjectUtilities.getJavaProject(clientProject);
+	        //Refresh problems
+	        javaProject.close();
+	        javaProject.open(null);
+		}catch(CoreException e){
+			EjbPlugin.logError( e );
+		}
+		return status;
+	}
+
+	
+	private void moveFiles(IPackageFragmentRoot packageFragmentRoot, Set types) throws CoreException {
+		IFile file = null;
+		int leadSegmentsToTruncate = -1;
+		IFolder sourceSourceFolder = getSourceFolder(packageFragmentRoot);
+		if(sourceSourceFolder == null) return;
+		IFolder targetSourceFolder = getOrCreateTargetSourceFolder(sourceSourceFolder);
+		if(targetSourceFolder == null) return;
+		IPath sourceFolderPath = targetSourceFolder.getFullPath();
+		try {
+			leadSegmentsToTruncate = packageFragmentRoot.getUnderlyingResource().getFullPath().segmentCount();
+		} catch (JavaModelException ex) {
+			EjbPlugin.logError(ex);
+			return;
+		}
+		for (Iterator iter = types.iterator(); iter.hasNext(); ) {
+			file = (IFile) iter.next();
+			IPath relPath = file.getFullPath().removeFirstSegments(leadSegmentsToTruncate);
+			IPath newPath = sourceFolderPath.append(relPath);
+			mkdirs(newPath, workspace.getRoot());
+			IFile existing = workspace.getRoot().getFile(newPath);
+			if (!existing.exists())
+				file.move(newPath, true, moveResourceMonitor);
+		}
+	}
+	
+	/**
+	 * @param sourceSourceFolder
+	 * @return
+	 */
+	private IFolder getOrCreateTargetSourceFolder(IFolder sourceSourceFolder) throws CoreException {
+		IFolder targetFolder = clientProject.getFolder(sourceSourceFolder.getProjectRelativePath());
+		if(!targetFolder.exists()) {
+			mkFolders(targetFolder.getFullPath(), workspace.getRoot());
+			JemProjectUtilities.appendJavaClassPath(clientProject, JavaCore.newSourceEntry(targetFolder.getFullPath()));
+		}
+		return targetFolder;
+	}
+	
+	protected void mkFolders(IPath newPath, IWorkspaceRoot root) throws CoreException {
+		if (newPath.segmentCount() <= 1)
+			return;
+		IFolder folder = root.getFolder(newPath);
+		IPath parentPath = newPath.removeLastSegments(1);
+		if (!folder.exists()) {
+			mkFolders(parentPath, root);
+			folder.create(true, true, null);
+		}
+	}
+	/**
+	 * @param packageFragmentRoot
+	 * @return
+	 */
+	private IFolder getSourceFolder(IPackageFragmentRoot packageFragmentRoot) {
+		IResource res = null;
+		try {
+			res = packageFragmentRoot.getUnderlyingResource();
+		} catch (JavaModelException e) {
+			EjbPlugin.logError(e);
+		}
+		if(res != null && res instanceof IFolder)
+			return (IFolder)res;
+		return null;
+	}
+	
+	
+	private void moveClassFiles(IPackageFragmentRoot packageFragmentRoot, Set types) throws CoreException {
+		IFolder folder = clientProject.getFolder(LibCopyBuilder.IMPORTED_CLASSES_PATH);
+		if (!folder.exists())
+			folder.create(true, true, null);
+		try {
+			JemProjectUtilities.appendJavaClassPath(clientProject, JavaCore.newLibraryEntry(folder.getFullPath(), null, null, true));
+		} catch (CoreException ex) {
+			EjbPlugin.logError(ex);
+		}
+		moveFiles(packageFragmentRoot, types);
+	}
+	
+	protected void mkdirs(IPath newPath, IWorkspaceRoot root) throws CoreException {
+		if (newPath.segmentCount() <= 2)
+			return;
+		IPath parentPath = newPath.removeLastSegments(1);
+		IFolder folder = root.getFolder(parentPath);
+		if (!folder.exists()) {
+			mkdirs(parentPath, root);
+			folder.create(true, true, null);
+		}
+	}
+
+	protected IProject getEJBProject(String aProjectName) {
+		return ResourcesPlugin.getWorkspace().getRoot().getProject(aProjectName);
+	}
+	protected IProgressMonitor createSubProgressMonitor(int ticks) {
+		return new SubProgressMonitor(monitor, ticks);
+	}
+	
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/EJBClientManifestUtility.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/EJBClientManifestUtility.java
new file mode 100644
index 0000000..7590423
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/EJBClientManifestUtility.java
@@ -0,0 +1,195 @@
+package org.eclipse.jst.j2ee.internal.ejb.archiveoperations;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
+import org.eclipse.jst.common.internal.modulecore.util.ArchiveManifest;
+import org.eclipse.jst.common.internal.modulecore.util.ManifestUtilities;
+import org.eclipse.jst.j2ee.application.internal.operations.ClassPathSelection;
+import org.eclipse.jst.j2ee.application.internal.operations.ClasspathElement;
+import org.eclipse.jst.j2ee.application.internal.operations.UpdateManifestDataModelProperties;
+import org.eclipse.jst.j2ee.application.internal.operations.UpdateManifestDataModelProvider;
+import org.eclipse.jst.j2ee.application.internal.operations.UpdateManifestOperation;
+import org.eclipse.jst.j2ee.internal.J2EEConstants;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
+import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+/**
+ * This class was basically written to clean up the core remaining use-cases
+ * for some deprecated classes.
+ * 
+ */
+public class EJBClientManifestUtility {
+	public static final String NESTED_MODEL_UPDATE_MAINFEST = "AbstractJARDependencyDataModel.NESTED_MODEL_UPDATE_MAINFEST"; //$NON-NLS-1$
+	public static final int JAR_MANIPULATION_ADD = 0;
+	public static final int JAR_MANIPULATION_REMOVE = 1;
+	public static final int JAR_MANIPULATION_INVERT = 2;
+
+	
+	private ClassPathSelection classPathSelection;
+	private ArchiveManifest manifest;
+	private IProject project, earProject, referencedProject, oppositeProject;
+	private List jarList;
+	public EJBClientManifestUtility() {
+	}
+
+	public UpdateManifestOperation getAddOperation(IProject project, IProject ear, List jars) {
+		return handle(JAR_MANIPULATION_ADD, project, ear, jars);
+	}
+
+	public UpdateManifestOperation getRemoveOperation(IProject project, IProject ear, List jars, IProject referenced) {
+		return handle(JAR_MANIPULATION_REMOVE, project, ear, jars, null, referenced);
+	}
+	
+	public UpdateManifestOperation getInvertOperation(IProject project, IProject ear, 
+			IProject opposite, IProject referenced) {
+		return handle(JAR_MANIPULATION_INVERT, project, ear, null, opposite, referenced);
+	}
+
+	private UpdateManifestOperation handle(int type, IProject project, IProject ear, List jars) {
+		return handle(type, project, ear, jars, null, null);
+	}
+	
+	private UpdateManifestOperation handle(int type, IProject project, IProject ear, List jars, IProject opposite, IProject referenced) {
+		this.project = project;
+		this.earProject = ear;
+		this.jarList = jars;
+		this.oppositeProject = opposite;
+		this.referencedProject = referenced;
+		IVirtualComponent earComponent = ComponentCore.createComponent( earProject );
+		if( !earComponent.exists() )
+			return null;
+		IVirtualComponent component = ComponentCore.createComponent(project);
+		manifest = ManifestUtilities.getNonBinaryComponentManifest(component, new Path(J2EEConstants.MANIFEST_URI));
+		classPathSelection = new ClassPathSelection(component, earComponent, manifest);
+		switch (type) {
+			case JAR_MANIPULATION_ADD : handleAdd(); break;
+			case JAR_MANIPULATION_REMOVE : handleRemove(); break;
+			case JAR_MANIPULATION_INVERT : handleInvert(); break;
+		}
+		try {
+			validateEdit();
+			UpdateManifestOperation mfOperation = createManifestOperation();
+			return mfOperation;
+		} catch( CoreException ce ) {
+			return null;
+		}
+	}
+	
+
+	/**
+	 * @param model
+	 */
+	protected void validateEdit() throws CoreException {
+		Set affectedFiles = getAffectedFiles(project);
+		IFile[] files = (IFile[]) affectedFiles.toArray(new IFile[affectedFiles.size()]);
+		IStatus result = J2EEPlugin.getWorkspace().validateEdit(files, null);
+		if (!result.isOK())
+			throw new CoreException(result);
+	}
+	
+	/** 
+	 * This is basically just .project, .classpath, and .manifest
+	 * @param project
+	 * @return
+	 */
+	public Set getAffectedFiles(IProject project) {
+		Set result = new HashSet();
+		IFile aFile = J2EEProjectUtilities.getManifestFile(project);
+		if (aFile != null && aFile.exists())
+			result.add(aFile);
+		result.addAll(ProjectUtilities.getFilesAffectedByClasspathChange(project));
+		return result;
+	}
+
+
+	/*
+	 * Create the manifest operation
+	 */
+	private UpdateManifestOperation createManifestOperation() {
+		IDataModel updateManifestDataModel = DataModelFactory.createDataModel(UpdateManifestDataModelProvider.class);
+		updateManifestDataModel.setProperty(UpdateManifestDataModelProperties.PROJECT_NAME, project.getName());
+		updateManifestDataModel.setBooleanProperty(UpdateManifestDataModelProperties.MERGE, false);
+		updateManifestDataModel.setProperty(UpdateManifestDataModelProperties.JAR_LIST, UpdateManifestDataModelProvider.convertClasspathStringToList(classPathSelection.toString()));
+		updateManifestDataModel.setProperty(UpdateManifestDataModelProperties.MANIFEST_FILE, J2EEProjectUtilities.getManifestFile( project));
+		return new UpdateManifestOperation(updateManifestDataModel);
+	}
+	
+	protected void handleAdd() {
+		if (!jarList.isEmpty()) {
+			for (int i = 0; i < jarList.size(); i++) {
+				String jarName = (String) jarList.get(i);
+				selectDependencyIfNecessary(jarName);
+			}
+		}
+	}
+	
+	protected void handleRemove() {
+		if( !jarList.isEmpty() ) {
+			for (int i = 0; i < jarList.size(); i++) {
+				String jarName = (String) jarList.get(i);
+				removeDependency(jarName);
+			}
+		} else {
+			
+		}
+	}
+
+	protected void handleInvert() {
+		classPathSelection.invertClientJARSelection( referencedProject, oppositeProject);
+	}
+	
+	protected void setSelection(ClasspathElement element, boolean val) {
+		element.setSelected(val);
+		manifest.setClassPath(classPathSelection.toString());
+	}
+	
+	public boolean selectDependencyIfNecessary(IProject referencedProject) {
+		if (classPathSelection == null || classPathSelection.hasDirectOrIndirectDependencyTo(referencedProject))
+			return false;
+		ClasspathElement element = classPathSelection.getClasspathElement(referencedProject);
+		if (element != null) {
+			setSelection(element, true);
+			return true;
+		}
+		return false;
+	}
+
+	public boolean selectDependencyIfNecessary(String jarName) {
+		if (classPathSelection == null || classPathSelection.hasDirectOrIndirectDependencyTo(jarName))
+			return false;
+		ClasspathElement element = classPathSelection.getClasspathElement(jarName);
+		if (element != null) {
+			setSelection(element, true);
+			return true;
+		}
+		return false;
+	}
+
+	public void removeDependency(String jarName) {
+		if (classPathSelection == null)
+			return;
+		ClasspathElement element = classPathSelection.getClasspathElement(jarName);
+		if (element != null && element.isValid())
+			setSelection(element, false);
+	}
+
+	public void removeDependency(IProject referencedProject) {
+		if (classPathSelection == null)
+			return;
+		ClasspathElement element = classPathSelection.getClasspathElement(referencedProject);
+		if (element != null && element.isValid())
+			setSelection(element, false);
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/EJBComponentExportOperation.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/EJBComponentExportOperation.java
new file mode 100644
index 0000000..58e56ac
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/EJBComponentExportOperation.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2007 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.internal.ejb.archiveoperations;
+
+import org.eclipse.jst.j2ee.internal.archive.operations.J2EEArtifactExportOperation;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+/**
+ * @deprecated use org.eclipse.jst.j2ee.internal.archive.operations.JavaEEComponentExportOperation instead
+ */
+public class EJBComponentExportOperation extends J2EEArtifactExportOperation {
+
+	public EJBComponentExportOperation() {
+		super();
+	}
+
+	public EJBComponentExportOperation(IDataModel model) {
+		super(model);
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/EJBComponentImportOperation.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/EJBComponentImportOperation.java
new file mode 100644
index 0000000..51285bd
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/EJBComponentImportOperation.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2007 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ * Created on Dec 5, 2003
+ *  
+ */
+package org.eclipse.jst.j2ee.internal.ejb.archiveoperations;
+
+import org.eclipse.jst.j2ee.internal.archive.ComponentArchiveSaveAdapter;
+import org.eclipse.jst.j2ee.internal.archive.EJBComponentArchiveSaveAdapter;
+import org.eclipse.jst.j2ee.internal.archive.operations.J2EEArtifactImportOperation;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+public class EJBComponentImportOperation extends J2EEArtifactImportOperation {
+
+	public EJBComponentImportOperation(IDataModel dataModel) {
+		super(dataModel);
+	}
+
+	@Override
+	protected ComponentArchiveSaveAdapter getArchiveSaveAdapter(IVirtualComponent virtualComponent) {
+		return new EJBComponentArchiveSaveAdapter(virtualComponent);
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/EJBComponentLoadStrategyImpl.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/EJBComponentLoadStrategyImpl.java
new file mode 100644
index 0000000..5184460
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/EJBComponentLoadStrategyImpl.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2007 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.internal.ejb.archiveoperations;
+
+import org.eclipse.jst.j2ee.ejb.componentcore.util.EJBArtifactEdit;
+import org.eclipse.jst.j2ee.internal.archive.operations.J2EEComponentLoadStrategyImpl;
+import org.eclipse.wst.common.componentcore.ArtifactEdit;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+
+public class EJBComponentLoadStrategyImpl extends J2EEComponentLoadStrategyImpl {
+
+	public EJBComponentLoadStrategyImpl(IVirtualComponent vComponent) {
+		this(vComponent, true);
+	}
+
+	public EJBComponentLoadStrategyImpl(IVirtualComponent vComponent, boolean includeClasspathComponents) {
+		super(vComponent, includeClasspathComponents);		
+	}
+	@Override
+	protected synchronized ArtifactEdit getArtifactEditForRead() {
+		if(artifactEdit == null){
+			artifactEdit = EJBArtifactEdit.getEJBArtifactEditForRead(vComponent);
+		}
+		return artifactEdit;
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/EJBJarExtensionsImportOperation.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/EJBJarExtensionsImportOperation.java
new file mode 100644
index 0000000..81ffb92
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/EJBJarExtensionsImportOperation.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ * Created on Oct 7, 2003
+ *
+ * To change the template for this generated file go to
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+package org.eclipse.jst.j2ee.internal.ejb.archiveoperations;
+
+/**
+ * @author vijayb
+ * 
+ * To change the template for this generated type comment go to Window>Preferences>Java>Code
+ * Generation>Code and Comments
+ */
+public interface EJBJarExtensionsImportOperation {
+	//Default
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/EjbClientJarCreationDataModelProvider.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/EjbClientJarCreationDataModelProvider.java
new file mode 100644
index 0000000..0bd17f1
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/EjbClientJarCreationDataModelProvider.java
@@ -0,0 +1,127 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.internal.ejb.archiveoperations;
+
+import java.util.Set;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
+import org.eclipse.jst.j2ee.ejb.componentcore.util.EJBArtifactEdit;
+import org.eclipse.jst.j2ee.internal.ejb.project.operations.EJBCreationResourceHandler;
+import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelProvider;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
+import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
+
+public class EjbClientJarCreationDataModelProvider
+	extends AbstractDataModelProvider 
+	implements IEjbClientJarCreationDataModelProperties{
+
+	public EjbClientJarCreationDataModelProvider() {
+		super();
+	}
+	
+	@Override
+	public Set getPropertyNames() {
+		Set propertyNames = super.getPropertyNames();
+		propertyNames.add(PROJECT_NAME);
+		propertyNames.add(EJB_PROJECT_NAME);
+		propertyNames.add(CLIENT_URI);
+		return propertyNames;
+	}
+	
+	@Override
+	public IDataModelOperation getDefaultOperation() {
+		return new EjbClientJarCreationOperation(model);
+	}
+
+	@Override
+	public Object getDefaultProperty(String propertyName) {
+		if (propertyName.equals(CLIENT_URI)){
+			String projectName = model.getStringProperty(EJB_PROJECT_NAME).replace(' ','_');
+			return projectName + "Client.jar"; //$NON-NLS-1$ 
+		}
+		if (propertyName.equals(PROJECT_NAME)){
+			String projectName = model.getStringProperty(EJB_PROJECT_NAME);
+			return projectName + "Client"; //$NON-NLS-1$ 
+		}
+		return super.getDefaultProperty(propertyName);
+	}
+	
+	@Override
+	public boolean propertySet(String propertyName, Object propertyValue) {
+		boolean status = super.propertySet(propertyName, propertyValue);
+		if (propertyName.equals(PROJECT_NAME)){
+			String projectName = model.getStringProperty(PROJECT_NAME);	
+			if(projectName != null)
+				projectName = projectName.replace(' ','_');
+			setProperty(CLIENT_URI, projectName + "Client.jar");//$NON-NLS-1$			
+		}
+		return status;
+	}
+	
+    @Override
+	public IStatus validate(String propertyName) {
+
+        IStatus status = OK_STATUS;
+        if(status.isOK()) {
+        	if(propertyName.equals(PROJECT_NAME)){
+        		String ejbProjectName = getStringProperty(EJB_PROJECT_NAME);
+	        	String clientProjectName = getStringProperty(PROJECT_NAME);
+	        	if(ejbProjectName.equals(clientProjectName)){
+	        		return WTPCommonPlugin.createErrorStatus(EJBCreationResourceHandler.CLIENT_SAME_NAME_AS_EJB);
+	        	}
+        	}
+	        if(propertyName.equals(PROJECT_NAME)){
+	        	if(hasExistingClientJar())
+	            	return WTPCommonPlugin.createErrorStatus(EJBCreationResourceHandler.EJB_JAR_already_has_client_Jar_); 
+	            status = checkForValidProjectName(getStringProperty(PROJECT_NAME));
+//	            if(status.isOK())
+//                status = validateClientJarUri();	            
+	        }
+
+//	        } else if (propertyName.equals(CLIENT_URI)){
+//	            status = validateClientJarUri();
+//	        }
+        }
+        return status;
+    }	
+    
+	private IStatus checkForValidProjectName(String aProjectName) {
+		return ResourcesPlugin.getWorkspace().validateName(aProjectName, IResource.PROJECT);
+	}
+	
+	protected IProject getEJBProject() {
+		String projectName = getStringProperty(EJB_PROJECT_NAME);
+		return ProjectUtilities.getProject( projectName );
+	}
+	
+    public  boolean hasExistingClientJar() {
+    	IProject project = getEJBProject();
+		if( project.exists() && project.isAccessible()){
+			EJBArtifactEdit edit = null;
+			try {
+					edit = EJBArtifactEdit.getEJBArtifactEditForRead(project);
+					if (edit != null && edit.hasEJBClientJARProject()){
+						return true;
+					}
+					return false;
+			} finally {
+				if(edit != null)
+					edit.dispose();
+					  
+			}
+		}
+		return false;
+    }	
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/EjbClientJarCreationOperation.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/EjbClientJarCreationOperation.java
new file mode 100644
index 0000000..6cd12eb
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/EjbClientJarCreationOperation.java
@@ -0,0 +1,384 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.internal.ejb.archiveoperations;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
+import org.eclipse.jst.common.project.facet.JavaFacetInstallDataModelProvider;
+import org.eclipse.jst.j2ee.application.internal.operations.AddComponentToEnterpriseApplicationDataModelProvider;
+import org.eclipse.jst.j2ee.application.internal.operations.UpdateManifestDataModelProperties;
+import org.eclipse.jst.j2ee.application.internal.operations.UpdateManifestDataModelProvider;
+import org.eclipse.jst.j2ee.application.internal.operations.UpdateManifestOperation;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveManifest;
+import org.eclipse.jst.j2ee.ejb.internal.plugin.EjbPlugin;
+import org.eclipse.jst.j2ee.internal.J2EEConstants;
+import org.eclipse.jst.j2ee.internal.common.CreationConstants;
+import org.eclipse.jst.j2ee.internal.plugin.IJ2EEModuleConstants;
+import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
+import org.eclipse.jst.j2ee.model.IModelProvider;
+import org.eclipse.jst.j2ee.model.ModelProviderManager;
+import org.eclipse.jst.j2ee.project.EarUtilities;
+import org.eclipse.jst.j2ee.project.facet.IUtilityFacetInstallDataModelProperties;
+import org.eclipse.jst.j2ee.project.facet.UtilityProjectCreationDataModelProvider;
+import org.eclipse.jst.jee.project.facet.ICreateDeploymentFilesDataModelProperties;
+import org.eclipse.jst.jee.project.facet.IEJBCreateDeploymentFilesDataModelProperties;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.datamodel.properties.ICreateReferenceComponentsDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties.FacetDataModelMap;
+import org.eclipse.wst.common.componentcore.internal.operation.CreateReferenceComponentsDataModelProvider;
+import org.eclipse.wst.common.componentcore.internal.operation.FacetProjectCreationOperation;
+import org.eclipse.wst.common.componentcore.internal.util.IModuleConstants;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualFile;
+import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.project.facet.core.IFacetedProject;
+import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
+
+public class EjbClientJarCreationOperation
+	extends AbstractDataModelOperation
+	implements IEjbClientJarCreationDataModelProperties{
+
+	private IProgressMonitor monitor = null;
+	
+	public EjbClientJarCreationOperation(IDataModel model) {
+		super(model);
+	}
+
+	@Override
+	public IStatus execute(IProgressMonitor aMonitor, IAdaptable info) throws ExecutionException {
+		
+		monitor = aMonitor;
+		
+		IStatus stat = OK_STATUS;
+
+		IProject ejbproject = ProjectUtilities.getProject(model.getStringProperty( EJB_PROJECT_NAME ));
+		if( ejbproject.exists() && ejbproject.isAccessible()){
+			IFacetedProject facetedProject = null;
+			org.eclipse.wst.common.project.facet.core.runtime.IRuntime runtime = null;
+			String javaSourceFolder = ""; //$NON-NLS-1$
+			
+			try {
+				facetedProject = ProjectFacetsManager.create(ejbproject);
+			} catch (CoreException e) {
+				EjbPlugin.logError(e);
+			}
+			if( facetedProject != null ){
+				runtime = facetedProject.getRuntime();
+
+				IContainer container = J2EEProjectUtilities.getSourceFolderOrFirst(ejbproject, null);
+				if( container.getType() == IResource.FOLDER ){
+					javaSourceFolder = container.getName();
+				}
+				
+			}
+			IProject[] earprojects = EarUtilities.getReferencingEARProjects( ejbproject );
+			
+			
+			String projectName = model.getStringProperty( PROJECT_NAME );
+			//String earProjectName = model.getStringProperty( IJavaUtilityProjectCreationDataModelProperties.EAR_PROJECT_NAME );
+
+			
+			IDataModel dm = DataModelFactory.createDataModel(new UtilityProjectCreationDataModelProvider());
+			
+			FacetDataModelMap map = (FacetDataModelMap) dm.getProperty(UtilityProjectCreationDataModelProvider.FACET_DM_MAP);
+			
+			IDataModel javadm = map.getFacetDataModel( IModuleConstants.JST_JAVA );
+			IDataModel utildm = map.getFacetDataModel( J2EEProjectUtilities.UTILITY );
+			
+			// because we do not want utility->add to ear, as we are going to add it later to all referencing ear projects
+			utildm.setBooleanProperty(IUtilityFacetInstallDataModelProperties.ADD_TO_EAR, false);
+			
+			javadm.setProperty( JavaFacetInstallDataModelProvider.FACET_PROJECT_NAME,
+					projectName);
+			
+			
+			javadm.setProperty( JavaFacetInstallDataModelProvider.SOURCE_FOLDER_NAME,
+					javaSourceFolder);
+
+			javadm.setProperty( JavaFacetInstallDataModelProvider.DEFAULT_OUTPUT_FOLDER_NAME,
+					javaSourceFolder);
+
+			if (earprojects.length > 0)
+				utildm.setProperty( IUtilityFacetInstallDataModelProperties.EAR_PROJECT_NAME, earprojects[0].getName());
+			
+			utildm.setProperty( IUtilityFacetInstallDataModelProperties.FACET_RUNTIME, runtime );
+			dm.setProperty(UtilityProjectCreationDataModelProvider.FACET_RUNTIME, runtime);
+
+			FacetProjectCreationOperation op = new FacetProjectCreationOperation(dm);
+			try {
+				stat = op.execute( monitor, null );
+			} catch (ExecutionException e) {
+				EjbPlugin.logError(e);
+			}
+
+			final IVirtualComponent c = ComponentCore.createComponent( ejbproject );
+			c.setMetaProperty(CreationConstants.EJB_CLIENT_NAME, projectName );
+
+			String clientURI = model.getStringProperty(CLIENT_URI);
+			c.setMetaProperty(CreationConstants.CLIENT_JAR_URI, clientURI);
+			
+			try{
+				for( int i = 0;  i< earprojects.length; i++ ){
+					runAddClientToEAROperation( earprojects[i].getName(), model, monitor);
+				}
+
+				updateEJBDD(model, monitor);
+	            moveOutgoingJARDependencies();
+				EJBClientJarCreationHelper.copyOutgoingClasspathEntries( ejbproject,
+								ProjectUtilities.getProject(projectName), true);
+				modifyEJBModuleJarDependency(model, monitor);
+				IProject clientProject = ProjectUtilities.getProject( model.getStringProperty( PROJECT_NAME ) );
+	            moveIncomingJARDependencies( ejbproject, clientProject );
+	            
+	            
+			}catch (CoreException e) {
+				EjbPlugin.logError(e);
+			} catch (InvocationTargetException e) {
+				EjbPlugin.logError(e);
+			} catch (InterruptedException e) {
+				EjbPlugin.logError(e);
+			}
+			
+			EJBClientJarCreationHelper helper = new EJBClientJarCreationHelper( ejbproject );
+			
+			
+	        IDataModel moveModel =  DataModelFactory.createDataModel( new EJBClientJarFileMoveDataModelProvider());
+	        moveModel.setProperty(IEJBClientJarFileMoveDataModelProperties.EJB_PROJECT_NAME,
+	        			ejbproject.getName() );
+	        moveModel.setProperty(IEJBClientJarFileMoveDataModelProperties.EJB_CLIENTVIEW_PROJECT_NAME,
+	        			 model.getStringProperty( PROJECT_NAME )); 
+
+	        moveModel.setProperty( IEJBClientJarFileMoveDataModelProperties.FILES_TO_MOVE_MAP,
+	        			helper.getFilesToMove() );
+	        moveModel.getDefaultOperation().execute(monitor, null);
+	        
+		}
+		
+
+        
+		return stat;
+	}
+	
+	protected void runAddClientToEAROperation(String earProjectName, IDataModel model, IProgressMonitor monitor) throws CoreException, InvocationTargetException, InterruptedException {
+
+
+		IProject earproject = ProjectUtilities.getProject(earProjectName);
+
+		IVirtualComponent earComp = ComponentCore.createComponent(earproject);
+
+
+		String clientProjectName = model.getStringProperty( PROJECT_NAME );
+
+		IProject clientProject = ProjectUtilities.getProject(clientProjectName);
+		IVirtualComponent component = ComponentCore.createComponent(clientProject);
+
+		if (earComp.exists() && component.exists()) {
+			IDataModel dm = DataModelFactory.createDataModel(new AddComponentToEnterpriseApplicationDataModelProvider());
+			dm.setProperty(ICreateReferenceComponentsDataModelProperties.SOURCE_COMPONENT, earComp);
+
+			List modList = (List) dm.getProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENT_LIST);
+			modList.add(component);
+			dm.setProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENT_LIST, modList);
+			
+			String clientURI = model.getStringProperty(CLIENT_URI);
+			((Map)dm.getProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENTS_TO_URI_MAP)).put(component, clientURI);
+
+			try {
+				dm.getDefaultOperation().execute(monitor, null);
+			} catch (ExecutionException e) {
+				EjbPlugin.logError(e);
+			}
+		}
+	}
+
+
+	protected void runAddClientToEJBOperation(IDataModel model, IProgressMonitor monitor) throws CoreException, InvocationTargetException, InterruptedException {
+
+		String ejbprojectName = model.getStringProperty( EJB_PROJECT_NAME);
+		IProject ejbProj = ProjectUtilities.getProject(ejbprojectName);
+		IVirtualComponent ejbcomponent = ComponentCore.createComponent(ejbProj);
+
+
+		String clientProjectName = model.getStringProperty( PROJECT_NAME);
+		IProject clientProject = ProjectUtilities.getProject(clientProjectName);
+		IVirtualComponent ejbclientcomponent = ComponentCore.createComponent(clientProject);
+
+		IDataModel dm = DataModelFactory.createDataModel(new CreateReferenceComponentsDataModelProvider());
+		dm.setProperty(ICreateReferenceComponentsDataModelProperties.SOURCE_COMPONENT, ejbcomponent);
+
+		List modList = (List) dm.getProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENT_LIST);
+		modList.add(ejbclientcomponent);
+		dm.setProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENT_LIST, modList);
+		try {
+			dm.getDefaultOperation().execute(monitor, null);
+		} catch (ExecutionException e) {
+			EjbPlugin.logError(e);
+		}
+
+	}
+
+	private void modifyEJBModuleJarDependency(IDataModel model, 
+				IProgressMonitor aMonitor) throws InvocationTargetException, InterruptedException {
+
+
+		String ejbprojectName =  model.getStringProperty( EJB_PROJECT_NAME );
+		IProject ejbProj = ProjectUtilities.getProject(ejbprojectName);
+		IVirtualComponent ejbComponent = ComponentCore.createComponent(ejbProj);
+		IVirtualFile vf = ejbComponent.getRootFolder().getFile(new Path(J2EEConstants.MANIFEST_URI));
+		IFile manifestmf = vf.getUnderlyingFile();
+
+		String clientURI = model.getStringProperty(CLIENT_URI);
+
+		IDataModel updateManifestDataModel = DataModelFactory.createDataModel(UpdateManifestDataModelProvider.class);
+		updateManifestDataModel.setProperty(UpdateManifestDataModelProperties.PROJECT_NAME, ejbprojectName);
+		updateManifestDataModel.setBooleanProperty(UpdateManifestDataModelProperties.MERGE, false);
+		updateManifestDataModel.setProperty(UpdateManifestDataModelProperties.MANIFEST_FILE, manifestmf);
+		updateManifestDataModel.setProperty(UpdateManifestDataModelProperties.JAR_LIST, UpdateManifestDataModelProvider.convertClasspathStringToList(clientURI));
+
+
+		try {
+			updateManifestDataModel.getDefaultOperation().execute(aMonitor, null);
+		} catch (Exception e) {
+			EjbPlugin.logError(e);
+		}
+
+	}
+
+
+	private void updateEJBDD(final IDataModel model, IProgressMonitor monitor) {
+
+		String ejbprojectName = model.getStringProperty( EJB_PROJECT_NAME );
+		final IProject ejbProj = ProjectUtilities.getProject(ejbprojectName);
+		
+		//if deployment descriptor does not exist then we need to generate one
+		if (!hasDeploymentDescriptor(ejbProj)) {
+			IDataModel dataModel = DataModelFactory.createDataModel(IEJBCreateDeploymentFilesDataModelProperties.class);
+			dataModel.setProperty(ICreateDeploymentFilesDataModelProperties.TARGET_PROJECT, ejbProj);
+			try {
+				dataModel.getDefaultOperation().execute(new NullProgressMonitor(), null);
+			} catch (ExecutionException e) {
+				EjbPlugin.logError( e );
+			}
+		}
+
+		IModelProvider ejbModel = ModelProviderManager.getModelProvider(ejbProj);
+        ejbModel.modify(new Runnable() {
+            public void run() {
+                IModelProvider writableEjbModel = ModelProviderManager.getModelProvider(ejbProj);
+                Object modelObject = writableEjbModel.getModelObject();
+                String clientProjectName = model.getStringProperty(PROJECT_NAME);
+        		IVirtualComponent c = ComponentCore.createComponent(ejbProj);
+        		Properties props = c.getMetaProperties();
+        		String clienturi = props.getProperty(CreationConstants.CLIENT_JAR_URI);
+        		
+                if (modelObject instanceof org.eclipse.jst.javaee.ejb.EJBJar) {
+                    org.eclipse.jst.javaee.ejb.EJBJar ejbres = (org.eclipse.jst.javaee.ejb.EJBJar) writableEjbModel.getModelObject();
+                    if (clienturi != null && !clienturi.equals("")) { //$NON-NLS-1$
+                    	ejbres.setEjbClientJar(clienturi);
+                    } else
+                    	ejbres.setEjbClientJar(clientProjectName + IJ2EEModuleConstants.JAR_EXT);
+                }
+                else {
+                    org.eclipse.jst.j2ee.ejb.EJBJar ejbres = (org.eclipse.jst.j2ee.ejb.EJBJar) writableEjbModel.getModelObject();
+                    if (clienturi != null && !clienturi.equals("")) { //$NON-NLS-1$
+                        ejbres.setEjbClientJar(clienturi);
+                    } else
+                        ejbres.setEjbClientJar(clientProjectName + IJ2EEModuleConstants.JAR_EXT);
+                }
+            }
+        },null);
+	}	
+	
+	//The referencing projects which were having Ejb will now have ejbclient
+	private void moveIncomingJARDependencies(IProject ejbProject, IProject clientProject ) throws InvocationTargetException, InterruptedException {
+		
+		InvertClientJARDependencyCompoundOperation op = 
+			new InvertClientJARDependencyCompoundOperation( EarUtilities.getReferencingEARProjects( ejbProject ),
+						ejbProject,
+						clientProject );
+	
+		try {
+			op.execute(createSubProgressMonitor(1), null);
+		} catch (ExecutionException e) {
+			EjbPlugin.logError( e );
+		}
+	}
+	
+	protected IProgressMonitor createSubProgressMonitor(int ticks) {
+		return new SubProgressMonitor(monitor, ticks);
+	}	
+	
+	 //from the ejb project collect the entries in its manifest, and put it in the client project,
+	 //remove these entries from the ejb project
+	
+    private void moveOutgoingJARDependencies() throws InvocationTargetException, InterruptedException {
+    	
+		IProject ejbProject = ProjectUtilities.getProject(model.getStringProperty( EJB_PROJECT_NAME ));
+		String clientProjectName = model.getStringProperty( PROJECT_NAME );
+		
+		//from the ejb project collect the entries in its manifest
+        ArchiveManifest ejbMf = J2EEProjectUtilities.readManifest( ejbProject );
+        if (ejbMf == null)
+            return;
+        String[] mfEntries = ejbMf.getClassPathTokenized();
+        if (mfEntries.length == 0)
+            return;
+        
+        IProject[] earProjects = EarUtilities.getReferencingEARProjects( ejbProject );
+        IProject clientProject = ResourcesPlugin.getWorkspace().getRoot().getProject(clientProjectName);
+        IProgressMonitor sub = createSubProgressMonitor( earProjects.length * 2 );
+        for (int i = 0; i < earProjects.length; i++) {
+            List normalized = EJBClientJarCreationHelper.normalize(mfEntries, earProjects[i], ejbProject, true );
+            UpdateManifestOperation addOp = new EJBClientManifestUtility().getAddOperation(clientProject, earProjects[i], normalized);
+            UpdateManifestOperation removeOp = new EJBClientManifestUtility().getRemoveOperation(ejbProject, earProjects[i], normalized, null);
+
+            try {
+				addOp.execute( new SubProgressMonitor(sub, 1), null );
+	            removeOp.execute( new SubProgressMonitor(sub, 1), null );
+			} catch (ExecutionException e) {
+				EjbPlugin.logError( e );
+			}
+        }
+    }
+    
+    private boolean hasDeploymentDescriptor(IProject project) {
+    	boolean ret = true;
+    	IPath ddFilePath = new Path(J2EEConstants.EJBJAR_DD_URI);
+    	IVirtualComponent component = ComponentCore.createComponent(project);
+    	if (component.getRootFolder() != null && component.getRootFolder().getUnderlyingFolder() != null) {
+    		IFile ddXmlFile = component.getRootFolder().getUnderlyingFolder().getFile(ddFilePath);
+    		ret = ddXmlFile.exists();
+    	}
+    	return ret;
+    }
+
+    
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/EjbClientProjectCreationDataModelProvider.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/EjbClientProjectCreationDataModelProvider.java
new file mode 100644
index 0000000..551182f
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/EjbClientProjectCreationDataModelProvider.java
@@ -0,0 +1,116 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.internal.ejb.archiveoperations;
+
+import java.util.Set;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
+import org.eclipse.jst.j2ee.ejb.componentcore.util.EJBArtifactEdit;
+import org.eclipse.jst.j2ee.internal.ejb.project.operations.EJBCreationResourceHandler;
+import org.eclipse.jst.j2ee.project.facet.JavaUtilityProjectCreationDataModelProvider;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
+import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
+
+public class EjbClientProjectCreationDataModelProvider
+	extends JavaUtilityProjectCreationDataModelProvider
+	implements IEjbClientProjectCreationDataModelProperties{
+
+	public EjbClientProjectCreationDataModelProvider() {
+		super();
+	}
+	
+	@Override
+	public Set getPropertyNames() {
+		Set propertyNames = super.getPropertyNames();
+		propertyNames.add(EJB_PROJECT_NAME);
+		propertyNames.add(CLIENT_URI);
+		propertyNames.add(ADD_TO_EAR);
+		propertyNames.add(DEFAULT_OUTPUT_FOLDER);
+		return propertyNames;
+	}
+	
+	@Override
+	public IDataModelOperation getDefaultOperation() {
+		return new EjbClientProjectCreationOperation(model);
+	}
+
+	@Override
+	public Object getDefaultProperty(String propertyName) {
+		if (propertyName.equals(CLIENT_URI)){
+			String projectName = model.getStringProperty(EJB_PROJECT_NAME);
+			return projectName + "Client.jar"; //$NON-NLS-1$ 
+		}
+		if (propertyName.equals(PROJECT_NAME)){
+			String projectName = model.getStringProperty(EJB_PROJECT_NAME);
+			return projectName + "Client"; //$NON-NLS-1$ 
+		}
+		return super.getDefaultProperty(propertyName);
+	}
+	
+    @Override
+	public IStatus validate(String propertyName) {
+
+        IStatus status = OK_STATUS;
+        if(status.isOK()) {
+        	if(propertyName.equals(PROJECT_NAME)){
+        		String ejbProjectName = getStringProperty(EJB_PROJECT_NAME);
+	        	String clientProjectName = getStringProperty(PROJECT_NAME);
+	        	if(ejbProjectName.equals(clientProjectName)){
+	        		return WTPCommonPlugin.createErrorStatus(EJBCreationResourceHandler.CLIENT_SAME_NAME_AS_EJB);
+	        	}
+        	}
+	        if(propertyName.equals(PROJECT_NAME)){
+	        	if(hasExistingClientJar())
+	            	return WTPCommonPlugin.createErrorStatus(EJBCreationResourceHandler.EJB_JAR_already_has_client_Jar_); 
+	            status = checkForValidProjectName(getStringProperty(PROJECT_NAME));
+//	            if(status.isOK())
+//                status = validateClientJarUri();	            
+	        }
+
+//	        } else if (propertyName.equals(CLIENT_URI)){
+//	            status = validateClientJarUri();
+//	        }
+        }
+        return status;
+    }	
+    
+	private IStatus checkForValidProjectName(String aProjectName) {
+		return ResourcesPlugin.getWorkspace().validateName(aProjectName, IResource.PROJECT);
+	}
+	
+	protected IProject getEJBProject() {
+		String projectName = getStringProperty(EJB_PROJECT_NAME);
+		return ProjectUtilities.getProject( projectName );
+	}
+	
+    public  boolean hasExistingClientJar() {
+    	IProject project = getEJBProject();
+		if( project.exists() && project.isAccessible()){
+			EJBArtifactEdit edit = null;
+			try {
+					edit = EJBArtifactEdit.getEJBArtifactEditForRead(project);
+					if (edit != null && edit.hasEJBClientJARProject()){
+						return true;
+					}
+					return false;
+			} finally {
+				if(edit != null)
+					edit.dispose();
+					  
+			}
+		}
+		return false;
+    }    
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/EjbClientProjectCreationOperation.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/EjbClientProjectCreationOperation.java
new file mode 100644
index 0000000..a218c39
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/EjbClientProjectCreationOperation.java
@@ -0,0 +1,121 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.internal.ejb.archiveoperations;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jst.common.project.facet.IJavaFacetInstallDataModelProperties;
+import org.eclipse.jst.common.project.facet.JavaFacetInstallDataModelProvider;
+import org.eclipse.jst.common.project.facet.core.JavaFacet;
+import org.eclipse.jst.j2ee.ejb.archiveoperations.IEjbClientProjectCreationDataModelProperties;
+import org.eclipse.jst.j2ee.ejb.internal.plugin.EjbPlugin;
+import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
+import org.eclipse.jst.j2ee.project.facet.IJavaUtilityProjectCreationDataModelProperties;
+import org.eclipse.jst.j2ee.project.facet.IUtilityFacetInstallDataModelProperties;
+import org.eclipse.jst.j2ee.project.facet.JavaUtilityProjectCreationOperation;
+import org.eclipse.jst.j2ee.project.facet.UtilityProjectCreationDataModelProvider;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties.FacetDataModelMap;
+import org.eclipse.wst.common.componentcore.internal.ModulecorePlugin;
+import org.eclipse.wst.common.componentcore.internal.operation.FacetProjectCreationOperation;
+import org.eclipse.wst.common.componentcore.internal.util.IModuleConstants;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
+import org.eclipse.wst.common.project.facet.core.runtime.IRuntime;
+
+public class EjbClientProjectCreationOperation
+	extends JavaUtilityProjectCreationOperation
+	implements IEjbClientProjectCreationDataModelProperties{
+
+	public EjbClientProjectCreationOperation(IDataModel model) {
+		super(model);
+	}
+
+	@Override
+	public IStatus execute(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+		
+		IStatus stat = OK_STATUS;
+		
+		String projectName = model.getStringProperty( IJavaUtilityProjectCreationDataModelProperties.PROJECT_NAME );
+		String earProjectName = model.getStringProperty( IJavaUtilityProjectCreationDataModelProperties.EAR_PROJECT_NAME );
+		String javaSourceFolder = model.getStringProperty( IJavaUtilityProjectCreationDataModelProperties.SOURCE_FOLDER );
+		String defaultOutputFolder = model.getStringProperty( IEjbClientProjectCreationDataModelProperties.DEFAULT_OUTPUT_FOLDER );
+		org.eclipse.wst.common.project.facet.core.runtime.IRuntime runtime = (IRuntime) model.getProperty(IJavaUtilityProjectCreationDataModelProperties.RUNTIME);
+		
+		IDataModel dm = null;
+		try{
+			dm = DataModelFactory.createDataModel(new UtilityProjectCreationDataModelProvider());
+		
+			FacetDataModelMap map = (FacetDataModelMap) dm.getProperty(UtilityProjectCreationDataModelProvider.FACET_DM_MAP);
+			
+			IDataModel javadm = map.getFacetDataModel( IModuleConstants.JST_JAVA );
+			IDataModel utildm = map.getFacetDataModel( J2EEProjectUtilities.UTILITY );
+			
+			
+			javadm.setProperty( JavaFacetInstallDataModelProvider.FACET_PROJECT_NAME,
+					projectName);
+			
+			
+			javadm.setProperty( JavaFacetInstallDataModelProvider.SOURCE_FOLDER_NAME,
+					javaSourceFolder);
+			
+			if( defaultOutputFolder == null || defaultOutputFolder.length() == 0 ){
+				defaultOutputFolder = javaSourceFolder;
+			}
+			
+			javadm.setProperty(IJavaFacetInstallDataModelProperties.DEFAULT_OUTPUT_FOLDER_NAME,
+					defaultOutputFolder);			
+	
+			//		 if the parent data model has set these properties we will use it, or else default to the utility facet install
+			if(model.isPropertySet(ADD_TO_EAR))
+				utildm.setProperty(IUtilityFacetInstallDataModelProperties.ADD_TO_EAR, model.getProperty(ADD_TO_EAR));
+	
+			if(model.isPropertySet(CLIENT_URI))
+				utildm.setProperty(IUtilityFacetInstallDataModelProperties.MODULE_URI, model.getProperty(CLIENT_URI));
+			
+	
+			utildm.setProperty( IUtilityFacetInstallDataModelProperties.EAR_PROJECT_NAME, earProjectName);
+			
+			utildm.setProperty( IUtilityFacetInstallDataModelProperties.FACET_RUNTIME, runtime );
+			dm.setProperty(UtilityProjectCreationDataModelProvider.FACET_RUNTIME, runtime);
+			
+			//Ensure Java DM has latest supported version
+			try {
+				if (runtime != null)
+				{
+					IProjectFacetVersion oldVersion = (IProjectFacetVersion) javadm.getProperty(IFacetDataModelProperties.FACET_VERSION);
+					IProjectFacetVersion newVersion = JavaFacet.FACET.getLatestSupportedVersion(runtime);
+					if (newVersion != null && (oldVersion == null || oldVersion.getVersionString().compareTo(newVersion.getVersionString()) < 0 || !runtime.supports(oldVersion))) {
+						javadm.setProperty(IFacetDataModelProperties.FACET_VERSION, newVersion);
+					}
+				}
+			} catch (CoreException e) {
+				ModulecorePlugin.logError(e);
+			}
+	
+			FacetProjectCreationOperation op = new FacetProjectCreationOperation(dm);
+			try {
+				stat = op.execute( monitor, null );
+			} catch (ExecutionException e) {
+				EjbPlugin.logError(e);
+			}
+		} finally {
+			if(dm != null){
+				dm.dispose();
+			}
+		}
+		return stat;
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/EjbClientProjectRemovalDataModelProvider.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/EjbClientProjectRemovalDataModelProvider.java
new file mode 100644
index 0000000..5648cd5
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/EjbClientProjectRemovalDataModelProvider.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.internal.ejb.archiveoperations;
+
+import java.util.Set;
+
+import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelProvider;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
+
+public class EjbClientProjectRemovalDataModelProvider
+	extends AbstractDataModelProvider
+	implements IEjbClientProjectRemovalDataModelProperties{
+
+	public EjbClientProjectRemovalDataModelProvider() {
+		super();
+	}
+	
+	@Override
+	public Set getPropertyNames() {
+		Set propertyNames = super.getPropertyNames();
+		propertyNames.add( EJB_PROJECT );
+		propertyNames.add( EJB_CLIENT_VIEW_PROJECT );
+		propertyNames.add( OP_HANDLER );
+		return propertyNames;
+	}
+	
+	@Override
+	public IDataModelOperation getDefaultOperation() {
+		return new EJBClientJARRemovalOperation(model);
+	}
+
+	@Override
+	public Object getDefaultProperty(String propertyName) {
+		return super.getDefaultProperty(propertyName);
+	}
+
+//	private IStatus checkForValidProjectName(String aProjectName) {
+//		return ResourcesPlugin.getWorkspace().validateName(aProjectName, IResource.PROJECT);
+//	}
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/IEJBClientJarFileMoveDataModelProperties.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/IEJBClientJarFileMoveDataModelProperties.java
new file mode 100644
index 0000000..77b64c7
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/IEJBClientJarFileMoveDataModelProperties.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.jst.j2ee.internal.ejb.archiveoperations;
+
+public interface IEJBClientJarFileMoveDataModelProperties {
+
+    /**
+     * Required, type String
+     */
+    public static final String EJB_PROJECT_NAME = "IEJBClientJarFileMoveDataModelProperties.EJB_PROJECT_NAME"; //$NON-NLS-1$
+    /**
+     * Required, type String
+     */
+    public static final String EJB_CLIENTVIEW_PROJECT_NAME = "IEJBClientJarFileMoveDataModelProperties.CLIENT_PROJECT_NAME"; //$NON-NLS-1$
+    
+    /**
+     * Required, type Map
+     */    
+    public static final String FILES_TO_MOVE_MAP = "IEJBClientJarFileMoveDataModelProperties.FILES_TO_MOVE_MAP"; //$NON-NLS-1$
+    
+    
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/IEjbClientJarCreationDataModelProperties.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/IEjbClientJarCreationDataModelProperties.java
new file mode 100644
index 0000000..13aee53
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/IEjbClientJarCreationDataModelProperties.java
@@ -0,0 +1,19 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.internal.ejb.archiveoperations;
+
+
+public interface IEjbClientJarCreationDataModelProperties{
+
+	public static final String PROJECT_NAME = "IJavaUtilityProjectCreationDataModelProperties.PROJECT_NAME"; //$NON-NLS-1$	
+	public static final String EJB_PROJECT_NAME = "IEjbClientProjectCreationDataModelProperties.EJB_PROJECT_NAME"; //$NON-NLS-1$
+	public static final String CLIENT_URI = "IEjbClientProjectCreationDataModelProperties.CLIENT_URI ";//$NON-NLS-1$	
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/IEjbClientProjectCreationDataModelProperties.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/IEjbClientProjectCreationDataModelProperties.java
new file mode 100644
index 0000000..2d28afd
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/IEjbClientProjectCreationDataModelProperties.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.internal.ejb.archiveoperations;
+
+
+/**
+ * This class has become public API.  Please use {@link org.eclipse.jst.j2ee.ejb.archiveoperations.IEjbClientProjectCreationDataModelProperties} 
+ * 
+ * @deprecated
+ * @see org.eclipse.jst.j2ee.ejb.archiveoperations.IEjbClientProjectCreationDataModelProperties
+ */
+
+public interface IEjbClientProjectCreationDataModelProperties extends org.eclipse.jst.j2ee.ejb.archiveoperations.IEjbClientProjectCreationDataModelProperties {
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/IEjbClientProjectRemovalDataModelProperties.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/IEjbClientProjectRemovalDataModelProperties.java
new file mode 100644
index 0000000..1d2091d
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/IEjbClientProjectRemovalDataModelProperties.java
@@ -0,0 +1,21 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.internal.ejb.archiveoperations;
+
+
+public interface IEjbClientProjectRemovalDataModelProperties{
+
+	public static final String EJB_PROJECT = "IEjbClientProjectRemovalDataModelProperties.EJB_PROJECT"; //$NON-NLS-1$
+	
+	public static final String EJB_CLIENT_VIEW_PROJECT = "IEjbClientProjectRemovalDataModelProperties.EJB_CLIENT_VIEW_PROJECT"; //$NON-NLS-1$
+	
+	public static final String OP_HANDLER = "IEjbClientProjectRemovalDataModelProperties.OP_HANDLER"; //$NON-NLS-1$
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/InvertClientJARDependencyCompoundOperation.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/InvertClientJARDependencyCompoundOperation.java
new file mode 100644
index 0000000..e1d4da0
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbarchive/org/eclipse/jst/j2ee/internal/ejb/archiveoperations/InvertClientJARDependencyCompoundOperation.java
@@ -0,0 +1,97 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.jst.j2ee.internal.ejb.archiveoperations;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.jem.workbench.utility.JemProjectUtilities;
+import org.eclipse.jst.j2ee.application.internal.operations.UpdateManifestOperation;
+import org.eclipse.jst.j2ee.ejb.internal.plugin.EjbPlugin;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
+import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
+
+
+public class InvertClientJARDependencyCompoundOperation extends AbstractDataModelOperation {
+
+	protected IProject[] earProjects;
+	protected IProject oldProject;
+	protected IProject newProject;
+	protected List childOperations = null;
+	protected IProgressMonitor monitor;
+
+	public InvertClientJARDependencyCompoundOperation(IProject[] referencingEARs,
+				IProject anOldProject, IProject aNewProject) {
+		
+		earProjects = referencingEARs;
+		oldProject = anOldProject;
+		newProject = aNewProject;
+	}
+
+
+	@Override
+	public IStatus execute(IProgressMonitor aMonitor, IAdaptable info) throws ExecutionException {
+		monitor = aMonitor;
+		createChildOperations();
+		executeChildOperations();	
+		return OK_STATUS;
+	}
+
+
+	private void createChildOperations() {
+
+		childOperations = new ArrayList();
+		for (int i = 0; i < earProjects.length; i++) {
+			IVirtualComponent earComponent = ComponentCore.createComponent( earProjects[i]);
+			IVirtualReference[] refs = earComponent.getReferences();
+			
+			for( int j=0; j< refs.length; j++ ){
+				IVirtualReference ref = refs[j];
+				IVirtualComponent comp = ref.getReferencedComponent();
+				if ( comp != null ){
+					IProject project = comp.getProject();
+					if ( project != null && !project.equals(oldProject) 
+						&& !project.equals(newProject) && !JemProjectUtilities.isBinaryProject(project) 
+						&& !comp.isBinary()){
+						
+						UpdateManifestOperation invertOp = new EJBClientManifestUtility().getInvertOperation(
+								project, earProjects[0], newProject, oldProject);
+						childOperations.add(invertOp);
+					}
+				}
+			}
+
+		}
+	}
+
+	private void executeChildOperations() {
+		monitor.beginTask("", childOperations.size()); //$NON-NLS-1$
+		for (int i = 0; i < childOperations.size(); i++) {
+			AbstractDataModelOperation op = (AbstractDataModelOperation) childOperations.get(i);
+			try {
+				op.execute(new SubProgressMonitor(monitor, 1), null);
+			} catch (Exception e) {
+				EjbPlugin.logError(e);
+			}
+		}
+	}
+
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/XML4J_Ver_2_0_15.info b/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/XML4J_Ver_2_0_15.info
new file mode 100644
index 0000000..f25816e
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/XML4J_Ver_2_0_15.info
@@ -0,0 +1 @@
+2_0_15

diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/ejb/componentcore/util/EJBArtifactEdit.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/ejb/componentcore/util/EJBArtifactEdit.java
new file mode 100644
index 0000000..31618c3
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/ejb/componentcore/util/EJBArtifactEdit.java
@@ -0,0 +1,629 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.ejb.componentcore.util;
+
+import java.util.List;
+import java.util.Properties;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.jem.util.emf.workbench.WorkbenchResourceHelperBase;
+import org.eclipse.jst.j2ee.application.ApplicationPackage;
+import org.eclipse.jst.j2ee.application.Module;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.CommonarchiveFactory;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.OpenFailureException;
+import org.eclipse.jst.j2ee.componentcore.EnterpriseArtifactEdit;
+import org.eclipse.jst.j2ee.ejb.EJBJar;
+import org.eclipse.jst.j2ee.ejb.EJBResource;
+import org.eclipse.jst.j2ee.ejb.EjbFactory;
+import org.eclipse.jst.j2ee.ejb.internal.plugin.EjbPlugin;
+import org.eclipse.jst.j2ee.internal.J2EEConstants;
+import org.eclipse.jst.j2ee.internal.common.CreationConstants;
+import org.eclipse.jst.j2ee.internal.common.XMLResource;
+import org.eclipse.jst.j2ee.internal.componentcore.JavaEEBinaryComponentHelper;
+import org.eclipse.jst.j2ee.internal.ejb.archiveoperations.EJBComponentLoadStrategyImpl;
+import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
+import org.eclipse.jst.j2ee.model.IModelProvider;
+import org.eclipse.jst.j2ee.project.JavaEEProjectUtilities;
+import org.eclipse.wst.common.componentcore.ArtifactEdit;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.ModuleCoreNature;
+import org.eclipse.wst.common.componentcore.UnresolveableURIException;
+import org.eclipse.wst.common.componentcore.internal.ArtifactEditModel;
+import org.eclipse.wst.common.componentcore.internal.BinaryComponentHelper;
+import org.eclipse.wst.common.componentcore.internal.StructureEdit;
+import org.eclipse.wst.common.componentcore.internal.impl.ModuleURIUtil;
+import org.eclipse.wst.common.componentcore.internal.util.IArtifactEditFactory;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
+import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
+import org.eclipse.wst.common.componentcore.resources.IVirtualResource;
+import org.eclipse.wst.common.internal.emfworkbench.WorkbenchResourceHelper;
+
+/**
+ * <p>
+ * EJBArtifactEdit obtains a EJB Deployment Descriptor metamodel specifec data from a
+ * {@see org.eclipse.jst.j2ee.ejb.EJBResource}&nbsp; which stores the metamodel. The
+ * {@see org.eclipse.jst.j2ee.ejb.EJBResource}&nbsp;is retrieved from the
+ * {@see org.eclipse.wst.common.modulecore.ArtifactEditModel}&nbsp;using a constant {@see
+ * J2EEConstants#EJBJAR_DD_URI_OBJ}. The defined methods extract data or manipulate the contents of
+ * the underlying resource.
+ * </p>
+ * 
+ */
+public class EJBArtifactEdit extends EnterpriseArtifactEdit implements IArtifactEditFactory {
+
+	private static final String EJB_CONTENT_TYPE = "org.eclipse.jst.j2ee.ejbDD"; //$NON-NLS-1$
+	/**
+	 * <p>
+	 * Identifier used to link EJBArtifactEdit to a EJBEditAdapterFactory {@see
+	 * EJBEditAdapterFactory} stored in an AdapterManger (@see AdapterManager)
+	 * </p>
+	 */
+
+	public static final Class ADAPTER_TYPE = EJBArtifactEdit.class;
+
+	/**
+	 * 
+	 */
+	public EJBArtifactEdit() {
+		super();
+	}
+
+	public EJBArtifactEdit(IVirtualComponent aModule) {
+		super(aModule);
+	}
+
+	@Override
+	protected BinaryComponentHelper initBinaryComponentHelper(IVirtualComponent binaryModule) {
+		return new JavaEEBinaryComponentHelper(binaryModule);
+	}
+
+	/**
+	 * @param aHandle
+	 * @param toAccessAsReadOnly
+	 * @throws IllegalArgumentException
+	 */
+	public EJBArtifactEdit(IProject aProject, boolean toAccessAsReadOnly) throws IllegalArgumentException {
+		super(aProject, toAccessAsReadOnly);
+	}
+
+	public EJBArtifactEdit(IProject aProject, boolean toAccessAsReadOnly, boolean forCreate) throws IllegalArgumentException {
+		super(aProject, toAccessAsReadOnly, forCreate, J2EEProjectUtilities.EJB);
+	}
+
+	/**
+	 * <p>
+	 * Creates an instance facade for the given {@see ArtifactEditModel}.
+	 * </p>
+	 * 
+	 * @param anArtifactEditModel
+	 */
+	public EJBArtifactEdit(ArtifactEditModel model) {
+		super(model);
+	}
+
+	/**
+	 * <p>
+	 * Creates an instance facade for the given {@see ArtifactEditModel}
+	 * </p>
+	 * 
+	 * <p>
+	 * Note: This method is for internal use only. Clients should not call this method.
+	 * </p>
+	 * 
+	 * @param aNature
+	 *            A non-null {@see ModuleCoreNature}for an accessible project
+	 * @param aModule
+	 *            A non-null {@see WorkbenchComponent}pointing to a module from the given
+	 *            {@see ModuleCoreNature}
+	 */
+	public EJBArtifactEdit(ModuleCoreNature aNature, IVirtualComponent aModule, boolean toAccessAsReadOnly) {
+		super(aNature, aModule, toAccessAsReadOnly);
+	}
+
+	/**
+	 * 
+	 * @return EJBResource from (@link getDeploymentDescriptorResource())
+	 * 
+	 */
+
+	public EJBResource getEJBJarXmiResource() {
+		verifyOperationSupported();
+		return (EJBResource) getDeploymentDescriptorResource();
+	}
+
+	/**
+	 * Experimental API subject to change
+	 * 
+	 * @return IVirtualFolder that contains the deployment descriptor resource.
+	 * @throws CoreException
+	 */
+
+	public IVirtualFolder getDeploymentDescriptorFolder() throws CoreException {
+		IVirtualResource[] resources = getComponent().getRootFolder().members();
+		if (resources != null && resources.length > 0) {
+			for (int i = 0; i < resources.length; i++) {
+				IVirtualResource resource = resources[i];
+				if (resource.getType() == IVirtualResource.FOLDER) {
+					IVirtualFolder folder = (IVirtualFolder) resource;
+					IVirtualResource ddResource = folder.findMember(J2EEConstants.EJBJAR_DD_SHORT_NAME);
+					if (ddResource != null)
+						return folder;
+				}
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Experimental API subject to change
+	 * 
+	 * @return String form of the ejbModule folder path relative to the full path.
+	 * @throws CoreException
+	 */
+
+	public String getEjbModuleRelative(String fullPath) throws CoreException {
+		if (fullPath != null) {
+			if (getDeploymentDescriptorFolder() != null) {
+				String modulePath;
+				if (fullPath.indexOf('/') == 0)
+					modulePath = getDeploymentDescriptorFolder().getProjectRelativePath().removeTrailingSeparator().removeLastSegments(1).toOSString();
+				else
+					modulePath = getDeploymentDescriptorFolder().getProjectRelativePath().removeTrailingSeparator().removeLastSegments(1).makeRelative().toOSString();
+				int indx = (fullPath.indexOf(modulePath) + modulePath.length() + 1);
+				if (fullPath.indexOf(modulePath) != -1)
+					return fullPath.substring(indx);
+			}
+		}
+		return fullPath;
+	}
+
+
+	/**
+	 * <p>
+	 * Retrieves J2EE version information from EJBResource.
+	 * </p>
+	 * 
+	 * @return an integer representation of a J2EE Spec version
+	 * 
+	 */
+
+	@Override
+	public int getJ2EEVersion() {
+		verifyOperationSupported();
+		return getEJBJarXmiResource().getJ2EEVersionID();
+	}
+
+	/**
+	 * <p>
+	 * Checks is a EJB Client Jar exists for the ejb module project
+	 * </p>
+	 * 
+	 * @return boolean
+	 * 
+	 */
+
+	public boolean hasEJBClientJARProject() {
+		verifyOperationSupported();
+
+		if (getEJBClientJarModule() != null)
+			return true;
+		return false;
+	}
+
+	/**
+	 * <p>
+	 * Creates a new EJB module
+	 * </p>
+	 * 
+	 * @return
+	 */
+	public Module createNewModule() {
+		verifyOperationSupported();
+		if (isBinary()) {
+			throwAttemptedBinaryEditModelAccess();
+		}
+		return ((ApplicationPackage) EPackage.Registry.INSTANCE.getEPackage(ApplicationPackage.eNS_URI)).getApplicationFactory().createEjbModule();
+	}
+
+
+	/**
+	 * @param project
+	 * @return WorkbenchComponent
+	 */
+	public IVirtualComponent getEJBClientJarModule() {
+		verifyOperationSupported();
+		EJBJar jar = getEJBJar();
+		IVirtualComponent ejbComponent, ejbClientComponent = null;
+		ejbComponent = ComponentCore.createComponent(getProject());
+		if (ejbComponent == null)
+			return null;
+		Properties props = ejbComponent.getMetaProperties();
+		String clientCompName = props.getProperty(CreationConstants.EJB_CLIENT_NAME);
+		if (clientCompName != null && !clientCompName.equals("")) { //$NON-NLS-1$
+			IVirtualReference vRef = ejbComponent.getReference(clientCompName);
+			if (vRef != null)
+				ejbClientComponent = vRef.getReferencedComponent();
+		} else {
+			String clientJAR = null;
+			if (jar != null)
+				clientJAR = jar.getEjbClientJar();
+			if (clientJAR != null) {
+				clientJAR = clientJAR.substring(0, clientJAR.length() - 4);
+				ejbComponent = ComponentCore.createComponent(getProject());
+				if (ejbComponent == null)
+					return null;
+				IVirtualReference ref = ejbComponent.getReference(clientJAR);
+				if (ref != null)
+					ejbClientComponent = ref.getReferencedComponent();
+			}
+		}
+		return ejbClientComponent;
+	}
+
+
+	/**
+	 * <p>
+	 * Retrieves the underlying resource from the ArtifactEditModel using defined URI.
+	 * </p>
+	 * 
+	 * @return Resource
+	 * 
+	 */
+
+	@Override
+	public Resource getDeploymentDescriptorResource() {
+		verifyOperationSupported();
+		if (isBinary()) {
+			return getBinaryComponentHelper().getResource(J2EEConstants.EJBJAR_DD_URI_OBJ);
+		}
+		return getArtifactEditModel().getResource(J2EEConstants.EJBJAR_DD_URI_OBJ);
+	}
+
+	/**
+	 * 
+	 * @return EJBJar from (@link getDeploymentDescriptorRoot())
+	 * 
+	 */
+	public EJBJar getEJBJar() {
+		verifyOperationSupported();
+		return (EJBJar) getDeploymentDescriptorRoot();
+	}
+
+	/**
+	 * <p>
+	 * Obtains the EJBJar (@see EJBJar) root object from the EJBResource. If the root object does
+	 * not exist, then one is created (@link addEJBJarIfNecessary(getEJBJarXmiResource())). The root
+	 * object contains all other resource defined objects.
+	 * </p>
+	 * 
+	 * @return EObject
+	 * 
+	 */
+	@Override
+	public EObject getDeploymentDescriptorRoot() {
+		verifyOperationSupported();
+		Resource res = getDeploymentDescriptorResource();
+		List contents = res.getContents();
+		if (contents.size() > 0)
+			return (EObject) contents.get(0);
+		if (isBinary()) {
+			return null;
+		}
+		if (!WorkbenchResourceHelper.getFile(res).exists())
+			return null;
+		addEJBJarIfNecessary((EJBResource) getDeploymentDescriptorResource());
+		return (EObject) contents.get(0);
+	}
+
+	/**
+	 * Returns the deployment descriptor type of the EJB module.
+	 * 
+	 * @return int
+	 */
+
+	public int getDeploymentDescriptorType() {
+		return XMLResource.EJB_TYPE;
+	}
+
+	/**
+	 * <p>
+	 * Creates a deployment descriptor root object (EJBJar) and populates with data. Adds the root
+	 * object to the deployment descriptor resource.
+	 * </p>
+	 * 
+	 * <p>
+	 * 
+	 * @param aModule
+	 *            A non-null pointing to a {@see XMLResource} Note: This method is typically used
+	 *            for JUNIT - move?
+	 *            </p>
+	 */
+	protected void addEJBJarIfNecessary(XMLResource aResource) {
+		if (isBinary()) {
+			throwAttemptedBinaryEditModelAccess();
+		}
+		if (aResource != null) {
+			if (aResource.getContents() == null || aResource.getContents().isEmpty()) {
+				EJBJar ejbJar = EjbFactory.eINSTANCE.createEJBJar();
+				aResource.getContents().add(ejbJar);
+			}
+			EJBJar ejbJar = (EJBJar) aResource.getContents().get(0);
+			URI moduleURI = getArtifactEditModel().getModuleURI();
+			try {
+				ejbJar.setDisplayName(StructureEdit.getDeployedName(moduleURI));
+			} catch (UnresolveableURIException e) {
+				// Ignore
+			}
+			aResource.setID(ejbJar, J2EEConstants.EJBJAR_ID);
+			// TODO add more mandatory elements
+			try {
+				if (aResource.isModified())
+					aResource.saveIfNecessary();
+			} catch (Exception e) {
+				EjbPlugin.logError(e);
+			}
+		}
+	}
+
+	/**
+	 * <p>
+	 * Returns an instance facade to manage the underlying edit model for the given
+	 * {@see WorkbenchComponent}. Instances of ArtifactEdit that are returned through this method
+	 * must be {@see #dispose()}ed of when no longer in use.
+	 * </p>
+	 * <p>
+	 * Use to acquire an ArtifactEdit facade for a specific {@see WorkbenchComponent}&nbsp;that
+	 * will not be used for editing. Invocations of any save*() API on an instance returned from
+	 * this method will throw exceptions.
+	 * </p>
+	 * <p>
+	 * <b>The following method may return null. </b>
+	 * </p>
+	 * 
+	 * @param aModule
+	 *            A valid {@see WorkbenchComponent}&nbsp;with a handle that resolves to an
+	 *            accessible project in the workspace
+	 * @return An instance of ArtifactEdit that may only be used to read the underlying content
+	 *         model
+	 */
+	public static EJBArtifactEdit getEJBArtifactEditForRead(IProject aProject) {
+		EJBArtifactEdit artifactEdit = null;
+		try {
+			if (isValidEJBModule(ComponentCore.createComponent(aProject)))
+				artifactEdit = new EJBArtifactEdit(aProject, true, false);
+		} catch (Exception e) {
+			artifactEdit = null;
+		}
+		return artifactEdit;
+	}
+
+	/**
+	 * <p>
+	 * Returns an instance facade to manage the underlying edit model for the given
+	 * {@see WorkbenchComponent}. Instances of ArtifactEdit that are returned through this method
+	 * must be {@see #dispose()}ed of when no longer in use.
+	 * </p>
+	 * <p>
+	 * Use to acquire an ArtifactEdit facade for a specific {@see WorkbenchComponent}&nbsp;that
+	 * will be used for editing.
+	 * </p>
+	 * <p>
+	 * <b>The following method may return null. </b>
+	 * </p>
+	 * 
+	 * @param aModule
+	 *            A valid {@see WorkbenchComponent}&nbsp;with a handle that resolves to an
+	 *            accessible project in the workspace
+	 * @return An instance of ArtifactEdit that may be used to modify and persist changes to the
+	 *         underlying content model
+	 */
+	public static EJBArtifactEdit getEJBArtifactEditForWrite(IProject aProject) {
+		EJBArtifactEdit artifactEdit = null;
+		try {
+			if (isValidEJBModule(ComponentCore.createComponent(aProject)))
+				artifactEdit = new EJBArtifactEdit(aProject, false, false);
+		} catch (Exception e) {
+			artifactEdit = null;
+		}
+		return artifactEdit;
+	}
+
+
+	/**
+	 * <p>
+	 * Returns an instance facade to manage the underlying edit model for the given
+	 * {@see WorkbenchComponent}. Instances of EJBArtifactEdit that are returned through this
+	 * method must be {@see #dispose()}ed of when no longer in use.
+	 * </p>
+	 * <p>
+	 * Use to acquire an EJBArtifactEdit facade for a specific {@see WorkbenchComponent}&nbsp;that
+	 * will not be used for editing. Invocations of any save*() API on an instance returned from
+	 * this method will throw exceptions.
+	 * </p>
+	 * <p>
+	 * <b>This method may return null. </b>
+	 * </p>
+	 * 
+	 * <p>
+	 * Note: This method is for internal use only. Clients should not call this method.
+	 * </p>
+	 * 
+	 * @param aModule
+	 *            A valid {@see WorkbenchComponent}&nbsp;with a handle that resolves to an
+	 *            accessible project in the workspace
+	 * @return An instance of EJBArtifactEdit that may only be used to read the underlying content
+	 *         model
+	 * @throws UnresolveableURIException
+	 *             could not resolve uri.
+	 */
+	public static EJBArtifactEdit getEJBArtifactEditForRead(IVirtualComponent aModule) {
+		if (aModule == null)
+			return null;
+		if (aModule.isBinary()) {
+			return new EJBArtifactEdit(aModule);
+		}
+		return getEJBArtifactEditForRead(aModule.getProject());
+	}
+
+	/**
+	 * <p>
+	 * Returns an instance facade to manage the underlying edit model for the given
+	 * {@see WorkbenchComponent}. Instances of EJBArtifactEdit that are returned through this
+	 * method must be {@see #dispose()}ed of when no longer in use.
+	 * </p>
+	 * <p>
+	 * Use to acquire an EJBArtifactEdit facade for a specific {@see WorkbenchComponent}&nbsp;that
+	 * will be used for editing.
+	 * </p>
+	 * <p>
+	 * <b>This method may return null. </b>
+	 * </p>
+	 * 
+	 * <p>
+	 * Note: This method is for internal use only. Clients should not call this method.
+	 * </p>
+	 * 
+	 * @param aModule
+	 *            A valid {@see WorkbenchComponent}&nbsp;with a handle that resolves to an
+	 *            accessible project in the workspace
+	 * @return An instance of EJBArtifactEdit that may be used to modify and persist changes to the
+	 *         underlying content model
+	 */
+	public static EJBArtifactEdit getEJBArtifactEditForWrite(IVirtualComponent aModule) {
+		if (aModule == null || aModule.isBinary())
+			return null;
+		return getEJBArtifactEditForWrite(aModule.getProject());
+	}
+
+	/**
+	 * @param module
+	 *            A {@see WorkbenchComponent}
+	 * @return True if the supplied module
+	 *         {@see ArtifactEdit#isValidEditableModule(WorkbenchComponent)}and the moduleTypeId is
+	 *         a JST module
+	 */
+	public static boolean isValidEJBModule(IVirtualComponent aModule) throws UnresolveableURIException {
+		if (!isValidEditableModule(aModule))
+			return false;
+		/* and match the JST_EJB_MODULE type */
+		return JavaEEProjectUtilities.isEJBProject(aModule.getProject());
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jst.j2ee.internal.modulecore.util.EnterpriseArtifactEdit#createModelRoot()
+	 */
+	@Override
+	public EObject createModelRoot() {
+		verifyOperationSupported();
+		if (isBinary()) {
+			throwAttemptedBinaryEditModelAccess();
+		}
+
+		return createModelRoot(getJ2EEVersion());
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jst.j2ee.internal.modulecore.util.EnterpriseArtifactEdit#createModelRoot(int)
+	 */
+	@Override
+	public EObject createModelRoot(int version) {
+		verifyOperationSupported();
+		if (isBinary()) {
+			throwAttemptedBinaryEditModelAccess();
+		}
+
+		EJBResource res = (EJBResource) getDeploymentDescriptorResource();
+		res.setModuleVersionID(version);
+		addEJBJarIfNecessary(res);
+		return ((EJBResource) getDeploymentDescriptorResource()).getRootObject();
+	}
+
+	public ArtifactEdit createArtifactEditForRead(IVirtualComponent aComponent) {
+		return getEJBArtifactEditForRead(aComponent);
+	}
+
+	public ArtifactEdit createArtifactEditForWrite(IVirtualComponent aComponent) {
+		return getEJBArtifactEditForWrite(aComponent);
+	}
+
+	@Override
+	public Archive asArchive(boolean includeSource, boolean includeClasspathComponents) throws OpenFailureException {
+		if (isBinary()) {
+			JavaEEBinaryComponentHelper helper = (JavaEEBinaryComponentHelper)getBinaryComponentHelper();
+			return helper.accessLegacyArchive();
+		}
+		EJBComponentLoadStrategyImpl loader = new EJBComponentLoadStrategyImpl(getComponent(), includeClasspathComponents);
+		loader.setExportSource(includeSource);
+		String uri = ModuleURIUtil.getHandleString(getComponent());
+		return CommonarchiveFactory.eINSTANCE.openEJBJarFile(loader, uri);
+	}
+
+	public static void createDeploymentDescriptor(IProject project, int version) {
+		EnterpriseArtifactEdit ejbEdit = new EJBArtifactEdit(project, false, true);
+		try {
+			ejbEdit.createModelRoot(version);
+			ejbEdit.save(null);
+		} finally {  // Make sure new resource is removed  - the uri used for creation shouldn't be cached
+			Resource newRes = ejbEdit.getDeploymentDescriptorResource();
+			WorkbenchResourceHelperBase.getResourceSet(project).getResources().remove(newRes);
+			newRes.unload();
+			ejbEdit.dispose();
+		}
+	}
+	@Override
+	public IModelProvider create(IProject project) {
+		return getEJBArtifactEditForRead(project);
+	}
+
+	@Override
+	public IModelProvider create(IVirtualComponent component) {
+		return getEJBArtifactEditForRead(component);
+	}
+	@Override
+	public void modify(Runnable runnable, IPath modelPath) {
+		setWritableEdit(getEJBArtifactEditForWrite(getProject()));
+		try{
+			runnable.run();
+			if( getWritableEdit() != null ){
+				// Always save regardless of resource path passed - Artifactedits save resources as a unit
+				getWritableEdit().saveIfNecessary( new NullProgressMonitor() );
+			}
+			
+		} finally { //Properly dispose the write artifact edit
+			getWritableEdit().dispose();
+			setWritableEdit(null);
+		}
+	}
+
+	
+	@Override
+	protected String getContentTypeDescriber() {
+		return EJB_CONTENT_TYPE;
+	}
+	@Override
+	protected URI getRootURI() {
+		return J2EEConstants.EJBJAR_DD_URI_OBJ;
+	}
+	
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/ejb/componentcore/util/package.xml b/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/ejb/componentcore/util/package.xml
new file mode 100644
index 0000000..afe8e37
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/ejb/componentcore/util/package.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<html>
+    <head>
+        <meta
+            name="root"
+            content="../../../../../../../" />
+        <title>EJB Artifact Edit api overview</title>
+    </head>
+
+    <body>  
+		<abstract>
+        This package includes the EJBArtifactEdit api. This api is used to work with the emf model
+        of a flexible ejb module. It contains api to read and serialize out the emf model.
+		</abstract>
+
+	<a href="#top">top</a>
+    </body>
+</html>    
+    
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/ejb/internal/modulecore/util/EJBArtifactEditUtilities.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/ejb/internal/modulecore/util/EJBArtifactEditUtilities.java
new file mode 100644
index 0000000..4ae7983
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/ejb/internal/modulecore/util/EJBArtifactEditUtilities.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.ejb.internal.modulecore.util;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
+import org.eclipse.jst.j2ee.ejb.EJBJar;
+import org.eclipse.jst.j2ee.ejb.EnterpriseBean;
+import org.eclipse.jst.j2ee.ejb.componentcore.util.EJBArtifactEdit;
+import org.eclipse.jst.j2ee.project.JavaEEProjectUtilities;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+
+public class EJBArtifactEditUtilities {
+	
+	public static IVirtualComponent getEJBComponent(EnterpriseBean bean) {
+		IProject project = ProjectUtilities.getProject(bean);
+		IVirtualComponent component = ComponentCore.createComponent(project);
+		if (component == null) return null;
+		EJBArtifactEdit edit = null;
+		try {
+			if (JavaEEProjectUtilities.isEJBProject(component.getProject())) {
+				edit = EJBArtifactEdit.getEJBArtifactEditForRead(component);
+				EJBJar jar = edit.getEJBJar();
+				if (jar.getEnterpriseBeanNamed(bean.getName()) != null)
+					return component;
+			}
+		} finally {
+			if (edit != null)
+				edit.dispose();
+		}
+		
+		return null;
+	}
+	
+	public static EJBJar getEJBJar(IVirtualComponent comp) {
+		EJBArtifactEdit edit = null;
+		EJBJar ejbJar = null;
+		try {
+			edit = EJBArtifactEdit.getEJBArtifactEditForRead(comp);
+			if (edit != null)
+				ejbJar = edit.getEJBJar();
+		} finally {
+			if (edit != null)
+				edit.dispose();
+		}
+		return ejbJar;	
+	}
+}
+
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/ejb/internal/modulecore/util/EJBEditAdapterFactory.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/ejb/internal/modulecore/util/EJBEditAdapterFactory.java
new file mode 100644
index 0000000..a680571
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/ejb/internal/modulecore/util/EJBEditAdapterFactory.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.ejb.internal.modulecore.util;
+
+import org.eclipse.core.runtime.IAdapterFactory;
+import org.eclipse.jst.j2ee.ejb.componentcore.util.EJBArtifactEdit;
+import org.eclipse.jst.j2ee.project.JavaEEProjectUtilities;
+import org.eclipse.wst.common.componentcore.ArtifactEdit;
+import org.eclipse.wst.common.componentcore.internal.ArtifactEditModel;
+
+public class EJBEditAdapterFactory implements IAdapterFactory {
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.core.runtime.IAdapterFactory#getAdapter(java.lang.Object, java.lang.Class)
+	 */
+	public Object getAdapter(Object adaptableObject, Class adapterType) {
+		if (adapterType == EJBArtifactEdit.ADAPTER_TYPE || adapterType == ArtifactEdit.ADAPTER_TYPE) {
+			ArtifactEditModel editModel = (ArtifactEditModel) adaptableObject;
+			if (JavaEEProjectUtilities.isEJBProject(editModel.getProject()))
+				return new EJBArtifactEdit((ArtifactEditModel) adaptableObject);
+		}
+		return null;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.core.runtime.IAdapterFactory#getAdapterList()
+	 */
+	public Class[] getAdapterList() {
+		return new Class[]{ArtifactEdit.class, EJBArtifactEdit.class};
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/ejb/project/facet/EjbFacetInstallDelegate.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/ejb/project/facet/EjbFacetInstallDelegate.java
new file mode 100644
index 0000000..12a563e
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/ejb/project/facet/EjbFacetInstallDelegate.java
@@ -0,0 +1,176 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2011 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.ejb.project.facet;
+
+
+
+import java.io.ByteArrayInputStream;
+import java.io.UnsupportedEncodingException;
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.internal.resources.XMLWriter;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jst.common.project.facet.WtpUtils;
+import org.eclipse.jst.common.project.facet.core.ClasspathHelper;
+import org.eclipse.jst.j2ee.componentcore.J2EEModuleVirtualComponent;
+import org.eclipse.jst.j2ee.ejb.componentcore.util.EJBArtifactEdit;
+import org.eclipse.jst.j2ee.ejb.internal.plugin.EjbPlugin;
+import org.eclipse.jst.j2ee.internal.J2EEConstants;
+import org.eclipse.jst.j2ee.internal.common.J2EEVersionUtil;
+import org.eclipse.jst.j2ee.internal.common.classpath.J2EEComponentClasspathContainer;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetConstants;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetInstallDataModelProperties;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEModuleFacetInstallDataModelProperties;
+import org.eclipse.jst.j2ee.project.facet.J2EEFacetInstallDelegate;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.datamodel.FacetDataModelProvider;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetDataModelProperties;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
+import org.eclipse.wst.common.project.facet.core.IDelegate;
+import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
+
+public class EjbFacetInstallDelegate extends J2EEFacetInstallDelegate implements IDelegate {
+
+	public void execute(IProject project, IProjectFacetVersion fv, Object config, IProgressMonitor monitor) throws CoreException {
+
+		if (monitor != null) {
+			monitor.beginTask("", 1); //$NON-NLS-1$
+		}
+
+		try {
+			IDataModel model = (IDataModel) config;
+
+			final IJavaProject jproj = JavaCore.create(project);
+
+			// Add WTP natures.
+
+			WtpUtils.addNatures(project);
+
+			// Create the directory structure.
+			final IWorkspace ws = ResourcesPlugin.getWorkspace();
+			final IPath pjpath = project.getFullPath();
+
+			// Setup the flexible project structure.
+			final IVirtualComponent c = ComponentCore.createComponent(project, false);
+			c.create(0, null);
+			setOutputFolder(model,c);
+			final IVirtualFolder ejbroot = c.getRootFolder();
+
+			IFolder ejbFolder = null;
+			String configFolder = null;
+
+			configFolder = model.getStringProperty(IJ2EEModuleFacetInstallDataModelProperties.CONFIG_FOLDER);
+			Path configFolderPath = new Path(configFolder);
+			ejbroot.createLink(configFolderPath, 0, null);
+			J2EEModuleVirtualComponent.setDefaultDeploymentDescriptorFolder(ejbroot, configFolderPath, null);
+
+			IPath ejbFolderpath = pjpath.append(configFolder);
+
+			ejbFolder = ws.getRoot().getFolder(ejbFolderpath);
+
+			IFile vf = ejbFolder.getFile(new Path(J2EEConstants.MANIFEST_URI));
+			if (vf == null || !vf.exists()) {
+				try {
+					createManifest(project, ejbFolder, monitor);
+				} catch (InvocationTargetException e) {
+					EjbPlugin.logError(e);
+				} catch (InterruptedException e) {
+					EjbPlugin.logError(e);
+				}
+			}
+			
+			if( fv == IJ2EEFacetConstants.EJB_32 || fv == IJ2EEFacetConstants.EJB_31 || fv == IJ2EEFacetConstants.EJB_30)
+            {
+                if(model.getBooleanProperty(IJ2EEFacetInstallDataModelProperties.GENERATE_DD)){
+                    // Create the deployment descriptor (ejb-jar.xml) if one doesn't exist
+                    IFile ejbJarXmlFile = ejbFolder.getFile(J2EEConstants.EJBJAR_DD_URI);
+                    if (!ejbJarXmlFile.exists()) {
+                        try {
+                        	String ejbJarXmlContents = null;
+                        	if(fv == IJ2EEFacetConstants.EJB_32) {
+	                            ejbJarXmlContents = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ejb-jar version=\"3.2\" xmlns=\"http://xmlns.jcp.org/xml/ns/javaee\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/ejb-jar_3_2.xsd\">\n  <display-name>" + XMLWriter.getEscaped(project.getName()) +" </display-name> \n </ejb-jar>"; //$NON-NLS-1$ //$NON-NLS-2$
+                        	} else if(fv == IJ2EEFacetConstants.EJB_31) {
+	                            ejbJarXmlContents = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ejb-jar version=\"3.1\" xmlns=\"http://java.sun.com/xml/ns/javaee\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd\">\n  <display-name>" + XMLWriter.getEscaped(project.getName()) +" </display-name> \n </ejb-jar>"; //$NON-NLS-1$ //$NON-NLS-2$
+                        	} else {
+                        		ejbJarXmlContents = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ejb-jar version=\"3.0\" xmlns=\"http://java.sun.com/xml/ns/javaee\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd\">\n  <display-name>" + XMLWriter.getEscaped(project.getName()) +" </display-name> \n </ejb-jar>"; //$NON-NLS-1$ //$NON-NLS-2$
+                        	}
+                        	ejbJarXmlFile.create(new ByteArrayInputStream(ejbJarXmlContents.getBytes("UTF-8")), true, monitor); //$NON-NLS-1$
+                        } catch (UnsupportedEncodingException e) {
+                        	EjbPlugin.logError(e);
+                        }
+                    }
+                }
+            }
+            else
+            {
+                if (!ejbFolder.getFile(J2EEConstants.EJBJAR_DD_URI).exists()) {
+                    String ver = model.getStringProperty(IFacetDataModelProperties.FACET_VERSION_STR);
+                    int nVer = J2EEVersionUtil.convertVersionStringToInt(ver);
+                    EJBArtifactEdit.createDeploymentDescriptor(project, nVer);
+                }
+            }
+
+			// add source folder maps
+			final IClasspathEntry[] cp = jproj.getRawClasspath();
+			for (int i = 0; i < cp.length; i++) {
+				final IClasspathEntry cpe = cp[i];
+				if (cpe.getEntryKind() == IClasspathEntry.CPE_SOURCE) {
+					ejbroot.createLink(cpe.getPath().removeFirstSegments(1), 0, null);
+				}
+			}
+
+			// Setup the classpath.
+			ClasspathHelper.removeClasspathEntries(project, fv);
+
+			if (!ClasspathHelper.addClasspathEntries(project, fv)) {
+				// TODO: Support the no runtime case.
+				// ClasspathHelper.addClasspathEntries( project, fv, <something> );
+			}
+			
+			if( model.getBooleanProperty(IJ2EEModuleFacetInstallDataModelProperties.INSTALL_EAR_LIBRARY)){
+				final IPath earLibContainer = new Path(J2EEComponentClasspathContainer.CONTAINER_ID);
+				addToClasspath(jproj, JavaCore.newContainerEntry(earLibContainer));
+			}
+			
+			try {
+				((IDataModelOperation) model.getProperty(FacetDataModelProvider.NOTIFICATION_OPERATION)).execute(monitor, null);
+			} catch (ExecutionException e) {
+				EjbPlugin.logError(e);
+			}
+			
+			if (monitor != null) {
+				monitor.worked(1);
+			}
+		}
+
+		finally {
+			if (monitor != null) {
+				monitor.done();
+			}
+		}
+	}
+	
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/ejb/project/facet/EjbFacetPostInstallDelegate.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/ejb/project/facet/EjbFacetPostInstallDelegate.java
new file mode 100644
index 0000000..0c3002a
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/ejb/project/facet/EjbFacetPostInstallDelegate.java
@@ -0,0 +1,306 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.ejb.project.facet;
+
+
+
+import static org.eclipse.wst.common.componentcore.datamodel.properties.IFacetDataModelProperties.FACETED_PROJECT_WORKING_COPY;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
+import org.eclipse.jst.j2ee.application.internal.operations.AddComponentToEnterpriseApplicationDataModelProvider;
+import org.eclipse.jst.j2ee.application.internal.operations.UpdateManifestDataModelProperties;
+import org.eclipse.jst.j2ee.application.internal.operations.UpdateManifestDataModelProvider;
+import org.eclipse.jst.j2ee.ejb.archiveoperations.IEjbClientProjectCreationDataModelProperties;
+import org.eclipse.jst.j2ee.ejb.internal.plugin.EjbPlugin;
+import org.eclipse.jst.j2ee.ejb.project.operations.IEjbFacetInstallDataModelProperties;
+import org.eclipse.jst.j2ee.internal.J2EEConstants;
+import org.eclipse.jst.j2ee.internal.common.CreationConstants;
+import org.eclipse.jst.j2ee.internal.common.J2EEVersionUtil;
+import org.eclipse.jst.j2ee.internal.ejb.archiveoperations.EjbClientProjectCreationDataModelProvider;
+import org.eclipse.jst.j2ee.internal.plugin.IJ2EEModuleConstants;
+import org.eclipse.jst.j2ee.model.IModelProvider;
+import org.eclipse.jst.j2ee.model.ModelProviderManager;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetInstallDataModelProperties;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEModuleFacetInstallDataModelProperties;
+import org.eclipse.jst.j2ee.project.facet.IJavaUtilityProjectCreationDataModelProperties;
+import org.eclipse.jst.j2ee.project.facet.J2EEFacetInstallDelegate;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.datamodel.properties.ICreateReferenceComponentsDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetDataModelProperties;
+import org.eclipse.wst.common.componentcore.internal.operation.CreateReferenceComponentsDataModelProvider;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualFile;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.project.facet.core.IDelegate;
+import org.eclipse.wst.common.project.facet.core.IFacetedProjectWorkingCopy;
+import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
+import org.eclipse.wst.common.project.facet.core.runtime.IRuntime;
+
+public class EjbFacetPostInstallDelegate extends J2EEFacetInstallDelegate implements IDelegate {
+
+	public void execute(IProject project, IProjectFacetVersion fv, Object config, IProgressMonitor monitor) throws CoreException {
+
+		if (monitor != null) {
+			monitor.beginTask("", 1); //$NON-NLS-1$
+		}
+
+		try {
+			IDataModel model = (IDataModel) config;
+
+			final IVirtualComponent c = ComponentCore.createComponent(project);
+			
+			final String earProjectName = (String) model.getProperty(
+						IJ2EEModuleFacetInstallDataModelProperties.EAR_PROJECT_NAME);
+
+			// Associate with an EAR, if necessary.
+			if (model.getBooleanProperty(IJ2EEModuleFacetInstallDataModelProperties.ADD_TO_EAR)) {
+				if (earProjectName != null && !earProjectName.equals("")) { //$NON-NLS-1$
+
+					String ver = fv.getVersionString();
+					String j2eeVersionText = J2EEVersionUtil.convertVersionIntToString
+					(J2EEVersionUtil.convertEJBVersionStringToJ2EEVersionID(ver));
+					
+					final String moduleURI = model.getStringProperty(
+								IJ2EEModuleFacetInstallDataModelProperties.MODULE_URI);
+
+                    final IFacetedProjectWorkingCopy fpjwc
+                        = (IFacetedProjectWorkingCopy) model.getProperty( FACETED_PROJECT_WORKING_COPY );
+                
+					installAndAddModuletoEAR( j2eeVersionText,
+										earProjectName,
+										fpjwc.getPrimaryRuntime(),
+										project,
+										moduleURI,
+										monitor );
+				}
+			}
+			final boolean createClient = model.getBooleanProperty(IEjbFacetInstallDataModelProperties.CREATE_CLIENT);
+			if (createClient)
+			{
+				// Create the Ejb Client View
+				String clientProjectName = (String) model.getProperty(IEjbFacetInstallDataModelProperties.CLIENT_NAME);
+				if (clientProjectName != null && clientProjectName != "") { //$NON-NLS-1$
+					IProject ejbClientProject = ProjectUtilities.getProject(clientProjectName);
+					if (ejbClientProject.exists())
+						return;
+
+					c.setMetaProperty(CreationConstants.EJB_CLIENT_NAME, clientProjectName);
+
+					String clientURI = model.getStringProperty(IEjbFacetInstallDataModelProperties.CLIENT_URI);
+					c.setMetaProperty(CreationConstants.CLIENT_JAR_URI, clientURI);
+
+
+					org.eclipse.wst.common.project.facet.core.runtime.IRuntime rt = (IRuntime) model.getProperty(IJ2EEFacetInstallDataModelProperties.FACET_RUNTIME);
+					try {
+
+						IDataModel dm = DataModelFactory.createDataModel(new EjbClientProjectCreationDataModelProvider());
+
+						dm.setStringProperty(IJavaUtilityProjectCreationDataModelProperties.PROJECT_NAME, clientProjectName);
+						dm.setStringProperty(IEjbClientProjectCreationDataModelProperties.EJB_PROJECT_NAME, model.getStringProperty(IFacetDataModelProperties.FACET_PROJECT_NAME));
+						dm.setStringProperty(IJavaUtilityProjectCreationDataModelProperties.EAR_PROJECT_NAME, earProjectName);
+						String ejbConfigFolder = model.getStringProperty(IJ2EEModuleFacetInstallDataModelProperties.CONFIG_FOLDER);
+						dm.setStringProperty(IJavaUtilityProjectCreationDataModelProperties.SOURCE_FOLDER, ejbConfigFolder);
+
+				        IJavaProject jproject = JavaCore.create(project);
+				        String outputPath = jproject.getOutputLocation().toString();
+				        //the above outputPath contains name of EJB project too which we don't want, remvoe the name
+				        if( outputPath.length() > project.getName().length()+ 1 ){
+				        	outputPath = outputPath.substring( project.getName().length()+ 1 );
+				        }
+
+						dm.setStringProperty(IEjbClientProjectCreationDataModelProperties.DEFAULT_OUTPUT_FOLDER, outputPath);
+						dm.setProperty(IJavaUtilityProjectCreationDataModelProperties.RUNTIME, rt);
+
+						// because we do not want utility->add to ear, as we are going to perform ejb client->add to ear
+						dm.setBooleanProperty(IEjbClientProjectCreationDataModelProperties.ADD_TO_EAR, false);
+
+						dm.getDefaultOperation().execute(monitor, null);
+
+
+					} catch (Exception e) {
+						EjbPlugin.logError(e);
+					}
+
+					try {
+						if (model.getBooleanProperty(IJ2EEModuleFacetInstallDataModelProperties.ADD_TO_EAR))
+							runAddClientToEAROperation(model, monitor);
+						//runAddClientToEJBOperation(model, monitor);
+						modifyEJBModuleJarDependency(model, monitor);
+						updateEJBDD(model, monitor);
+					} catch (CoreException e) {
+						EjbPlugin.logError(e);
+					} catch (InvocationTargetException e) {
+						EjbPlugin.logError(e);
+					} catch (InterruptedException e) {
+						EjbPlugin.logError(e);
+					}
+				}
+			}
+			if (monitor != null) {
+				monitor.worked(1);
+			}
+
+		}
+
+		finally {
+			if (monitor != null) {
+				monitor.done();
+			}
+		}
+	}
+
+	protected void runAddClientToEAROperation(IDataModel model, IProgressMonitor monitor) throws CoreException, InvocationTargetException, InterruptedException {
+
+		final String earProjectName = (String) model.getProperty(IJ2EEModuleFacetInstallDataModelProperties.EAR_PROJECT_NAME);
+		IProject earproject = ProjectUtilities.getProject(earProjectName);
+
+		IVirtualComponent earComp = ComponentCore.createComponent(earproject);
+
+
+		String clientProjectName = model.getStringProperty(IEjbFacetInstallDataModelProperties.CLIENT_NAME);
+
+		IProject clientProject = ProjectUtilities.getProject(clientProjectName);
+		IVirtualComponent component = ComponentCore.createComponent(clientProject);
+
+		if (earComp.exists() && component.exists()) {
+			IDataModel dm = DataModelFactory.createDataModel(new AddComponentToEnterpriseApplicationDataModelProvider());
+			dm.setProperty(ICreateReferenceComponentsDataModelProperties.SOURCE_COMPONENT, earComp);
+
+			List modList = (List) dm.getProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENT_LIST);
+			modList.add(component);
+			dm.setProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENT_LIST, modList);
+			
+			String clientURI = model.getStringProperty(IEjbFacetInstallDataModelProperties.CLIENT_URI);
+			((Map)dm.getProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENTS_TO_URI_MAP)).put(component, clientURI);
+			
+			try {
+				dm.getDefaultOperation().execute(monitor, null);
+			} catch (ExecutionException e) {
+				EjbPlugin.logError(e);
+			}
+		}
+	}
+
+
+	protected void runAddClientToEJBOperation(IDataModel model, IProgressMonitor monitor) throws CoreException, InvocationTargetException, InterruptedException {
+
+		String ejbprojectName = model.getStringProperty(IFacetDataModelProperties.FACET_PROJECT_NAME);
+		IProject ejbProj = ProjectUtilities.getProject(ejbprojectName);
+		IVirtualComponent ejbcomponent = ComponentCore.createComponent(ejbProj);
+
+
+		String clientProjectName = model.getStringProperty(IEjbFacetInstallDataModelProperties.CLIENT_NAME);
+		IProject clientProject = ProjectUtilities.getProject(clientProjectName);
+		IVirtualComponent ejbclientcomponent = ComponentCore.createComponent(clientProject);
+
+		IDataModel dm = DataModelFactory.createDataModel(new CreateReferenceComponentsDataModelProvider());
+		dm.setProperty(ICreateReferenceComponentsDataModelProperties.SOURCE_COMPONENT, ejbcomponent);
+
+		List modList = (List) dm.getProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENT_LIST);
+		modList.add(ejbclientcomponent);
+		dm.setProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENT_LIST, modList);
+		try {
+			dm.getDefaultOperation().execute(monitor, null);
+		} catch (ExecutionException e) {
+			EjbPlugin.logError(e);
+		}
+
+	}
+
+	private void modifyEJBModuleJarDependency(IDataModel model, IProgressMonitor aMonitor) throws InvocationTargetException, InterruptedException {
+		String ejbprojectName = model.getStringProperty(IFacetDataModelProperties.FACET_PROJECT_NAME);
+		IProject ejbProj = ProjectUtilities.getProject(ejbprojectName);
+		IVirtualComponent ejbComponent = ComponentCore.createComponent(ejbProj);
+		IVirtualFile vf = ejbComponent.getRootFolder().getFile(new Path(J2EEConstants.MANIFEST_URI));
+		IFile manifestmf = vf.getUnderlyingFile();
+		if (manifestmf == null || !manifestmf.exists()) {
+			try {
+				createManifest(ejbProj, ejbComponent.getRootFolder().getUnderlyingFolder(), aMonitor);
+			} catch (Exception e) {
+				EjbPlugin.logError(e);
+			}
+			String manifestFolder = IPath.SEPARATOR + model.getStringProperty(IJ2EEModuleFacetInstallDataModelProperties.CONFIG_FOLDER) + IPath.SEPARATOR + J2EEConstants.META_INF;
+			IContainer container = ejbProj.getFolder(manifestFolder);
+			manifestmf = container.getFile(new Path(J2EEConstants.MANIFEST_SHORT_NAME));
+		}
+
+		String clientURI = model.getStringProperty(IEjbFacetInstallDataModelProperties.CLIENT_URI);
+
+		IDataModel updateManifestDataModel = DataModelFactory.createDataModel(UpdateManifestDataModelProvider.class);
+		updateManifestDataModel.setProperty(UpdateManifestDataModelProperties.PROJECT_NAME, ejbprojectName);
+		updateManifestDataModel.setBooleanProperty(UpdateManifestDataModelProperties.MERGE, false);
+		updateManifestDataModel.setProperty(UpdateManifestDataModelProperties.MANIFEST_FILE, manifestmf);
+		updateManifestDataModel.setProperty(UpdateManifestDataModelProperties.JAR_LIST, UpdateManifestDataModelProvider.convertClasspathStringToList(clientURI));
+
+
+		try {
+			updateManifestDataModel.getDefaultOperation().execute(aMonitor, null);
+		} catch (Exception e) {
+			EjbPlugin.logError(e);
+		}
+
+	}
+
+
+    private void updateEJBDD(final IDataModel model, IProgressMonitor monitor) {
+
+        String ejbprojectName = model.getStringProperty(IFacetDataModelProperties.FACET_PROJECT_NAME);
+        final IProject ejbProj = ProjectUtilities.getProject(ejbprojectName);
+
+        IModelProvider ejbModel = ModelProviderManager.getModelProvider(ejbProj);
+        ejbModel.modify(new Runnable() {
+            public void run() {
+                String clientProjectName = model.getStringProperty(IEjbFacetInstallDataModelProperties.CLIENT_NAME);
+                IVirtualComponent c = ComponentCore.createComponent(ejbProj);
+                Properties props = c.getMetaProperties();
+                String clienturi = props.getProperty(CreationConstants.CLIENT_JAR_URI);
+                IModelProvider writableEjbModel = ModelProviderManager.getModelProvider(ejbProj);
+                Object modelObject = writableEjbModel.getModelObject();
+                
+                if( modelObject instanceof org.eclipse.jst.javaee.ejb.EJBJar )
+                {
+                    org.eclipse.jst.javaee.ejb.EJBJar ejbres = (org.eclipse.jst.javaee.ejb.EJBJar) writableEjbModel.getModelObject();
+                    if (ejbres != null) {// Could have no DD
+                        if (clienturi != null && !clienturi.equals("")) { //$NON-NLS-1$
+                            ejbres.setEjbClientJar(clienturi);
+                        } else
+                            ejbres.setEjbClientJar(clientProjectName + IJ2EEModuleConstants.JAR_EXT);
+                    }
+                }
+                else
+                {
+                    org.eclipse.jst.j2ee.ejb.EJBJar ejbres = (org.eclipse.jst.j2ee.ejb.EJBJar) writableEjbModel.getModelObject();
+                    if (clienturi != null && !clienturi.equals("")) { //$NON-NLS-1$
+                        ejbres.setEjbClientJar(clienturi);
+                    } else
+                        ejbres.setEjbClientJar(clientProjectName + IJ2EEModuleConstants.JAR_EXT);
+                }
+            }
+        },null);
+    }
+    
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/ejb/project/facet/EjbFacetRuntimeChangedDelegate.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/ejb/project/facet/EjbFacetRuntimeChangedDelegate.java
new file mode 100644
index 0000000..374a018
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/ejb/project/facet/EjbFacetRuntimeChangedDelegate.java
@@ -0,0 +1,67 @@
+/******************************************************************************
+ * Copyright (c) 2005 BEA Systems, Inc.
+ * 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:
+ *    Konstantin Komissarchik - initial API and implementation
+ ******************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.project.facet;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jst.common.project.facet.core.ClasspathHelper;
+import org.eclipse.wst.common.project.facet.core.IDelegate;
+import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
+
+/**
+ * @author <a href="mailto:kosta@bea.com">Konstantin Komissarchik</a>
+ */
+
+public final class EjbFacetRuntimeChangedDelegate 
+
+    implements IDelegate
+    
+{
+    public void execute( final IProject project, 
+                         final IProjectFacetVersion fv,
+                         final Object cfg,
+                         final IProgressMonitor monitor )
+    
+        throws CoreException
+        
+    {
+        if( monitor != null )
+        {
+            monitor.beginTask( "", 1 ); //$NON-NLS-1$
+        }
+        
+        try
+        {
+            ClasspathHelper.removeClasspathEntries( project, fv );
+            
+            if( ! ClasspathHelper.addClasspathEntries( project, fv ) )
+            {
+                // TODO: Support the no runtime case.
+                // ClasspathHelper.addClasspathEntries( project, fv, <something> );
+            }
+            
+            if( monitor != null )
+            {
+                monitor.worked( 1 );
+            }
+        }
+        finally
+        {
+            if( monitor != null )
+            {
+                monitor.done();
+            }
+        }
+    }
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/ejb/project/operations/IEjbFacetInstallDataModelProperties.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/ejb/project/operations/IEjbFacetInstallDataModelProperties.java
new file mode 100644
index 0000000..378952c
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/ejb/project/operations/IEjbFacetInstallDataModelProperties.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.ejb.project.operations;
+
+import org.eclipse.jst.j2ee.internal.ejb.project.operations.EjbFacetProjectCreationDataModelProvider;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEModuleFacetInstallDataModelProperties;
+
+public interface IEjbFacetInstallDataModelProperties 
+	extends IJ2EEModuleFacetInstallDataModelProperties {
+
+	/**
+	 * This field should not be used.  It is not part of the API and may be modified in the future.
+	 */
+	public static Class _provider_class = EjbFacetProjectCreationDataModelProvider.class;
+	
+    public static final String CREATE_CLIENT = "IEjbFacetInstallDataModelProperties.CREATE_CLIENT"; //$NON-NLS-1$	
+	public static final String CLIENT_NAME = "IEjbFacetInstallDataModelProperties.CLIENT_NAME ";//$NON-NLS-1$	
+	public static final String CLIENT_SOURCE_FOLDER = "IEjbFacetInstallDataModelProperties.CLIENT_SOURCE_FOLDER ";//$NON-NLS-1$
+	public static final String CLIENT_URI = "IEjbFacetInstallDataModelProperties.CLIENT_URI ";//$NON-NLS-1$
+	public static final String ALLOW_EJB_CLIENT = "IEjbFacetInstallDataModelProperties.ALLOW_EJB_CLIENT ";//$NON-NLS-1$
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/internal/ejb/project/ArrayHelper.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/internal/ejb/project/ArrayHelper.java
new file mode 100644
index 0000000..62d9754
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/internal/ejb/project/ArrayHelper.java
@@ -0,0 +1,110 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.internal.ejb.project;
+
+
+/**
+ * Insert the type's description here. Creation date: (09/07/00 9:06:48 AM)
+ * 
+ * @author: Administrator
+ */
+public class ArrayHelper {
+	/**
+	 * ArrayHelper constructor comment.
+	 */
+	public ArrayHelper() {
+		super();
+	}
+
+	/**
+	 * Insert the method's description here. Creation date: (09/07/00 9:06:53 AM)
+	 */
+	void newMethod() {
+		//do nothing
+	}
+
+	/**
+	 * Sort the strings in the given collection.
+	 */
+	private static void quickSort(String[] sortedCollection, int left, int right) {
+		int localLeft = left;
+		int localRight = right;
+		int original_left = localLeft;
+		int original_right = localRight;
+		String mid = sortedCollection[(localLeft + localRight) / 2];
+		do {
+			while (sortedCollection[localLeft].compareTo(mid) < 0) {
+				localLeft++;
+			}
+			while (mid.compareTo(sortedCollection[localRight]) < 0) {
+				localRight--;
+			}
+			if (localLeft <= localRight) {
+				String tmp = sortedCollection[localLeft];
+				sortedCollection[localLeft] = sortedCollection[localRight];
+				sortedCollection[localRight] = tmp;
+				localLeft++;
+				localRight--;
+			}
+		} while (localLeft <= localRight);
+		if (original_left < localRight) {
+			quickSort(sortedCollection, original_left, localRight);
+		}
+		if (localLeft < original_right) {
+			quickSort(sortedCollection, localLeft, original_right);
+		}
+	}
+
+	/**
+	 * Sorts an array of strings in place using quicksort.
+	 */
+	public static int[] searchWhenTyping(String[] array, String typedText) {
+		int[] indices = new int[array.length];
+		int count = 0;
+		for (int i = 0; i < array.length; i++) {
+			if (array[i].startsWith(typedText)) {
+				indices[count] = i;
+				count++;
+			}
+		}
+		int[] result = new int[count];
+		for (int i = 0; i < count; i++) {
+			result[i] = indices[i];
+		}
+		return result;
+	}
+
+	/**
+	 * Sort an int array Shell Sort from K&R, pg 108
+	 */
+	public static void sort(int[] items) {
+		int length = items.length;
+		for (int gap = length / 2; gap > 0; gap /= 2) {
+			for (int i = gap; i < length; i++) {
+				for (int j = i - gap; j >= 0; j -= gap) {
+					if (items[j] <= items[j + gap]) {
+						int swap = items[j];
+						items[j] = items[j + gap];
+						items[j + gap] = swap;
+					}
+				}
+			}
+		}
+	}
+
+	/**
+	 * Sorts an array of strings in place using quicksort.
+	 */
+	public static void sort(String[] strings) {
+		if (strings.length > 1)
+			quickSort(strings, 0, strings.length - 1);
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/internal/ejb/project/IEJBApplicationConstants.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/internal/ejb/project/IEJBApplicationConstants.java
new file mode 100644
index 0000000..afa970e
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/internal/ejb/project/IEJBApplicationConstants.java
@@ -0,0 +1,33 @@
+/***************************************************************************************************
+ * Copyright (c) 2003, 2004 IBM 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: IBM Corporation - initial API and implementation
+ **************************************************************************************************/
+package org.eclipse.jst.j2ee.internal.ejb.project;
+
+
+/*
+ * The IWebApplicationContents are the list of tags that are usuable for specifying a web
+ * application parameters via XML
+ * 
+ * @see WebApplicationSpecification for the full DTD
+ */
+
+public interface IEJBApplicationConstants {
+
+	// EJB Application parameters
+	String NODE = "node"; //$NON-NLS-1$
+	String PORT = "port"; //$NON-NLS-1$
+	String CLASSPATH = "classpath"; //$NON-NLS-1$
+	String SOURCE_PATH = "sourcepath"; //$NON-NLS-1$
+	String META_PATH = "metapath"; //$NON-NLS-1$
+	String PATH = "path"; //$NON-NLS-1$
+	String EXTENSION = "extension"; //$NON-NLS-1$
+	String ERROR_HANDLER = "ErrorHandler"; //$NON-NLS-1$
+
+	//We always use the same value so there is no need to have a proper setting
+	String VIRTUAL_HOST_VALUE = "default_host"; //$NON-NLS-1$
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/internal/ejb/project/IOverwriteQuery.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/internal/ejb/project/IOverwriteQuery.java
new file mode 100644
index 0000000..20ba730
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/internal/ejb/project/IOverwriteQuery.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.internal.ejb.project;
+
+import org.eclipse.jst.j2ee.internal.ejb.project.operations.EJBCreationResourceHandler;
+
+
+
+/**
+ * Implementors of this interface answer one of the prescribed return codes when asked whether to
+ * overwrite a certain path string (which could represent a resource path, a file system path, etc)
+ */
+public interface IOverwriteQuery {
+	public static final String CANCEL = EJBCreationResourceHandler.CANCEL_UI_; 
+	public static final String NO = EJBCreationResourceHandler.NO_UI_; 
+	public static final String YES = EJBCreationResourceHandler.YES_UI_; 
+	public static final String ALL = EJBCreationResourceHandler.ALL_UI_; 
+
+	/**
+	 * Answer one of the interface's prescribed responses indicating whether the entity represented
+	 * by the passed String should be overwritten
+	 * 
+	 * @return String
+	 * @param pathString
+	 *            java.lang.String
+	 */
+	String queryOverwrite(String pathString);
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/internal/ejb/project/StringMatcher.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/internal/ejb/project/StringMatcher.java
new file mode 100644
index 0000000..4330a6f
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/internal/ejb/project/StringMatcher.java
@@ -0,0 +1,422 @@
+/***************************************************************************************************
+ * Copyright (c) 2003, 2004 IBM 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: IBM Corporation - initial API and implementation
+ **************************************************************************************************/
+package org.eclipse.jst.j2ee.internal.ejb.project;
+
+
+import java.util.Vector;
+
+public class StringMatcher {
+	public static class Position {
+		int start; //inclusive
+		int end; //exclusive
+
+		public Position(int start, int end) {
+			this.start = start;
+			this.end = end;
+		}
+
+		public int getStart() {
+			return start;
+		}
+
+		public int getEnd() {
+			return end;
+		}
+	}
+
+	protected String fPattern;
+	protected int fLength; // pattern length
+	protected boolean fIgnoreWildCards;
+	protected boolean fIgnoreCase;
+	protected boolean fHasLeadingStar;
+	protected boolean fHasTrailingStar;
+	protected String fSegments[]; //the given pattern is split into * separated segments
+	/* boundary value beyond which we don't need to search in the text */
+	protected int fBound = 0;
+	protected static final char fSingleWildCard = '\u0000';
+
+	/**
+	 * StringMatcher constructor takes in a String object that is a simple pattern which may contain
+	 * |221*|222 for 0 and many characters and |221?|222 for exactly one character. Also takes as
+	 * parameter a boolean object specifying if case should be ignored
+	 * 
+	 * @deprecated Use StringMatcher(pattern, ignoreCase, ignoreWildCards).
+	 */
+	public StringMatcher(String aPattern, boolean ignoreCase) {
+		this(aPattern, ignoreCase, false);
+	}
+
+	/**
+	 * StringMatcher constructor takes in a String object that is a simple pattern which may contain
+	 * |221*|222 for 0 and many characters and |221?|222 for exactly one character.
+	 * 
+	 * Literal '*' and '?' characters must be escaped in the pattern e.g., "\*" means literal "*",
+	 * etc.
+	 * 
+	 * Escaping any other character (including the escape character itself), just results in that
+	 * character in the pattern. e.g., "\a" means "a" and "\\" means "\"
+	 * 
+	 * If invoking the StringMatcher with string literals in Java, don't forget escape characters
+	 * are represented by "\\".
+	 * 
+	 * @param aPattern
+	 *            the pattern to match text against
+	 * @param ignoreCase
+	 *            if true, case is ignored
+	 * @param ignoreWildCards
+	 *            if true, wild cards and their escape sequences are ignored (everything is taken
+	 *            literally).
+	 */
+	public StringMatcher(String aPattern, boolean ignoreCase, boolean ignoreWildCards) {
+		fIgnoreCase = ignoreCase;
+		fIgnoreWildCards = ignoreWildCards;
+		fLength = aPattern.length();
+
+		/* convert case */
+		if (fIgnoreCase) {
+			fPattern = aPattern.toUpperCase();
+		} else {
+			fPattern = aPattern;
+		}
+
+		if (fIgnoreWildCards) {
+			parseNoWildCards();
+		} else {
+			parseWildCards();
+		}
+	}
+
+	/**
+	 * Find the first occurrence of the pattern between <code>start</code)(inclusive) 
+	 * and <code>end</code>(exclusive).  
+	 * @param <code>text</code>, the String object to search in 
+	 * @param <code>start</code>, the starting index of the search range, inclusive
+	 * @param <code>end</code>, the ending index of the search range, exclusive
+	 * @return an <code>StringMatcher.Position</code> object that keeps the starting 
+	 * (inclusive) and ending positions (exclusive) of the first occurrence of the 
+	 * pattern in the specified range of the text; return null if not found or subtext
+	 * is empty (start==end). A pair of zeros is returned if pattern is empty string
+	 * Note that for pattern like "*abc*" with leading and trailing stars, position of "abc"
+	 * is returned. For a pattern like"*??*" in text "abcdf", (1,3) is returned
+	 */
+
+	public StringMatcher.Position find(String text, int start, int end) {
+		if (fPattern == null || text == null)
+			throw new IllegalArgumentException();
+		int localStart = start;
+		int localEnd = end;
+		
+		int tlen = text.length();
+		if (localStart < 0)
+			localStart = 0;
+		if (localEnd > tlen)
+			localEnd = tlen;
+		if (localEnd < 0 || localStart >= localEnd)
+			return null;
+		if (fLength == 0)
+			return new Position(localStart, localStart);
+		if (fIgnoreWildCards) {
+			int x = posIn(text, localStart, localEnd);
+			if (x < 0)
+				return null;
+			return new Position(x, x + fLength);
+		}
+
+		int segCount = fSegments.length;
+		if (segCount == 0)//pattern contains only '*'(s)
+			return new Position(localStart, localEnd);
+
+		int curPos = localStart;
+		int matchStart = -1;
+		for (int i = 0; i < segCount && curPos < localEnd; ++i) {
+			String current = fSegments[i];
+			int nextMatch = regExpPosIn(text, curPos, localEnd, current);
+			if (nextMatch < 0)
+				return null;
+			if (i == 0)
+				matchStart = nextMatch;
+			curPos = nextMatch + current.length();
+		}
+		return new Position(matchStart, curPos);
+	}
+
+	/**
+	 * match the given <code>text</code> with the pattern
+	 * 
+	 * @return true if matched eitherwise false
+	 * @param <code>text</code>, a String object
+	 */
+	public boolean match(String text) {
+		return match(text, 0, text.length());
+	}
+
+	/**
+	 * Given the starting (inclusive) and the ending (exclusive) poisitions in the <code>text</code>,
+	 * determine if the given substring matches with aPattern
+	 * 
+	 * @return true if the specified portion of the text matches the pattern
+	 * @param String
+	 *            <code>text</code>, a String object that contains the substring to match
+	 * @param int
+	 *            <code>start<code> marks the starting position (inclusive) of the substring
+	 * @param int <code>end<code> marks the ending index (exclusive) of the substring
+	 */
+	public boolean match(String text, int start, int end) {
+		if (null == fPattern || null == text)
+			throw new IllegalArgumentException();
+
+		int localStart = start;
+		int localEnd = end;
+		
+		if (localStart > localEnd)
+			return false;
+
+		if (fIgnoreWildCards)
+			return fPattern.regionMatches(fIgnoreCase, 0, text, localStart, fLength);
+		int segCount = fSegments.length;
+		if (segCount == 0)//pattern contains only '*'(s) or empty pattern
+			return true;
+		if (localStart == localEnd)
+			return fLength == 0;
+		if (fLength == 0)
+			return localStart == localEnd;
+
+		int tlen = text.length();
+		if (localStart < 0)
+			localStart = 0;
+		if (localEnd > tlen)
+			localEnd = tlen;
+
+		int tCurPos = localStart;
+		int bound = localEnd - fBound;
+		if (bound < 0)
+			return false;
+		int i = 0;
+		String current = fSegments[i];
+		int segLength = current.length();
+
+		/* process first segment */
+		if (!fHasLeadingStar) {
+			if (!regExpRegionMatches(text, localStart, current, 0, segLength)) {
+				return false;
+			}
+			++i;
+			tCurPos = tCurPos + segLength;
+		}
+
+		/* process middle segments */
+		for (; i < segCount && tCurPos <= bound; ++i) {
+			current = fSegments[i];
+			int currentMatch;
+			int k = current.indexOf(fSingleWildCard);
+			if (k < 0) {
+				currentMatch = textPosIn(text, tCurPos, localEnd, current);
+				if (currentMatch < 0)
+					return false;
+			} else {
+				currentMatch = regExpPosIn(text, tCurPos, localEnd, current);
+				if (currentMatch < 0)
+					return false;
+			}
+			tCurPos = currentMatch + current.length();
+		}
+
+		/* process final segment */
+		if (!fHasTrailingStar && tCurPos != localEnd) {
+			int clen = current.length();
+			return regExpRegionMatches(text, localEnd - clen, current, 0, clen);
+		}
+		return i == segCount;
+	}
+
+	/**
+	 * This method parses the given pattern into segments seperated by wildcard '*' characters.
+	 * Since wildcards are not being used in this case, the pattern consists of a single segment.
+	 */
+	private void parseNoWildCards() {
+		fSegments = new String[1];
+		fSegments[0] = fPattern;
+		fBound = fLength;
+	}
+
+	/**
+	 * This method parses the given pattern into segments seperated by wildcard '*' characters.
+	 * 
+	 * @param p,
+	 *            a String object that is a simple regular expression with |221*|222 and/or
+	 *            |221?|222
+	 */
+	private void parseWildCards() {
+		if (fPattern.startsWith("*"))//$NON-NLS-1$
+			fHasLeadingStar = true;
+		if (fPattern.endsWith("*")) {//$NON-NLS-1$
+			/* make sure it's not an escaped wildcard */
+			if (fLength > 1 && fPattern.charAt(fLength - 2) != '\\') {
+				fHasTrailingStar = true;
+			}
+		}
+
+		Vector temp = new Vector();
+
+		int pos = 0;
+		StringBuffer buf = new StringBuffer();
+		while (pos < fLength) {
+			char c = fPattern.charAt(pos++);
+			switch (c) {
+				case '\\' :
+					if (pos >= fLength) {
+						buf.append(c);
+					} else {
+						char next = fPattern.charAt(pos++);
+						/* if it's an escape sequence */
+						if (next == '*' || next == '?' || next == '\\') {
+							buf.append(next);
+						} else {
+							/* not an escape sequence, just insert literally */
+							buf.append(c);
+							buf.append(next);
+						}
+					}
+					break;
+				case '*' :
+					if (buf.length() > 0) {
+						/* new segment */
+						temp.addElement(buf.toString());
+						fBound += buf.length();
+						buf.setLength(0);
+					}
+					break;
+				case '?' :
+					/* append special character representing single match wildcard */
+					buf.append(fSingleWildCard);
+					break;
+				default :
+					buf.append(c);
+			}
+		}
+
+		/* add last buffer to segment list */
+		if (buf.length() > 0) {
+			temp.addElement(buf.toString());
+			fBound += buf.length();
+		}
+
+		fSegments = new String[temp.size()];
+		temp.copyInto(fSegments);
+	}
+
+	/**
+	 * @param <code>text</code>, a string which contains no wildcard
+	 * @param <code>start</code>, the starting index in the text for search, inclusive
+	 * @param <code>end</code>, the stopping point of search, exclusive
+	 * @return the starting index in the text of the pattern , or -1 if not found
+	 */
+	protected int posIn(String text, int start, int end) {//no wild card in pattern
+		int max = end - fLength;
+
+		if (!fIgnoreCase) {
+			int i = text.indexOf(fPattern, start);
+			if (i == -1 || i > max)
+				return -1;
+			return i;
+		}
+
+		for (int i = start; i <= max; ++i) {
+			if (text.regionMatches(true, i, fPattern, 0, fLength))
+				return i;
+		}
+
+		return -1;
+	}
+
+	/**
+	 * @param <code>text</code>, a simple regular expression that may only contain '?'(s)
+	 * @param <code>start</code>, the starting index in the text for search, inclusive
+	 * @param <code>end</code>, the stopping point of search, exclusive
+	 * @param <code>p</code>, a simple regular expression that may contains '?'
+	 * @param <code>caseIgnored</code>, wether the pattern is not casesensitive
+	 * @return the starting index in the text of the pattern , or -1 if not found
+	 */
+	protected int regExpPosIn(String text, int start, int end, String p) {
+		int plen = p.length();
+
+		int max = end - plen;
+		for (int i = start; i <= max; ++i) {
+			if (regExpRegionMatches(text, i, p, 0, plen))
+				return i;
+		}
+		return -1;
+	}
+
+	/**
+	 * 
+	 * @return boolean
+	 * @param <code>text</code>, a String to match
+	 * @param <code>start</code>, int that indicates the starting index of match, inclusive
+	 * @param <code>end</code> int that indicates the ending index of match, exclusive
+	 * @param <code>p</code>, String, String, a simple regular expression that may contain '?'
+	 * @param <code>ignoreCase</code>, boolean indicating whether code>p</code> is case sensitive
+	 */
+	protected boolean regExpRegionMatches(String text, int tStart, String p, int pStart, int plen) {
+		int localTStart = tStart;
+		int localPStart = pStart;
+		int localPlen = plen;
+		while (localPlen-- > 0) {
+			char tchar = text.charAt(localTStart++);
+			char pchar = p.charAt(localPStart++);
+
+			/* process wild cards */
+			if (!fIgnoreWildCards) {
+				/* skip single wild cards */
+				if (pchar == fSingleWildCard) {
+					continue;
+				}
+			}
+			if (pchar == tchar)
+				continue;
+			if (fIgnoreCase) {
+				char tc = Character.toUpperCase(tchar);
+				if (tc == pchar)
+					continue;
+			}
+			return false;
+		}
+		return true;
+	}
+
+	/**
+	 * @param <code>text</code>, the string to match
+	 * @param <code>start</code>, the starting index in the text for search, inclusive
+	 * @param <code>end</code>, the stopping point of search, exclusive
+	 * @param code>p
+	 *            </code>, a string that has no wildcard
+	 * @param <code>
+	 *            ignoreCase</code>, boolean indicating wether code>p</code> is case sensitive
+	 * @return the starting index in the text of the pattern , or -1 if not found
+	 */
+	protected int textPosIn(String text, int start, int end, String p) {
+
+		int plen = p.length();
+		int max = end - plen;
+
+		if (!fIgnoreCase) {
+			int i = text.indexOf(p, start);
+			if (i == -1 || i > max)
+				return -1;
+			return i;
+		}
+
+		for (int i = 0; i <= max; ++i) {
+			if (text.regionMatches(true, i, p, 0, plen))
+				return i;
+		}
+
+		return -1;
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/internal/ejb/project/operations/ClientJARCreationConstants.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/internal/ejb/project/operations/ClientJARCreationConstants.java
new file mode 100644
index 0000000..9d3c0c1
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/internal/ejb/project/operations/ClientJARCreationConstants.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ * Created on Aug 11, 2003
+ *
+ */
+package org.eclipse.jst.j2ee.internal.ejb.project.operations;
+
+import org.eclipse.jst.j2ee.internal.plugin.IJ2EEModuleConstants;
+
+
+
+
+/**
+ * @author schacher
+ */
+public interface ClientJARCreationConstants {
+// @deprecated @see org.eclipse.jst.j2ee.internal.plugin.IJ2EEModuleConstants.JAR_EXT
+	String DOT_JAR = IJ2EEModuleConstants.JAR_EXT;
+	String SRC_FOLDER_NAME = "src"; //$NON-NLS-1$
+	String _STUB = "_Stub"; //$NON-NLS-1$
+	String UNDERSCORE = "_"; //$NON-NLS-1$
+	String CREATING_CLIENT_JAR = EJBCreationResourceHandler.CREATING_CLIENT_JAR_UI_; 
+	String FILES_OUT_OF_SYNC = EJBCreationResourceHandler.FILES_OUT_OF_SYNC_UI_; 
+	String REMOVING_CLIENT_JAR = EJBCreationResourceHandler.ClientJAR_8; 
+	String SHOULD_OVERWRITE = EJBCreationResourceHandler.ClientJAR_9; 
+	String REMOVE_TITLE = EJBCreationResourceHandler.ClientJAR_10; 
+	String REMOVE_MESSAGE = EJBCreationResourceHandler.ClientJAR_11; 
+	String NO_CLIENT_JAR_TITLE = EJBCreationResourceHandler.ClientJAR_12; 
+	String NO_CLIENT_JAR_MSG = EJBCreationResourceHandler.ClientJAR_13; 
+	String REMOVE_ERROR_TITLE = EJBCreationResourceHandler.ClientJAR_14; 
+	String BINARY_EJB_PROJECT = EJBCreationResourceHandler.remove_client_jar_binary; 
+	String BINARY_CLIENT_PROJECT = EJBCreationResourceHandler.remove_client_jar_client_binary; 
+	String ERROR_REMOVING_CLIENT = EJBCreationResourceHandler.ClientJAR_15; 
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/internal/ejb/project/operations/EJBComponentExportDataModelProvider.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/internal/ejb/project/operations/EJBComponentExportDataModelProvider.java
new file mode 100644
index 0000000..e58e29e
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/internal/ejb/project/operations/EJBComponentExportDataModelProvider.java
@@ -0,0 +1,100 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.internal.ejb.project.operations;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jst.j2ee.application.internal.operations.J2EEComponentExportDataModelProvider;
+import org.eclipse.jst.j2ee.internal.archive.operations.JavaEEComponentExportOperation;
+import org.eclipse.jst.j2ee.internal.earcreation.EARCreationResourceHandler;
+import org.eclipse.jst.j2ee.internal.plugin.IJ2EEModuleConstants;
+import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
+
+public class EJBComponentExportDataModelProvider extends J2EEComponentExportDataModelProvider {
+
+	public EJBComponentExportDataModelProvider() {
+		super();
+	}
+
+	@Override
+	public IDataModelOperation getDefaultOperation() {
+		return new JavaEEComponentExportOperation(model);
+	}
+
+	@Override
+	protected String getProjectType() {
+		return J2EEProjectUtilities.EJB;
+	}
+
+	@Override
+	protected String getWrongComponentTypeString(String projectName) {
+		return EARCreationResourceHandler.getString(EARCreationResourceHandler.NOT_AN_EJB, new Object[]{projectName});
+	}
+
+	@Override
+	protected String getModuleExtension() {
+		return IJ2EEModuleConstants.JAR_EXT;
+	}
+
+	@Override
+	public IStatus validate(String propertyName) {
+		IStatus status = super.validate(propertyName);
+		// if (status.isOK()) {
+		// if (COMPONENT_NAME.equals(propertyName)) {
+		// String projectName = (String) model.getProperty(COMPONENT_NAME);
+		// IStatus status2 = ProjectCreationDataModel.validateProjectName(projectName);
+		// if (!status2.isOK()) {
+		// return status2;
+		// }
+		// IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
+		// EJBNatureRuntime nature = EJBNatureRuntime.getRuntime(project);
+		// if (nature != null && nature.hasEJBClientJARProject()) {
+		// return
+		// WTPCommonPlugin.createWarningStatus(EJBCreationResourceHandler.getString("EJB_EXPORT_PROJECT_CONTAINS_CLEINT_WARNING"));
+		// //$NON-NLS-1$
+		// }
+		// }
+		// }
+		return status;
+	}
+	/**
+	 * Exports the specified EJB Module project to the specified EJB JAR file.
+	 * 
+	 * @param ejbProjectName
+	 *            The name of the EJB Module project to export.
+	 * @param ejbJarFileName
+	 *            The fully qualified EJB JAR file location to export the specified EJB Module
+	 *            project.
+	 * @param overwriteExisting
+	 *            If this is <code>true</code> then an existing file at the location specified by
+	 *            <code>earFileName</code> will be overwritten.
+	 * @param exportSource
+	 *            If this is <code>true</code> then all source files in the specified EJB Module
+	 *            will be included in the resulting EJB JAR file.
+	 * @plannedfor WTP 1.0
+	 */
+	// TODO: how should this be handled in new dm providers
+	// public static void exportProject(String ejbProjectName, String ejbJarFileName, boolean
+	// overwriteExisting, boolean exportSource) {
+	// EJBModuleExportDataModel dataModel = new EJBModuleExportDataModel();
+	// dataModel.setProperty(PROJECT_NAME, ejbProjectName);
+	// dataModel.setBooleanProperty(OVERWRITE_EXISTING, overwriteExisting);
+	// dataModel.setProperty(ARCHIVE_DESTINATION, ejbJarFileName);
+	// dataModel.setBooleanProperty(EXPORT_SOURCE_FILES, exportSource);
+	// try {
+	// dataModel.getDefaultOperation().run(null);
+	// } catch (InvocationTargetException e) {
+	// EjbPlugin.logError(e);
+	// } catch (InterruptedException e) {
+	// EjbPlugin.logError(e);
+	// }
+	// }
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/internal/ejb/project/operations/EJBComponentImportDataModelProvider.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/internal/ejb/project/operations/EJBComponentImportDataModelProvider.java
new file mode 100644
index 0000000..0cf0da5
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/internal/ejb/project/operations/EJBComponentImportDataModelProvider.java
@@ -0,0 +1,110 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2013 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.internal.ejb.project.operations;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.jst.j2ee.application.internal.operations.J2EEComponentImportDataModelProvider;
+import org.eclipse.jst.j2ee.ejb.datamodel.properties.IEJBComponentImportDataModelProperties;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.j2ee.internal.archive.JavaEEArchiveUtilities;
+import org.eclipse.jst.j2ee.internal.common.J2EEVersionUtil;
+import org.eclipse.jst.j2ee.internal.common.XMLResource;
+import org.eclipse.jst.j2ee.internal.ejb.archiveoperations.EJBComponentImportOperation;
+import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetConstants;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetInstallDataModelProperties;
+import org.eclipse.jst.jee.archive.ArchiveOpenFailureException;
+import org.eclipse.jst.jee.archive.ArchiveOptions;
+import org.eclipse.jst.jee.util.internal.JavaEEQuickPeek;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties.FacetDataModelMap;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
+
+/**
+ * This dataModel is used for to import EJB Modules (from EJB Jar files) into the workspace.
+ * 
+ * This class (and all its fields and methods) is likely to change during the WTP 1.0 milestones as
+ * the new project structures are adopted. Use at your own risk.
+ * 
+ * @plannedfor WTP 1.0
+ */
+public final class EJBComponentImportDataModelProvider extends J2EEComponentImportDataModelProvider implements IEJBComponentImportDataModelProperties {
+
+	@Override
+	protected int getType() {
+		return XMLResource.EJB_TYPE;
+	}
+
+	@Override
+	protected void handleUnknownType(JavaEEQuickPeek jqp) {
+		jqp.setType(J2EEVersionConstants.EJB_TYPE);
+		jqp.setVersion(J2EEVersionConstants.EJB_3_2_ID);
+		jqp.setJavaEEVersion(J2EEVersionConstants.JEE_7_0_ID);
+	}
+	
+	@Override
+	public IDataModelOperation getDefaultOperation() {
+		return new EJBComponentImportOperation(model);
+	}
+
+	@Override
+	protected IDataModel createJ2EEComponentCreationDataModel() {
+		IDataModel ejbCreationDM = DataModelFactory.createDataModel(new EjbFacetProjectCreationDataModelProvider());
+		
+		FacetDataModelMap map = (FacetDataModelMap) ejbCreationDM.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
+		IDataModel ejbFacetDataModel = map.getFacetDataModel( J2EEProjectUtilities.EJB );
+		ejbFacetDataModel.setBooleanProperty(IEjbFacetInstallDataModelProperties.CREATE_CLIENT, false);
+		return ejbCreationDM;
+	}
+	
+	@Override
+	public boolean propertySet(String propertyName, Object propertyValue) {
+		boolean set = super.propertySet(propertyName, propertyValue);
+		if (propertyName.equals(ARCHIVE_WRAPPER)) {
+			if (getArchiveWrapper() != null) {
+				refreshInterpretedSpecVersion();
+				model.notifyPropertyChange(PROJECT_NAME, IDataModel.VALID_VALUES_CHG);
+			}
+		}
+		return set;
+	}
+
+	@Override
+	protected void refreshInterpretedSpecVersion(){
+		IDataModel moduleDM = model.getNestedModel(NESTED_MODEL_J2EE_COMPONENT_CREATION);
+		FacetDataModelMap map = (FacetDataModelMap) moduleDM.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
+		IDataModel ejbFacetDataModel = map.getFacetDataModel( J2EEProjectUtilities.EJB );
+		int version = getInterpretedSpecVersion(getArchiveWrapper()).getVersion();
+		String versionText = J2EEVersionUtil.getEJBTextVersion( version );
+		ejbFacetDataModel.setStringProperty(IFacetDataModelProperties.FACET_VERSION_STR, versionText);
+		updateWorkingCopyFacetVersion(moduleDM, ejbFacetDataModel);
+		updateJavaFacetVersion();
+	}
+
+	@Override
+	public void init() {
+		super.init();
+		IDataModel componentCreationDM = model.getNestedModel(NESTED_MODEL_J2EE_COMPONENT_CREATION);
+		FacetDataModelMap map = (FacetDataModelMap) componentCreationDM.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
+		IDataModel ejbFacet = map.getFacetDataModel( IJ2EEFacetConstants.EJB );	
+		ejbFacet.setBooleanProperty(IJ2EEFacetInstallDataModelProperties.GENERATE_DD, false);
+	}
+	
+	@Override
+	protected ArchiveOptions getArchiveOptions(IPath archivePath) throws ArchiveOpenFailureException {
+		ArchiveOptions archiveOptions = super.getArchiveOptions(archivePath);
+		archiveOptions.setOption(JavaEEArchiveUtilities.DISCRIMINATE_MAIN_CLASS, Boolean.FALSE);
+		return archiveOptions;
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/internal/ejb/project/operations/EJBCreationResourceHandler.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/internal/ejb/project/operations/EJBCreationResourceHandler.java
new file mode 100644
index 0000000..a75d1e3
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/internal/ejb/project/operations/EJBCreationResourceHandler.java
@@ -0,0 +1,214 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2014 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *     Oracle - EJB Timer
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.internal.ejb.project.operations;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+import org.eclipse.osgi.util.NLS;
+
+public final class EJBCreationResourceHandler extends NLS {
+
+	private static final String BUNDLE_NAME = "ejbcreation";//$NON-NLS-1$
+
+	private EJBCreationResourceHandler() {
+		// Do not instantiate
+	}
+
+	public static String Error_occured_getting_ejb__ERROR_;
+	public static String Loading_examples_____UI_;
+	public static String Traversing_file_system____UI_;
+	public static String Importing_files____UI_;
+	public static String Creating_EJB_Project____UI_;
+	public static String Not_an_ejb_project_UI_;
+	public static String An_ejb_project_must_be_open_and_must_exist_for_properties_to_be_edited_UI_;
+	public static String CANCEL_UI_;
+	public static String NO_UI_;
+	public static String YES_UI_;
+	public static String ALL_UI_;
+	public static String None_UI_;
+	public static String Enter_bean_name_UI_;
+	public static String Message_invalid_bean_name_UI_;
+	public static String Bean_name_is_already_used_UI_;
+	public static String Bean_name_UI_;
+	public static String Default_pack_not_be_null_UI_;
+	public static String The_project_does_not_conta_UI_;
+	public static String Select_a_source_folder__UI_;
+	public static String The_selected_source_folder_UI_;
+	public static String The_selected_source_folder1_UI_;
+	public static String Package_root_must_be_direc_UI_;
+	public static String Bean_class_UI_;
+	public static String Bean_superclass_UI_;
+	public static String Message_Enter_bean_class_name_UI_;
+	public static String Bean_Class_Cannot_Be_In_UI_;
+	public static String Class_implements;
+	public static String Message_Enter_home_interface_name_UI_;
+	public static String Message_Home_Interface_UI_;
+	public static String Message_Enter_remote_interface_name_UI_;
+	public static String Message_Remote_Interface_UI_;
+	public static String Remote_interface_cannot_be_i_UI_;
+	public static String Home_interface_cannot_be_i_UI_;
+	public static String Interface_extends;
+	public static String Local_Home_not_in_a_default_pkg_UI_;
+	public static String Enter_local_home_name_UI_;
+	public static String Enter_local_int_name_UI_;
+	public static String Local_home_interface_UI_;
+	public static String Local_interface_UI_;
+	public static String Local_not_in_a_default_pkg_UI_;
+	public static String Enter_service_endpoint_name_UI_;
+	public static String Service_endpoint_interface_UI_;
+	public static String Service_endpoint_not_in_a_default_pkg_UI_;
+	public static String Atleast_one_client;
+	public static String Atleast_one_client_with_service;
+	public static String Name_collision_pattern;
+	public static String Creating_source_folder__1;
+	public static String Select_valid_EJB_project;
+	public static String BEAN_SUPERCLASS_NOT_EXIST;
+	public static String Super_EJB_has_no_local_interface;
+	public static String Super_EJB_has_no_remote_interface;
+	public static String Key_class_UI_;
+	public static String Entity_enter_primary_key;
+	public static String Entyty_primary_key_not_default;
+	public static String Entity_primary_key_duplicate;
+	public static String EJB_CLIENT_JAR_CREATION_ERROR_;
+	public static String EJB_CLIENT_JAR_CREATION_MESSAGE_;
+	public static String CREATING_CLIENT_JAR_UI_;
+	public static String FILES_OUT_OF_SYNC_UI_;
+	public static String EJB_Client_JAR_name_exists_;
+	public static String EJB_JAR_already_has_client_Jar_;
+	public static String CLIENT_JAR_URI_NOT_RESOLVE_UI_;
+	public static String ClientJAR_8;
+	public static String ClientJAR_9;
+	public static String ClientJAR_10;
+	public static String ClientJAR_11;
+	public static String ClientJAR_12;
+	public static String ClientJAR_13;
+	public static String ClientJAR_14;
+	public static String ClientJAR_15;
+	public static String remove_client_jar_binary;
+	public static String CANNOT_RESOLVE_INTERFACE_UI_;
+	public static String _1;
+	public static String _2;
+	public static String Neither_Bean_A_nor_Bean_B_have_a_local_client_view_UI_;
+	public static String Relationship_name_cannot_be_empty_UI_;
+	public static String Relationship_name_already_exist_198_UI_;
+	public static String Role_name_for_Bean_A_cannot_be_empty_UI_;
+	public static String Role_name_for_Bean_A_must_be_java_valid_field_UI_;
+	public static String Role_name_for_Bean_B_cannot_be_empty_UI_;
+	public static String Role_name_for_Bean_B_must_be_java_valid_field_UI_;
+	public static String Multiplicity_for_Bean_A_cannot_be_empty_UI_;
+	public static String Multiplicity_for_Bean_B_cannot_be_empty_UI_;
+	public static String CMR_field_name_for_Bean_A_cannot_be_empty_UI_;
+	public static String CMR_field_name_for_Bean_B_cannot_be_empty_UI_;
+	public static String CMR_field_type_for_Bean_A_cannot_be_empty_UI_;
+	public static String CMR_field_type_for_Bean_B_cannot_be_empty_UI_;
+	public static String Relationship_must_be_navigable_atleast_in_one_direction_UI_;
+	public static String Role_name_cannot_be_the_same_UI_;
+	public static String Cannot_create_many_to_many_relationship_UI_;
+	public static String is_not_an_unique_CMR_;
+	public static String is_not_an_unique_role_name_;
+	public static String CMR_fields_must_be_unique_;
+	public static String Bean_A_does_not_match_Bean_B_client_view_;
+	public static String Bean_A_CMR_field_name_is_not_valid_java_field_UI_;
+	public static String Bean_B_CMR_field_name_is_not_valid_java_field_UI_;
+	public static String Bean_empty_;
+	public static String Selected_bean_a_must_be_a_cmp_;
+	public static String Selected_bean_b_must_be_a_cmp_;
+	public static String Selected_bean_a_must_be_2_x_cmp_;
+	public static String Selected_bean_b_must_be_2_x_cmp_;
+	public static String FIELD_CANNOT_BE_EMPTY;
+	public static String AN_OPERATION_MUST_BE_SELECTED;
+	public static String CLIENT_VIEW_ERR_DELETE_SUPERCLASS;
+	public static String CANNOT_REMOVE_BOTH_LOCAL_AND_REMOTE;
+	public static String SELECT_ONE_OR_MORE_VIEWS;
+	public static String ONLY_ONE_VIEW_CREATE;
+	public static String ERR_CMP_FIELD_LIST_EMPTY;
+	public static String ERR_CMP_FIELD_LIST_KEY_FIELD_EMPTY;
+	public static String ERR_PLEASE_SELECT_A_FOREIGN_KEY;
+	public static String ERR_FOREIGN_KEY_SELECTED;
+	public static String ServiceEndpoint_interface_cannot_be_UI_;
+	public static String NON_INTERFACE_NAME_CANNOT_BE_NULL_UI_;
+	public static String ONE_END_MUST_BE_NAV;
+	public static String CANT_BE_BINARY_PROJECT_UI_;
+	public static String EJB_EXPORT_PROJECT_CONTAINS_CLEINT_WARNING;
+	public static String remove_client_jar_client_binary;
+	public static String EJB_Client_JAR_Creation_Error_;
+	public static String Cannot_Be_Binary_Project_For_Client_;
+	public static String Cannot_Be_StandAlone_Project_For_Client_;
+	public static String TRANSACTION_TYPE_CONTAINER;
+	public static String TRANSACTION_TYPE_BEAN;
+	public static String STATE_TYPE_STATELESS;
+	public static String STATE_TYPE_STATEFUL;
+	public static String STATE_TYPE_SINGLETON;
+	public static String DESTINATION_TYPE_QUEUE;
+	public static String DESTINATION_TYPE_TOPIC;
+	
+	public static String ERR_BEAN_ALREADY_EXISTS;
+	public static String ERR_COULD_NOT_RESOLVE_INTERFACE;
+	public static String ERR_LOCAL_HOME_MISSING_CREATE_METHOD;
+	public static String ERR_REMOTE_HOME_MISSING_CREATE_METHOD;
+	public static String ERR_LOCAL_HOME_CREATE_METHOD_RETURN_TYPE_INVALID;
+	public static String ERR_REMOTE_HOME_CREATE_METHOD_RETURN_TYPE_INVALID;
+	public static String ERR_LOCAL_COMPONENT_NOT_INTERFACE;
+	public static String ERR_LOCAL_HOME_NOT_INTERFACE;
+	public static String ERR_REMOTE_COMPONENT_NOT_INTERFACE;
+	public static String ERR_REMOTE_HOME_NOT_INTERFACE;
+	public static String ERR_NO_MESSAGE_LISTENER_INTERFACE;
+	public static String WRN_BEAN_NAME_IS_EMPTY;
+	public static String WRN_NO_CLIENT_VIEW;
+	public static String ERR_SINGLETON_NOT_ALLOWED;
+	public static String ERR_NO_INTERFACE_NOT_ALLOWED;
+	public static String WRN_EJB31_ASYNC_NOT_SUPPORTED;
+
+	//EJB Timer specific
+    public static String timerScheduleDefault;
+    public static String errorTimerScheduleMissing;
+    public static String WRN_EJB31_NON_PERSISTENT_NO_SUPPORTED;
+      
+	static {
+		NLS.initializeMessages(BUNDLE_NAME, EJBCreationResourceHandler.class);
+	}
+
+	public static final String CLIENT_SAME_NAME_AS_EJB = _1; 
+	public static final String CLIENT_SAME_NAME_AS_EAR = _2; 
+
+	private static ResourceBundle fgResourceBundle;
+
+	/**
+	 * Returns the resource bundle used by all classes in this Project
+	 */
+	public static ResourceBundle getResourceBundle() {
+		try {
+			return ResourceBundle.getBundle("ejbcreation");//$NON-NLS-1$
+		} catch (MissingResourceException e) {
+			// does nothing - this method will return null and
+			// getString(String, String) will return the key
+			// it was called with
+		}
+		return null;
+	}
+
+	public static String getString(String key) {
+		if (fgResourceBundle == null) {
+			fgResourceBundle = getResourceBundle();
+		}
+
+		if (fgResourceBundle != null) {
+			try {
+				return fgResourceBundle.getString(key);
+			} catch (MissingResourceException e) {
+				return "!" + key + "!";//$NON-NLS-2$//$NON-NLS-1$
+			}
+		}
+		return "!" + key + "!";//$NON-NLS-2$//$NON-NLS-1$
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/internal/ejb/project/operations/EjbFacetInstallDataModelProvider.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/internal/ejb/project/operations/EjbFacetInstallDataModelProvider.java
new file mode 100644
index 0000000..bfc54da
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/internal/ejb/project/operations/EjbFacetInstallDataModelProvider.java
@@ -0,0 +1,217 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.internal.ejb.project.operations;
+
+import java.util.Set;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jst.j2ee.componentcore.J2EEModuleVirtualComponent;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.j2ee.internal.common.J2EEVersionUtil;
+import org.eclipse.jst.j2ee.internal.plugin.IJ2EEModuleConstants;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPreferences;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetInstallDataModelProperties;
+import org.eclipse.jst.j2ee.project.facet.J2EEModuleFacetInstallDataModelProvider;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.ModuleCoreNature;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.internal.operations.ProjectCreationDataModelProviderNew;
+import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
+
+public class EjbFacetInstallDataModelProvider
+		extends J2EEModuleFacetInstallDataModelProvider 
+		implements IEjbFacetInstallDataModelProperties{
+
+	@Override
+	public Set getPropertyNames() {
+		Set names = super.getPropertyNames();
+		names.add(CONFIG_FOLDER);
+		names.add(CREATE_CLIENT);
+		names.add(CLIENT_NAME);
+		names.add(CLIENT_SOURCE_FOLDER);
+		names.add(CLIENT_URI);
+		names.add(ALLOW_EJB_CLIENT);
+		return names;
+	}
+	
+	@Override
+	public Object getDefaultProperty(String propertyName) {
+		if(propertyName.equals(FACET_ID)){
+			return EJB;
+		}else if (propertyName.equals(CREATE_CLIENT)) {
+			return getProperty(ADD_TO_EAR);
+		} else if (propertyName.equals(CLIENT_SOURCE_FOLDER)) {
+			return J2EEPlugin.getDefault().getJ2EEPreferences().getString(J2EEPreferences.Keys.EJB_CONTENT_FOLDER);
+		}else if (propertyName.equals(CONFIG_FOLDER)){
+			if (model.isPropertySet(FACET_PROJECT_NAME))
+			{
+				String projectName = model.getStringProperty(FACET_PROJECT_NAME);
+				IProject project = (projectName.length() > 0) ? ResourcesPlugin.getWorkspace().getRoot().getProject(projectName) : null;
+				
+				if (project != null && project.exists()) {
+					if (ModuleCoreNature.isFlexibleProject(project))
+					{
+						IVirtualComponent c = ComponentCore.createComponent(project, true);
+						IVirtualFolder ejbroot = c.getRootFolder();
+						IPath configFolderPath = J2EEModuleVirtualComponent.getDefaultDeploymentDescriptorFolder(ejbroot);
+						if (configFolderPath != null && project.getFolder(configFolderPath).exists())
+						{
+							return configFolderPath.toString();
+						}
+					}
+				}
+			}
+			return J2EEPlugin.getDefault().getJ2EEPreferences().getString(J2EEPreferences.Keys.EJB_CONTENT_FOLDER);
+		}else if (propertyName.equals(CLIENT_NAME)){
+			String clientProjectName = model.getStringProperty(FACET_PROJECT_NAME);
+			clientProjectName = clientProjectName + "Client"; //$NON-NLS-1$
+			
+			//check that the default name does not already exist, if it does try 1-9, if none of thouse work use orginal default
+			IStatus status = ProjectCreationDataModelProviderNew.validateName(clientProjectName);
+			int append = 0;
+			while(!status.isOK() && append <= 9) {
+				append++;
+				status = ProjectCreationDataModelProviderNew.validateName(clientProjectName + append);
+			}
+			if(append > 0 && append <= 9) {
+				clientProjectName = clientProjectName + append;
+			}
+			
+			return clientProjectName; 
+		}else if (propertyName.equals(CLIENT_URI)){
+			String clientProjectURI = model.getStringProperty(CLIENT_NAME).replace(' ', '_');
+			return clientProjectURI + IJ2EEModuleConstants.JAR_EXT; 
+		} else if (propertyName.equals(MODULE_URI)) {
+			String projectName = model.getStringProperty(FACET_PROJECT_NAME).replace(' ', '_');
+			return projectName + IJ2EEModuleConstants.JAR_EXT; 
+		} else if (propertyName.equals(IJ2EEFacetInstallDataModelProperties.GENERATE_DD)) {
+			if (getBooleanProperty(CREATE_CLIENT)) {
+				return Boolean.TRUE;
+			}
+			String facetVersion = getStringProperty(FACET_VERSION_STR);
+			if (J2EEVersionUtil.convertVersionStringToInt(facetVersion) >= J2EEVersionConstants.EJB_3_0_ID) {
+				return J2EEPlugin.getDefault().getJ2EEPreferences().getBoolean(J2EEPreferences.Keys.EJB_GENERATE_DD);
+			}
+			return Boolean.TRUE;
+		}
+		return super.getDefaultProperty(propertyName);
+	}
+	
+	@Override
+	protected int convertFacetVersionToJ2EEVersion(IProjectFacetVersion version) {
+		return J2EEVersionUtil.convertEJBVersionStringToJ2EEVersionID(version.getVersionString());
+	}
+		
+	@Override
+	public boolean isPropertyEnabled(String propertyName) {
+		if (CLIENT_NAME.equals(propertyName)) {
+			return getBooleanProperty(CREATE_CLIENT);
+		} else if (CLIENT_URI.equals(propertyName)) {
+			return getBooleanProperty(CREATE_CLIENT);
+		} else if (CREATE_CLIENT.equals(propertyName)) {
+			return getBooleanProperty(ADD_TO_EAR)|| getBooleanProperty(ALLOW_EJB_CLIENT);
+		} else if (GENERATE_DD.equals(propertyName)) {
+			return !getBooleanProperty(CREATE_CLIENT);
+		}
+		return super.isPropertyEnabled(propertyName);
+	}
+
+	
+	@Override
+	public boolean propertySet(String propertyName, Object propertyValue) {
+		boolean status = super.propertySet(propertyName, propertyValue);
+		
+		if (propertyName.equals(CREATE_CLIENT)) {
+	    	model.notifyPropertyChange(CLIENT_NAME, IDataModel.ENABLE_CHG);
+	    	model.notifyPropertyChange(CLIENT_URI, IDataModel.ENABLE_CHG);
+	    	model.notifyPropertyChange(GENERATE_DD, IDataModel.ENABLE_CHG);
+	    	if ((Boolean) propertyValue && isPropertySet(GENERATE_DD)) {
+    			model.setBooleanProperty(GENERATE_DD, true);
+    		} else {
+    	    	model.notifyPropertyChange(GENERATE_DD, IDataModel.DEFAULT_CHG);
+    		}
+		} else if (propertyName.equals(CLIENT_NAME)) {
+			String clientProjectURI = model.getStringProperty(CLIENT_NAME).replace(' ', '_');
+			model.setStringProperty(CLIENT_URI, clientProjectURI + IJ2EEModuleConstants.JAR_EXT); 
+	    } else if (propertyName.equals(FACET_PROJECT_NAME)) {
+	    	model.setStringProperty(CLIENT_NAME, (String) model.getDefaultProperty(CLIENT_NAME));
+	    	model.setStringProperty(CLIENT_URI, (String) model.getDefaultProperty(CLIENT_URI));
+	    } else if (propertyName.equals(ADD_TO_EAR)) {
+	    	boolean addToEar = (Boolean) propertyValue;
+	    	if (!addToEar && isPropertySet(CREATE_CLIENT)) {
+	    		model.setBooleanProperty(CREATE_CLIENT, false);
+	    	} else {
+	    		model.notifyPropertyChange(CREATE_CLIENT, IDataModel.DEFAULT_CHG);
+		    	model.notifyPropertyChange(CLIENT_NAME, IDataModel.ENABLE_CHG);
+		    	model.notifyPropertyChange(CLIENT_URI, IDataModel.ENABLE_CHG);
+		    	model.notifyPropertyChange(GENERATE_DD, IDataModel.ENABLE_CHG);
+		    	if ((Boolean) getProperty(CREATE_CLIENT) && isPropertySet(GENERATE_DD)) {
+	    			model.setBooleanProperty(GENERATE_DD, true);
+	    		} else {
+	    	    	model.notifyPropertyChange(GENERATE_DD, IDataModel.DEFAULT_CHG);
+	    		}
+	    	}
+	    	model.notifyPropertyChange(CREATE_CLIENT, IDataModel.ENABLE_CHG);
+        } else if (propertyName.equals(CONFIG_FOLDER)) 
+        {
+            if( this.javaFacetInstallConfig != null )
+            {
+                final IPath sourceFolder
+                    = propertyValue == null ? null : new Path( (String) propertyValue );
+                
+                this.javaFacetInstallConfig.setSourceFolder( sourceFolder );
+            }
+        }
+        else if (FACET_PROJECT_NAME.equals(propertyName)) {
+				if (!model.isPropertySet(CONFIG_FOLDER)) {
+					model.notifyPropertyChange(CONFIG_FOLDER, IDataModel.DEFAULT_CHG);
+				}
+		}
+        else if (ALLOW_EJB_CLIENT.equals(propertyName))
+        {
+        	model.notifyPropertyChange(CREATE_CLIENT, IDataModel.DEFAULT_CHG);
+        }
+
+		return status;
+	}	
+	
+	@Override
+	public IStatus validate(String propertyName) {
+		if (propertyName.equals(CLIENT_NAME)) {
+			//should only validate on CLIENT_NAME if going to create a client
+			boolean createCleint = model.getBooleanProperty(CREATE_CLIENT);
+			if(createCleint) {
+				String projectName = model.getStringProperty( CLIENT_NAME );
+				IStatus status = ProjectCreationDataModelProviderNew.validateName( projectName );
+				return status;
+			}
+			return OK_STATUS;
+		}else if( propertyName.equals(CLIENT_URI)){
+			//should only validate on CLIENT_URI if going to create a client
+			boolean createCleint = model.getBooleanProperty(CREATE_CLIENT);
+			if(createCleint) {
+				String clientURI = model.getStringProperty( CLIENT_URI );
+				IStatus status = ProjectCreationDataModelProviderNew.validateName( clientURI );
+				return status;
+			}
+			return OK_STATUS;
+		}
+		return super.validate(propertyName);
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/internal/ejb/project/operations/EjbFacetProjectCreationDataModelProvider.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/internal/ejb/project/operations/EjbFacetProjectCreationDataModelProvider.java
new file mode 100644
index 0000000..8f2dbd6
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/internal/ejb/project/operations/EjbFacetProjectCreationDataModelProvider.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.internal.ejb.project.operations;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import org.eclipse.jst.common.project.facet.IJavaFacetInstallDataModelProperties;
+import org.eclipse.jst.common.project.facet.JavaFacetUtils;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPreferences.Keys;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetConstants;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEModuleFacetInstallDataModelProperties;
+import org.eclipse.jst.j2ee.project.facet.J2EEFacetProjectCreationDataModelProvider;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelEvent;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelListener;
+import org.eclipse.wst.common.project.facet.core.IProjectFacet;
+
+public class EjbFacetProjectCreationDataModelProvider extends
+J2EEFacetProjectCreationDataModelProvider {
+
+	public EjbFacetProjectCreationDataModelProvider() {
+		super();
+	}
+
+	@Override
+	public void init() {
+		super.init();
+
+        Collection<IProjectFacet> requiredFacets = new ArrayList<IProjectFacet>();
+        requiredFacets.add(JavaFacetUtils.JAVA_FACET);
+        requiredFacets.add(IJ2EEFacetConstants.EJB_FACET);
+        setProperty(REQUIRED_FACETS_COLLECTION, requiredFacets);
+		
+		FacetDataModelMap map = (FacetDataModelMap) getProperty(FACET_DM_MAP);
+		IDataModel javaFacet = map.getFacetDataModel(JavaFacetUtils.JAVA_FACET.getId());
+		IDataModel ejbFacet = map.getFacetDataModel(IJ2EEFacetConstants.EJB_FACET.getId());
+		String ejbRoot = ejbFacet.getStringProperty(IJ2EEModuleFacetInstallDataModelProperties.CONFIG_FOLDER);
+		javaFacet.setProperty(IJavaFacetInstallDataModelProperties.SOURCE_FOLDER_NAME, ejbRoot);
+		javaFacet.setProperty(IJavaFacetInstallDataModelProperties.DEFAULT_OUTPUT_FOLDER_NAME, 
+				J2EEPlugin.getDefault().getJ2EEPreferences().getString(Keys.EJB_OUTPUT_FOLDER) );
+		
+		ejbFacet.addListener(new IDataModelListener() {
+			public void propertyChanged(DataModelEvent event) {
+				if (IJ2EEModuleFacetInstallDataModelProperties.EAR_PROJECT_NAME.equals(event.getPropertyName())) {
+					if (isPropertySet(EAR_PROJECT_NAME))
+						setProperty(EAR_PROJECT_NAME, event.getProperty());
+					else
+						model.notifyPropertyChange(EAR_PROJECT_NAME, IDataModel.DEFAULT_CHG);
+				}else if (IJ2EEModuleFacetInstallDataModelProperties.ADD_TO_EAR.equals(event.getPropertyName())) {
+					setProperty(ADD_TO_EAR, event.getProperty());
+				}
+			}
+		});
+	}
+	
+	@Override
+	public boolean propertySet(String propertyName, Object propertyValue) {
+		if( propertyName.equals( MODULE_URI )){
+			FacetDataModelMap map = (FacetDataModelMap) getProperty(FACET_DM_MAP);
+			IDataModel ejbFacet = map.getFacetDataModel( IJ2EEFacetConstants.EJB );	
+			ejbFacet.setProperty( IJ2EEModuleFacetInstallDataModelProperties.MODULE_URI, propertyValue );
+		}
+		return super.propertySet(propertyName, propertyValue);
+	}	
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/internal/ejb/project/operations/IEjbFacetInstallDataModelProperties.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/internal/ejb/project/operations/IEjbFacetInstallDataModelProperties.java
new file mode 100644
index 0000000..2862f55
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/internal/ejb/project/operations/IEjbFacetInstallDataModelProperties.java
@@ -0,0 +1,21 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.internal.ejb.project.operations;
+
+/**
+ * This interface is being made public.  Please use org.eclipse.jst.j2ee.ejb.project.operations.IEjbFacetInstallDataModelProperties 
+ * 
+ * @deprecated
+ * @see org.eclipse.jst.j2ee.ejb.project.operations.IEjbFacetInstallDataModelProperties
+ */
+public interface IEjbFacetInstallDataModelProperties 
+	extends org.eclipse.jst.j2ee.ejb.project.operations.IEjbFacetInstallDataModelProperties {	
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/internal/ejb/refactor/UpdateEJBClientRefOnDeleteOp.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/internal/ejb/refactor/UpdateEJBClientRefOnDeleteOp.java
new file mode 100644
index 0000000..61ed208
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/internal/ejb/refactor/UpdateEJBClientRefOnDeleteOp.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2005 BEA Systems, Inc.
+ * 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:
+ * rfrost@bea.com - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.jst.j2ee.internal.ejb.refactor;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+
+/**
+ * Subclass of <code>UpdateEJBClientRefOp</code> that updates the ejb client ref 
+ * in the ejb-jar.xml file of a dependent EJB module when the name of the ejb 
+ * client project is deleted.
+ */
+public class UpdateEJBClientRefOnDeleteOp extends UpdateEJBClientRefOp {
+
+	public UpdateEJBClientRefOnDeleteOp() {
+		super();
+	}
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.commands.operations.IUndoableOperation#execute(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.core.runtime.IAdaptable)
+	 */
+	@Override
+	public IStatus execute(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+		return updateEJBClientRef(monitor, true);
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/internal/ejb/refactor/UpdateEJBClientRefOnRenameOp.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/internal/ejb/refactor/UpdateEJBClientRefOnRenameOp.java
new file mode 100644
index 0000000..2f3ff58
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/internal/ejb/refactor/UpdateEJBClientRefOnRenameOp.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2005 BEA Systems, Inc.
+ * 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:
+ * rfrost@bea.com - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.jst.j2ee.internal.ejb.refactor;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+
+/**
+ * Subclass of <code>UpdateEJBClientRefOp</code> that updates the ejb client ref 
+ * in the ejb-jar.xml file of a dependent EJB module when the name of the ejb 
+ * client project is renamed.
+ */
+public class UpdateEJBClientRefOnRenameOp extends UpdateEJBClientRefOp {
+
+	public UpdateEJBClientRefOnRenameOp() {
+		super();
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.commands.operations.IUndoableOperation#execute(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.core.runtime.IAdaptable)
+	 */
+	@Override
+	public IStatus execute(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+		return updateEJBClientRef(monitor, false);
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/internal/ejb/refactor/UpdateEJBClientRefOp.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/internal/ejb/refactor/UpdateEJBClientRefOp.java
new file mode 100644
index 0000000..c82cc5f
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/internal/ejb/refactor/UpdateEJBClientRefOp.java
@@ -0,0 +1,146 @@
+/*******************************************************************************
+ * Copyright (c) 2005 BEA Systems, Inc.
+ * 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:
+ * rfrost@bea.com - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.jst.j2ee.internal.ejb.refactor;
+
+import java.util.List;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jst.j2ee.componentcore.EnterpriseArtifactEdit;
+import org.eclipse.jst.j2ee.ejb.componentcore.util.EJBArtifactEdit;
+import org.eclipse.jst.j2ee.ejb.internal.impl.EJBJarImpl;
+import org.eclipse.jst.j2ee.internal.common.CreationConstants;
+import org.eclipse.jst.j2ee.internal.plugin.IJ2EEModuleConstants;
+import org.eclipse.jst.j2ee.refactor.operations.ProjectRefactorMetadata;
+import org.eclipse.jst.j2ee.refactor.operations.ProjectRefactoringProperties;
+import org.eclipse.wst.common.componentcore.internal.ComponentcoreFactory;
+import org.eclipse.wst.common.componentcore.internal.Property;
+import org.eclipse.wst.common.componentcore.internal.StructureEdit;
+import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent;
+import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
+
+/**
+ * Abstract based class of operations that update the ejb client ref in the ejb-jar.xml file 
+ * of a dependent EJB module when the name of the ejb client project is refactored.
+ */
+public abstract class UpdateEJBClientRefOp extends AbstractDataModelOperation 
+	implements ProjectRefactoringProperties {
+
+	public UpdateEJBClientRefOp() {
+		super();
+	}
+
+	protected IStatus updateEJBClientRef(final IProgressMonitor monitor, final boolean remove) throws ExecutionException {
+		
+		final ProjectRefactorMetadata dependentMetadata = (ProjectRefactorMetadata) model.getProperty(DEPENDENT_PROJECT_METADATA);
+		final ProjectRefactorMetadata refactoredMetadata = (ProjectRefactorMetadata) model.getProperty(PROJECT_METADATA);
+		ProjectRefactorMetadata originalMetadata = refactoredMetadata;
+		if (!remove) {
+			originalMetadata = (ProjectRefactorMetadata) model.getProperty(ORIGINAL_PROJECT_METADATA);
+		}
+
+		// the dependent project must be an EJB project and the refactored project must be a utility project
+		if (!(dependentMetadata.isEJB() && refactoredMetadata.isUtility())) {
+			return Status.OK_STATUS;
+		}
+
+		// Update the ejb client jar prop in the ejb-jar.xml
+		final String originalProjectName = originalMetadata.getProjectName();
+		EnterpriseArtifactEdit ejbEdit = null;
+		try{
+			ejbEdit = EJBArtifactEdit.getEJBArtifactEditForWrite(dependentMetadata.getProject());
+			if(ejbEdit != null) {
+				final EJBJarImpl ejbres = (EJBJarImpl) ejbEdit.getDeploymentDescriptorRoot();
+				final String ejbClientJar = ejbres.getEjbClientJar();
+				if (ejbClientJar != null && ejbClientJar.equals(originalProjectName + IJ2EEModuleConstants.JAR_EXT)) {
+					if (remove) {
+						ejbres.setEjbClientJar(null);
+					} else {
+						final String newProjectName = refactoredMetadata.getProjectName();
+						ejbres.setEjbClientJar(newProjectName + IJ2EEModuleConstants.JAR_EXT);
+					}
+					ejbEdit.saveIfNecessary(monitor);
+				}
+			}
+		} finally {
+			if(ejbEdit != null) {
+				ejbEdit.dispose();
+			}
+		}  
+		
+		// update the client jar props in the .component file
+		StructureEdit core = null;
+		try {
+			core = StructureEdit.getStructureEditForWrite(dependentMetadata.getProject());
+			if(core != null){
+				WorkbenchComponent component = core.getComponent();
+				// if the deploy-name had been set to the old project name, update it to 
+				// the new project name
+				// if there is a context-root property that had been set to the old project name, update it to 
+				// the new project name
+				List propList = component.getProperties();
+	            for (int i = 0; i < propList.size(); i++) {
+	            	final Property prop = (Property) propList.get(i);
+	            	if (prop.getName().equals(CreationConstants.EJB_CLIENT_NAME) && prop.getValue().equals(originalMetadata.getProjectName())) {
+	            		propList.remove(i);
+	            		if (!remove) {
+	            			final Property newProp = ComponentcoreFactory.eINSTANCE.createProperty();
+	            			newProp.setName(CreationConstants.EJB_CLIENT_NAME);
+	            			newProp.setValue(refactoredMetadata.getProjectName());
+	            			propList.add(0, newProp);
+	            		} else {
+	            			i--;
+	            		}
+	            	} else if (prop.getName().equals(CreationConstants.CLIENT_JAR_URI) && prop.getValue().equals(originalMetadata.getProjectName() + IJ2EEModuleConstants.JAR_EXT)) {
+	            		propList.remove(i);
+	            		if (!remove) {
+	            			final Property newProp = ComponentcoreFactory.eINSTANCE.createProperty();
+	            			newProp.setName(CreationConstants.CLIENT_JAR_URI);
+	            			newProp.setValue(refactoredMetadata.getProjectName() + IJ2EEModuleConstants.JAR_EXT);
+	            			propList.add(0, newProp);
+	            		} else {
+	            			i--;
+	            		}
+	            	}
+	            }
+			}
+		} finally {
+			if(core != null) {
+				core.saveIfNecessary(null);
+				core.dispose();
+			}
+		}	
+	
+		return Status.OK_STATUS;
+	}
+	
+	/**
+	 * Override to disable redo support
+	 * @see org.eclipse.core.commands.operations.IUndoableOperation#canRedo()
+	 */
+	@Override
+	public boolean canRedo() {
+		return false;
+	}
+
+	/**
+	 * Override to disable undo support.
+	 * @see org.eclipse.core.commands.operations.IUndoableOperation#canUndo()
+	 */
+	@Override
+	public boolean canUndo() {
+		return false;
+	}
+	
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/ActivationConfigItemProvider.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/ActivationConfigItemProvider.java
new file mode 100644
index 0000000..9cf6506
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/ActivationConfigItemProvider.java
@@ -0,0 +1,164 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.internal.ejb.provider;
+
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.util.ResourceLocator;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
+import org.eclipse.emf.edit.provider.IItemLabelProvider;
+import org.eclipse.emf.edit.provider.IItemPropertySource;
+import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
+import org.eclipse.emf.edit.provider.ItemProviderAdapter;
+import org.eclipse.jst.j2ee.common.CommonFactory;
+import org.eclipse.jst.j2ee.ejb.ActivationConfig;
+import org.eclipse.jst.j2ee.ejb.EjbFactory;
+import org.eclipse.jst.j2ee.ejb.EjbPackage;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
+import org.eclipse.jst.j2ee.webservice.wscommon.WscommonFactory;
+
+
+/**
+ * This is the item provider adpater for a {@link org.eclipse.jst.j2ee.internal.internal.ejb.ActivationConfig}object. <!--
+ * begin-user-doc --> <!-- end-user-doc -->
+ * 
+ * @generated
+ */
+public class ActivationConfigItemProvider extends ItemProviderAdapter implements IEditingDomainItemProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
+	/**
+	 * This constructs an instance from a factory and a notifier. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public ActivationConfigItemProvider(AdapterFactory adapterFactory) {
+		super(adapterFactory);
+	}
+
+	/**
+	 * This returns the property descriptors for the adapted class. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public List getPropertyDescriptors(Object object) {
+		if (itemPropertyDescriptors == null) {
+			super.getPropertyDescriptors(object);
+
+		}
+		return itemPropertyDescriptors;
+	}
+
+	/**
+	 * This specifies how to implement {@link #getChildren}and
+	 * {@link org.eclipse.emf.edit.command.AddCommand}and
+	 * {@link org.eclipse.emf.edit.command.RemoveCommand}support in {@link #createCommand}. <!--
+	 * begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public Collection getChildrenReferences(Object object) {
+		if (childrenReferences == null) {
+			super.getChildrenReferences(object);
+			childrenReferences.add(EjbPackage.eINSTANCE.getActivationConfig_ConfigProperties());
+			childrenReferences.add(EjbPackage.eINSTANCE.getActivationConfig_Descriptions());
+		}
+		return childrenReferences;
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	protected EReference getChildReference(Object object, Object child) {
+		// Check the type of the specified child object and return the proper feature to use for
+		// adding (see {@link AddCommand}) it as a child.
+
+		return super.getChildReference(object, child);
+	}
+
+
+	/**
+	 * This returns ActivationConfig.gif. <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public Object getImage(Object object) {
+		return getResourceLocator().getImage("full/obj16/ActivationConfig"); //$NON-NLS-1$
+	}
+
+	/**
+	 * This returns the label text for the adapted class. <!-- begin-user-doc --> <!-- end-user-doc
+	 * -->
+	 *  
+	 */
+	@Override
+	public String getText(Object object) {
+		return EJBProviderLibrariesResourceHandler.getString("_UI_ActivationConfig_type"); //$NON-NLS-1$
+	}
+
+	/**
+	 * This handles notification by calling {@link #fireNotifyChanged fireNotifyChanged}. <!--
+	 * begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public void notifyChanged(Notification notification) {
+		switch (notification.getFeatureID(ActivationConfig.class)) {
+			case EjbPackage.ACTIVATION_CONFIG__CONFIG_PROPERTIES :
+			case EjbPackage.ACTIVATION_CONFIG__DESCRIPTIONS : {
+				fireNotifyChanged(notification);
+				return;
+			}
+		}
+		super.notifyChanged(notification);
+	}
+
+	/**
+	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
+	 * describing all of the children that can be created under this object. <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
+		super.collectNewChildDescriptors(newChildDescriptors, object);
+
+		newChildDescriptors.add(createChildParameter(EjbPackage.eINSTANCE.getActivationConfig_ConfigProperties(), EjbFactory.eINSTANCE.createActivationConfigProperty()));
+
+		newChildDescriptors.add(createChildParameter(EjbPackage.eINSTANCE.getActivationConfig_Descriptions(), CommonFactory.eINSTANCE.createDescription()));
+
+		newChildDescriptors.add(createChildParameter(EjbPackage.eINSTANCE.getActivationConfig_Descriptions(), WscommonFactory.eINSTANCE.createDescriptionType()));
+	}
+
+	/**
+	 * Return the resource locator for this item provider's resources. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public ResourceLocator getResourceLocator() {
+		return J2EEPlugin.getDefault();
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/ActivationConfigPropertyItemProvider.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/ActivationConfigPropertyItemProvider.java
new file mode 100644
index 0000000..4610da6
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/ActivationConfigPropertyItemProvider.java
@@ -0,0 +1,152 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.internal.ejb.provider;
+
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.util.ResourceLocator;
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
+import org.eclipse.emf.edit.provider.IItemLabelProvider;
+import org.eclipse.emf.edit.provider.IItemPropertySource;
+import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
+import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.ItemProviderAdapter;
+import org.eclipse.jst.j2ee.ejb.ActivationConfigProperty;
+import org.eclipse.jst.j2ee.ejb.EjbPackage;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
+
+
+/**
+ * This is the item provider adpater for a {@link org.eclipse.jst.j2ee.internal.internal.ejb.ActivationConfigProperty}
+ * object. <!-- begin-user-doc --> <!-- end-user-doc -->
+ * 
+ * @generated
+ */
+public class ActivationConfigPropertyItemProvider extends ItemProviderAdapter implements IEditingDomainItemProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
+	/**
+	 * This constructs an instance from a factory and a notifier. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public ActivationConfigPropertyItemProvider(AdapterFactory adapterFactory) {
+		super(adapterFactory);
+	}
+
+	/**
+	 * This returns the property descriptors for the adapted class. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 *  
+	 */
+	@Override
+	public List getPropertyDescriptors(Object object) {
+		if (itemPropertyDescriptors == null) {
+			super.getPropertyDescriptors(object);
+
+			//addValuePropertyDescriptor(object);
+			//addNamePropertyDescriptor(object);
+		}
+		return itemPropertyDescriptors;
+	}
+
+	/**
+	 * This adds a property descriptor for the Value feature. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	protected void addValuePropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), getString("_UI_ActivationConfigProperty_value_feature"), //$NON-NLS-1$
+					getString("_UI_PropertyDescriptor_description", "_UI_ActivationConfigProperty_value_feature", "_UI_ActivationConfigProperty_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+					EjbPackage.eINSTANCE.getActivationConfigProperty_Value(), true, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE));
+	}
+
+	/**
+	 * This adds a property descriptor for the Name feature. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	protected void addNamePropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), getString("_UI_ActivationConfigProperty_name_feature"), //$NON-NLS-1$
+					getString("_UI_PropertyDescriptor_description", "_UI_ActivationConfigProperty_name_feature", "_UI_ActivationConfigProperty_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+					EjbPackage.eINSTANCE.getActivationConfigProperty_Name(), true, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE));
+	}
+
+
+	/**
+	 * This returns ActivationConfigProperty.gif. <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public Object getImage(Object object) {
+		return getResourceLocator().getImage("full/obj16/ActivationConfigProperty"); //$NON-NLS-1$
+	}
+
+	/**
+	 * This returns the label text for the adapted class. <!-- begin-user-doc --> <!-- end-user-doc
+	 * -->
+	 *  
+	 */
+	@Override
+	public String getText(Object object) {
+		String label = ((ActivationConfigProperty) object).getName();
+		return label == null || label.length() == 0 ? EJBProviderLibrariesResourceHandler.getString("_UI_ActivationConfigProperty_type") : //$NON-NLS-1$
+					EJBProviderLibrariesResourceHandler.getString("_UI_ActivationConfigProperty_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
+	}
+
+	/**
+	 * This handles notification by calling {@link #fireNotifyChanged fireNotifyChanged}. <!--
+	 * begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public void notifyChanged(Notification notification) {
+		switch (notification.getFeatureID(ActivationConfigProperty.class)) {
+			case EjbPackage.ACTIVATION_CONFIG_PROPERTY__VALUE :
+			case EjbPackage.ACTIVATION_CONFIG_PROPERTY__NAME : {
+				fireNotifyChanged(notification);
+				return;
+			}
+		}
+		super.notifyChanged(notification);
+	}
+
+	/**
+	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
+	 * describing all of the children that can be created under this object. <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
+		super.collectNewChildDescriptors(newChildDescriptors, object);
+	}
+
+	/**
+	 * Return the resource locator for this item provider's resources. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public ResourceLocator getResourceLocator() {
+		return J2EEPlugin.getDefault();
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/AssemblyDescriptorItemProvider.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/AssemblyDescriptorItemProvider.java
new file mode 100644
index 0000000..42a5636
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/AssemblyDescriptorItemProvider.java
@@ -0,0 +1,209 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.internal.ejb.provider;
+
+
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.util.ResourceLocator;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.edit.command.AddCommand;
+import org.eclipse.emf.edit.command.RemoveCommand;
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
+import org.eclipse.jst.j2ee.common.CommonFactory;
+import org.eclipse.jst.j2ee.ejb.AssemblyDescriptor;
+import org.eclipse.jst.j2ee.ejb.EjbFactory;
+import org.eclipse.jst.j2ee.ejb.EjbPackage;
+import org.eclipse.jst.j2ee.ejb.MethodPermission;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
+
+
+/**
+ * This is the item provider adpater for a {@link org.eclipse.jst.j2ee.internal.internal.ejb.AssemblyDescriptor}object.
+ */
+public class AssemblyDescriptorItemProvider extends EjbItemProviderAdapter{
+	/**
+	 * This constructs an instance from a factory and a notifier.
+	 */
+	public AssemblyDescriptorItemProvider(AdapterFactory adapterFactory) {
+		super(adapterFactory);
+	}
+
+	/**
+	 * This creates a new child for {@link org.eclipse.jst.j2ee.internal.internal.ejb.command.CreateChildCommand}.
+	 */
+	@Override
+	public Object createChild(Object object) {
+		// TODO: check that this is what you want.
+		MethodPermission child = EjbFactory.eINSTANCE.createMethodPermission();
+
+		// TODO: initialize child here...
+
+		return child;
+	}
+
+	/**
+	 * This specifies how to implement {@link #getChildren}and {@link AddCommand}and
+	 * {@link RemoveCommand}support in {@link #createCommand}.
+	 */
+	@Override
+	public Collection getChildrenReferences(Object object) {
+		EjbPackage pkg = EjbPackage.eINSTANCE;
+		Collection result = new ArrayList();
+		result.add(pkg.getAssemblyDescriptor_SecurityRoles());
+		result.add(pkg.getAssemblyDescriptor_MethodPermissions());
+		result.add(pkg.getAssemblyDescriptor_MethodTransactions());
+		result.add(pkg.getAssemblyDescriptor_ExcludeList());
+		return result;
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	protected EReference getChildReference(Object object, Object child) {
+		// Check the type of the specified child object and return the proper feature to use for
+		// adding (see {@link AddCommand}) it as a child.
+
+		return super.getChildReference(object, child);
+	}
+
+
+	/**
+	 * This returns the image for {@link org.eclipse.jst.j2ee.internal.internal.ejb.command.CreateChildCommand}.
+	 */
+	@Override
+	public Object getCreateChildImage(Object object) {
+		EObject refObject = (EObject) object;
+		return J2EEPlugin.getPlugin().getImage(refObject.eClass().getName() + "CreateMethodPermission");//$NON-NLS-1$
+	}
+
+	/**
+	 * This returns the label for {@link org.eclipse.jst.j2ee.internal.internal.ejb.command.CreateChildCommand}.
+	 */
+	@Override
+	public String getCreateChildText(Object object) {
+		return EJBProviderLibrariesResourceHandler.getString("Create_MethodPermission_UI_"); //$NON-NLS-1$ = "Create MethodPermission"
+	}
+
+	/**
+	 * This returns the help text for {@link org.eclipse.jst.j2ee.internal.internal.ejb.command.CreateChildCommand}.
+	 */
+	@Override
+	public String getCreateChildToolTipText(Object object) {
+		EObject refObject = (EObject) object;
+		return EJBProviderLibrariesResourceHandler.getString("Create_a_child_of_type_Met_UI_") + refObject.eClass().getName() + ".";//$NON-NLS-2$ //$NON-NLS-1$ = "Create a child of type MethodPermission for the selected "
+	}
+
+	/**
+	 * This returns AssemblyDescriptor.gif.
+	 */
+	@Override
+	public Object getImage(Object object) {
+		return J2EEPlugin.getPlugin().getImage("assemblyDescriptor_obj");//$NON-NLS-1$
+	}
+
+	/**
+	 * This returns the parent of the AssemblyDescriptor.
+	 */
+	@Override
+	public Object getParent(Object object) {
+		return ((EObject) object).eContainer();
+	}
+
+	/**
+	 * This returns the property descriptors for the adapted class.
+	 */
+	@Override
+	public List getPropertyDescriptors(Object object) {
+		if (itemPropertyDescriptors == null) {
+			super.getPropertyDescriptors(object);
+
+			EjbPackage pkg = EjbPackage.eINSTANCE;
+
+			// This is for the ejbJar feature.
+			//
+			itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), EJBProviderLibrariesResourceHandler.getString("EjbJar_UI_"), //$NON-NLS-1$ = "EjbJar"
+						EJBProviderLibrariesResourceHandler.getString("The_ejbJar_property_UI_"), //$NON-NLS-1$ = "The ejbJar property"
+						pkg.getAssemblyDescriptor_EjbJar()));
+
+		}
+		return itemPropertyDescriptors;
+	}
+
+	@Override
+	public String getText(Object object) {
+		return EJBProviderLibrariesResourceHandler.getString("AssemblyDescriptor_UI_"); //$NON-NLS-1$ = "AssemblyDescriptor"
+	}
+
+	/**
+	 * This handles notification by calling {@link #fireNotifyChanged fireNotifyChanged}. <!--
+	 * begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public void notifyChanged(Notification notification) {
+		switch (notification.getFeatureID(AssemblyDescriptor.class)) {
+			case EjbPackage.ASSEMBLY_DESCRIPTOR__METHOD_PERMISSIONS :
+			case EjbPackage.ASSEMBLY_DESCRIPTOR__METHOD_TRANSACTIONS :
+			case EjbPackage.ASSEMBLY_DESCRIPTOR__SECURITY_ROLES :
+			case EjbPackage.ASSEMBLY_DESCRIPTOR__EXCLUDE_LIST :
+			case EjbPackage.ASSEMBLY_DESCRIPTOR__MESSAGE_DESTINATIONS : {
+				fireNotifyChanged(notification);
+				return;
+			}
+		}
+		super.notifyChanged(notification);
+	}
+
+	/**
+	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
+	 * describing all of the children that can be created under this object. <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
+		super.collectNewChildDescriptors(newChildDescriptors, object);
+
+		newChildDescriptors.add(createChildParameter(EjbPackage.eINSTANCE.getAssemblyDescriptor_MethodPermissions(), EjbFactory.eINSTANCE.createMethodPermission()));
+
+		newChildDescriptors.add(createChildParameter(EjbPackage.eINSTANCE.getAssemblyDescriptor_MethodTransactions(), EjbFactory.eINSTANCE.createMethodTransaction()));
+
+		newChildDescriptors.add(createChildParameter(EjbPackage.eINSTANCE.getAssemblyDescriptor_SecurityRoles(), CommonFactory.eINSTANCE.createSecurityRole()));
+
+		newChildDescriptors.add(createChildParameter(EjbPackage.eINSTANCE.getAssemblyDescriptor_ExcludeList(), EjbFactory.eINSTANCE.createExcludeList()));
+
+		newChildDescriptors.add(createChildParameter(EjbPackage.eINSTANCE.getAssemblyDescriptor_MessageDestinations(), CommonFactory.eINSTANCE.createMessageDestination()));
+	}
+
+	/**
+	 * Return the resource locator for this item provider's resources. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public ResourceLocator getResourceLocator() {
+		return J2EEPlugin.getDefault();
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/CMPAttributeItemProvider.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/CMPAttributeItemProvider.java
new file mode 100644
index 0000000..8b42895
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/CMPAttributeItemProvider.java
@@ -0,0 +1,350 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2006 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.internal.ejb.provider;
+
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.emf.common.command.Command;
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.Notifier;
+import org.eclipse.emf.common.util.ResourceLocator;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.EcorePackage;
+import org.eclipse.emf.edit.command.SetCommand;
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
+import org.eclipse.jem.java.JavaHelpers;
+import org.eclipse.jem.java.JavaRefFactory;
+import org.eclipse.jst.j2ee.common.CommonFactory;
+import org.eclipse.jst.j2ee.ejb.CMPAttribute;
+import org.eclipse.jst.j2ee.ejb.ContainerManagedEntity;
+import org.eclipse.jst.j2ee.ejb.EjbFactory;
+import org.eclipse.jst.j2ee.ejb.EjbPackage;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
+import org.eclipse.jst.j2ee.webservice.wscommon.WscommonFactory;
+
+
+/**
+ * This is the item provider adpater for a {@link org.eclipse.jst.j2ee.internal.internal.ejb.CMPAttribute}object.
+ */
+public class CMPAttributeItemProvider extends EjbItemProviderAdapter{
+
+	protected static final String[] choiceOfTypes = {"boolean", "byte", "byte[]", "char", "double", "float", "int", "long", "short", "java.lang.Boolean", "java.lang.Byte", "java.lang.Character", "java.lang.Double", "java.lang.Float", "java.lang.Integer", "java.lang.Long", "java.lang.Short", "java.lang.String", "java.math.BigDecimal", "java.sql.Date", "java.sql.Time", "java.sql.Timestamp", "java.util.Calendar", "java.util.Date"}; //$NON-NLS-24$//$NON-NLS-23$//$NON-NLS-22$//$NON-NLS-21$//$NON-NLS-20$//$NON-NLS-19$//$NON-NLS-18$//$NON-NLS-17$//$NON-NLS-16$//$NON-NLS-15$//$NON-NLS-14$//$NON-NLS-13$//$NON-NLS-12$//$NON-NLS-11$//$NON-NLS-10$//$NON-NLS-9$//$NON-NLS-8$//$NON-NLS-7$//$NON-NLS-6$//$NON-NLS-5$//$NON-NLS-4$//$NON-NLS-3$//$NON-NLS-2$//$NON-NLS-1$
+
+	/**
+	 * This constructs an instance from a factory and a notifier.
+	 */
+	public CMPAttributeItemProvider(AdapterFactory adapterFactory) {
+		super(adapterFactory);
+	}
+
+	/**
+	 * This creates a new child for {@link org.eclipse.jst.j2ee.internal.internal.ejb.command.CreateChildCommand}.
+	 */
+	@Override
+	public Object createChild(Object object) {
+		// TODO: check that this is what you want.
+		ContainerManagedEntity child = EjbFactory.eINSTANCE.createContainerManagedEntity();
+
+		// TODO: initialize child here...
+
+		return child;
+	}
+
+	/**
+	 * This creates a primitive {@link com.ibm.etools.emf.edit.command.SetCommand}.
+	 */
+	@Override
+	protected Command createSetCommand(EditingDomain domain, EObject owner, EStructuralFeature feature, Object value) {
+
+		if (feature == EcorePackage.eINSTANCE.getENamedElement_Name()) {
+			return new SetCommand(domain, owner, feature, value) {
+				protected Command setTypeCommand;
+
+				@Override
+				public void doExecute() {
+					CMPAttribute cmpAttribute = (CMPAttribute) this.owner;
+					JavaHelpers type = cmpAttribute.getType();
+					super.doExecute();
+					if (cmpAttribute.getType() != type) {
+						setTypeCommand = SetCommand.create(this.domain, this.owner, EcorePackage.eINSTANCE.getETypedElement_EType(), type);
+						if (setTypeCommand.canExecute()) {
+							setTypeCommand.execute();
+						} else {
+							setTypeCommand.dispose();
+							setTypeCommand = null;
+						}
+					}
+				}
+
+				@Override
+				public void doUndo() {
+					if (setTypeCommand != null) {
+						setTypeCommand.undo();
+					}
+					super.doUndo();
+				}
+
+				@Override
+				public void doRedo() {
+					super.doRedo();
+					if (setTypeCommand != null) {
+						setTypeCommand.redo();
+					}
+				}
+
+				@Override
+				public void doDispose() {
+					super.doDispose();
+					if (setTypeCommand != null) {
+						setTypeCommand.dispose();
+					}
+				}
+			};
+		}
+		return super.createSetCommand(domain, owner, feature, value);
+	}
+
+	/**
+	 * This returns the image for {@link org.eclipse.jst.j2ee.internal.internal.ejb.command.CreateChildCommand}.
+	 */
+	@Override
+	public Object getCreateChildImage(Object object) {
+		EObject refObject = (EObject) object;
+		return J2EEPlugin.getPlugin().getImage(refObject.eClass().getName() + "CreateContainerManagedEntity"); //$NON-NLS-1$
+	}
+
+	/**
+	 * This returns the label for {@link org.eclipse.jst.j2ee.internal.internal.ejb.command.CreateChildCommand}.
+	 */
+	@Override
+	public String getCreateChildText(Object object) {
+		return EJBProviderLibrariesResourceHandler.getString("Create_ContainerManagedEnt_UI_"); //$NON-NLS-1$ = "Create ContainerManagedEntity"
+	}
+
+	/**
+	 * This returns the help text for {@link org.eclipse.jst.j2ee.internal.internal.ejb.command.CreateChildCommand}.
+	 */
+	@Override
+	public String getCreateChildToolTipText(Object object) {
+		EObject refObject = (EObject) object;
+		return EJBProviderLibrariesResourceHandler.getString("Create_a_child_of_type_Con_UI_") + refObject.eClass().getName() + "."; //$NON-NLS-2$ //$NON-NLS-1$ = "Create a child of type ContainerManagedEntity for the selected "
+	}
+
+	/**
+	 * This returns CMPAttribute.gif.
+	 */
+	@Override
+	public Object getImage(Object object) {
+		return J2EEPlugin.getPlugin().getImage((((CMPAttribute) object).isKey()) ? "attributeKey_obj" : "attribute_obj"); //$NON-NLS-2$//$NON-NLS-1$
+	}
+
+	/**
+	 * This returns the parent of the CMPAttribute.
+	 */
+	@Override
+	public Object getParent(Object object) {
+		return ((EObject) object).eContainer();
+	}
+
+	/**
+	 * This returns the property descriptors for the adapted class.
+	 */
+	@Override
+	public List getPropertyDescriptors(Object object) {
+		if (itemPropertyDescriptors == null) {
+			super.getPropertyDescriptors(object);
+
+			//			EjbPackage pkg = EjbPackage.eINSTANCE;
+			EcorePackage ePackageEcore = (EcorePackage) EPackage.Registry.INSTANCE.getEPackage(EcorePackage.eNS_URI);
+
+			/*
+			 * // This is for the value feature. // itemPropertyDescriptors.add (new
+			 * ItemPropertyDescriptor
+			 * (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(), "Value", "The
+			 * value property", pkg.getCMPAttribute_Value())); // This is for the isTransient
+			 * feature. // itemPropertyDescriptors.add (new ItemPropertyDescriptor
+			 * (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(), "IsTransient",
+			 * "The isTransient property", pkg.getCMPAttribute_IsTransient())); // This is for the
+			 * isVolatile feature. // itemPropertyDescriptors.add (new ItemPropertyDescriptor
+			 * (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(), "IsVolatile",
+			 * "The isVolatile property", pkg.getCMPAttribute_IsVolatile())); // This is for the
+			 * isChangeable feature. // itemPropertyDescriptors.add (new ItemPropertyDescriptor
+			 * (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(), "IsChangeable",
+			 * "The isChangeable property", pkg.getCMPAttribute_IsChangeable()));
+			 */
+
+			// This is for the name feature.
+			//
+			itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), EJBProviderLibrariesResourceHandler.getString("Name_UI_"), //$NON-NLS-1$ = "Name"
+						EJBProviderLibrariesResourceHandler.getString("The_name_property_UI_"), //$NON-NLS-1$ = "The name property"
+						ePackageEcore.getENamedElement_Name(), false, ItemPropertyDescriptor.TEXT_VALUE_IMAGE));
+
+			// This is for the eTypeClassifier feature.
+			//
+			itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), EJBProviderLibrariesResourceHandler.getString("Type_UI_"), //$NON-NLS-1$ = "ETypeClassifier"
+						EJBProviderLibrariesResourceHandler.getString("The_type_property_UI_"), //$NON-NLS-1$ = "The eTypeClassifier property"
+						ePackageEcore.getETypedElement_EType(), false) {
+				@Override
+				public Object getPropertyValue(Object o) {
+					CMPAttribute thisCMPAttribute = (CMPAttribute) o;
+					return createPropertyValueWrapper(o, thisCMPAttribute.getType().getQualifiedName());
+				}
+
+				@Override
+				public Collection getChoiceOfValues(Object o) {
+					CMPAttribute thisCMPAttribute = (CMPAttribute) o;
+					Collection result = new ArrayList();
+					for (int i = 0; i < choiceOfTypes.length; ++i) {
+						result.add(JavaRefFactory.eINSTANCE.reflectType(choiceOfTypes[i], thisCMPAttribute));
+					}
+					return result;
+				}
+			});
+
+		}
+		return itemPropertyDescriptors;
+	}
+
+	/**
+	 * This adds a property descriptor for the Description feature. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	protected void addDescriptionPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), getString("_UI_CMPAttribute_description_feature"), //$NON-NLS-1$
+					getString("_UI_PropertyDescriptor_description", "_UI_CMPAttribute_description_feature", "_UI_CMPAttribute_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+					EjbPackage.eINSTANCE.getCMPAttribute_Description(), true, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE));
+	}
+
+	/**
+	 * This specifies how to implement {@link #getChildren}and
+	 * {@link org.eclipse.emf.edit.command.AddCommand}and
+	 * {@link org.eclipse.emf.edit.command.RemoveCommand}support in {@link #createCommand}. <!--
+	 * begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public Collection getChildrenReferences(Object object) {
+		if (childrenReferences == null) {
+			super.getChildrenReferences(object);
+			childrenReferences.add(EjbPackage.eINSTANCE.getCMPAttribute_Descriptions());
+		}
+		return childrenReferences;
+	}
+
+	@Override
+	public String getText(Object object) {
+
+		CMPAttribute cmpAttribute = (CMPAttribute) object;
+		JavaHelpers type = cmpAttribute.getType();
+		String typeName = (type != null) ? (" : " + type.getQualifiedName()) : ""; //$NON-NLS-2$//$NON-NLS-1$
+		return cmpAttribute.getName() + typeName;
+	}
+
+	/**
+	 * This handles notification by calling {@link #fireNotifyChanged fireNotifyChanged}. <!--
+	 * begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public void notifyChanged(Notification notification) {
+		switch (notification.getFeatureID(CMPAttribute.class)) {
+			case EjbPackage.CMP_ATTRIBUTE__DESCRIPTION :
+			case EjbPackage.CMP_ATTRIBUTE__DESCRIPTIONS :
+			case EjbPackage.CMP_ATTRIBUTE__NAME : {
+				fireNotifyChanged(notification);
+				return;
+			}
+		}
+		super.notifyChanged(notification);
+	}
+
+	/**
+	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
+	 * describing all of the children that can be created under this object. <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
+		super.collectNewChildDescriptors(newChildDescriptors, object);
+
+		newChildDescriptors.add(createChildParameter(EjbPackage.eINSTANCE.getCMPAttribute_Descriptions(), CommonFactory.eINSTANCE.createDescription()));
+
+		newChildDescriptors.add(createChildParameter(EjbPackage.eINSTANCE.getCMPAttribute_Descriptions(), WscommonFactory.eINSTANCE.createDescriptionType()));
+	}
+
+	/**
+	 * Return the resource locator for this item provider's resources. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public ResourceLocator getResourceLocator() {
+		return J2EEPlugin.getDefault();
+	}
+
+	@Override
+	public void setTarget(Notifier target) {
+		if (targets == null || !targets.contains(target))
+			super.setTarget(target);
+		if (target != null && target instanceof CMPAttribute) {
+			if (targets != null && targets.contains(target) || ((CMPAttribute) target).eContainer() == null)
+				return;
+			Notifier container = ((CMPAttribute) target).eContainer();
+			if (container != null && !container.eAdapters().contains(this)) {
+				container.eAdapters().add(this);
+				super.setTarget(container);
+			}
+		}
+	}
+
+
+	/**
+	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getElements(Object)
+	 */
+	@Override
+	public Collection getElements(Object object) {
+		return super.getElements(object);
+	}
+
+	/**
+	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildren(Object)
+	 */
+	@Override
+	public Collection getChildren(Object object) {
+		try {
+			return super.getChildren(object);
+		} catch (Exception e) {
+			//Ignore
+		}
+		return Collections.EMPTY_LIST;
+	}
+
+	@Override
+	public void dispose() {
+		super.dispose();
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/CMRFieldItemProvider.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/CMRFieldItemProvider.java
new file mode 100644
index 0000000..6d32f66
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/CMRFieldItemProvider.java
@@ -0,0 +1,135 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.internal.ejb.provider;
+
+
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.util.ResourceLocator;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
+import org.eclipse.jst.j2ee.ejb.CMRField;
+import org.eclipse.jst.j2ee.ejb.EjbPackage;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
+
+
+
+/**
+ * This is the item provider adpater for a {@link org.eclipse.jst.j2ee.internal.internal.ejb.CMRField}object.
+ */
+public class CMRFieldItemProvider extends CMPAttributeItemProvider{
+	/**
+	 * This constructs an instance from a factory and a notifier.
+	 */
+	public CMRFieldItemProvider(AdapterFactory adapterFactory) {
+		super(adapterFactory);
+	}
+
+	/**
+	 * This returns CMRField.gif.
+	 */
+	@Override
+	public Object getImage(Object object) {
+		return J2EEPlugin.getPlugin().getImage("CMRField"); //$NON-NLS-1$
+	}
+
+	/**
+	 * This returns the parent of the CMRField.
+	 */
+	@Override
+	public Object getParent(Object object) {
+		return ((EObject) object).eContainer();
+	}
+
+	/**
+	 * This returns the property descriptors for the adapted class.
+	 */
+	@Override
+	public List getPropertyDescriptors(Object object) {
+		if (itemPropertyDescriptors == null) {
+			super.getPropertyDescriptors(object);
+
+			EjbPackage pkg = EjbPackage.eINSTANCE;
+
+			// This is for the role feature.
+			//
+			itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), EJBProviderLibrariesResourceHandler.getString("Role_2"), //$NON-NLS-1$
+						EJBProviderLibrariesResourceHandler.getString("The_role_of_the_cmr_field_3"), //$NON-NLS-1$
+						pkg.getCMRField_Role(), false));
+
+			// This is for the collectionType feature.
+			//
+			itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), EJBProviderLibrariesResourceHandler.getString("Collection_Type_4"), //$NON-NLS-1$
+						EJBProviderLibrariesResourceHandler.getString("The_collection_type_of_the_cmr_field_5"), //$NON-NLS-1$
+						pkg.getCMRField_CollectionType(), false));
+
+		}
+		return itemPropertyDescriptors;
+	}
+
+	/**
+	 * This adds a property descriptor for the Collection Type feature. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	protected void addCollectionTypePropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), getString("_UI_CMRField_collectionType_feature"), //$NON-NLS-1$
+					getString("_UI_PropertyDescriptor_description", "_UI_CMRField_collectionType_feature", "_UI_CMRField_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+					EjbPackage.eINSTANCE.getCMRField_CollectionType(), true));
+	}
+
+
+	@Override
+	public String getText(Object object) {
+		CMRField cmrField = ((CMRField) object);
+		return EJBProviderLibrariesResourceHandler.getString("CMRField__6") + cmrField.getName(); //$NON-NLS-1$
+	}
+
+	/**
+	 * This handles notification by calling {@link #fireNotifyChanged fireNotifyChanged}. <!--
+	 * begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public void notifyChanged(Notification notification) {
+		super.notifyChanged(notification);
+	}
+
+	/**
+	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
+	 * describing all of the children that can be created under this object. <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
+		super.collectNewChildDescriptors(newChildDescriptors, object);
+	}
+
+	/**
+	 * Return the resource locator for this item provider's resources. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public ResourceLocator getResourceLocator() {
+		return J2EEPlugin.getDefault();
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/ContainerManagedEntityItemProvider.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/ContainerManagedEntityItemProvider.java
new file mode 100644
index 0000000..708b5d7
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/ContainerManagedEntityItemProvider.java
@@ -0,0 +1,263 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.internal.ejb.provider;
+
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.util.ResourceLocator;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
+import org.eclipse.jst.j2ee.common.CommonPackage;
+import org.eclipse.jst.j2ee.ejb.ContainerManagedEntity;
+import org.eclipse.jst.j2ee.ejb.EjbFactory;
+import org.eclipse.jst.j2ee.ejb.EjbPackage;
+import org.eclipse.jst.j2ee.ejb.internal.impl.ModelledPersistentAttributeFilter;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
+
+/**
+ * This is the item provider adpater for a {@link org.eclipse.jst.j2ee.internal.internal.ejb.ContainerManagedEntity}object.
+ * <!-- begin-user-doc --> <!-- end-user-doc -->
+ * 
+ * @generated
+ */
+public class ContainerManagedEntityItemProvider extends EntityItemProvider {
+	/**
+	 * This constructs an instance from a factory and a notifier. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public ContainerManagedEntityItemProvider(AdapterFactory adapterFactory) {
+		super(adapterFactory);
+	}
+
+	/**
+	 * This returns the property descriptors for the adapted class. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 *  
+	 */
+	@Override
+	public List getPropertyDescriptors(Object object) {
+		if (itemPropertyDescriptors == null) {
+			super.getPropertyDescriptors(object);
+
+			addVersionPropertyDescriptor(object);
+			addAbstractSchemaNamePropertyDescriptor(object);
+			addKeyAttributesPropertyDescriptor(object);
+			//addCMPAttributePropertyDescriptor(object);
+			addPrimKeyFieldPropertyDescriptor(object);
+		}
+		return itemPropertyDescriptors;
+	}
+
+	/**
+	 * This adds a property descriptor for the Version feature. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 */
+	protected void addVersionPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), EJBProviderLibrariesResourceHandler.getString("_UI_EJBJar_version_feature"), //$NON-NLS-1$
+					EJBProviderLibrariesResourceHandler.getString("_UI_EJBJar_version_feature_desc"), //$NON-NLS-1$
+					EjbPackage.eINSTANCE.getContainerManagedEntity_Version(), false, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE));
+	}
+
+	/**
+	 * This adds a property descriptor for the Abstract Schema Name feature. <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 */
+	protected void addAbstractSchemaNamePropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), EJBProviderLibrariesResourceHandler.getString("_UI_ContainerManagedEntity_abstractSchemaName_feature"), //$NON-NLS-1$
+					EJBProviderLibrariesResourceHandler.getString("_UI_ContainerManagedEntity_abstractSchemaName_feature_desc"), //$NON-NLS-1$
+					EjbPackage.eINSTANCE.getContainerManagedEntity_AbstractSchemaName(), true, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE));
+	}
+
+	/**
+	 * This adds a property descriptor for the Key Attributes feature. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 */
+	protected void addKeyAttributesPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), EJBProviderLibrariesResourceHandler.getString("_UI_ContainerManagedEntity_keyAttributes_feature"), //$NON-NLS-1$
+					EJBProviderLibrariesResourceHandler.getString("_UI_ContainerManagedEntity_keyAttributes_feature_desc"), //$NON-NLS-1$
+					EjbPackage.eINSTANCE.getContainerManagedEntity_KeyAttributes(), false));
+	}
+
+	/**
+	 * This adds a property descriptor for the CMP Attribute feature. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 */
+	protected void addCMPAttributePropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), EJBProviderLibrariesResourceHandler.getString("_UI_ContainerManagedEntity_CMPAttribute_feature"), //$NON-NLS-1$
+					EJBProviderLibrariesResourceHandler.getString("_UI_ContainerManagedEntity_CMPAttribute_feature_desc"), //$NON-NLS-1$
+					EjbPackage.eINSTANCE.getContainerManagedEntity_CMPAttribute(), true));
+	}
+
+	/**
+	 * This adds a property descriptor for the Prim Key Field feature. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 */
+	protected void addPrimKeyFieldPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), EJBProviderLibrariesResourceHandler.getString("_UI_ContainerManagedEntity_primKeyField_feature"), //$NON-NLS-1$
+					EJBProviderLibrariesResourceHandler.getString("_UI_ContainerManagedEntity_primKeyField_feature_desc"), //$NON-NLS-1$
+					EjbPackage.eINSTANCE.getContainerManagedEntity_PrimKeyField(), false));
+	}
+
+	/**
+	 * This specifies how to implement {@link #getChildren}and
+	 * {@link org.eclipse.emf.edit.command.AddCommand}and
+	 * {@link org.eclipse.emf.edit.command.RemoveCommand}support in {@link #createCommand}. <!--
+	 * begin-user-doc --> <!-- end-user-doc -->
+	 *  
+	 */
+	@Override
+	public Collection getChildrenReferences(Object object) {
+		if (childrenReferences == null) {
+			super.getChildrenReferences(object);
+			//childrenReferences.add(EjbPackage.eINSTANCE.getContainerManagedEntity_PersistentAttributes());
+			childrenReferences.add(EjbPackage.eINSTANCE.getContainerManagedEntity_Queries());
+		}
+		return childrenReferences;
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	protected EReference getChildReference(Object object, Object child) {
+		// Check the type of the specified child object and return the proper feature to use for
+		// adding (see {@link AddCommand}) it as a child.
+
+		return super.getChildReference(object, child);
+	}
+
+
+	/**
+	 * This returns the label text for the adapted class. <!-- begin-user-doc --> Don't remove this
+	 * method or it will be regenerated. <!-- end-user-doc -->
+	 *  
+	 */
+	@Override
+	public String getText(Object object) {
+		return super.getText(object);
+	}
+
+	/**
+	 * This handles notification by calling {@link #fireNotifyChanged fireNotifyChanged}. <!--
+	 * begin-user-doc --> <!-- end-user-doc -->
+	 *  
+	 */
+	@Override
+	public void notifyChanged(Notification notification) {
+		switch (notification.getFeatureID(ContainerManagedEntity.class)) {
+			case EjbPackage.CONTAINER_MANAGED_ENTITY__VERSION :
+			case EjbPackage.CONTAINER_MANAGED_ENTITY__ABSTRACT_SCHEMA_NAME :
+			case EjbPackage.CONTAINER_MANAGED_ENTITY__PERSISTENT_ATTRIBUTES :
+			case EjbPackage.CONTAINER_MANAGED_ENTITY__QUERIES :
+			case EjbPackage.CONTAINER_MANAGED_ENTITY__CMP_ATTRIBUTE :
+			case EjbPackage.CONTAINER_MANAGED_ENTITY__KEY_ATTRIBUTES :
+			case EjbPackage.CONTAINER_MANAGED_ENTITY__PRIM_KEY_FIELD :
+			case EjbPackage.CONTAINER_MANAGED_ENTITY__PRIMARY_KEY : {
+				fireNotifyChanged(notification);
+				return;
+			}
+		}
+		super.notifyChanged(notification);
+	}
+
+	/**
+	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
+	 * describing all of the children that can be created under this object. <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
+		super.collectNewChildDescriptors(newChildDescriptors, object);
+
+		newChildDescriptors.add(createChildParameter(EjbPackage.eINSTANCE.getContainerManagedEntity_PersistentAttributes(), EjbFactory.eINSTANCE.createCMPAttribute()));
+
+		newChildDescriptors.add(createChildParameter(EjbPackage.eINSTANCE.getContainerManagedEntity_PersistentAttributes(), EjbFactory.eINSTANCE.createCMRField()));
+
+		newChildDescriptors.add(createChildParameter(EjbPackage.eINSTANCE.getContainerManagedEntity_Queries(), EjbFactory.eINSTANCE.createQuery()));
+	}
+
+	/**
+	 * This returns the label text for {@link org.eclipse.emf.edit.command.CreateChildCommand}.
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public String getCreateChildText(Object owner, Object feature, Object child, Collection selection) {
+		boolean qualify = feature == CommonPackage.eINSTANCE.getJNDIEnvRefsGroup_EjbRefs() || feature == CommonPackage.eINSTANCE.getJNDIEnvRefsGroup_EjbLocalRefs();
+		return getString(qualify ? "_UI_CreateChild_text2" : "_UI_CreateChild_text", //$NON-NLS-1$ //$NON-NLS-2$
+					new Object[]{getTypeText(child), getFeatureText(feature), getTypeText(owner)});
+	}
+
+	/**
+	 * Return the resource locator for this item provider's resources. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public ResourceLocator getResourceLocator() {
+		return J2EEPlugin.getDefault();
+	}
+
+	/**
+	 * This returns ContainerManagedEntity.gif.
+	 */
+	@Override
+	public Object getImage(Object object) {
+		//Cmp 20 should have their own Itemprovider
+		ContainerManagedEntity cmp = null;
+		if (object instanceof ContainerManagedEntity) {
+			cmp = (ContainerManagedEntity) object;
+			switch (cmp.getVersionID()) {
+	
+				case J2EEVersionConstants.EJB_1_0_ID :
+				case J2EEVersionConstants.EJB_1_1_ID :
+					return J2EEPlugin.getPlugin().getImage("11_cmpbean_obj"); //$NON-NLS-1$
+				case J2EEVersionConstants.EJB_2_0_ID :
+					return J2EEPlugin.getPlugin().getImage("20_cmpbean_obj"); //$NON-NLS-1$
+				case J2EEVersionConstants.EJB_2_1_ID :
+				default :
+					return J2EEPlugin.getPlugin().getImage("21_cmpbean_obj"); //$NON-NLS-1$
+			}
+		}
+		return J2EEPlugin.getPlugin().getImage("21_cmpbean_obj"); //$NON-NLS-1$
+	}
+
+	@Override
+	public boolean hasChildren(Object arg0) {
+		return true;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildren(java.lang.Object)
+	 */
+	@Override
+	public Collection getChildren(Object object) {
+		Collection result = super.getChildren(object);
+		result.addAll(ModelledPersistentAttributeFilter.singleton().filter((ContainerManagedEntity) object));
+		return result;
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/EJBJarItemProvider.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/EJBJarItemProvider.java
new file mode 100644
index 0000000..3575020
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/EJBJarItemProvider.java
@@ -0,0 +1,254 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2006 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.internal.ejb.provider;
+
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.util.ResourceLocator;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
+import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
+import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
+import org.eclipse.jst.j2ee.common.internal.provider.CompatibilityDescriptionGroupItemProvider;
+import org.eclipse.jst.j2ee.ejb.EJBJar;
+import org.eclipse.jst.j2ee.ejb.EjbFactory;
+import org.eclipse.jst.j2ee.ejb.EjbPackage;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
+
+/**
+ * This is the item provider adpater for a {@link org.eclipse.jst.j2ee.internal.internal.ejb.EJBJar}object. <!--
+ * begin-user-doc --> <!-- end-user-doc -->
+ * 
+ * @generated
+ */
+public class EJBJarItemProvider extends CompatibilityDescriptionGroupItemProvider {
+	/**
+	 * This constructs an instance from a factory and a notifier. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public EJBJarItemProvider(AdapterFactory adapterFactory) {
+		super(adapterFactory);
+	}
+
+	/**
+	 * This returns the property descriptors for the adapted class. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public List getPropertyDescriptors(Object object) {
+		if (itemPropertyDescriptors == null) {
+			super.getPropertyDescriptors(object);
+
+			addEjbClientJarPropertyDescriptor(object);
+			addVersionPropertyDescriptor(object);
+		}
+		return itemPropertyDescriptors;
+	}
+
+	/**
+	 * This adds a property descriptor for the Ejb Client Jar feature. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 */
+	protected void addEjbClientJarPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), EJBProviderLibrariesResourceHandler.getString("_UI_EJBJar_ejbClientJar_feature"), //$NON-NLS-1$
+					EJBProviderLibrariesResourceHandler.getString("_UI_EJBJar_ejbClientJar_feature_desc"), //$NON-NLS-1$
+					EjbPackage.eINSTANCE.getEJBJar_EjbClientJar(), false, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE));
+	}
+
+	/**
+	 * This adds a property descriptor for the Version feature. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 */
+	protected void addVersionPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), EJBProviderLibrariesResourceHandler.getString("_UI_EJBJar_version_feature"), //$NON-NLS-1$
+					EJBProviderLibrariesResourceHandler.getString("_UI_EJBJar_version_feature_desc"), //$NON-NLS-1$
+					EjbPackage.eINSTANCE.getEJBJar_Version(), false, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE));
+	}
+
+	/**
+	 * This specifies how to implement {@link #getChildren}and
+	 * {@link org.eclipse.emf.edit.command.AddCommand}and
+	 * {@link org.eclipse.emf.edit.command.RemoveCommand}support in {@link #createCommand}. <!--
+	 * begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public Collection getChildrenReferences(Object object) {
+		if (childrenReferences == null) {
+			super.getChildrenReferences(object);
+			childrenReferences.add(EjbPackage.eINSTANCE.getEJBJar_AssemblyDescriptor());
+			childrenReferences.add(EjbPackage.eINSTANCE.getEJBJar_EnterpriseBeans());
+			childrenReferences.add(EjbPackage.eINSTANCE.getEJBJar_RelationshipList());
+		}
+		return childrenReferences;
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	protected EReference getChildReference(Object object, Object child) {
+		// Check the type of the specified child object and return the proper feature to use for
+		// adding (see {@link AddCommand}) it as a child.
+
+		return super.getChildReference(object, child);
+	}
+
+
+	/**
+	 * This handles notification by calling {@link #fireNotifyChanged fireNotifyChanged}. <!--
+	 * begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public void notifyChanged(Notification notification) {
+		switch (notification.getFeatureID(EJBJar.class)) {
+			case EjbPackage.EJB_JAR__EJB_CLIENT_JAR :
+			case EjbPackage.EJB_JAR__VERSION :
+			case EjbPackage.EJB_JAR__ASSEMBLY_DESCRIPTOR :
+			case EjbPackage.EJB_JAR__ENTERPRISE_BEANS :
+			case EjbPackage.EJB_JAR__RELATIONSHIP_LIST : {
+				fireNotifyChanged(notification);
+				return;
+			}
+		}
+		super.notifyChanged(notification);
+	}
+
+	/**
+	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
+	 * describing all of the children that can be created under this object. <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
+		super.collectNewChildDescriptors(newChildDescriptors, object);
+
+		newChildDescriptors.add(createChildParameter(EjbPackage.eINSTANCE.getEJBJar_AssemblyDescriptor(), EjbFactory.eINSTANCE.createAssemblyDescriptor()));
+
+		newChildDescriptors.add(createChildParameter(EjbPackage.eINSTANCE.getEJBJar_EnterpriseBeans(), EjbFactory.eINSTANCE.createEntity()));
+
+		newChildDescriptors.add(createChildParameter(EjbPackage.eINSTANCE.getEJBJar_EnterpriseBeans(), EjbFactory.eINSTANCE.createContainerManagedEntity()));
+
+		newChildDescriptors.add(createChildParameter(EjbPackage.eINSTANCE.getEJBJar_EnterpriseBeans(), EjbFactory.eINSTANCE.createSession()));
+
+		newChildDescriptors.add(createChildParameter(EjbPackage.eINSTANCE.getEJBJar_EnterpriseBeans(), EjbFactory.eINSTANCE.createMessageDriven()));
+
+		newChildDescriptors.add(createChildParameter(EjbPackage.eINSTANCE.getEJBJar_RelationshipList(), EjbFactory.eINSTANCE.createRelationships()));
+	}
+
+	/**
+	 * Return the resource locator for this item provider's resources. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public ResourceLocator getResourceLocator() {
+		return J2EEPlugin.getDefault();
+	}
+
+	/**
+	 * This returns EJBJar.gif.
+	 */
+	@Override
+	public Object getImage(Object object) {
+		String key = null;
+		if (((EJBJar) object).eResource() == null)
+			return J2EEPlugin.getPlugin().getImage("ejbJar_obj"); //$NON-NLS-1$
+		switch (((EJBJar) object).getVersionID()) {
+			case J2EEVersionConstants.EJB_1_0_ID :
+				key = "10_ejbjar_obj"; //$NON-NLS-1$
+				break;
+			case J2EEVersionConstants.EJB_1_1_ID :
+				key = "11_ejbjar_obj"; //$NON-NLS-1$
+				break;
+			case J2EEVersionConstants.EJB_2_0_ID :
+				key = "20_ejbjar_obj"; //$NON-NLS-1$
+				break;
+			case J2EEVersionConstants.EJB_2_1_ID :
+			default :
+				key = "21_ejb_obj"; //$NON-NLS-1$
+				break;
+		}
+		return J2EEPlugin.getPlugin().getImage(key);
+	}
+
+	@Override
+	public String getText(Object object) {
+		EJBJar ejbJar = (EJBJar) object;
+		if (ejbJar.getDisplayName() == null) {
+			try {
+				IProject project = ProjectUtilities.getProject(ejbJar);
+				return project.getDescription().getName();
+			} catch (Exception e) {
+				//Ignore
+			}
+
+			Resource resource = ejbJar.eResource();
+			if (resource != null) {
+				return new Path(resource.getURI().toString()).removeFileExtension().lastSegment();
+			}
+			return EJBProviderLibrariesResourceHandler.getString("EJBJar_UI_"); //$NON-NLS-1$ = "EJBJar"
+
+		}
+		return ejbJar.getDisplayName();
+	}
+
+	/**
+	 * @see ITreeItemContentProvider#hasChildren(Object)
+	 */
+	@Override
+	public boolean hasChildren(Object parent) {
+		if (parent == null)
+			return false;
+		return !((EJBJar) parent).getEnterpriseBeans().isEmpty() || ((EJBJar) parent).getAssemblyDescriptor() != null;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildren(java.lang.Object)
+	 */
+	@Override
+	public Collection getChildren(Object object) {
+		List children = new ArrayList();
+		EJBJar aJar = (EJBJar) object;
+		if (aJar.getAssemblyDescriptor() != null)
+			children.add(aJar.getAssemblyDescriptor());
+		if (aJar.getEnterpriseBeans() != null)
+			children.addAll(aJar.getEnterpriseBeans());
+		if (aJar.getRelationshipList() != null && aJar.getRelationshipList().getEjbRelations() != null)
+			children.addAll(aJar.getRelationshipList().getEjbRelations());
+		return children;
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/EJBMethodCategoryItemProvider.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/EJBMethodCategoryItemProvider.java
new file mode 100644
index 0000000..1643962
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/EJBMethodCategoryItemProvider.java
@@ -0,0 +1,101 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2004 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.internal.ejb.provider;
+
+
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.util.ResourceLocator;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
+
+
+/**
+ * This is the item provider adpater for a {@link org.eclipse.jst.j2ee.internal.internal.ejb.EJBMethodCategory}object.
+ */
+public class EJBMethodCategoryItemProvider extends EjbItemProviderAdapter{
+	/**
+	 * This constructs an instance from a factory and a notifier.
+	 */
+	public EJBMethodCategoryItemProvider(AdapterFactory adapterFactory) {
+		super(adapterFactory);
+	}
+
+	/**
+	 * This returns EJBMethodCategory.gif.
+	 */
+	@Override
+	public Object getImage(Object object) {
+		return J2EEPlugin.getPlugin().getImage("EJBMethodCategory");//$NON-NLS-1$
+	}
+
+	/**
+	 * This returns the parent of the EJBMethodCategory.
+	 */
+	@Override
+	public Object getParent(Object object) {
+		return ((EObject) object).eContainer();
+	}
+
+	/**
+	 * This returns the property descriptors for the adapted class.
+	 */
+	@Override
+	public List getPropertyDescriptors(Object object) {
+		if (itemPropertyDescriptors == null) {
+			super.getPropertyDescriptors(object);
+		}
+		return itemPropertyDescriptors;
+	}
+
+	@Override
+	public String getText(Object object) {
+		return EJBProviderLibrariesResourceHandler.getString("EJBMethodCategory_UI_"); //$NON-NLS-1$ = "EJBMethodCategory"
+	}
+
+	/**
+	 * This handles notification by calling {@link #fireNotifyChanged fireNotifyChanged}. <!--
+	 * begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public void notifyChanged(Notification notification) {
+		super.notifyChanged(notification);
+	}
+
+	/**
+	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
+	 * describing all of the children that can be created under this object. <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
+		super.collectNewChildDescriptors(newChildDescriptors, object);
+	}
+
+	/**
+	 * Return the resource locator for this item provider's resources. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public ResourceLocator getResourceLocator() {
+		return J2EEPlugin.getDefault();
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/EJBNameComparator.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/EJBNameComparator.java
new file mode 100644
index 0000000..0551310
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/EJBNameComparator.java
@@ -0,0 +1,42 @@
+/***************************************************************************************************
+ * Copyright (c) 2003, 2004 IBM 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: IBM Corporation - initial API and implementation
+ **************************************************************************************************/
+package org.eclipse.jst.j2ee.internal.ejb.provider;
+
+
+import java.util.Comparator;
+
+import org.eclipse.jst.j2ee.ejb.EnterpriseBean;
+
+
+// This class sorts the name of Enterprise Beans
+
+public class EJBNameComparator implements Comparator {
+	private static EJBNameComparator singleton;
+
+	public int compare(Object o1, Object o2) {
+		String name1, name2;
+		name1 = ((EnterpriseBean) o1).getName();
+		name2 = ((EnterpriseBean) o2).getName();
+		if (name1 == null) {
+			if (name2 == null)
+				return 0;
+			return -1;
+		} else if (name2 == null)
+			return 1;
+		else
+			return name1.compareTo(name2);
+	}
+
+	public static Comparator singleton() {
+		if (singleton == null)
+			singleton = new EJBNameComparator();
+		return singleton;
+	}
+
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/EJBProviderLibrariesResourceHandler.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/EJBProviderLibrariesResourceHandler.java
new file mode 100644
index 0000000..93371d3
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/EJBProviderLibrariesResourceHandler.java
@@ -0,0 +1,92 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.internal.ejb.provider;
+
+
+
+import java.net.URL;
+import java.text.MessageFormat;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+import org.eclipse.emf.common.util.ResourceLocator;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
+
+
+public class EJBProviderLibrariesResourceHandler {
+
+	private static ResourceBundle fgResourceBundle;
+	public static ResourceLocator RESOURCE_LOCATOR = new ResourceLocator() {
+		public URL getBaseURL() {
+			return null;
+		}
+
+		public Object getImage(String arg0) {
+			return J2EEPlugin.getPlugin().getImage(arg0);
+		}
+
+		public String getString(String arg0) {
+			return EJBProviderLibrariesResourceHandler.getString(arg0);
+		}
+
+		public String getString(String arg0, Object[] arg1) {
+			return EJBProviderLibrariesResourceHandler.getString(arg0, arg1);
+		}
+		public String getString(String key, boolean translate) {
+			// TODO For now...  translate not supported
+			return getString(key);
+		}
+
+		public String getString(String key, Object[] substitutions, boolean translate) {
+			// TODO For now...  translate not supported
+			return getString(key,substitutions);
+		}
+	};
+
+	/**
+	 * Returns the resource bundle used by all classes in this Project
+	 */
+	public static ResourceBundle getResourceBundle() {
+		try {
+			return ResourceBundle.getBundle("ejbproviderlibraries");//$NON-NLS-1$
+		} catch (MissingResourceException e) {
+			// does nothing - this method will return null and
+			// getString(String, String) will return the key
+			// it was called with
+		}
+		return null;
+	}
+
+	public static String getString(String key) {
+		if (fgResourceBundle == null) {
+			fgResourceBundle = getResourceBundle();
+		}
+
+		if (fgResourceBundle != null) {
+			try {
+				return fgResourceBundle.getString(key);
+			} catch (MissingResourceException e) {
+				return "!" + key + "!";//$NON-NLS-2$//$NON-NLS-1$
+			}
+		}
+		return "!" + key + "!";//$NON-NLS-2$//$NON-NLS-1$
+	}
+
+	public static String getString(String key, Object[] args) {
+
+		try {
+			return MessageFormat.format(getString(key), args);
+		} catch (IllegalArgumentException e) {
+			return getString(key);
+		}
+
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/EJBRelationItemProvider.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/EJBRelationItemProvider.java
new file mode 100644
index 0000000..b5a24d0
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/EJBRelationItemProvider.java
@@ -0,0 +1,241 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.internal.ejb.provider;
+
+
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.util.ResourceLocator;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.edit.command.AddCommand;
+import org.eclipse.emf.edit.command.RemoveCommand;
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
+import org.eclipse.jst.j2ee.common.CommonFactory;
+import org.eclipse.jst.j2ee.ejb.EJBRelation;
+import org.eclipse.jst.j2ee.ejb.EJBRelationshipRole;
+import org.eclipse.jst.j2ee.ejb.EjbFactory;
+import org.eclipse.jst.j2ee.ejb.EjbPackage;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
+import org.eclipse.jst.j2ee.webservice.wscommon.WscommonFactory;
+
+
+
+/**
+ * This is the item provider adpater for a {@link org.eclipse.jst.j2ee.internal.internal.ejb.EJBRelation}object.
+ */
+public class EJBRelationItemProvider extends EjbItemProviderAdapter{
+	/**
+	 * This constructs an instance from a factory and a notifier.
+	 */
+	public EJBRelationItemProvider(AdapterFactory adapterFactory) {
+		super(adapterFactory);
+	}
+
+	/**
+	 * This creates a new child for {@link org.eclipse.jst.j2ee.internal.internal.ejb.command.CreateChildCommand}.
+	 */
+	@Override
+	public Object createChild(Object object) {
+		// TODO: check that this is what you want.
+		EJBRelationshipRole child = EjbFactory.eINSTANCE.createEJBRelationshipRole();
+
+		// TODO: initialize child here...
+
+		return child;
+	}
+
+	/**
+	 * This specifies how to implement {@link #getChildren}and {@link AddCommand}and
+	 * {@link RemoveCommand}support in {@link #createCommand}.
+	 */
+	@Override
+	public Collection getChildrenReferences(Object object) {
+		if (childrenReferences == null) {
+			super.getChildrenReferences(object);
+			childrenReferences.add(EjbPackage.eINSTANCE.getEJBRelation_RelationshipRoles());
+		}
+		return childrenReferences;
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	protected EReference getChildReference(Object object, Object child) {
+		// Check the type of the specified child object and return the proper feature to use for
+		// adding (see {@link AddCommand}) it as a child.
+
+		return super.getChildReference(object, child);
+	}
+
+
+	/**
+	 * This returns the image for {@link org.eclipse.jst.j2ee.internal.internal.ejb.command.CreateChildCommand}.
+	 */
+	@Override
+	public Object getCreateChildImage(Object object) {
+		EObject refObject = (EObject) object;
+		return org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin.getPlugin().getImage(refObject.eClass().getName() + EJBProviderLibrariesResourceHandler.getString("CreateEJBRelationshipRole_1")); //$NON-NLS-1$
+	}
+
+	/**
+	 * This returns the label for {@link org.eclipse.jst.j2ee.internal.internal.ejb.command.CreateChildCommand}.
+	 */
+	@Override
+	public String getCreateChildText(Object object) {
+		return EJBProviderLibrariesResourceHandler.getString("Create_EJBRelationshipRole_2"); //$NON-NLS-1$
+	}
+
+	/**
+	 * This returns the help text for {@link org.eclipse.jst.j2ee.internal.internal.ejb.command.CreateChildCommand}.
+	 */
+	@Override
+	public String getCreateChildToolTipText(Object object) {
+		EObject refObject = (EObject) object;
+		return EJBProviderLibrariesResourceHandler.getString("Create_a_child_of_type_EJBRelationshipRole_for_the_selected__3") + refObject.eClass().getName() + EJBProviderLibrariesResourceHandler.getString("_4"); //$NON-NLS-1$ //$NON-NLS-2$
+	}
+
+	/**
+	 * This returns EJBRelation.gif.
+	 */
+	@Override
+	public Object getImage(Object object) {
+		return J2EEPlugin.getPlugin().getImage("EJBRelation"); //$NON-NLS-1$
+	}
+
+	/**
+	 * This returns the parent of the EJBRelation.
+	 */
+	@Override
+	public Object getParent(Object object) {
+		return ((EObject) object).eContainer();
+	}
+
+	/**
+	 * This returns the property descriptors for the adapted class.
+	 */
+	@Override
+	public List getPropertyDescriptors(Object object) {
+		if (itemPropertyDescriptors == null) {
+			super.getPropertyDescriptors(object);
+
+			EjbPackage pkg = EjbPackage.eINSTANCE;
+
+			// This is for the description feature.
+			//
+			itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), EJBProviderLibrariesResourceHandler.getString("Description_6"), //$NON-NLS-1$
+						EJBProviderLibrariesResourceHandler.getString("The_description_property_of_the_ejb_relation_7"), //$NON-NLS-1$
+						pkg.getEJBRelation_Description(), true, ItemPropertyDescriptor.TEXT_VALUE_IMAGE));
+
+			// This is for the name feature.
+			//
+			itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), EJBProviderLibrariesResourceHandler.getString("Name_8"), //$NON-NLS-1$
+						EJBProviderLibrariesResourceHandler.getString("The_name_property_of_the_ejb_relation_9"), //$NON-NLS-1$
+						pkg.getEJBRelation_Name(), true, ItemPropertyDescriptor.TEXT_VALUE_IMAGE));
+
+			// This is for the relationshipList feature.
+			//
+			itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), EJBProviderLibrariesResourceHandler.getString("Relationship_List_10"), //$NON-NLS-1$
+						EJBProviderLibrariesResourceHandler.getString("The_relationship_list_of_the_ejb_relation_11"), //$NON-NLS-1$
+						pkg.getEJBRelation_RelationshipList(), false));
+
+		}
+		return itemPropertyDescriptors;
+	}
+
+	/**
+	 * This adds a property descriptor for the Description feature. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	protected void addDescriptionPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), getString("_UI_EJBRelation_description_feature"), //$NON-NLS-1$
+					getString("_UI_PropertyDescriptor_description", "_UI_EJBRelation_description_feature", "_UI_EJBRelation_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+					EjbPackage.eINSTANCE.getEJBRelation_Description(), true, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE));
+	}
+
+	/**
+	 * This adds a property descriptor for the Name feature. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	protected void addNamePropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), getString("_UI_EJBRelation_name_feature"), //$NON-NLS-1$
+					getString("_UI_PropertyDescriptor_description", "_UI_EJBRelation_name_feature", "_UI_EJBRelation_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+					EjbPackage.eINSTANCE.getEJBRelation_Name(), true, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE));
+	}
+
+	@Override
+	public String getText(Object object) {
+		EJBRelation ejbRelation = ((EJBRelation) object);
+		String name = ejbRelation.getName();
+		return name != null ? name : ""; //$NON-NLS-1$
+	}
+
+	/**
+	 * This handles notification by calling {@link #fireNotifyChanged fireNotifyChanged}. <!--
+	 * begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public void notifyChanged(Notification notification) {
+		switch (notification.getFeatureID(EJBRelation.class)) {
+			case EjbPackage.EJB_RELATION__DESCRIPTION :
+			case EjbPackage.EJB_RELATION__NAME :
+			case EjbPackage.EJB_RELATION__RELATIONSHIP_ROLES :
+			case EjbPackage.EJB_RELATION__DESCRIPTIONS : {
+				fireNotifyChanged(notification);
+				return;
+			}
+		}
+		super.notifyChanged(notification);
+	}
+
+	/**
+	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
+	 * describing all of the children that can be created under this object. <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
+		super.collectNewChildDescriptors(newChildDescriptors, object);
+
+		newChildDescriptors.add(createChildParameter(EjbPackage.eINSTANCE.getEJBRelation_RelationshipRoles(), EjbFactory.eINSTANCE.createEJBRelationshipRole()));
+
+		newChildDescriptors.add(createChildParameter(EjbPackage.eINSTANCE.getEJBRelation_Descriptions(), CommonFactory.eINSTANCE.createDescription()));
+
+		newChildDescriptors.add(createChildParameter(EjbPackage.eINSTANCE.getEJBRelation_Descriptions(), WscommonFactory.eINSTANCE.createDescriptionType()));
+	}
+
+	/**
+	 * Return the resource locator for this item provider's resources. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public ResourceLocator getResourceLocator() {
+		return J2EEPlugin.getDefault();
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/EJBRelationshipRoleItemProvider.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/EJBRelationshipRoleItemProvider.java
new file mode 100644
index 0000000..60eb903
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/EJBRelationshipRoleItemProvider.java
@@ -0,0 +1,388 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.internal.ejb.provider;
+
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.Notifier;
+import org.eclipse.emf.common.util.ResourceLocator;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.edit.command.AddCommand;
+import org.eclipse.emf.edit.command.RemoveCommand;
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.ComposedImage;
+import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
+import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.ItemProviderAdapter;
+import org.eclipse.jst.j2ee.common.CommonFactory;
+import org.eclipse.jst.j2ee.ejb.CommonRelationshipRole;
+import org.eclipse.jst.j2ee.ejb.ContainerManagedEntity;
+import org.eclipse.jst.j2ee.ejb.EJBRelationshipRole;
+import org.eclipse.jst.j2ee.ejb.EjbFactory;
+import org.eclipse.jst.j2ee.ejb.EjbPackage;
+import org.eclipse.jst.j2ee.ejb.RoleSource;
+import org.eclipse.jst.j2ee.ejb.internal.impl.EjbFactoryImpl;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
+import org.eclipse.jst.j2ee.webservice.wscommon.WscommonFactory;
+
+
+/**
+ * This is the item provider adpater for a {@link org.eclipse.jst.j2ee.internal.internal.ejb.EJBRelationshipRole}object.
+ */
+public class EJBRelationshipRoleItemProvider extends EjbItemProviderAdapter{
+	protected static final EStructuralFeature ROLES_SF = EjbFactoryImpl.getPackage().getEJBRelation_RelationshipRoles();
+	protected EJBRelationshipRole targetRole;
+	private static final Class ITreeItemContentProviderClass = ITreeItemContentProvider.class;
+
+	/**
+	 * This constructs an instance from a factory and a notifier.
+	 */
+	public EJBRelationshipRoleItemProvider(AdapterFactory adapterFactory) {
+		super(adapterFactory);
+	}
+
+	/**
+	 * This creates a new child for {@link org.eclipse.jst.j2ee.internal.internal.ejb.command.CreateChildCommand}.
+	 */
+	@Override
+	public Object createChild(Object object) {
+		// TODO: create some child object.
+		return null;
+	}
+
+	/**
+	 * This specifies how to implement {@link #getChildren}and {@link AddCommand}and
+	 * {@link RemoveCommand}support in {@link #createCommand}.
+	 */
+	@Override
+	public Collection getChildrenReferences(Object object) {
+		if (childrenReferences == null) {
+			super.getChildrenReferences(object);
+			// Exclude these children for mapping purposes
+			//	  childrenReferences.add(EjbPackage.eINSTANCE.getEJBRelationshipRole_CmrField());
+			//	  childrenReferences.add(EjbPackage.eINSTANCE.getEJBRelationshipRole_Source());
+		}
+		return childrenReferences;
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	protected EReference getChildReference(Object object, Object child) {
+		// Check the type of the specified child object and return the proper feature to use for
+		// adding (see {@link AddCommand}) it as a child.
+
+		return super.getChildReference(object, child);
+	}
+
+
+	/**
+	 * This returns the image for {@link org.eclipse.jst.j2ee.internal.internal.ejb.command.CreateChildCommand}.
+	 */
+	@Override
+	public Object getCreateChildImage(Object object) {
+		EObject refObject = (EObject) object;
+		return J2EEPlugin.getPlugin().getImage(refObject.eClass().getName() + "Create#CHILD_CLASS_NAME#"); //$NON-NLS-1$
+	}
+
+	/**
+	 * This returns the label for {@link org.eclipse.jst.j2ee.internal.internal.ejb.command.CreateChildCommand}.
+	 */
+	@Override
+	public String getCreateChildText(Object object) {
+		return "Create #CHILD_CLASS_NAME#"; //$NON-NLS-1$
+	}
+
+	/**
+	 * This returns the help text for {@link org.eclipse.jst.j2ee.internal.internal.ejb.command.CreateChildCommand}.
+	 */
+	@Override
+	public String getCreateChildToolTipText(Object object) {
+		EObject refObject = (EObject) object;
+		return "Create a child of type #CHILD_CLASS_NAME# for the selected " + refObject.eClass().getName() + EJBProviderLibrariesResourceHandler.getString("_4"); //$NON-NLS-1$ //$NON-NLS-2$
+	}
+
+	/**
+	 * This returns EJBRelationshipRole.gif.
+	 */
+	@Override
+	public Object getImage(Object object) {
+		CommonRelationshipRole role = (CommonRelationshipRole) object;
+		String imageName;
+		if (role.isKey()) {
+			imageName = "roleKey_obj"; //$NON-NLS-1$
+		} else if (role.isForward()) {
+			Object base = J2EEPlugin.getPlugin().getImage("role_obj"); //$NON-NLS-1$
+			Object overlayImage = J2EEPlugin.getPlugin().getImage("frnkeyrelnshp_ovr"); //$NON-NLS-1$
+			ArrayList imageObjects = new ArrayList();
+			imageObjects.add(base);
+			imageObjects.add(overlayImage);
+			return new ComposedImage(imageObjects) {
+				@Override
+				public List getDrawPoints(Size size) {
+					List result = super.getDrawPoints(size);
+					if (result.size() > 1) {
+						((Point) result.get(1)).x = ((Point) result.get(1)).x + 8;
+						((Point) result.get(1)).y = ((Point) result.get(1)).y + 2;
+					}
+					return result;
+				}
+			};
+		} else {
+			imageName = "role_obj"; //$NON-NLS-1$
+		}
+		return J2EEPlugin.getPlugin().getImage(imageName);
+	}
+
+	/**
+	 * This returns the parent of the EJBRelationshipRole.
+	 */
+	@Override
+	public Object getParent(Object object) {
+		// override to convince the mapping domain that we are part of the input object graph
+		//	return ((EObject)object).eContainer();
+
+		return (((EJBRelationshipRole) object).getSource() != null) ? ((EJBRelationshipRole) object).getSourceEntity() : null;
+	}
+
+	/**
+	 * This returns the property descriptors for the adapted class.
+	 */
+	@Override
+	public List getPropertyDescriptors(Object object) {
+		if (itemPropertyDescriptors == null) {
+			super.getPropertyDescriptors(object);
+
+			EjbPackage pkg = EjbPackage.eINSTANCE;
+
+			// This is for the description feature.
+			//
+			itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), EJBProviderLibrariesResourceHandler.getString("Description_5"), //$NON-NLS-1$
+						EJBProviderLibrariesResourceHandler.getString("The_description_property_of_the_ejb_relationship_role_6"), //$NON-NLS-1$
+						pkg.getEJBRelationshipRole_Description(), false, ItemPropertyDescriptor.TEXT_VALUE_IMAGE));
+
+			// This is for the name feature.
+			//
+			itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), EJBProviderLibrariesResourceHandler.getString("Name_7"), //$NON-NLS-1$
+						EJBProviderLibrariesResourceHandler.getString("The_roleName_property_of_the_ejb_relationship_role_8"), //$NON-NLS-1$
+						pkg.getEJBRelationshipRole_RoleName(), false, ItemPropertyDescriptor.TEXT_VALUE_IMAGE));
+
+			// This is for the multiplicity feature.
+			//
+			itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), EJBProviderLibrariesResourceHandler.getString("Multiplicity_9"), //$NON-NLS-1$
+						EJBProviderLibrariesResourceHandler.getString("The_multiplicity_property_of_the_ejb_relationship_role_10"), //$NON-NLS-1$
+						pkg.getEJBRelationshipRole_Multiplicity(), false, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE));
+
+			// This is for the cascadeDelete feature.
+			//
+			itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), EJBProviderLibrariesResourceHandler.getString("Cascade_Delete_11"), //$NON-NLS-1$
+						EJBProviderLibrariesResourceHandler.getString("The_cascade_delete_property_of_the_ejb_relationship_role_12"), //$NON-NLS-1$
+						pkg.getEJBRelationshipRole_CascadeDelete(), false, ItemPropertyDescriptor.BOOLEAN_VALUE_IMAGE));
+
+			// This is for the cmrField feature.
+			//
+			itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), EJBProviderLibrariesResourceHandler.getString("Cmr_Field_13"), //$NON-NLS-1$
+						EJBProviderLibrariesResourceHandler.getString("The_cmr_field_of_the_ejb_relationship_role_14"), //$NON-NLS-1$
+						pkg.getEJBRelationshipRole_CmrField(), false));
+
+			// This is for the relationship feature.
+			//
+			itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), EJBProviderLibrariesResourceHandler.getString("Relationship_15"), //$NON-NLS-1$
+						EJBProviderLibrariesResourceHandler.getString("The_relationship_of_the_ejb_relationship_role_16"), //$NON-NLS-1$
+						pkg.getEJBRelationshipRole_Relationship(), false));
+
+			// This is for the source feature.
+			//
+			itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), EJBProviderLibrariesResourceHandler.getString("Source_17"), //$NON-NLS-1$
+						EJBProviderLibrariesResourceHandler.getString("The_source_of_the_ejb_relationship_role_18"), //$NON-NLS-1$
+						pkg.getEJBRelationshipRole_Source(), false));
+
+		}
+		return itemPropertyDescriptors;
+	}
+
+	/**
+	 * This adds a property descriptor for the Description feature. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	protected void addDescriptionPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), getString("_UI_EJBRelationshipRole_description_feature"), //$NON-NLS-1$
+					getString("_UI_PropertyDescriptor_description", "_UI_EJBRelationshipRole_description_feature", "_UI_EJBRelationshipRole_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+					EjbPackage.eINSTANCE.getEJBRelationshipRole_Description(), true, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE));
+	}
+
+	/**
+	 * This adds a property descriptor for the Role Name feature. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	protected void addRoleNamePropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), getString("_UI_EJBRelationshipRole_roleName_feature"), //$NON-NLS-1$
+					getString("_UI_PropertyDescriptor_description", "_UI_EJBRelationshipRole_roleName_feature", "_UI_EJBRelationshipRole_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+					EjbPackage.eINSTANCE.getEJBRelationshipRole_RoleName(), true, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE));
+	}
+
+	/**
+	 * This adds a property descriptor for the Multiplicity feature. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	protected void addMultiplicityPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), getString("_UI_EJBRelationshipRole_multiplicity_feature"), //$NON-NLS-1$
+					getString("_UI_PropertyDescriptor_description", "_UI_EJBRelationshipRole_multiplicity_feature", "_UI_EJBRelationshipRole_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+					EjbPackage.eINSTANCE.getEJBRelationshipRole_Multiplicity(), true, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE));
+	}
+
+	/**
+	 * This adds a property descriptor for the Cascade Delete feature. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	protected void addCascadeDeletePropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), getString("_UI_EJBRelationshipRole_cascadeDelete_feature"), //$NON-NLS-1$
+					getString("_UI_PropertyDescriptor_description", "_UI_EJBRelationshipRole_cascadeDelete_feature", "_UI_EJBRelationshipRole_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+					EjbPackage.eINSTANCE.getEJBRelationshipRole_CascadeDelete(), true, ItemPropertyDescriptor.BOOLEAN_VALUE_IMAGE));
+	}
+
+	@Override
+	public String getText(Object object) {
+		try {
+			CommonRelationshipRole aRole = (CommonRelationshipRole) object;
+			if (aRole == null)
+				return ""; //$NON-NLS-1$
+			StringBuffer b = new StringBuffer();
+			if (aRole.isMany())
+				b.append("[0..*]"); //$NON-NLS-1$
+			else {
+				if (aRole.isKey())
+					b.append("[1..1]"); //$NON-NLS-1$
+				else
+					b.append("[0..1]"); //$NON-NLS-1$
+			}
+			b.append(" "); //$NON-NLS-1$
+			b.append(aRole.getRoleName()).append(" : "); //$NON-NLS-1$
+			ContainerManagedEntity type = aRole.getTypeEntity();
+			if (type == null)
+				b.append(EJBProviderLibrariesResourceHandler.getString("Unknown_Role_Type_UI_")); //$NON-NLS-1$
+			else
+				b.append(type.getName());
+			return b.toString();
+		} catch (Exception e) {
+			return e.toString();
+		}
+	}
+
+	/**
+	 * This handles notification by calling {@link #fireNotifyChanged fireNotifyChanged}. <!--
+	 * begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public void notifyChanged(Notification notification) {
+		switch (notification.getFeatureID(EJBRelationshipRole.class)) {
+			case EjbPackage.EJB_RELATIONSHIP_ROLE__DESCRIPTION :
+			case EjbPackage.EJB_RELATIONSHIP_ROLE__ROLE_NAME :
+			case EjbPackage.EJB_RELATIONSHIP_ROLE__MULTIPLICITY :
+			case EjbPackage.EJB_RELATIONSHIP_ROLE__CASCADE_DELETE :
+			case EjbPackage.EJB_RELATIONSHIP_ROLE__SOURCE :
+			case EjbPackage.EJB_RELATIONSHIP_ROLE__CMR_FIELD :
+			case EjbPackage.EJB_RELATIONSHIP_ROLE__DESCRIPTIONS : {
+				fireNotifyChanged(notification);
+				return;
+			}
+		}
+		super.notifyChanged(notification);
+	}
+
+	/**
+	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
+	 * describing all of the children that can be created under this object. <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
+		super.collectNewChildDescriptors(newChildDescriptors, object);
+
+		newChildDescriptors.add(createChildParameter(EjbPackage.eINSTANCE.getEJBRelationshipRole_Source(), EjbFactory.eINSTANCE.createRoleSource()));
+
+		newChildDescriptors.add(createChildParameter(EjbPackage.eINSTANCE.getEJBRelationshipRole_CmrField(), EjbFactory.eINSTANCE.createCMRField()));
+
+		newChildDescriptors.add(createChildParameter(EjbPackage.eINSTANCE.getEJBRelationshipRole_Descriptions(), CommonFactory.eINSTANCE.createDescription()));
+
+		newChildDescriptors.add(createChildParameter(EjbPackage.eINSTANCE.getEJBRelationshipRole_Descriptions(), WscommonFactory.eINSTANCE.createDescriptionType()));
+	}
+
+	/**
+	 * Return the resource locator for this item provider's resources. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public ResourceLocator getResourceLocator() {
+		return J2EEPlugin.getDefault();
+	}
+
+	/**
+	 * This handles notification by calling {@link #fireNotifyChanged fireNotifyChanged}.
+	 */
+	/*
+	 * public void notifyChanged(Notifier notifier, int eventType, EObject feature, Object oldValue,
+	 * Object newValue, int index) { EjbPackage pkg = EjbPackage.eINSTANCE;; if (feature ==
+	 * pkg.getEJBRelationshipRole_Description() || feature == pkg.getEJBRelationshipRole_RoleName() ||
+	 * feature == pkg.getEJBRelationshipRole_Multiplicity() || feature ==
+	 * pkg.getEJBRelationshipRole_CascadeDelete() || // feature ==
+	 * pkg.getEJBRelationshipRole_CmrField() || feature == pkg.getEJBRelationshipRole_Relationship() ||
+	 * feature == pkg.getEJBRelationshipRole_Source()) { fireNotifyChanged(notifier, eventType,
+	 * feature, oldValue, newValue, index); return; } super.notifyChanged(notifier, eventType,
+	 * feature, oldValue, newValue, index); }
+	 */
+	/**
+	 * @see ItemProviderAdapter#setTarget(Notifier)
+	 */
+	@Override
+	public void setTarget(Notifier arg0) {
+		EJBRelationshipRole role = arg0 instanceof EJBRelationshipRole ? (EJBRelationshipRole) arg0 : null;
+		super.setTarget(arg0);
+		if (role != null) {
+			if (getAdapterFactory() == null) {
+				return;
+			}
+			if (role.getSourceEntity() != null && !role.getSourceEntity().eAdapters().contains(this)) {
+				getAdapterFactory().adapt(role.getSourceEntity(), ITreeItemContentProviderClass);
+				role.getSourceEntity().eAdapters().add(this);
+			}
+			RoleSource rs = role.getSource();
+			if (rs != null) {
+				getAdapterFactory().adapt(rs, getAdapterFactory());
+			}
+		}
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/EjbItemProviderAdapter.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/EjbItemProviderAdapter.java
new file mode 100644
index 0000000..64c4a68
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/EjbItemProviderAdapter.java
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2004 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.internal.ejb.provider;
+
+
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.provider.EObjectItemProvider;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
+
+
+/**
+ * This extended item provider supports the following commands:
+ * {@link org.eclipse.jst.j2ee.internal.internal.ejb.command.CreateChildCommand}. The commands are implemented uniformly on
+ * all our item adapters using this common base class.
+ */
+public class EjbItemProviderAdapter extends EObjectItemProvider {
+	protected EjbItemProviderAdapter(AdapterFactory adapterFactory) {
+		super(adapterFactory);
+	}
+
+	/**
+	 * This implements the default behavior for
+	 * {@link org.eclipse.jst.j2ee.internal.internal.ejb.command.CreateChildCommand}.
+	 */
+	public Object createChild(Object object) {
+		return null;
+	}
+
+	/**
+	 * This returns the default image for {@link org.eclipse.jst.j2ee.internal.internal.ejb.command.CreateChildCommand}.
+	 */
+	public Object getCreateChildImage(Object object) {
+		return J2EEPlugin.getPlugin().getImage("CreateChild");//$NON-NLS-1$
+	}
+
+	/**
+	 * This returns the default label for {@link org.eclipse.jst.j2ee.internal.internal.ejb.command.CreateChildCommand}.
+	 */
+	public String getCreateChildText(Object object) {
+		return EJBProviderLibrariesResourceHandler.getString("Create_Child_UI_"); //$NON-NLS-1$ = "Create Child"
+	}
+
+	/**
+	 * This returns the default help text for {@link org.eclipse.jst.j2ee.internal.internal.ejb.command.CreateChildCommand}.
+	 */
+	public String getCreateChildToolTipText(Object object) {
+		EObject refObject = (EObject) object;
+		return EJBProviderLibrariesResourceHandler.getString("Create_a_new_child_for_the_UI_") + refObject.eClass().getName() + ".";//$NON-NLS-2$ //$NON-NLS-1$ = "Create a new child for the selected "
+	}
+
+
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.emf.edit.provider.IDisposable#dispose()
+	 */
+	@Override
+	public void dispose() {
+		super.dispose();
+		target = null;
+	}
+
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/EjbItemProviderAdapterFactory.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/EjbItemProviderAdapterFactory.java
new file mode 100644
index 0000000..dcb17a9
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/EjbItemProviderAdapterFactory.java
@@ -0,0 +1,590 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.internal.ejb.provider;
+
+
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.Notifier;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.edit.provider.ChangeNotifier;
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
+import org.eclipse.emf.edit.provider.Disposable;
+import org.eclipse.emf.edit.provider.IChangeNotifier;
+import org.eclipse.emf.edit.provider.IDisposable;
+import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
+import org.eclipse.emf.edit.provider.IItemLabelProvider;
+import org.eclipse.emf.edit.provider.IItemPropertySource;
+import org.eclipse.emf.edit.provider.INotifyChangedListener;
+import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
+import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
+import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
+import org.eclipse.jst.j2ee.ejb.EjbPackage;
+import org.eclipse.jst.j2ee.ejb.internal.util.EjbAdapterFactory;
+
+
+/**
+ * This is the factory that is used to provide the interfaces needed to support
+ * { @link org.eclipse.jface.viewers.Viewer}s. The adapters generated by this factory convert EMF
+ * adapter notifications into calls to {@link #fireNotifyChanged fireNotifyChanged}. The adapters
+ * also support property sheets, see {@link org.eclipse.ui.views.properties}. Note that most of the
+ * adapters are shared among multiple instances.
+ */
+public class EjbItemProviderAdapterFactory extends EjbAdapterFactory implements ComposeableAdapterFactory, IChangeNotifier, IDisposable {
+	/**
+	 * This keeps track of the root adapter factory that delegates to this adapter factory.
+	 */
+	protected ComposedAdapterFactory parentAdapterFactory;
+	/**
+	 * This is used to implement {@link #IDisposable}.
+	 */
+	protected Disposable disposable = new Disposable();
+	/**
+	 * This is used to implement {@link #IChangeNotifier}.
+	 */
+	protected IChangeNotifier changeNotifier = new ChangeNotifier();
+
+	/**
+	 * This keeps track of all the supported types checked by
+	 * {@link #isFactoryForType isFactoryForType}.
+	 */
+	protected Collection supportedTypes = new ArrayList();
+	/**
+	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.j2ee.internal.internal.ejb.MethodPermission}
+	 * instances.
+	 */
+	protected MethodPermissionItemProvider methodPermissionItemProvider;
+	/**
+	 * This keeps track of the one adapter used for all
+	 * {@link org.eclipse.jst.j2ee.internal.internal.ejb.AssemblyDescriptor}instances.
+	 */
+	protected AssemblyDescriptorItemProvider assemblyDescriptorItemProvider;
+	/**
+	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.j2ee.internal.internal.ejb.MethodTransaction}
+	 * instances.
+	 */
+	protected MethodTransactionItemProvider methodTransactionItemProvider;
+	/**
+	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.j2ee.internal.internal.ejb.EnterpriseBean}
+	 * instances.
+	 */
+	protected EnterpriseBeanItemProvider enterpriseBeanItemProvider;
+	/**
+	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.j2ee.internal.internal.ejb.Session}
+	 * instances.
+	 */
+	protected SessionItemProvider sessionItemProvider;
+	/**
+	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.j2ee.internal.internal.ejb.MessageDriven}
+	 * instances.
+	 */
+	protected MessageDrivenItemProvider messageDrivenItemProvider;
+	/**
+	 * This keeps track of the one adapter used for all
+	 * {@link org.eclipse.jst.j2ee.internal.internal.ejb.MessageDrivenDestination}instances.
+	 */
+	protected MessageDrivenDestinationItemProvider messageDrivenDestinationItemProvider;
+	/**
+	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.j2ee.internal.internal.ejb.Entity}instances.
+	 */
+	protected EntityItemProvider entityItemProvider;
+	/**
+	 * This keeps track of the one adapter used for all
+	 * {@link org.eclipse.jst.j2ee.internal.internal.ejb.ContainerManagedEntity}instances.
+	 */
+	protected ContainerManagedEntityItemProvider containerManagedEntityItemProvider;
+	/**
+	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.j2ee.internal.internal.ejb.CMPAttribute}
+	 * instances.
+	 */
+	protected CMPAttributeItemProvider cmpAttributeItemProvider;
+	/**
+	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.j2ee.internal.internal.ejb.CMRField}
+	 * instances.
+	 */
+	protected CMRFieldItemProvider cmrFieldItemProvider;
+	/**
+	 * This keeps track of the one adapter used for all
+	 * {@link org.eclipse.jst.j2ee.internal.internal.ejb.EJBRelationshipRole}instances.
+	 */
+	protected EJBRelationshipRoleItemProvider ejbRelationshipRoleItemProvider;
+	/**
+	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.j2ee.internal.internal.ejb.EJBRelation}
+	 * instances.
+	 */
+	protected EJBRelationItemProvider ejbRelationItemProvider;
+	/**
+	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.j2ee.internal.internal.ejb.Relationships}
+	 * instances.
+	 */
+	protected RelationshipsItemProvider relationshipsItemProvider;
+	/**
+	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.j2ee.internal.internal.ejb.EJBJar}instances.
+	 */
+	protected EJBJarItemProvider eJBJarItemProvider;
+	/**
+	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.j2ee.internal.internal.ejb.RoleSource}
+	 * instances.
+	 */
+	protected RoleSourceItemProvider roleSourceItemProvider;
+	/**
+	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.j2ee.internal.internal.ejb.Query}instances.
+	 */
+	protected QueryItemProvider queryItemProvider;
+	/**
+	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.j2ee.internal.internal.ejb.QueryMethod}
+	 * instances.
+	 */
+	protected QueryMethodItemProvider queryMethodItemProvider;
+	/**
+	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.j2ee.internal.internal.ejb.MethodElement}
+	 * instances.
+	 */
+	protected MethodElementItemProvider methodElementItemProvider;
+	/**
+	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.j2ee.internal.internal.ejb.ExcludeList}
+	 * instances.
+	 */
+	protected ExcludeListItemProvider excludeListItemProvider;
+	/**
+	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.j2ee.internal.internal.ejb.EJBMethodCategory}
+	 * instances.
+	 */
+	protected EJBMethodCategoryItemProvider ejbMethodCategoryItemProvider;
+
+	/**
+	 * This constructs an instance.
+	 */
+	public EjbItemProviderAdapterFactory() {
+		supportedTypes.add(IStructuredItemContentProvider.class);
+		supportedTypes.add(ITreeItemContentProvider.class);
+		supportedTypes.add(IItemPropertySource.class);
+		supportedTypes.add(IEditingDomainItemProvider.class);
+		supportedTypes.add(IItemLabelProvider.class);
+		supportedTypes.add(ITableItemLabelProvider.class);
+	}
+
+	/**
+	 * This implementation substitutes the factory itself as the key for the adapter.
+	 */
+	@Override
+	public Adapter adapt(Notifier notifier, Object type) {
+		adaptContainerIfNecessary((EObject) notifier, type);
+		return super.adapt(notifier, this);
+	}
+
+	@Override
+	public Object adapt(Object object, Object type) {
+		// This is a kludge to deal with enumerators, which crash the doSwitch.
+		//
+		if (object instanceof EObject && ((EObject) object).eClass() == null) {
+			return null;
+		}
+
+		if (isFactoryForType(type)) {
+			Object adapter = super.adapt(object, type);
+			if (!(type instanceof Class) || (((Class) type).isInstance(adapter))) {
+				return adapter;
+			}
+		}
+
+		return null;
+	}
+
+	@Override
+	public Adapter adaptNew(Notifier target, Object adapterType) {
+		Adapter adapter = super.adaptNew(target, adapterType);
+		disposable.add(adapter);
+		return adapter;
+	}
+
+	/**
+	 * This adds a listener. <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public void addListener(INotifyChangedListener notifyChangedListener) {
+		changeNotifier.addListener(notifyChangedListener);
+	}
+
+	/**
+	 * This creates an adapter for a {@link org.eclipse.jst.j2ee.internal.internal.ejb.AssemblyDescriptor}.
+	 */
+	@Override
+	public Adapter createAssemblyDescriptorAdapter() {
+		if (assemblyDescriptorItemProvider == null) {
+			assemblyDescriptorItemProvider = new AssemblyDescriptorItemProvider(this);
+		}
+
+		return assemblyDescriptorItemProvider;
+	}
+
+	/**
+	 * This creates an adapter for a {@link org.eclipse.jst.j2ee.internal.internal.ejb.CMPAttribute}.
+	 */
+	@Override
+	public Adapter createCMPAttributeAdapter() {
+		if (cmpAttributeItemProvider == null) {
+			cmpAttributeItemProvider = new CMPAttributeItemProvider(this);
+		}
+
+		return cmpAttributeItemProvider;
+	}
+
+	/**
+	 * This creates an adapter for a {@link org.eclipse.jst.j2ee.internal.internal.ejb.CMRField}.
+	 */
+	@Override
+	public Adapter createCMRFieldAdapter() {
+		if (cmrFieldItemProvider == null) {
+			cmrFieldItemProvider = new CMRFieldItemProvider(this);
+		}
+
+		return cmrFieldItemProvider;
+	}
+
+	/**
+	 * This creates an adapter for a {@link org.eclipse.jst.j2ee.internal.internal.ejb.ContainerManagedEntity}.
+	 */
+	@Override
+	public Adapter createContainerManagedEntityAdapter() {
+		if (containerManagedEntityItemProvider == null) {
+			containerManagedEntityItemProvider = new ContainerManagedEntityItemProvider(this);
+		}
+
+		return containerManagedEntityItemProvider;
+	}
+
+	/**
+	 * This creates an adapter for a {@link org.eclipse.jst.j2ee.internal.internal.ejb.EJBJar}.
+	 */
+	@Override
+	public Adapter createEJBJarAdapter() {
+		if (eJBJarItemProvider == null) {
+			eJBJarItemProvider = new EJBJarItemProvider(this);
+		}
+
+		return eJBJarItemProvider;
+	}
+
+	/**
+	 * This creates an adapter for a {@link org.eclipse.jst.j2ee.internal.internal.ejb.EJBMethodCategory}.
+	 */
+	@Override
+	public Adapter createEJBMethodCategoryAdapter() {
+		if (ejbMethodCategoryItemProvider == null) {
+			ejbMethodCategoryItemProvider = new EJBMethodCategoryItemProvider(this);
+		}
+
+		return ejbMethodCategoryItemProvider;
+	}
+
+	/**
+	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.j2ee.internal.internal.ejb.EJBJar}instances.
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	protected EJBJarItemProvider ejbJarItemProvider;
+
+	/**
+	 * This creates an adapter for a {@link org.eclipse.jst.j2ee.internal.internal.ejb.EJBRelation}.
+	 */
+	@Override
+	public Adapter createEJBRelationAdapter() {
+		if (ejbRelationItemProvider == null) {
+			ejbRelationItemProvider = new EJBRelationItemProvider(this);
+		}
+
+		return ejbRelationItemProvider;
+	}
+
+	/**
+	 * This creates an adapter for a {@link org.eclipse.jst.j2ee.internal.internal.ejb.EJBRelationshipRole}.
+	 */
+	@Override
+	public Adapter createEJBRelationshipRoleAdapter() {
+		if (ejbRelationshipRoleItemProvider == null) {
+			ejbRelationshipRoleItemProvider = new EJBRelationshipRoleItemProvider(this);
+		}
+
+		return ejbRelationshipRoleItemProvider;
+	}
+
+	/**
+	 * This creates an adapter for a {@link org.eclipse.jst.j2ee.internal.internal.ejb.EnterpriseBean}.
+	 */
+	@Override
+	public Adapter createEnterpriseBeanAdapter() {
+		if (enterpriseBeanItemProvider == null) {
+			enterpriseBeanItemProvider = new EnterpriseBeanItemProvider(this);
+		}
+
+		return enterpriseBeanItemProvider;
+	}
+
+	/**
+	 * This creates an adapter for a {@link org.eclipse.jst.j2ee.internal.internal.ejb.Entity}.
+	 */
+	@Override
+	public Adapter createEntityAdapter() {
+		if (entityItemProvider == null) {
+			entityItemProvider = new EntityItemProvider(this);
+		}
+
+		return entityItemProvider;
+	}
+
+	/**
+	 * This creates an adapter for a {@link org.eclipse.jst.j2ee.internal.internal.ejb.ExcludeList}.
+	 */
+	@Override
+	public Adapter createExcludeListAdapter() {
+		if (excludeListItemProvider == null) {
+			excludeListItemProvider = new ExcludeListItemProvider(this);
+		}
+
+		return excludeListItemProvider;
+	}
+
+	/**
+	 * This creates an adapter for a {@link org.eclipse.jst.j2ee.internal.internal.ejb.MessageDriven}.
+	 */
+	@Override
+	public Adapter createMessageDrivenAdapter() {
+		if (messageDrivenItemProvider == null) {
+			messageDrivenItemProvider = new MessageDrivenItemProvider(this);
+		}
+
+		return messageDrivenItemProvider;
+	}
+
+	/**
+	 * This creates an adapter for a {@link org.eclipse.jst.j2ee.internal.internal.ejb.MessageDrivenDestination}.
+	 */
+	@Override
+	public Adapter createMessageDrivenDestinationAdapter() {
+		if (messageDrivenDestinationItemProvider == null) {
+			messageDrivenDestinationItemProvider = new MessageDrivenDestinationItemProvider(this);
+		}
+
+		return messageDrivenDestinationItemProvider;
+	}
+
+	/**
+	 * This creates an adapter for a {@link org.eclipse.jst.j2ee.internal.internal.ejb.MethodElement}.
+	 */
+	@Override
+	public Adapter createMethodElementAdapter() {
+		if (methodElementItemProvider == null) {
+			methodElementItemProvider = new MethodElementItemProvider(this);
+		}
+
+		return methodElementItemProvider;
+	}
+
+	/**
+	 * This creates an adapter for a {@link org.eclipse.jst.j2ee.internal.internal.ejb.MethodPermission}.
+	 */
+	@Override
+	public Adapter createMethodPermissionAdapter() {
+		if (methodPermissionItemProvider == null) {
+			methodPermissionItemProvider = new MethodPermissionItemProvider(this);
+		}
+
+		return methodPermissionItemProvider;
+	}
+
+	/**
+	 * This creates an adapter for a {@link org.eclipse.jst.j2ee.internal.internal.ejb.MethodTransaction}.
+	 */
+	@Override
+	public Adapter createMethodTransactionAdapter() {
+		if (methodTransactionItemProvider == null) {
+			methodTransactionItemProvider = new MethodTransactionItemProvider(this);
+		}
+
+		return methodTransactionItemProvider;
+	}
+
+	/**
+	 * This creates an adapter for a {@link org.eclipse.jst.j2ee.internal.internal.ejb.Query}.
+	 */
+	@Override
+	public Adapter createQueryAdapter() {
+		if (queryItemProvider == null) {
+			queryItemProvider = new QueryItemProvider(this);
+		}
+
+		return queryItemProvider;
+	}
+
+	/**
+	 * This creates an adapter for a {@link org.eclipse.jst.j2ee.internal.internal.ejb.QueryMethod}.
+	 */
+	@Override
+	public Adapter createQueryMethodAdapter() {
+		if (queryMethodItemProvider == null) {
+			queryMethodItemProvider = new QueryMethodItemProvider(this);
+		}
+
+		return queryMethodItemProvider;
+	}
+
+	/**
+	 * This keeps track of the one adapter used for all
+	 * {@link org.eclipse.jst.j2ee.internal.internal.ejb.ActivationConfigProperty}instances. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	protected ActivationConfigPropertyItemProvider activationConfigPropertyItemProvider;
+
+	/**
+	 * This creates an adapter for a {@link org.eclipse.jst.j2ee.internal.internal.ejb.ActivationConfigProperty}. <!--
+	 * begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public Adapter createActivationConfigPropertyAdapter() {
+		if (activationConfigPropertyItemProvider == null) {
+			activationConfigPropertyItemProvider = new ActivationConfigPropertyItemProvider(this);
+		}
+
+		return activationConfigPropertyItemProvider;
+	}
+
+	/**
+	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.j2ee.internal.internal.ejb.ActivationConfig}
+	 * instances. <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	protected ActivationConfigItemProvider activationConfigItemProvider;
+
+	/**
+	 * This creates an adapter for a {@link org.eclipse.jst.j2ee.internal.internal.ejb.ActivationConfig}. <!--
+	 * begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public Adapter createActivationConfigAdapter() {
+		if (activationConfigItemProvider == null) {
+			activationConfigItemProvider = new ActivationConfigItemProvider(this);
+		}
+
+		return activationConfigItemProvider;
+	}
+
+	/**
+	 * This creates an adapter for a {@link org.eclipse.jst.j2ee.internal.internal.ejb.Relationships}.
+	 */
+	@Override
+	public Adapter createRelationshipsAdapter() {
+		if (relationshipsItemProvider == null) {
+			relationshipsItemProvider = new RelationshipsItemProvider(this);
+		}
+
+		return relationshipsItemProvider;
+	}
+
+	/**
+	 * This creates an adapter for a {@link org.eclipse.jst.j2ee.internal.internal.ejb.RoleSource}.
+	 */
+	@Override
+	public Adapter createRoleSourceAdapter() {
+		if (roleSourceItemProvider == null) {
+			roleSourceItemProvider = new RoleSourceItemProvider(this);
+		}
+
+		return roleSourceItemProvider;
+	}
+
+	/**
+	 * This creates an adapter for a {@link org.eclipse.jst.j2ee.internal.internal.ejb.Session}.
+	 */
+	@Override
+	public Adapter createSessionAdapter() {
+		if (sessionItemProvider == null) {
+			sessionItemProvider = new SessionItemProvider(this);
+		}
+
+		return sessionItemProvider;
+	}
+
+	public void dispose() {
+		disposable.dispose();
+	}
+
+	/**
+	 * This returns the root adapter factory that contains this factory.
+	 */
+	public ComposeableAdapterFactory getRootAdapterFactory() {
+		return parentAdapterFactory == null ? this : parentAdapterFactory.getRootAdapterFactory();
+	}
+
+	@Override
+	public boolean isFactoryForType(Object type) {
+		return super.isFactoryForType(type) || supportedTypes.contains(type);
+	}
+
+	/**
+	 * This removes a listener.
+	 * 
+	 * @generated
+	 */
+	public void removeListener(INotifyChangedListener notifyChangedListener) {
+		changeNotifier.removeListener(notifyChangedListener);
+	}
+
+	/**
+	 * This delegates to {@link #changeNotifier}and to {@link #parentAdapterFactory}. <!--
+	 * begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public void fireNotifyChanged(Notification notification) {
+		changeNotifier.fireNotifyChanged(notification);
+
+		if (parentAdapterFactory != null) {
+			parentAdapterFactory.fireNotifyChanged(notification);
+		}
+	}
+
+	/**
+	 * This sets the composed adapter factory that contains this factory.
+	 */
+	public void setParentAdapterFactory(ComposedAdapterFactory parentAdapterFactory) {
+		this.parentAdapterFactory = parentAdapterFactory;
+	}
+
+	protected void adaptContainerIfNecessary(EObject eObj, Object type) {
+		if (eObj == null || eObj.eContainer() == null)
+			return;
+		EClass theEClass = eObj.eClass();
+		if (theEClass.eContainer() == modelPackage) {
+			switch (theEClass.getClassifierID()) {
+				case EjbPackage.CMP_ATTRIBUTE :
+					adapt(eObj.eContainer(), type);
+					break;
+			}
+		}
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/EnterpriseBeanItemProvider.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/EnterpriseBeanItemProvider.java
new file mode 100644
index 0000000..bf6110e
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/EnterpriseBeanItemProvider.java
@@ -0,0 +1,297 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.internal.ejb.provider;
+
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.util.ResourceLocator;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
+import org.eclipse.jst.j2ee.common.CommonFactory;
+import org.eclipse.jst.j2ee.common.CommonPackage;
+import org.eclipse.jst.j2ee.common.internal.provider.JNDIEnvRefsGroupItemProvider;
+import org.eclipse.jst.j2ee.ejb.EjbPackage;
+import org.eclipse.jst.j2ee.ejb.EnterpriseBean;
+import org.eclipse.jst.j2ee.ejb.internal.plugin.EjbPlugin;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
+import org.eclipse.jst.j2ee.internal.webservices.WSDLServiceExtManager;
+import org.eclipse.jst.j2ee.internal.webservices.WSDLServiceHelper;
+
+/**
+ * This is the item provider adpater for a {@link org.eclipse.jst.j2ee.internal.internal.ejb.EnterpriseBean}object. <!--
+ * begin-user-doc --> <!-- end-user-doc -->
+ * 
+ * @generated
+ */
+public class EnterpriseBeanItemProvider extends JNDIEnvRefsGroupItemProvider {
+	/**
+	 * This constructs an instance from a factory and a notifier. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	public EnterpriseBeanItemProvider(AdapterFactory adapterFactory) {
+		super(adapterFactory);
+	}
+
+	/**
+	 * This returns the property descriptors for the adapted class. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 *  
+	 */
+	@Override
+	public List getPropertyDescriptors(Object object) {
+		if (itemPropertyDescriptors == null) {
+			super.getPropertyDescriptors(object);
+
+			addNamePropertyDescriptor(object);
+			//addEjbClassPropertyDescriptor(object);
+			//addHomeInterfacePropertyDescriptor(object);
+			//addRemoteInterfacePropertyDescriptor(object);
+			//addLocalHomeInterfacePropertyDescriptor(object);
+			//addLocalInterfacePropertyDescriptor(object);
+		}
+		return itemPropertyDescriptors;
+	}
+
+	/**
+	 * This adds a property descriptor for the Name feature. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 *  
+	 */
+	protected void addNamePropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), EJBProviderLibrariesResourceHandler.getString("_UI_EnterpriseBean_name_feature"), //$NON-NLS-1$
+					EJBProviderLibrariesResourceHandler.getString("_UI_EnterpriseBean_name_feature_desc"), //$NON-NLS-1$ 
+					EjbPackage.eINSTANCE.getEnterpriseBean_Name(), false, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE));
+	}
+
+	/**
+	 * This adds a property descriptor for the Ejb Class feature. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	protected void addEjbClassPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), getString("_UI_EnterpriseBean_ejbClass_feature"), //$NON-NLS-1$
+					getString("_UI_PropertyDescriptor_description", "_UI_EnterpriseBean_ejbClass_feature", "_UI_EnterpriseBean_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+					EjbPackage.eINSTANCE.getEnterpriseBean_EjbClass(), true));
+	}
+
+	/**
+	 * This adds a property descriptor for the Home Interface feature. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	protected void addHomeInterfacePropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), getString("_UI_EnterpriseBean_homeInterface_feature"), //$NON-NLS-1$
+					getString("_UI_PropertyDescriptor_description", "_UI_EnterpriseBean_homeInterface_feature", "_UI_EnterpriseBean_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+					EjbPackage.eINSTANCE.getEnterpriseBean_HomeInterface(), true));
+	}
+
+	/**
+	 * This adds a property descriptor for the Remote Interface feature. <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	protected void addRemoteInterfacePropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), getString("_UI_EnterpriseBean_remoteInterface_feature"), //$NON-NLS-1$
+					getString("_UI_PropertyDescriptor_description", "_UI_EnterpriseBean_remoteInterface_feature", "_UI_EnterpriseBean_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+					EjbPackage.eINSTANCE.getEnterpriseBean_RemoteInterface(), true));
+	}
+
+	/**
+	 * This adds a property descriptor for the Local Home Interface feature. <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	protected void addLocalHomeInterfacePropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), getString("_UI_EnterpriseBean_localHomeInterface_feature"), //$NON-NLS-1$
+					getString("_UI_PropertyDescriptor_description", "_UI_EnterpriseBean_localHomeInterface_feature", "_UI_EnterpriseBean_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+					EjbPackage.eINSTANCE.getEnterpriseBean_LocalHomeInterface(), true));
+	}
+
+	/**
+	 * This adds a property descriptor for the Local Interface feature. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	protected void addLocalInterfacePropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), getString("_UI_EnterpriseBean_localInterface_feature"), //$NON-NLS-1$
+					getString("_UI_PropertyDescriptor_description", "_UI_EnterpriseBean_localInterface_feature", "_UI_EnterpriseBean_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+					EjbPackage.eINSTANCE.getEnterpriseBean_LocalInterface(), true));
+	}
+
+	/**
+	 * This specifies how to implement {@link #getChildren}and
+	 * {@link org.eclipse.emf.edit.command.AddCommand}and
+	 * {@link org.eclipse.emf.edit.command.RemoveCommand}support in {@link #createCommand}. <!--
+	 * begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public Collection getChildrenReferences(Object object) {
+		if (childrenReferences == null) {
+			super.getChildrenReferences(object);
+            childrenReferences.add(EjbPackage.eINSTANCE.getEnterpriseBean_SecurityRoleRefs());
+            childrenReferences.add(EjbPackage.eINSTANCE.getEnterpriseBean_SecurityIdentity());
+		}
+		return childrenReferences;
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	protected EReference getChildReference(Object object, Object child) {
+		// Check the type of the specified child object and return the proper feature to use for
+		// adding (see {@link AddCommand}) it as a child.
+
+		return super.getChildReference(object, child);
+	}
+
+
+	/**
+	 * This handles notification by calling {@link #fireNotifyChanged fireNotifyChanged}. <!--
+	 * begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public void notifyChanged(Notification notification) {
+		switch (notification.getFeatureID(EnterpriseBean.class)) {
+			case EjbPackage.ENTERPRISE_BEAN__EJB_CLASS :
+			case EjbPackage.ENTERPRISE_BEAN__HOME_INTERFACE :
+			case EjbPackage.ENTERPRISE_BEAN__LOCAL_HOME_INTERFACE :
+			case EjbPackage.ENTERPRISE_BEAN__LOCAL_INTERFACE :
+			case EjbPackage.ENTERPRISE_BEAN__REMOTE_INTERFACE :
+			case EjbPackage.ENTERPRISE_BEAN__NAME :
+			case EjbPackage.ENTERPRISE_BEAN__SECURITY_ROLE_REFS :
+			case EjbPackage.ENTERPRISE_BEAN__SECURITY_IDENTITY : {
+				fireNotifyChanged(notification);
+				return;
+			}
+		}
+		super.notifyChanged(notification);
+	}
+
+	/**
+	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
+	 * describing all of the children that can be created under this object. <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
+		super.collectNewChildDescriptors(newChildDescriptors, object);
+
+		newChildDescriptors.add(createChildParameter(EjbPackage.eINSTANCE.getEnterpriseBean_SecurityRoleRefs(), CommonFactory.eINSTANCE.createSecurityRoleRef()));
+
+		newChildDescriptors.add(createChildParameter(EjbPackage.eINSTANCE.getEnterpriseBean_SecurityIdentity(), CommonFactory.eINSTANCE.createSecurityIdentity()));
+
+		newChildDescriptors.add(createChildParameter(EjbPackage.eINSTANCE.getEnterpriseBean_SecurityIdentity(), CommonFactory.eINSTANCE.createRunAsSpecifiedIdentity()));
+
+		newChildDescriptors.add(createChildParameter(EjbPackage.eINSTANCE.getEnterpriseBean_SecurityIdentity(), CommonFactory.eINSTANCE.createUseCallerIdentity()));
+	}
+
+	/**
+	 * This returns the label text for {@link org.eclipse.emf.edit.command.CreateChildCommand}.
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public String getCreateChildText(Object owner, Object feature, Object child, Collection selection) {
+		boolean qualify = feature == CommonPackage.eINSTANCE.getJNDIEnvRefsGroup_EjbRefs() || feature == CommonPackage.eINSTANCE.getJNDIEnvRefsGroup_EjbLocalRefs();
+		return getString(qualify ? "_UI_CreateChild_text2" : "_UI_CreateChild_text", //$NON-NLS-1$ //$NON-NLS-2$
+					new Object[]{getTypeText(child), getFeatureText(feature), getTypeText(owner)});
+	}
+
+	/**
+	 * Return the resource locator for this item provider's resources. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public ResourceLocator getResourceLocator() {
+		return J2EEPlugin.getDefault();
+	}
+
+	public static String getEJBName(Object object) {
+		String name = ((EnterpriseBean) object).getDisplayName();
+		if (name == null || name.equals("")) //$NON-NLS-1$
+			name = ((EnterpriseBean) object).getName();
+		return name == null ? "<<??>>" : name; //$NON-NLS-1$
+	}
+
+	/**
+	 * This returns EnterpriseBean.gif.
+	 */
+	@Override
+	public Object getImage(Object object) {
+		return J2EEPlugin.getPlugin().getImage("bmpEntity_obj"); //$NON-NLS-1$
+	}
+
+	@Override
+	public String getText(Object object) {
+		return getEJBName(object);
+	}
+
+	public Collection getChildrenSuper(Object object) {
+		Collection myChildren = super.getChildren(object);
+		EnterpriseBean bean = (EnterpriseBean) object;
+		if (bean == null || bean.getEjbJar() == null)
+			return myChildren;
+		try {
+			if (bean.getEjbJar().getJ2EEVersionID() <= J2EEVersionConstants.J2EE_1_3_ID) {
+				WSDLServiceHelper serviceHelper = WSDLServiceExtManager.getServiceHelper();
+				myChildren.addAll(serviceHelper.get13ServiceRefs(bean));
+			}
+		} catch (RuntimeException re) {
+			EjbPlugin.logError(re);
+		}
+		return myChildren;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildren(java.lang.Object)
+	 */
+	@Override
+	public Collection getChildren(Object object) {
+		Collection myChildren = super.getChildren(object);
+		EnterpriseBean bean = (EnterpriseBean) object;
+		try {
+			if (bean.getEjbJar().getJ2EEVersionID() <= J2EEVersionConstants.J2EE_1_3_ID) {
+				WSDLServiceHelper serviceHelper = WSDLServiceExtManager.getServiceHelper();
+				myChildren.addAll(serviceHelper.get13ServiceRefs(bean));
+			}
+		} catch (RuntimeException re) {
+			EjbPlugin.logError(re);
+		}
+		return myChildren;
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/EntityItemProvider.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/EntityItemProvider.java
new file mode 100644
index 0000000..3e33eb4
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/EntityItemProvider.java
@@ -0,0 +1,174 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.internal.ejb.provider;
+
+
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.util.ResourceLocator;
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
+import org.eclipse.jst.j2ee.common.CommonPackage;
+import org.eclipse.jst.j2ee.ejb.EjbPackage;
+import org.eclipse.jst.j2ee.ejb.Entity;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
+
+
+/**
+ * This is the item provider adpater for a {@link org.eclipse.jst.j2ee.internal.internal.ejb.Entity}object.
+ */
+public class EntityItemProvider extends EnterpriseBeanItemProvider {
+	/**
+	 * This constructs an instance from a factory and a notifier.
+	 */
+	public EntityItemProvider(AdapterFactory adapterFactory) {
+		super(adapterFactory);
+	}
+
+	/**
+	 * This returns Entity.gif.
+	 */
+	@Override
+	public Object getImage(Object object) {
+		return J2EEPlugin.getPlugin().getImage("bmpEntity_obj");//$NON-NLS-1$
+	}
+
+	/**
+	 * This returns the label text for the adapted class. <!-- begin-user-doc --> Don't remove this
+	 * method or it will be regenerated. <!-- end-user-doc -->
+	 *  
+	 */
+	@Override
+	public String getText(Object object) {
+		return super.getText(object);
+	}
+
+	/**
+	 * This handles notification by calling {@link #fireNotifyChanged fireNotifyChanged}. <!--
+	 * begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public void notifyChanged(Notification notification) {
+		switch (notification.getFeatureID(Entity.class)) {
+			case EjbPackage.ENTITY__REENTRANT : {
+				fireNotifyChanged(notification);
+				return;
+			}
+		}
+		super.notifyChanged(notification);
+	}
+
+	/**
+	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
+	 * describing all of the children that can be created under this object. <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
+		super.collectNewChildDescriptors(newChildDescriptors, object);
+	}
+
+	/**
+	 * This returns the label text for {@link org.eclipse.emf.edit.command.CreateChildCommand}.
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public String getCreateChildText(Object owner, Object feature, Object child, Collection selection) {
+		boolean qualify = feature == CommonPackage.eINSTANCE.getJNDIEnvRefsGroup_EjbRefs() || feature == CommonPackage.eINSTANCE.getJNDIEnvRefsGroup_EjbLocalRefs();
+		return getString(qualify ? "_UI_CreateChild_text2" : "_UI_CreateChild_text", //$NON-NLS-1$ //$NON-NLS-2$
+					new Object[]{getTypeText(child), getFeatureText(feature), getTypeText(owner)});
+	}
+
+	/**
+	 * Return the resource locator for this item provider's resources. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public ResourceLocator getResourceLocator() {
+		return J2EEPlugin.getDefault();
+	}
+
+	/**
+	 * This returns the parent of the Entity.
+	 */
+	@Override
+	public Object getParent(Object object) {
+		return super.getParent(object);
+	}
+
+	/**
+	 * This returns the property descriptors for the adapted class.
+	 */
+	@Override
+	public List getPropertyDescriptors(Object object) {
+		if (itemPropertyDescriptors == null) {
+			super.getPropertyDescriptors(object);
+
+			addReentrantPropertyDescriptor(object);
+			//addPrimaryKeyPropertyDescriptor(object);
+		}
+		return itemPropertyDescriptors;
+	}
+
+	/**
+	 * This adds a property descriptor for the Reentrant feature. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 *  
+	 */
+	protected void addReentrantPropertyDescriptor(Object object) {
+		EjbPackage pkg = EjbPackage.eINSTANCE;
+		itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), EJBProviderLibrariesResourceHandler.getString("IsReentrant_UI_"), //$NON-NLS-1$ = "IsReentrant"
+					EJBProviderLibrariesResourceHandler.getString("The_isReentrant_property_UI_"), //$NON-NLS-1$ = "The isReentrant property"
+					pkg.getEntity_Reentrant(), true, ItemPropertyDescriptor.BOOLEAN_VALUE_IMAGE));
+
+	}
+
+	/**
+	 * This adds a property descriptor for the Primary Key feature. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 *  
+	 */
+	protected void addPrimaryKeyPropertyDescriptor(Object object) {
+		EjbPackage pkg = EjbPackage.eINSTANCE;
+		itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), EJBProviderLibrariesResourceHandler.getString("PrimaryKey_UI_"), //$NON-NLS-1$ = "PrimaryKey"
+					EJBProviderLibrariesResourceHandler.getString("The_primaryKey_property_UI_"), //$NON-NLS-1$ = "The primaryKey property"
+					pkg.getEntity_PrimaryKey(), false));
+	}
+
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildrenReferences(java.lang.Object)
+	 */
+	@Override
+	public Collection getChildrenReferences(Object object) {
+		if (childrenReferences == null) {
+			childrenReferences = new ArrayList();
+			childrenReferences.addAll(super.getChildrenReferences(object));
+//			childrenReferences.add(EjbPackage.eINSTANCE.getEntity_Reentrant());
+		}
+		return childrenReferences;
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/ExcludeListItemProvider.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/ExcludeListItemProvider.java
new file mode 100644
index 0000000..a8b0670
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/ExcludeListItemProvider.java
@@ -0,0 +1,213 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.internal.ejb.provider;
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.util.ResourceLocator;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.edit.command.AddCommand;
+import org.eclipse.emf.edit.command.RemoveCommand;
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
+import org.eclipse.jst.j2ee.common.CommonFactory;
+import org.eclipse.jst.j2ee.ejb.EjbFactory;
+import org.eclipse.jst.j2ee.ejb.EjbPackage;
+import org.eclipse.jst.j2ee.ejb.ExcludeList;
+import org.eclipse.jst.j2ee.ejb.MethodElement;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
+import org.eclipse.jst.j2ee.webservice.wscommon.WscommonFactory;
+
+
+/**
+ * This is the item provider adpater for a {@link org.eclipse.jst.j2ee.internal.internal.ejb.ExcludeList}object.
+ */
+public class ExcludeListItemProvider extends EjbItemProviderAdapter{
+	/**
+	 * This constructs an instance from a factory and a notifier.
+	 */
+	public ExcludeListItemProvider(AdapterFactory adapterFactory) {
+		super(adapterFactory);
+	}
+
+	/**
+	 * This creates a new child for {@link org.eclipse.jst.j2ee.internal.internal.ejb.command.CreateChildCommand}.
+	 */
+	@Override
+	public Object createChild(Object object) {
+		// TODO: check that this is what you want.
+		MethodElement child = EjbFactory.eINSTANCE.createMethodElement();
+
+		// TODO: initialize child here...
+
+		return child;
+	}
+
+	/**
+	 * This specifies how to implement {@link #getChildren}and {@link AddCommand}and
+	 * {@link RemoveCommand}support in {@link #createCommand}.
+	 */
+	@Override
+	public Collection getChildrenReferences(Object object) {
+		if (childrenReferences == null) {
+			super.getChildrenReferences(object);
+			childrenReferences.add(EjbPackage.eINSTANCE.getExcludeList_MethodElements());
+		}
+		return childrenReferences;
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	protected EReference getChildReference(Object object, Object child) {
+		// Check the type of the specified child object and return the proper feature to use for
+		// adding (see {@link AddCommand}) it as a child.
+
+		return super.getChildReference(object, child);
+	}
+
+
+	/**
+	 * This returns the image for {@link org.eclipse.jst.j2ee.internal.internal.ejb.command.CreateChildCommand}.
+	 */
+	@Override
+	public Object getCreateChildImage(Object object) {
+		EObject refObject = (EObject) object;
+		return J2EEPlugin.getPlugin().getImage(refObject.eClass().getName() + EJBProviderLibrariesResourceHandler.getString("CreateMethodElement_1")); //$NON-NLS-1$
+	}
+
+	/**
+	 * This returns the label for {@link org.eclipse.jst.j2ee.internal.internal.ejb.command.CreateChildCommand}.
+	 */
+	@Override
+	public String getCreateChildText(Object object) {
+		return EJBProviderLibrariesResourceHandler.getString("Create_MethodElement_2"); //$NON-NLS-1$
+	}
+
+	/**
+	 * This returns the help text for {@link org.eclipse.jst.j2ee.internal.internal.ejb.command.CreateChildCommand}.
+	 */
+	@Override
+	public String getCreateChildToolTipText(Object object) {
+		EObject refObject = (EObject) object;
+		return EJBProviderLibrariesResourceHandler.getString("Create_a_child_of_type_MethodElement_for_the_selected__3") + refObject.eClass().getName() + EJBProviderLibrariesResourceHandler.getString("_4"); //$NON-NLS-1$ //$NON-NLS-2$
+	}
+
+	/**
+	 * This returns ExcludeList.gif.
+	 */
+	@Override
+	public Object getImage(Object object) {
+		return J2EEPlugin.getPlugin().getImage("methPermission_obj"); //$NON-NLS-1$
+	}
+
+	/**
+	 * This returns the parent of the ExcludeList.
+	 */
+	@Override
+	public Object getParent(Object object) {
+		return ((EObject) object).eContainer();
+	}
+
+	/**
+	 * This returns the property descriptors for the adapted class.
+	 */
+	@Override
+	public List getPropertyDescriptors(Object object) {
+		if (itemPropertyDescriptors == null) {
+			super.getPropertyDescriptors(object);
+
+			EjbPackage pkg = EjbPackage.eINSTANCE;
+
+			// This is for the description feature.
+			//
+			itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), EJBProviderLibrariesResourceHandler.getString("Description_6"), //$NON-NLS-1$
+						EJBProviderLibrariesResourceHandler.getString("The_description_property_of_the_exclude_list_7"), //$NON-NLS-1$
+						pkg.getExcludeList_Description(), true, ItemPropertyDescriptor.TEXT_VALUE_IMAGE));
+
+		}
+		return itemPropertyDescriptors;
+	}
+
+	/**
+	 * This adds a property descriptor for the Description feature. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	protected void addDescriptionPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), getString("_UI_ExcludeList_description_feature"), //$NON-NLS-1$
+					getString("_UI_PropertyDescriptor_description", "_UI_ExcludeList_description_feature", "_UI_ExcludeList_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+					EjbPackage.eINSTANCE.getExcludeList_Description(), true, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE));
+	}
+
+	@Override
+	public String getText(Object object) {
+		return EJBProviderLibrariesResourceHandler.getString("ExcludeList__8"); //$NON-NLS-1$
+	}
+
+	/**
+	 * This handles notification by calling {@link #fireNotifyChanged fireNotifyChanged}. <!--
+	 * begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public void notifyChanged(Notification notification) {
+		switch (notification.getFeatureID(ExcludeList.class)) {
+			case EjbPackage.EXCLUDE_LIST__DESCRIPTION :
+			case EjbPackage.EXCLUDE_LIST__METHOD_ELEMENTS :
+			case EjbPackage.EXCLUDE_LIST__DESCRIPTIONS : {
+				fireNotifyChanged(notification);
+				return;
+			}
+		}
+		super.notifyChanged(notification);
+	}
+
+	/**
+	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
+	 * describing all of the children that can be created under this object. <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
+		super.collectNewChildDescriptors(newChildDescriptors, object);
+
+		newChildDescriptors.add(createChildParameter(EjbPackage.eINSTANCE.getExcludeList_MethodElements(), EjbFactory.eINSTANCE.createMethodElement()));
+
+		newChildDescriptors.add(createChildParameter(EjbPackage.eINSTANCE.getExcludeList_MethodElements(), EjbFactory.eINSTANCE.createQueryMethod()));
+
+		newChildDescriptors.add(createChildParameter(EjbPackage.eINSTANCE.getExcludeList_Descriptions(), CommonFactory.eINSTANCE.createDescription()));
+
+		newChildDescriptors.add(createChildParameter(EjbPackage.eINSTANCE.getExcludeList_Descriptions(), WscommonFactory.eINSTANCE.createDescriptionType()));
+	}
+
+	/**
+	 * Return the resource locator for this item provider's resources. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public ResourceLocator getResourceLocator() {
+		return J2EEPlugin.getDefault();
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/J2EENotificationImpl.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/J2EENotificationImpl.java
new file mode 100644
index 0000000..1d5915d
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/J2EENotificationImpl.java
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2004 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.internal.ejb.provider;
+
+import org.eclipse.emf.common.notify.impl.NotificationImpl;
+
+/**
+ * @author dfholttp
+ * 
+ * To change this generated comment edit the template variable "typecomment":
+ * Window>Preferences>Java>Templates. To enable and disable the creation of type comments go to
+ * Window>Preferences>Java>Code Generation.
+ */
+public class J2EENotificationImpl extends NotificationImpl {
+	Object feature = null;
+	Object notifier = null;
+
+	/**
+	 * Constructor for EJBNotificationImpl.
+	 */
+	public J2EENotificationImpl(int eventType, Object oldValue, Object newValue) {
+		super(eventType, oldValue, newValue);
+	}
+
+	/**
+	 * Constructor for EJBNotificationImpl.
+	 */
+	public J2EENotificationImpl(int eventType, Object oldValue, Object newValue, boolean isSetChange) {
+		super(eventType, oldValue, newValue, isSetChange);
+	}
+
+	/**
+	 * Constructor for EJBNotificationImpl.
+	 */
+	public J2EENotificationImpl(int eventType, Object oldValue, Object newValue, int position) {
+		super(eventType, oldValue, newValue, position);
+	}
+
+	/**
+	 * Constructor for full EJBNOtificationImpl
+	 */
+	public J2EENotificationImpl(Object notifier, int eventType, Object oldValue, Object newValue, int position, Object feature) {
+		super(eventType, oldValue, newValue, position);
+		this.notifier = notifier;
+		this.feature = feature;
+	}
+
+	/**
+	 * Constructor for full EJBNOtificationImpl
+	 */
+	public J2EENotificationImpl(Object notifier, int eventType, Object oldValue, Object newValue, int position) {
+		super(eventType, oldValue, newValue, position);
+		this.notifier = notifier;
+	}
+
+	@Override
+	public Object getNotifier() {
+		return notifier;
+	}
+
+	@Override
+	public Object getFeature() {
+		return feature;
+	}
+
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/MessageDrivenDestinationItemProvider.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/MessageDrivenDestinationItemProvider.java
new file mode 100644
index 0000000..8966fef
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/MessageDrivenDestinationItemProvider.java
@@ -0,0 +1,170 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.internal.ejb.provider;
+
+
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.util.ResourceLocator;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
+import org.eclipse.jst.j2ee.ejb.EjbPackage;
+import org.eclipse.jst.j2ee.ejb.MessageDrivenDestination;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
+
+
+/**
+ * This is the item provider adpater for a {@link org.eclipse.jst.j2ee.internal.internal.ejb.MessageDrivenDestination}
+ * object.
+ */
+public class MessageDrivenDestinationItemProvider extends EjbItemProviderAdapter{
+	/**
+	 * This constructs an instance from a factory and a notifier.
+	 */
+	public MessageDrivenDestinationItemProvider(AdapterFactory adapterFactory) {
+		super(adapterFactory);
+	}
+
+	/**
+	 * This returns MessageDrivenDestination.gif.
+	 */
+	@Override
+	public Object getImage(Object object) {
+		String imageString = null;
+		//  	MessageDrivenDestination messageDrivenDestination = ((MessageDrivenDestination)object);
+		//    if (messageDrivenDestination.getType().getValue() == 0)
+		//this will change when the images are finished being designed
+		//        imageString = "msgdrivendestination_obj"; //$NON-NLS-1$
+		//    else
+		//        imageString ="msgdrivendestination_obj"; //$NON-NLS-1$
+		imageString = "msgdrivendestination_obj"; //$NON-NLS-1$
+		return J2EEPlugin.getPlugin().getImage(imageString); 
+	}
+
+	/**
+	 * This returns the parent of the MessageDrivenDestination.
+	 */
+	@Override
+	public Object getParent(Object object) {
+		return ((EObject) object).eContainer();
+	}
+
+	/**
+	 * This returns the property descriptors for the adapted class.
+	 */
+	@Override
+	public List getPropertyDescriptors(Object object) {
+		if (itemPropertyDescriptors == null) {
+			super.getPropertyDescriptors(object);
+
+			EjbPackage pkg = EjbPackage.eINSTANCE;
+
+			// This is for the type feature.
+			//
+			itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), EJBProviderLibrariesResourceHandler.getString("Type_2"), //$NON-NLS-1$
+						EJBProviderLibrariesResourceHandler.getString("The_type_property_of_the_message_driven_destination_3"), //$NON-NLS-1$
+						pkg.getMessageDrivenDestination_Type(), true, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE));
+
+			// This is for the subscriptionDurability feature.
+			//
+			itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), EJBProviderLibrariesResourceHandler.getString("Subscription_Durability_4"), //$NON-NLS-1$
+						EJBProviderLibrariesResourceHandler.getString("The_subscription_durability_property_of_the_message_driven_destination_5"), //$NON-NLS-1$
+						pkg.getMessageDrivenDestination_SubscriptionDurability(), true, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE));
+
+			// This is for the bean feature.
+			//
+			itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), EJBProviderLibrariesResourceHandler.getString("Bean_6"), //$NON-NLS-1$
+						EJBProviderLibrariesResourceHandler.getString("The_bean_of_the_message_driven_destination_7"), //$NON-NLS-1$
+						pkg.getMessageDrivenDestination_Bean(), false));
+
+		}
+		return itemPropertyDescriptors;
+	}
+
+	/**
+	 * This adds a property descriptor for the Type feature. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	protected void addTypePropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), getString("_UI_MessageDrivenDestination_type_feature"), //$NON-NLS-1$
+					getString("_UI_PropertyDescriptor_description", "_UI_MessageDrivenDestination_type_feature", "_UI_MessageDrivenDestination_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+					EjbPackage.eINSTANCE.getMessageDrivenDestination_Type(), true, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE));
+	}
+
+	/**
+	 * This adds a property descriptor for the Subscription Durability feature. <!-- begin-user-doc
+	 * --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	protected void addSubscriptionDurabilityPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), getString("_UI_MessageDrivenDestination_subscriptionDurability_feature"), //$NON-NLS-1$
+					getString("_UI_PropertyDescriptor_description", "_UI_MessageDrivenDestination_subscriptionDurability_feature", "_UI_MessageDrivenDestination_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+					EjbPackage.eINSTANCE.getMessageDrivenDestination_SubscriptionDurability(), true, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE));
+	}
+
+
+	@Override
+	public String getText(Object object) {
+		MessageDrivenDestination messageDrivenDestination = ((MessageDrivenDestination) object);
+		if (messageDrivenDestination.getType().getName() != null)
+			return "Destination type: " + messageDrivenDestination.getType().getName(); //$NON-NLS-1$
+		return "?>>?"; //$NON-NLS-1$
+	}
+
+	/**
+	 * This handles notification by calling {@link #fireNotifyChanged fireNotifyChanged}. <!--
+	 * begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public void notifyChanged(Notification notification) {
+		switch (notification.getFeatureID(MessageDrivenDestination.class)) {
+			case EjbPackage.MESSAGE_DRIVEN_DESTINATION__TYPE :
+			case EjbPackage.MESSAGE_DRIVEN_DESTINATION__SUBSCRIPTION_DURABILITY : {
+				fireNotifyChanged(notification);
+				return;
+			}
+		}
+		super.notifyChanged(notification);
+	}
+
+	/**
+	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
+	 * describing all of the children that can be created under this object. <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
+		super.collectNewChildDescriptors(newChildDescriptors, object);
+	}
+
+	/**
+	 * Return the resource locator for this item provider's resources. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public ResourceLocator getResourceLocator() {
+		return J2EEPlugin.getDefault();
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/MessageDrivenItemProvider.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/MessageDrivenItemProvider.java
new file mode 100644
index 0000000..7e12ef1
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/MessageDrivenItemProvider.java
@@ -0,0 +1,300 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.internal.ejb.provider;
+
+
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.util.ResourceLocator;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.edit.command.AddCommand;
+import org.eclipse.emf.edit.command.RemoveCommand;
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
+import org.eclipse.jst.j2ee.common.CommonPackage;
+import org.eclipse.jst.j2ee.ejb.CMPAttribute;
+import org.eclipse.jst.j2ee.ejb.EjbFactory;
+import org.eclipse.jst.j2ee.ejb.EjbPackage;
+import org.eclipse.jst.j2ee.ejb.MessageDriven;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
+
+
+
+/**
+ * This is the item provider adpater for a {@link org.eclipse.jst.j2ee.internal.internal.ejb.MessageDriven}object.
+ */
+public class MessageDrivenItemProvider extends EnterpriseBeanItemProvider {
+	/**
+	 * This constructs an instance from a factory and a notifier.
+	 */
+	public MessageDrivenItemProvider(AdapterFactory adapterFactory) {
+		super(adapterFactory);
+	}
+
+	/**
+	 * This creates a new child for {@link org.eclipse.jst.j2ee.internal.internal.ejb.command.CreateChildCommand}.
+	 */
+	public Object createChild(Object object) {
+		// TODO: check that this is what you want.
+		CMPAttribute child = EjbFactory.eINSTANCE.createCMPAttribute();
+
+		// TODO: initialize child here...
+
+		return child;
+	}
+
+	/**
+	 * This specifies how to implement {@link #getChildren}and {@link AddCommand}and
+	 * {@link RemoveCommand}support in {@link #createCommand}.
+	 */
+	@Override
+	public Collection getChildrenReferences(Object object) {
+		if (childrenReferences == null) {
+			childrenReferences = (List) super.getChildrenReferences(object);
+			//childrenReferences.add(EjbPackage.eINSTANCE.getMessageDriven_Destination());
+			//childrenReferences.add(EjbPackage.eINSTANCE.getMessageDriven_ActivationConfig());
+			//childrenReferences.add(EjbPackage.eINSTANCE.getActivationConfig_ConfigProperties());
+
+		}
+		return childrenReferences;
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	protected EReference getChildReference(Object object, Object child) {
+		// Check the type of the specified child object and return the proper feature to use for
+		// adding (see {@link AddCommand}) it as a child.
+
+		return super.getChildReference(object, child);
+	}
+
+
+	/**
+	 * This returns the image for {@link org.eclipse.jst.j2ee.internal.internal.ejb.command.CreateChildCommand}.
+	 */
+	public Object getCreateChildImage(Object object) {
+		EObject refObject = (EObject) object;
+		return J2EEPlugin.getPlugin().getImage(refObject.eClass().getName() + "CreateCMPAttribute"); //$NON-NLS-1$
+	}
+
+	/**
+	 * This returns the label for {@link org.eclipse.jst.j2ee.internal.internal.ejb.command.CreateChildCommand}.
+	 */
+	public String getCreateChildText(Object object) {
+		return EJBProviderLibrariesResourceHandler.getString("Create_CMPAttribute_2"); //$NON-NLS-1$
+	}
+
+	/**
+	 * This returns the help text for {@link org.eclipse.jst.j2ee.internal.internal.ejb.command.CreateChildCommand}.
+	 */
+	public String getCreateChildToolTipText(Object object) {
+		EObject refObject = (EObject) object;
+		return EJBProviderLibrariesResourceHandler.getString("Create_a_child_of_type_CMPAttribute_for_the_selected__3") + refObject.eClass().getName() + EJBProviderLibrariesResourceHandler.getString("_4"); //$NON-NLS-1$ //$NON-NLS-2$
+	}
+
+	/**
+	 * This returns MessageDriven.gif.
+	 */
+	@Override
+	public Object getImage(Object object) {
+		return J2EEPlugin.getPlugin().getImage("message_bean_obj"); //$NON-NLS-1$
+	}
+
+	/**
+	 * This returns the property descriptors for the adapted class.
+	 */
+	@Override
+	public List getPropertyDescriptors(Object object) {
+		if (itemPropertyDescriptors == null) {
+			super.getPropertyDescriptors(object);
+
+			EjbPackage pkg = EjbPackage.eINSTANCE;
+
+			// This is for the transactionType feature.
+			//
+			itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), EJBProviderLibrariesResourceHandler.getString("Transaction_Type_6"), //$NON-NLS-1$
+						EJBProviderLibrariesResourceHandler.getString("The_transaction_type_property_of_the_message_driven_7"), //$NON-NLS-1$
+						pkg.getMessageDriven_TransactionType(), true, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE));
+
+			// This is for the messageSelector feature.
+			//
+			itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), EJBProviderLibrariesResourceHandler.getString("Message_Selector_8"), //$NON-NLS-1$
+						EJBProviderLibrariesResourceHandler.getString("The_message_selector_property_of_the_message_driven_9"), //$NON-NLS-1$
+						pkg.getMessageDriven_MessageSelector(), true, ItemPropertyDescriptor.TEXT_VALUE_IMAGE));
+
+			// This is for the acknowledgeMode feature.
+			//
+			itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), EJBProviderLibrariesResourceHandler.getString("Acknowledge_Mode_10"), //$NON-NLS-1$
+						EJBProviderLibrariesResourceHandler.getString("The_acknowledge_mode_property_of_the_message_driven_11"), //$NON-NLS-1$
+						pkg.getMessageDriven_AcknowledgeMode(), true, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE));
+
+			// This is for the destination feature.
+			//
+			itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), EJBProviderLibrariesResourceHandler.getString("Destination_12"), //$NON-NLS-1$
+						EJBProviderLibrariesResourceHandler.getString("The_destination_of_the_message_driven_13"), //$NON-NLS-1$
+						pkg.getMessageDriven_Destination(), false));
+
+		}
+		return itemPropertyDescriptors;
+	}
+
+	/**
+	 * This adds a property descriptor for the Transaction Type feature. <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	protected void addTransactionTypePropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), getString("_UI_MessageDriven_transactionType_feature"), //$NON-NLS-1$
+					getString("_UI_PropertyDescriptor_description", "_UI_MessageDriven_transactionType_feature", "_UI_MessageDriven_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+					EjbPackage.eINSTANCE.getMessageDriven_TransactionType(), true, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE));
+	}
+
+	/**
+	 * This adds a property descriptor for the Message Selector feature. <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	protected void addMessageSelectorPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), getString("_UI_MessageDriven_messageSelector_feature"), //$NON-NLS-1$
+					getString("_UI_PropertyDescriptor_description", "_UI_MessageDriven_messageSelector_feature", "_UI_MessageDriven_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+					EjbPackage.eINSTANCE.getMessageDriven_MessageSelector(), true, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE));
+	}
+
+	/**
+	 * This adds a property descriptor for the Acknowledge Mode feature. <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	protected void addAcknowledgeModePropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), getString("_UI_MessageDriven_acknowledgeMode_feature"), //$NON-NLS-1$
+					getString("_UI_PropertyDescriptor_description", "_UI_MessageDriven_acknowledgeMode_feature", "_UI_MessageDriven_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+					EjbPackage.eINSTANCE.getMessageDriven_AcknowledgeMode(), true, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE));
+	}
+
+	/**
+	 * This adds a property descriptor for the Message Destination feature. <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	protected void addMessageDestinationPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), getString("_UI_MessageDriven_messageDestination_feature"), //$NON-NLS-1$
+					getString("_UI_PropertyDescriptor_description", "_UI_MessageDriven_messageDestination_feature", "_UI_MessageDriven_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+					EjbPackage.eINSTANCE.getMessageDriven_MessageDestination(), true));
+	}
+
+	/**
+	 * This adds a property descriptor for the Link feature. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	protected void addLinkPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), getString("_UI_MessageDriven_link_feature"), //$NON-NLS-1$
+					getString("_UI_PropertyDescriptor_description", "_UI_MessageDriven_link_feature", "_UI_MessageDriven_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+					EjbPackage.eINSTANCE.getMessageDriven_Link(), true));
+	}
+
+	/**
+	 * This adds a property descriptor for the Messaging Type feature. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	protected void addMessagingTypePropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), getString("_UI_MessageDriven_messagingType_feature"), //$NON-NLS-1$
+					getString("_UI_PropertyDescriptor_description", "_UI_MessageDriven_messagingType_feature", "_UI_MessageDriven_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+					EjbPackage.eINSTANCE.getMessageDriven_MessagingType(), true));
+	}
+
+	/**
+	 * This returns the label text for the adapted class. <!-- begin-user-doc --> Don't remove this
+	 * method or it will be regenerated. <!-- end-user-doc -->
+	 *  
+	 */
+	@Override
+	public String getText(Object object) {
+		return super.getText(object);
+	}
+
+	/**
+	 * This handles notification by calling {@link #fireNotifyChanged fireNotifyChanged}. <!--
+	 * begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public void notifyChanged(Notification notification) {
+		switch (notification.getFeatureID(MessageDriven.class)) {
+			case EjbPackage.MESSAGE_DRIVEN__TRANSACTION_TYPE :
+			case EjbPackage.MESSAGE_DRIVEN__MESSAGE_SELECTOR :
+			case EjbPackage.MESSAGE_DRIVEN__ACKNOWLEDGE_MODE :
+			case EjbPackage.MESSAGE_DRIVEN__DESTINATION :
+			case EjbPackage.MESSAGE_DRIVEN__ACTIVATION_CONFIG : {
+				fireNotifyChanged(notification);
+				return;
+			}
+		}
+		super.notifyChanged(notification);
+	}
+
+	/**
+	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
+	 * describing all of the children that can be created under this object. <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
+		super.collectNewChildDescriptors(newChildDescriptors, object);
+
+		newChildDescriptors.add(createChildParameter(EjbPackage.eINSTANCE.getMessageDriven_Destination(), EjbFactory.eINSTANCE.createMessageDrivenDestination()));
+
+		newChildDescriptors.add(createChildParameter(EjbPackage.eINSTANCE.getMessageDriven_ActivationConfig(), EjbFactory.eINSTANCE.createActivationConfig()));
+	}
+
+	/**
+	 * This returns the label text for {@link org.eclipse.emf.edit.command.CreateChildCommand}.
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public String getCreateChildText(Object owner, Object feature, Object child, Collection selection) {
+		boolean qualify = feature == CommonPackage.eINSTANCE.getJNDIEnvRefsGroup_EjbRefs() || feature == CommonPackage.eINSTANCE.getJNDIEnvRefsGroup_EjbLocalRefs();
+		return getString(qualify ? "_UI_CreateChild_text2" : "_UI_CreateChild_text", //$NON-NLS-1$ //$NON-NLS-2$
+					new Object[]{getTypeText(child), getFeatureText(feature), getTypeText(owner)});
+	}
+
+	/**
+	 * Return the resource locator for this item provider's resources. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public ResourceLocator getResourceLocator() {
+		return J2EEPlugin.getDefault();
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/MethodElementItemProvider.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/MethodElementItemProvider.java
new file mode 100644
index 0000000..42f9b6a
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/MethodElementItemProvider.java
@@ -0,0 +1,362 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.internal.ejb.provider;
+
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.Notifier;
+import org.eclipse.emf.common.util.ResourceLocator;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.ComposedImage;
+import org.eclipse.emf.edit.provider.IDisposable;
+import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
+import org.eclipse.jem.java.JavaClass;
+import org.eclipse.jst.j2ee.common.CommonFactory;
+import org.eclipse.jst.j2ee.ejb.EjbPackage;
+import org.eclipse.jst.j2ee.ejb.EnterpriseBean;
+import org.eclipse.jst.j2ee.ejb.MethodElement;
+import org.eclipse.jst.j2ee.ejb.internal.impl.EjbFactoryImpl;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
+import org.eclipse.jst.j2ee.webservice.wscommon.WscommonFactory;
+
+
+/**
+ * This is the item provider adpater for a {@link org.eclipse.jst.j2ee.internal.internal.ejb.MethodElement}object.
+ */
+public class MethodElementItemProvider extends EjbItemProviderAdapter{
+	protected final static EjbPackage PACK_SF = EjbFactoryImpl.getPackage();
+	protected final static EStructuralFeature NAME_SF = PACK_SF.getMethodElement_Name();
+	protected final static EStructuralFeature DESC_SF = PACK_SF.getMethodElement_Description();
+	protected final static EStructuralFeature EJB_SF = PACK_SF.getMethodElement_EnterpriseBean();
+	protected final static EStructuralFeature PARMS_SF = PACK_SF.getMethodElement_Parms();
+	protected final static EStructuralFeature TYPE_SF = PACK_SF.getMethodElement_Type();
+
+	/**
+	 * This constructs an instance from a factory and a notifier.
+	 */
+	public MethodElementItemProvider(AdapterFactory adapterFactory) {
+		super(adapterFactory);
+	}
+
+	/**
+	 * This returns MethodElement.gif.
+	 */
+	@Override
+	public Object getImage(Object object) {
+
+		MethodElement gen = (MethodElement) object;
+		String overlayString = null;
+		Object base, overlayImage;
+
+		if (gen.isValid())
+			base = J2EEPlugin.getPlugin().getImage("methElement_obj"); //$NON-NLS-1$
+		else
+			base = J2EEPlugin.getPlugin().getImage("warn_tsk"); //$NON-NLS-1$
+
+		if (gen.isHome()) { // = "Home Methods"
+			overlayString = "home_interf_ov"; //$NON-NLS-1$
+		}
+		if (gen.isRemote()) { // = "Remote Methods"
+			overlayString = "remote_interf_ov"; //$NON-NLS-1$
+		}
+		if (gen.isLocal()) {
+			overlayString = "local_ovr"; //$NON-NLS-1$
+		}
+		if (gen.isLocalHome()) {
+			overlayString = "local_home_ovr"; //$NON-NLS-1$
+		}
+		if (gen.isService()) {
+			overlayString = "service_interface_ovr"; //$NON-NLS-1$
+		}
+		if (gen.isUnspecified()) { // = "Common Methods"
+			return base;
+		}
+		overlayImage = J2EEPlugin.getPlugin().getImage(overlayString);
+		ArrayList imageObjects = new ArrayList();
+		imageObjects.add(base);
+		imageObjects.add(overlayImage);
+		return new ComposedImage(imageObjects) {
+			@Override
+			public List getDrawPoints(Size size) {
+				List result = super.getDrawPoints(size);
+				if (result.size() > 1) {
+					((Point) result.get(1)).x = ((Point) result.get(1)).x + 8;
+				}
+				return result;
+			}
+		};
+		//return null;
+	}
+
+	/**
+	 * This returns the parent of the MethodElement.
+	 */
+	@Override
+	public Object getParent(Object object) {
+		return ((EObject) object).eContainer();
+	}
+
+	/**
+	 * This returns the property descriptors for the adapted class.
+	 */
+	@Override
+	public List getPropertyDescriptors(Object object) {
+		if (itemPropertyDescriptors == null) {
+			super.getPropertyDescriptors(object);
+
+			EjbPackage pkg = EjbPackage.eINSTANCE;
+
+			// This is for the name feature.
+			//
+			itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), EJBProviderLibrariesResourceHandler.getString("Name_UI_"), //$NON-NLS-1$ = "Name"
+						EJBProviderLibrariesResourceHandler.getString("The_name_property_UI_"), //$NON-NLS-1$ = "The name property"
+						pkg.getMethodElement_Name()));
+
+			// This is for the parms feature.
+			//
+			itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), EJBProviderLibrariesResourceHandler.getString("Parms_UI_"), //$NON-NLS-1$ = "Parms"
+						EJBProviderLibrariesResourceHandler.getString("The_parms_property_UI_"), //$NON-NLS-1$ = "The parms property"
+						pkg.getMethodElement_Parms()));
+
+			// This is for the type feature.
+			//
+			itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), EJBProviderLibrariesResourceHandler.getString("Type_UI_"), //$NON-NLS-1$ = "Type"
+						EJBProviderLibrariesResourceHandler.getString("The_type_property_UI_"), //$NON-NLS-1$ = "The type property"
+						pkg.getMethodElement_Type()));
+
+			// This is for the description feature.
+			//
+			itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), EJBProviderLibrariesResourceHandler.getString("Description_UI_"), //$NON-NLS-1$ = "Description"
+						EJBProviderLibrariesResourceHandler.getString("The_description_property_UI_"), //$NON-NLS-1$ = "The description property"
+						pkg.getMethodElement_Description()));
+
+			// This is for the enterpriseBean feature.
+			//
+			itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), EJBProviderLibrariesResourceHandler.getString("EnterpriseBean_UI_"), //$NON-NLS-1$ = "EnterpriseBean"
+						EJBProviderLibrariesResourceHandler.getString("The_enterpriseBean_propert_UI_"), //$NON-NLS-1$ = "The enterpriseBean property"
+						pkg.getMethodElement_EnterpriseBean()));
+
+			// This is for the methodPermission feature.
+			//
+			/*
+			 * itemPropertyDescriptors.add (new ItemPropertyDescriptor
+			 * (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+			 * ResourceHandler.getString("MethodPermission_UI_"), //$NON-NLS-1$ = "MethodPermission"
+			 * ResourceHandler.getString("The_methodPermission_prope_UI_"), //$NON-NLS-1$ = "The
+			 * methodPermission property" pkg.getMethodElement_MethodPermission()));
+			 */
+			// This is for the methodTransaction feature.
+			//
+			/*
+			 * itemPropertyDescriptors.add (new ItemPropertyDescriptor
+			 * (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+			 * ResourceHandler.getString("MethodTransaction_UI_"), //$NON-NLS-1$ =
+			 * "MethodTransaction" ResourceHandler.getString("The_methodTransaction_prop_UI_"),
+			 * //$NON-NLS-1$ = "The methodTransaction property"
+			 * pkg.getMethodElement_MethodTransaction()));
+			 */
+		}
+		return itemPropertyDescriptors;
+	}
+
+	/**
+	 * This adds a property descriptor for the Name feature. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	protected void addNamePropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), getString("_UI_MethodElement_name_feature"), //$NON-NLS-1$
+					getString("_UI_PropertyDescriptor_description", "_UI_MethodElement_name_feature", "_UI_MethodElement_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+					EjbPackage.eINSTANCE.getMethodElement_Name(), true, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE));
+	}
+
+	/**
+	 * This adds a property descriptor for the Parms feature. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	protected void addParmsPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), getString("_UI_MethodElement_parms_feature"), //$NON-NLS-1$
+					getString("_UI_PropertyDescriptor_description", "_UI_MethodElement_parms_feature", "_UI_MethodElement_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+					EjbPackage.eINSTANCE.getMethodElement_Parms(), true, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE));
+	}
+
+	/**
+	 * This adds a property descriptor for the Type feature. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	protected void addTypePropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), getString("_UI_MethodElement_type_feature"), //$NON-NLS-1$
+					getString("_UI_PropertyDescriptor_description", "_UI_MethodElement_type_feature", "_UI_MethodElement_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+					EjbPackage.eINSTANCE.getMethodElement_Type(), true, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE));
+	}
+
+	/**
+	 * This adds a property descriptor for the Description feature. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	protected void addDescriptionPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), getString("_UI_MethodElement_description_feature"), //$NON-NLS-1$
+					getString("_UI_PropertyDescriptor_description", "_UI_MethodElement_description_feature", "_UI_MethodElement_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+					EjbPackage.eINSTANCE.getMethodElement_Description(), true, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE));
+	}
+
+	/**
+	 * This adds a property descriptor for the Enterprise Bean feature. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	protected void addEnterpriseBeanPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), getString("_UI_MethodElement_enterpriseBean_feature"), //$NON-NLS-1$
+					getString("_UI_PropertyDescriptor_description", "_UI_MethodElement_enterpriseBean_feature", "_UI_MethodElement_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+					EjbPackage.eINSTANCE.getMethodElement_EnterpriseBean(), true));
+	}
+
+	/**
+	 * This specifies how to implement {@link #getChildren}and
+	 * {@link org.eclipse.emf.edit.command.AddCommand}and
+	 * {@link org.eclipse.emf.edit.command.RemoveCommand}support in {@link #createCommand}. <!--
+	 * begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public Collection getChildrenReferences(Object object) {
+		if (childrenReferences == null) {
+			super.getChildrenReferences(object);
+			childrenReferences.add(EjbPackage.eINSTANCE.getMethodElement_Descriptions());
+		}
+		return childrenReferences;
+	}
+
+
+	@Override
+	public String getText(Object object) {
+		return ((MethodElement) object).getSignature();
+	}
+
+	/**
+	 * This handles notification by calling {@link #fireNotifyChanged fireNotifyChanged}. <!--
+	 * begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public void notifyChanged(Notification notification) {
+		switch (notification.getFeatureID(MethodElement.class)) {
+			case EjbPackage.METHOD_ELEMENT__NAME :
+			case EjbPackage.METHOD_ELEMENT__PARMS :
+			case EjbPackage.METHOD_ELEMENT__TYPE :
+			case EjbPackage.METHOD_ELEMENT__DESCRIPTION :
+			case EjbPackage.METHOD_ELEMENT__DESCRIPTIONS : {
+				fireNotifyChanged(notification);
+				return;
+			}
+		}
+		super.notifyChanged(notification);
+	}
+
+	/**
+	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
+	 * describing all of the children that can be created under this object. <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
+		super.collectNewChildDescriptors(newChildDescriptors, object);
+
+		newChildDescriptors.add(createChildParameter(EjbPackage.eINSTANCE.getMethodElement_Descriptions(), CommonFactory.eINSTANCE.createDescription()));
+
+		newChildDescriptors.add(createChildParameter(EjbPackage.eINSTANCE.getMethodElement_Descriptions(), WscommonFactory.eINSTANCE.createDescriptionType()));
+	}
+
+	/**
+	 * Return the resource locator for this item provider's resources. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public ResourceLocator getResourceLocator() {
+		return J2EEPlugin.getDefault();
+	}
+
+	/**
+	 * This handles notification by calling {@link #fireNotifyChanged fireNotifyChanged}.
+	 */
+	/*
+	 * public void notifyChanged(Notifier notifier, int eventType, EObject feature, Object oldValue,
+	 * Object newValue, int index) { if (feature == NAME_SF || feature == PARMS_SF || feature ==
+	 * TYPE_SF || feature == ZERO_PARAMS_SF || feature == PARAMS_SF || feature == DESC_SF || feature ==
+	 * EJB_SF || feature == PERMISSION_SF || feature == TRANSACTION_SF || feature == FLUSH_SF) {
+	 * fireNotifyChanged(notifier, eventType, feature, oldValue, newValue, index); return; }
+	 * super.notifyChanged(notifier, eventType, feature, oldValue, newValue, index); }
+	 */
+	/**
+	 * @see Adapter#setTarget(Notifier)
+	 */
+	@Override
+	public void setTarget(Notifier newTarget) {
+		super.setTarget(newTarget);
+		if (newTarget != null && newTarget instanceof MethodElement) {
+			MethodElement me = (MethodElement) newTarget;
+			EnterpriseBean ejb = me.getEnterpriseBean();
+			if (ejb != null) {
+				JavaClass javaClass = me.getTypeJavaClass();
+				if (javaClass != null)
+					adaptJavaClass(javaClass);
+				else {
+					//unspecified
+					if (ejb.hasRemoteClient()) {
+						adaptJavaClass(ejb.getRemoteInterface());
+						adaptJavaClass(ejb.getHomeInterface());
+					}
+					if (ejb.hasLocalClient())
+						adaptJavaClass(ejb.getLocalInterface());
+					adaptJavaClass(ejb.getLocalHomeInterface());
+				}
+			}
+		}
+	}
+
+	protected void adaptJavaClass(JavaClass javaClass) {
+		if (javaClass != null) {
+			javaClass.eAdapters().add(this);
+			super.setTarget(javaClass);
+		}
+	}
+
+	/**
+	 * @see IDisposable#dispose()
+	 */
+	@Override
+	public void dispose() {
+		super.dispose();
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/MethodPermissionItemProvider.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/MethodPermissionItemProvider.java
new file mode 100644
index 0000000..5ceb52f
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/MethodPermissionItemProvider.java
@@ -0,0 +1,274 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.internal.ejb.provider;
+
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.util.ResourceLocator;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.edit.command.AddCommand;
+import org.eclipse.emf.edit.command.RemoveCommand;
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
+import org.eclipse.jst.j2ee.common.CommonFactory;
+import org.eclipse.jst.j2ee.common.SecurityRole;
+import org.eclipse.jst.j2ee.ejb.EjbFactory;
+import org.eclipse.jst.j2ee.ejb.EjbPackage;
+import org.eclipse.jst.j2ee.ejb.MethodElement;
+import org.eclipse.jst.j2ee.ejb.MethodPermission;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
+import org.eclipse.jst.j2ee.webservice.wscommon.WscommonFactory;
+
+
+/**
+ * This is the item provider adpater for a {@link org.eclipse.jst.j2ee.internal.internal.ejb.MethodPermission}object.
+ */
+public class MethodPermissionItemProvider extends EjbItemProviderAdapter {
+	/**
+	 * This constructs an instance from a factory and a notifier.
+	 */
+	public MethodPermissionItemProvider(AdapterFactory adapterFactory) {
+		super(adapterFactory);
+	}
+
+	/**
+	 * This creates a new child for {@link org.eclipse.jst.j2ee.internal.internal.ejb.command.CreateChildCommand}.
+	 */
+	@Override
+	public Object createChild(Object object) {
+		// TODO: check that this is what you want.
+		MethodElement child = EjbFactory.eINSTANCE.createMethodElement();
+
+		// TODO: initialize child here...
+
+		return child;
+	}
+
+	/**
+	 * This specifies how to implement {@link #getChildren}and {@link AddCommand}and
+	 * {@link RemoveCommand}support in {@link #createCommand}.
+	 */
+	@Override
+	public Collection getChildrenReferences(Object object) {
+		return Collections.singleton(EjbPackage.eINSTANCE.getMethodPermission_MethodElements());
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	protected EReference getChildReference(Object object, Object child) {
+		// Check the type of the specified child object and return the proper feature to use for
+		// adding (see {@link AddCommand}) it as a child.
+
+		return super.getChildReference(object, child);
+	}
+
+
+	/**
+	 * This returns the image for {@link org.eclipse.jst.j2ee.internal.internal.ejb.command.CreateChildCommand}.
+	 */
+	@Override
+	public Object getCreateChildImage(Object object) {
+		EObject refObject = (EObject) object;
+		return J2EEPlugin.getPlugin().getImage(refObject.eClass().getName() + "CreateMethodElement"); //$NON-NLS-1$
+	}
+
+	/**
+	 * This returns the label for {@link org.eclipse.jst.j2ee.internal.internal.ejb.command.CreateChildCommand}.
+	 */
+	@Override
+	public String getCreateChildText(Object object) {
+		return EJBProviderLibrariesResourceHandler.getString("Create_MethodElement_UI_"); //$NON-NLS-1$ = "Create MethodElement"
+	}
+
+	/**
+	 * This returns the help text for {@link org.eclipse.jst.j2ee.internal.internal.ejb.command.CreateChildCommand}.
+	 */
+	@Override
+	public String getCreateChildToolTipText(Object object) {
+		EObject refObject = (EObject) object;
+		return EJBProviderLibrariesResourceHandler.getString("Create_a_child_of_type_Met1_UI_") + refObject.eClass().getName() + "."; //$NON-NLS-2$ //$NON-NLS-1$ = "Create a child of type MethodElement for the selected "
+	}
+
+	/**
+	 * This returns MethodPermission.gif.
+	 */
+	@Override
+	public Object getImage(Object object) {
+		return J2EEPlugin.getPlugin().getImage("methPermission_obj"); //$NON-NLS-1$
+	}
+
+	/**
+	 * This returns the parent of the MethodPermission.
+	 */
+	@Override
+	public Object getParent(Object object) {
+		return ((EObject) object).eContainer();
+	}
+
+	/**
+	 * This returns the property descriptors for the adapted class.
+	 */
+	@Override
+	public List getPropertyDescriptors(Object object) {
+		if (itemPropertyDescriptors == null) {
+			super.getPropertyDescriptors(object);
+
+			EjbPackage pkg = EjbPackage.eINSTANCE;
+
+			// This is for the description feature.
+			//
+			itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), EJBProviderLibrariesResourceHandler.getString("Description_UI_"), //$NON-NLS-1$ = "Description"
+						EJBProviderLibrariesResourceHandler.getString("The_description_property_UI_"), //$NON-NLS-1$ = "The description property"
+						pkg.getMethodPermission_Description()));
+
+			// This is for the assemblyDescriptor feature.
+			//
+			itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), EJBProviderLibrariesResourceHandler.getString("AssemblyDescriptor_UI_"), //$NON-NLS-1$ = "AssemblyDescriptor"
+						EJBProviderLibrariesResourceHandler.getString("The_assemblyDescriptor_pro_UI_"), //$NON-NLS-1$ = "The assemblyDescriptor property"
+						pkg.getMethodPermission_AssemblyDescriptor()));
+
+		}
+		return itemPropertyDescriptors;
+	}
+
+	/**
+	 * This adds a property descriptor for the Description feature. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	protected void addDescriptionPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), getString("_UI_MethodPermission_description_feature"), //$NON-NLS-1$
+					getString("_UI_PropertyDescriptor_description", "_UI_MethodPermission_description_feature", "_UI_MethodPermission_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+					EjbPackage.eINSTANCE.getMethodPermission_Description(), true, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE));
+	}
+
+	/**
+	 * This adds a property descriptor for the Unchecked feature. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	protected void addUncheckedPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), getString("_UI_MethodPermission_unchecked_feature"), //$NON-NLS-1$
+					getString("_UI_PropertyDescriptor_description", "_UI_MethodPermission_unchecked_feature", "_UI_MethodPermission_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+					EjbPackage.eINSTANCE.getMethodPermission_Unchecked(), true, ItemPropertyDescriptor.BOOLEAN_VALUE_IMAGE));
+	}
+
+	/**
+	 * This adds a property descriptor for the Roles feature. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	protected void addRolesPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), getString("_UI_MethodPermission_roles_feature"), //$NON-NLS-1$
+					getString("_UI_PropertyDescriptor_description", "_UI_MethodPermission_roles_feature", "_UI_MethodPermission_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+					EjbPackage.eINSTANCE.getMethodPermission_Roles(), true));
+	}
+
+	@Override
+	public String getText(Object object) {
+		if (object instanceof MethodPermission)
+			return getText((MethodPermission) object);
+		return super.getText(object);
+	}
+
+	/**
+	 * This handles notification by calling {@link #fireNotifyChanged fireNotifyChanged}. <!--
+	 * begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public void notifyChanged(Notification notification) {
+		switch (notification.getFeatureID(MethodPermission.class)) {
+			case EjbPackage.METHOD_PERMISSION__DESCRIPTION :
+			case EjbPackage.METHOD_PERMISSION__UNCHECKED :
+			case EjbPackage.METHOD_PERMISSION__METHOD_ELEMENTS :
+			case EjbPackage.METHOD_PERMISSION__DESCRIPTIONS : {
+				fireNotifyChanged(notification);
+				return;
+			}
+		}
+		super.notifyChanged(notification);
+	}
+
+	/**
+	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
+	 * describing all of the children that can be created under this object. <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
+		super.collectNewChildDescriptors(newChildDescriptors, object);
+
+		newChildDescriptors.add(createChildParameter(EjbPackage.eINSTANCE.getMethodPermission_MethodElements(), EjbFactory.eINSTANCE.createMethodElement()));
+
+		newChildDescriptors.add(createChildParameter(EjbPackage.eINSTANCE.getMethodPermission_MethodElements(), EjbFactory.eINSTANCE.createQueryMethod()));
+
+		newChildDescriptors.add(createChildParameter(EjbPackage.eINSTANCE.getMethodPermission_Descriptions(), CommonFactory.eINSTANCE.createDescription()));
+
+		newChildDescriptors.add(createChildParameter(EjbPackage.eINSTANCE.getMethodPermission_Descriptions(), WscommonFactory.eINSTANCE.createDescriptionType()));
+	}
+
+	/**
+	 * Return the resource locator for this item provider's resources. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public ResourceLocator getResourceLocator() {
+		return J2EEPlugin.getDefault();
+	}
+
+	public String getText(MethodPermission mp) {
+		if (mp.isUnchecked())
+			return EJBProviderLibrariesResourceHandler.getString("Unchecked_UI_"); //$NON-NLS-1$
+		List roles = mp.getRoles();
+		StringBuffer buf = new StringBuffer();
+		//buf.append(ResourceHandler.getString("MethodPermission__UI_")); //$NON-NLS-1$ =
+		// "MethodPermission "
+		buf.append("("); //$NON-NLS-1$
+		SecurityRole role = null;
+		for (int i = 0; i < roles.size(); i++) {
+			if (i != 0)
+				buf.append(", "); //$NON-NLS-1$
+			role = (SecurityRole) roles.get(i);
+			buf.append(role.getRoleName());
+		}
+		buf.append(")"); //$NON-NLS-1$
+		return buf.toString();
+	}
+	/**
+	 * This handles notification by calling {@link #fireNotifyChanged fireNotifyChanged}.
+	 */
+	/*
+	 * public void notifyChanged(Notifier notifier, int eventType, EObject feature, Object oldValue,
+	 * Object newValue, int index) { if (feature == DESCRIPTION_SF || feature == ROLES_SF || feature ==
+	 * METHOD_ELEMENTS_SF || feature == UNCHECKED_SF) { fireNotifyChanged(notifier, eventType,
+	 * feature, oldValue, newValue, index); return; } super.notifyChanged(notifier, eventType,
+	 * feature, oldValue, newValue, index); }
+	 */
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/MethodTransactionItemProvider.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/MethodTransactionItemProvider.java
new file mode 100644
index 0000000..44bd1e8
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/MethodTransactionItemProvider.java
@@ -0,0 +1,237 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.internal.ejb.provider;
+
+
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.util.ResourceLocator;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.edit.command.AddCommand;
+import org.eclipse.emf.edit.command.RemoveCommand;
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
+import org.eclipse.jst.j2ee.common.CommonFactory;
+import org.eclipse.jst.j2ee.ejb.EjbFactory;
+import org.eclipse.jst.j2ee.ejb.EjbPackage;
+import org.eclipse.jst.j2ee.ejb.MethodElement;
+import org.eclipse.jst.j2ee.ejb.MethodTransaction;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
+import org.eclipse.jst.j2ee.webservice.wscommon.WscommonFactory;
+
+
+/**
+ * This is the item provider adpater for a {@link org.eclipse.jst.j2ee.internal.internal.ejb.MethodTransaction}object.
+ */
+public class MethodTransactionItemProvider extends EjbItemProviderAdapter {
+	/**
+	 * This constructs an instance from a factory and a notifier.
+	 */
+	public MethodTransactionItemProvider(AdapterFactory adapterFactory) {
+		super(adapterFactory);
+	}
+
+	/**
+	 * This creates a new child for {@link org.eclipse.jst.j2ee.internal.internal.ejb.command.CreateChildCommand}.
+	 */
+	@Override
+	public Object createChild(Object object) {
+		// TODO: check that this is what you want.
+		MethodElement child = EjbFactory.eINSTANCE.createMethodElement();
+
+		// TODO: initialize child here...
+
+		return child;
+	}
+
+	/**
+	 * This specifies how to implement {@link #getChildren}and {@link AddCommand}and
+	 * {@link RemoveCommand}support in {@link #createCommand}.
+	 */
+	@Override
+	public Collection getChildrenReferences(Object object) {
+		return Collections.singleton(EjbPackage.eINSTANCE.getMethodTransaction_MethodElements());
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	protected EReference getChildReference(Object object, Object child) {
+		// Check the type of the specified child object and return the proper feature to use for
+		// adding (see {@link AddCommand}) it as a child.
+
+		return super.getChildReference(object, child);
+	}
+
+
+	/**
+	 * This returns the image for {@link org.eclipse.jst.j2ee.internal.internal.ejb.command.CreateChildCommand}.
+	 */
+	@Override
+	public Object getCreateChildImage(Object object) {
+		EObject refObject = (EObject) object;
+		return J2EEPlugin.getPlugin().getImage(refObject.eClass().getName() + "CreateMethodElement");//$NON-NLS-1$
+	}
+
+	/**
+	 * This returns the label for {@link org.eclipse.jst.j2ee.internal.internal.ejb.command.CreateChildCommand}.
+	 */
+	@Override
+	public String getCreateChildText(Object object) {
+		return EJBProviderLibrariesResourceHandler.getString("Create_MethodElement_UI_"); //$NON-NLS-1$ = "Create MethodElement"
+	}
+
+	/**
+	 * This returns the help text for {@link org.eclipse.jst.j2ee.internal.internal.ejb.command.CreateChildCommand}.
+	 */
+	@Override
+	public String getCreateChildToolTipText(Object object) {
+		EObject refObject = (EObject) object;
+		return EJBProviderLibrariesResourceHandler.getString("Create_a_child_of_type_Met1_UI_") + refObject.eClass().getName() + ".";//$NON-NLS-2$ //$NON-NLS-1$ = "Create a child of type MethodElement for the selected "
+	}
+
+	/**
+	 * This returns MethodTransaction.gif.
+	 */
+	@Override
+	public Object getImage(Object object) {
+		return J2EEPlugin.getPlugin().getImage("methTransaction_obj");//$NON-NLS-1$
+	}
+
+	/**
+	 * This returns the parent of the MethodTransaction.
+	 */
+	@Override
+	public Object getParent(Object object) {
+		return ((EObject) object).eContainer();
+	}
+
+	/**
+	 * This returns the property descriptors for the adapted class.
+	 */
+	@Override
+	public List getPropertyDescriptors(Object object) {
+		if (itemPropertyDescriptors == null) {
+			super.getPropertyDescriptors(object);
+
+			EjbPackage pkg = EjbPackage.eINSTANCE;
+
+			// This is for the transactionAttribute feature.
+			//
+			itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), EJBProviderLibrariesResourceHandler.getString("TransactionAttribute_UI_"), //$NON-NLS-1$ = "TransactionAttribute"
+						EJBProviderLibrariesResourceHandler.getString("The_transactionAttribute_p_UI_"), //$NON-NLS-1$ = "The transactionAttribute property"
+						pkg.getMethodTransaction_TransactionAttribute()));
+
+			// This is for the description feature.
+			//
+			itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), EJBProviderLibrariesResourceHandler.getString("Description_UI_"), //$NON-NLS-1$ = "Description"
+						EJBProviderLibrariesResourceHandler.getString("The_description_property_UI_"), //$NON-NLS-1$ = "The description property"
+						pkg.getMethodTransaction_Description()));
+
+			// This is for the assemblyDescriptor feature.
+			//
+			itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), EJBProviderLibrariesResourceHandler.getString("AssemblyDescriptor_UI_"), //$NON-NLS-1$ = "AssemblyDescriptor"
+						EJBProviderLibrariesResourceHandler.getString("The_assemblyDescriptor_pro_UI_"), //$NON-NLS-1$ = "The assemblyDescriptor property"
+						pkg.getMethodTransaction_AssemblyDescriptor()));
+
+		}
+		return itemPropertyDescriptors;
+	}
+
+	/**
+	 * This adds a property descriptor for the Transaction Attribute feature. <!-- begin-user-doc
+	 * --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	protected void addTransactionAttributePropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), getString("_UI_MethodTransaction_transactionAttribute_feature"), //$NON-NLS-1$
+					getString("_UI_PropertyDescriptor_description", "_UI_MethodTransaction_transactionAttribute_feature", "_UI_MethodTransaction_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+					EjbPackage.eINSTANCE.getMethodTransaction_TransactionAttribute(), true, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE));
+	}
+
+	/**
+	 * This adds a property descriptor for the Description feature. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	protected void addDescriptionPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), getString("_UI_MethodTransaction_description_feature"), //$NON-NLS-1$
+					getString("_UI_PropertyDescriptor_description", "_UI_MethodTransaction_description_feature", "_UI_MethodTransaction_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+					EjbPackage.eINSTANCE.getMethodTransaction_Description(), true, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE));
+	}
+
+	@Override
+	public String getText(Object object) {
+		return EJBProviderLibrariesResourceHandler.getString("MethodTransaction__UI_") + " " + ((MethodTransaction) object).getTransactionAttribute().getName(); //$NON-NLS-1$ = "MethodTransaction "//$NON-NLS-2$
+	}
+
+	/**
+	 * This handles notification by calling {@link #fireNotifyChanged fireNotifyChanged}. <!--
+	 * begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public void notifyChanged(Notification notification) {
+		switch (notification.getFeatureID(MethodTransaction.class)) {
+			case EjbPackage.METHOD_TRANSACTION__TRANSACTION_ATTRIBUTE :
+			case EjbPackage.METHOD_TRANSACTION__DESCRIPTION :
+			case EjbPackage.METHOD_TRANSACTION__METHOD_ELEMENTS :
+			case EjbPackage.METHOD_TRANSACTION__DESCRIPTIONS : {
+				fireNotifyChanged(notification);
+				return;
+			}
+		}
+		super.notifyChanged(notification);
+	}
+
+	/**
+	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
+	 * describing all of the children that can be created under this object. <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
+		super.collectNewChildDescriptors(newChildDescriptors, object);
+
+		newChildDescriptors.add(createChildParameter(EjbPackage.eINSTANCE.getMethodTransaction_MethodElements(), EjbFactory.eINSTANCE.createMethodElement()));
+
+		newChildDescriptors.add(createChildParameter(EjbPackage.eINSTANCE.getMethodTransaction_MethodElements(), EjbFactory.eINSTANCE.createQueryMethod()));
+
+		newChildDescriptors.add(createChildParameter(EjbPackage.eINSTANCE.getMethodTransaction_Descriptions(), CommonFactory.eINSTANCE.createDescription()));
+
+		newChildDescriptors.add(createChildParameter(EjbPackage.eINSTANCE.getMethodTransaction_Descriptions(), WscommonFactory.eINSTANCE.createDescriptionType()));
+	}
+
+	/**
+	 * Return the resource locator for this item provider's resources. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public ResourceLocator getResourceLocator() {
+		return J2EEPlugin.getDefault();
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/QueryItemProvider.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/QueryItemProvider.java
new file mode 100644
index 0000000..93fff34
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/QueryItemProvider.java
@@ -0,0 +1,201 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.internal.ejb.provider;
+
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.util.ResourceLocator;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
+import org.eclipse.jst.j2ee.common.CommonFactory;
+import org.eclipse.jst.j2ee.ejb.EjbFactory;
+import org.eclipse.jst.j2ee.ejb.EjbPackage;
+import org.eclipse.jst.j2ee.ejb.Query;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
+import org.eclipse.jst.j2ee.webservice.wscommon.WscommonFactory;
+
+
+// Referenced classes of package org.eclipse.jst.j2ee.internal.internal.ejb.provider:
+//            EjbItemProviderAdapter
+
+public class QueryItemProvider extends EjbItemProviderAdapter {
+
+	public QueryItemProvider(AdapterFactory adapterFactory) {
+		super(adapterFactory);
+	}
+
+	@Override
+	public Object createChild(Object object) {
+		return null;
+	}
+
+	@Override
+	public Collection getChildrenReferences(Object object) {
+		if (super.childrenReferences == null) {
+			super.getChildrenReferences(object);
+			super.childrenReferences.add(EjbPackage.eINSTANCE.getQuery_QueryMethod());
+		}
+		return super.childrenReferences;
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	protected EReference getChildReference(Object object, Object child) {
+		// Check the type of the specified child object and return the proper feature to use for
+		// adding (see {@link AddCommand}) it as a child.
+
+		return super.getChildReference(object, child);
+	}
+
+
+	@Override
+	public Object getCreateChildImage(Object object) {
+		EObject refObject = (EObject) object;
+		return J2EEPlugin.getPlugin().getImage(refObject.eClass().getName() + "Create#CHILD_CLASS_NAME#"); //$NON-NLS-1$
+	}
+
+	@Override
+	public String getCreateChildText(Object object) {
+		return "Create #CHILD_CLASS_NAME#"; //$NON-NLS-1$
+	}
+
+	@Override
+	public String getCreateChildToolTipText(Object object) {
+		EObject refObject = (EObject) object;
+		return "Create a child of type #CHILD_CLASS_NAME# for the selected " + refObject.eClass().getName() + "."; //$NON-NLS-1$ //$NON-NLS-2$
+	}
+
+	@Override
+	public Object getImage(Object object) {
+		return J2EEPlugin.getPlugin().getImage("db_obj"); //$NON-NLS-1$
+	}
+
+	@Override
+	public Object getParent(Object object) {
+		return ((EObject) object).eContainer();
+	}
+
+	@Override
+	public List getPropertyDescriptors(Object object) {
+		if (super.itemPropertyDescriptors == null) {
+			super.getPropertyDescriptors(object);
+			EjbPackage pkg = EjbPackage.eINSTANCE;
+			super.itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) super.adapterFactory).getRootAdapterFactory(), "Description_7", "The_description_property_of_the_query_8", pkg.getQuery_Description(), true, ItemPropertyDescriptor.TEXT_VALUE_IMAGE)); //$NON-NLS-1$ //$NON-NLS-2$
+			super.itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) super.adapterFactory).getRootAdapterFactory(), "Ejb_QL_9", "The_ejb_ql_property_of_the_query_10", pkg.getQuery_EjbQL(), true, ItemPropertyDescriptor.TEXT_VALUE_IMAGE)); //$NON-NLS-1$ //$NON-NLS-2$
+			super.itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) super.adapterFactory).getRootAdapterFactory(), "Return_Type_Mapping_11", "The_return_type_mapping_property_of_the_query_12", pkg.getQuery_ReturnTypeMapping(), true, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE)); //$NON-NLS-1$ //$NON-NLS-2$
+			super.itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) super.adapterFactory).getRootAdapterFactory(), "Entity_13", "The_entity_of_the_query_14", pkg.getQuery_Entity(), false)); //$NON-NLS-1$ //$NON-NLS-2$
+			super.itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) super.adapterFactory).getRootAdapterFactory(), "Query_Method_15", "The_query_method_of_the_query_16", pkg.getQuery_QueryMethod(), false)); //$NON-NLS-1$ //$NON-NLS-2$
+		}
+		return super.itemPropertyDescriptors;
+	}
+
+	/**
+	 * This adds a property descriptor for the Description feature. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	protected void addDescriptionPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), getString("_UI_Query_description_feature"), //$NON-NLS-1$
+					getString("_UI_PropertyDescriptor_description", "_UI_Query_description_feature", "_UI_Query_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+					EjbPackage.eINSTANCE.getQuery_Description(), true, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE));
+	}
+
+	/**
+	 * This adds a property descriptor for the Ejb QL feature. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	protected void addEjbQLPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), getString("_UI_Query_ejbQL_feature"), //$NON-NLS-1$
+					getString("_UI_PropertyDescriptor_description", "_UI_Query_ejbQL_feature", "_UI_Query_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+					EjbPackage.eINSTANCE.getQuery_EjbQL(), true, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE));
+	}
+
+	/**
+	 * This adds a property descriptor for the Return Type Mapping feature. <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	protected void addReturnTypeMappingPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), getString("_UI_Query_returnTypeMapping_feature"), //$NON-NLS-1$
+					getString("_UI_PropertyDescriptor_description", "_UI_Query_returnTypeMapping_feature", "_UI_Query_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+					EjbPackage.eINSTANCE.getQuery_ReturnTypeMapping(), true, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE));
+	}
+
+	@Override
+	public String getText(Object object) {
+		Query query = (Query) object;
+		return EJBProviderLibrariesResourceHandler.getString("Query_2")+ " " + query.getEjbQL(); //$NON-NLS-1$ //$NON-NLS-2$
+	}
+
+	/**
+	 * This handles notification by calling {@link #fireNotifyChanged fireNotifyChanged}. <!--
+	 * begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public void notifyChanged(Notification notification) {
+		switch (notification.getFeatureID(Query.class)) {
+			case EjbPackage.QUERY__DESCRIPTION :
+			case EjbPackage.QUERY__EJB_QL :
+			case EjbPackage.QUERY__RETURN_TYPE_MAPPING :
+			case EjbPackage.QUERY__QUERY_METHOD :
+			case EjbPackage.QUERY__DESCRIPTIONS : {
+				fireNotifyChanged(notification);
+				return;
+			}
+		}
+		super.notifyChanged(notification);
+	}
+
+	/**
+	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
+	 * describing all of the children that can be created under this object. <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
+		super.collectNewChildDescriptors(newChildDescriptors, object);
+
+		newChildDescriptors.add(createChildParameter(EjbPackage.eINSTANCE.getQuery_QueryMethod(), EjbFactory.eINSTANCE.createQueryMethod()));
+
+		newChildDescriptors.add(createChildParameter(EjbPackage.eINSTANCE.getQuery_Descriptions(), CommonFactory.eINSTANCE.createDescription()));
+
+		newChildDescriptors.add(createChildParameter(EjbPackage.eINSTANCE.getQuery_Descriptions(), WscommonFactory.eINSTANCE.createDescriptionType()));
+	}
+
+	/**
+	 * Return the resource locator for this item provider's resources. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public ResourceLocator getResourceLocator() {
+		return J2EEPlugin.getDefault();
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/QueryMethodItemProvider.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/QueryMethodItemProvider.java
new file mode 100644
index 0000000..3b214eb
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/QueryMethodItemProvider.java
@@ -0,0 +1,115 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.internal.ejb.provider;
+
+
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.util.ResourceLocator;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
+import org.eclipse.jst.j2ee.ejb.EjbPackage;
+import org.eclipse.jst.j2ee.ejb.QueryMethod;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
+
+
+/**
+ * This is the item provider adpater for a {@link org.eclipse.jst.j2ee.internal.internal.ejb.QueryMethod}object.
+ */
+public class QueryMethodItemProvider extends MethodElementItemProvider {
+	protected final static EStructuralFeature QUERY_SF = PACK_SF.getQueryMethod_Query();
+
+	/**
+	 * This constructs an instance from a factory and a notifier.
+	 */
+	public QueryMethodItemProvider(AdapterFactory adapterFactory) {
+		super(adapterFactory);
+	}
+
+	@Override
+	public Object getImage(Object object) {
+		return J2EEPlugin.getPlugin().getImage("query_method_obj"); //$NON-NLS-1$
+	}
+
+	/**
+	 * This returns the parent of the QueryMethod.
+	 */
+	@Override
+	public Object getParent(Object object) {
+		return ((EObject) object).eContainer();
+	}
+
+	/**
+	 * This returns the property descriptors for the adapted class.
+	 */
+	@Override
+	public List getPropertyDescriptors(Object object) {
+		if (itemPropertyDescriptors == null) {
+			super.getPropertyDescriptors(object);
+
+			EjbPackage pkg = EjbPackage.eINSTANCE;
+
+			// This is for the query feature.
+			//
+			itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), EJBProviderLibrariesResourceHandler.getString("Query_2"), //$NON-NLS-1$
+						EJBProviderLibrariesResourceHandler.getString("The_query_of_the_query_method_3"), //$NON-NLS-1$
+						pkg.getQueryMethod_Query(), false));
+
+		}
+		return itemPropertyDescriptors;
+	}
+
+	@Override
+	public String getText(Object object) {
+		QueryMethod queryMethod = (QueryMethod) object;
+		return queryMethod.getName(); 
+	}
+
+	/**
+	 * This handles notification by calling {@link #fireNotifyChanged fireNotifyChanged}. <!--
+	 * begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public void notifyChanged(Notification notification) {
+		super.notifyChanged(notification);
+	}
+
+	/**
+	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
+	 * describing all of the children that can be created under this object. <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
+		super.collectNewChildDescriptors(newChildDescriptors, object);
+	}
+
+	/**
+	 * Return the resource locator for this item provider's resources. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public ResourceLocator getResourceLocator() {
+		return J2EEPlugin.getDefault();
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/RelationshipsItemProvider.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/RelationshipsItemProvider.java
new file mode 100644
index 0000000..7d9cebe
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/RelationshipsItemProvider.java
@@ -0,0 +1,220 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.internal.ejb.provider;
+
+
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.util.ResourceLocator;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.edit.command.AddCommand;
+import org.eclipse.emf.edit.command.RemoveCommand;
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
+import org.eclipse.jst.j2ee.common.CommonFactory;
+import org.eclipse.jst.j2ee.ejb.EJBRelation;
+import org.eclipse.jst.j2ee.ejb.EjbFactory;
+import org.eclipse.jst.j2ee.ejb.EjbPackage;
+import org.eclipse.jst.j2ee.ejb.Relationships;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
+import org.eclipse.jst.j2ee.webservice.wscommon.WscommonFactory;
+
+
+/**
+ * This is the item provider adpater for a {@link org.eclipse.jst.j2ee.internal.internal.ejb.Relationships}object.
+ */
+public class RelationshipsItemProvider extends EjbItemProviderAdapter {
+	/**
+	 * This constructs an instance from a factory and a notifier.
+	 */
+	public RelationshipsItemProvider(AdapterFactory adapterFactory) {
+		super(adapterFactory);
+	}
+
+	/**
+	 * This creates a new child for {@link org.eclipse.jst.j2ee.internal.internal.ejb.command.CreateChildCommand}.
+	 */
+	@Override
+	public Object createChild(Object object) {
+		// TODO: check that this is what you want.
+		EJBRelation child = EjbFactory.eINSTANCE.createEJBRelation();
+
+		// TODO: initialize child here...
+
+		return child;
+	}
+
+	/**
+	 * This specifies how to implement {@link #getChildren}and {@link AddCommand}and
+	 * {@link RemoveCommand}support in {@link #createCommand}.
+	 */
+	@Override
+	public Collection getChildrenReferences(Object object) {
+		if (childrenReferences == null) {
+			super.getChildrenReferences(object);
+			childrenReferences.add(EjbPackage.eINSTANCE.getRelationships_EjbRelations());
+		}
+		return childrenReferences;
+	}
+
+	/**
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	protected EReference getChildReference(Object object, Object child) {
+		// Check the type of the specified child object and return the proper feature to use for
+		// adding (see {@link AddCommand}) it as a child.
+
+		return super.getChildReference(object, child);
+	}
+
+
+	/**
+	 * This returns the image for {@link org.eclipse.jst.j2ee.internal.internal.ejb.command.CreateChildCommand}.
+	 */
+	@Override
+	public Object getCreateChildImage(Object object) {
+		EObject refObject = (EObject) object;
+		return J2EEPlugin.getPlugin().getImage(refObject.eClass().getName() + "CreateEJBRelation"); //$NON-NLS-1$
+	}
+
+	/**
+	 * This returns the label for {@link org.eclipse.jst.j2ee.internal.internal.ejb.command.CreateChildCommand}.
+	 */
+	@Override
+	public String getCreateChildText(Object object) {
+		return EJBProviderLibrariesResourceHandler.getString("Create_EJBRelation_2"); //$NON-NLS-1$
+	}
+
+	/**
+	 * This returns the help text for {@link org.eclipse.jst.j2ee.internal.internal.ejb.command.CreateChildCommand}.
+	 */
+	@Override
+	public String getCreateChildToolTipText(Object object) {
+		EObject refObject = (EObject) object;
+		return EJBProviderLibrariesResourceHandler.getString("Create_a_child_of_type_EJBRelation_for_the_selected__3") + refObject.eClass().getName() + EJBProviderLibrariesResourceHandler.getString("_4"); //$NON-NLS-1$ //$NON-NLS-2$
+	}
+
+	/**
+	 * This returns Relationships.gif.
+	 */
+	@Override
+	public Object getImage(Object object) {
+		return J2EEPlugin.getPlugin().getImage("Relationships"); //$NON-NLS-1$
+	}
+
+	/**
+	 * This returns the parent of the Relationships.
+	 */
+	@Override
+	public Object getParent(Object object) {
+		return ((EObject) object).eContainer();
+	}
+
+	/**
+	 * This returns the property descriptors for the adapted class.
+	 */
+	@Override
+	public List getPropertyDescriptors(Object object) {
+		if (itemPropertyDescriptors == null) {
+			super.getPropertyDescriptors(object);
+
+			EjbPackage pkg = EjbPackage.eINSTANCE;
+
+			// This is for the description feature.
+			//
+			itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), EJBProviderLibrariesResourceHandler.getString("Description_6"), //$NON-NLS-1$
+						EJBProviderLibrariesResourceHandler.getString("The_description_property_of_the_relationships_7"), //$NON-NLS-1$
+						pkg.getRelationships_Description(), true, ItemPropertyDescriptor.TEXT_VALUE_IMAGE));
+
+			// This is for the ejbJar feature.
+			//
+			itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), EJBProviderLibrariesResourceHandler.getString("Ejb_Jar_8"), //$NON-NLS-1$
+						EJBProviderLibrariesResourceHandler.getString("The_ejb_jar_of_the_relationships_9"), //$NON-NLS-1$
+						pkg.getRelationships_EjbJar(), false));
+
+		}
+		return itemPropertyDescriptors;
+	}
+
+	/**
+	 * This adds a property descriptor for the Description feature. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	protected void addDescriptionPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), getString("_UI_Relationships_description_feature"), //$NON-NLS-1$
+					getString("_UI_PropertyDescriptor_description", "_UI_Relationships_description_feature", "_UI_Relationships_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+					EjbPackage.eINSTANCE.getRelationships_Description(), true, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE));
+	}
+
+	@Override
+	public String getText(Object object) {
+		Relationships relationships = ((Relationships) object);
+		return EJBProviderLibrariesResourceHandler.getString("Relationships__10") + relationships.getDescription(); //$NON-NLS-1$
+	}
+
+	/**
+	 * This handles notification by calling {@link #fireNotifyChanged fireNotifyChanged}. <!--
+	 * begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public void notifyChanged(Notification notification) {
+		switch (notification.getFeatureID(Relationships.class)) {
+			case EjbPackage.RELATIONSHIPS__DESCRIPTION :
+			case EjbPackage.RELATIONSHIPS__EJB_RELATIONS :
+			case EjbPackage.RELATIONSHIPS__DESCRIPTIONS : {
+				fireNotifyChanged(notification);
+				return;
+			}
+		}
+		super.notifyChanged(notification);
+	}
+
+	/**
+	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
+	 * describing all of the children that can be created under this object. <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
+		super.collectNewChildDescriptors(newChildDescriptors, object);
+
+		newChildDescriptors.add(createChildParameter(EjbPackage.eINSTANCE.getRelationships_EjbRelations(), EjbFactory.eINSTANCE.createEJBRelation()));
+
+		newChildDescriptors.add(createChildParameter(EjbPackage.eINSTANCE.getRelationships_Descriptions(), CommonFactory.eINSTANCE.createDescription()));
+
+		newChildDescriptors.add(createChildParameter(EjbPackage.eINSTANCE.getRelationships_Descriptions(), WscommonFactory.eINSTANCE.createDescriptionType()));
+	}
+
+	/**
+	 * Return the resource locator for this item provider's resources. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public ResourceLocator getResourceLocator() {
+		return J2EEPlugin.getDefault();
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/RoleSourceItemProvider.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/RoleSourceItemProvider.java
new file mode 100644
index 0000000..5e3859c
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/RoleSourceItemProvider.java
@@ -0,0 +1,182 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.internal.ejb.provider;
+
+
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.util.ResourceLocator;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
+import org.eclipse.jst.j2ee.common.CommonFactory;
+import org.eclipse.jst.j2ee.ejb.EjbPackage;
+import org.eclipse.jst.j2ee.ejb.RoleSource;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
+import org.eclipse.jst.j2ee.webservice.wscommon.WscommonFactory;
+
+
+/**
+ * This is the item provider adpater for a {@link org.eclipse.jst.j2ee.internal.internal.ejb.RoleSource}object.
+ */
+public class RoleSourceItemProvider extends EjbItemProviderAdapter {
+	/**
+	 * This constructs an instance from a factory and a notifier.
+	 */
+	public RoleSourceItemProvider(AdapterFactory adapterFactory) {
+		super(adapterFactory);
+	}
+
+	/**
+	 * This returns RoleSource.gif.
+	 */
+	@Override
+	public Object getImage(Object object) {
+		return J2EEPlugin.getPlugin().getImage("RoleSource"); //$NON-NLS-1$
+	}
+
+	/**
+	 * This returns the parent of the RoleSource.
+	 */
+	@Override
+	public Object getParent(Object object) {
+		return ((EObject) object).eContainer();
+	}
+
+	/**
+	 * This returns the property descriptors for the adapted class.
+	 */
+	@Override
+	public List getPropertyDescriptors(Object object) {
+		if (itemPropertyDescriptors == null) {
+			super.getPropertyDescriptors(object);
+
+			EjbPackage pkg = EjbPackage.eINSTANCE;
+
+			// This is for the description feature.
+			//
+			itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), EJBProviderLibrariesResourceHandler.getString("Description_2"), //$NON-NLS-1$
+						EJBProviderLibrariesResourceHandler.getString("The_description_property_of_the_role_source_3"), //$NON-NLS-1$
+						pkg.getRoleSource_Description(), true, ItemPropertyDescriptor.TEXT_VALUE_IMAGE));
+
+			// This is for the role feature.
+			//
+			itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), EJBProviderLibrariesResourceHandler.getString("Role_4"), //$NON-NLS-1$
+						EJBProviderLibrariesResourceHandler.getString("The_role_of_the_role_source_5"), //$NON-NLS-1$
+						pkg.getRoleSource_Role(), false));
+
+			// This is for the entityBean feature.
+			//
+			itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), EJBProviderLibrariesResourceHandler.getString("Entity_Bean_6"), //$NON-NLS-1$
+						EJBProviderLibrariesResourceHandler.getString("The_entity_bean_of_the_role_source_7"), //$NON-NLS-1$
+						pkg.getRoleSource_EntityBean(), false));
+
+		}
+		return itemPropertyDescriptors;
+	}
+
+	/**
+	 * This adds a property descriptor for the Description feature. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	protected void addDescriptionPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), getString("_UI_RoleSource_description_feature"), //$NON-NLS-1$
+					getString("_UI_PropertyDescriptor_description", "_UI_RoleSource_description_feature", "_UI_RoleSource_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+					EjbPackage.eINSTANCE.getRoleSource_Description(), true, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE));
+	}
+
+	/**
+	 * This adds a property descriptor for the Entity Bean feature. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	protected void addEntityBeanPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), getString("_UI_RoleSource_entityBean_feature"), //$NON-NLS-1$
+					getString("_UI_PropertyDescriptor_description", "_UI_RoleSource_entityBean_feature", "_UI_RoleSource_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+					EjbPackage.eINSTANCE.getRoleSource_EntityBean(), true));
+	}
+
+	/**
+	 * This specifies how to implement {@link #getChildren}and
+	 * {@link org.eclipse.emf.edit.command.AddCommand}and
+	 * {@link org.eclipse.emf.edit.command.RemoveCommand}support in {@link #createCommand}. <!--
+	 * begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public Collection getChildrenReferences(Object object) {
+		if (childrenReferences == null) {
+			super.getChildrenReferences(object);
+			childrenReferences.add(EjbPackage.eINSTANCE.getRoleSource_Descriptions());
+		}
+		return childrenReferences;
+	}
+
+
+	@Override
+	public String getText(Object object) {
+		RoleSource roleSource = ((RoleSource) object);
+		return EJBProviderLibrariesResourceHandler.getString("RoleSource__8") + roleSource.getDescription(); //$NON-NLS-1$
+	}
+
+	/**
+	 * This handles notification by calling {@link #fireNotifyChanged fireNotifyChanged}. <!--
+	 * begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public void notifyChanged(Notification notification) {
+		switch (notification.getFeatureID(RoleSource.class)) {
+			case EjbPackage.ROLE_SOURCE__DESCRIPTION :
+			case EjbPackage.ROLE_SOURCE__DESCRIPTIONS : {
+				fireNotifyChanged(notification);
+				return;
+			}
+		}
+		super.notifyChanged(notification);
+	}
+
+	/**
+	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
+	 * describing all of the children that can be created under this object. <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
+		super.collectNewChildDescriptors(newChildDescriptors, object);
+
+		newChildDescriptors.add(createChildParameter(EjbPackage.eINSTANCE.getRoleSource_Descriptions(), CommonFactory.eINSTANCE.createDescription()));
+
+		newChildDescriptors.add(createChildParameter(EjbPackage.eINSTANCE.getRoleSource_Descriptions(), WscommonFactory.eINSTANCE.createDescriptionType()));
+	}
+
+	/**
+	 * Return the resource locator for this item provider's resources. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public ResourceLocator getResourceLocator() {
+		return J2EEPlugin.getDefault();
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/SessionItemProvider.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/SessionItemProvider.java
new file mode 100644
index 0000000..17af6be
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbedit/org/eclipse/jst/j2ee/internal/ejb/provider/SessionItemProvider.java
@@ -0,0 +1,189 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.internal.ejb.provider;
+
+
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.util.ResourceLocator;
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
+import org.eclipse.jst.j2ee.common.CommonPackage;
+import org.eclipse.jst.j2ee.ejb.EjbPackage;
+import org.eclipse.jst.j2ee.ejb.Session;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
+
+
+/**
+ * This is the item provider adpater for a {@link org.eclipse.jst.j2ee.internal.internal.ejb.Session}object.
+ */
+public class SessionItemProvider extends EnterpriseBeanItemProvider {
+	/**
+	 * This constructs an instance from a factory and a notifier.
+	 */
+	public SessionItemProvider(AdapterFactory adapterFactory) {
+		super(adapterFactory);
+	}
+
+	/**
+	 * This returns Session.gif.
+	 */
+	@Override
+	public Object getImage(Object object) {
+		//	  Session sess = null;
+		// 	  if (object instanceof Session)
+		// 	    sess = (Session) object;
+		// 	  if (sess != null && sess.isVersion2_X())
+		// 	    return J2EEPlugin.getPlugin().getImage("20_ejb_obj"); //$NON-NLS-1$
+		return J2EEPlugin.getPlugin().getImage("sessionBean_obj"); //$NON-NLS-1$
+	}
+
+	/**
+	 * This returns the label text for the adapted class. <!-- begin-user-doc --> Don't remove this
+	 * method or it will be regenerated. <!-- end-user-doc -->
+	 *  
+	 */
+	@Override
+	public String getText(Object object) {
+		return super.getText(object);
+	}
+
+	/**
+	 * This handles notification by calling {@link #fireNotifyChanged fireNotifyChanged}. <!--
+	 * begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public void notifyChanged(Notification notification) {
+		switch (notification.getFeatureID(Session.class)) {
+			case EjbPackage.SESSION__TRANSACTION_TYPE :
+			case EjbPackage.SESSION__SERVICE_ENDPOINT :
+			case EjbPackage.SESSION__SESSION_TYPE : {
+				fireNotifyChanged(notification);
+				return;
+			}
+		}
+		super.notifyChanged(notification);
+	}
+
+	/**
+	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
+	 * describing all of the children that can be created under this object. <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
+		super.collectNewChildDescriptors(newChildDescriptors, object);
+	}
+
+	/**
+	 * This returns the label text for {@link org.eclipse.emf.edit.command.CreateChildCommand}.
+	 * <!-- begin-user-doc --> <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public String getCreateChildText(Object owner, Object feature, Object child, Collection selection) {
+		boolean qualify = feature == CommonPackage.eINSTANCE.getJNDIEnvRefsGroup_EjbRefs() || feature == CommonPackage.eINSTANCE.getJNDIEnvRefsGroup_EjbLocalRefs();
+		return getString(qualify ? "_UI_CreateChild_text2" : "_UI_CreateChild_text", //$NON-NLS-1$ //$NON-NLS-2$
+					new Object[]{getTypeText(child), getFeatureText(feature), getTypeText(owner)});
+	}
+
+	/**
+	 * Return the resource locator for this item provider's resources. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	@Override
+	public ResourceLocator getResourceLocator() {
+		return J2EEPlugin.getDefault();
+	}
+
+	/**
+	 * This returns the parent of the Session.
+	 */
+	@Override
+	public Object getParent(Object object) {
+		return super.getParent(object);
+	}
+
+	/**
+	 * This returns the property descriptors for the adapted class.
+	 */
+	@Override
+	public List getPropertyDescriptors(Object object) {
+		if (itemPropertyDescriptors == null) {
+			super.getPropertyDescriptors(object);
+
+			EjbPackage pkg = EjbPackage.eINSTANCE;
+
+			// This is for the transactionType feature.
+			//
+			itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), EJBProviderLibrariesResourceHandler.getString("TransactionType_UI_"), //$NON-NLS-1$ = "TransactionType"
+						EJBProviderLibrariesResourceHandler.getString("The_transactionType_proper_UI_"), //$NON-NLS-1$ = "The transactionType property"
+						pkg.getSession_TransactionType()));
+
+			// This is for the sessionType feature.
+			//
+			itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), EJBProviderLibrariesResourceHandler.getString("SessionType_UI_"), //$NON-NLS-1$ = "SessionType"
+						EJBProviderLibrariesResourceHandler.getString("The_sessionType_property_UI_"), //$NON-NLS-1$ = "The sessionType property"
+						pkg.getSession_SessionType()));
+
+		}
+		return itemPropertyDescriptors;
+	}
+
+	/**
+	 * This adds a property descriptor for the Transaction Type feature. <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	protected void addTransactionTypePropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), getString("_UI_Session_transactionType_feature"), //$NON-NLS-1$
+					getString("_UI_PropertyDescriptor_description", "_UI_Session_transactionType_feature", "_UI_Session_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+					EjbPackage.eINSTANCE.getSession_TransactionType(), true, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE));
+	}
+
+	/**
+	 * This adds a property descriptor for the Session Type feature. <!-- begin-user-doc --> <!--
+	 * end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	protected void addSessionTypePropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), getString("_UI_Session_sessionType_feature"), //$NON-NLS-1$
+					getString("_UI_PropertyDescriptor_description", "_UI_Session_sessionType_feature", "_UI_Session_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+					EjbPackage.eINSTANCE.getSession_SessionType(), true, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE));
+	}
+
+	/**
+	 * This adds a property descriptor for the Service Endpoint feature. <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * 
+	 * @generated
+	 */
+	protected void addServiceEndpointPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), getString("_UI_Session_serviceEndpoint_feature"), //$NON-NLS-1$
+					getString("_UI_PropertyDescriptor_description", "_UI_Session_serviceEndpoint_feature", "_UI_Session_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+					EjbPackage.eINSTANCE.getSession_ServiceEndpoint(), true));
+	}
+
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbvalidator/org/eclipse/jst/j2ee/internal/ejb/workbench/validation/EJBHelper.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbvalidator/org/eclipse/jst/j2ee/internal/ejb/workbench/validation/EJBHelper.java
new file mode 100644
index 0000000..474a773
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbvalidator/org/eclipse/jst/j2ee/internal/ejb/workbench/validation/EJBHelper.java
@@ -0,0 +1,751 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2007 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.internal.ejb.workbench.validation;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.xmi.XMIResource;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IRegion;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.ITypeHierarchy;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jem.internal.adapters.jdom.JDOMSearchHelper;
+import org.eclipse.jem.internal.plugin.JavaEMFNature;
+import org.eclipse.jem.java.Field;
+import org.eclipse.jem.java.JavaClass;
+import org.eclipse.jem.java.JavaHelpers;
+import org.eclipse.jem.java.Method;
+import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
+import org.eclipse.jem.workbench.utility.JemProjectUtilities;
+import org.eclipse.jst.j2ee.common.SecurityRoleRef;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.EARFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.EJBJarFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.ModuleFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.OpenFailureException;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.util.ArchiveUtil;
+import org.eclipse.jst.j2ee.componentcore.EnterpriseArtifactEdit;
+import org.eclipse.jst.j2ee.ejb.CommonRelationshipRole;
+import org.eclipse.jst.j2ee.ejb.EJBJar;
+import org.eclipse.jst.j2ee.ejb.EJBRelation;
+import org.eclipse.jst.j2ee.ejb.EJBRelationshipRole;
+import org.eclipse.jst.j2ee.ejb.EjbPackage;
+import org.eclipse.jst.j2ee.ejb.EnterpriseBean;
+import org.eclipse.jst.j2ee.ejb.MethodElement;
+import org.eclipse.jst.j2ee.ejb.MethodPermission;
+import org.eclipse.jst.j2ee.ejb.MethodTransaction;
+import org.eclipse.jst.j2ee.ejb.internal.plugin.EjbPlugin;
+import org.eclipse.jst.j2ee.internal.J2EEConstants;
+import org.eclipse.jst.j2ee.internal.validation.AWorkbenchMOFHelper;
+import org.eclipse.jst.j2ee.model.internal.validation.EJBValidator;
+import org.eclipse.jst.j2ee.model.internal.validation.EJBValidatorModelEnum;
+import org.eclipse.jst.j2ee.model.internal.validation.InvalidInputException;
+import org.eclipse.jst.j2ee.model.internal.validation.MessageUtility;
+import org.eclipse.jst.j2ee.model.internal.validation.ValidationRuleUtility;
+import org.eclipse.wst.common.componentcore.ArtifactEdit;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.internal.util.ComponentUtilities;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.internal.emfworkbench.WorkbenchResourceHelper;
+import org.eclipse.wst.validation.internal.operations.WorkbenchReporter;
+import org.eclipse.wst.validation.internal.provisional.core.IReporter;
+
+/**
+ * Load the EJB MOF model and return resources for the EJB Validator.
+ */
+public class EJBHelper extends AWorkbenchMOFHelper {
+	//protected EJBProjectResources _projectResources = null;
+//	private IJavaProject[] _dependentJavaProjects = null;
+	private IJavaProject[] _requiredJavaProjects = null;
+//	private IJavaProject _javaProject = null; // this IProject, as an
+	// IJavaProject
+	private Set _tempSet = null;
+	private Map _projectMap = null; // Key is IJavaProject instance, value is
+	// either IJavaMOFNature (for non-EJB
+	// projects) or an EJBProjectResources. See
+	// constructor for more details.
+	private static final JavaClass[] EMPTY_ARRAY_JAVACLASS = new JavaClass[0];
+	private ArtifactEdit edit = null;
+	private EJBJarFile ejbJarFile = null;
+	private EJBJar ejbJar = null;
+
+	public EJBHelper() {
+		super();
+		// In the loadChildren method, every time that a JavaClass changes, we
+		// need to load the
+		// JavaClass which extend/implement it. Because we cannot assume that
+		// every JavaClass child
+		// is contained in this project, or that every JavaClass child is in an
+		// EJB project,
+		// maintain a cache of IJavaProject <-> IJavaMOFNature mappings.
+		// Whenever we need to load the JavaClass
+		// for an IType, if the IType's project is not this project, then
+		// return the resource set of
+		// the IType's IProject's nature. see the getResourceSet(IType) method.
+		//
+		// Key = IJavaProject
+		// Value = IJavaMOFNature or EJBProjectResources
+		// This cache does not contain the current IJavaProject or its nature.
+		// Access those through
+		// the getProjectResources() method.
+		_projectMap = new HashMap();
+		registerModel(EJBValidatorModelEnum.EJB, "loadBeans", new Class[]{JavaClass.class}); //$NON-NLS-1$
+		registerModel(EJBValidatorModelEnum.CHILDREN, "loadChildren", new Class[]{IReporter.class, Set.class}); //$NON-NLS-1$
+		registerModel(EJBValidatorModelEnum.EJB_MODEL, "loadEjbModel"); //$NON-NLS-1$
+		registerModel(EJBValidatorModelEnum.EJB_FILE, "loadEjbFile"); //$NON-NLS-1$
+		registerModel(EJBValidatorModelEnum.EJB_CLIENTJAR, "loadClientJAR", new Class[]{String.class}); //$NON-NLS-1$
+		registerModel(EJBValidatorModelEnum.REMOVE_OLD_MESSAGES, "removeOldMessages", new Class[]{IReporter.class, Map.class}); //$NON-NLS-1$
+	}
+
+	/**
+	 * When the validation is complete, this method will be called so that the IWorkbenchContext can
+	 * clean up any resources it allocated during the validation.
+	 * 
+	 * If the cleanup is a long-running operation, subtask messages should be sent to the IReporter.
+	 */
+	@Override
+	public void cleanup(WorkbenchReporter reporter) {
+//		if (_projectResources != null) {
+//			_projectResources.cleanup();
+//			_projectResources = null;
+//		}
+		if (_projectMap != null) {
+//			Iterator iterator = _projectMap.values().iterator();
+//			while (iterator.hasNext()) {
+//				Object value = iterator.next();
+//				if (value instanceof EJBProjectResources) {
+//					((EJBProjectResources) value).cleanup();
+//				}
+//			}
+			_projectMap.clear();
+		}
+//		_dependentJavaProjects = null;
+//		_javaProject = null;
+		ejbJar = null;
+		if (edit != null) {
+			edit.dispose();
+			edit = null;
+		}
+		if(null != ejbJarFile){
+			ejbJarFile.close();
+			ejbJarFile = null;
+		}
+		
+	}
+
+	/**
+	 * Given an IMessage's target object, return a string which identifies the object, so that the
+	 * user can locate it. This method is called only if getLineNo() doesn't return a line number.
+	 */
+	@Override
+	public String getDescription(Object object) {
+		if (object == null) {
+			return ""; //$NON-NLS-1$
+		}
+		if (object instanceof JavaClass) {
+			return ResourceHandler.getExternalizedMessage(EJBHelperConstants.LOC_CLASS, new String[]{((JavaClass) object).getQualifiedName()});
+		} else if (object instanceof Method) {
+			Method method = (Method) object;
+			JavaClass clazz = method.getContainingJavaClass();
+			return ResourceHandler.getExternalizedMessage(EJBHelperConstants.LOC_METHOD, new String[]{method.getMethodElementSignature(), clazz.getQualifiedName()});
+		} else if (object instanceof Field) {
+			Field field = (Field) object;
+			JavaClass clazz = field.getContainingJavaClass();
+			return ResourceHandler.getExternalizedMessage(EJBHelperConstants.LOC_FIELD, new String[]{field.getName(), clazz.getQualifiedName()});
+		} else if (object instanceof EnterpriseBean) {
+			return ResourceHandler.getExternalizedMessage(EJBHelperConstants.LOC_BEAN, new String[]{((EnterpriseBean) object).getName()});
+		} else if (object instanceof EJBJar) {
+			return ((EJBJar) object).getDisplayName();
+		} else if (object instanceof EJBJarFile) {
+			return ((EJBJarFile) object).getName();
+		} else if (object instanceof EARFile) {
+			return ((EARFile) object).getName();
+		} else if (object instanceof CommonRelationshipRole) {
+			// EJB 1.1 relationship role
+			CommonRelationshipRole role = (CommonRelationshipRole) object;
+			EnterpriseBean bean = role.getSourceEntity();
+			return ResourceHandler.getExternalizedMessage(EJBHelperConstants.LOC_ROLE, new String[]{role.getName(), ((bean == null) ? "?" : bean.getName())}); //$NON-NLS-1$
+		} else if (object instanceof EJBRelation) {
+			// EJB 2.0 <ejb-relation>
+			EJBRelation relation = (EJBRelation) object;
+			return ResourceHandler.getExternalizedMessage(EJBHelperConstants.LOC_EJBRELATION, new String[]{relation.getName()});
+		} else if (object instanceof EJBRelationshipRole) {
+			// EJB 2.0 <ejb-relationship-role>
+			EJBRelationshipRole role = (EJBRelationshipRole) object;
+			EJBRelation relation = role.getRelationship();
+			return ResourceHandler.getExternalizedMessage(EJBHelperConstants.LOC_EJBRELATIONSHIPROLE, new String[]{role.getName(), ((relation == null) ? "?" : relation.getName())}); //$NON-NLS-1$
+		} else if (object instanceof MethodElement) {
+			MethodElement element = (MethodElement) object;
+			EnterpriseBean bean = element.getEnterpriseBean();
+			return ResourceHandler.getExternalizedMessage(EJBHelperConstants.LOC_METHODELEMENT, new String[]{element.getName(), ((bean == null) ? "?" : bean.getName())}); //$NON-NLS-1$
+		} else if (object instanceof MethodPermission) {
+			MethodPermission element = (MethodPermission) object;
+			String description = (element.eIsSet(EjbPackage.eINSTANCE.getMethodPermission_Description())) ? element.getDescription() : ((XMIResource) element.eResource()).getID(element);
+			return ResourceHandler.getExternalizedMessage(EJBHelperConstants.LOC_METHODPERMISSION, new String[]{description});
+		} else if (object instanceof MethodTransaction) {
+			MethodTransaction element = (MethodTransaction) object;
+			String description = (element.eIsSet(EjbPackage.eINSTANCE.getMethodTransaction_Description())) ? element.getDescription() : ((XMIResource) element.eResource()).getID(element);
+			return ResourceHandler.getExternalizedMessage(EJBHelperConstants.LOC_METHODTRANSACTION, new String[]{description});
+		} else if (object instanceof SecurityRoleRef) {
+			SecurityRoleRef ref = (SecurityRoleRef) object;
+			return ResourceHandler.getExternalizedMessage(EJBHelperConstants.LOC_ROLEREF, new String[]{ref.getName()});
+		}
+		return super.getDescription(object);
+	}
+
+	@Override
+	public IResource getResource(Object object) {
+		IResource result = super.getResource(object);
+		if ((result != null) && (result.exists())) {
+			return result;
+		}
+		if (object == null) {
+			return null;
+		}
+		if (object instanceof Method) {
+			return getFile(((Method) object).getContainingJavaClass());
+		} else if (object instanceof Field) {
+			return getFile(((Field) object).getContainingJavaClass());
+		} else if (object instanceof JavaClass) {
+			return getFile((JavaClass) object);
+		} else if (object instanceof EObject) {
+			return WorkbenchResourceHelper.getFile(((EObject) object).eResource());
+		}
+		return null;
+	}
+
+	/**
+	 * When an IValidator associates a target object with an IMessage, the WorkbenchReporter
+	 * eventually resolves that target object with an IResource. Sometimes more than one target
+	 * object resolves to the same IResource (usually the IProject, which is the default IResource
+	 * when an IFile cannot be found). This method is called, by the WorkbenchReporter, so that the
+	 * WorkbenchReporter can distinguish between the IMessages which are on the same IResource, but
+	 * refer to different target objects. This is needed for the removeAllMessages(IValidator,
+	 * Object) method, so that when one target object removes all of its messages, that it doesn't
+	 * remove another target object's messages.
+	 * 
+	 * This method may return null only if object is null. Otherwise, an id which can uniquely
+	 * identify a particular object must be returned. The id needs to be unique only within one
+	 * particular IValidator.
+	 */
+	@Override
+	public String getTargetObjectName(Object obj) {
+		if (obj == null) {
+			return null;
+		} else if (obj instanceof Method) {
+			return ((Method) obj).getJavaClass().getQualifiedName();
+		} else if (obj instanceof Field) {
+			return ((Field) obj).getJavaClass().getQualifiedName();
+		} else if (obj instanceof JavaClass) {
+			return ((JavaClass) obj).getQualifiedName();
+		} else if (obj instanceof EnterpriseBean) {
+			return "META-INF/ejb-jar.xml"; // Should resolve to ejb-jar.xml. //$NON-NLS-1$
+		} else if (obj instanceof EJBJar) {
+			return "META-INF/ejb-jar.xml"; // Should resolve to ejb-jar.xml. //$NON-NLS-1$
+		} else if (obj instanceof ModuleFile) {
+			return "META-INF/ejb-jar.xml"; // Should resolve to ejb-jar.xml. //$NON-NLS-1$
+		} else {
+			return ""; //$NON-NLS-1$
+		}
+	}
+
+	@Override
+	public Object loadModel(String symbolicName, Object[] parms) {
+		if (isRegistered(symbolicName)) {
+			// one of the constants listed in the constructor
+			return super.loadModel(symbolicName, parms);
+		}
+		// else, it's a URI as calculated by getPortableName(IResource)
+		Object[] result = new Object[2];
+		JavaClass clazz = load(symbolicName); // symbolic name is really the
+		// name of a java class
+		//D247561 if(clazz == null) {
+		//			return null;
+		//		}
+		// Fix this problem in a later release.
+		result[0] = clazz;
+		result[1] = loadBeans((JavaClass) result[0]);
+		return result;
+	}
+
+	public JavaClass load(String uri) {
+		//ToDo:revisit this
+		return null;
+	}
+
+	/**
+	 * Return a List of the EnterpriseBeans which use this JavaClass as a remote, home, bean class
+	 * or key. This method takes an Object[] parameter so that it can be called by the
+	 * WorkbenchContext's load mechanism. It is expected that this parameter has one entry, and that
+	 * entry is an instance of a JavaClass.
+	 */
+	public List loadBeans(JavaClass clazz) {
+		if (clazz == null) {
+			return Collections.EMPTY_LIST;
+		}
+		// First check this project for beans
+		Set tempSet = getTempSet();
+		
+//		ToDO: fix  this
+//		addBeans(clazz, getProjectResources(), tempSet);
+//		// And then check all projects which depend on this one
+//		for (int i = 0; i < _dependentJavaProjects.length; i++) {
+//			Object value = _projectMap.get(_dependentJavaProjects[i]);
+//			if (value instanceof EJBProjectResources) {
+//				addBeans(clazz, (EJBProjectResources) value, tempSet);
+//			}
+//		}
+		List list = new ArrayList();
+		list.addAll(tempSet);
+		return list;
+	}
+
+	/**
+	 * Given a list of all of the java types, return a list of all JavaClass types that extend or
+	 * implement these types.
+	 */
+	public JavaClass[] loadChildren(IReporter reporter, Set classes) {
+		JavaClass[] children = EMPTY_ARRAY_JAVACLASS;
+//		int executionMap = 0;
+		Set tempSet = getTempSet();
+		try {
+			if ((classes == null) || (classes.size() == 0)) {
+//				executionMap |= 0x00000001;
+				return children;
+			}
+			IProgressMonitor monitor = ((WorkbenchReporter) reporter).getProgressMonitor();
+			if (classes.size() == 1) {
+				JavaClass clazz = (JavaClass) classes.toArray()[0];
+				IType type = getType(clazz);
+				if (type != null) {
+					ITypeHierarchy hierarchy = type.newTypeHierarchy(monitor);
+					IType[] subtypes = hierarchy.getAllSubtypes(type);
+					if ((subtypes != null) && (subtypes.length > 0)) {
+						for (int j = 0; j < subtypes.length; j++) {
+							tempSet.add(subtypes[j]);
+						}
+					}
+				}
+			} else {
+				// Create a region so that only the top (root) types are used
+				// as input to the newTypeHierarchy method. The
+				// newTypeHierarchyMethod
+				// is a heavy method, so the less it's called, the better.
+				IRegion region = JavaCore.newRegion();
+				Iterator iterator = classes.iterator();
+				while (iterator.hasNext()) {
+					if (reporter.isCancelled()) {
+//						executionMap |= 0x00000002;
+						return children;
+					}
+					JavaClass clazz = (JavaClass) iterator.next();
+					IType type = getType(clazz);
+					if (type == null) {
+//						if (aLogger.isLoggingLevel(Level.FINER)) {
+//							LogEntry entry = getLogEntry();
+//							entry.setSourceID("EJBHelper::loadChildren(JavaClass[])::region"); //$NON-NLS-1$
+//							entry.setText((clazz != null) ? clazz.getJavaName() : "null JavaClass"); //$NON-NLS-1$
+//							aLogger.write(Level.FINER, entry);
+//						}
+					} else {
+						region.add(type);
+					}
+				}
+				// Now that we know what the top types are, calculate the
+				// hierarchies
+				// for all of these types in the workspace.
+				IJavaElement[] rootTypes = region.getElements();
+				ITypeHierarchy[] rootHierarchies = new ITypeHierarchy[rootTypes.length];
+				for (int i = 0; i < rootTypes.length; i++) {
+					if (reporter.isCancelled()) {
+//						executionMap |= 0x00000004;
+						return children;
+					}
+					IType type = (IType) rootTypes[i];
+//					long hStart = System.currentTimeMillis();
+					ITypeHierarchy hierarchy = type.newTypeHierarchy(monitor);
+//					long hEnd = System.currentTimeMillis();
+//					if (aLogger.isLoggingLevel(Level.FINER)) {
+//						LogEntry entry = getLogEntry();
+//						entry.setSourceID("EJBHelper::loadChildren(JavaClass[])::newTypeHierarchy"); //$NON-NLS-1$
+//						entry.setElapsedTime(hEnd - hStart);
+//						entry.setText(type.getElementName());
+//						aLogger.write(Level.FINER, entry);
+//					}
+					rootHierarchies[i] = hierarchy;
+				}
+				// For each of the changed types, find its subtypes. Add each
+				// subtype to a set so that there are no duplicates.
+				iterator = classes.iterator();
+				while (iterator.hasNext()) {
+					if (reporter.isCancelled()) {
+						return children;
+					}
+					JavaClass clazz = (JavaClass) iterator.next();
+					IType type = getType(clazz);
+					if (type == null) {
+						continue;
+					}
+					for (int i = 0; i < rootHierarchies.length; i++) {
+						ITypeHierarchy hierarchy = rootHierarchies[i];
+						if (hierarchy.contains(type)) {
+							IType[] subtypes = hierarchy.getAllSubtypes(type);
+							if ((subtypes == null) || (subtypes.length == 0)) {
+								continue;
+							}
+							for (int j = 0; j < subtypes.length; j++) {
+								tempSet.add(subtypes[j]);
+							}
+							break; // don't need to check the rest of the
+							// hierarchies, because each hierarchy is
+							// distinct
+						}
+					}
+				}
+			}
+			int count = 0;
+			JavaClass[] tempChildren = new JavaClass[tempSet.size()];
+			Iterator iterator = tempSet.iterator();
+			while (iterator.hasNext()) {
+				IType type = (IType) iterator.next();
+				if (type == null) {
+//					if (aLogger.isLoggingLevel(Level.FINER)) {
+//						LogEntry entry = getLogEntry();
+//						entry.setSourceID("EJBHelper::loadChildren(JavaClass[])"); //$NON-NLS-1$
+//						entry.setText("null type used in project " + getProject().getName()); //$NON-NLS-1$
+//						aLogger.write(Level.FINER, entry);
+//					}
+					continue;
+				}
+				JavaHelpers child = getJavaClass(type);
+				if ((child != null) && (child.getWrapper() != null)) {
+					tempChildren[count++] = child.getWrapper();
+				} else {
+//					if (aLogger.isLoggingLevel(Level.FINER)) {
+//						LogEntry entry = getLogEntry();
+//						entry.setSourceID("EJBHelper::loadChildren(JavaClass[])"); //$NON-NLS-1$
+//						entry.setText(type.getElementName() + " was found in project " + type.getJavaProject().getProject().getName() + ", but either the JavaHelpers is null or its wrapper is null."); //$NON-NLS-1$ //$NON-NLS-2$
+//						aLogger.write(Level.FINER, entry);
+//					}
+				}
+			}
+			if (count != tempChildren.length) {
+//				executionMap |= 0x00000008;
+				children = new JavaClass[count];
+				System.arraycopy(tempChildren, 0, children, 0, count);
+				tempChildren = null;
+			} else {
+//				executionMap |= 0x00000010;
+				children = tempChildren;
+			}
+		} catch (JavaModelException exc) {
+//			executionMap |= 0x00000020;
+			EjbPlugin.logError(exc);
+		} catch (Throwable exc) {
+//			executionMap |= 0x00000040;
+			EjbPlugin.logError(exc);
+		} finally {
+			getTempSet().clear();
+//			end = System.currentTimeMillis();
+//			aLogger = getMsgLogger();
+//			if (aLogger.isLoggingLevel(Level.FINER)) {
+//				StringBuffer buffer = new StringBuffer("Children found in project "); //$NON-NLS-1$
+//				buffer.append(getProject().getName());
+//				buffer.append(": IType["); //$NON-NLS-1$
+//				buffer.append(children.length);
+//				buffer.append("] = {"); //$NON-NLS-1$
+//				for (int i = 0; i < children.length; i++) {
+//					JavaClass clazz = children[i];
+//					buffer.append(clazz.getJavaName());
+//					buffer.append(", "); //$NON-NLS-1$
+//				}
+//				buffer.append("}"); //$NON-NLS-1$
+//				LogEntry entry = getLogEntry();
+//				entry.setSourceID("EJBHelper::loadChildren(JavaClass[])"); //$NON-NLS-1$
+//				entry.setText(buffer.toString());
+//				entry.setElapsedTime(end - start);
+//				entry.setExecutionMap(executionMap);
+//				aLogger.write(Level.FINER, entry);
+//			}
+		}
+		return children;
+	}
+
+	/**
+	 * Load the EJB MOF model.
+	 */
+	public EObject loadEjbFile() {
+		
+			IVirtualComponent comp = ComponentCore.createComponent(getProject());
+			edit = ComponentUtilities.getArtifactEditForRead(comp);
+			
+			try {
+				return  ((EnterpriseArtifactEdit) edit).asArchive(false);
+			} catch (OpenFailureException e1) {
+				EjbPlugin.logError(e1);
+			}
+		return null;		
+	}
+
+	/**
+	 * Load the EJB MOF model.
+	 */
+	public EObject loadEjbModel() {
+		if( ejbJar == null){
+			IVirtualComponent comp = ComponentCore.createComponent(getProject());
+			edit = ComponentUtilities.getArtifactEditForRead(comp);
+			
+			try {
+				ejbJarFile = (EJBJarFile)((EnterpriseArtifactEdit) edit).asArchive(false);
+				ejbJar = ejbJarFile.getDeploymentDescriptor();
+			} catch (OpenFailureException e1) {
+				EjbPlugin.logError(e1);
+			}
+		}
+		return ejbJar;
+	}
+	
+
+
+	/**
+	 * Return a Boolean.TRUE if at least one of the EARs that contain this EJB module also contains
+	 * the named client JAR, and the IProject that is the EJB client is accessible. If the project
+	 * cannot be found, or is not accessible, return Boolean.FALSE. A null from this method means
+	 * that the helper does not support this symbolic model.
+	 */
+	public Boolean loadClientJAR(String clientJARName) {
+		//ToDO: fix  this
+		
+//		EJBProjectResources res = getProjectResources();
+//		EJBNatureRuntime nature = res.getEJBNature();
+//		if (nature != null) {
+//			IProject project = nature.getDefinedEJBClientJARProject();
+//			if (project == null) {
+//				EARNatureRuntime[] earNatures = nature.getReferencingEARProjects();
+//				for (int i = 0; i < earNatures.length; i++) {
+//					EARNatureRuntime earNature = earNatures[i];
+//					IFile file = earNature.getFile(clientJARName);
+//					if (file == null)
+//						return Boolean.FALSE;
+//				}
+//			} else if (!project.isAccessible())
+//				return Boolean.FALSE;
+//		}
+//		return Boolean.TRUE;
+		return Boolean.TRUE;
+	}
+
+	/**
+	 * This method can be overriden by AWorkbenchHelpers, if they wish to perform some
+	 * initialization once the IProject is set. Default is to do nothing.
+	 * 
+	 * For example, if this IWorkbenchContext delegates to another IWorkbenchContext, then that
+	 * IWorkbenchContext's setProject() method should be called here.
+	 */
+	@Override
+	public void initialize() {
+		super.initialize();
+		// Always new up the project resources, because the project's model
+		// needs to be reloaded every time the project is reset. (i.e., when
+		// setProject(IProject) is called, this helper is working on a new
+		// project, and its underlying model may have changed since the last
+		// time this helper saw it.
+		//
+		// Since the setProject can be called multiple times by the
+		// framework, always make sure that the currently loaded
+		// projectResources is cleaned up before it's removed.
+		// That is, if _projectResources is not null, then this
+		// helper has been initialized with an IProject before. The
+		// initialization occurs every time this IValidationContext is retrieved
+		// from the ValidationRegistryReader.
+		//
+		// After this IValidationContext is retrieved, validation may or may not be
+		// performed with it. For example, if the properties page is brought
+		// up by the user, this helper will be retrieved in order to enable,
+		// or disable, the EJB Validator. If validation has not run with this
+		// helper, _projectResources may be initialized with the wrong
+		// IProject.
+		// If _projectResources has not been used for validation, it will have
+		// loaded nothing, and the cost of cleaning is minimal. If validation
+		// was run with this project, then _projectResources will be null,
+		// because cleanup(WorkbenchReporter) is called after validation
+		// completes.
+//		if (_projectResources != null) {
+//			cleanup(null);
+//		}
+//		_projectResources = new EJBProjectResources(getProject());
+		// Now build the cache of IJavaProjects which depend on this IProject.
+//		_javaProject = JavaCore.create(getProject());
+//		_dependentJavaProjects = DependencyUtil.getDependentJavaProjects(_javaProject);
+	}
+
+//	protected EJBProjectResources getProjectResources() {
+//		return _projectResources;
+//	}
+
+	// Can't assume that the JavaClass is in this project, so load its IType,
+	// and retrieve the IJavaProject
+	// from the IType, and then look in that projct.
+	protected IFile getFile(JavaClass clazz) {
+		// Not in the current project, so check the IType's project
+		IType type = getType(clazz);
+		if (type == null) {
+			return null;
+		}
+		IResource resource = type.getResource();
+		if (resource != null && resource.getType() == IResource.FILE && resource.isAccessible())
+			return (IFile) resource;
+		return null;
+	}
+
+	protected JavaHelpers getJavaClass(IType type) {
+		try {
+			ResourceSet resourceSet = getJEMResourceSet();
+			if (resourceSet == null) {
+				return null;
+			}
+			return ValidationRuleUtility.getType(type.getFullyQualifiedName(), resourceSet);
+		} catch (InvalidInputException e) {
+			// this exception has already been logged by ValidationRuleUtility
+			return null;
+		}
+	}
+
+	private IType getType(JavaClass clazz) {
+		if (clazz == null) {
+			return null;
+		}
+		IProject project = ProjectUtilities.getProject(clazz);
+		IJavaProject javaProj = JemProjectUtilities.getJavaProject(project);
+		return JDOMSearchHelper.findType(clazz.getJavaPackage().getName(), clazz.getName(), javaProj);
+	}
+
+//	private void addBeans(JavaClass clazz, Set tempSet) {
+//		
+//		
+//			IVirtualComponent comp = ComponentCore.createComponent(getProject());
+//			ArtifactEdit edit = ComponentUtilities.getArtifactEditForRead(comp);
+//			try {
+//				EJBJar ejbJar = ((EJBArtifactEdit) edit).getEJBJar();
+//				if (ejbJar == null) {
+//					return;
+//				}
+//				tempSet.addAll(ejbJar.getEnterpriseBeansWithReference(clazz));
+//			}finally {
+//				if (edit != null) {
+//					edit.dispose();
+//				}
+//			}
+//	}
+
+	// Can't assume that the IType is in the same project as the parent class
+	// (loadChildren).
+	// So keep a cache of referenced IProjects. If a project is in this
+	// project's
+	// classpath,
+	// then it is likely that more than one type is used from the other
+	// project, so
+	// it's worth
+	// the overhead to keep a cache.
+	protected ResourceSet getJEMResourceSet() {
+		JavaEMFNature nature = JavaEMFNature.getRuntime(getProject());
+		if (nature == null) {
+			return null;
+		}
+		return nature.getResourceSet();
+	}
+
+	// To reduce object creation, create this hash set once. It's only used in
+	// the
+	// getSubTypes and loadBeans methods,
+	// so this technique is safe.
+	private Set getTempSet() {
+		if (_tempSet == null) {
+			_tempSet = new HashSet();
+		} else {
+			_tempSet.clear();
+		}
+		return _tempSet;
+	}
+
+	/**
+	 * @see org.eclipse.wst.validation.internal.operations.IWorkbenchContext#getPortableName(IResource)
+	 */
+	@Override
+	public String getPortableName(IResource resource) {
+		// Return the URI of the object.
+		if (!(resource instanceof IFile)) {
+			return super.getPortableName(resource);
+		}
+		IFile file = (IFile) resource;
+		if ((resource.getFileExtension() != null) && (resource.getFileExtension().equals("java"))) { //$NON-NLS-1$
+			JavaClass clazz = JemProjectUtilities.getJavaClass(file);
+			if (clazz == null) {
+				return super.getPortableName(resource);
+			}
+			return ArchiveUtil.classNameToJavaUri(clazz.getQualifiedName());
+		} else if ((resource.getFileExtension() != null) && (resource.getFileExtension().equals("class"))) { //$NON-NLS-1$
+			JavaClass clazz = JemProjectUtilities.getJavaClass(file);
+			if (clazz == null) {
+				return super.getPortableName(resource);
+			}
+			return ArchiveUtil.classNameToUri(clazz.getQualifiedName());
+		} else if (resource.getName().equals("ejb-jar.xml")) //$NON-NLS-1$
+			return J2EEConstants.EJBJAR_DD_URI;
+		return null;
+	}
+
+	public void removeOldMessages(IReporter reporter, Map targets) {
+		if (targets == null) {
+			// Full validation. Remove messages from all prerequisite (e.g.
+			// EJB
+			// client JAR) projects.
+			if (_requiredJavaProjects != null) {
+				for (int i = 0; i < _requiredJavaProjects.length; i++) {
+					IJavaProject jp = _requiredJavaProjects[i];
+					WorkbenchReporter.removeAllMessages(jp.getProject(), EJBValidator.getValidator());
+				}
+			}
+		} else if (targets.size() > 0) {
+			Iterator iterator = targets.keySet().iterator();
+			Set targetObjects = new HashSet();
+			while (iterator.hasNext()) {
+				Set ruleTargetObjects = (Set) targets.get(iterator.next());
+				targetObjects.addAll(ruleTargetObjects);
+			}
+			iterator = targetObjects.iterator();
+			while (iterator.hasNext()) {
+				EJBValidator.TargetObject to = (EJBValidator.TargetObject) iterator.next();
+				Object targetParent = to.getTargetParent();
+				Object target = to.getTarget();
+				String groupName = MessageUtility.getGroupName(targetParent);
+				reporter.removeMessageSubset(EJBValidator.getValidator(), target, groupName);
+			}
+		}
+		// else there's nothing to remove, so just return without doing
+		// anything
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbvalidator/org/eclipse/jst/j2ee/internal/ejb/workbench/validation/EJBHelperConstants.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbvalidator/org/eclipse/jst/j2ee/internal/ejb/workbench/validation/EJBHelperConstants.java
new file mode 100644
index 0000000..7a34dbdc
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbvalidator/org/eclipse/jst/j2ee/internal/ejb/workbench/validation/EJBHelperConstants.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2004 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.internal.ejb.workbench.validation;
+
+
+/**
+ * This class declares the string constants which are used only in WSAD.
+ *  
+ */
+public interface EJBHelperConstants {
+	//
+	// Location constants
+	//
+	// Used when a line number cannot be calculated, and thus the target of the message
+	// has to be described in words.
+	/* package */static final String LOC_CLASS = "LOC_CLASS"; //$NON-NLS-1$
+	/* package */static final String LOC_FIELD = "LOC_FIELD"; //$NON-NLS-1$
+	/* package */static final String LOC_METHOD = "LOC_METHOD"; //$NON-NLS-1$
+	/* package */static final String LOC_BEAN = "LOC_BEAN"; //$NON-NLS-1$
+	/* package */static final String LOC_ROLE = "LOC_ROLE"; //$NON-NLS-1$
+	/* package */static final String LOC_ROLEREF = "LOC_ROLEREF"; //$NON-NLS-1$
+	/* package */static final String LOC_METHODELEMENT = "LOC_METHODELEMENT"; //$NON-NLS-1$
+	/* package */static final String LOC_METHODPERMISSION = "LOC_METHODPERMISSION"; //$NON-NLS-1$
+	/* package */static final String LOC_METHODTRANSACTION = "LOC_METHODTRANSACTION"; //$NON-NLS-1$
+	/* package */static final String LOC_EJBRELATION = "LOC_EJBRELATION"; //$NON-NLS-1$
+	/* package */static final String LOC_EJBRELATIONSHIPROLE = "LOC_EJBRELATIONSHIPROLE"; //$NON-NLS-1$
+
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbvalidator/org/eclipse/jst/j2ee/internal/ejb/workbench/validation/EjbValidatorSchedulingRule.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbvalidator/org/eclipse/jst/j2ee/internal/ejb/workbench/validation/EjbValidatorSchedulingRule.java
new file mode 100644
index 0000000..ce09946
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbvalidator/org/eclipse/jst/j2ee/internal/ejb/workbench/validation/EjbValidatorSchedulingRule.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.internal.ejb.workbench.validation;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.jobs.ISchedulingRule;
+
+public class EjbValidatorSchedulingRule implements ISchedulingRule {
+
+	private IPath path;
+	
+	public EjbValidatorSchedulingRule(IPath path){
+		this.path = path;
+	}
+	public boolean contains(ISchedulingRule rule) {
+
+		if( this == rule )
+			return true;
+		
+		if( rule instanceof EjbValidatorSchedulingRule ){
+			String otherPath = ((EjbValidatorSchedulingRule)rule).path.toString();
+			return path.toString().equals( otherPath );
+		}
+		return false;
+	}
+
+	public boolean isConflicting(ISchedulingRule rule) {
+        if (!(rule instanceof EjbValidatorSchedulingRule))
+            return false;
+         String otherPath = ((EjbValidatorSchedulingRule)rule).path.toString();
+         return path.toString().equals( otherPath );
+	}
+
+	
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbvalidator/org/eclipse/jst/j2ee/internal/ejb/workbench/validation/ResourceHandler.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbvalidator/org/eclipse/jst/j2ee/internal/ejb/workbench/validation/ResourceHandler.java
new file mode 100644
index 0000000..e4efa9d
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbvalidator/org/eclipse/jst/j2ee/internal/ejb/workbench/validation/ResourceHandler.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.internal.ejb.workbench.validation;
+
+import java.util.MissingResourceException;
+
+import org.eclipse.jst.j2ee.ejb.internal.plugin.EjbPlugin;
+import org.eclipse.jst.j2ee.model.internal.validation.IEJBValidatorConstants;
+import org.eclipse.jst.j2ee.model.internal.validation.J2EEValidationResourceHandler;
+
+/**
+ * Insert the type's description here. Creation date: (1/22/01 4:13:13 PM)
+ * 
+ * @author: Administrator
+ */
+public final class ResourceHandler {
+	public final static String VALIDATION_PROP_FILE_NAME = IEJBValidatorConstants.BUNDLE_NAME;
+	private static ResourceHandler _handler = null;
+
+	/**
+	 * ResourceHandler constructor comment.
+	 */
+	private ResourceHandler() {
+		super();
+	}
+
+	public static String getExternalizedMessage(String key) {
+		try {
+			return J2EEValidationResourceHandler.getExternalizedMessage(VALIDATION_PROP_FILE_NAME, key, getHandler().getClass());
+		} catch (NullPointerException exc) {
+
+			EjbPlugin.log(EjbPlugin.createErrorStatus(key, exc));
+		}
+		return ""; //$NON-NLS-1$
+	}
+
+	public static String getExternalizedMessage(String key, String[] parms) {
+		String res = ""; //$NON-NLS-1$
+		try {
+			res = java.text.MessageFormat.format(getExternalizedMessage(key), (Object[])parms);
+		} catch (MissingResourceException exc) {
+
+			EjbPlugin.log(EjbPlugin.createErrorStatus(key, exc));
+		} catch (NullPointerException exc) {
+			EjbPlugin.log(EjbPlugin.createErrorStatus(key, exc));
+		}
+		return res;
+	}
+
+	public static ResourceHandler getHandler() {
+		if (_handler == null) {
+			_handler = new ResourceHandler();
+		}
+		return _handler;
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbvalidator/org/eclipse/jst/j2ee/internal/ejb/workbench/validation/UIEjbValidator.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbvalidator/org/eclipse/jst/j2ee/internal/ejb/workbench/validation/UIEjbValidator.java
new file mode 100644
index 0000000..4837a4c
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbvalidator/org/eclipse/jst/j2ee/internal/ejb/workbench/validation/UIEjbValidator.java
@@ -0,0 +1,79 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2007 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.internal.ejb.workbench.validation;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.jobs.ISchedulingRule;
+import org.eclipse.jst.j2ee.componentcore.EnterpriseArtifactEdit;
+import org.eclipse.jst.j2ee.ejb.componentcore.util.EJBArtifactEdit;
+import org.eclipse.jst.j2ee.internal.J2EEConstants;
+import org.eclipse.jst.j2ee.model.internal.validation.EJBValidator;
+import org.eclipse.jst.j2ee.project.JavaEEProjectUtilities;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualFile;
+import org.eclipse.wst.validation.internal.operations.IWorkbenchContext;
+import org.eclipse.wst.validation.internal.provisional.core.IReporter;
+import org.eclipse.wst.validation.internal.provisional.core.IValidationContext;
+import org.eclipse.wst.validation.internal.provisional.core.IValidatorJob;
+
+
+
+public class UIEjbValidator extends EJBValidator {
+	
+	/**
+	 * UIEjbValidator constructor comment.
+	 */
+	public UIEjbValidator() {
+		super();
+	}
+	
+	@Override
+	public IStatus validateInJob(IValidationContext inHelper, IReporter inReporter) throws
+	    org.eclipse.wst.validation.internal.core.ValidationException {
+		
+
+		IProject proj = ((IWorkbenchContext) inHelper).getProject();
+		if (JavaEEProjectUtilities.isEJBProject(proj)) {
+				EnterpriseArtifactEdit edit = null;
+				try {
+					edit = EJBArtifactEdit.getEJBArtifactEditForRead(proj);
+					if(edit != null && edit.getDeploymentDescriptorResource() != null)
+						return super.validateInJob(inHelper, inReporter);
+				} finally {
+					if (edit != null)
+						edit.dispose();
+				}
+		}
+		return IValidatorJob.OK_STATUS;
+		
+	}
+	
+	@Override
+	public ISchedulingRule getSchedulingRule(IValidationContext helper) {
+		
+		IProject project = ((IWorkbenchContext) helper).getProject();
+		IVirtualComponent comp = ComponentCore.createComponent( project );
+		IFile ejbJarFile = null;
+		if( comp != null ){
+			IVirtualFile vf = comp.getRootFolder().getFile(new Path(J2EEConstants.EJBJAR_DD_URI));
+			if( vf!= null ){
+				ejbJarFile = vf.getUnderlyingFile();
+			}
+		}
+		return ejbJarFile;
+	}	
+}		
+
+
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/icons/EJBJar.gif b/plugins/org.eclipse.jst.j2ee.ejb/icons/EJBJar.gif
new file mode 100644
index 0000000..f8b5c0a
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/icons/EJBJar.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/icons/full/obj16/11_ejbjar_deploy.gif b/plugins/org.eclipse.jst.j2ee.ejb/icons/full/obj16/11_ejbjar_deploy.gif
new file mode 100644
index 0000000..e9ddc0d
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/icons/full/obj16/11_ejbjar_deploy.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/icons/full/obj16/20_ejbjar_deploy.gif b/plugins/org.eclipse.jst.j2ee.ejb/icons/full/obj16/20_ejbjar_deploy.gif
new file mode 100644
index 0000000..af02e41
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/icons/full/obj16/20_ejbjar_deploy.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/plugin.properties b/plugins/org.eclipse.jst.j2ee.ejb/plugin.properties
new file mode 100644
index 0000000..67df387
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/plugin.properties
@@ -0,0 +1,29 @@
+###############################################################################
+# Copyright (c) 2003, 2007 IBM 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:
+# IBM Corporation - initial API and implementation
+###############################################################################
+#
+# This string is the name of one of the validators.
+# The name is displayed in the validation properties page
+# and also in subtask messages (e.g. "Invoking Map Validator on <file name>")
+#
+#
+# Version 1.6
+#
+EJB_VALIDATOR=EJB (1.x-2.x) Validator
+validation_UI_=Validation
+
+DEPLOY_TASK_UI_=EJB Deployment Message
+EJB_VALIDATION_PROBLEMMARKER_NAME=EJB Validator Message
+EJB_FACET_LABEL=EJB Module
+EJB_FACET_DESCRIPTION=Enables the project to be deployed as an EJB module.
+EJB_FACET_TEMPLATE=EJB Project
+
+Bundle-Vendor.0 = Eclipse Web Tools Platform
+Bundle-Name.0 = EJB component Plug-in
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/plugin.xml b/plugins/org.eclipse.jst.j2ee.ejb/plugin.xml
new file mode 100644
index 0000000..92d134c
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/plugin.xml
@@ -0,0 +1,252 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+
+    
+
+   <extension
+         id="EJBModuleExtension"
+         name="EJBModuleExtension"
+         point="org.eclipse.jst.j2ee.EARModuleExtension">
+      <earModuleExtension
+            extensionClass="org.eclipse.jst.j2ee.ejb.internal.plugin.EjbModuleExtensionImpl">
+      </earModuleExtension>
+   </extension>
+   <extension
+         point="org.eclipse.wst.common.emfworkbench.integration.adapterFactory">
+      <adapterFactory
+            functionGroupID="org.eclipse.jst.j2ee"
+            className="org.eclipse.jst.j2ee.internal.ejb.provider.EjbItemProviderAdapterFactory"
+            packageURI="ejb.xmi"
+            id="org.eclipse.jst.j2ee.ejb.provider.EjbItemProviderAdapterFactory">
+      </adapterFactory>
+   </extension>
+<!-- ====================================================== -->
+<!-- EJB Validator Extension		                        -->
+<!-- ====================================================== -->
+   <extension
+         id="EJBValidator"
+         name="%EJB_VALIDATOR"
+         point="org.eclipse.wst.validation.validator">
+      
+      <validator>
+      	 <enablement>
+      		<and>
+        		<test property="org.eclipse.wst.common.project.facet.core.projectFacet" value="jst.java"/>
+	  			<test property="org.eclipse.wst.common.project.facet.core.projectFacet" value="jst.ejb:2.1]"/>
+			</and>
+		</enablement> 
+         <contentTypeBinding
+               contentTypeId="org.eclipse.jst.j2ee.ejbDD">
+         </contentTypeBinding>
+         <filter
+               objectClass="org.eclipse.core.resources.IFile"
+               nameFilter="*.class">
+         </filter>
+         <filter
+               objectClass="org.eclipse.core.resources.IFile"
+               nameFilter="*.java">
+         </filter>
+         <helper
+               class="org.eclipse.jst.j2ee.internal.ejb.workbench.validation.EJBHelper">
+         </helper>
+         <dependentValidator
+               depValValue="true">
+         </dependentValidator>
+         <markerId
+               markerIdValue="EJBValidatorMarker">
+         </markerId>
+         <run
+               class="org.eclipse.jst.j2ee.internal.ejb.workbench.validation.UIEjbValidator">
+         </run>
+         <runStrategy 
+     	    project="true">
+         </runStrategy>
+      </validator>
+   </extension>
+   <extension
+         id="EJBValidatorMarker"
+         name="%EJB_VALIDATION_PROBLEMMARKER_NAME"
+         point="org.eclipse.core.resources.markers">
+      <super
+            type="org.eclipse.wst.validation.problemmarker">
+      </super>
+      <persistent
+            value="true">
+      </persistent>
+      <attribute
+            name="owner">
+      </attribute>
+      <attribute
+            name="validationSeverity">
+      </attribute>
+      <attribute
+            name="targetObject">
+      </attribute>
+      <attribute
+            name="groupName">
+      </attribute>
+      <attribute
+            name="messageId">
+      </attribute>
+   </extension>
+
+    
+    
+
+   <extension
+         point="org.eclipse.wst.common.modulecore.artifactedit">
+      <artifactedit
+            typeID="jst.ejb"
+            class="org.eclipse.jst.j2ee.ejb.componentcore.util.EJBArtifactEdit">
+      </artifactedit>
+   </extension> 
+   
+   <extension
+         point="org.eclipse.wst.common.emfworkbench.integration.editModel">
+      <editModel
+            editModelID="jst.ejb"
+            factoryClass="org.eclipse.jst.common.jdt.internal.integration.JavaArtifactEditModelFactory">
+         <editModelResource
+               autoload="false"
+               URI="META-INF/ejb-jar.xml"/>
+      </editModel>
+   </extension> 
+   
+   <!--============================-->
+   <!-- Builder Provider registrations-->
+   <!--============================--> 
+   	<extension
+         point="org.eclipse.wst.common.frameworks.DataModelProviderExtension">
+     	<ProviderDefinesType
+      		providerType="jst.ejb.builder"
+      		providerID="org.eclipse.jst.j2ee.internal.deployables.JavaComponentBuilderDataModelProvider"/>
+	</extension>
+    <extension
+          point="org.eclipse.wst.common.frameworks.DataModelProviderExtension">
+       <DataModelProvider
+             class="org.eclipse.jst.j2ee.ejb.internal.operations.NewSessionBeanClassDataModelProvider"
+             id="org.eclipse.jst.j2ee.ejb.internal.operations.NewSessionBeanClassDataModelProvider">
+       </DataModelProvider>
+    </extension>
+    <extension
+          point="org.eclipse.wst.common.frameworks.DataModelProviderExtension">
+       <DataModelProvider
+             class="org.eclipse.jst.j2ee.ejb.internal.operations.NewMessageDrivenBeanClassDataModelProvider"
+             id="org.eclipse.jst.j2ee.ejb.internal.operations.NewMessageDrivenBeanClassDataModelProvider">
+       </DataModelProvider>
+    </extension>
+	
+	
+  <!-- Project Facets -->
+	<extension point="org.eclipse.wst.common.project.facet.core.facets">
+
+    <project-facet id="jst.ejb">
+      <label>%EJB_FACET_LABEL</label>
+      <description>%EJB_FACET_DESCRIPTION</description>
+      <icon>icons/EJBJar.gif</icon>
+      <default-version version="3.1"/>
+    </project-facet>
+
+    <project-facet-version facet="jst.ejb" version="1.1">
+      <constraint>
+        <and>
+          <requires facet="jst.java" version="[1.3"/>
+          <conflicts group="modules"/>
+        </and>
+      </constraint>
+      <group-member id="modules"/>
+    </project-facet-version>
+
+    <project-facet-version facet="jst.ejb" version="2.0">
+      <constraint>
+        <and>
+          <requires facet="jst.java" version="[1.3"/>
+          <conflicts group="modules"/>
+        </and>
+      </constraint>
+      <group-member id="modules"/>
+    </project-facet-version>
+
+    <project-facet-version facet="jst.ejb" version="2.1">
+      <constraint>
+        <and>
+          <requires facet="jst.java" version="[1.3"/>
+          <conflicts group="modules"/>
+        </and>
+      </constraint>
+      <group-member id="modules"/>
+    </project-facet-version>
+
+	<project-facet-version facet="jst.ejb" version="3.0">
+		<constraint>
+ 	       <and>
+ 		       	<requires facet="jst.java" version="[5.0"/>
+ 	         	<conflicts group="modules"/>
+ 	       </and>
+    	</constraint>
+      	<group-member id="modules"/>
+    </project-facet-version>
+
+	<project-facet-version facet="jst.ejb" version="3.1">
+		<constraint>
+ 	       <and>
+ 		       	<requires facet="jst.java" version="[6.0"/>
+ 	         	<conflicts group="modules"/>
+ 	       </and>
+    	</constraint>
+      	<group-member id="modules"/>
+    </project-facet-version>
+    
+	<project-facet-version facet="jst.ejb" version="3.2">
+		<constraint>
+ 	       <and>
+ 		       	<requires facet="jst.java" version="[1.7"/>
+ 	         	<conflicts group="modules"/>
+ 	       </and>
+    	</constraint>
+      	<group-member id="modules"/>
+    </project-facet-version>
+    
+    <action facet="jst.ejb" type="INSTALL" id="jst.ejb.install">
+      <delegate class="org.eclipse.jst.j2ee.ejb.project.facet.EjbFacetInstallDelegate"/>
+      <config-factory class="org.eclipse.jst.j2ee.internal.ejb.project.operations.EjbFacetInstallDataModelProvider"/>
+    </action>
+    
+    <event-handler facet="jst.ejb" type="POST_INSTALL">
+      <delegate class="org.eclipse.jst.j2ee.ejb.project.facet.EjbFacetPostInstallDelegate"/>
+    </event-handler>
+    
+    <event-handler facet="jst.ejb" type="RUNTIME_CHANGED">
+      <delegate class="org.eclipse.jst.j2ee.project.facet.J2EEFacetRuntimeChangedDelegate"/>
+    </event-handler>
+    
+    <template id="template.jst.ejb">
+      <label>%EJB_FACET_TEMPLATE</label>
+      <fixed facet="jst.java"/>
+      <fixed facet="jst.ejb"/>
+    </template>
+	</extension>
+	
+	<!--
+	    Operation extension that updates the ejb client reference in the ejb-jar.xml
+	-->
+	<extension
+         point="org.eclipse.wst.common.frameworks.OperationExtension"
+         id="org.eclipse.jst.j2ee.ejb.refactor.operations">
+      <operationExtension
+            id="org.eclipse.jst.j2ee.refactor.operations.UpdateDependentModuleonDeleteOp"
+            postOperationClass="org.eclipse.jst.j2ee.internal.ejb.refactor.UpdateEJBClientRefOnDeleteOp"/>
+      <operationExtension
+            id="org.eclipse.jst.j2ee.refactor.operations.UpdateDependentModuleonRenameOp"
+            postOperationClass="org.eclipse.jst.j2ee.internal.ejb.refactor.UpdateEJBClientRefOnRenameOp"/>
+    </extension>
+
+   <extension
+        point="org.eclipse.jst.j2ee.J2EEModelProvider">
+        <provider>
+        	<modelProvider factoryClass="org.eclipse.jst.j2ee.ejb.componentcore.util.EJBArtifactEdit"/>	
+      		<facet id="jst.ejb" versions="1.1,2.0,2.1"/>
+      	</provider>
+   </extension>
+</plugin>
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/pom.xml b/plugins/org.eclipse.jst.j2ee.ejb/pom.xml
new file mode 100644
index 0000000..a0d2eee
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/pom.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Copyright (c) 2012, 2013 Eclipse Foundation and others.
+  All rights reserved. This program and the accompanying materials
+  are made available under the terms of the Eclipse Distribution License v1.0
+  which accompanies this distribution, and is available at
+  http://www.eclipse.org/org/documents/edl-v10.php
+ 
+  Contributors:
+    Thanh Ha (Eclipse Foundation) - initial implementation
+-->
+
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.eclipse.webtools.javaee</groupId>
+    <artifactId>javaee.plugins</artifactId>
+    <version>3.6.0-SNAPSHOT</version>
+  </parent>
+
+  <groupId>org.eclipse.webtools.ejb</groupId>
+  <artifactId>org.eclipse.jst.j2ee.ejb</artifactId>
+  <version>1.1.900-SNAPSHOT</version>
+  <packaging>eclipse-plugin</packaging>
+</project>
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/prepareforpii.xml b/plugins/org.eclipse.jst.j2ee.ejb/prepareforpii.xml
new file mode 100644
index 0000000..84b84cb
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/prepareforpii.xml
@@ -0,0 +1,38 @@
+<project name="PrepareForPII" default="main" basedir=".">
+		
+	<!-- Setup temp variables -->
+	<target name="init">
+		<property name="nlsDir" value="d:/NLS/Corona/0526"/>
+		<property name="plugin" value="com.ibm.wtp.ejb"/>
+		<property name="plugindir" value="d:/workspaceCorona/${plugin}"/>
+		<property name="outputDir" value="${nlsDir}/${plugin}"/>
+		
+	
+	</target>
+
+	<!-- Create the destination dir -->
+	<target name="nlsDir" depends="init">
+		<mkdir dir="${nlsDir}"/>
+	</target>
+	
+	<!-- Create the destination dir -->
+	<target name="plugindir" depends="nlsDir">
+		<delete dir="${outputDir}"/>
+		<mkdir dir="${outputDir}"/>
+	</target>
+
+	<!-- Move the files to the correct locations in the workspace. -->
+	<target name="main" depends="plugindir">
+	
+		<messageIdGen folderPath = "${plugindir}" componentId = "E" />
+		
+		<copy todir = "${outputDir}/property_files" >
+			 <fileset dir="${plugindir}/property_files">
+           	  <include name="**/*.properties"/>
+  			 </fileset>
+  		</copy>
+  		
+  		<copy file="${plugindir}/plugin.properties" todir="${outputDir}"/>
+  		
+	</target>
+</project>
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/property_files/ejbarchiveops.properties b/plugins/org.eclipse.jst.j2ee.ejb/property_files/ejbarchiveops.properties
new file mode 100644
index 0000000..7b8e60f
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/property_files/ejbarchiveops.properties
@@ -0,0 +1,37 @@
+###############################################################################
+# Copyright (c) 2003, 2004 IBM 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:
+# IBM Corporation - initial API and implementation
+###############################################################################
+#This properties file contains string for Archive operations of EARs,EJBs and Application Clients.
+
+ARCHIVE_OPERATION_SaveMofResources=Error occured saving the metadata file.
+ARCHIVE_OPERATION_SaveFile=Error occured saving the File..
+ARCHIVE_OPERATION_ProjectNature=Error getting project nature runtime..
+ARCHIVE_OPERATION_SaveManifest=Error occured saving the manifest..
+ARCHIVE_OPERATION_FileNotFound=Error: File not found
+ARCHIVE_OPERATION_FileContents=Core exception caught in gettting file contents..
+ARCHIVE_OPERATION_ErroOccured=Error occured...
+ARCHIVE_OPERATION_FilesFromProject=Unable to get files from the project..
+ARCHIVE_OPERATION_OpeningArchive=Error opening archive for export..
+ARCHIVE_OPERATION_InvalidEJBJar=The JAR file is not a valid EJB JAR
+ARCHIVE_OPERATION_InvalidImportEJBJar=The import file is not a valid EJB JAR
+ARCHIVE_OPERATION_ImportOperation=Import Operation Failed!
+EJB_IMPORT_OPERATION_STRING=Importing EJB JAR..
+EJB_IMPORT_FILE_STRING=Importing file..
+IMPORT_MOFRESOURCE_STRING=Importing meta-data..
+IMPORT_OPERATION_STRING=Importing JAR..
+ERROR_COPYING_FILES_FROM_ORIGINAL_JAR=An error occurred copying files from the original EJB JAR file
+ERROR_IMPORTING_MODULE_FILE=Error importing Module File
+Yes_UI=Yes
+No_UI=No
+Yes_To_All_UI=Yes to All
+Cancel_UI_=Cancel
+Error_exporting__UI_=Error exporting
+EJB_Jar_File_UI_=EJB JAR File
+
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/property_files/ejbcodegen.properties b/plugins/org.eclipse.jst.j2ee.ejb/property_files/ejbcodegen.properties
new file mode 100644
index 0000000..8e53a5d
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/property_files/ejbcodegen.properties
@@ -0,0 +1,51 @@
+###############################################################################
+# Copyright (c) 2003, 2004 IBM 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:
+# IBM Corporation - initial API and implementation
+###############################################################################
+New_key_attribute_added_wi_ERROR_=IWAE0001E New key attribute added without attribute helper.
+IWAJ0129E_The_Java_type_na_ERROR_=IWAE0002E The Java type named {0} could not be set for the {1} because its EJB is null.
+IWAJ0128E_Cannot_reflect_J_ERROR_=IWAE0003E Cannot reflect JavaClass because its name is not set within the command: {0}.
+IWAJ0130I_Cannot_perform_t_ERROR_=IWAE0004E IWAJ0130I Cannot perform the command request because the EJB is null for the command:
+IWAJ0131I_Cannot_add_the_f_ERROR_=IWAE0005E IWAJ0131I Cannot add the feature to the key because the feature is null for the command:
+IWAJ0132I_Cannot_remove_th_ERROR_=IWAE0006E IWAJ0132I Cannot remove the feature from the key because the feature is null for the command:
+Can_not_get_to_a_valid_EJB_ERROR_=IWAE0007E Can not get to a valid EJB extension
+Empty_Attribute_name_ERROR_=IWAE0008E Empty Attribute name
+--_Java_Generation____Init_UI_=-- Java Generation :: Initializing...
+--_Java_Generation____Anal_UI_=-- Java Generation :: Analyzing...
+--_Java_Generation____Gene_UI_=-- Java Generation :: Generating...
+--_Java_Generation____Fini_UI_=-- Java Generation :: Finishing...
+--_Updating_Metadata..._UI_=-- Updating Metadata...
+The_command_failed_to_exec_ERROR_=IWAE0009E The command failed to execute code generation for the following reason:
+Cancelled_ERROR_=IWAE0010E Cancelled
+Add-On_Command_UI_=Add-On Command
+The_command_failed_to_upda_ERROR_=IWAE0011E The command failed to update the meta-data for the following reason:
+The_command_failed_to_undo_ERROR_=IWAE0012E The command failed to undo the meta-data change for the following reason:
+Multiple_EnterpriseBean_Up_UI_=Multiple EnterpriseBean Updates
+Creating_bean_named___{0}__UI_=Creating bean named "{0}"
+Updating_bean_named___{0}__UI_=Updating bean named "{0}"
+Deleting_bean_named___{0}__UI_=Deleting bean named "{0}"
+The_key_shape_has_changed__UI_=The key shape has changed for the CMP Entity named {0} and there are relationship roles pointing to this entity, would you like to propagate these key changes?
+MofObject_UI_=MofObject
+Enumeration_UI_=Enumeration
+Double_UI_=Double
+Float_UI_=Float
+Long_UI_=Long
+Short_UI_=Short
+Boolean_UI_=Boolean
+Integer_UI_=Integer
+Character_UI_=Character
+Byte_UI_=Byte
+Role(__{0}__)_opposite_is__INFO_=IWAE0013I Role("{0}") opposite is empty
+Failed_to_convert_{0}_to_{_ERROR_=IWAE0014E Failed to convert {0} to {1}.
+Error_in_Client_View_Creation_1=Error in Client View Creation.
+Creating_source_folder__1=Creating source folder {0}
+Failed_to_create_the_EnterpriseBean=Failed to create the enterprise bean.\nSee the log for more details.
+Error_has_occurred_ERROR_=IWAE0002E Error has occurred
+DeleteEnterpriseBeanDataModel_UI_1=Delete Bean(s)
+EJBCodegenHandlerExtensionReader_ERROR_0=IWAE0015E "Extensions must be of the type \"{0}\".
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/property_files/ejbcreation.properties b/plugins/org.eclipse.jst.j2ee.ejb/property_files/ejbcreation.properties
new file mode 100644
index 0000000..82a3036
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/property_files/ejbcreation.properties
@@ -0,0 +1,158 @@
+###############################################################################
+# Copyright (c) 2003, 2014 IBM 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:
+# IBM Corporation - initial API and implementation
+###############################################################################
+Error_occured_getting_ejb__ERROR_=IWAE0001E Error occurred getting ejb-jar.xml:
+Loading_examples_____UI_=Loading examples ...
+Traversing_file_system____UI_=Traversing file system...
+Importing_files____UI_=Importing files...
+Creating_EJB_Project____UI_=Creating EJB Project...
+Not_an_ejb_project_UI_=Not an EJB project.
+An_ejb_project_must_be_open_and_must_exist_for_properties_to_be_edited_UI_=An EJB project must be open and must exist for properties to be edited.
+CANCEL_UI_=CANCEL
+NO_UI_=NO
+YES_UI_=YES
+ALL_UI_=ALL
+None_UI_=None
+Enter_bean_name_UI_=Enter bean name.
+Message_invalid_bean_name_UI_=Invalid bean name.
+Bean_name_is_already_used_UI_=Bean name is already used.
+Bean_name_UI_=Bean name:
+Default_pack_not_be_null_UI_=The default package cannot be empty.
+The_project_does_not_conta_UI_=The project does not contain the class path for JDK (rt.jar or JRE library).
+Select_a_source_folder__UI_=Select a source folder.
+The_selected_source_folder_UI_=The selected source folder is not defined as a classpath source folder.
+The_selected_source_folder1_UI_=The selected source folder cannot be the output folder.
+Package_root_must_be_direc_UI_=Package root must be directly under Project folder.
+Bean_class_UI_=Bean class:
+Bean_superclass_UI_=Bean superclass:
+Message_Enter_bean_class_name_UI_=Enter bean class name.
+Bean_Class_Cannot_Be_In_UI_=Bean class cannot be in a default package.
+Class_implements=The class "{0}" must implement the "{1}" interface."
+Message_Enter_home_interface_name_UI_=Enter remote home interface name.
+Message_Home_Interface_UI_=Remote home interface:
+Message_Enter_remote_interface_name_UI_=Enter remote interface name.
+Message_Remote_Interface_UI_=Remote interface:
+Remote_interface_cannot_be_i_UI_=Remote interface cannot be in a default package.
+Home_interface_cannot_be_i_UI_=Remote home interface cannot be in a default package.
+Interface_extends="The interface "{0}" must extend the "{1}" interface."
+Local_Home_not_in_a_default_pkg_UI_=The local home interface cannot be in a default package.
+Enter_local_home_name_UI_=Enter local home interface name.
+Enter_local_int_name_UI_=Enter local interface name.
+Local_home_interface_UI_=Local home interface:
+Local_interface_UI_=Local interface:
+Local_not_in_a_default_pkg_UI_=The local interface cannot be in a default package.
+Enter_service_endpoint_name_UI_=Enter service endpoint interface name.
+Service_endpoint_interface_UI_=Service endpoint interface:
+Service_endpoint_not_in_a_default_pkg_UI_=The service endpoint interface cannot be in a default package.
+Atleast_one_client=At least one client interface view (local or remote) should be selected.
+Atleast_one_client_with_service=At least one client interface view (local, remote or service) should be selected.
+Name_collision_pattern=More than one class or interface has the same name "{0}".
+Creating_source_folder__1=Creating source folder {0}
+Select_valid_EJB_project=Select or create an EJB project.
+BEAN_SUPERCLASS_NOT_EXIST=The bean super class must exist.
+Super_EJB_has_no_local_interface=Super EJB does not have a Local Interface
+Super_EJB_has_no_remote_interface=Super EJB does not have a Remote Interface
+Key_class_UI_=Key class:
+Entity_enter_primary_key=Enter a key class name.
+Entyty_primary_key_not_default=Key class can not be in a default package.
+Entity_primary_key_duplicate=Duplicate name {0} between the key class and either the bean class or one of the interfaces.
+EJB_CLIENT_JAR_CREATION_ERROR_=IWAE0001E EJB client JAR Project Creation Error
+EJB_CLIENT_JAR_CREATION_MESSAGE_=Unable to complete the operation. Please check the log files for more info.
+CREATING_CLIENT_JAR_UI_=Creating the EJB client JAR project...
+FILES_OUT_OF_SYNC_UI_=The files in project {0} are not synchronized with the file system.  Do you want to refresh the project?
+EJB_Client_JAR_name_exists_=EJB client JAR name already exists in referencing EAR
+EJB_JAR_already_has_client_Jar_=EJB JAR already has an EJB client JAR
+CLIENT_JAR_URI_NOT_RESOLVE_UI_=The specified relative URI will not resolve to a path in the EAR
+ClientJAR_8=Removing EJB client JAR...
+ClientJAR_9=The file {0} already exists in folder {1}.  Overwrite?
+ClientJAR_10=Remove EJB Client JAR Project
+ClientJAR_11=Are you sure you want to combine the contents of the EJB client JAR project "{0}" with the EJB JAR project, replace all references, and delete the EJB client JAR project?
+ClientJAR_12=No EJB client JAR defined
+ClientJAR_13=An EJB client JAR project is not currently defined for the selected EJB project
+ClientJAR_14=Remove EJB Client JAR Error
+ClientJAR_15=An internal error occurred removing EJB client JAR.  Check the log files for more info.
+remove_client_jar_binary=Cannot remove EJB client JAR because the EJB project is binary.
+CANNOT_RESOLVE_INTERFACE_UI_=Cannot resolve the selected message listener interface.
+_1=The EJB and EJB Client project names can not be the same.
+_2=The EAR and EJB Client project names can not be the same.
+Neither_Bean_A_nor_Bean_B_have_a_local_client_view_UI_=Neither Bean A nor Bean B have a local client view.
+Relationship_name_cannot_be_empty_UI_=Relationship name cannot be empty.
+Relationship_name_already_exist_198_UI_=Relationship name already exists.
+Role_name_for_Bean_A_cannot_be_empty_UI_=Role name for Bean A cannot be empty.
+Role_name_for_Bean_A_must_be_java_valid_field_UI_=Role name for Bean A must be a valid Java field name.
+Role_name_for_Bean_B_cannot_be_empty_UI_=Role name for Bean B cannot be empty.
+Role_name_for_Bean_B_must_be_java_valid_field_UI_=Role name for Bean B must be a valid Java field name.
+Multiplicity_for_Bean_A_cannot_be_empty_UI_=Multiplicity for Bean A cannot be empty.
+Multiplicity_for_Bean_B_cannot_be_empty_UI_=Multiplicity for Bean B cannot be empty.
+CMR_field_name_for_Bean_A_cannot_be_empty_UI_=CMR field name for Bean A cannot be empty.
+CMR_field_name_for_Bean_B_cannot_be_empty_UI_=CMR field name for Bean B cannot be empty.
+CMR_field_type_for_Bean_A_cannot_be_empty_UI_=CMR field type for Bean A cannot be empty.
+CMR_field_type_for_Bean_B_cannot_be_empty_UI_=CMR field type for Bean B cannot be empty.
+Relationship_must_be_navigable_atleast_in_one_direction_UI_=Relationship must be navigable in at least one direction.
+Role_name_cannot_be_the_same_UI_=Role name cannot be the same.
+Cannot_create_many_to_many_relationship_UI_=Cannot create a many-to-many relationship.
+is_not_an_unique_CMR_=is not an unique CMR.
+is_not_an_unique_role_name_=is not an unique Role Name.
+CMR_fields_must_be_unique_=CMR Fields must be unique.
+Bean_A_does_not_match_Bean_B_client_view_=Selected Beans do not have matching interfaces.
+Bean_A_CMR_field_name_is_not_valid_java_field_UI_=CMR field name for Bean A must be a valid Java field name.
+Bean_B_CMR_field_name_is_not_valid_java_field_UI_=CMR field name for Bean B must be a valid Java field name.
+Bean_empty_=Two beans must be selected to create a relationship.
+Selected_bean_a_must_be_a_cmp_=Bean A must be a CMP bean.
+Selected_bean_b_must_be_a_cmp_=Bean B must be a CMP bean.
+Selected_bean_a_must_be_2_x_cmp_=Bean A must be a 2.x CMP.
+Selected_bean_b_must_be_2_x_cmp_=Bean B must be a 2.x CMP.
+FIELD_CANNOT_BE_EMPTY=Field cannot be empty.
+AN_OPERATION_MUST_BE_SELECTED=An operation must be selected.
+CLIENT_VIEW_ERR_DELETE_SUPERCLASS=Cannot delete an interface with subtypes UI.
+CANNOT_REMOVE_BOTH_LOCAL_AND_REMOTE=Cannot remove both local and remote interface.
+SELECT_ONE_OR_MORE_VIEWS=Select one or more views to delete.
+ONLY_ONE_VIEW_CREATE=Only one view can be created at a time.
+ERR_CMP_FIELD_LIST_EMPTY=CMP field list cannot be empty.
+ERR_CMP_FIELD_LIST_KEY_FIELD_EMPTY=CMP Bean should have at least one key field attribute.
+ERR_PLEASE_SELECT_A_FOREIGN_KEY = Please select a foreign key.
+ERR_FOREIGN_KEY_SELECTED = In a one to one relationship you can only select one foreign key
+ServiceEndpoint_interface_cannot_be_UI_=ServiceEndpoint interface cannot be in a default package.
+NON_INTERFACE_NAME_CANNOT_BE_NULL_UI_=Non JMS listener type name cannot be null
+ONE_END_MUST_BE_NAV=One end must be navigable, please change navigablity.
+CANT_BE_BINARY_PROJECT_UI_=Cannot create new enterprise bean in a binary project.
+EJB_EXPORT_PROJECT_CONTAINS_CLEINT_WARNING=The selected EJB project has an EJB client project.  Exporting via the EAR Export Wizard is suggested.
+remove_client_jar_client_binary=
+EJB_Client_JAR_Creation_Error_=EJB client JAR Creation Error
+Cannot_Be_Binary_Project_For_Client_=Cannot create a new EJB client JAR for a binary project.
+Cannot_Be_StandAlone_Project_For_Client_=Cannot create a new EJB client JAR for a stand-alone project.
+TRANSACTION_TYPE_CONTAINER=Container
+TRANSACTION_TYPE_BEAN=Bean
+STATE_TYPE_STATELESS=Stateless
+STATE_TYPE_STATEFUL=Stateful
+STATE_TYPE_SINGLETON=Singleton
+DESTINATION_TYPE_QUEUE=Queue
+DESTINATION_TYPE_TOPIC=Topic
+
+ERR_NO_MESSAGE_LISTENER_INTERFACE=You must specify a message listener interface. 
+ERR_COULD_NOT_RESOLVE_INTERFACE=Could not resolve interface. {0}
+ERR_LOCAL_HOME_MISSING_CREATE_METHOD=The specified Local Home interface has not valid create() method.
+ERR_REMOTE_HOME_MISSING_CREATE_METHOD=The specified Remote Home interface has not valid create() method.
+ERR_LOCAL_HOME_CREATE_METHOD_RETURN_TYPE_INVALID=The create() method of the specified Local Home interface must return the Local Component interface.
+ERR_REMOTE_HOME_CREATE_METHOD_RETURN_TYPE_INVALID=The create() method of the specified Remote Home interface must return the Remote Component interface.
+ERR_LOCAL_COMPONENT_NOT_INTERFACE=The specified Local Component interface is not valid.
+ERR_LOCAL_HOME_NOT_INTERFACE=The specified Local Home interface is not valid.
+ERR_REMOTE_COMPONENT_NOT_INTERFACE=The specified Remote Component interface is not valid.
+ERR_REMOTE_HOME_NOT_INTERFACE=The specified Remote Home interface is not valid.
+ERR_BEAN_ALREADY_EXISTS=Enterprise bean with the same Ejb Name already exists.
+WRN_BEAN_NAME_IS_EMPTY=Bean name is empty, the containter will use the name of the bean class.
+WRN_NO_CLIENT_VIEW=No client view configured. Clients will not be able to access this bean.
+ERR_SINGLETON_NOT_ALLOWED=The 'Singleton' state type is allowed only for EJB projects with version 3.1 or later.
+ERR_NO_INTERFACE_NOT_ALLOWED=The no-interface client view is allowed only for EJB projects with version 3.1 or later.
+WRN_EJB31_ASYNC_NOT_SUPPORTED=Asynchronous methods are not supported in EJB 3.1 Lite.
+
+timerScheduleDefault= second="*/10", minute="*", hour="8-23", dayOfWeek="Mon-Fri",\n      dayOfMonth="*", month="*", year="*", info="MyTimer"
+errorTimerScheduleMissing=The schedule cannot be empty.
+WRN_EJB31_NON_PERSISTENT_NO_SUPPORTED=Non-persistent Timers are not supported in EJB 3.1 Lite.
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/property_files/ejbproviderlibraries.properties b/plugins/org.eclipse.jst.j2ee.ejb/property_files/ejbproviderlibraries.properties
new file mode 100644
index 0000000..4ccc839
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/property_files/ejbproviderlibraries.properties
@@ -0,0 +1,392 @@
+###############################################################################
+# Copyright (c) 2003, 2004 IBM 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:
+# IBM Corporation - initial API and implementation
+###############################################################################
+_UI_EJBJar_description_feature=Description
+_UI_EJBJar_description_feature_desc=
+_UI_EJBJar_displayName_feature=Display name
+_UI_EJBJar_displayName_feature_desc=
+_UI_EJBJar_smallIcon_feature=Small icon
+_UI_EJBJar_smallIcon_feature_desc=
+_UI_EJBJar_largeIcon_feature=Large icon
+_UI_EJBJar_largeIcon_feature_desc=
+_UI_EJBJar_ejbClientJar_feature=Client jar
+_UI_EJBJar_ejbClientJar_feature_desc=
+_UI_EJBJar_version_feature=Version
+_UI_EJBJar_version_feature_desc=
+_UI_ContainerManagedEntity_abstractSchemaName_feature=Abstract Schema Name
+_UI_ContainerManagedEntity_abstractSchemaName_feature_desc=
+_UI_ContainerManagedEntity_keyAttributes_feature=Key attributes
+_UI_ContainerManagedEntity_keyAttributes_feature_desc=
+_UI_ContainerManagedEntity_CMPAttribute_feature=CMP attributes
+_UI_ContainerManagedEntity_CMPAttribute_feature_desc=
+_UI_ContainerManagedEntity_primKeyField_feature=Primary key field
+_UI_ContainerManagedEntity_primKeyField_feature_desc=
+_UI_EnterpriseBean_name_feature=Name
+_UI_EnterpriseBean_name_feature_desc=The name feature.
+_UI_ActivationConfig_type=Activation config
+_UI_ActivationConfigProperty_type=Activation config property 
+
+
+
+An_error_has_occurred_crea_ERROR_=IWAE0001E An error has occurred creating a new relationship.
+Create_a_new_child_for_the_UI_=Create a new child for the selected
+Create_Child_UI_=Create Child
+EjbJar_UI_=EjbJar
+The_ejbJar_property_UI_=The ejbJar property
+DefaultDatasource_UI_=DefaultDatasource
+The_defaultDatasource_prop_UI_=The defaultDatasource property
+Create_a_child_of_type_Ent_UI_=Create a child of type EnterpriseBeanBinding for the selected
+Create_EnterpriseBeanBindi_UI_=Create EnterpriseBeanBinding
+EJBJarBinding_UI_=EJBJarBinding
+JndiName_UI_=JndiName
+The_jndiName_property_UI_=The jndiName property
+ModuleBinding_UI_=ModuleBinding
+The_moduleBinding_property_UI_=The moduleBinding property
+EnterpriseBean_UI_=EnterpriseBean
+The_enterpriseBean_propert_UI_=The enterpriseBean property
+Datasource_UI_=Datasource
+The_datasource_property_UI_=The datasource property
+Create_a_child_of_type_#CH_UI_=Create a child of type #CHILD_CLASS_NAME# for the selected
+Create_#CHILD_CLASS_NAME#_UI_=Create #CHILD_CLASS_NAME#
+EnterpriseBeanBinding__UI_=EnterpriseBeanBinding
+Error_has_occurred_ERROR_=IWAE0002E Error has occurred
+Create_a_child_of_type_Met_UI_=Create a child of type MethodPermission for the selected
+Create_MethodPermission_UI_=Create MethodPermission
+AssemblyDescriptor_UI_=AssemblyDescriptor
+Value_UI_=Value
+The_value_property_UI_=The value property
+IsTransient_UI_=IsTransient
+The_isTransient_property_UI_=The isTransient property
+IsVolatile_UI_=IsVolatile
+The_isVolatile_property_UI_=The isVolatile property
+IsChangeable_UI_=IsChangeable
+The_isChangeable_property_UI_=The isChangeable property
+Name_UI_=Name
+The_name_property_UI_=The name property
+ETypeClassifier_UI_=ETypeClassifier
+The_eTypeClassifier_proper_UI_=The eTypeClassifier property
+Create_a_child_of_type_Con_UI_=Create a child of type ContainerManagedEntity for the selected
+Create_ContainerManagedEnt_UI_=Create ContainerManagedEntity
+Description_UI_=Description
+The_description_property_UI_=The description property
+DisplayName_UI_=DisplayName
+The_displayName_property_UI_=The displayName property
+SmallIcon_UI_=SmallIcon
+The_smallIcon_property_UI_=The smallIcon property
+LargeIcon_UI_=LargeIcon
+The_largeIcon_property_UI_=The largeIcon property
+EjbClientJar_UI_=EjbClientJar
+The_ejbClientJar_property_UI_=The ejbClientJar property
+The_assemblyDescriptor_pro_UI_=The assemblyDescriptor property
+EJBJar_UI_=EJBJar
+EJBMethodCategory_UI_=EJBMethodCategory
+EjbClass_UI_=EjbClass
+The_ejbClass_property_UI_=The ejbClass property
+HomeInterface_UI_=HomeInterface
+The_homeInterface_property_UI_=The homeInterface property
+RemoteInterface_UI_=RemoteInterface
+The_remoteInterface_proper_UI_=The remoteInterface property
+IsReentrant_UI_=IsReentrant
+The_isReentrant_property_UI_=The isReentrant property
+PrimaryKey_UI_=PrimaryKey
+The_primaryKey_property_UI_=The primaryKey property
+TransactionType_UI_=TransactionType
+The_transactionType_proper_UI_=The transactionType property
+SessionType_UI_=SessionType
+The_sessionType_property_UI_=The sessionType property
+Parms_UI_=Parms
+The_parms_property_UI_=The parms property
+Type_UI_=Type
+The_type_property_UI_=The type property
+MethodPermission_UI_=MethodPermission
+The_methodPermission_prope_UI_=The methodPermission property
+MethodTransaction_UI_=MethodTransaction
+The_methodTransaction_prop_UI_=The methodTransaction property
+Create_a_child_of_type_Met1_UI_=Create a child of type MethodElement for the selected
+Create_MethodElement_UI_=Create MethodElement
+TransactionAttribute_UI_=TransactionAttribute
+The_transactionAttribute_p_UI_=The transactionAttribute property
+MethodTransaction__UI_=MethodTransaction
+MethodPermission__UI_=MethodPermission
+IntentType_UI_=IntentType
+The_intentType_property_UI_=The intentType property
+AccessIntent__UI_=AccessIntent
+ActivateAt_UI_=ActivateAt
+The_activateAt_property_UI_=The activateAt property
+LoadAt_UI_=LoadAt
+The_loadAt_property_UI_=The loadAt property
+PinnedFor_UI_=PinnedFor
+The_pinnedFor_property_UI_=The pinnedFor property
+BeanCache__UI_=BeanCache
+InvocationLocale_UI_=InvocationLocale
+The_invocationLocale_prope_UI_=The invocationLocale property
+BeanInternationalization__UI_=BeanInternationalization
+InheritenceRoot_UI_=InheritenceRoot
+The_inheritenceRoot_proper_UI_=The inheritenceRoot property
+BeanStructure__UI_=BeanStructure
+SessionAttribute_UI_=SessionAttribute
+The_sessionAttribute_prope_UI_=The sessionAttribute property
+ContainerActivitySession__UI_=ContainerActivitySession
+EjbJarExtension_UI_=EjbJarExtension
+The_ejbJarExtension_proper_UI_=The ejbJarExtension property
+Subtype_UI_=Subtype
+The_subtype_property_UI_=The subtype property
+Supertype_UI_=Supertype
+The_supertype_property_UI_=The supertype property
+EjbGeneralization_UI_=EjbGeneralization
+Create_a_child_of_type_Ejb_UI_=Create a child of type EjbGeneralization for the selected
+Create_EjbGeneralization_UI_=Create EjbGeneralization
+EJBJarExtension_UI_=EJBJarExtension
+EjbRelationship__UI_=EjbRelationship
+Multiplicity_UI_=Multiplicity
+The_multiplicity_property_UI_=The multiplicity property
+SourceEjbName_UI_=SourceEjbName
+The_sourceEjbName_property_UI_=The sourceEjbName property
+Forward_UI_=Forward
+The_forward_property_UI_=The forward property
+Navigable_UI_=Navigable
+The_navigable_property_UI_=The navigable property
+Relationship_UI_=Relationship
+The_relationship_property_UI_=The relationship property
+BeanExtension_UI_=BeanExtension
+The_beanExtension_property_UI_=The beanExtension property
+Structure_UI_=Structure
+The_structure_property_UI_=The structure property
+BeanCache_UI_=BeanCache
+The_beanCache_property_UI_=The beanCache property
+Internationalization_UI_=Internationalization
+The_internationalization_p_UI_=The internationalization property
+LocalTran_UI_=LocalTran
+The_localTran_property_UI_=The localTran property
+Create_a_child_of_type_Sec_UI_=Create a child of type SecurityIdentity for the selected
+Create_SecurityIdentity_UI_=Create SecurityIdentity
+EnterpriseBeanExtension__UI_=EnterpriseBeanExtension
+EntityExtension__UI_=EntityExtension
+PersistenceSecurityIdentit_UI_=PersistenceSecurityIdentity
+The_persistenceSecurityIde_UI_=The persistenceSecurityIdentity property
+Create_a_child_of_type_Ejb1_UI_=Create a child of type EjbRelationshipRole for the selected
+Create_EjbRelationshipRole_UI_=Create EjbRelationshipRole
+ContainerManagedEntityExte1_UI_=ContainerManagedEntityExtension
+Timeout_UI_=Timeout
+The_timeout_property_UI_=The timeout property
+SessionExtension__UI_=SessionExtension
+FinderDescriptor_UI_=FinderDescriptor
+EjbqlQueryString_UI_=EjbqlQueryString
+The_ejbqlQueryString_prope_UI_=The ejbqlQueryString property
+EjbqlFinderDescriptor__UI_=EjbqlFinderDescriptor
+SelectStatement_UI_=SelectStatement
+The_selectStatement_proper_UI_=The selectStatement property
+FullSelectFinderDescriptor1_UI_=FullSelectFinderDescriptor
+UserFinderDescriptor_UI_=UserFinderDescriptor
+WhereClause_UI_=WhereClause
+The_whereClause_property_UI_=The whereClause property
+WhereClauseFinderDescripto1_UI_=WhereClauseFinderDescriptor
+RoleName_UI_=RoleName
+The_roleName_property_UI_=The roleName property
+Identity__UI_=Identity
+IsolationLevel_UI_=IsolationLevel
+The_isolationLevel_propert_UI_=The isolationLevel property
+IsolationLevelAttributes__UI_=IsolationLevelAttributes
+Boundary_UI_=Boundary
+The_boundary_property_UI_=The boundary property
+Resolver_UI_=Resolver
+The_resolver_property_UI_=The resolver property
+UnresolvedAction_UI_=UnresolvedAction
+The_unresolvedAction_prope_UI_=The unresolvedAction property
+LocalTran__UI_=LocalTran
+RunAsMode_UI_=RunAsMode
+The_runAsMode_property_UI_=The runAsMode property
+PersistenceSecurityIdentit1_UI_=PersistenceSecurityIdentity
+RunAsSpecifiedIdentity_UI_=RunAsSpecifiedIdentity
+The_runAsSpecifiedIdentity_UI_=The runAsSpecifiedIdentity property
+UseCallerIdentity_UI_=UseCallerIdentity
+UseSystemIdentity_UI_=UseSystemIdentity
+SecurityIdentity__UI_=SecurityIdentity
+Related_Role_UI_=Related Role
+The_opposite_role_in_the_r_UI_=The opposite role in the relationship of this role.
+Direction_UI_=Direction
+The_direction_of_the_role._UI_=The direction of the role.
+forward_UI_=forward
+reverse_UI_=reverse
+Resource_Path_UI_=Resource Path
+The_resource_containing_th_UI_=The resource containing the EJB JAR model.
+No_Resource_UI_=No Resource
+Failed_To_Delete_EJB_UI_=Failed to delete {0} Enterprise Bean.
+Unchecked_UI_=<Unchecked>
+Role_2=Role
+The_role_of_the_cmr_field_3=The role of the cmr field
+Collection_Type_4=Collection Type
+The_collection_type_of_the_cmr_field_5=The collection type of the cmr field
+CMRField__6=CMRField
+CreateEJBRelationshipRole_1=CreateEJBRelationshipRole
+Create_EJBRelationshipRole_2=Create EJBRelationshipRole
+Create_a_child_of_type_EJBRelationshipRole_for_the_selected__3=Create a child of type EJBRelationshipRole for the selected
+_4=
+Description_6=Description
+The_description_property_of_the_ejb_relation_7=The description property of the EJB relation
+Name_8=Name
+The_name_property_of_the_ejb_relation_9=The name property of the EJB relation
+Relationship_List_10=Relationship List
+The_relationship_list_of_the_ejb_relation_11=The relationship list of the EJB relation
+EJBRelation__12=EJBRelation
+Description_5=Description
+The_description_property_of_the_ejb_relationship_role_6=The description property of the EJB relationship role
+Name_7=Name
+The_roleName_property_of_the_ejb_relationship_role_8=The roleName property of the EJB relationship role
+Multiplicity_9=Multiplicity
+The_multiplicity_property_of_the_ejb_relationship_role_10=The multiplicity property of the EJB relationship role
+Cascade_Delete_11=Cascade Delete
+The_cascade_delete_property_of_the_ejb_relationship_role_12=The cascade delete property of the EJB relationship role
+Cmr_Field_13=Cmr Field
+The_cmr_field_of_the_ejb_relationship_role_14=The cmr field of the EJB relationship role
+Relationship_15=Relationship
+The_relationship_of_the_ejb_relationship_role_16=The relationship of the EJB relationship role
+Source_17=Source
+The_source_of_the_ejb_relationship_role_18=The source of the EJB relationship role
+CreateMethodElement_1=CreateMethodElement
+Create_MethodElement_2=Create MethodElement
+Create_a_child_of_type_MethodElement_for_the_selected__3=Create a child of type MethodElement for the selected
+The_description_property_of_the_exclude_list_7=The description property of the exclude list
+ExcludeList__8=Excludes List
+Type_2=Type
+The_type_property_of_the_message_driven_destination_3=The type property of the message-driven destination
+Subscription_Durability_4=Subscription Durability
+The_subscription_durability_property_of_the_message_driven_destination_5=The subscription durability property of the message-driven destination
+Bean_6=Bean
+The_bean_of_the_message_driven_destination_7=The bean of the message-driven destination
+MessageDrivenDestination__8=MessageDrivenDestination
+Create_CMPAttribute_2=Create CMPAttribute
+Create_a_child_of_type_CMPAttribute_for_the_selected__3=Create a child of type CMPAttribute for the selected
+Transaction_Type_6=Transaction Type
+The_transaction_type_property_of_the_message_driven_7=The transaction type property of the message-driven
+Message_Selector_8=Message Selector
+The_message_selector_property_of_the_message_driven_9=The message selector property of the message-driven
+Acknowledge_Mode_10=Acknowledge Mode
+The_acknowledge_mode_property_of_the_message_driven_11=The acknowledge mode property of the message-driven
+Destination_12=Destination
+The_destination_of_the_message_driven_13=The destination of the message-driven
+MessageDriven__14=MessageDriven
+The_description_property_of_the_query_7=The description property of the query
+Ejb_QL_8=Ejb QL
+The_ejb_ql_property_of_the_query_9=The EJB ql property of the query
+Return_Type_Mapping_10=Return Type Mapping
+The_return_type_mapping_property_of_the_query_11=The return type mapping property of the query
+Entity_12=Entity
+The_entity_of_the_query_13=The entity of the query
+Query_Method_14=Query Method
+The_query_method_of_the_query_15=The query method of the query
+Query__16=Query
+Query_2=Query
+The_query_of_the_query_method_3=The query of the query method
+QueryMethod__4=QueryMethod
+Create_EJBRelation_2=Create EJBRelation
+Create_a_child_of_type_EJBRelation_for_the_selected__3=Create a child of type EJBRelation for the selected
+The_description_property_of_the_relationships_7=The description property of the relationships
+Ejb_Jar_8=EJB JAR
+The_ejb_jar_of_the_relationships_9=The EJB JAR of the relationships
+Relationships__10=Relationships
+Description_2=Description
+The_description_property_of_the_role_source_3=The description property of the role source
+Role_4=Role
+The_role_of_the_role_source_5=The role of the role source
+Entity_Bean_6=Entity Bean
+The_entity_bean_of_the_role_source_7=The entity bean of the role source
+RoleSource__8=RoleSource
+EModelElement_2=EModelElement
+Name_2=Name
+The_name_property_of_the_e_namespace_3=The name property of the e namespace
+ENamespace__4=ENamespace
+Create_EDataType_2=Create EDataType
+Create_a_child_of_type_EDataType_for_the_selected__3=Create a child of type EDataType for the selected
+Is_Transient_6=Is Transient
+The_is_transient_property_of_the_e_structural_feature_7=The is transient property of the e structural feature
+Is_Volatile_8=Is Volatile
+The_is_volatile_property_of_the_e_structural_feature_9=The is volatile property of the e structural feature
+Is_Changeable_10=Is Changeable
+The_is_changeable_property_of_the_e_structural_feature_11=The is changeable property of the e structural feature
+E_Default_Value_12=E Default Value
+The_e_default_value_property_of_the_e_structural_feature_13=The e default value property of the e structural feature
+Is_Unique_14=Is Unique
+The_is_unique_property_of_the_e_structural_feature_15=The is unique property of the e structural feature
+E_Multiplicity_16=E Multiplicity
+The_e_multiplicity_of_the_e_structural_feature_17=The e multiplicity of the e structural feature
+E_Type_Classifier_18=E Type Classifier
+EStructuralFeature__20=EStructuralFeature
+Create_Child_2=Create Child
+Create_a_new_child_for_the_selected__3=Create a new child for the selected
+Many_1=Many
+Many_2=Many
+Description_7=Description
+The_description_property_of_the_query_8=The description property of the query
+Ejb_QL_9=Ejb QL
+The_ejb_ql_property_of_the_query_10=The EJB ql property of the query
+Return_Type_Mapping_11=Return Type Mapping
+The_return_type_mapping_property_of_the_query_12=The return type mapping property of the query
+Entity_13=Entity
+The_entity_of_the_query_14=The entity of the query
+Query_Method_15=Query Method
+The_query_method_of_the_query_16=The query method of the query
+Query__17=Query
+QueryMethod__2=QueryMethod
+Concurrency_Control_UI_=Concurrency Control
+The_concurrency_control_property_of_the_container_managed_entity_extension_UI_=The concurrency control property of the container-managed entity extension
+Persistence_Security_Identity_UI_=Persistence Security Identity
+The_persistence_security_identity_of_the_container_managed_entity_extension_UI_=The persistence security identity of the container-managed entity extension
+Data_Cache_UI_=Data Cache
+The_data_cache_of_the_container_managed_entity_extension_UI_=The data cache of the container-managed entity extension
+Failed_deleting_access_beans_UI_=Failed deleting access beans.
+TransactionScope_UI_=TransactionScope
+Finder_Duration_UI_=Finder Duration
+The_finder_duration_property_of_the_timeout_scope_UI_=The finder duration property of the timeout scope
+TimeoutScope__UI_=TimeoutScope
+SessionScope_UI_=SessionScope
+Timeout1_UI_=Timeout
+The_timeout_property_of_the_session_extension_UI_=The timeout property of the session extension
+Activity_Session_Type_UI_=Activity Session Type
+The_activity_session_type_property_of_the_session_extension_UI_=The activity session type property of the session extension
+Read_Ahead_Hint_UI_=Read Ahead Hint
+The_read_ahead_hint_property_of_the_read_ahead_hint_UI_=The read ahead hint property of the read ahead hint
+ReadAheadHint__UI_=ReadAheadHint
+Hint_UI_=Hint
+The_hint_of_the_pessimistic_update_UI_=The hint of the pessimistic update
+PessimisticUpdate_UI_=PessimisticUpdate
+No_Collision_UI_=No Collision
+The_no_collision_property_of_the_pessimistic_update_hint_UI_=The no collision property of the pessimistic update hint
+Exclusive_UI_=Exclusive
+The_exclusive_property_of_the_pessimistic_update_hint_UI_=The exclusive property of the pessimistic update hint
+Greedy_UI_=Greedy
+The_greedy_property_of_the_pessimistic_update_hint_UI_=The greedy property of the pessimistic update hint
+Promote_UI_=Promote
+The_promote_property_of_the_pessimistic_update_hint_UI_=The promote property of the pessimistic update hint
+PessimisticUpdateHint_UI_=PessimisticUpdateHint
+PessimisticRead_UI_=PessimisticRead
+OptimisticUpdate_UI_=OptimisticUpdate
+OptimisticRead_UI_=OptimisticRead
+Ejb_Jar_UI_=EJB JAR
+The_ejb_jar_of_the_ejb_jar_extension_UI_=The EJB JAR of the EJB JAR extension
+EJBJarExtension1_UI_=EJBJarExtension
+Lifetime_In_Cache_UI_=Lifetime In Cache
+The_lifetime_in_cache_property_of_the_data_cache_UI_=The lifetime in cache property of the data cache
+Lifetime_In_Cache_Usage_UI_=Lifetime In Cache Usage
+The_lifetime_in_cache_usage_property_of_the_data_cache_UI_=The lifetime in cache usage property of the data cache
+DataCache__UI_=DataCache
+CollectionScope_UI_=CollectionScope
+Collection_Increment_UI_=Collection Increment
+The_collection_increment_property_of_the_collection_increment_UI_=The collection increment property of the collection increment
+CollectionIncrement__UI_=CollectionIncrement
+Access_Pattern_UI_=Access Pattern
+The_access_pattern_property_of_the_collection_access_pattern_UI_=The access pattern property of the collection access pattern
+CollectionAccessPattern__UI_=CollectionAccessPattern
+AccessType_UI_=AccessType
+AccessIntentEntry_UI_=AccessIntentEntry
+AppliedAccessIntent_UI_=AppliedAccessIntent
+MessageDrivenExtension_UI_=MessageDrivenExtension
+Unknown_Role_Type_UI_=<Unknown Type>
+
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/property_files/ejbvalidator.properties b/plugins/org.eclipse.jst.j2ee.ejb/property_files/ejbvalidator.properties
new file mode 100644
index 0000000..e158214
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/property_files/ejbvalidator.properties
@@ -0,0 +1,1531 @@
+###############################################################################
+# Copyright (c) 2003, 2006 IBM 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:
+# IBM Corporation - initial API and implementation
+###############################################################################
+#
+#     *************************************************************************
+#     * Code oriented instructions:
+#     *
+#     * In the string, you may see the following special sequences:
+#     * a) {n}  where n is a number. These are replaceable parameters.
+#     * b) ''  In .properties files, in order to see one apostrophe (') in the final
+#     *    string, sometimes two apostrophes must be entered in the string. In the translated
+#     *    string, if there is at least one {n} in the string, then to show one apostrophe
+#     *    to the user, put two apostrophes in the string. If there are no {n} in the string,
+#     *    then put one apostrophe.
+#     *    For example, say that you want the user to read "George's file". 
+#     *        GEORGE=George's file was on the desk.
+#     *        GEORGE2=George''s file and {0} were on the desk.
+#     *    GEORGE uses one apostrophe because there are no {n} and GEORGE2
+#     *    uses two apostrophes because there is a {n}.
+#     * c) '' text '' where text can be any word(s). The text between the double
+#     *    apostrophes should not be translated. 
+#     * d) <text> where text can be any word(s). The text between the angle
+#     *    brackets should NOT be translated.
+#     * e) "text" where text can be any word(s). The text between the quotation 
+#     *    marks should NOT be translated.
+#     *    
+#     *************************************************************************
+#     * Other instructions
+#     * a) Do not translate any text that is on a line which begins with a comment 
+#     *    symbol (#).
+#     * b) Do not translate these words: 
+#     *        schema, EJB, RDB, JAR, RMI, BMP, CMP, OOSQL
+#     * c) Please return the .properties files using the same directory structure.
+#     *    This is necessary because two of the files have the same name.
+#     *
+#     *************************************************************************
+# Any other comments to the translators are on lines which start like this:  # 2TC:
+#
+# Version 1.42
+#
+
+#
+# Begin EJB Validator strings.
+#
+# The purpose of
+# IDs:
+#    STATUS=Status message
+#    LOC=Text description of a location (identifies the source of the problem when no line number is available)
+#    CHKJ=EJB validation message
+#
+
+#
+# Start of status messages
+#
+STATUS_VALIDATING=Validating {0}.
+
+LOC_CLASS=Class: {0}
+LOC_FIELD=Field: {0}, Class: {1}
+LOC_METHOD=Method: {0}, Class: {1}
+LOC_BEAN=Enterprise bean: {0}
+LOC_ROLE=<localRelationshipRoles>: {0}, Enterprise bean: {1}
+LOC_ROLEREF=<security-role-ref>: {0}
+LOC_METHODELEMENT=<method> element: {0}
+LOC_METHODPERMISSION=<method-permission> element: {0}
+LOC_METHODTRANSACTION=<container-transaction> element: {0}
+LOC_EJBRELATION=<ejb-relation>: {0}
+LOC_EJBRELATIONSHIPROLE=<ejb-relationship-role>: {0}, <ejb-relation>: {1}
+#
+# end of status messages
+#
+
+#
+# Start of validation messages
+#
+# All unique error ids follow this format:
+#
+#    CHKJnnnn[s]
+#
+# where
+#    - CHKJ is the four character unique component prefix
+#    - nnnn is the numerical id, unique within EJB Validator
+#    - [s] is the severity indicator: E (error), W (warning), or I (information).
+#
+# nnnn ranges from 2000 - 2999
+#    2000 - 2099 Messages on a class
+#    2100 - 2199 Messages which are specific to Websphere or WSA (i.e., not mentioned in EJB specification, such as associations & finders)
+#    2200 - 2399 Messages on a field
+#    2400 - 2799 Messages on a method
+#    2800 - 2899 Messages on the deployment descriptor
+#    2900 - 2999 Miscellaneous
+#
+
+# 
+# Messages common across EJB specifications
+#
+CHKJ2900=CHKJ2900I: Internal error when running EJB validator. Read the log for details.
+CHKJ2852=CHKJ2852W: Internal error while validating {0}. The bean being validated was {1}.
+CHKJ2433=CHKJ2433W: Cannot validate {0} because {1} cannot be reflected. Check the classpath.
+CHKJ2907=CHKJ2907E: Type {0}, or one of its supertypes, cannot be reflected. Check the classpath.
+CHKJ2905=CHKJ2905W: The EJB Validator did not run because ejb-jar.xml could not be loaded or found. Run the XML validator for more information.
+CHKJ2041=CHKJ2041I: Permanent classes and interfaces should be in a named package. (JLS 2.0: 7.4.2).
+
+CHKJ2456.i=CHKJ2456W: {0} should throw {1} for {2} or there may be compile errors in the deployment code.
+CHKJ2456.m=CHKJ2456W: This method should throw {0} for {1} or there may be compile errors in the deployment code.
+
+#
+# end of common messages
+#
+
+#
+# Messages for the EJB 1.1 specification
+#
+CHKJ2001.eb.ejb11=CHKJ2001W: The {0} key class must implement the {1} method. (EJB 1.1: 9.2.9)
+CHKJ2002.eb.i.ejb11=CHKJ2002W: This class should implement a matching ejbPostCreate method for {0}. (EJB 1.1: 9.2.4)
+CHKJ2002.eb.m.ejb11=CHKJ2002W: This class should implement a matching ejbPostCreate method for this method. (EJB 1.1: 9.2.4)
+CHKJ2003E.ejb11=CHKJ2003E: This class must not implement javax.ejb.SessionSynchronization. (EJB 1.1: 6.5.3).
+CHKJ2003I.ejb11=CHKJ2003I: Bean-managed transaction stateful session beans do not need to implement javax.ejb.SessionSynchronization. (EJB 1.1: 6.5.3).
+CHKJ2004.eb.i.ejb11=CHKJ2004W: The {1} bean class should not implement the {0} ejbFind method. (EJB 1.1: 9.4.6)
+CHKJ2004.eb.m.ejb11=CHKJ2004W: The {0} bean class should not implement an ejbFind method. (EJB 1.1: 9.4.6)
+CHKJ2005.eh.i.ejb11=CHKJ2005E: {0} must be either a create method or a find method. (EJB 1.1: 9.2.8)
+CHKJ2005.eh.m.ejb11=CHKJ2005E: The method must be either a create method or a find method. (EJB 1.1: 9.2.8)
+CHKJ2006.sb.ejb11=CHKJ2006E: The {0} bean class must have a public constructor that takes no arguments. (EJB 1.1: 6.10.2)
+CHKJ2006.eb.ejb11=CHKJ2006E: The {0} bean class must have a public constructor that takes no arguments. (EJB 1.1: 9.2.2)
+CHKJ2007.sb.ejb11=CHKJ2007W: {0} should not declare the finalize() method. (EJB 1.1: 6.10.2)
+CHKJ2007.eb.ejb11=CHKJ2007W: {0} should not declare the finalize() method. (EJB 1.1: 9.2.2)
+CHKJ2008.sb.ejb11=CHKJ2008E: The {0} bean class must contain at least one ejbCreate method. (EJB 1.1: 6.5.5, 6.10.3)
+CHKJ2009.eb.ejb11=CHKJ2009E: The {0} bean class must contain at least one ejbFindByPrimaryKey method. (EJB 1.1: 9.2.5)
+CHKJ2010.sh.ejb11=CHKJ2010E: The {0} home interface must contain at least one create method. (EJB 1.1: 6.10.6)
+CHKJ2011.eh.ejb11=CHKJ2011E: The {0} home interface must contain one findByPrimaryKey method. (EJB 1.1: 9.2.8)
+CHKJ2012.sr.ejb11=CHKJ2012E: This type must be an interface. (EJB 1.1: 6.10.5).
+CHKJ2012.sh.ejb11=CHKJ2012E: This type must be an interface. (EJB 1.1: 6.10.6).
+CHKJ2012.er.ejb11=CHKJ2012E: This type must be an interface. (EJB 1.1: 9.2.7).
+CHKJ2012.eh.ejb11=CHKJ2012E: This type must be an interface. (EJB 1.1: 9.2.8).
+CHKJ2013.sb.ejb11=CHKJ2013E: The {0} bean class must implement {1}. (EJB 1.1: 6.10.2).
+CHKJ2013.eb.ejb11=CHKJ2013E: The {0} bean class must implement {1}. (EJB 1.1: 9.2.2).
+CHKJ2014.sb.ejb11=CHKJ2014E: The {0} bean class cannot be abstract. (EJB 1.1: 6.10.2)
+CHKJ2014.eb.ejb11=CHKJ2014E: The {0} bean class cannot be abstract. (EJB 1.1: 9.2.2)
+CHKJ2015.sb.ejb11=CHKJ2015E: The {0} bean class cannot be final. (EJB 1.1: 6.10.2)
+CHKJ2015.eb.ejb11=CHKJ2015E: The {0} bean class cannot be final. (EJB 1.1: 9.2.2)
+CHKJ2017.sr.ejb11=CHKJ2017E: Interface must extend {0}. (EJB 1.1: 6.10.5)
+CHKJ2017.sh.ejb11=CHKJ2017E: Interface must extend {0}. (EJB 1.1: 6.10.6)
+CHKJ2017.er.ejb11=CHKJ2017E: Interface must extend {0}. (EJB 1.1: 9.2.7)
+CHKJ2017.eh.ejb11=CHKJ2017E: Interface must extend {0}. (EJB 1.1: 9.2.8)
+CHKJ2019.eb.ejb11=CHKJ2019I: The {0} key class must be serializable at runtime. (EJB 1.1: 9.2.9) (RMI 1.3: 2.6).
+
+
+CHKJ2020.eb.ejb11=CHKJ2020E: The {0} key class must be public. (EJB 1.1: 9.4.7.2)
+CHKJ2021.eb.ejb11=CHKJ2021E: The {0} key class must define a public default constructor. (EJB 1.1: 9.4.7.2)
+CHKJ2022.sb.ejb11=CHKJ2022E: {0} bean class must be public. (EJB 1.1: 6.10.2)
+CHKJ2022.eb.ejb11=CHKJ2022E: {0} bean class must be public. (EJB 1.1: 9.2.2)
+CHKJ2023.sr.i.ejb11=CHKJ2023E: {0} must have a matching method in the {1} bean class. (EJB 1.1: 6.10.5)
+CHKJ2023.sr.m.ejb11=CHKJ2023E: This method must have a matching method in the {0} bean class. (EJB 1.1: 6.10.5)
+CHKJ2023.er.i.ejb11=CHKJ2023E: {0} must have a matching method in the {1} bean class. (EJB 1.1: 9.2.7)
+CHKJ2023.er.m.ejb11=CHKJ2023E: This method must have a matching method in the {0} bean class. (EJB 1.1: 9.2.7)
+CHKJ2024.sh.i.ejb11=CHKJ2024E: {0} must not exist. Only create() may exist (EJB 1.1: 6.8).
+CHKJ2024.sh.m.ejb11=CHKJ2024E: This method must not exist. Only create() may exist (EJB 1.1: 6.8).
+CHKJ2025.sb.i.ejb11=CHKJ2025E: {0} must not exist. Only ejbCreate() may exist (EJB 1.1: 6.8).
+CHKJ2025.sb.m.ejb11=CHKJ2025E: This method must not exist. Only ejbCreate() may exist (EJB 1.1: 6.8).
+CHKJ2026.sh.i.ejb11=CHKJ2026E: Bean class {1} must implement a matching ejbCreate method for {0}. (EJB 1.1: 6.10.6)
+CHKJ2026.sh.m.ejb11=CHKJ2026E: Bean class {0} must implement a matching ejbCreate method for this method. (EJB 1.1: 6.10.6)
+CHKJ2026.eh.i.ejb11=CHKJ2026E: Bean class {1} must implement a matching ejbCreate method for {0}. (EJB 1.1: 9.2.8)
+CHKJ2026.eh.m.ejb11=CHKJ2026E: Bean class {0} must implement a matching ejbCreate method for this method. (EJB 1.1: 9.2.8)
+CHKJ2028.eb.i.ejb11=CHKJ2028W: {0} will not be called unless a matching ejbCreate method is defined. (EJB 1.1: 9.1.5.1)
+CHKJ2028.eb.m.ejb11=CHKJ2028W: This method will not be called unless a matching ejbCreate method is defined. (EJB 1.1: 9.1.5.1)
+CHKJ2029.eb.i.ejb11=CHKJ2029W: {0} cannot be called without the matching create method on the home interface {1}. (EJB 1.1: 9.2.3)
+CHKJ2029.eb.m.ejb11=CHKJ2029W: This method cannot be called without the matching create method on the home interface {0}. (EJB 1.1: 9.2.3)
+CHKJ2030.eh.i.ejb11=CHKJ2030E: {0} must have a matching ejbFind method in the {1} bean class. (EJB 1.1: 9.2.8)
+CHKJ2030.eh.m.ejb11=CHKJ2030E: This method must have a matching ejbFind method in the {0} bean class. (EJB 1.1: 9.2.8)
+CHKJ2032.eb.ejb11=CHKJ2032W: Bean class {0} must declare at least one container managed field. (EJB 1.1: 9.4.7)
+CHKJ2033.eb.ejb11=CHKJ2033W: The setEntityContext(EntityContext ic) method must exist. (EJB 1.1: 9.1.5.1)
+CHKJ2034.eb.ejb11=CHKJ2034W: The unsetEntityContext() method must exist. (EJB 1.1: 9.1.5.1)
+CHKJ2035.eb.ejb11=CHKJ2035W: The ejbActivate() method must exist. (EJB 1.1: 9.1.5.1)
+CHKJ2036.eb.ejb11=CHKJ2036W: The ejbPassivate() method must exist. (EJB 1.1: 9.1.5.1)
+CHKJ2037.eb.ejb11=CHKJ2037W: The ejbRemove() method must exist. (EJB 1.1: 9.1.5.1)
+CHKJ2038.eb.ejb11=CHKJ2038W: The ejbLoad() method must exist. (EJB 1.1: 9.1.5.1)
+CHKJ2039.eb.ejb11=CHKJ2039W: The ejbStore() method must exist. (EJB 1.1: 9.1.5.1)
+
+CHKJ2040.sb.ejb11=CHKJ2040I: "this" must not be passed as a method argument or result. (EJB 1.1: 6.10.2)
+
+CHKJ2100.ejb11=CHKJ2100E: Both ends of the role must use the same number of attributes.
+CHKJ2101.ejb11=CHKJ2101E: Both ends of the role must use the same type.
+CHKJ2102.eh.ejb11=CHKJ2102E: Either a finder descriptor, or a matching custom finder method on the {0} class, must be defined.
+CHKJ2103.ejb11=CHKJ2103E: In component inheritance, the {0} bean class must inherit {1}. (EJB 1.1: B.2)
+CHKJ2104.ejb11=CHKJ2104E: In component inheritance, the {0} home interface must not inherit {1}. (EJB 1.1: B.2)
+CHKJ2105.ejb11=CHKJ2105E: In component inheritance, the {0} remote interface must inherit {1}. (EJB 1.1: B.2)
+CHKJ2106.ejb11=CHKJ2106E: Bean {0} must use {1} as its <prim-key-class> (EJB 1.1: B.2).
+
+CHKJ2200.i.ejb11=CHKJ2200W: The {0} static field should be final. (EJB 1.1: 18.1.2)
+CHKJ2200.m.ejb11=CHKJ2200W: This static field should be final. (EJB 1.1: 18.1.2)
+CHKJ2201.eb.i.ejb11=CHKJ2201E: {0} must not be transient. (EJB 1.1: 9.4.1)
+CHKJ2201.eb.m.ejb11=CHKJ2201E: The field must not be transient. (EJB 1.1: 9.4.1)
+CHKJ2202.eb.i.ejb11=CHKJ2202W: The field type of field {0} is invalid for a CMP bean. (EJB 1.1: 9.4.1)
+CHKJ2202.eb.m.ejb11=CHKJ2202W: The field type is invalid for a CMP bean. (EJB 1.1: 9.4.1)
+CHKJ2203.eb.i.ejb11=CHKJ2203E: {0} must be public. (EJB 1.1: 9.4.1)
+CHKJ2203.eb.m.ejb11=CHKJ2203E: The field must be public. (EJB 1.1: 9.4.1)
+CHKJ2205.eb.i.ejb11=CHKJ2205W: The primary key field named {0} must be public. (EJB 1.1: 9.4.7.2)
+CHKJ2205.eb.m.ejb11=CHKJ2205W: The primary key field must be public. (EJB 1.1: 9.4.7.2)
+CHKJ2206.eb.i.ejb11=CHKJ2206W: {0} must be a <cmp-field> of {1} and a field of bean class {2}. (EJB 1.1: 9.4.7.2).
+CHKJ2206.eb.m.ejb11=CHKJ2206W: This field must be a <cmp-field> of {0} and a field of bean class {1}. (EJB 1.1: 9.4.7.2).
+CHKJ2207.eb.ejb11=CHKJ2207E: Key field {0} must be the same type as the primary key, {1}. (EJB 1.1: 9.4.7.1).
+
+CHKJ2400.ejbCreate.sb.i.ejb11=CHKJ2400W: Deprecated use of a java.rmi.RemoteException on method {0}. (EJB 1.1: 6.10.3).
+CHKJ2400.ejbCreate.sb.m.ejb11=CHKJ2400W: Deprecated use of a java.rmi.RemoteException. (EJB 1.1: 6.10.3).
+CHKJ2400.bus.sb.i.ejb11=CHKJ2400W: Deprecated use of a java.rmi.RemoteException on method {0}. (EJB 1.1: 6.10.4).
+CHKJ2400.bus.sb.m.ejb11=CHKJ2400W: Deprecated use of a java.rmi.RemoteException. (EJB 1.1: 6.10.4).
+CHKJ2400.ejbCreate.eb.i.ejb11=CHKJ2400W: Deprecated use of a java.rmi.RemoteException on {0}. (EJB 1.1: 9.2.3).
+CHKJ2400.ejbCreate.eb.m.ejb11=CHKJ2400W: Deprecated use of a java.rmi.RemoteException. (EJB 1.1: 9.2.3).
+CHKJ2400.ejbPostCreate.eb.i.ejb11=CHKJ2400W: Deprecated use of a java.rmi.RemoteException on {0}. (EJB 1.1: 9.2.4).
+CHKJ2400.ejbPostCreate.eb.m.ejb11=CHKJ2400W: Deprecated use of a java.rmi.RemoteException. (EJB 1.1: 9.2.4).
+CHKJ2400.ejbFind.eb.i.ejb11=CHKJ2400W: Deprecated use of a java.rmi.RemoteException on {0}. (EJB 1.1: 9.2.5).
+CHKJ2400.ejbFind.eb.m.ejb11=CHKJ2400W: Deprecated use of a java.rmi.RemoteException. (EJB 1.1: 9.2.5).
+CHKJ2400.bus.eb.i.ejb11=CHKJ2400W: Deprecated use of a java.rmi.RemoteException on {0}. (EJB 1.1: 9.2.6).
+CHKJ2400.bus.eb.m.ejb11=CHKJ2400W: Deprecated use of a java.rmi.RemoteException. (EJB 1.1: 9.2.6).
+
+CHKJ2401.sb.i.ejb11=CHKJ2401E: {0} must return void. (EJB 1.1: 6.10.3)
+CHKJ2401.sb.m.ejb11=CHKJ2401E: This method must return void. (EJB 1.1: 6.10.3)
+CHKJ2402.sh.i.ejb11=CHKJ2402W: {0} must return the {1} remote interface type.  (EJB 1.1: 6.10.6).
+CHKJ2402.sh.m.ejb11=CHKJ2402W: This create method must return the {0} remote interface type.  (EJB 1.1: 6.10.6).
+CHKJ2402.eh.i.ejb11=CHKJ2402W: {0} must return the {1} remote interface type.  (EJB 1.1: 9.2.8).
+CHKJ2402.eh.m.ejb11=CHKJ2402W: This create method must return the {0} remote interface type.  (EJB 1.1: 9.2.8).
+CHKJ2403.eh.i.ejb11=CHKJ2403W: {0} must return {1} or a collection thereof. (EJB 1.1: 9.2.8)
+CHKJ2403.eh.m.ejb11=CHKJ2403W: The method must return {0} or a collection thereof. (EJB 1.1: 9.2.8)
+CHKJ2405.eh.i.ejb11=CHKJ2405W: The order and types of the arguments in {0} must match the order and types of the fields in the {1} key class. (EJB 1.1: 9.2.8, 9.4.7.3, 16.5)
+CHKJ2405.eh.m.ejb11=CHKJ2405W: The order and types of the arguments must match the order and types of the fields in the {0} key class. (EJB 1.1: 9.2.8, 9.4.7.3, 16.5)
+CHKJ2406.eb.i.ejb11=CHKJ2406W: {0} should return the primary key type {1}. (EJB 1.1: 9.2.3, 9.4.2, 9.4.7.3).
+CHKJ2406.eb.m.ejb11=CHKJ2406W: The method should return the primary key type {0}. (EJB 1.1: 9.2.3, 9.4.2, 9.4.7.3).
+CHKJ2407.eb.i.ejb11=CHKJ2407W: {0} should return either {1} or a collection thereof.  (EJB 1.1: 9.2.5)
+CHKJ2407.eb.m.ejb11=CHKJ2407W: This method should return either {0} or a collection thereof.  (EJB 1.1: 9.2.5)
+
+CHKJ2408.ejbCreate.sb.i.ejb11=CHKJ2408E: {0} must be public. (EJB 1.1: 6.10.3).
+CHKJ2408.ejbCreate.sb.m.ejb11=CHKJ2408E: The method must be public. (EJB 1.1: 6.10.3).
+CHKJ2408.bus.sb.i.ejb11=CHKJ2408E: {0} must be public. (EJB 1.1: 6.10.4).
+CHKJ2408.bus.sb.m.ejb11=CHKJ2408E: This method must be public. (EJB 1.1: 6.10.4).
+CHKJ2408.ejbCreate.eb.i.ejb11=CHKJ2408E: {0} must be public. (EJB 1.1: 9.2.3).
+CHKJ2408.ejbCreate.eb.m.ejb11=CHKJ2408E: This method must be public. (EJB 1.1: 9.2.3).
+CHKJ2408.ejbPostCreate.eb.i.ejb11=CHKJ2408E: {0} must be public. (EJB 1.1: 9.2.4).
+CHKJ2408.ejbPostCreate.eb.m.ejb11=CHKJ2408E: This method must be public. (EJB 1.1: 9.2.4).
+CHKJ2408.ejbFind.eb.i.ejb11=CHKJ2408E: {0} must be public. (EJB 1.1: 9.2.5).
+CHKJ2408.ejbFind.eb.m.ejb11=CHKJ2408E: This method must be public. (EJB 1.1: 9.2.5).
+CHKJ2408.bus.eb.i.ejb11=CHKJ2408E: {0} must be public. (EJB 1.1: 9.2.6).
+CHKJ2408.bus.eb.m.ejb11=CHKJ2408E: This method must be public. (EJB 1.1: 9.2.6).
+
+CHKJ2409.ejbCreate.sb.i.ejb11=CHKJ2409E: {0} must not be final. (EJB 1.1: 6.10.3).
+CHKJ2409.ejbCreate.sb.m.ejb11=CHKJ2409E: This method must not be final. (EJB 1.1: 6.10.3).
+CHKJ2409.bus.sb.i.ejb11=CHKJ2409E: {0} must not be final. (EJB 1.1: 6.10.4).
+CHKJ2409.bus.sb.m.ejb11=CHKJ2409E: This method must not be final. (EJB 1.1: 6.10.4).
+CHKJ2409.ejbCreate.eb.i.ejb11=CHKJ2409E: {0} must not be final. (EJB 1.1: 9.2.3).
+CHKJ2409.ejbCreate.eb.m.ejb11=CHKJ2409E: This method must not be final. (EJB 1.1: 9.2.3).
+CHKJ2409.ejbPostCreate.eb.i.ejb11=CHKJ2409E: {0} must not be final. (EJB 1.1: 9.2.4).
+CHKJ2409.ejbPostCreate.eb.m.ejb11=CHKJ2409E: This method must not be final. (EJB 1.1: 9.2.4).
+CHKJ2409.ejbFind.eb.i.ejb11=CHKJ2409E: {0} must not be final. (EJB 1.1: 9.2.5).
+CHKJ2409.ejbFind.eb.m.ejb11=CHKJ2409E: This method must not be final. (EJB 1.1: 9.2.5).
+CHKJ2409.bus.eb.i.ejb11=CHKJ2409E: {0} must not be final. (EJB 1.1: 9.2.6).
+CHKJ2409.bus.eb.m.ejb11=CHKJ2409E: This method must not be final. (EJB 1.1: 9.2.6).
+
+CHKJ2410.ejbCreate.sb.i.ejb11=CHKJ2410E: {0} must not be static. (EJB 1.1: 6.10.3).
+CHKJ2410.ejbCreate.sb.m.ejb11=CHKJ2410E: This method must not be static. (EJB 1.1: 6.10.3).
+CHKJ2410.bus.sb.i.ejb11=CHKJ2410E: {0} must not be static. (EJB 1.1: 6.10.4).
+CHKJ2410.bus.sb.m.ejb11=CHKJ2410E: This method must not be static. (EJB 1.1: 6.10.4).
+CHKJ2410.ejbCreate.eb.i.ejb11=CHKJ2410E: {0} must not be static. (EJB 1.1: 9.2.3).
+CHKJ2410.ejbCreate.eb.m.ejb11=CHKJ2410E: This method must not be static. (EJB 1.1: 9.2.3).
+CHKJ2410.ejbPostCreate.eb.i.ejb11=CHKJ2410E: {0} must not be static. (EJB 1.1: 9.2.4).
+CHKJ2410.ejbPostCreate.eb.m.ejb11=CHKJ2410E: This method must not be static. (EJB 1.1: 9.2.4).
+CHKJ2410.ejbFind.eb.i.ejb11=CHKJ2410E: {0} must not be static. (EJB 1.1: 9.2.5).
+CHKJ2410.ejbFind.eb.m.ejb11=CHKJ2410E: This method must not be static. (EJB 1.1: 9.2.5).
+CHKJ2410.bus.eb.i.ejb11=CHKJ2410E: {0} must not be static. (EJB 1.1: 9.2.6).
+CHKJ2410.bus.eb.m.ejb11=CHKJ2410E: This method must not be static. (EJB 1.1: 9.2.6).
+
+CHKJ2411.sb.i.ejb11=CHKJ2411E: The name of {0} must not start with "ejb". (EJB 1.1: 6.10.4)
+CHKJ2411.sb.m.ejb11=CHKJ2411E: The name of the method must not start with "ejb". (EJB 1.1: 6.10.4)
+CHKJ2411.eb.i.ejb11=CHKJ2411E: The name of {0} must not start with "ejb". (EJB 1.1: 9.2.6)
+CHKJ2411.eb.m.ejb11=CHKJ2411E: The name of the method must not start with "ejb". (EJB 1.1: 9.2.6)
+
+CHKJ2412.sb.i.ejb11=CHKJ2412I: The return type of {0} must be serializable at runtime.  (EJB 1.1: 6.10) (RMI 1.3: 2.6).
+CHKJ2412.sb.m.ejb11=CHKJ2412I: The return type must be serializable at runtime.  (EJB 1.1: 6.10) (RMI 1.3: 2.6).
+CHKJ2412.eb.i.ejb11=CHKJ2412I: The return type of {0} must be serializable at runtime.  (EJB 1.1: 9.2) (RMI 1.3: 2.6).
+CHKJ2412.eb.m.ejb11=CHKJ2412I: The return type must be serializable at runtime.  (EJB 1.1: 9.2) (RMI 1.3: 2.6).
+CHKJ2412.sr.i.ejb11=CHKJ2412I: The return type of {0} must be serializable at runtime.  (EJB 1.1: 6.10.5) (RMI 1.3: 2.6).
+CHKJ2412.sr.m.ejb11=CHKJ2412I: The return type must be serializable at runtime.  (EJB 1.1: 6.10.5) (RMI 1.3: 2.6).
+CHKJ2412.er.i.ejb11=CHKJ2412I: The return type of {0} must be serializable at runtime.  (EJB 1.1: 9.2.7) (RMI 1.3: 2.6).
+CHKJ2412.er.m.ejb11=CHKJ2412I: The return type must be serializable at runtime.  (EJB 1.1: 9.2.7) (RMI 1.3: 2.6).
+CHKJ2412.sh.i.ejb11=CHKJ2412I: The return type of {0} must be serializable at runtime.  (EJB 1.1: 6.10.6) (RMI 1.3: 2.6).
+CHKJ2412.sh.m.ejb11=CHKJ2412I: The return type must be serializable at runtime.  (EJB 1.1: 6.10.6) (RMI 1.3: 2.6).
+CHKJ2412.eh.i.ejb11=CHKJ2412I: The return type of {0} must be serializable at runtime.  (EJB 1.1: 9.2.8) (RMI 1.3: 2.6).
+CHKJ2412.eh.m.ejb11=CHKJ2412I: The return type must be serializable at runtime.  (EJB 1.1: 9.2.8) (RMI 1.3: 2.6).
+
+CHKJ2413.sb.i.ejb11=CHKJ2413I: Argument {1} of {0} must be serializable at runtime. (EJB 1.1: 6.10) (RMI 1.3: 2.6).
+CHKJ2413.sb.m.ejb11=CHKJ2413I: Argument {0} must be serializable at runtime. (EJB 1.1: 6.10) (RMI 1.3: 2.6).
+CHKJ2413.eb.i.ejb11=CHKJ2413I: Argument {1} of {0} must be serializable at runtime. (EJB 1.1: 9.2) (RMI 1.3: 2.6).
+CHKJ2413.eb.m.ejb11=CHKJ2413I: Argument {0} must be serializable at runtime. (EJB 1.1: 9.2) (RMI 1.3: 2.6).
+CHKJ2413.sr.i.ejb11=CHKJ2413I: Argument {1} of {0} must be serializable at runtime. (EJB 1.1: 6.10.5) (RMI 1.3: 2.6).
+CHKJ2413.sr.m.ejb11=CHKJ2413I: Argument {0} must be serializable at runtime. (EJB 1.1: 6.10.5) (RMI 1.3: 2.6).
+CHKJ2413.er.i.ejb11=CHKJ2413I: Argument {1} of {0} must be serializable at runtime. (EJB 1.1: 9.2.7) (RMI 1.3: 2.6).
+CHKJ2413.er.m.ejb11=CHKJ2413I: Argument {0} must be serializable at runtime. (EJB 1.1: 9.2.7) (RMI 1.3: 2.6).
+CHKJ2413.sh.i.ejb11=CHKJ2413I: Argument {1} of {0} must be serializable at runtime. (EJB 1.1: 6.10.6) (RMI 1.3: 2.6).
+CHKJ2413.sh.m.ejb11=CHKJ2413I: Argument {0} must be serializable at runtime. (EJB 1.1: 6.10.6) (RMI 1.3: 2.6).
+CHKJ2413.eh.i.ejb11=CHKJ2413I: Argument {1} of {0} must be serializable at runtime. (EJB 1.1: 9.2.8) (RMI 1.3: 2.6).
+CHKJ2413.eh.m.ejb11=CHKJ2413I: Argument {0} must be serializable at runtime. (EJB 1.1: 9.2.8) (RMI 1.3: 2.6).
+
+CHKJ2414.sh.i.ejb11=CHKJ2414E: {0} must throw {1}. (EJB 1.1: 6.10.6)
+CHKJ2414.sh.m.ejb11=CHKJ2414E: The method must throw {0}. (EJB 1.1: 6.10.6)
+CHKJ2414.eh.i.ejb11=CHKJ2414E: {0} must throw {1}. (EJB 1.1: 9.2.8)
+CHKJ2414.eh.m.ejb11=CHKJ2414E: The method must throw {0}. (EJB 1.1: 9.2.8)
+CHKJ2414.sr.i.ejb11=CHKJ2414E: {0} must throw {1}. (EJB 1.1: 6.10.5)
+CHKJ2414.sr.m.ejb11=CHKJ2414E: The method must throw {0}. (EJB 1.1: 6.10.5)
+CHKJ2414.er.i.ejb11=CHKJ2414E: {0} must throw {1}. (EJB 1.1: 9.2.7)
+CHKJ2414.er.m.ejb11=CHKJ2414E: The method must throw {0}. (EJB 1.1: 9.2.7)
+
+CHKJ2415.sr.i.ejb11=CHKJ2415E: The return type of {0} must match the return type, {1}, of the matching method in the {2} bean class. (EJB 1.1: 6.10.5)
+CHKJ2415.sr.m.ejb11=CHKJ2415E: The return type must match the return type, {0}, of the matching method in the {1} bean class. (EJB 1.1: 6.10.5)
+CHKJ2415.er.i.ejb11=CHKJ2415E: The return type of {0} must match the return type, {1}, of the matching method in the {2} bean class. (EJB 1.1: 9.2.7)
+CHKJ2415.er.m.ejb11=CHKJ2415E: The return type must match the return type, {0}, of the matching method in the {1} bean class. (EJB 1.1: 9.2.7)
+CHKJ2415.sh.i.ejb11=CHKJ2415E: The return type of {0} must match the return type, {1}, of the matching method in the {2} bean class. (EJB 1.1: 6.10.6)
+CHKJ2415.sh.m.ejb11=CHKJ2415E: The return type must match the return type, {0}, of the matching method in the {1} bean class. (EJB 1.1: 6.10.6)
+CHKJ2415.eh.i.ejb11=CHKJ2415E: The return type of {0} must match the return type, {1}, of the matching method in the {2} bean class. (EJB 1.1: 9.2.8)
+CHKJ2415.eh.m.ejb11=CHKJ2415E: The return type must match the return type, {0}, of the matching method in the {1} bean class. (EJB 1.1: 9.2.8)
+
+CHKJ2418.eb.i.ejb11=CHKJ2418E: {0} must return void. (EJB 1.1: 9.2.4)
+CHKJ2418.eb.m.ejb11=CHKJ2418E: This method must return void. (EJB 1.1: 9.2.4)
+CHKJ2419.sh.i.ejb11=CHKJ2419E: {0} must be a create method. (EJB 1.1: 6.10.6)
+CHKJ2419.sh.m.ejb11=CHKJ2419E: This method must be a create method. (EJB 1.1: 6.10.6)
+
+CHKJ2420.sb.i.ejb11=CHKJ2420E: {1} must be thrown by {0}''s corresponding method on the {2} home interface. (EJB 1.1: 6.10.6, 12.2.1, 12.2.2)
+CHKJ2420.sb.m.ejb11=CHKJ2420E: {0} must be thrown by the corresponding method on the {1} home interface. (EJB 1.1: 6.10.6, 12.2.1, 12.2.2)
+CHKJ2420.eb.i.ejb11=CHKJ2420E: {1} must be thrown by {0}''s corresponding method on the {2} home interface. (EJB 1.1: 9.2.8, 12.2.1, 12.2.2)
+CHKJ2420.eb.m.ejb11=CHKJ2420E: {0} must be thrown by the corresponding method on the {1} home interface. (EJB 1.1: 9.2.8, 12.2.1, 12.2.2)
+CHKJ2432.sb.i.ejb11=CHKJ2432E: {0}''s corresponding method on the {1} remote interface must throw {2}. (EJB 1.1: 6.10.5, 12.2.1, 12.2.2)
+CHKJ2432.sb.m.ejb11=CHKJ2432E: The corresponding method on the {0} remote interface must throw {1}. (EJB 1.1: 6.10.5, 12.2.1, 12.2.2)
+CHKJ2432.eb.i.ejb11=CHKJ2432E: {0}''s corresponding method on the {1} remote interface must throw {2}. (EJB 1.1: 9.2.7, 12.2.1, 12.2.2)
+CHKJ2432.eb.m.ejb11=CHKJ2432E: The corresponding method on the {0} remote interface must throw {1}. (EJB 1.1: 9.2.7, 12.2.1, 12.2.2)
+
+CHKJ2801.ejb11=CHKJ2801E: The value of the <ejb-name> element must be specified. (EJB 1.1: 16.2, 16.5)
+CHKJ2802.named.ejb11=CHKJ2802E: <ejb-class> class {0}, or one of its supertypes, cannot be reflected. Check the classpath.
+CHKJ2802.unnamed.ejb11=CHKJ2802E: Unknown class specified in the <ejb-class> element. (EJB 1.1: 16.2, 16.5).
+CHKJ2803.named.ejb11=CHKJ2803E: <home> interface {0}, or one of its supertypes, cannot be reflected. Check the classpath.
+CHKJ2803.unnamed.ejb11=CHKJ2803E: Unknown interface specified in the <home> element. (EJB 1.1: 16.2, 16.5).
+CHKJ2804.named.ejb11=CHKJ2804E: <remote> interface {0}, or one of its supertypes, cannot be reflected. Check the classpath.
+CHKJ2804.unnamed.ejb11=CHKJ2804E: Unknown interface specified in the <remote> element. (EJB 1.1: 16.2, 16.5).
+CHKJ2806.ejb11=CHKJ2806E: The value of the <reentrant> element must be either "True" or "False". (EJB 1.1: 16.2, 16.5)
+CHKJ2807.ejb11=CHKJ2807E: The value of the <session-type> element must be either "Stateful" or "Stateless". (EJB 1.1: 16.2, 16.5)
+CHKJ2808.ejb11=CHKJ2808E: The value of the <transaction-type> element must be either "Container" or "Bean". (EJB 1.1: 11.3.5, 16.2,, 16.5)
+CHKJ2809.ejb11=CHKJ2809E: The value of the <persistence-type> element must be either "Container" or "Bean".  (EJB 1.1: 16.2, 16.5)
+CHKJ2810.named.ejb11=CHKJ2810E: <prim-key-class> class {0}, or one of its supertypes, cannot be reflected. Check the classpath.
+CHKJ2810.unnamed.ejb11=CHKJ2810E: Unknown class specified in the <prim-key-class> element.  (EJB 1.1: 16.2, 16.5).
+CHKJ2811.named.ejb11=CHKJ2811E: <field-name> {0} cannot be located on bean class {1}. (EJB 1.1: 16.5).
+CHKJ2811.unnamed.ejb11=CHKJ2811E: <cmp-field> must specify a <field-name>. (EJB 1.1: 16.5).
+CHKJ2812.ejb11=CHKJ2812E: Bean class {0} must specify at least one of its fields as a <cmp-field>. (EJB 1.1: 16.5)
+CHKJ2814.ejb11=CHKJ2814W: <ejb-name>, in <method>, should specify a known enterprise bean. (EJB 1.1: 11.4.1, 15.3.2, 16.5)
+
+CHKJ2820.ejb11=CHKJ2820W: The security role ref must be defined only once.
+CHKJ2822.ejb11=CHKJ2822W: <security-role-ref> element for bean {0} should define the <role-name> element. (EJB 1.1: 15.2.5.3)
+CHKJ2823.ejb11=CHKJ2823W: <security-role-ref> element should define the <role-link> element. (EJB 1.1: 15.3.3)
+CHKJ2824.ejb11=CHKJ2824W: <security-role-ref> element refers to unknown role {0}. (EJB 1.1: 15.3.3)
+CHKJ2825.ejb11=CHKJ2825W: <security-role> element in ejb-jar.xml should define the <role-name> element. (EJB 1.1: 15.3.1)
+CHKJ2826.ejb11=CHKJ2826W: The security-role name must be unique. (EJB 1.1: 15.3.1)
+CHKJ2827.ejb11=CHKJ2827W: Cannot use a <role-link> element without <security-role> elements. (EJB 1.1: 15.2.5.3, 15.3.1, 15.3.3)
+CHKJ2828.ejb11=CHKJ2828E: Cannot use a <primkey-field> element without a primitive primary key. (EJB 1.1: 9.4.7, 16.5)
+CHKJ2829.ejb11=CHKJ2829E: Key class {0} does not map to any fields in enterprise bean {1}. (EJB 1.1: 9.4.7, 16.5)
+
+CHKJ2830.ejb11=CHKJ2830W: The type of the {0} field cannot be reflected. Check the classpath.
+CHKJ2831.ejb11=CHKJ2831W: {0} must be declared in a <cmp-field> element. (EJB 1.1: 9.4.7.2)
+CHKJ2832.ejb11=CHKJ2832I: Home {0}, specified in the <ejb-ref> element, cannot be found in the EJB module. (EJB 1.1: 14.3.1.2)
+CHKJ2833.ejb11=CHKJ2833I: Remote {0}, specified in the <ejb-ref> element, cannot be found in the EJB module. (EJB 1.1: 14.3.1.2)
+CHKJ2834.ejb11=CHKJ2834I: Bean {0}, specified in the <ejb-ref> element, cannot be found in the EJB module. (EJB 1.1: 14.3.2)
+CHKJ2835.ejb11=CHKJ2835I: Bean {0} is a {1} type. Update the <ejb-ref-type> element of the <ejb-ref> element. (EJB 1.1: 14.3.2)
+CHKJ2836.ejb11=CHKJ2836I: Bean {0} uses home {1}. Update the <ejb-ref> element of the <ejb-ref> element. (EJB 1.1: 14.3.2)
+CHKJ2837.ejb11=CHKJ2837I: Bean {0} uses remote {1}. Update the <ejb-ref> element of the <ejb-ref> element. (EJB 1.1: 14.3.2).
+CHKJ2838.ejb11=CHKJ2838I: It is recommended that all references to enterprise beans be organized in the "ejb" subcontext. (EJB 1.1: 14.3.1.1).
+CHKJ2839.ejb11=CHKJ2839W: The <env-entry-name> element, of the <env-entry> element, is invalid. (EJB 1.1: 14.2.1.2)
+
+CHKJ2840.ejb11=CHKJ2840W: The <env-entry-type> element, of the <env-entry> element, is invalid. (EJB 1.1: 14.2.1.2).
+CHKJ2841.ejb11=CHKJ2841W: The {0} name, in the <env-entry-name> element, can be used only once in the bean. (EJB 1.1: 14.2.1.2).
+CHKJ2842.ejb11=CHKJ2842W: <method-params> is ignored when <method-name> is "*". (EJB 1.1: 11.4.1, 15.3.2).
+CHKJ2843.ejb11=CHKJ2843W: No methods, on {0}, match this <method>. (EJB 1.1: 11.4.1, 15.3.2).
+CHKJ2844.ejb11=CHKJ2844W: At least one <method> should be set in a <method-permission>. (EJB 1.1: 11.4.1, 15.3.2).
+CHKJ2845.ejb11=CHKJ2845W: At least one <role-name> should be set in a <method-permission>. (EJB 1.1: 11.4.1, 15.3.2).
+CHKJ2846.ejb11=CHKJ2846W: No methods can be found for this <method-permission>. (EJB 1.1: 15.3.2).
+CHKJ2847.ejb11=CHKJ2847W: No methods can be found for this <container-transaction>. (EJB 1.1: 11.4.1).
+CHKJ2849.ejb11=CHKJ2849W: Cannot validate component inheritance of {0} because {1}, or one of its supertypes, cannot be reflected. Check the classpath.
+CHKJ2850.ejb11=CHKJ2850W: Cannot validate <method> because {0}, or one of its supertypes, cannot be reflected. Check the classpath.
+CHKJ2851.ejb11=CHKJ2851W: Cannot validate {0} because {1}, or one of its supertypes, cannot be reflected. Check the classpath.
+CHKJ2852.ejb11=CHKJ2852W: Throwable caught while validating the ejb-jar.xml. The bean being validated was {0}.
+CHKJ2853.ejb11=CHKJ2853W: Throwable caught while validating the ibm-ejb-jar-ext.xmi. The bean being validated was {0}.
+
+CHKJ2908.ejb11=CHKJ2908W: An enterprise bean cannot be reflected properly. Run the XML validator for more information.
+
+CHKJ2895.ejb11=CHKJ2895W: <ejb-name> {0} must be unique within the ejb-jar.xml file (EJB 1.1: 16.5).
+CHKJ2875.ejb11=CHKJ2875E: <ejb-client-jar> {0} must exist in every EAR file that contains this EJB module (EJB 1.1: 16.5, 17.4).
+
+
+# EJB_METHOD_BEAN_NULL=CHKJ2434W: Validation of this method was terminated because the bean class cannot be found. Check the spelling of the bean class'' name in the ejb-jar.xml file.
+# EJB_METHOD_HOME_NULL=CHKJ2435W: Validation of this method was terminated because the home interface cannot be found. Check the spelling of the home interface''s name in the ejb-jar.xml file.
+# EJB_METHOD_REMOTE_NULL=CHKJ2436W: Validation of this method was terminated because the remote interface cannot be found. Check the spelling of the remote interface''s name in the ejb-jar.xml file.
+# EJB_METHOD_NULL=CHKJ2437W: Validation of this method was terminated because the enterprise bean cannot be found.
+# EJB_METHOD_KEY_NULL=CHKJ2438W: Validation of this method was terminated because the primary key cannot be found. Check the spelling of the key class'' name in the ejb-jar.xml file.
+# EJB_REMOTE_NULL=CHKJ2904E: Validation of {0} was terminated because the remote interface cannot be found. Check the spelling of its name in the ejb-jar.xml file.
+# EJB_NULL=CHKJ2903E: Validation was terminated because the enterprise bean cannot be found.
+# EJB_NOTREFLECTED_JAVACLASS=CHKJ2907E: Cannot validate because the {0} type cannot be reflected. Ensure that it, and all of its dependencies, are included in the classpath.
+# EJB_FIELD_CANNOT_REFLECT=CHKJ2208W: Type {0} of field {1} cannot be reflected. Ensure that {0}, and all of its dependencies, are included in the classpath.
+# EJB_FIELD_BEAN_NULL=CHKJ2209W: Validation of this field was terminated because the bean class cannot be found. Check the spelling of the bean class'' name in the ejb-jar.xml file.
+# EJB_FIELD_HOME_NULL=CHKJ2210W: Validation of this field was terminated because the home interface cannot be found. Check the spelling of the home interface''s name in the ejb-jar.xml file.
+# EJB_FIELD_REMOTE_NULL=CHKJ2211W: Validation of this field was terminated because the remote interface cannot be found. Check the spelling of the remote interface''s name in the ejb-jar.xml file.
+# EJB_FIELD_NULL=CHKJ2212W: Validation of this field was terminated because the enterprise bean cannot be found.
+# EJB_FIELD_KEY_NULL=CHKJ2213W: Validation of this field was terminated because the primary key cannot be found. Check the spelling of the key class'' name in the ejb-jar.xml file.
+# EJB_HAS_MULTIPLE_PK_METHODS=CHKJ2000W: The {0} home interface must contain only one findByPrimaryKey method. (EJB 1.1: 9.2.8)
+# EJB_HOME_NULL=CHKJ2901E: Validation of {0} was terminated because the home interface cannot be found. Check the spelling of its name in the ejb-jar.xml file.
+# EJB_KEY_NULL=CHKJ2902E: Validation of {0} was terminated because the key class cannot be found. Check the spelling of its name in the ejb-jar.xml file.
+# EJB_BEAN_NULL=CHKJ2900E: Validation of {0} was terminated because the bean class cannot be found. Check the spelling of its name in the ejb-jar.xml file.
+# EJB_BMP_NOFIELDS=CHKJ2042W: To have a primary key, the {0} bean class must declare at least one field. (EJB 1.1: 9.1.5.1)
+# EJB_DD_CANNOT_OPEN_DD=CHKJ2821E: Cannot open the deployment descriptor. Validation cannot complete.
+# EJB_DD_METHTRANSACTION_NO_TRANSACTION=CHKJ2848W: At least one <trans-attribute> must be set in a <container-transaction>. (EJB 1.1: 11.4.1)
+
+#
+# end of messages for the EJB 1.1 specification
+#
+
+#
+# Messages for EJB 2.0 specification
+#
+CHKJ2828.ejb20=CHKJ2828E: Cannot use a <primkey-field> without a primitive primary key (EJB 2.0: 10.8.1, 22.5).
+CHKJ2829.ejb20=CHKJ2829E: Key class {0} does not map to any fields in enterprise bean {1}. (EJB 2.0: 10.8, 22.5).
+CHKJ2839.ejb20=CHKJ2839W: The <env-entry-name> element, of the <env-entry> element, is invalid. (EJB 2.0: 20.2.1.2).
+CHKJ2840.ejb20=CHKJ2840W: The <env-entry-type> element, of the <env-entry> element, is invalid. (EJB 2.0: 20.2.1.2).
+CHKJ2841.ejb20=CHKJ2841W: The {0} name, in the <env-entry-name> element, can be used only once in the bean. (EJB 2.0: 20.2.1.2).
+CHKJ2830.ejb20=CHKJ2830W: The type of the {0} field cannot be reflected. Check the classpath.
+CHKJ2831.ejb20=CHKJ2831W: {0} must be declared in a <cmp-field> element. (EJB 2.0: 10.8.2).
+CHKJ2801.ejb20=CHKJ2801E: The value of the <ejb-name> element must be specified. (EJB 2.0 22.2, 22.5).
+CHKJ2809.ejb20=CHKJ2809E: The value of the <persistence-type> element must be either "Container" or "Bean".  (EJB 2.0: 22.2, 22.5).
+CHKJ2806.ejb20=CHKJ2806E: The value of the <reentrant> element must be either "True" or "False". (EJB 2.0: 22.2, 22.5).
+CHKJ2807.ejb20=CHKJ2807E: The value of the <session-type> element must be either "Stateful" or "Stateless". (EJB 2.0: 22.2, 22.5).
+CHKJ2808.ejb20=CHKJ2808E: The value of the <transaction-type> element must be either "Container" or "Bean". (EJB 2.0: 17.3.6, 22.2, 22.5).
+CHKJ2814.ejb20=CHKJ2814W: <ejb-name>, in <method>, should specify a known enterprise bean. (EJB 2.0: 17.4.1, 21.3.2, 22.5).
+CHKJ2842.ejb20=CHKJ2842W: <method-params> is ignored when <method-name> is "*". (EJB 2.0: 17.4.1, 21.3.2).
+CHKJ2843.ejb20=CHKJ2843W: No methods, on {0}, match this <method>. (EJB 2.0: 17.4.1, 21.3.2).
+CHKJ2844.ejb20=CHKJ2844W: At least one <method> should be set in a <method-permission>. (EJB 2.0: 17.4.1, 21.3.2).
+CHKJ2845.ejb20=CHKJ2845W: A <role-name> or an <unchecked> element should be set in a <method-permission>. (EJB 2.0: 17.4.1, 21.3.2).
+CHKJ2846.ejb20=CHKJ2846W: No methods can be found for this <method-permission>. (EJB 2.0: 21.3.2).
+CHKJ2847.ejb20=CHKJ2847W: No methods can be found for this <container-transaction>. (EJB 2.0: 17.4.1).
+CHKJ2812.ejb20=CHKJ2812E: Bean class {0} must specify at least one of its fields as a <cmp-field>. (EJB 2.0: 22.5).
+CHKJ2832.ejb20=CHKJ2832I: Home {0}, specified in the <ejb-ref> element, cannot be found in the EJB module. (EJB 2.0: 20.3.1.2).
+CHKJ2833.ejb20=CHKJ2833I: Remote {0}, specified in the <ejb-ref> element, cannot be found in the EJB module. (EJB 2.0: 20.3.1.2).
+CHKJ2834.ejb20=CHKJ2834I: Bean {0}, specified in the <ejb-ref> element, cannot be found in the EJB module. (EJB 2.0: 20.3.2).
+CHKJ2835.ejb20=CHKJ2835I: Bean {0} is a {1} type. Update the <ejb-ref-type> element of the <ejb-ref> element. (EJB 2.0: 20.3.2).
+CHKJ2836.ejb20=CHKJ2836I: Bean {0} uses home {1}. Update the <ejb-ref> element of the <ejb-ref> element. (EJB 2.0: 20.3.2).
+CHKJ2837.ejb20=CHKJ2837I: Bean {0} uses remote {1}. Update the <ejb-ref> element of the <ejb-ref> element. (EJB 2.0: 20.3.2).
+CHKJ2838.ejb20=CHKJ2838I: It is recommended that all references to enterprise beans be organized in the "ejb" subcontext. (EJB 2.0: 20.3.1.1).
+CHKJ2820.ejb20=CHKJ2820W: The security role ref is defined more than once.
+CHKJ2822.ejb20=CHKJ2822W: <security-role-ref> element for bean {0} should define the <role-name> element. (EJB 2.0: 21.2.5.3).
+CHKJ2823.ejb20=CHKJ2823W: <security-role-ref> element should define the <role-link> element. (EJB 2.0: 21.3.3).
+CHKJ2824.ejb20=CHKJ2824W: <security-role-ref> element refers to unknown role {0}. (EJB 2.0: 21.3.3).
+CHKJ2825.ejb20=CHKJ2825W: <security-role> element in ejb-jar.xml should define the <role-name> element. (EJB 2.0: 21.3.1).
+CHKJ2826.ejb20=CHKJ2826W: The security-role name must be unique. (EJB 2.0: 21.3.1).
+CHKJ2827.ejb20=CHKJ2827W: Cannot use a <role-link> element without <security-role> elements. (EJB 2.0: 21.2.5.3, 21.3.1, 21.3.3).
+CHKJ2850.ejb20=CHKJ2850W: Cannot validate <method> because the {0} type cannot be reflected. Check the classpath.
+CHKJ2851.ejb20=CHKJ2851W: Cannot validate {0} because type {1} cannot be reflected. Check the classpath.
+CHKJ2875.ejb20=CHKJ2875E: <ejb-client-jar> {0} must exist in every EAR file that contains this EJB module (EJB 2.0: 22.5, 23.4, 23.6).
+
+CHKJ2003E.ejb20=CHKJ2003E: This class must not implement javax.ejb.SessionSynchronization (EJB 2.0: 7.5.3, 7.10.2, 17.3.4.1).
+CHKJ2003I.ejb20=CHKJ2003I: Bean-managed transaction stateful session beans need not implement javax.ejb.SessionSynchronization (EJB 2.0: 7.5.3, 7.10.2, 17.3.4.1).
+CHKJ2802.named.ejb20=CHKJ2802E: <ejb-class> class {0}, or one of its supertypes, cannot be reflected. Check the classpath.
+CHKJ2802.unnamed.ejb20=CHKJ2802E: The bean class, identified by the <ejb-class> element, cannot be found. (EJB 2.0: 22.2, 22.5).
+CHKJ2803.named.ejb20=CHKJ2803E: <home> interface {0}, or one of its supertypes, cannot be reflected. Check the classpath.
+CHKJ2803.unnamed.ejb20=CHKJ2803E: Unknown interface specified in the <home> element. (EJB 2.0: 22.2, 22.5).
+CHKJ2804.named.ejb20=CHKJ2804E: <remote> interface {0}, or one of its supertypes, cannot be reflected. Check the classpath.
+CHKJ2804.unnamed.ejb20=CHKJ2804E: Unknown interface specified in the <remote> element. (EJB 2.0: 22.2, 22.5).
+CHKJ2805.named.ejb20=CHKJ2805E: <local-home> interface {0}, or one of its supertypes, cannot be reflected. Check the classpath.
+CHKJ2805.unnamed.ejb20=CHKJ2805E: Unknown interface specified in the <local-home> element. (EJB 2.0: 22.2, 22.5).
+CHKJ2800.named.ejb20=CHKJ2800E: <local> interface {0}, or one of its supertypes, cannot be reflected. Check the classpath.
+CHKJ2800.unnamed.ejb20=CHKJ2800E: Unknown interface specified in the <local> element. (EJB 2.0: 22.2, 22.5).
+CHKJ2810.named.ejb20=CHKJ2810E: <prim-key-class> class {0}, or one of its supertypes, cannot be reflected. Check the classpath.
+CHKJ2810.unnamed.ejb20=CHKJ2810E: Unknown class specified in the <prim-key-class> element.  (EJB 2.0: 22.2, 22.5).
+CHKJ2811.ejb20=CHKJ2811E: <field-name> {0} cannot be located on bean class {1}. (EJB 2.0: 22.5).
+
+CHKJ2103.ejb20=CHKJ2103E: In component inheritance, the {0} bean class must inherit {1} (EJB 2.0: D.2)
+CHKJ2104.ejb20=CHKJ2104E: In component inheritance, the {0} home interface must not inherit {1}. (EJB 2.0: D.2).
+CHKJ2105.ejb20=CHKJ2105E: In component inheritance, the {0} component interface must inherit {1}. (EJB 2.0: D.2).
+CHKJ2106.ejb20=CHKJ2106E:  Bean {0} must use {1} as its <prim-key-class> (EJB 2.0: D.2).
+CHKJ2849.ejb20=CHKJ2849W: Cannot validate component inheritance of {0} because the {1} type, or one of its dependencies, cannot be reflected. Check the classpath.
+
+CHKJ2895.ejb20=CHKJ2895W: <ejb-name> {0} must be unique within the ejb-jar.xml file (EJB 2.0: 22.5).
+
+##################################################
+# class/interface checks
+##################################################
+# implement SessionBean/EntityBean/MessageDrivenBean/MessageListener
+CHKJ2017.sb.ejb20=CHKJ2017E: This class must implement {0} (EJB 2.0: 7.5.1, 7.10.2).
+CHKJ2017.mb.ejb20=CHKJ2017E: This class must implement {0} (EJB 2.0: 15.4.1, 15.7.2).
+CHKJ2017.cb.ejb20=CHKJ2017E: This class must implement {0} (EJB 2.0: 10.6.2).
+CHKJ2017.bb.ejb20=CHKJ2017E: This class must implement {0} (EJB 2.0: 12.2.2).
+
+# implement EJBHome
+CHKJ2017.srh.ejb20=CHKJ2017E: This interface must extend javax.ejb.EJBHome (EJB 2.0: 6.3, 7.10.6).
+CHKJ2017.crh.ejb20=CHKJ2017E: This interface must extend javax.ejb.EJBHome (EJB 2.0: 9.5, 10.6.10).
+CHKJ2017.brh.ejb20=CHKJ2017E: This interface must extend javax.ejb.EJBHome (EJB 2.0: 9.5, 12.2.9).
+
+# implement EJBLocalHome
+CHKJ2017.slh.ejb20=CHKJ2017E: This interface must extend javax.ejb.EJBLocalHome (EJB 2.0: 6.4, 7.10.8).
+CHKJ2017.clh.ejb20=CHKJ2017E: This interface must extend javax.ejb.EJBLocalHome (EJB 2.0: 9.6, 10.6.12).
+CHKJ2017.blh.ejb20=CHKJ2017E: This interface must extend javax.ejb.EJBLocalHome (EJB 2.0: 9.6, 12.2.11).
+
+# implement EJBObject
+CHKJ2017.src.ejb20=CHKJ2017E: This interface must extend javax.ejb.EJBObject (EJB 2.0: 6.5, 7.10.5).
+CHKJ2017.crc.ejb20=CHKJ2017E: This interface must extend javax.ejb.EJBObject (EJB 2.0: 9.9, 10.6.9).
+CHKJ2017.brc.ejb20=CHKJ2017E: This interface must extend javax.ejb.EJBObject (EJB 2.0: 9.9, 12.2.8).
+
+# implement EJBLocalObject
+CHKJ2017.slc.ejb20=CHKJ2017E: This interface must extend javax.ejb.EJBLocalObject (EJB 2.0: 7.10.7).
+CHKJ2017.clc.ejb20=CHKJ2017E: This interface must extend javax.ejb.EJBLocalObject (EJB 2.0: 9.10, 10.6.10).
+CHKJ2017.blc.ejb20=CHKJ2017E: This interface must extend javax.ejb.EJBLocalObject (EJB 2.0: 9.10, 12.2.10).
+
+# impl component interface
+CHKJ2040.cb.ejb20=CHKJ2040I: "this" must not be passed as a method argument or result (EJB 2.0: 10.6.2).
+CHKJ2040.bb.ejb20=CHKJ2040I: "this" must not be passed as a method argument or result (EJB 2.0: 12.2.2).
+CHKJ2040.sb.ejb20=CHKJ2040I: "this" must not be passed as a method argument or result (EJB 2.0: 7.10.2).
+
+# bean class
+CHKJ2014.cb.ejb20=CHKJ2014W: This class must be abstract (EJB 2.0: 10.3.1, 10.4.1, 10.6.2).
+CHKJ2014.mb.ejb20=CHKJ2014W: This class must not be abstract (EJB 2.0: 15.7.2).
+CHKJ2014.bb.ejb20=CHKJ2014W: This class must not be abstract (EJB 2.0: 12.2.2).
+CHKJ2014.sb.ejb20=CHKJ2014W: This class must not be abstract (EJB 2.0: 7.10.1).
+
+CHKJ2022.cb.ejb20=CHKJ2022W: This class must be public (EJB 2.0: 10.6.2).
+CHKJ2022.mb.ejb20=CHKJ2022W: This class must be public (EJB 2.0: 15.7.2).
+CHKJ2022.bb.ejb20=CHKJ2022W: This class must be public (EJB 2.0: 12.2.2).
+CHKJ2022.sb.ejb20=CHKJ2022W: This class must be public (EJB 2.0: 7.10.1).
+CHKJ2022.kc.ejb20=CHKJ2022W: This class must be public (EJB 2.0: 10.8.2).
+
+CHKJ2015.cb.ejb20=CHKJ2015W: This class must not be final (EJB 2.0: 10.6.2).
+CHKJ2015.mb.ejb20=CHKJ2015W: This class must not be final (EJB 2.0: 15.7.2).
+CHKJ2015.bb.ejb20=CHKJ2015W: This class must not be final (EJB 2.0: 12.2.2).
+CHKJ2015.sb.ejb20=CHKJ2015W: This class must not be final (EJB 2.0: 7.10.1).
+
+# dependent value class
+CHKJ2018.ejb20=CHKJ2018W: This class must be serializable (EJB 2.0: 10.3.3, 10.6.3).
+CHKJ2043.ejb20=CHKJ2043W: This class must be public (EJB 2.0: 10.6.3).
+CHKJ2044.ejb20=CHKJ2044W: This class must not be abstract (EJB 2.0: 10.6.3).
+
+# key class
+CHKJ2019.kc.ejb20=CHKJ2019W: This class must be a legal Value Type in RMI-IIOP (EJB 2.0: 9.8, 10.6.13).
+CHKJ2019.kb.ejb20=CHKJ2019W: This class must be a legal Value Type in RMI-IIOP (EJB 2.0: 9.8, 12.2.12).
+
+
+###
+# methods which must exist
+###
+# public default constructor with no parameters
+CHKJ2050.constr.sb.ejb20=CHKJ2050W: public {0} must exist (EJB 2.0: 7.10.2).
+CHKJ2050.constr.cb.ejb20=CHKJ2050W: public {0} must exist (EJB 2.0: 10.5.2, 10.6.2).
+CHKJ2050.constr.bb.ejb20=CHKJ2050W: public {0} must exist (EJB 2.0: 12.1.4.1, 12.2.2).
+CHKJ2050.constr.mb.ejb20=CHKJ2050W: public {0} must exist (EJB 2.0: 15.7.2).
+CHKJ2050.constr.kc.ejb20=CHKJ2050W: public {0} must exist (EJB 2.0: 10.8.2).
+
+
+# accessor method
+CHKJ2050.acc.cb.ejb20=CHKJ2050E: This class must define {0} (EJB 2.0: 10.3.1).
+
+CHKJ2050.onMessage.mb.ejb20=CHKJ2050W: onMessage(javax.jms.Message) must exist (EJB 2.0: 15.4.2, 15.7.4).
+
+CHKJ2050.ejbCreate.sfb.ejb20=CHKJ2050W: At least one ejbCreate method must exist (EJB 2.0: 7.5.5).
+CHKJ2050.ejbCreate.ssb.ejb20=CHKJ2050W: The ejbCreate() method must exist (EJB 2.0: 7.8).
+CHKJ2050.ejbCreate.mb.ejb20=CHKJ2050W: The ejbCreate() method must exist (EJB 2.0: 15.4.4, 15.7.2).
+
+CHKJ2050.ejbFindByPrimaryKey.bb.ejb20=CHKJ2050W: The ejbFindByPrimaryKey method must exist (EJB 2.0: 12.2.5).
+
+CHKJ2050.setEntityContext.cb.ejb20=CHKJ2050W: The setEntityContext(EntityContext) method must exist (EJB 2.0: 10.5.2).
+CHKJ2050.setEntityContext.bb.ejb20=CHKJ2050W: The setEntityContext(EntityContext) method must exist (EJB 2.0: 12.1.4.1).
+
+CHKJ2050.unsetEntityContext.cb.ejb20=CHKJ2050W: The unsetEntityContext() method must exist (EJB 2.0: 10.5.2).
+CHKJ2050.unsetEntityContext.bb.ejb20=CHKJ2050W: The unsetEntityContext() method must exist (EJB 2.0: 12.1.4.1).
+
+CHKJ2050.ejbActivate.cb.ejb20=CHKJ2050W: The ejbActivate() method must exist (EJB 2.0: 10.5.2).
+CHKJ2050.ejbActivate.bb.ejb20=CHKJ2050W: The ejbActivate() method must exist (EJB 2.0: 12.1.4.1).
+
+CHKJ2050.ejbPassivate.cb.ejb20=CHKJ2050W: The ejbPassivate() method must exist (EJB 2.0: 10.5.2).
+CHKJ2050.ejbPassivate.bb.ejb20=CHKJ2050W: The ejbPassivate() method must exist (EJB 2.0: 12.1.4.1).
+CHKJ2050.ejbPassivate.sb.ejb20=CHKJ2050W: The ejbPassivate() method must exist (EJB 2.0: 7.5.1).
+
+CHKJ2050.ejbRemove.cb.ejb20=CHKJ2050W: The ejbRemove() method must exist (EJB 2.0: 10.5.2).
+CHKJ2050.ejbRemove.bb.ejb20=CHKJ2050W: The ejbRemove() method must exist (EJB 2.0: 12.1.4.1).
+CHKJ2050.ejbRemove.mb.ejb20=CHKJ2050W: The ejbRemove() method must exist (EJB 2.0: 15.7.5).
+CHKJ2050.ejbRemove.sb.ejb20=CHKJ2050W: The ejbRemove() method must exist (EJB 2.0: 4.2.2, 7.5.1).
+
+CHKJ2050.ejbLoad.cb.ejb20=CHKJ2050W: The ejbLoad() method must exist (EJB 2.0: 10.5.2).
+CHKJ2050.ejbLoad.bb.ejb20=CHKJ2050W: The ejbLoad() method must exist (EJB 2.0: 12.1.4.1).
+
+CHKJ2050.ejbStore.cb.ejb20=CHKJ2050W: The ejbStore() method must exist (EJB 2.0: 10.5.2).
+CHKJ2050.ejbStore.bb.ejb20=CHKJ2050W: The ejbStore() method must exist (EJB 2.0: 12.1.4.1).
+
+CHKJ2050.create.ssrh.ejb20=CHKJ2050W: The create() method must exist (EJB 2.0: 7.8, 7.10.6).
+CHKJ2050.create.sslh.ejb20=CHKJ2050W: The create() method must exist (EJB 2.0: 7.8, 7.10.8).
+
+CHKJ2050.create.srh.ejb20=CHKJ2050W: This interface must define at least one create method (EJB 2.0: 6.3.1, 7.10.6).
+CHKJ2050.create.slh.ejb20=CHKJ2050W: This interface must define at least one create method (EJB 2.0: 6.4.1, 7.10.8).
+
+CHKJ2050.find.crh.ejb20=CHKJ2050W: At least one finder method must exist (EJB 2.0: 9.5.2).
+CHKJ2050.find.brh.ejb20=CHKJ2050W: At least one finder method must exist (EJB 2.0: 9.5.2).
+CHKJ2050.find.clh.ejb20=CHKJ2050W: At least one finder method must exist (EJB 2.0: 9.6.2).
+CHKJ2050.find.blh.ejb20=CHKJ2050W: At least one finder method must exist (EJB 2.0: 9.6.2).
+
+CHKJ2050.home.crh.ejb20=CHKJ2050W: This interface must define at least one home method (EJB 2.0: 9.5.4).
+CHKJ2050.home.brh.ejb20=CHKJ2050W: This interface must define at least one home method (EJB 2.0: 9.5.4).
+CHKJ2050.home.clh.ejb20=CHKJ2050W: This interface must define at least one home method (EJB 2.0: 9.6.4).
+CHKJ2050.home.blh.ejb20=CHKJ2050W: This interface must define at least one home method (EJB 2.0: 9.6.4).
+
+CHKJ2050.ejbHome.crh.ejb20=CHKJ2050W: This class must define at least one ejbHome method (EJB 2.0: 9.5.4).
+CHKJ2050.ejbHome.brh.ejb20=CHKJ2050W: This class must define at least one ejbHome method (EJB 2.0: 9.5.4).
+CHKJ2050.ejbHome.clh.ejb20=CHKJ2050W: This class must define at least one ejbHome method (EJB 2.0: 9.6.4).
+CHKJ2050.ejbHome.blh.ejb20=CHKJ2050W: This class must define at least one ejbHome method (EJB 2.0: 9.6.4).
+
+CHKJ2050.hashCode.kb.ejb20=CHKJ2050W: hashCode() must exist on this class (EJB 2.0: 12.2.12).
+CHKJ2050.hashCode.kc.ejb20=CHKJ2050W: hashCode() must exist on this class (EJB 2.0: 10.6.13).
+
+CHKJ2050.equals.kb.ejb20=CHKJ2050W: equals(Object) must exist on this class (EJB 2.0: 12.2.12).
+CHKJ2050.equals.kc.ejb20=CHKJ2050W: equals(Object) must exist on this class (EJB 2.0: 10.6.13).
+
+# ejbSelect - needed? pl174 says zero or more, p.193 says one or more
+CHKJ2050.ejbSelect.cb.ejb20=CHKJ2050W: An ejbSelect method must exist (EJB 2.0: 10.5.2, 10.6.7).
+
+CHKJ2050.findByPrimaryKey.crh.ejb20=CHKJ2050W: findByPrimaryKey must exist (EJB 2.0: 9.5.2, 10.6.10).
+CHKJ2050.findByPrimaryKey.clh.ejb20=CHKJ2050W: findByPrimaryKey must exist (EJB 2.0: 9.6.2, 10.6.12).
+CHKJ2050.findByPrimaryKey.blh.ejb20=CHKJ2050W: findByPrimaryKey must exist (EJB 2.0: 9.6.2, 12.2.11).
+CHKJ2050.findByPrimaryKey.brh.ejb20=CHKJ2050W: findByPrimaryKey must exist (EJB 2.0: 9.5.2, 12.2.9).
+
+# ejbFind
+CHKJ2050.ejbFind.bb.ejb20=CHKJ2050W: {0} must exist (EJB 2.0: 12.1.4.1).
+
+CHKJ2050.ejbPostCreate.cb.ejb20=CHKJ2050E: {0} must exist (EJB 2.0: 10.5.2).
+CHKJ2050.ejbPostCreate.bb.ejb20=CHKJ2050E: {0} must exist (EJB 2.0: 12.1.4.1, 12.2.4).
+
+
+##################################################
+# method checks
+##################################################
+# application exception
+CHKJ2404.i.ejb20=CHKJ2404W: Application exception {1} on {0} must extend java.lang.Exception (EJB 2.0: 18.1.1, 18.2.1).
+CHKJ2404.m.ejb20=CHKJ2404W: Application exception {0} must extend java.lang.Exception (EJB 2.0: 18.1.1, 18.2.1).
+CHKJ2416.i.ejb20=CHKJ2416W: Application exception {1} on {0} must not extend java.lang.RuntimeException (EJB 2.0: 18.1.1, 18.2.1).
+CHKJ2416.m.ejb20=CHKJ2416W: Application exception {0} must not extend java.lang.RuntimeException (EJB 2.0: 18.1.1, 18.2.1).
+
+# ejbRemove
+CHKJ2492.mb.i.ejb20=CHKJ2492W: {0} on {1} must be public (EJB 2.0: 15.7.5).
+CHKJ2492.mb.m.ejb20=CHKJ2492W: This method must be public (EJB 2.0: 15.7.5).
+CHKJ2492.cb.i.ejb20=CHKJ2492W: {0} on {1} must be public (EJB 2.0: 10.5.2).
+CHKJ2492.cb.m.ejb20=CHKJ2492W: This method must be public (EJB 2.0: 10.5.2).
+CHKJ2492.bb.i.ejb20=CHKJ2492W: {0} on {1} must be public (EJB 2.0: 12.1.4.1).
+CHKJ2492.bb.m.ejb20=CHKJ2492W: This method must be public (EJB 2.0: 12.1.4.1).
+CHKJ2492.sb.i.ejb20=CHKJ2492W: {0} on {1} must be public (EJB 2.0: 7.6).
+CHKJ2492.sb.m.ejb20=CHKJ2492W: This method must be public (EJB 2.0: 7.6).
+
+CHKJ2493.mb.i.ejb20=CHKJ2493W: {0} must not be final (EJB 2.0: 15.7.5).
+CHKJ2493.mb.m.ejb20=CHKJ2493W: This method must not be final (EJB 2.0: 15.7.5).
+CHKJ2493.cb.i.ejb20=CHKJ2493W: {0} must not be final (EJB 2.0: 10.5.2).
+CHKJ2493.cb.m.ejb20=CHKJ2493W: This method must not be final (EJB 2.0: 10.5.2).
+CHKJ2493.bb.i.ejb20=CHKJ2493W: {0} must not be final (EJB 2.0: 12.1.4.1).
+CHKJ2493.bb.m.ejb20=CHKJ2493W: This method must not be final (EJB 2.0: 12.1.4.1).
+CHKJ2493.sb.i.ejb20=CHKJ2493W: {0} must not be final (EJB 2.0: 7.6).
+CHKJ2493.sb.m.ejb20=CHKJ2493W: This method must not be final (EJB 2.0: 7.6).
+
+CHKJ2494.mb.i.ejb20=CHKJ2494W: {0} must not be static (EJB 2.0: 15.7.5).
+CHKJ2494.mb.m.ejb20=CHKJ2494W: This method must not be static (EJB 2.0: 15.7.5).
+CHKJ2494.cb.i.ejb20=CHKJ2494W: {0} must not be static (EJB 2.0: 10.5.2).
+CHKJ2494.cb.m.ejb20=CHKJ2494W: This method must not be static (EJB 2.0: 10.5.2).
+CHKJ2494.bb.i.ejb20=CHKJ2494W: {0} must not be static (EJB 2.0: 12.1.4.1).
+CHKJ2494.bb.m.ejb20=CHKJ2494W: This method must not be static (EJB 2.0: 12.1.4.1).
+CHKJ2494.sb.i.ejb20=CHKJ2494W: {0} must not be static (EJB 2.0: 7.6).
+CHKJ2494.sb.m.ejb20=CHKJ2494W: This method must not be static (EJB 2.0: 7.6).
+
+CHKJ2505.ejbRemove.mb.i.ejb20=CHKJ2505W: {0} must return void (EJB 2.0: 15.7.5).
+CHKJ2505.ejbRemove.mb.m.ejb20=CHKJ2505W: This method must return void (EJB 2.0: 15.7.5).
+CHKJ2505.ejbRemove.cb.i.ejb20=CHKJ2505W: {0} must return void (EJB 2.0: 10.5.2).
+CHKJ2505.ejbRemove.cb.m.ejb20=CHKJ2505W: This method must return void (EJB 2.0: 10.5.2).
+CHKJ2505.ejbRemove.bb.i.ejb20=CHKJ2505W: {0} must return void (EJB 2.0: 12.1.4.1).
+CHKJ2505.ejbRemove.bb.m.ejb20=CHKJ2505W: This method must return void (EJB 2.0: 12.1.4.1).
+CHKJ2505.ejbRemove.sb.i.ejb20=CHKJ2505W: {0} must return void (EJB 2.0: 7.6).
+CHKJ2505.ejbRemove.sb.m.ejb20=CHKJ2505W: This method must return void (EJB 2.0: 7.6).
+
+# ejbCreate
+CHKJ2421.mb.i.ejb20=CHKJ2421W: {0} must be public (EJB 2.0: 15.7.3).
+CHKJ2421.cb.i.ejb20=CHKJ2421W: {0} must be public (EJB 2.0: 10.6.4).
+CHKJ2421.bb.i.ejb20=CHKJ2421W: {0} must be public (EJB 2.0: 12.2.3).
+CHKJ2421.sb.i.ejb20=CHKJ2421W: {0} must be public (EJB 2.0: 7.10.3).
+CHKJ2421.mb.m.ejb20=CHKJ2421W: This method must be public (EJB 2.0: 15.7.3).
+CHKJ2421.cb.m.ejb20=CHKJ2421W: This method must be public (EJB 2.0: 10.6.4).
+CHKJ2421.bb.m.ejb20=CHKJ2421W: This method must be public (EJB 2.0: 12.2.3).
+CHKJ2421.sb.m.ejb20=CHKJ2421W: This method must be public (EJB 2.0: 7.10.3).
+
+CHKJ2422.sb.i.ejb20=CHKJ2422W: {0} must not be final (EJB 2.0: 7.10.3).
+CHKJ2422.cb.i.ejb20=CHKJ2422W: {0} must not be final (EJB 2.0: 10.6.4).
+CHKJ2422.bb.i.ejb20=CHKJ2422W: {0} must not be final (EJB 2.0: 12.2.3).
+CHKJ2422.mb.i.ejb20=CHKJ2422W: {0} must not be final (EJB 2.0: 15.7.3).
+CHKJ2422.sb.m.ejb20=CHKJ2422W: This method must not be final (EJB 2.0: 7.10.3).
+CHKJ2422.cb.m.ejb20=CHKJ2422W: This method must not be final (EJB 2.0: 10.6.4).
+CHKJ2422.bb.m.ejb20=CHKJ2422W: This method must not be final (EJB 2.0: 12.2.3).
+CHKJ2422.mb.m.ejb20=CHKJ2422W: This method must not be final (EJB 2.0: 15.7.3).
+
+CHKJ2423.sb.i.ejb20=CHKJ2423W: {0} must not be static (EJB 2.0: 7.10.3).
+CHKJ2423.cb.i.ejb20=CHKJ2423W: {0} must not be static (EJB 2.0: 10.6.4).
+CHKJ2423.bb.i.ejb20=CHKJ2423W: {0} must not be static (EJB 2.0: 12.2.3).
+CHKJ2423.mb.i.ejb20=CHKJ2423W: {0} must not be static (EJB 2.0: 15.7.3).
+CHKJ2423.sb.m.ejb20=CHKJ2423W: This method must not be static (EJB 2.0: 7.10.3).
+CHKJ2423.cb.m.ejb20=CHKJ2423W: This method must not be static (EJB 2.0: 10.6.4).
+CHKJ2423.bb.m.ejb20=CHKJ2423W: This method must not be static (EJB 2.0: 12.2.3).
+CHKJ2423.mb.m.ejb20=CHKJ2423W: This method must not be static (EJB 2.0: 15.7.3).
+
+CHKJ2424.cb.i.ejb20=CHKJ2424W: {0} must return {1} (EJB 2.0: 10.6.4).
+CHKJ2424.bb.i.ejb20=CHKJ2424W: {0} must return {1} (EJB 2.0: 12.2.3).
+CHKJ2424.sb.i.ejb20=CHKJ2424W: {0} must return void (EJB 2.0: 7.10.3).
+CHKJ2424.mb.i.ejb20=CHKJ2424W: {0} must return void (EJB 2.0: 15.7.3).
+CHKJ2424.cb.m.ejb20=CHKJ2424W: This method must return {0} (EJB 2.0: 10.6.4).
+CHKJ2424.bb.m.ejb20=CHKJ2424W: This method must return {0} (EJB 2.0: 12.2.3).
+CHKJ2424.sb.m.ejb20=CHKJ2424W: This method must return void (EJB 2.0: 7.10.3).
+CHKJ2424.mb.m.ejb20=CHKJ2424W: This method must return void (EJB 2.0: 15.7.3).
+
+
+
+# ejbCreate's method parameters and return type
+CHKJ2500.ejbCreate.sb.i.ejb20=CHKJ2500I: {1} in method {0} must be serializable at runtime (EJB 2.0: 7.10.3).
+CHKJ2500.ejbCreate.cb.i.ejb20=CHKJ2500I: {1} in method {0} must be serializable at runtime (EJB 2.0: 10.6.4).
+CHKJ2500.ejbCreate.bb.i.ejb20=CHKJ2500I: {1} in method {0} must be serializable at runtime (EJB 2.0: 12.2.3).
+CHKJ2500.ejbCreate.sb.m.ejb20=CHKJ2500I: {0} must be serializable at runtime (EJB 2.0: 7.10.3).
+CHKJ2500.ejbCreate.cb.m.ejb20=CHKJ2500I: {0} must be serializable at runtime (EJB 2.0: 10.6.4).
+CHKJ2500.ejbCreate.bb.m.ejb20=CHKJ2500I: {0} must be serializable at runtime (EJB 2.0: 12.2.3).
+
+CHKJ2497.cb.i.ejb20=CHKJ2497W: {0} must throw javax.ejb.CreateException (EJB 2.0: 10.6.4).
+CHKJ2497.cb.m.ejb20=CHKJ2497W: This method must throw javax.ejb.CreateException (EJB 2.0: 10.6.4).
+
+CHKJ2501.ejbCreate.mb.i.ejb20=CHKJ2501I: {0} must not throw application exceptions (EJB 2.0: 15.7.3, 18.1.1, 18.2.1, 18.3.2).
+CHKJ2501.ejbCreate.mb.m.ejb20=CHKJ2501I: This method must not throw application exceptions (EJB 2.0: 15.7.3, 18.1.1, 18.2.1, 18.3.2).
+CHKJ2501.ejbRemove.mb.i.ejb20=CHKJ2501I: {0} must not throw application exceptions (EJB 2.0: 15.7.5, 18.1.1, 18.2.1, 18.3.2).
+CHKJ2501.ejbRemove.mb.m.ejb20=CHKJ2501I: This method must not throw application exceptions (EJB 2.0: 15.7.5, 18.1.1, 18.2.1, 18.3.2).
+CHKJ2501.onMessage.mb.i.ejb20=CHKJ2501I: {0} must not throw application exceptions (EJB 2.0: 15.4.10, 15.7.4, 18.1.1, 18.2.1, 18.3.2).
+CHKJ2501.onMessage.mb.m.ejb20=CHKJ2501I: This method must not throw application exceptions (EJB 2.0: 15.4.10, 15.7.4, 18.1.1, 18.2.1, 18.3.2).
+
+
+CHKJ2503.ejbCreate.sb.i.ejb20=CHKJ2503W: {0} must not throw java.rmi.RemoteException (EJB 2.0: 7.10.3, 18.3.8, 18.6).
+CHKJ2503.ejbCreate.cb.i.ejb20=CHKJ2503W: {0} must not throw java.rmi.RemoteException (EJB 2.0: 10.6.4, 18.3.8, 18.6).
+CHKJ2503.ejbCreate.bb.i.ejb20=CHKJ2503W: {0} must not throw java.rmi.RemoteException (EJB 2.0: 12.2.3, 18.3.8, 18.6).
+CHKJ2503.ejbCreate.sb.m.ejb20=CHKJ2503W: This method must not throw java.rmi.RemoteException (EJB 2.0: 7.10.3, 18.3.8, 18.6).
+CHKJ2503.ejbCreate.cb.m.ejb20=CHKJ2503W: This method must not throw java.rmi.RemoteException (EJB 2.0: 10.6.4, 18.3.8, 18.6).
+CHKJ2503.ejbCreate.bb.m.ejb20=CHKJ2503W: This method must not throw java.rmi.RemoteException (EJB 2.0: 12.2.3, 18.3.8, 18.6).
+
+# ejbPostCreate
+CHKJ2426.cb.i.ejb20=CHKJ2426W: {0} must be public (EJB 2.0: 10.6.5).
+CHKJ2426.bb.i.ejb20=CHKJ2426W: {0} must be public (EJB 2.0: 12.2.4).
+CHKJ2426.cb.m.ejb20=CHKJ2426W: This method must be public (EJB 2.0: 10.6.5).
+CHKJ2426.bb.m.ejb20=CHKJ2426W: This method must be public (EJB 2.0: 12.2.4).
+
+CHKJ2427.cb.i.ejb20=CHKJ2427W: {0} must not be final (EJB 2.0: 10.6.5).
+CHKJ2427.bb.i.ejb20=CHKJ2427W: {0} must not be final (EJB 2.0: 12.2.4).
+CHKJ2427.cb.m.ejb20=CHKJ2427W: This method must not be final (EJB 2.0: 10.6.5).
+CHKJ2427.bb.m.ejb20=CHKJ2427W: This method must not be final (EJB 2.0: 12.2.4).
+
+CHKJ2428.cb.i.ejb20=CHKJ2428W: {0} must not be static (EJB 2.0: 10.6.5).
+CHKJ2428.bb.i.ejb20=CHKJ2428W: {0} must not be static (EJB 2.0: 12.2.4).
+CHKJ2428.cb.m.ejb20=CHKJ2428W: This method must not be static (EJB 2.0: 10.6.5).
+CHKJ2428.bb.m.ejb20=CHKJ2428W: This method must not be static (EJB 2.0: 12.2.4).
+
+CHKJ2505.ejbPostCreate.cb.i.ejb20=CHKJ2505W: {0} must return void (EJB 2.0: 10.6.5).
+CHKJ2505.ejbPostCreate.bb.i.ejb20=CHKJ2505W: {0} must return void (EJB 2.0: 12.2.4).
+CHKJ2505.ejbPostCreate.cb.m.ejb20=CHKJ2505W: This method must return void (EJB 2.0: 10.6.5).
+CHKJ2505.ejbPostCreate.bb.m.ejb20=CHKJ2505W: This method must return void (EJB 2.0: 12.2.4).
+
+CHKJ2503.ejbPostCreate.cb.i.ejb20=CHKJ2503W: {0} must not throw java.rmi.RemoteException (EJB 2.0: 10.6.5, 18.3.8, 18.6).
+CHKJ2503.ejbPostCreate.bb.i.ejb20=CHKJ2503W: {0} must not throw java.rmi.RemoteException (EJB 2.0: 12.2.4, 18.3.8, 18.6).
+CHKJ2503.ejbPostCreate.cb.m.ejb20=CHKJ2503W: This method must not throw java.rmi.RemoteException (EJB 2.0: 10.6.5, 18.3.8, 18.6).
+CHKJ2503.ejbPostCreate.bb.m.ejb20=CHKJ2503W: This method must not throw java.rmi.RemoteException (EJB 2.0: 12.2.4, 18.3.8, 18.6).
+
+
+# ejbHome
+CHKJ2430.cb.i.ejb20=CHKJ2430I: {1} must exist for {0} to be called (EJB 2.0: 10.5.2, 10.6.6).
+CHKJ2430.bb.i.ejb20=CHKJ2430I: {1} must exist for {0} to be called (EJB 2.0: 12.1.4.1).
+CHKJ2430.cb.m.ejb20=CHKJ2430I: {0} must exist for this method to be called (EJB 2.0: 10.5.2, 10.6.6).
+CHKJ2430.bb.m.ejb20=CHKJ2430I: {0} must exist for this method to be called (EJB 2.0: 12.1.4.1).
+
+CHKJ2431.cb.i.ejb20=CHKJ2431W: {0} must be public (EJB 2.0: 10.6.6).
+CHKJ2431.bb.i.ejb20=CHKJ2431W: {0} must be public.  (EJB 2.0: 12.2.6).
+CHKJ2431.cb.m.ejb20=CHKJ2431W: This method must be public (EJB 2.0: 10.6.6).
+CHKJ2431.bb.m.ejb20=CHKJ2431W: This method must be public.  (EJB 2.0: 12.2.6).
+
+CHKJ2439.cb.i.ejb20=CHKJ2439W: {0} must not be static (EJB 2.0: 10.6.6).
+CHKJ2439.bb.i.ejb20=CHKJ2439W: {0} must not be static (EJB 2.0: 12.2.6).
+CHKJ2439.cb.m.ejb20=CHKJ2439W: This method must not be static (EJB 2.0: 10.6.6).
+CHKJ2439.bb.m.ejb20=CHKJ2439W: This method must not be static (EJB 2.0: 12.2.6).
+
+CHKJ2500.ejbHome.cb.i.ejb20=CHKJ2500I: {1} in method {0} must be serializable at runtime (EJB 2.0: 10.6.6).
+CHKJ2500.ejbHome.bb.i.ejb20=CHKJ2500I: {1} in method {0} must be serializable at runtime (EJB 2.0: 12.2.6).
+CHKJ2500.ejbHome.cb.m.ejb20=CHKJ2500I: {0} must be serializable at runtime (EJB 2.0: 10.6.6).
+CHKJ2500.ejbHome.bb.m.ejb20=CHKJ2500I: {0} must be serializable at runtime (EJB 2.0: 12.2.6).
+
+CHKJ2503.ejbHome.cb.i.ejb20=CHKJ2503W: {0} must not throw java.rmi.RemoteException (EJB 2.0: 10.6.6, 18.3.8, 18.6).
+CHKJ2503.ejbHome.bb.i.ejb20=CHKJ2503W: {0} must not throw java.rmi.RemoteException (EJB 2.0: 12.2.6, 18.3.8, 18.6).
+CHKJ2503.ejbHome.cb.m.ejb20=CHKJ2503W: This method must not throw java.rmi.RemoteException (EJB 2.0: 10.6.6, 18.3.8, 18.6).
+CHKJ2503.ejbHome.bb.m.ejb20=CHKJ2503W: This method must not throw java.rmi.RemoteException (EJB 2.0: 12.2.6, 18.3.8, 18.6).
+
+# ejbFind
+CHKJ2457.bb.i.ejb20=CHKJ2457W: {0} must be public (EJB 2.0: 12.2.5).
+CHKJ2457.bb.m.ejb20=CHKJ2457W: This method must be public (EJB 2.0: 12.2.5).
+
+CHKJ2458.bb.i.ejb20=CHKJ2458W: {0} must not be final (EJB 2.0: 12.2.5).
+CHKJ2458.bb.m.ejb20=CHKJ2458W: This method must not be final (EJB 2.0: 12.2.5).
+
+CHKJ2459.bb.i.ejb20=CHKJ2459W: {0} must not be static (EJB 2.0: 12.2.5).
+CHKJ2459.bb.m.ejb20=CHKJ2459W: This method must not be static (EJB 2.0: 12.2.5).
+
+CHKJ2500.ejbFind.bb.i.ejb20=CHKJ2500I: {0} on method {1} must be serializable at runtime (EJB 2.0: 12.2.5).
+CHKJ2500.ejbFind.bb.m.ejb20=CHKJ2500I: {0} must be serializable at runtime (EJB 2.0: 12.2.5).
+
+CHKJ2407.bb.i.ejb20=CHKJ2407W: {0} must return {1} or a collection thereof (EJB 2.0: 12.2.5).
+CHKJ2407.bb.m.ejb20=CHKJ2407W: This method must return {0} or a collection thereof (EJB 2.0: 12.2.5).
+
+CHKJ2503.ejbFind.bb.i.ejb20=CHKJ2503W: {0} must not throw java.rmi.RemoteException (EJB 2.0: 12.2.5, 18.3.8, 18.6).
+CHKJ2503.ejbFind.bb.m.ejb20=CHKJ2503W: This method must not throw java.rmi.RemoteException (EJB 2.0: 12.2.5, 18.3.8, 18.6).
+
+CHKJ2498.bb.i.ejb20=CHKJ2498W: {0} must not throw ObjectNotFoundException (EJB 2.0: 12.1.8.4).
+CHKJ2498.bb.m.ejb20=CHKJ2498W: This method must not throw ObjectNotFoundException (EJB 2.0: 12.1.8.4).
+
+
+#
+# methods which must not exist
+#
+CHKJ2502.ejbFind.cb.i.ejb20=CHKJ2502I: {0} must not exist. The container provides this method implementation (EJB 2.0: 10.5.2, 10.6.2).
+CHKJ2502.ejbFind.cb.m.ejb20=CHKJ2502I: This method must not exist. The container provides this method implementation (EJB 2.0: 10.5.2, 10.6.2).
+
+CHKJ2502.ejbSelect.bb.i.ejb20=CHKJ2502I: {0} must not exist. Only CMP beans may have ejbSelect methods (EJB 2.0: 12.1.5).
+CHKJ2502.ejbSelect.bb.m.ejb20=CHKJ2502I: This method must not exist. Only CMP beans may have ejbSelect methods  (EJB 2.0: 12.1.5).
+CHKJ2502.ejbSelect.sfb.i.ejb20=CHKJ2502I: {0} must not exist. Only CMP beans may have ejbSelect methods (EJB 2.0: 7.6.1).
+CHKJ2502.ejbSelect.sfb.m.ejb20=CHKJ2502I: This method must not exist. Only CMP beans may have ejbSelect methods  (EJB 2.0: 7.6.1).
+CHKJ2502.ejbSelect.ssb.i.ejb20=CHKJ2502I: {0} must not exist. Only CMP beans may have ejbSelect methods (EJB 2.0: 7.8.2).
+CHKJ2502.ejbSelect.ssb.m.ejb20=CHKJ2502I: This method must not exist. Only CMP beans may have ejbSelect methods  (EJB 2.0: 7.8.2).
+CHKJ2502.ejbSelect.crh.i.ejb20=CHKJ2502I: {0} must not exist (EJB 2.0: 10.5.2, 10.5.7).
+CHKJ2502.ejbSelect.crh.m.ejb20=CHKJ2502I: This method must not exist (EJB 2.0: 10.5.2, 10.5.7).
+CHKJ2502.ejbSelect.clh.i.ejb20=CHKJ2502I: {0} must not exist (EJB 2.0: 10.5.2, 10.5.7).
+CHKJ2502.ejbSelect.clh.m.ejb20=CHKJ2502I: This method must not exist (EJB 2.0: 10.5.2, 10.5.7).
+CHKJ2502.ejbSelect.crc.i.ejb20=CHKJ2502I: {0} must not exist (EJB 2.0: 10.5.2, 10.5.7).
+CHKJ2502.ejbSelect.crc.m.ejb20=CHKJ2502I: This method must not exist (EJB 2.0: 10.5.2, 10.5.7).
+CHKJ2502.ejbSelect.clc.i.ejb20=CHKJ2502I: {0} must not exist (EJB 2.0: 10.5.2, 10.5.7).
+CHKJ2502.ejbSelect.clc.m.ejb20=CHKJ2502I: This method must not exist (EJB 2.0: 10.5.2, 10.5.7).
+
+# finalize
+CHKJ2502.finalize.cb.i.ejb20=CHKJ2502I: finalize() must not exist (EJB 2.0: 10.6.2).
+CHKJ2502.finalize.cb.m.ejb20=CHKJ2502I: This method must not exist (EJB 2.0: 10.6.2).
+CHKJ2502.finalize.mb.i.ejb20=CHKJ2502I: finalize() must not exist (EJB 2.0: 15.7.2).
+CHKJ2502.finalize.mb.m.ejb20=CHKJ2502I: This method must not exist (EJB 2.0: 15.7.2).
+CHKJ2502.finalize.bb.i.ejb20=CHKJ2502I: finalize() must not exist (EJB 2.0: 12.2.2).
+CHKJ2502.finalize.bb.m.ejb20=CHKJ2502I: This method must not exist (EJB 2.0: 12.2.2).
+CHKJ2502.finalize.sb.i.ejb20=CHKJ2502I: finalize() must not exist (EJB 2.0: 7.10.2).
+CHKJ2502.finalize.sb.m.ejb20=CHKJ2502I: This method must not exist (EJB 2.0: 7.10.2).
+
+CHKJ2502.slh.i.ejb20=CHKJ2502I: {0} must not exist (EJB 2.0: 7.10.8).
+CHKJ2502.slh.m.ejb20=CHKJ2502I: This method must not exist (EJB 2.0: 7.10.8).
+CHKJ2502.srh.i.ejb20=CHKJ2502I: {0} must not exist (EJB 2.0: 7.10.6).
+CHKJ2502.srh.m.ejb20=CHKJ2502I: This method must not exist (EJB 2.0: 7.10.6).
+
+
+# business
+CHKJ2411.sb.i.ejb20=CHKJ2411W: The name of method {0} must not start with "ejb" (EJB 2.0: 7.10.4).
+CHKJ2411.cb.i.ejb20=CHKJ2411W: The name of method {0} must not start with "ejb" (EJB 2.0: 10.6.8).
+CHKJ2411.bb.i.ejb20=CHKJ2411W: The name of method {0} must not start with "ejb" (EJB 2.0: 12.2.7).
+CHKJ2411.sb.m.ejb20=CHKJ2411W: This method name must not start with "ejb" (EJB 2.0: 7.10.4).
+CHKJ2411.cb.m.ejb20=CHKJ2411W: This method name must not start with "ejb" (EJB 2.0: 10.6.8).
+CHKJ2411.bb.m.ejb20=CHKJ2411W: This method name must not start with "ejb" (EJB 2.0: 12.2.7).
+
+CHKJ2441.sb.i.ejb20=CHKJ2441W: {0} must be public (EJB 2.0: 7.10.4).
+CHKJ2441.cb.i.ejb20=CHKJ2441W: {0} must be public (EJB 2.0: 10.6.8).
+CHKJ2441.bb.i.ejb20=CHKJ2441W: {0} must be public (EJB 2.0: 12.2.7).
+CHKJ2441.sb.m.ejb20=CHKJ2441W: This method must be public (EJB 2.0: 7.10.4).
+CHKJ2441.cb.m.ejb20=CHKJ2441W: This method must be public (EJB 2.0: 10.6.8).
+CHKJ2441.bb.m.ejb20=CHKJ2441W: This method must be public (EJB 2.0: 12.2.7).
+
+CHKJ2442.sb.i.ejb20=CHKJ2442W: {0} must not be final (EJB 2.0: 7.10.4).
+CHKJ2442.cb.i.ejb20=CHKJ2442W: {0} must not be final (EJB 2.0: 10.6.8).
+CHKJ2442.bb.i.ejb20=CHKJ2442W: {0} must not be final (EJB 2.0: 12.2.7).
+CHKJ2442.sb.m.ejb20=CHKJ2442W: This method must not be final (EJB 2.0: 7.10.4).
+CHKJ2442.cb.m.ejb20=CHKJ2442W: This method must not be final (EJB 2.0: 10.6.8).
+CHKJ2442.bb.m.ejb20=CHKJ2442W: This method must not be final (EJB 2.0: 12.2.7).
+
+CHKJ2443.sb.i.ejb20=CHKJ2443W: {0} must not be static (EJB 2.0: 7.10.4).
+CHKJ2443.cb.i.ejb20=CHKJ2443W: {0} must not be static (EJB 2.0: 10.6.8).
+CHKJ2443.bb.i.ejb20=CHKJ2443W: {0} must not be static (EJB 2.0: 12.2.7).
+CHKJ2443.sb.m.ejb20=CHKJ2443W: This method must not be static (EJB 2.0: 7.10.4).
+CHKJ2443.cb.m.ejb20=CHKJ2443W: This method must not be static (EJB 2.0: 10.6.8).
+CHKJ2443.bb.m.ejb20=CHKJ2443W: This method must not be static (EJB 2.0: 12.2.7).
+
+CHKJ2500.bus.sb.i.ejb20=CHKJ2500I: {1} in method {0} must be serializable at runtime (EJB 2.0: 7.10.4).
+CHKJ2500.bus.cb.i.ejb20=CHKJ2500I: {1} in method {0} must be serializable at runtime (EJB 2.0: 10.6.8).
+CHKJ2500.bus.bb.i.ejb20=CHKJ2500I: {1} in method {0} must be serializable at runtime (EJB 2.0: 12.2.7).
+CHKJ2500.bus.sb.m.ejb20=CHKJ2500I: {0} must be serializable at runtime (EJB 2.0: 7.10.4).
+CHKJ2500.bus.cb.m.ejb20=CHKJ2500I: {0} must be serializable at runtime (EJB 2.0: 10.6.8).
+CHKJ2500.bus.bb.m.ejb20=CHKJ2500I: {0} must be serializable at runtime (EJB 2.0: 12.2.7).
+
+CHKJ2503.bus.sb.i.ejb20=CHKJ2503W: {0} must not throw java.rmi.RemoteException (EJB 2.0: 7.10.4, 18.3.8, 18.6).
+CHKJ2503.bus.cb.i.ejb20=CHKJ2503W: {0} must not throw java.rmi.RemoteException (EJB 2.0: 10.6.8, 18.3.8, 18.6).
+CHKJ2503.bus.bb.i.ejb20=CHKJ2503W: {0} must not throw java.rmi.RemoteException (EJB 2.0: 12.2.7, 18.3.8, 18.6).
+CHKJ2503.bus.sb.m.ejb20=CHKJ2503W: This method must not throw java.rmi.RemoteException (EJB 2.0: 7.10.4, 18.3.8, 18.6).
+CHKJ2503.bus.cb.m.ejb20=CHKJ2503W: This method must not throw java.rmi.RemoteException (EJB 2.0: 10.6.8, 18.3.8, 18.6).
+CHKJ2503.bus.bb.m.ejb20=CHKJ2503W: This method must not throw java.rmi.RemoteException (EJB 2.0: 12.2.7, 18.3.8, 18.6).
+
+# onMessage
+CHKJ2503.onMessage.mb.i.ejb20=CHKJ2503W: {0} must not throw java.rmi.RemoteException (EJB 2.0: 15.4.10, 18.3.8, 18.6).
+CHKJ2503.onMessage.mb.m.ejb20=CHKJ2503W: This method must not throw java.rmi.RemoteException (EJB 2.0: 15.4.10, 18.3.8, 18.6).
+
+CHKJ2445.mb.i.ejb20=CHKJ2445W: {0} must be public (EJB 2.0: 15.7.4).
+CHKJ2445.mb.m.ejb20=CHKJ2445W: This method must be public (EJB 2.0: 15.7.4).
+
+CHKJ2446.mb.i.ejb20=CHKJ2446W: {0} must not be final (EJB 2.0: 15.7.4).
+CHKJ2446.mb.m.ejb20=CHKJ2446W: This method must not be final (EJB 2.0: 15.7.4).
+
+CHKJ2447.mb.i.ejb20=CHKJ2447W: {0} must not be static (EJB 2.0: 15.7.4).
+CHKJ2447.mb.m.ejb20=CHKJ2447W: This method must not be static (EJB 2.0: 15.7.4).
+
+CHKJ2505.onMessage.mb.i.ejb20=CHKJ2505W: {0} must return void (EJB 2.0: 15.7.4).
+CHKJ2505.onMessage.mb.m.ejb20=CHKJ2505W: This method must return void (EJB 2.0: 15.7.4).
+
+# accessor method
+CHKJ2449.cb.i.ejb20=CHKJ2449W: {0} must be public (EJB 2.0: 10.3.1).
+CHKJ2449.cb.m.ejb20=CHKJ2449W: This method must be public (EJB 2.0: 10.3.1).
+
+CHKJ2450.cb.i.ejb20=CHKJ2450W: {0} must be abstract (EJB 2.0: 10.3.1, 10.6.2).
+CHKJ2450.cb.m.ejb20=CHKJ2450W: This method must be abstract (EJB 2.0: 10.3.1, 10.6.2).
+
+# get & set methods of cmr fields
+CHKJ2473.crc.i.ejb20=CHKJ2473W: {0} must not be exposed (EJB 2.0: 10.3.1, 10.3.10.1).
+CHKJ2473.crc.m.ejb20=CHKJ2473W: This method must not be exposed (EJB 2.0: 10.3.1, 10.3.10.1).
+CHKJ2473.crh.i.ejb20=CHKJ2473W: {0} must not be exposed (EJB 2.0: 10.3.1, 10.3.10.1).
+CHKJ2473.crh.m.ejb20=CHKJ2473W: This method must not be exposed (EJB 2.0: 10.3.1, 10.3.10.1).
+
+# home
+CHKJ2461.home.brh.ejb20=CHKJ2461W: This interface must follow RMI-IIOP rules for remote interfaces (EJB 2.0: 12.2.9).
+CHKJ2461.home.crh.ejb20=CHKJ2461W: This interface must follow RMI-IIOP rules for remote interfaces (EJB 2.0: 10.6.10).
+CHKJ2461.home.srh.ejb20=CHKJ2461W: This interface must follow RMI-IIOP rules for remote interfaces (EJB 2.0: 7.10.6).
+
+CHKJ2462.clh.i.ejb20=CHKJ2462I: The name of method {0} must not start with "create" (EJB 2.0: 9.5.4, 10.6.10).
+CHKJ2462.brh.i.ejb20=CHKJ2462I: The name of method {0} must not start with "create" (EJB 2.0: 9.5.4, 12.2.9).
+CHKJ2462.crh.i.ejb20=CHKJ2462I: The name of method {0} must not start with "create" (EJB 2.0: 9.6.4, 10.6.12).
+CHKJ2462.blh.i.ejb20=CHKJ2462I: The name of method {0} must not start with "create" (EJB 2.0: 9.5.4, 12.2.11).
+CHKJ2462.clh.m.ejb20=CHKJ2462I: This method name must not start with "create" (EJB 2.0: 9.5.4, 10.6.10).
+CHKJ2462.brh.m.ejb20=CHKJ2462I: This method name must not start with "create" (EJB 2.0: 9.5.4, 12.2.9).
+CHKJ2462.crh.m.ejb20=CHKJ2462I: This method name must not start with "create" (EJB 2.0: 9.6.4, 10.6.12).
+CHKJ2462.blh.m.ejb20=CHKJ2462I: This method name must not start with "create" (EJB 2.0: 9.5.4, 12.2.11).
+
+CHKJ2463.clh.i.ejb20=CHKJ2463I: The name of method {0} must not start with "find" (EJB 2.0: 9.5.4, 10.6.10).
+CHKJ2463.brh.i.ejb20=CHKJ2463I: The name of method {0} must not start with "find" (EJB 2.0: 9.5.4, 12.2.9).
+CHKJ2463.crh.i.ejb20=CHKJ2463I: The name of method {0} must not start with "find" (EJB 2.0: 9.6.4, 10.6.12).
+CHKJ2463.blh.i.ejb20=CHKJ2463I: The name of method {0} must not start with "find" (EJB 2.0: 9.5.4, 12.2.11).
+CHKJ2463.clh.m.ejb20=CHKJ2463I: This method name must not start with "find" (EJB 2.0: 9.5.4, 10.6.10).
+CHKJ2463.brh.m.ejb20=CHKJ2463I: This method name must not start with "find" (EJB 2.0: 9.5.4, 12.2.9).
+CHKJ2463.crh.m.ejb20=CHKJ2463I: This method name must not start with "find" (EJB 2.0: 9.6.4, 10.6.12).
+CHKJ2463.blh.m.ejb20=CHKJ2463I: This method name must not start with "find" (EJB 2.0: 9.5.4, 12.2.11).
+
+CHKJ2464.clh.i.ejb20=CHKJ2464I: The name of method {0} must not start with "remove" (EJB 2.0: 9.5.4, 10.6.10).
+CHKJ2464.brh.i.ejb20=CHKJ2464I: The name of method {0} must not start with "remove" (EJB 2.0: 9.5.4, 12.2.9).
+CHKJ2464.crh.i.ejb20=CHKJ2464I: The name of method {0} must not start with "remove" (EJB 2.0: 9.6.4, 10.6.12).
+CHKJ2464.blh.i.ejb20=CHKJ2464I: The name of method {0} must not start with "remove" (EJB 2.0: 9.5.4, 12.2.11).
+CHKJ2464.clh.m.ejb20=CHKJ2464I: This method name must not start with "remove" (EJB 2.0: 9.5.4, 10.6.10).
+CHKJ2464.brh.m.ejb20=CHKJ2464I: This method name must not start with "remove" (EJB 2.0: 9.5.4, 12.2.9).
+CHKJ2464.crh.m.ejb20=CHKJ2464I: This method name must not start with "remove" (EJB 2.0: 9.6.4, 10.6.12).
+CHKJ2464.blh.m.ejb20=CHKJ2464I: This method name must not start with "remove" (EJB 2.0: 9.5.4, 12.2.11).
+
+CHKJ2503.home.brh.i.ejb20=CHKJ2503E: {0} must throw java.rmi.RemoteException (EJB 2.0: 9.5.4, 12.2.9).
+CHKJ2503.home.crh.i.ejb20=CHKJ2503E: {0} must throw java.rmi.RemoteException (EJB 2.0: 9.5.4, 10.6.10).
+CHKJ2503.home.srh.i.ejb20=CHKJ2503E: {0} must throw java.rmi.RemoteException (EJB 2.0: 7.10.6).
+CHKJ2503.home.blh.i.ejb20=CHKJ2503W: {0} must not throw java.rmi.RemoteException (EJB 2.0: 9.6.4, 12.2.11, 18.3.8, 18.6).
+CHKJ2503.home.clh.i.ejb20=CHKJ2503W: {0} must not throw java.rmi.RemoteException (EJB 2.0: 9.6.4, 10.6.12, 18.3.8, 18.6).
+CHKJ2503.home.slh.i.ejb20=CHKJ2503W: {0} must not throw java.rmi.RemoteException (EJB 2.0: 7.10.8, 18.3.8, 18.6).
+CHKJ2503.home.brh.m.ejb20=CHKJ2503E: This method must throw java.rmi.RemoteException (EJB 2.0: 9.5.4, 12.2.9).
+CHKJ2503.home.crh.m.ejb20=CHKJ2503E: This method must throw java.rmi.RemoteException (EJB 2.0: 9.5.4, 10.6.10).
+CHKJ2503.home.srh.m.ejb20=CHKJ2503E: This method must throw java.rmi.RemoteException (EJB 2.0: 7.10.6).
+CHKJ2503.home.blh.m.ejb20=CHKJ2503W: This method must not throw java.rmi.RemoteException (EJB 2.0: 9.6.4, 12.2.11, 18.3.8, 18.6).
+CHKJ2503.home.clh.m.ejb20=CHKJ2503W: This method must not throw java.rmi.RemoteException (EJB 2.0: 9.6.4, 10.6.12, 18.3.8, 18.6).
+CHKJ2503.home.slh.m.ejb20=CHKJ2503W: This method must not throw java.rmi.RemoteException (EJB 2.0: 7.10.8, 18.3.8, 18.6).
+
+
+# create
+CHKJ2503.create.brh.i.ejb20=CHKJ2503E: {0} must throw java.rmi.RemoteException (EJB 2.0: 9.5.1, 12.2.9).
+CHKJ2503.create.crh.i.ejb20=CHKJ2503E: {0} must throw java.rmi.RemoteException (EJB 2.0: 9.5.1, 10.6.10).
+CHKJ2503.create.srh.i.ejb20=CHKJ2503E: {0} must throw java.rmi.RemoteException (EJB 2.0: 7.10.6).
+CHKJ2503.create.blh.i.ejb20=CHKJ2503W: {0} must not throw java.rmi.RemoteException (EJB 2.0: 9.6.1, 12.2.11, 18.3.8, 18.6).
+CHKJ2503.create.clh.i.ejb20=CHKJ2503W: {0} must not throw java.rmi.RemoteException (EJB 2.0: 9.6.1, 10.6.12, 18.3.8, 18.6).
+CHKJ2503.create.slh.i.ejb20=CHKJ2503W: {0} must not throw java.rmi.RemoteException (EJB 2.0: 7.10.8, 18.3.8, 18.6).
+CHKJ2503.create.brh.m.ejb20=CHKJ2503E: This method must throw java.rmi.RemoteException (EJB 2.0: 9.5.1, 12.2.9).
+CHKJ2503.create.crh.m.ejb20=CHKJ2503E: This method must throw java.rmi.RemoteException (EJB 2.0: 9.5.1, 10.6.10).
+CHKJ2503.create.srh.m.ejb20=CHKJ2503E: This method must throw java.rmi.RemoteException (EJB 2.0: 7.10.6).
+CHKJ2503.create.blh.m.ejb20=CHKJ2503W: This method must not throw java.rmi.RemoteException (EJB 2.0: 9.6.1, 12.2.11, 18.3.8, 18.6).
+CHKJ2503.create.clh.m.ejb20=CHKJ2503W: This method must not throw java.rmi.RemoteException (EJB 2.0: 9.6.1, 10.6.12, 18.3.8, 18.6).
+CHKJ2503.create.slh.m.ejb20=CHKJ2503W: This method must not throw java.rmi.RemoteException (EJB 2.0: 7.10.8, 18.3.8, 18.6).
+
+CHKJ2467.srh.i.ejb20=CHKJ2467W: {0} must throw javax.ejb.CreateException (EJB 2.0: 7.10.6).
+CHKJ2467.slh.i.ejb20=CHKJ2467W: {0} must throw javax.ejb.CreateException (EJB 2.0: 7.10.8).
+CHKJ2467.crh.i.ejb20=CHKJ2467W: {0} must throw javax.ejb.CreateException (EJB 2.0: 9.5.1, 10.6.10).
+CHKJ2467.clh.i.ejb20=CHKJ2467W: {0} must throw javax.ejb.CreateException (EJB 2.0: 9.6.1, 10.6.12).
+CHKJ2467.brh.i.ejb20=CHKJ2467W: {0} must throw javax.ejb.CreateException (EJB 2.0: 9.5.1, 12.2.9).
+CHKJ2467.blh.i.ejb20=CHKJ2467W: {0} must throw javax.ejb.CreateException (EJB 2.0: 9.6.1, 12.2.11).
+CHKJ2467.srh.m.ejb20=CHKJ2467W: This method must throw javax.ejb.CreateException (EJB 2.0: 7.10.6).
+CHKJ2467.slh.m.ejb20=CHKJ2467W: This method must throw javax.ejb.CreateException (EJB 2.0: 7.10.8).
+CHKJ2467.crh.m.ejb20=CHKJ2467W: This method must throw javax.ejb.CreateException (EJB 2.0: 9.5.1, 10.6.10).
+CHKJ2467.clh.m.ejb20=CHKJ2467W: This method must throw javax.ejb.CreateException (EJB 2.0: 9.6.1, 10.6.12).
+CHKJ2467.brh.m.ejb20=CHKJ2467W: This method must throw javax.ejb.CreateException (EJB 2.0: 9.5.1, 12.2.9).
+CHKJ2467.blh.m.ejb20=CHKJ2467W: This method must throw javax.ejb.CreateException (EJB 2.0: 9.6.1, 12.2.11).
+
+CHKJ2402.sfrh.i.ejb20=CHKJ2402E: {0} must return {1} (EJB 2.0: 6.3.1, 7.10.6).
+CHKJ2402.sflh.i.ejb20=CHKJ2402E: {0} must return {1} (EJB 2.0: 6.4.1, 7.10.8).
+CHKJ2402.ssrh.i.ejb20=CHKJ2402E: {0} must return {1} (EJB 2.0: 6.3.1, 7.8, 7.10.6).
+CHKJ2402.sslh.i.ejb20=CHKJ2402E: {0} must return {1} (EJB 2.0: 6.4.1, 7.8, 7.10.8).
+CHKJ2402.crh.i.ejb20=CHKJ2402E: {0} must return {1} (EJB 2.0: 9.5.1, 10.6.10).
+CHKJ2402.clh.i.ejb20=CHKJ2402E: {0} must return {1} (EJB 2.0: 9.6.1, 10.6.12).
+CHKJ2402.brh.i.ejb20=CHKJ2402E: {0} must return {1} (EJB 2.0: 9.5.1, 12.2.9).
+CHKJ2402.blh.i.ejb20=CHKJ2402E: {0} must return {1} (EJB 2.0: 9.6.1, 12.2.11).
+CHKJ2402.sfrh.m.ejb20=CHKJ2402E: This method must return {0} (EJB 2.0: 6.3.1, 7.10.6).
+CHKJ2402.sflh.m.ejb20=CHKJ2402E: This method must return {0} (EJB 2.0: 6.4.1, 7.10.8).
+CHKJ2402.ssrh.m.ejb20=CHKJ2402E: This method must return {0} (EJB 2.0: 6.3.1, 7.8, 7.10.6).
+CHKJ2402.sslh.m.ejb20=CHKJ2402E: This method must return {0} (EJB 2.0: 6.4.1, 7.8, 7.10.8).
+CHKJ2402.crh.m.ejb20=CHKJ2402E: This method must return {0} (EJB 2.0: 9.5.1, 10.6.10).
+CHKJ2402.clh.m.ejb20=CHKJ2402E: This method must return {0} (EJB 2.0: 9.6.1, 10.6.12).
+CHKJ2402.brh.m.ejb20=CHKJ2402E: This method must return {0} (EJB 2.0: 9.5.1, 12.2.9).
+CHKJ2402.blh.m.ejb20=CHKJ2402E: This method must return {0} (EJB 2.0: 9.6.1, 12.2.11).
+
+CHKJ2476.srh.i.ejb20=CHKJ2476E: {0} must be the create() method (EJB 2.0: 7.8, 7.10.6).
+CHKJ2476.slh.i.ejb20=CHKJ2476E: {0} must be the create() method (EJB 2.0: 7.8, 7.10.8).
+CHKJ2476.srh.m.ejb20=CHKJ2476E: This method must be the create() method (EJB 2.0: 7.8, 7.10.6).
+CHKJ2476.slh.m.ejb20=CHKJ2476E: This method must be the create() method (EJB 2.0: 7.8, 7.10.8).
+CHKJ2476.ssb.i.ejb20=CHKJ2476E: {0} must be the ejbCreate() method (EJB 2.0: 7.8).
+CHKJ2476.ssb.m.ejb20=CHKJ2476E: This method must be the ejbCreate() method (EJB 2.0: 7.8).
+
+
+# remote create
+CHKJ2504.create.srh.i.ejb20=CHKJ2504W: The {1} matching method for {0} must exist on {2} (EJB 2.0: 7.10.6).
+CHKJ2504.create.slh.i.ejb20=CHKJ2504W: The {1} matching method for {0} must exist on {2} (EJB 2.0: 7.10.8).
+CHKJ2504.create.crh.i.ejb20=CHKJ2504W: The {1} matching method for {0} must exist on {2} (EJB 2.0: 10.6.10).
+CHKJ2504.create.clh.i.ejb20=CHKJ2504W: The {1} matching method for {0} must exist on {2} (EJB 2.0: 10.6.12).
+CHKJ2504.create.brh.i.ejb20=CHKJ2504W: The {1} matching method for {0} must exist on {2} (EJB 2.0: 12.2.9).
+CHKJ2504.create.blh.i.ejb20=CHKJ2504W: The {1} matching method for {0} must exist on {2} (EJB 2.0: 12.2.11).
+CHKJ2504.create.srh.m.ejb20=CHKJ2504W: The {0} matching method must exist on {1} (EJB 2.0: 7.10.6).
+CHKJ2504.create.slh.m.ejb20=CHKJ2504W: The {0} matching method must exist on {1} (EJB 2.0: 7.10.8).
+CHKJ2504.create.crh.m.ejb20=CHKJ2504W: The {0} matching method must exist on {1} (EJB 2.0: 10.6.10).
+CHKJ2504.create.clh.m.ejb20=CHKJ2504W: The {0} matching method must exist on {1} (EJB 2.0: 10.6.12).
+CHKJ2504.create.brh.m.ejb20=CHKJ2504W: The {0} matching method must exist on {1} (EJB 2.0: 12.2.9).
+CHKJ2504.create.blh.m.ejb20=CHKJ2504W: The {0} matching method must exist on {1} (EJB 2.0: 12.2.11).
+
+CHKJ2500.create.srh.i.ejb20=CHKJ2500I: {1} in method {0} must be serializable at runtime (EJB 2.0: 7.10.6).
+CHKJ2500.create.crh.i.ejb20=CHKJ2500I: {1} in method {0} must be serializable at runtime (EJB 2.0: 9.5.4, 10.6.10).
+CHKJ2500.create.brh.i.ejb20=CHKJ2500I: {1} in method {0} must be serializable at runtime (EJB 2.0: 9.5.4, 12.2.9).
+CHKJ2500.create.srh.m.ejb20=CHKJ2500I: {0} must be serializable at runtime (EJB 2.0: 7.10.6).
+CHKJ2500.create.crh.m.ejb20=CHKJ2500I: {0} must be serializable at runtime (EJB 2.0: 9.5.4, 10.6.10).
+CHKJ2500.create.brh.m.ejb20=CHKJ2500I: {0} must be serializable at runtime (EJB 2.0: 9.5.4, 12.2.9).
+
+# home method
+CHKJ2504.home.crh.i.ejb20=CHKJ2504W: The {1} matching method for {0} must exist on {2} (EJB 2.0: 10.5.2, 10.6.10).
+CHKJ2504.home.clh.i.ejb20=CHKJ2504W: The {1} matching method for {0} must exist on {2} (EJB 2.0: 10.5.2, 10.6.12).
+CHKJ2504.home.brh.i.ejb20=CHKJ2504W: The {1} matching method for {0} must exist on {2} (EJB 2.0: 12.2.9).
+CHKJ2504.home.blh.i.ejb20=CHKJ2504W: The {1} matching method for {0} must exist on {2} (EJB 2.0: 12.2.11).
+CHKJ2504.home.crh.m.ejb20=CHKJ2504W: The {0} method must exist on {1} (EJB 2.0: 10.5.2, 10.6.10).
+CHKJ2504.home.clh.m.ejb20=CHKJ2504W: The {0} method must exist on {1} (EJB 2.0: 10.5.2, 10.6.12).
+CHKJ2504.home.brh.m.ejb20=CHKJ2504W: The {0} method must exist on {1} (EJB 2.0: 12.2.9).
+CHKJ2504.home.blh.m.ejb20=CHKJ2504W: The {0} method must exist on {1} (EJB 2.0: 12.2.11).
+
+
+# find method
+CHKJ2503.find.brh.i.ejb20=CHKJ2503E: {0} must throw java.rmi.RemoteException (EJB 2.0: 9.5.2, 12.2.9).
+CHKJ2503.find.crh.i.ejb20=CHKJ2503E: {0} must throw java.rmi.RemoteException (EJB 2.0: 9.5.2, 10.6.10).
+CHKJ2503.find.srh.i.ejb20=CHKJ2503E: {0} must throw java.rmi.RemoteException (EJB 2.0: 7.10.6).
+CHKJ2503.find.blh.i.ejb20=CHKJ2503W: {0} must not throw java.rmi.RemoteException (EJB 2.0: 9.6.2, 12.2.11, 18.3.8, 18.6).
+CHKJ2503.find.clh.i.ejb20=CHKJ2503W: {0} must not throw java.rmi.RemoteException (EJB 2.0: 9.6.2, 10.6.12, 18.3.8, 18.6).
+CHKJ2503.find.slh.i.ejb20=CHKJ2503W: {0} must not throw java.rmi.RemoteException (EJB 2.0: 7.10.8, 18.3.8, 18.6).
+CHKJ2503.find.brh.m.ejb20=CHKJ2503E: This method must throw java.rmi.RemoteException (EJB 2.0: 9.5.2, 12.2.9).
+CHKJ2503.find.crh.m.ejb20=CHKJ2503E: This method must throw java.rmi.RemoteException (EJB 2.0: 9.5.2, 10.6.10).
+CHKJ2503.find.srh.m.ejb20=CHKJ2503E: This method must throw java.rmi.RemoteException (EJB 2.0: 7.10.6).
+CHKJ2503.find.blh.m.ejb20=CHKJ2503W: This method must not throw java.rmi.RemoteException (EJB 2.0: 9.6.2, 12.2.11, 18.3.8, 18.6).
+CHKJ2503.find.clh.m.ejb20=CHKJ2503W: This method must not throw java.rmi.RemoteException (EJB 2.0: 9.6.2, 10.6.12, 18.3.8, 18.6).
+CHKJ2503.find.slh.m.ejb20=CHKJ2503W: This method must not throw java.rmi.RemoteException (EJB 2.0: 7.10.8, 18.3.8, 18.6).
+
+CHKJ2477.crh.i.ejb20=CHKJ2477W: {0} must throw javax.ejb.FinderException (EJB 2.0: 9.5.2, 12.2.9).
+CHKJ2477.brh.i.ejb20=CHKJ2477W: {0} must throw javax.ejb.FinderException (EJB 2.0: 9.6.2, 12.2.11).
+CHKJ2477.clh.i.ejb20=CHKJ2477W: {0} must throw javax.ejb.FinderException (EJB 2.0: 9.5.2, 10.6.10).
+CHKJ2477.blh.i.ejb20=CHKJ2477W: {0} must throw javax.ejb.FinderException (EJB 2.0: 9.6.2, 10.6.12).
+CHKJ2477.crh.m.ejb20=CHKJ2477W: This method must throw javax.ejb.FinderException (EJB 2.0: 9.5.2, 12.2.9).
+CHKJ2477.brh.m.ejb20=CHKJ2477W: This method must throw javax.ejb.FinderException (EJB 2.0: 9.6.2, 12.2.11).
+CHKJ2477.clh.m.ejb20=CHKJ2477W: This method must throw javax.ejb.FinderException (EJB 2.0: 9.5.2, 10.6.10).
+CHKJ2477.blh.m.ejb20=CHKJ2477W: This method must throw javax.ejb.FinderException (EJB 2.0: 9.6.2, 10.6.12).
+
+CHKJ2478.crh.i.ejb20=CHKJ2478I: {0} must not throw ObjectNotFoundException (EJB 2.0: 10.5.8.4).
+CHKJ2478.crh.m.ejb20=CHKJ2478I: This method must not throw ObjectNotFoundException (EJB 2.0: 10.5.8.4).
+CHKJ2478.clh.i.ejb20=CHKJ2478I: {0} must not throw ObjectNotFoundException (EJB 2.0: 10.5.8.4).
+CHKJ2478.clh.m.ejb20=CHKJ2478I: This method must not throw ObjectNotFoundException (EJB 2.0: 10.5.8.4).
+CHKJ2478.brh.i.ejb20=CHKJ2478I: {0} must not throw ObjectNotFoundException (EJB 2.0: 12.1.8.4).
+CHKJ2478.brh.m.ejb20=CHKJ2478I: This method must not throw ObjectNotFoundException (EJB 2.0: 12.1.8.4).
+CHKJ2478.blh.i.ejb20=CHKJ2478I: {0} must not throw ObjectNotFoundException (EJB 2.0: 12.1.8.4).
+CHKJ2478.blh.m.ejb20=CHKJ2478I: This method must not throw ObjectNotFoundException (EJB 2.0: 12.1.8.4).
+CHKJ2478.cb.i.ejb20=CHKJ2478I: {0} must not throw ObjectNotFoundException (EJB 2.0: 10.5.8.4).
+CHKJ2478.cb.m.ejb20=CHKJ2478I: This method must not throw ObjectNotFoundException (EJB 2.0: 10.5.8.4).
+CHKJ2478.bb.i.ejb20=CHKJ2478I: {0} must not throw ObjectNotFoundException (EJB 2.0: 12.1.8.4).
+CHKJ2478.bb.m.ejb20=CHKJ2478I: This method must not throw ObjectNotFoundException (EJB 2.0: 12.1.8.4).
+
+CHKJ2403.brh.i.ejb20=CHKJ2403W: {0} must return {1} or a collection thereof (EJB 2.0: 9.5.2, 12.1.7, 12.2.9).
+CHKJ2403.blh.i.ejb20=CHKJ2403W: {0} must return {1} or a collection thereof (EJB 2.0: 9.6.2, 12.1.7, 12.2.11).
+CHKJ2403.crh.i.ejb20=CHKJ2403W: {0} must return {1} or a collection thereof (EJB 2.0: 9.5.2, 10.5.6, 10.6.10, 11.2.2).
+CHKJ2403.clh.i.ejb20=CHKJ2403W: {0} must return {1} or a collection thereof (EJB 2.0: 9.6.2, 10.5.6, 10.6.12, 11.2.2).
+CHKJ2403.brh.m.ejb20=CHKJ2403W: This method must return {0} or a collection thereof (EJB 2.0: 9.5.2, 12.1.7, 12.2.9).
+CHKJ2403.blh.m.ejb20=CHKJ2403W: This method must return {0} or a collection thereof (EJB 2.0: 9.6.2, 12.1.7, 12.2.11).
+CHKJ2403.crh.m.ejb20=CHKJ2403W: This method must return {0} or a collection thereof (EJB 2.0: 9.5.2, 10.5.6, 10.6.10, 11.2.2).
+CHKJ2403.clh.m.ejb20=CHKJ2403W: This method must return {0} or a collection thereof (EJB 2.0: 9.6.2, 10.5.6, 10.6.12, 11.2.2).
+
+# remote find
+CHKJ2504.find.brh.i.ejb20=CHKJ2504W: {1} must exist on {2} for {0} (EJB 2.0: 12.2.9).
+CHKJ2504.find.crh.i.ejb20=CHKJ2504W: {1} must exist on {2} for {0} (EJB 2.0: 10.6.10).
+CHKJ2504.find.brh.m.ejb20=CHKJ2504W: {0} must exist on {1} (EJB 2.0: 12.2.9).
+CHKJ2504.find.crh.m.ejb20=CHKJ2504W: {0} must exist on {1} (EJB 2.0: 10.6.10).
+
+# local find
+CHKJ2504.find.blh.i.ejb20=CHKJ2504W: {1} must exist on {2} for {0} (EJB 2.0: 12.2.11).
+CHKJ2504.find.clh.i.ejb20=CHKJ2504W: {1} must exist on {2} for {0} (EJB 2.0: 10.6.2).
+CHKJ2504.find.blh.m.ejb20=CHKJ2504W: {0} must exist on {1} (EJB 2.0: 12.2.11).
+CHKJ2504.find.clh.m.ejb20=CHKJ2504W: {0} must exist on {1} (EJB 2.0: 10.6.2).
+
+
+CHKJ2500.find.srh.i.ejb20=CHKJ2500I: {1} in method {0} must be serializable at runtime (EJB 2.0: 7.10.6).
+CHKJ2500.find.crh.i.ejb20=CHKJ2500I: {1} in method {0} must be serializable at runtime (EJB 2.0: 9.5.4, 10.6.10).
+CHKJ2500.find.brh.i.ejb20=CHKJ2500I: {1} in method {0} must be serializable at runtime (EJB 2.0: 9.5.4, 12.2.9).
+CHKJ2500.find.srh.m.ejb20=CHKJ2500I: {0} must be serializable at runtime (EJB 2.0: 7.10.6).
+CHKJ2500.find.crh.m.ejb20=CHKJ2500I: {0} must be serializable at runtime (EJB 2.0: 9.5.4, 10.6.10).
+CHKJ2500.find.brh.m.ejb20=CHKJ2500I: {0} must be serializable at runtime (EJB 2.0: 9.5.4, 12.2.9).
+
+CHKJ2495.clh.i.ejb20=CHKJ2495I: {0} must be associated with a query element in ejb-jar.xml (EJB 2.0: 10.5.6, 10.6.14).
+CHKJ2495.clh.m.ejb20=CHKJ2495I: This method must be associated with a query element in ejb-jar.xml (EJB 2.0: 10.5.6, 10.6.14).
+CHKJ2495.crh.i.ejb20=CHKJ2495I: {0} must be associated with a query element in ejb-jar.xml (EJB 2.0: 10.5.6, 10.6.14).
+CHKJ2495.crh.m.ejb20=CHKJ2495I: This method must be associated with a query element in ejb-jar.xml (EJB 2.0: 10.5.6, 10.6.14).
+
+
+# method on a component interface
+CHKJ2503.bus.src.i.ejb20=CHKJ2503E: {0} must throw java.rmi.RemoteException (EJB 2.0: 7.10.5).
+CHKJ2503.bus.slc.i.ejb20=CHKJ2503W: {0} must not throw java.rmi.RemoteException (EJB 2.0: 7.10.7, 18.3.8, 18.6).
+CHKJ2503.bus.brc.i.ejb20=CHKJ2503E: {0} must throw java.rmi.RemoteException (EJB 2.0: 12.2.8).
+CHKJ2503.bus.blc.i.ejb20=CHKJ2503W: {0} must not throw java.rmi.RemoteException (EJB 2.0: 9.10, 12.2.10, 18.3.8, 18.6).
+CHKJ2503.bus.crc.i.ejb20=CHKJ2503E: {0} must throw java.rmi.RemoteException (EJB 2.0: 10.6.9).
+CHKJ2503.bus.clc.i.ejb20=CHKJ2503W: {0} must not throw java.rmi.RemoteException (EJB 2.0: 9.10, 18.3.8, 18.6).
+CHKJ2503.bus.src.m.ejb20=CHKJ2503E: This method must throw java.rmi.RemoteException (EJB 2.0: 7.10.5).
+CHKJ2503.bus.slc.m.ejb20=CHKJ2503W: This method must not throw java.rmi.RemoteException (EJB 2.0: 7.10.7, 18.3.8, 18.6).
+CHKJ2503.bus.brc.m.ejb20=CHKJ2503E: This method must throw java.rmi.RemoteException (EJB 2.0: 12.2.8).
+CHKJ2503.bus.blc.m.ejb20=CHKJ2503W: This method must not throw java.rmi.RemoteException (EJB 2.0: 9.10, 12.2.10, 18.3.8, 18.6).
+CHKJ2503.bus.crc.m.ejb20=CHKJ2503E: This method must throw java.rmi.RemoteException (EJB 2.0: 10.6.9).
+CHKJ2503.bus.clc.m.ejb20=CHKJ2503W: This method must not throw java.rmi.RemoteException (EJB 2.0: 9.10, 18.3.8, 18.6).
+
+# method on a home interface
+CHKJ2465.brh.i.ejb20=CHKJ2465W: {0} must throw {1} for {2} (EJB 2.0: 12.2.9).
+CHKJ2465.blh.i.ejb20=CHKJ2465W: {0} must throw {1} for {2} (EJB 2.0: 12.2.11).
+CHKJ2465.crh.i.ejb20=CHKJ2465W: {0} must throw {1} for {2} (EJB 2.0: 10.6.10).
+CHKJ2465.clh.i.ejb20=CHKJ2465W: {0} must throw {1} for {2} (EJB 2.0: 10.6.12).
+CHKJ2465.srh.i.ejb20=CHKJ2465W: {0} must throw {1} for {2} (EJB 2.0: 7.10.6).
+CHKJ2465.slh.i.ejb20=CHKJ2465W: {0} must throw {1} for {2} (EJB 2.0: 7.10.8).
+CHKJ2465.brh.m.ejb20=CHKJ2465W: This method must throw {0} for {1} (EJB 2.0: 12.2.9).
+CHKJ2465.blh.m.ejb20=CHKJ2465W: This method must throw {0} for {1} (EJB 2.0: 12.2.11).
+CHKJ2465.crh.m.ejb20=CHKJ2465W: This method must throw {0} for {1} (EJB 2.0: 10.6.10).
+CHKJ2465.clh.m.ejb20=CHKJ2465W: This method must throw {0} for {1} (EJB 2.0: 10.6.12).
+CHKJ2465.srh.m.ejb20=CHKJ2465W: This method must throw {0} for {1} (EJB 2.0: 7.10.6).
+CHKJ2465.slh.m.ejb20=CHKJ2465W: This method must throw {0} for {1} (EJB 2.0: 7.10.8).
+
+# method on a remote home
+CHKJ2500.home.srh.i.ejb20=CHKJ2500I: {1} in method {0} must be serializable at runtime (EJB 2.0: 7.10.6).
+CHKJ2500.home.crh.i.ejb20=CHKJ2500I: {1} in method {0} must be serializable at runtime (EJB 2.0: 9.5.4, 10.6.10).
+CHKJ2500.home.brh.i.ejb20=CHKJ2500I: {1} in method {0} must be serializable at runtime (EJB 2.0: 9.5.4, 12.2.9).
+CHKJ2500.home.srh.m.ejb20=CHKJ2500I: {0} must be serializable at runtime (EJB 2.0: 7.10.6).
+CHKJ2500.home.crh.m.ejb20=CHKJ2500I: {0} must be serializable at runtime (EJB 2.0: 9.5.4, 10.6.10).
+CHKJ2500.home.brh.m.ejb20=CHKJ2500I: {0} must be serializable at runtime (EJB 2.0: 9.5.4, 12.2.9).
+
+CHKJ2466.src.i.ejb20=CHKJ2466I: {0} must not expose the {1} type (EJB 2.0: 7.10.5).
+CHKJ2466.crh.i.ejb20=CHKJ2466I: {0} must not expose the {1} type (EJB 2.0: 10.6.10).
+CHKJ2466.brh.i.ejb20=CHKJ2466I: {0} must not expose the {1} type (EJB 2.0: 12.2.9).
+CHKJ2466.crh.m.ejb20=CHKJ2466I: This method must not expose the {0} type (EJB 2.0: 10.6.10).
+CHKJ2466.brh.m.ejb20=CHKJ2466I: This method must not expose the {0} type (EJB 2.0: 12.2.9).
+CHKJ2466.src.m.ejb20=CHKJ2466I: This method must not expose the {0} type (EJB 2.0: 7.10.5).
+
+# method on a remote component
+CHKJ2468.src.ejb20=CHKJ2468W: This interface must follow RMI-IIOP rules for remote interfaces (EJB 2.0: 7.10.5).
+CHKJ2468.crc.ejb20=CHKJ2468W: This interface must follow RMI-IIOP rules for remote interfaces (EJB 2.0: 10.6.9).
+CHKJ2468.brc.ejb20=CHKJ2468W: This interface must follow RMI-IIOP rules for remote interfaces (EJB 2.0: 12.2.8).
+
+CHKJ2500.bus.src.i.ejb20=CHKJ2500I: {0} in method {1} must be serializable at runtime (EJB 2.0: 7.10.5).
+CHKJ2500.bus.crc.i.ejb20=CHKJ2500I: {0} in method {1} must be serializable at runtime (EJB 2.0: 10.6.9).
+CHKJ2500.bus.brc.i.ejb20=CHKJ2500I: {0} in method {1} must be serializable at runtime (EJB 2.0: 12.2.8).
+CHKJ2500.bus.src.m.ejb20=CHKJ2500I: {0} must be serializable at runtime (EJB 2.0: 7.10.5).
+CHKJ2500.bus.crc.m.ejb20=CHKJ2500I: {0} must be serializable at runtime (EJB 2.0: 10.6.9).
+CHKJ2500.bus.brc.m.ejb20=CHKJ2500I: {0} must be serializable at runtime (EJB 2.0: 12.2.8).
+
+CHKJ2472.srh.i.ejb20=CHKJ2472W: {1} in method {0} cannot be an argument or result type (EJB 2.0: 6.7.2).
+CHKJ2472.brc.i.ejb20=CHKJ2472W: {0} must not pass {1} as an argument or result (EJB 2.0: 9.7.2, 12.2.8).
+CHKJ2472.crc.i.ejb20=CHKJ2472W: {0} must not pass {1} as an argument or result (EJB 2.0: 9.7.2, 10.3.1, 10.3.10.1).
+CHKJ2472.brc.m.ejb20=CHKJ2472W: This method must not pass {0} as an argument or result (EJB 2.0: 9.7.2, 12.2.8).
+CHKJ2472.crc.m.ejb20=CHKJ2472W: This method must not pass {0} as an argument or result (EJB 2.0: 9.7.2, 10.3.1, 10.3.10.1).
+CHKJ2472.srh.m.ejb20=CHKJ2472W: {0} cannot be an argument or result type (EJB 2.0: 6.7.2).
+
+# method on a remote component CMP
+CHKJ2474.crc.i.ejb20=CHKJ2474W: {0} must not expose {1} (EJB 2.0: 10.3.1, 10.3.10.1).
+CHKJ2474.crc.m.ejb20=CHKJ2474W: This method must not expose {0} (EJB 2.0: 10.3.1, 10.3.10.1).
+
+CHKJ2490.crc.i.ejb20=CHKJ2490W: {0} must not be exposed (EJB 2.0: 10.3.1, 10.3.10.1).
+CJKJ2490.crc.m.ejb20=CHKJ2490W: This method must not be exposed (EJB 2.0: 10.3.1, 10.3.10.1).
+
+# ejbSelect method
+CHKJ2485.cb.i.ejb20=CHKJ2485W: {0} must be abstract (EJB 2.0: 10.5.7, 10.6.7).
+CHKJ2485.cb.m.ejb20=CHKJ2485W: This method must be abstract (EJB 2.0: 10.5.7, 10.6.7).
+
+CHKJ2487.cb.i.ejb20=CHKJ2487W: {0} must be public (EJB 2.0: 10.6.7).
+CHKJ2487.cb.m.ejb20=CHKJ2487W: This method must be public (EJB 2.0: 10.6.7).
+
+CHKJ2488.cb.i.ejb20=CHKJ2488W: {0} must throw javax.ejb.FinderException (EJB 2.0: 10.6.7).
+CHKJ2488.cb.m.ejb20=CHKJ2488W: This method must throw javax.ejb.FinderException (EJB 2.0: 10.6.7).
+
+CHKJ2486.cb.i.ejb20=CHKJ2486W: {0} must return {1} or a collection thereof (EJB 2.0: 10.5.7, 11.2.2).
+CHKJ2486.cb.m.ejb20=CHKJ2486W: This method must return {0} or a collection thereof (EJB 2.0: 10.5.7, 11.2.2).
+
+CHKJ2496.cb.i.ejb20=CHKJ2496W: {0} must be associated with a query element in ejb-jar.xml (EJB 2.0: 10.5.7, 10.6.14).
+CHKJ2496.cb.m.ejb20=CHKJ2496W: This method must be associated with a query element in ejb-jar.xml (EJB 2.0: 10.5.7, 10.6.14).
+
+# component matching method
+CHKJ2023.src.i.ejb20=CHKJ2023W: The {0} method needs {1} to exist on {2} (EJB 2.0: 7.10.5).
+CHKJ2023.slc.i.ejb20=CHKJ2023W: The {0} method needs {1} to exist on {2} (EJB 2.0: 7.10.7).
+CHKJ2023.brc.i.ejb20=CHKJ2023W: The {0} method needs {1} to exist on {2} (EJB 2.0: 12.2.8).
+CHKJ2023.blc.i.ejb20=CHKJ2023W: The {0} method needs {1} to exist on {2} (EJB 2.0: 12.2.10).
+CHKJ2023.crc.i.ejb20=CHKJ2023W: The {0} method needs {1} to exist on {2} (EJB 2.0: 10.6.9).
+CHKJ2023.clc.i.ejb20=CHKJ2023W: The {0} method needs {1} to exist on {2} (EJB 2.0: 10.6.11).
+CHKJ2023.src.m.ejb20=CHKJ2023W: The {0} method must exist on {1} (EJB 2.0: 7.10.5).
+CHKJ2023.slc.m.ejb20=CHKJ2023W: The {0} method must exist on {1} (EJB 2.0: 7.10.7).
+CHKJ2023.brc.m.ejb20=CHKJ2023W: The {0} method must exist on {1} (EJB 2.0: 12.2.8).
+CHKJ2023.blc.m.ejb20=CHKJ2023W: The {0} method must exist on {1} (EJB 2.0: 12.2.10).
+CHKJ2023.crc.m.ejb20=CHKJ2023W: The {0} method must exist on {1} (EJB 2.0: 10.6.9).
+CHKJ2023.clc.m.ejb20=CHKJ2023W: The {0} method must exist on {1} (EJB 2.0: 10.6.11).
+
+CHKJ2470.src.i.ejb20=CHKJ2470E: {0} must return {1} (EJB 2.0: 7.10.5).
+CHKJ2470.slc.i.ejb20=CHKJ2470E: {0} must return {1} (EJB 2.0: 7.10.7).
+CHKJ2470.crc.i.ejb20=CHKJ2470E: {0} must return {1} (EJB 2.0: 10.6.9).
+CHKJ2470.clc.i.ejb20=CHKJ2470E: {0} must return {1} (EJB 2.0: 10.6.11).
+CHKJ2470.brc.i.ejb20=CHKJ2470E: {0} must return {1} (EJB 2.0: 12.2.8).
+CHKJ2470.blc.i.ejb20=CHKJ2470E: {0} must return {1} (EJB 2.0: 12.2.10).
+CHKJ2470.src.m.ejb20=CHKJ2470E: This method must return {0} (EJB 2.0: 7.10.5).
+CHKJ2470.slc.m.ejb20=CHKJ2470E: This method must return {0} (EJB 2.0: 7.10.7).
+CHKJ2470.crc.m.ejb20=CHKJ2470E: This method must return {0} (EJB 2.0: 10.6.9).
+CHKJ2470.clc.m.ejb20=CHKJ2470E: This method must return {0} (EJB 2.0: 10.6.11).
+CHKJ2470.brc.m.ejb20=CHKJ2470E: This method must return {0} (EJB 2.0: 12.2.8).
+CHKJ2470.blc.m.ejb20=CHKJ2470E: This method must return {0} (EJB 2.0: 12.2.10).
+
+CHKJ2471.src.i.ejb20=CHKJ2471W: {0} must throw {1} (EJB 2.0: 7.10.5).
+CHKJ2471.slc.i.ejb20=CHKJ2471W: {0} must throw {1} (EJB 2.0: 7.10.7).
+CHKJ2471.crc.i.ejb20=CHKJ2471W: {0} must throw {1} (EJB 2.0: 10.6.9).
+CHKJ2471.clc.i.ejb20=CHKJ2471W: {0} must throw {1} (EJB 2.0: 10.6.11).
+CHKJ2471.brc.i.ejb20=CHKJ2471W: {0} must throw {1} (EJB 2.0: 12.2.8).
+CHKJ2471.blc.i.ejb20=CHKJ2471W: {0} must throw {1} (EJB 2.0: 12.2.10).
+CHKJ2471.src.m.ejb20=CHKJ2471W: This method must throw {0} (EJB 2.0: 7.10.5).
+CHKJ2471.slc.m.ejb20=CHKJ2471W: This method must throw {0} (EJB 2.0: 7.10.7).
+CHKJ2471.crc.m.ejb20=CHKJ2471W: This method must throw {0} (EJB 2.0: 10.6.9).
+CHKJ2471.clc.m.ejb20=CHKJ2471W: This method must throw {0} (EJB 2.0: 10.6.11).
+CHKJ2471.brc.m.ejb20=CHKJ2471W: This method must throw {0} (EJB 2.0: 12.2.8).
+CHKJ2471.blc.m.ejb20=CHKJ2471W: This method must throw {0} (EJB 2.0: 12.2.10).
+
+# EJBObject, EJBLocalObject methods
+CHKJ2469.src.i.ejb20=CHKJ2469W: {0} is provided by the container (EJB 2.0: 6.5).
+CHKJ2469.slc.i.ejb20=CHKJ2469W: {0} is provided by the container (EJB 2.0: 6.5).
+CHKJ2469.crc.i.ejb20=CHKJ2469W: {0} is provided by the container (EJB 2.0: 9.9).
+CHKJ2469.clc.i.ejb20=CHKJ2469W: {0} is provided by the container (EJB 2.0: 9.10).
+CHKJ2469.brc.i.ejb20=CHKJ2469W: {0} is provided by the container (EJB 2.0: 9.9).
+CHKJ2469.blc.i.ejb20=CHKJ2469W: {0} is provided by the container (EJB 2.0: 9.10).
+CHKJ2469.src.m.ejb20=CHKJ2469W: This method is provided by the container (EJB 2.0: 6.5).
+CHKJ2469.slc.m.ejb20=CHKJ2469W: This method is provided by the container (EJB 2.0: 6.5).
+CHKJ2469.crc.m.ejb20=CHKJ2469W: This method is provided by the container (EJB 2.0: 9.9).
+CHKJ2469.clc.m.ejb20=CHKJ2469W: This method is provided by the container (EJB 2.0: 9.10).
+CHKJ2469.brc.m.ejb20=CHKJ2469W: This method is provided by the container (EJB 2.0: 9.9).
+CHKJ2469.blc.m.ejb20=CHKJ2469W: This method is provided by the container (EJB 2.0: 9.10).
+
+# findByPrimaryKey
+CHKJ2475.crh.i.ejb20=CHKJ2475W: {0} must be findByPrimaryKey({1}) (EJB 2.0: 9.5.2, 10.6.10).
+CHKJ2475.clh.i.ejb20=CHKJ2475W: {0} must be findByPrimaryKey({1}) (EJB 2.0: 9.6.2, 10.6.12).
+CHKJ2475.crhd.i.ejb20=CHKJ2475W: {0} must be findByPrimaryKey(Object) (EJB 2.0: 10.8.3).
+CHKJ2475.clhd.i.ejb20=CHKJ2475W: {0} must be findByPrimaryKey(Object) (EJB 2.0: 10.8.3).
+CHKJ2475.brh.i.ejb20=CHKJ2475W: {0} must be findByPrimaryKey({1}) (EJB 2.0: 9.5.2, 12.2.9).
+CHKJ2475.blh.i.ejb20=CHKJ2475W: {0} must be findByPrimaryKey({1}) (EJB 2.0: 9.6.2, 12.2.11).
+CHKJ2475.crh.m.ejb20=CHKJ2475W: This method must be findByPrimaryKey({0}) (EJB 2.0: 9.5.2, 10.6.10).
+CHKJ2475.clh.m.ejb20=CHKJ2475W: This method must be findByPrimaryKey({0}) (EJB 2.0: 9.6.2, 10.6.12).
+CHKJ2475.crhd.m.ejb20=CHKJ2475W: This method must be findByPrimaryKey(Object) (EJB 2.0: 10.8.3).
+CHKJ2475.clhd.m.ejb20=CHKJ2475W: This method must be findByPrimaryKey(Object) (EJB 2.0: 10.8.3).
+CHKJ2475.brh.m.ejb20=CHKJ2475W: This method must be findByPrimaryKey({0}) (EJB 2.0: 9.5.2, 12.2.9).
+CHKJ2475.blh.m.ejb20=CHKJ2475W: This method must be findByPrimaryKey({0}) (EJB 2.0: 9.6.2, 12.2.11).
+
+CHKJ2479.crh.i.ejb20=CHKJ2479E: {0} must return {1} (EJB 2.0: 9.5.2, 10.6.10).
+CHKJ2479.clh.i.ejb20=CHKJ2479E: {0} must return {1} (EJB 2.0: 9.6.2, 10.6.12).
+CHKJ2479.brh.i.ejb20=CHKJ2479E: {0} must return {1} (EJB 2.0: 9.5.2, 12.2.9).
+CHKJ2479.blh.i.ejb20=CHKJ2479E: {0} must return {1} (EJB 2.0: 9.6.2, 12.2.11).
+CHKJ2479.crh.m.ejb20=CHKJ2479E: This method must return {0} (EJB 2.0: 9.5.2, 10.6.10).
+CHKJ2479.clh.m.ejb20=CHKJ2479E: This method must return {0} (EJB 2.0: 9.6.2, 10.6.12).
+CHKJ2479.brh.m.ejb20=CHKJ2479E: This method must return {0} (EJB 2.0: 9.5.2, 12.2.9).
+CHKJ2479.blh.m.ejb20=CHKJ2479E: This method must return {0} (EJB 2.0: 9.6.2, 12.2.11).
+
+
+
+##################################################
+# field checks
+##################################################
+CHKJ2452.sb.i.ejb20=CHKJ2452W: Transient field {0} should not be the {1} type (EJB 2.0: 7.4.1).
+CHKJ2452.sb.m.ejb20=CHKJ2452W: A transient field should not be the {0} type (EJB 2.0: 7.4.1).
+
+CHKJ2453.sb.i.ejb20=CHKJ2453W: Transient fields ({0}) are discouraged (EJB 2.0: 7.4.1).
+CHKJ2453.sb.m.ejb20=CHKJ2453W: Transient fields are discouraged (EJB 2.0: 7.4.1).
+
+# CMR and CMP fields must NOT be defined on the bean class.
+CHKJ2454.cb.i.ejb20=CHKJ2454W: {0} must not be defined (EJB 2.0: 10.3.1).
+CHKJ2454.cb.m.ejb20=CHKJ2454W: {0} must not be defined (EJB 2.0: 10.3.1).
+
+CHKJ2480.cb.i.ejb20=CHKJ2480I: {0} must begin with a lowercase letter (EJB 2.0: 10.3.1).
+CHKJ2480.cb.m.ejb20=CHKJ2480I: {0} must begin with a lowercase letter (EJB 2.0: 10.3.1).
+
+CHKJ2481.cb.i.ejb20=CHKJ2481W: {0} must be declared as a <cmp-field> (EJB 2.0: 10.3.1, 10.3.13).
+CHKJ2481.cb.m.ejb20=CHKJ2481W: {0} must be declared as a <cmp-field> (EJB 2.0: 10.3.1, 10.3.13).
+
+CHKJ2482.cb.i.ejb20=CHKJ2482W: {0} must be declared as a <cmr-field> (EJB 2.0: 10.3.1, 10.3.13).
+CHKJ2482.cb.m.ejb20=CHKJ2482W: {0} must be declared as a <cmr-field> (EJB 2.0: 10.3.1, 10.3.13).
+
+CHKJ2483.cb.i.ejb20=CHKJ2483W: {0} should not be exposed (EJB 2.0: 10.3.1).
+CHKJ2483.cb.m.ejb20=CHKJ2483W: {0} should not be exposed (EJB 2.0: 10.3.1).
+
+CHKJ2484.cb.i.ejb20=CHKJ2484W: {0} must be either a primitive or a serializable type (EJB 2.0: 10.3.1).
+CHKJ2484.cb.m.ejb20=CHKJ2484W: {0} must be either a primitive or a serializable type (EJB 2.0: 10.3.1).
+
+CHKJ2489.cb.i.ejb20=CHKJ2489W: Field {0} must be the {1} type (EJB 2.0: 10.8.1).
+CHKJ2489.cb.m.ejb20=CHKJ2489W: This field must be the {0} type (EJB 2.0: 10.8.1).
+
+CHKJ2205.kc.i.ejb20=CHKJ2205W: Field {0} must be public (EJB 2.0: 10.8.2).
+CHKJ2205.kc.m.ejb20=CHKJ2205W: This field must be public (EJB 2.0: 10.8.2).
+
+CHKJ2206.kc.i.ejb20=CHKJ2206W: Field {0} must be a <cmp-field> (EJB 2.0: 10.8.2).
+CHKJ2206.kc.m.ejb20=CHKJ2206W: This field must be a <cmp-field> (EJB 2.0: 10.8.2).
+
+
+############################################################
+## DD
+############################################################
+CHKJ2880.s.ejb20=CHKJ2880W: This bean must provide a <local-home> (EJB 2.0: 7.10.1).
+CHKJ2881.s.ejb20=CHKJ2881W: This bean must provide a <home> (EJB 2.0: 7.10.1).
+CHKJ2882.s.ejb20=CHKJ2882W: This bean must provide a <local> (EJB 2.0: 7.10.1).
+CHKJ2883.s.ejb20=CHKJ2883W: This bean must provide a <remote> (EJB 2.0: 7.10.1).
+CHKJ2884.s.ejb20=CHKJ2884W: This bean must provide either a <local-home> or a <home> (EJB 2.0: 7.10.1).
+CHKJ2885.s.ejb20=CHKJ2885W: This bean must provide either a <local> or a <remote> (EJB 2.0: 7.10.1).
+CHKJ2880.c.ejb20=CHKJ2880W: This bean must provide a <local-home> (EJB 2.0: 10.6.1).
+CHKJ2881.c.ejb20=CHKJ2881W: This bean must provide a <home> (EJB 2.0: 10.6.1).
+CHKJ2882.c.ejb20=CHKJ2882W: This bean must provide a <local> (EJB 2.0: 10.6.1).
+CHKJ2883.c.ejb20=CHKJ2883W: This bean must provide a <remote> (EJB 2.0: 10.6.1).
+CHKJ2884.c.ejb20=CHKJ2884W: This bean must provide either a <local-home> or a <home> (EJB 2.0: 10.6.1).
+CHKJ2885.c.ejb20=CHKJ2885W: This bean must provide either a <local> or a <remote> (EJB 2.0: 10.6.1).
+CHKJ2880.b.ejb20=CHKJ2880W: This bean must provide a <local-home> (EJB 2.0: 12.2.1).
+CHKJ2881.b.ejb20=CHKJ2881W: This bean must provide a <home> (EJB 2.0: 12.2.1).
+CHKJ2882.b.ejb20=CHKJ2882W: This bean must provide a <local> (EJB 2.0: 12.2.1).
+CHKJ2883.b.ejb20=CHKJ2883W: This bean must provide a <remote> (EJB 2.0: 12.2.1).
+CHKJ2884.b.ejb20=CHKJ2884W: This bean must provide either a <local-home> or a <home> (EJB 2.0: 12.2.1).
+CHKJ2885.b.ejb20=CHKJ2885W: This bean must provide either a <local> or a <remote> (EJB 2.0: 12.2.1).
+
+CHKJ2813.ejb20=CHKJ2813I: <ejb-name> {0} must be a valid Java identifier (EJB 2.0: 10.3.13, 11.2.6.1).
+CHKJ2819.ejb20=CHKJ2819I: <abstract-schema-name> {0} must be a valid Java identifier (EJB 2.0: 10.3.13, 10.6.14, 11.2.6.1).
+CHKJ2854.ejb20=CHKJ2854E: <abstract-schema-name> {0} must be unique within the ejb-jar.xml file (EJB 2.0: 10.3.13, 10.6.14, 11.2.2).
+CHKJ2858.ejb20=CHKJ2858W: <abstract-schema-name> must exist (EJB 2.0: 22.2, 22.5).
+CHKJ2859.ejb20=CHKJ2859W: Reserved identifier {0} cannot be used as an <ejb-name> (EJB 2.0: 10.6.14, 11.2.6.1).
+CHKJ2860.ejb20=CHKJ2860W: Reserved identifier {0} cannot be used as an <abstract-schema-name> (EJB 2.0: 10.6.14, 11.2.6.1).
+
+CHKJ2861.ejb20=CHKJ2861I: <cmp-field> {0} must be a valid Java identifier and begin with a lowercase letter (EJB 2.0: 10.3.1, 11.2.6.1).
+CHKJ2857.ejb20=CHKJ2857I: <cmr-field> {0} must be a valid Java identifier and begin with a lowercase letter (EJB 2.0: 10.3.1, 11.2.6.1).
+
+CHKJ2862.ejb20=CHKJ2862I: <cmp-field> {0} must have a set method (EJB 2.0: 10.3.1, 10.6.2).
+CHKJ2863.ejb20=CHKJ2863I: <cmp-field> {0} must have a get method (EJB 2.0: 10.3.1, 10.6.2).
+CHKJ2864.ejb20=CHKJ2864I: <cmr-field> {0} must have a set method (EJB 2.0: 10.3.1, 10.6.2).
+CHKJ2865.ejb20=CHKJ2865I: <cmr-field> {0} must have a get method (EJB 2.0: 10.3.1, 10.6.2).
+CHKJ2855.ejb20=CHKJ2855I: <cmp-field> {0} must be a Java primitive or a Java serializable type (EJB 2.0: 10.3.1).
+CHKJ2856.ejb20=CHKJ2856I: <cmr-field> {0} must be the {1} type or a collection thereof (EJB 2.0: 10.3.1).
+
+CHKJ2815.ejb20=CHKJ2815W: Dependent value class {0} cannot be a <cmr-field> (EJB 2.0: 10.3.3).
+
+CHKJ2816.ejb20=CHKJ2816I: <ejb-relation-name> must be unique in ejb-jar.xml (EJB 2.0: 10.3.2, 10.3.13, 22.5).
+CHKJ2817.ejb20=CHKJ2817I: <ejb-relationship-role-name> must be unique within an <ejb-relation> (EJB 2.0: 10.3.2, 10.3.13, 22.5).
+CHKJ2818.ejb20=CHKJ2818I: The value of the <multiplicity> element must be either "One" or "Many" (EJB 2.0: 10.3.2, 10.3.13, 22.5).
+CHKJ2821.ejb20=CHKJ2821I: <relationship-role-source> in role {0} must refer to an existing CMP bean (EJB 2.0: 10.3.2, 22.5).
+CHKJ2848.ejb20=CHKJ2848I: <cascade-delete> must be used with a <multiplicity> of "One" (EJB 2.0: 10.3.4.2, 22.5).
+CHKJ2866.ejb20=CHKJ2866I: <cmr-field> {0} must be defined on {1} (EJB 2.0: 10.3.2, 22.5).
+CHKJ2867.ejb20=CHKJ2867I: This bean can have only unidirectional relationships to other beans (EJB 2.0: 10.3.2).
+CHKJ2868.ejb20=CHKJ2868I: The value of the <cmr-field-type> element must be either "java.util.Collection" or "java.util.Set" (EJB 2.0: 10.3.13, 22.5).
+CHKJ2869.ejb20=CHKJ2869I: At least one <ejb-relationship-role> must define a <cmr-field> (EJB 2.0: 10.3.2, 10.3.13, 22.5).
+CHKJ2870.ejb20=CHKJ2870I: <ejb-name> {0} must exist (EJB 2.0: 10.3.13).
+CHKJ2871.ejb20=CHKJ2871I: <ejb-name> {0} must refer to a CMP bean (EJB 2.0: 10.3.2, 10.3.13).
+
+CHKJ2872.ejb20=CHKJ2872E: The value of the <cmp-version> element must be either "1.x" or "2.x" (EJB 2.0: 22.5).
+CHKJ2873.ejb20=CHKJ2873W: Migrate this bean's datasource binding to a CMP Connection Factory binding.
+CHKJ2874.ejb20=CHKJ2874W: Migrate this EJB module's default datasource binding to a default CMP Connection Factory binding.
+
+CHKJ2886.ejb21=CHKJ2885E: Duplicate activation config: "{0}" exist in message driven bean: "{1}".
+CHKJ2887.ejb21=The activation config with name: "{0}" has invalid value: "{1}" for message driven bean: "{2}".
+CHKJ2890.ejb21=The message destination type: "{0}" and destination type activation config property value: "{1}" do not match  for bean: "{2}".
+###########################################################################
+#
+# 2TC: Do not translate anything in the following section. These strings
+#      are reserved for future use.
+#
+###########################################################################
+#
+# Ignore these messages for now; the EJB QL validator may take care of this.
+# If not, add this validation into the EJBJarVRule class.
+#
+#
+# Identification variables
+#
+# IWAD4927.ejb20=IWAD4927W: Identification variable {0} must be declared in the FROM clause (EJB 2.0: 11.2.6.2).
+# IWAD4928.ejb20=IWAD4928W: Reserved identifier {0} cannot be used as an identification variable (EJB 2.0: 11.2.6.2).
+# IWAD4929.ejb20=IWAD4929W: <abstract-schema-name> {0} cannot be used as an identification variable (EJB 2.0: 11.2.6.2).
+# IWAD4930.ejb20=IWAD4930W: <ejb-name> {0} cannot be used as an identification variable (EJB 2.0: 11.2.6.2).
+
+#
+# query statement
+#
+# IWAD4918.ejb20=IWAD4918W: This query must contain a SELECT clause (EJB 2.0: 11.1).
+# IWAD4919.ejb20=IWAD4919W: This query must contain a FROM clause (EJB 2.0: 11.1).
+# IWAD4920.ejb20=IWAD4920W: This query has a syntax error (EJB 2.0: 11.2).
+#
+
+
+# IWAD4808.ejb20=IWAD4808W: This bean must use container-managed transaction demarcation (EJB 2.0: 17.3.1, 17.3.3).
+# IWAD4809.ejb20=IWAD4809W: Specify a transaction attribute for this method (EJB 2.0: 17.4.1).
+# IWAD4810.ejb20=IWAD4810W: A transaction attribute must not exist for this method (EJB 2.0: 17.4.1).
+
+# IWAD4811.ejb20=IWAD4811W: At least one <method> must exist in a <container-transaction> (EJB 2.0: 17.4.1).
+# IWAD4900.ejb20=IWAD4900W: This <container-transaction> must reference only one bean (EJB 2.0: 17.4.1).
+# IWAD4901.ejb20=IWAD4901W: {0} must exist (EJB 2.0: 17.4.1)
+# IWAD4815.ejb20=IWAD4815W: No methods on {0} match this <method> (EJB 2.0: 17.4.1).
+# IWAD4817.ejb20=IWAD4817W: <trans-attribute> is unknown (EJB 2.0: 17.4.1).
+# IWAD4818.ejb20=IWAD4818W: Only one Style 1 <container-transaction> may exist for {0} (EJB 2.0: 17.4.1).
+# IWAD4819.ejb20=IWAD4819W: Only one Style 2 <container-transaction> may exist for {0} (EJB 2.0: 17.4.1).
+# IWAD4820.ejb20=IWAD4820W: At least one <method-param> must exist in a <method-params>.
+
+# IWAD4821.ejb20=IWAD4821W: <env-entry-value> must be a {0} (EJB 2.0: 20.2.1.2, 22.5).
+# IWAD4822.ejb20=IWAD4822W: <env-entry-name> must exist (EJB 2.0: 20.2.1.2, 22.5).
+# IWAD4823.ejb20=IWAD4823W: <env-entry-type> must exist (EJB 2.0: 20.2.1.2, 22.5).
+# IWAD4824.ejb20=IWAD4824W: <env-entry-name> must be unique within {0} (EJB 2.0: 20.2.1.2).
+# IWAD4825.ejb20=IWAD4825W: <env-entry-type> must be a legal type (EJB 2.0: 20.2.1.2, 22.5).
+# IWAD4826.ejb20=IWAD4826W: <env-entry-value> must be a String or a character (EJB 2.0: 20.2.1.2).
+
+# IWAD4828.ejb20=IWAD4828W: Conventionally this reference is located in the "ejb" subcontext (EJB 2.0: 20.3.1.1, 22.5).
+# IWAD4829.ejb20=IWAD4829W: This <env-entry> should be in an <ejb-ref> (EJB 2.0: 20.3.1.2).
+# IWAD4830.ejb20=IWAD4830W: This <env-entry> should be in an <ejb-local-ref> (EJB 2.0: 20.3.1.2).
+# IWAD4831.ejb20=IWAD4831W: <ejb-ref-type> must be {0} (EJB 2.0: 20.3.1.2, 20.3.2).
+# IWAD4832.ejb20=IWAD4832W: <ejb-ref> must exist (EJB 2.0: 20.3.1.2, 20.3.2).
+# IWAD4833.ejb20=IWAD4833W: <ejb-local-ref> must exist (EJB 2.0: 20.3.1.2, 20.3.2).
+# IWAD4834.ejb20=IWAD4834W: <home> must exist (EJB 2.0: 20.3.1.2, 20.3.2).
+# IWAD4835.ejb20=IWAD4835W: <local-home> must exist (EJB 2.0: 20.3.1.2, 20.3.2).
+# IWAD4836.ejb20=IWAD4836W: <remote> must exist (EJB 2.0: 20.3.1.2, 20.3.2).
+# IWAD4837.ejb20=IWAD4837W: <local-remote> must exist (EJB 2.0: 20.3.1.2, 20.3.2).
+# IWAD4838.ejb20=IWAD4838W: <ejb-ref> must be unique within {0} (EJB 2.0: 20.3.1.2).
+# IWAD4839.ejb20=IWAD4839W: <ejb-local-ref> must be unique within {0} (EJB 2.0: 20.3.1.2).
+# IWAD4840.ejb20=IWAD4840W: <home> {0} is not used by bean {1} (EJB 2.0: 20.3.1.2, 20.3.2).
+# IWAD4841.ejb20=IWAD4841W: <remote> {0} is not used by bean {1} (EJB 2.0: 20.3.1.2, 20.3.2).
+# IWAD4842.ejb20=IWAD4842W: <ejb-link> must exist (EJB 2.0: 20.3.1.2).
+
+# IWAD4843.ejb20=IWAD4843W: This <env-entry> must be a <resource-ref> (EJB 2.0: 20.4.1.2).
+# IWAD4844.ejb20=IWAD4844W: <res-ref-name> should not include the "java:com/env/" string (EJB 2.0: 20.4.1.2).
+# IWAD4845.ejb20=IWAD4845W: <res-auth> must be "Application" or "Container" (EJB 2.0: 20.4.1.2).
+# IWAD4846.ejb20=IWAD4846W: <res-sharing-scope> must be "Shareable" or "Unshareable" (EJB 2.0: 20.4.1.2).
+# IWAD4847.ejb20=IWAD4847W: <resource-ref> must be unique in bean {0} (EJB 2.0: 20.4.1.2).
+
+# IWAD4848.ejb20=IWAD4848W: Conventionally this is located in the "java:comp/env/jdbc" subcontext (EJB 2.0: 20.4.1.3, 20.5.1.1).
+# IWAD4849.ejb20=IWAD4849W: Conventionally this is located in the "java:comp/env/jms" subcontext (EJB 2.0: 20.4.1.3, 20.5.1.1).
+# IWAD4850.ejb20=IWAD4850W: Conventionally this is located in the "java:comp/env/mail" subcontext (EJB 2.0: 20.4.1.3, 20.5.1.1).
+# IWAD4851.ejb20=IWAD4851W: Conventionally this is located in the "java:comp/env/url" subcontext (EJB 2.0: 20.4.1.3, 20.5.1.1).
+
+# IWAD4852.ejb20=IWAD4852W: This <env-entry> must be a <resource-env-ref> (EJB 2.0: 20.5.1.2).
+# IWAD4853.ejb20=IWAD4853W: <resource-env-ref-name> should not include the "java:comp/env" string (EJB 2.0: 20.5.1.2).
+# IWAD4854.ejb20=IWAD4854W: A JMS Destination value must be either javax.jms.Queue or javax.jms.Topic (EJB 2.0: 20.5.1.2).
+# IWAD4855.ejb20=IWAD4855W: <resource-env-ref-name> must be unique in bean {0} (EJB 2.0: 20.5.1.2).
+
+# IWAD4856.ejb20=IWAD4856W: A <role-name> must exist (EJB 2.0: 21.2.5.3).
+# IWAD4857.ejb20=IWAD4857W: <role-name> {0} must be unique within bean {1} (EJB 2.0: 21.2.5.3).
+# IWAD4858.ejb20=IWAD4858W: A <role-name> must exist (EJB 2.0: 21.3.1).
+# IWAD4859.ejb20=IWAD4859W: <role-name> {0} must be unique within bean {1} (EJB 2.0: 21.3.1).
+# IWAD4860.ejb20=IWAD4860W: Security roles must exist (EJB 2.0: 21.3.1).
+
+# IWAD4931.ejb20=IWAD4931W: At least one <method> must exist in a <method-permission> (EJB 2.0: 21.3.2).
+# IWAD4932.ejb20=IWAD4932W: {0} must exist (EJB 2.0: 21.3.2) (EJB 2.0: 17.4.1).
+# IWAD4933.ejb20=IWAD4933W: No methods on {0} match this <method> (EJB 2.0: 21.3.2).
+# IWAD4934.ejb20=IWAD4934W: At least one <method-param> must exist in a <method-params>.
+
+# IWAD4866.ejb20=IWAD4866W: A <role-link> must exist (EJB 2.0: 21.3.3).
+# IWAD4867.ejb20=IWAD4867W: This <role-link> must not exist (EJB 2.0: 21.3.3).
+# IWAD4868.ejb20=IWAD4868W: {0} must exist (EJB 2.0: 21.3.3).
+
+# IWAD4869.ejb20=IWAD4869W: <security-identity> must be either "use-caller-identity" or "run-as" (EJB 2.0: 21.3.4).
+# IWAD4870.ejb20=IWAD4870W: <security-identity> must be "run-as" (EJB 2.0: 21.3.4).
+# IWAD4871.ejb20=IWAD4871W: Security role {0} must exist (EJB 2.0: 21.3.4.1).
+
+# IWAD4875.ejb20=IWAD4875W: <session-type> must be either "Stateful" or "Stateless" (EJB 2.0: 22.2, 22.5).
+# IWAD4876.ejb20=IWAD4876W: <transaction-type> must be either "Bean" or "Container" (EJB 2.0: 22.2, 22.5).
+# IWAD4877.ejb20=IWAD4877W: <persistence-type> must be either "Bean" or "Container" (EJB 2.0: 22.2, 22.5).
+# IWAD4879.ejb20=IWAD4879W: At least one <cmp-field> must exist (EJB 2.0: 22.2, 22.5).
+
+# IWAD4880.ejb20=IWAD4880W: <acknowledge-mode> must be either "Auto-acknowledge" or "Dups-ok-acknowledge" (EJB 2.0: 22.5).
+# IWAD4881.ejb20=IWAD4881W: <cascade-delete> must not exist (EJB 2.0: 22.5).
+# IWAD4882.ejb20=IWAD4882W: <cmp-version> must be either "1.x" or "2.x" (EJB 2.0: 22.5).
+# IWAD4883.ejb20=IWAD4883W: <cmr-field-name> must exist on {0} (EJB 2.0: 22.5).
+# IWAD4884.ejb20=IWAD4884W: <cmr-field-type> must be the same type as {0} (EJB 2.0: 22.5).
+# IWAD4885.ejb20=IWAD4885W: <cmr-field-type> must be either java.util.Collection or java.util.Set (EJB 2.0: 22.5).
+
+# IWAD4886.ejb20=IWAD4886W: <cmr-field-name> must begin with a lowercase letter (EJB 2.0: 22.5).
+# IWAD4887.ejb20=IWAD4887W: <destination-type> must be either javax.jms.Queue or javax.jms.Topic (EJB 2.0: 22.5).
+# IWAD4889.ejb20=IWAD4889W: {0} must exist (EJB 2.0: 22.5).
+# IWAD4890.ejb20=IWAD4890W: <ejb-ref-name> must be unique in bean {0} (EJB 2.0: 22.5).
+# IWAD4891.ejb20=IWAD4891W: <ejb-ref-type> must be "Entity" or "Session" (EJB 2.0: 22.5).
+
+# IWAD4862.ejb20=IWAD4862W: <result-type-mapping> must be "Remote" (EJB 2.0: 10.5.7).
+###############################################################################
+#
+# 2TC: end of messages which should not be translated
+#
+###############################################################################
+
+#
+# end of messages for the EJB 2.0 specification
+#
+
+#
+# end of validation messages
+#
+
+#
+# End EJB Validation strings
+#
+
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/schema/EJBCodegenHandler.exsd b/plugins/org.eclipse.jst.j2ee.ejb/schema/EJBCodegenHandler.exsd
new file mode 100644
index 0000000..de8b3f1
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/schema/EJBCodegenHandler.exsd
@@ -0,0 +1,114 @@
+<?xml version='1.0' encoding='UTF-8'?>

+<!-- Schema file written by PDE -->

+<schema targetNamespace="com.ibm.wtp.ejb">

+<annotation>

+      <appInfo>

+         <meta.schema plugin="com.ibm.wtp.ejb" id="EJBCodegenHandler" name="EJB Codegen Extension Handler"/>

+      </appInfo>

+      <documentation>

+         This is a temporary extension point. Needs to be factored out more completely. Interface between was extensions, handle like 11 relationships and hierarchies

+      </documentation>

+   </annotation>

+

+   <element name="extension">

+      <complexType>

+         <sequence>

+            <element ref="codegenExtensionHandler"/>

+         </sequence>

+         <attribute name="point" type="string" use="required">

+            <annotation>

+               <documentation>

+                  

+               </documentation>

+            </annotation>

+         </attribute>

+         <attribute name="id" type="string">

+            <annotation>

+               <documentation>

+                  

+               </documentation>

+            </annotation>

+         </attribute>

+         <attribute name="name" type="string">

+            <annotation>

+               <documentation>

+                  

+               </documentation>

+            </annotation>

+         </attribute>

+      </complexType>

+   </element>

+

+   <element name="codegenExtensionHandler">

+      <complexType>

+         <sequence>

+            <element ref="run"/>

+         </sequence>

+         <attribute name="id" type="string" use="required">

+            <annotation>

+               <documentation>

+                  

+               </documentation>

+            </annotation>

+         </attribute>

+      </complexType>

+   </element>

+

+   <element name="run">

+      <complexType>

+         <attribute name="class" type="string" use="required">

+            <annotation>

+               <documentation>

+                  

+               </documentation>

+            </annotation>

+         </attribute>

+      </complexType>

+   </element>

+

+   <annotation>

+      <appInfo>

+         <meta.section type="since"/>

+      </appInfo>

+      <documentation>

+         [Enter the first release in which this extension point appears.]

+      </documentation>

+   </annotation>

+

+   <annotation>

+      <appInfo>

+         <meta.section type="examples"/>

+      </appInfo>

+      <documentation>

+         [Enter extension point usage example here.]

+      </documentation>

+   </annotation>

+

+   <annotation>

+      <appInfo>

+         <meta.section type="apiInfo"/>

+      </appInfo>

+      <documentation>

+         [Enter API information here.]

+      </documentation>

+   </annotation>

+

+   <annotation>

+      <appInfo>

+         <meta.section type="implementation"/>

+      </appInfo>

+      <documentation>

+         [Enter information about supplied implementation of this extension point.]

+      </documentation>

+   </annotation>

+

+   <annotation>

+      <appInfo>

+         <meta.section type="copyright"/>

+      </appInfo>

+      <documentation>

+         

+      </documentation>

+   </annotation>

+

+</schema>

diff --git a/plugins/org.eclipse.jst.j2ee.ejb/templates/_class.template b/plugins/org.eclipse.jst.j2ee.ejb/templates/_class.template
new file mode 100644
index 0000000..17fc58a
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/templates/_class.template
@@ -0,0 +1,40 @@
+<%
+	if (model.isPublic()) { 
+%>
+public 
+<% 
+	} 
+
+	if (model.isAbstract()) { 
+%>abstract 
+<%
+	}
+
+	if (model.isFinal()) {
+%>final 
+<%
+	}
+%>class <%= model.getClassName() %>
+<%
+	String superClass = model.getSuperclassName();
+ 	if (superClass != null && superClass.length() > 0) {
+%> extends <%= superClass %>
+<%
+	}
+
+	List<String> interfaces = model.getInterfaces(); 
+ 	if ( interfaces.size() > 0) { 
+%> implements 
+<%
+	}
+	
+ 	for (int i = 0; i < interfaces.size(); i++) {
+   		String INTERFACE = interfaces.get(i);
+   		if (i > 0) {
+%>, 
+<%
+		}
+%><%= INTERFACE %>
+<%
+	}
+%> {
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/templates/_constructors.template b/plugins/org.eclipse.jst.j2ee.ejb/templates/_constructors.template
new file mode 100644
index 0000000..1b938b9
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/templates/_constructors.template
@@ -0,0 +1,31 @@
+<% 
+	if (!model.hasEmptySuperclassConstructor()) { 
+%>
+
+    /**
+     * Default constructor. 
+     */
+    public <%= model.getClassName() %>() {
+        // TODO Auto-generated constructor stub
+    }
+<% 
+	} 
+
+	if (model.shouldGenSuperclassConstructors()) {
+		List<Constructor> constructors = model.getConstructors();
+		for (Constructor constructor : constructors) {
+			if (constructor.isPublic() || constructor.isProtected()) { 
+%>
+       
+    /**
+     * @see <%= model.getSuperclassName() %>#<%= model.getSuperclassName() %>(<%= constructor.getParamsForJavadoc() %>)
+     */
+    public <%= model.getClassName() %>(<%= constructor.getParamsForDeclaration() %>) {
+        super(<%= constructor.getParamsForCall() %>);
+        // TODO Auto-generated constructor stub
+    }
+<%
+			} 
+		} 
+	} 
+%>
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/templates/_flags.template b/plugins/org.eclipse.jst.j2ee.ejb/templates/_flags.template
new file mode 100644
index 0000000..7e6afd4
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/templates/_flags.template
@@ -0,0 +1,3 @@
+<%
+	model.removeFlags(CreateJavaEEArtifactTemplateModel.FLAG_QUALIFIED_SUPERCLASS_NAME); 
+%>
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/templates/_imports.template b/plugins/org.eclipse.jst.j2ee.ejb/templates/_imports.template
new file mode 100644
index 0000000..fde7b4b
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/templates/_imports.template
@@ -0,0 +1,9 @@
+<% 
+	Collection<String> imports = model.getImports();
+	for (String anImport : imports) { 
+%>
+import <%= anImport %>;
+<% 
+	}
+%>
+
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/templates/_methods.template b/plugins/org.eclipse.jst.j2ee.ejb/templates/_methods.template
new file mode 100644
index 0000000..5fe3d10
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/templates/_methods.template
@@ -0,0 +1,23 @@
+<%
+	if (model.shouldImplementAbstractMethods()) {
+		for (Method method : model.getUnimplementedMethods()) { 
+%>
+
+	/**
+     * @see <%= method.getContainingJavaClass() %>#<%= method.getName() %>(<%= method.getParamsForJavadoc() %>)
+     */
+    public <%= method.getReturnType() %> <%= method.getName() %>(<%= method.getParamsForDeclaration() %>) {
+        // TODO Auto-generated method stub
+<% 
+			String defaultReturnValue = method.getDefaultReturnValue();
+			if (defaultReturnValue != null) { 
+%>
+			return <%= defaultReturnValue %>;
+<%
+			} 
+%>
+    }
+<% 
+		}
+	} 
+%>
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/templates/_package.template b/plugins/org.eclipse.jst.j2ee.ejb/templates/_package.template
new file mode 100644
index 0000000..f279df7
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/templates/_package.template
@@ -0,0 +1,8 @@
+<%
+	if (model.getJavaPackageName() != null && model.getJavaPackageName().length() > 0) {
+%>
+package <%= model.getJavaPackageName() %>;
+<%
+	}
+%>
+
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/templates/ejbtimer.javajet b/plugins/org.eclipse.jst.j2ee.ejb/templates/ejbtimer.javajet
new file mode 100644
index 0000000..edd04b7
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/templates/ejbtimer.javajet
@@ -0,0 +1,24 @@
+<%@ jet package="org.eclipse.jst.j2ee.ejb.internal.operations" 
+	imports="java.util.* org.eclipse.jst.j2ee.internal.common.operations.*" 
+	class="EjbTimerTemplate" 
+%>
+<% AddEjbTimerTemplateModel model = (AddEjbTimerTemplateModel) argument; %>
+<%@ include file="_flags.template" %>
+<%@ include file="_package.template" %>
+<%@ include file="_imports.template" %>
+@Stateless
+<%@ include file="_class.template" %>
+<%@ include file="_constructors.template" %>
+<%@ include file="_methods.template" %>
+	<%
+		StringBuilder schedule = new StringBuilder(model.getProperty(AddEjbTimerDataModelProvider.SCHEDULE));
+		if (model.isNonPersistent()) {
+			schedule.append(", persistent=false");
+		}
+	%>
+	@SuppressWarnings("unused")
+	@Schedule(<%= schedule.toString().trim() %>)
+    private void scheduledTimeout(final Timer t) {
+        System.out.println("@Schedule called at: " + new java.util.Date());
+    }
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/templates/localBusinessInterface.javajet b/plugins/org.eclipse.jst.j2ee.ejb/templates/localBusinessInterface.javajet
new file mode 100644
index 0000000..6b5550c
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/templates/localBusinessInterface.javajet
@@ -0,0 +1,24 @@
+<%@ jet package="org.eclipse.jst.j2ee.ejb.internal.operations" 
+	class="LocalBusinessInterfaceTemplate" 
+%>
+<% CreateSessionBeanTemplateModel model = (CreateSessionBeanTemplateModel) argument; %>
+<%
+	if (model.getBusinessInterfaceJavaPackageName() != null && model.getBusinessInterfaceJavaPackageName().length() > 0) {
+%>
+package <%=model.getBusinessInterfaceJavaPackageName()%>;
+<%
+	}
+%>
+
+<%
+	if (model.addBusinessAnnotationToInterface()) {
+%>
+import javax.ejb.Local;
+
+@Local
+<%
+	}
+%>
+public interface <%=model.getBusinessInterfaceClassName()%> {
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/templates/localComponentInterface.javajet b/plugins/org.eclipse.jst.j2ee.ejb/templates/localComponentInterface.javajet
new file mode 100644
index 0000000..debf313
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/templates/localComponentInterface.javajet
@@ -0,0 +1,17 @@
+<%@ jet package="org.eclipse.jst.j2ee.ejb.internal.operations" 
+	class="LocalComponentInterfaceTemplate" 
+%>
+<% CreateSessionBeanTemplateModel model = (CreateSessionBeanTemplateModel) argument; %>
+<%
+	if (model.getLocalComponentPackage() != null && model.getLocalComponentPackage().length() > 0) {
+%>
+package <%=model.getLocalComponentPackage()%>;
+<%
+	}
+%>
+
+import javax.ejb.EJBLocalObject;
+
+public interface <%= model.getLocalComponentClassSimpleName() %> extends EJBLocalObject {
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/templates/localHomeInterface.javajet b/plugins/org.eclipse.jst.j2ee.ejb/templates/localHomeInterface.javajet
new file mode 100644
index 0000000..dc113af
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/templates/localHomeInterface.javajet
@@ -0,0 +1,23 @@
+<%@ jet package="org.eclipse.jst.j2ee.ejb.internal.operations" 
+	class="LocalHomeInterfaceTemplate" 
+%>
+<% CreateSessionBeanTemplateModel model = (CreateSessionBeanTemplateModel) argument; %>
+<%
+	if (model.getLocalHomePackage() != null && model.getLocalHomePackage().length() > 0) {
+%>
+package <%=model.getLocalHomePackage()%>;
+<%
+	}
+%>
+
+import javax.ejb.CreateException;
+import javax.ejb.EJBLocalHome;
+<% if(!model.getLocalComponentPackage().equals(model.getLocalHomePackage())){%>
+import <%= model.getLocalComponentPackage()%>.<%= model.getLocalComponentClassSimpleName()%>;
+<%}%>
+
+public interface <%=model.getLocalHomeClassSimpleName()%> extends EJBLocalHome {
+
+	public <%= model.getLocalComponentClassSimpleName() %> create() throws CreateException;
+	
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/templates/messageDrivenBean.javajet b/plugins/org.eclipse.jst.j2ee.ejb/templates/messageDrivenBean.javajet
new file mode 100644
index 0000000..546b44a
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/templates/messageDrivenBean.javajet
@@ -0,0 +1,30 @@
+<%@ jet package="org.eclipse.jst.j2ee.ejb.internal.operations" 
+	imports="java.util.* org.eclipse.jst.j2ee.internal.common.operations.*" 
+	class="MessageDrivenBeanTemplate" 
+%>
+<% CreateMessageDrivenBeanTemplateModel model = (CreateMessageDrivenBeanTemplateModel) argument; %>
+<%@ include file="_flags.template" %>
+<%@ include file="_package.template" %>
+<%@ include file="_imports.template" %>
+<%@ include file="messageDrivenBean_classHeader.template" %>
+<%@ include file="_class.template" %>
+<%@ include file="_constructors.template" %>
+<%@ include file="_methods.template" %>
+<%
+	if (model.shouldImplementAbstractMethods()) {
+		if (model.isJMS()) { 
+%>
+	
+	/**
+     * @see MessageListener#onMessage(Message)
+     */
+    public void onMessage(Message message) {
+        // TODO Auto-generated method stub
+        
+    }
+<%
+		}
+	}
+%>
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/templates/messageDrivenBean_classHeader.template b/plugins/org.eclipse.jst.j2ee.ejb/templates/messageDrivenBean_classHeader.template
new file mode 100644
index 0000000..ef7117d
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/templates/messageDrivenBean_classHeader.template
@@ -0,0 +1,64 @@
+/**
+ * Message-Driven Bean implementation class for: <%=model.getClassName()%>
+ */
+@MessageDriven
+<%
+	Map<String, Object> params = model.getClassAnnotationParams();
+	if (!params.isEmpty()) { 
+%>(
+<%
+		boolean needComma = false;
+		boolean needNewLine = false;
+		Map<String, String> activationConfigProperties = (Map<String, String>) params.get(CreateMessageDrivenBeanTemplateModel.ATT_ACTIVATION_CONFIG);
+		if (activationConfigProperties.size() > 0) {
+%>
+		activationConfig = { 
+<%
+			Set<String> props = activationConfigProperties.keySet();
+			for (String prop : props) {
+				if (needComma) {
+%>, 
+<%
+				}
+				
+				String value = activationConfigProperties.get(prop);
+%>@ActivationConfigProperty(
+				propertyName = "<%= prop %>", propertyValue = "<%= value %>")
+<%				
+				needComma = true;
+			}
+%>
+		}
+<%
+			needNewLine = true;
+		}
+		
+		Set<String> keys = params.keySet();
+		for (String key : keys) {
+			Object obj = params.get(key);
+			if (obj instanceof String) {
+				if (needComma) { 
+%>, 
+<%
+					if (needNewLine) {
+%>
+		
+<%
+					}
+				}
+				String value = (String) obj;
+%><%= key %> = <%= value %>
+<%
+			}
+			needComma = true;
+		} 
+%>)
+<%
+	}
+	
+	if (!model.isContainerType()) {
+%>
+@TransactionManagement(TransactionManagementType.BEAN)
+<%
+	}
+%>
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/templates/remoteBusinessInterface.javajet b/plugins/org.eclipse.jst.j2ee.ejb/templates/remoteBusinessInterface.javajet
new file mode 100644
index 0000000..74b3255
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/templates/remoteBusinessInterface.javajet
@@ -0,0 +1,24 @@
+<%@ jet package="org.eclipse.jst.j2ee.ejb.internal.operations" 
+	class="RemoteBusinessInterfaceTemplate" 
+%>
+<% CreateSessionBeanTemplateModel model = (CreateSessionBeanTemplateModel) argument; %>
+<%
+	if (model.getBusinessInterfaceJavaPackageName() != null && model.getBusinessInterfaceJavaPackageName().length() > 0) {
+%>
+package <%=model.getBusinessInterfaceJavaPackageName()%>;
+<%
+	}
+%>
+
+<%
+	if (model.addBusinessAnnotationToInterface()) {
+%>
+import javax.ejb.Remote;
+
+@Remote
+<%
+	}
+%>
+public interface <%=model.getBusinessInterfaceClassName()%> {
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/templates/remoteComponentInterface.javajet b/plugins/org.eclipse.jst.j2ee.ejb/templates/remoteComponentInterface.javajet
new file mode 100644
index 0000000..3ded02d
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/templates/remoteComponentInterface.javajet
@@ -0,0 +1,17 @@
+<%@ jet package="org.eclipse.jst.j2ee.ejb.internal.operations" 
+	class="RemoteComponentInterfaceTemplate" 
+%>
+<% CreateSessionBeanTemplateModel model = (CreateSessionBeanTemplateModel) argument; %>
+<%
+	if (model.getRemoteComponentPackage() != null && model.getRemoteComponentPackage().length() > 0) {
+%>
+package <%=model.getRemoteComponentPackage()%>;
+<%
+	}
+%>
+
+import javax.ejb.EJBObject;
+
+public interface <%= model.getRemoteComponentClassSimpleName() %> extends EJBObject {
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/templates/remoteHomeInterface.javajet b/plugins/org.eclipse.jst.j2ee.ejb/templates/remoteHomeInterface.javajet
new file mode 100644
index 0000000..fcb36a7
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/templates/remoteHomeInterface.javajet
@@ -0,0 +1,25 @@
+<%@ jet package="org.eclipse.jst.j2ee.ejb.internal.operations" 
+	class="RemoteHomeInterfaceTemplate" 
+%>
+<% CreateSessionBeanTemplateModel model = (CreateSessionBeanTemplateModel) argument; %>
+<%
+	if (model.getRemoteHomePackage() != null && model.getRemoteHomePackage().length() > 0) {
+%>
+package <%=model.getRemoteHomePackage()%>;
+<%
+	}
+%>
+
+import java.rmi.RemoteException;
+
+import javax.ejb.CreateException;
+import javax.ejb.EJBHome;
+<% if(!model.getRemoteComponentPackage().equals(model.getRemoteHomePackage())){%>
+import <%= model.getRemoteComponentPackage() %>.<%= model.getRemoteComponentClassSimpleName() %>;
+<%}%>
+
+public interface <%=model.getRemoteHomeClassSimpleName()%> extends EJBHome {
+
+	public <%= model.getRemoteComponentClassSimpleName() %> create() throws CreateException, RemoteException;
+	
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/templates/sessionBean.javajet b/plugins/org.eclipse.jst.j2ee.ejb/templates/sessionBean.javajet
new file mode 100644
index 0000000..172794c
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/templates/sessionBean.javajet
@@ -0,0 +1,14 @@
+<%@ jet package="org.eclipse.jst.j2ee.ejb.internal.operations" 
+	imports="java.util.* org.eclipse.jst.j2ee.internal.common.operations.*" 
+	class="SessionBeanTemplate" 
+%>
+<% CreateSessionBeanTemplateModel model = (CreateSessionBeanTemplateModel) argument; %>
+<%@ include file="_flags.template" %>
+<%@ include file="_package.template" %>
+<%@ include file="_imports.template" %>
+<%@ include file="sessionBean_classHeader.template" %>
+<%@ include file="_class.template" %>
+<%@ include file="_constructors.template" %>
+<%@ include file="_methods.template" %>
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/templates/sessionBean_classHeader.template b/plugins/org.eclipse.jst.j2ee.ejb/templates/sessionBean_classHeader.template
new file mode 100644
index 0000000..41ffc28
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.ejb/templates/sessionBean_classHeader.template
@@ -0,0 +1,117 @@
+/**
+ * Session Bean implementation class <%= model.getClassName() %>
+ */
+<%= model.getClassAnnotation() %>
+<%
+	Map<String, String> params = model.getClassAnnotationParams();
+	if (!params.isEmpty()) { 
+%>(
+<%
+		Set<String> keys = params.keySet();
+		boolean needComma = false;
+		for (String key : keys) {
+			if (needComma) {
+%>, 
+<%
+			}
+			
+			String value = params.get(key);
+%><%= key %> = "<%= value %>"
+<%
+			needComma = true;
+  		}
+%>)
+<%
+	}
+
+	if (!model.isContainerType()) {
+%>
+@TransactionManagement(TransactionManagementType.BEAN)
+<%
+	}
+
+	List<BusinessInterface> localInterfaces = null;
+	if (model.addBusinessAnnotationToBeanClass()){
+		localInterfaces = model.getLocalBusinessInterfaces();
+	}
+	else {
+		localInterfaces = model.getExistingLocalBusinessInterfaces();
+	}
+	if (!localInterfaces.isEmpty()) {
+		String open = "", close = "";
+		if (localInterfaces.size() > 1){
+			open = "{";
+			close = "}";
+		}
+%>
+@Local(<%= open %>
+<%
+		boolean needComma = false;
+		for (BusinessInterface iface : localInterfaces) {
+			if (needComma) {
+%>, 
+<%
+			}
+%><%= iface.getSimpleName() %>.class
+<%
+			needComma = true;
+ 		}
+%><%= close %>)
+<%
+	}
+
+	List<BusinessInterface> remoteInterfaces = null;
+	if (model.addBusinessAnnotationToBeanClass()){
+		remoteInterfaces = model.getRemoteBusinessInterfaces();
+	}
+	else{
+		remoteInterfaces = model.getExistingRemoteBusinessInterfaces();
+	}
+	if (!remoteInterfaces.isEmpty()) {
+		String open = "", close = "";
+		if (remoteInterfaces.size() > 1){
+			open = "{";
+			close = "}";
+		}
+%>
+@Remote(<%= open %>
+<%
+		boolean needComma = false;
+		for (BusinessInterface iface : remoteInterfaces) {
+			if (needComma) {
+%>, 
+<%
+			}
+%><%= iface.getSimpleName() %>.class
+<%
+			needComma = true;
+		}
+%><%= close %>)
+<%
+	}
+	
+	if (model.isNoInterfaceChecked()) {
+%>
+@LocalBean
+<%
+	}
+		
+	if (model.isLocalHomeChecked()) {
+%>
+@LocalHome(<%=model.getLocalHomeClassSimpleName()%>.class)
+<%
+	}
+
+	if (model.isRemoteHomeChecked()) {
+%>
+@RemoteHome(<%=model.getRemoteHomeClassSimpleName()%>.class)
+<%
+	}
+%>
+<%
+	if (model.isAsynchronous()) {
+%>
+@Asynchronous
+<%
+	}
+%>
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.jca.ui/pom.xml b/plugins/org.eclipse.jst.j2ee.jca.ui/pom.xml
index 441cc44..21a0205 100644
--- a/plugins/org.eclipse.jst.j2ee.jca.ui/pom.xml
+++ b/plugins/org.eclipse.jst.j2ee.jca.ui/pom.xml
@@ -15,9 +15,8 @@
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
+    <artifactId>javaee.plugins</artifactId>
     <version>3.6.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
   </parent>
 
   <groupId>org.eclipse.webtools.javaee</groupId>
diff --git a/plugins/org.eclipse.jst.j2ee.jca/pom.xml b/plugins/org.eclipse.jst.j2ee.jca/pom.xml
index c2a37c2..9c1ff8b 100644
--- a/plugins/org.eclipse.jst.j2ee.jca/pom.xml
+++ b/plugins/org.eclipse.jst.j2ee.jca/pom.xml
@@ -15,9 +15,8 @@
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
+    <artifactId>javaee.plugins</artifactId>
     <version>3.6.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
   </parent>
 
   <groupId>org.eclipse.webtools.javaee</groupId>
diff --git a/plugins/org.eclipse.jst.j2ee.navigator.ui/pom.xml b/plugins/org.eclipse.jst.j2ee.navigator.ui/pom.xml
index e38736a..197ccdc 100644
--- a/plugins/org.eclipse.jst.j2ee.navigator.ui/pom.xml
+++ b/plugins/org.eclipse.jst.j2ee.navigator.ui/pom.xml
@@ -15,9 +15,8 @@
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
+    <artifactId>javaee.plugins</artifactId>
     <version>3.6.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
   </parent>
 
   <groupId>org.eclipse.webtools.javaee</groupId>
diff --git a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/dialogs/TwoArrayQuickSorter.java b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/dialogs/TwoArrayQuickSorter.java
index 855f5fb..08a125d 100644
--- a/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/dialogs/TwoArrayQuickSorter.java
+++ b/plugins/org.eclipse.jst.j2ee.ui/j2ee_ui/org/eclipse/jst/j2ee/internal/dialogs/TwoArrayQuickSorter.java
@@ -18,7 +18,7 @@
  */
 import java.util.Comparator;
 
-import org.eclipse.jface.util.Assert;
+import org.eclipse.core.runtime.Assert;
 
 /**
  * Quick sort to sort key-value pairs. The keys and arrays are specified in
diff --git a/plugins/org.eclipse.jst.j2ee.ui/pom.xml b/plugins/org.eclipse.jst.j2ee.ui/pom.xml
index b0d418e..61968fd 100644
--- a/plugins/org.eclipse.jst.j2ee.ui/pom.xml
+++ b/plugins/org.eclipse.jst.j2ee.ui/pom.xml
@@ -15,9 +15,8 @@
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
+    <artifactId>javaee.plugins</artifactId>
     <version>3.6.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
   </parent>
 
   <groupId>org.eclipse.webtools.javaee</groupId>
diff --git a/plugins/org.eclipse.jst.j2ee.web/pom.xml b/plugins/org.eclipse.jst.j2ee.web/pom.xml
index 58dd678..ffa549b 100644
--- a/plugins/org.eclipse.jst.j2ee.web/pom.xml
+++ b/plugins/org.eclipse.jst.j2ee.web/pom.xml
@@ -15,9 +15,8 @@
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
+    <artifactId>javaee.plugins</artifactId>
     <version>3.6.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
   </parent>
 
   <groupId>org.eclipse.webtools.javaee</groupId>
diff --git a/plugins/org.eclipse.jst.j2ee.webservice.ui/META-INF/MANIFEST.MF b/plugins/org.eclipse.jst.j2ee.webservice.ui/META-INF/MANIFEST.MF
index 08bc93e..34e23c1 100644
--- a/plugins/org.eclipse.jst.j2ee.webservice.ui/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.jst.j2ee.webservice.ui/META-INF/MANIFEST.MF
@@ -2,11 +2,11 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.jst.j2ee.webservice.ui; singleton:=true
-Bundle-Version: 1.1.600.qualifier
+Bundle-Version: 1.1.700.qualifier
 Bundle-Activator: org.eclipse.jst.j2ee.internal.webservice.plugin.WebServiceUIPlugin
 Bundle-Vendor: %pluginVendor
 Bundle-Localization: plugin
-Export-Package: org.eclipse.jst.j2ee.internal.webservice;x-internal:=true,
+Export-Package: org.eclipse.jst.j2ee.internal.webservice;x-friends:="org.eclipse.jst.ws.consumption",
  org.eclipse.jst.j2ee.internal.webservice.plugin;x-internal:=true,
  org.eclipse.jst.j2ee.internal.webservice.startup;x-internal:=true
 Require-Bundle: org.eclipse.core.resources;bundle-version="[3.2.0,4.0.0)",
@@ -24,9 +24,7 @@
  org.eclipse.ui.ide;bundle-version="[3.2.0,4.0.0)",
  org.eclipse.wst.common.emf;bundle-version="[1.2.0,2.0.0)",
  org.eclipse.jst.j2ee.webservice;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.wsdl;bundle-version="[1.2.0,1.3.0)",
  org.eclipse.jem.util;bundle-version="[2.0.0,3.0.0)",
- javax.wsdl;bundle-version="[1.5.0,1.6.0)",
  org.eclipse.jst.common.frameworks;bundle-version="[1.1.0,1.2.0)",
  org.eclipse.ui.navigator;bundle-version="[3.2.0,4.0.0)",
  org.eclipse.ui.navigator.resources;bundle-version="[3.2.0,4.0.0)",
diff --git a/plugins/org.eclipse.jst.j2ee.webservice.ui/plugin.xml b/plugins/org.eclipse.jst.j2ee.webservice.ui/plugin.xml
index 0a4e598..1eaec71 100644
--- a/plugins/org.eclipse.jst.j2ee.webservice.ui/plugin.xml
+++ b/plugins/org.eclipse.jst.j2ee.webservice.ui/plugin.xml
@@ -16,8 +16,20 @@
          	   <instanceof value="org.eclipse.jst.j2ee.internal.webservice.WebServiceNavigatorGroup"/>
                <instanceof value="org.eclipse.jst.j2ee.webservice.wsdd.WebServiceDescription"/>
                <instanceof value="org.eclipse.jst.j2ee.internal.webservice.WebServiceNavigatorGroupType"/>
-               <instanceof value="org.eclipse.wst.wsdl.util.WSDLResourceImpl"/>
-               <instanceof value="org.eclipse.wst.wsdl.Service"/>
+               <!-- <instanceof value="org.eclipse.wst.wsdl.util.WSDLResourceImpl"/> -->
+			   <and>
+			   		<instanceof value="org.eclipse.emf.ecore.resource.Resource"/>
+			   		<test
+                     property="org.eclipse.jst.j2ee.webservice.ui.isWsdlResource">
+	               </test>			   		
+			   </and>
+			   <!-- <instanceof value="org.eclipse.wst.wsdl.Service"/> -->
+               <and>
+               		<instanceof value="org.eclipse.emf.ecore.EObject"/>
+               		<test
+                     	property="org.eclipse.jst.j2ee.webservice.ui.isService">
+               		</test>
+               </and>
                <and>
                  <instanceof value="org.eclipse.emf.ecore.EObject"/>
                   <or>
@@ -46,7 +58,13 @@
          	   <instanceof value="org.eclipse.jst.j2ee.internal.webservice.WebServiceNavigatorGroup"/>
                <instanceof value="org.eclipse.jst.j2ee.webservice.wsdd.WebServiceDescription"/>
                <instanceof value="org.eclipse.jst.j2ee.internal.webservice.WebServiceNavigatorGroupType"/>
-               <instanceof value="org.eclipse.wst.wsdl.util.WSDLResourceImpl"/>
+               <!--  <instanceof value="org.eclipse.wst.wsdl.util.WSDLResourceImpl"/> -->
+			   <and>
+			   		<instanceof value="org.eclipse.emf.ecore.resource.Resource"/>
+			   		<test
+                     property="org.eclipse.jst.j2ee.webservice.ui.isWsdlResource">
+	               </test>			   		
+			   </and>
                <and>
                  <instanceof value="org.eclipse.emf.ecore.EObject"/>
                   <or>
@@ -108,8 +126,13 @@
 				</and>
 				<instanceof
 					value="org.eclipse.jst.j2ee.internal.provider.J2EEItemProvider" />
-				<instanceof
-					value="org.eclipse.wst.wsdl.util.WSDLResourceImpl" />
+				<!--	 <instanceof value="org.eclipse.wst.wsdl.util.WSDLResourceImpl" /> -->
+ 			    <and>
+			   		<instanceof value="org.eclipse.emf.ecore.resource.Resource"/>
+			   		<test
+                     property="org.eclipse.jst.j2ee.webservice.ui.isWsdlResource">
+	               </test>			   		
+			    </and>
 			  </or>
 			</enablement>
 		</actionProvider> 
@@ -129,37 +152,27 @@
       		</includes>  
       </viewerContentBinding>
    </extension>
-	
-   <extension 
-  		point="org.eclipse.core.runtime.adapters">
-    <factory 
-      class="org.eclipse.jst.j2ee.internal.webservice.WebServiceAdapterFactory" 
-      adaptableType="org.eclipse.wst.wsdl.Service">
-      <adapter type="org.eclipse.core.resources.IResource"/>
-      <adapter type="org.eclipse.core.resources.IFile"/>
-    </factory>
-    <factory 
-      class="org.eclipse.jst.j2ee.internal.webservice.WebServiceAdapterFactory" 
-      adaptableType="org.eclipse.jst.j2ee.webservice.wsclient.ServiceRef">
-      <adapter type="org.eclipse.core.resources.IResource"/>
-      <adapter type="org.eclipse.core.resources.IFile"/>
-    </factory>
-     <factory 
-      class="org.eclipse.jst.j2ee.internal.webservice.WsdlResourceAdapterFactory" 
-      adaptableType="org.eclipse.wst.wsdl.util.WSDLResourceImpl">
-      <adapter type="org.eclipse.core.resources.IResource"/>
-      <adapter type="org.eclipse.core.resources.IFile"/>
-    </factory>
-    <factory 
-      class="org.eclipse.jst.j2ee.internal.webservice.WebServiceAdapterFactory" 
-      adaptableType="org.eclipse.jst.j2ee.webservice.wsdd.ServiceImplBean">
-      <adapter type="org.eclipse.core.resources.IResource"/>
-      <adapter type="org.eclipse.core.resources.IFile"/>
-    </factory>
-    
-  </extension>
+
    <extension
          point="org.eclipse.ui.startup">
       <startup class="org.eclipse.jst.j2ee.internal.webservice.startup.WebserviceListener"/>
    </extension>
+   
+   <extension
+         point="org.eclipse.core.expressions.propertyTesters">
+      <propertyTester
+            class="org.eclipse.jst.j2ee.internal.webservice.WebServicePropertyTester"
+            id="org.eclipse.jst.j2ee.webservice.ui.serviceTester"
+            namespace="org.eclipse.jst.j2ee.webservice.ui"
+            properties="isService"
+            type="org.eclipse.emf.ecore.EObject">
+      </propertyTester>
+      <propertyTester
+            class="org.eclipse.jst.j2ee.internal.webservice.WebServicePropertyTester"
+            id="org.eclipse.jst.j2ee.webservice.ui.wsdlTester"
+            namespace="org.eclipse.jst.j2ee.webservice.ui"
+            properties="isWsdlResource"
+            type="org.eclipse.emf.ecore.resource.Resource">
+       </propertyTester>
+   </extension>
 </plugin>
diff --git a/plugins/org.eclipse.jst.j2ee.webservice.ui/pom.xml b/plugins/org.eclipse.jst.j2ee.webservice.ui/pom.xml
index 43a04fb..ac99aa6 100644
--- a/plugins/org.eclipse.jst.j2ee.webservice.ui/pom.xml
+++ b/plugins/org.eclipse.jst.j2ee.webservice.ui/pom.xml
@@ -15,13 +15,12 @@
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
+    <artifactId>javaee.plugins</artifactId>
     <version>3.6.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
   </parent>
 
   <groupId>org.eclipse.webtools.javaee</groupId>
   <artifactId>org.eclipse.jst.j2ee.webservice.ui</artifactId>
-  <version>1.1.600-SNAPSHOT</version>
+  <version>1.1.700-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
 </project>
diff --git a/plugins/org.eclipse.jst.j2ee.webservice.ui/webservices_ui/org/eclipse/jst/j2ee/internal/webservice/WebServicePropertyTester.java b/plugins/org.eclipse.jst.j2ee.webservice.ui/webservices_ui/org/eclipse/jst/j2ee/internal/webservice/WebServicePropertyTester.java
new file mode 100644
index 0000000..d3feccf
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.webservice.ui/webservices_ui/org/eclipse/jst/j2ee/internal/webservice/WebServicePropertyTester.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2017 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.internal.webservice;
+
+import org.eclipse.core.expressions.PropertyTester;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.jst.j2ee.internal.webservices.WSDLServiceExtManager;
+import org.eclipse.jst.j2ee.internal.webservices.WSDLServiceHelper;
+
+@SuppressWarnings("restriction")
+public class WebServicePropertyTester extends PropertyTester {
+
+	private static final String PROPERTY_WSDL_RESOURCE = "isWsdlResource"; //$NON-NLS-1$
+	private static final String PROPERTY_SERVICE = "isService"; //$NON-NLS-1$
+	
+	public boolean test(Object receiver, String property, Object[] args, Object expectedValue) {
+		
+		WSDLServiceHelper serviceHelper = WSDLServiceExtManager.getServiceHelper();
+		if (serviceHelper == null) {
+			return false;
+		}
+		if (receiver instanceof EObject) {
+			if (PROPERTY_SERVICE.equals(property)) {
+				return serviceHelper.isService(receiver);
+			}
+		} else if (receiver instanceof Resource) {
+			if (PROPERTY_WSDL_RESOURCE.equals(property)) {
+				return serviceHelper.isWSDLResource(receiver);
+			}
+		}
+		return false;
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.webservice.ui/webservices_ui/org/eclipse/jst/j2ee/internal/webservice/WebServicesNavigatorGroupOpenListener.java b/plugins/org.eclipse.jst.j2ee.webservice.ui/webservices_ui/org/eclipse/jst/j2ee/internal/webservice/WebServicesNavigatorGroupOpenListener.java
index 3991451..fae5533 100644
--- a/plugins/org.eclipse.jst.j2ee.webservice.ui/webservices_ui/org/eclipse/jst/j2ee/internal/webservice/WebServicesNavigatorGroupOpenListener.java
+++ b/plugins/org.eclipse.jst.j2ee.webservice.ui/webservices_ui/org/eclipse/jst/j2ee/internal/webservice/WebServicesNavigatorGroupOpenListener.java
@@ -17,6 +17,7 @@
 import java.util.List;
 
 import org.eclipse.core.resources.IFile;
+import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.jface.action.IMenuManager;
 import org.eclipse.jface.viewers.IStructuredSelection;
@@ -33,8 +34,6 @@
 import org.eclipse.ui.navigator.ICommonActionExtensionSite;
 import org.eclipse.ui.navigator.ICommonMenuConstants;
 import org.eclipse.wst.common.internal.emfworkbench.WorkbenchResourceHelper;
-import org.eclipse.wst.wsdl.internal.impl.ServiceImpl;
-import org.eclipse.wst.wsdl.util.WSDLResourceImpl;
 
 /**
  * @author jlanuti
@@ -66,8 +65,8 @@
 			Object selectedObject = selection.getFirstElement();
 			if (serviceHelper==null)
 				return;
-			else if (selectedObject instanceof ServiceImpl) {
-				WsddResource resource = WebServicesManager.getInstance().getWsddResource((ServiceImpl)selectedObject);
+			else if (serviceHelper.isService(selectedObject)) {
+				WsddResource resource = WebServicesManager.getInstance().getWsddResource((EObject)selectedObject);
 				if (resource == null) {
 					openExternalWSDLAction.selectionChanged(selection);
 					super.setContext(aContext);
@@ -100,12 +99,12 @@
 		if (getContext()==null || getContext().getSelection().isEmpty())
 			return;
 		IStructuredSelection selection = (IStructuredSelection) getContext().getSelection();
-		
-		if (selection.getFirstElement() instanceof ServiceImpl) {
-			ServiceImpl wsdl = (ServiceImpl) selection.getFirstElement();
-			WsddResource resource = WebServicesManager.getInstance().getWsddResource(wsdl);
+		Object first = selection.getFirstElement();
+		WSDLServiceHelper helper =	WSDLServiceExtManager.getServiceHelper();
+		if(helper != null && helper.isService(first)) {
+			WsddResource resource = WebServicesManager.getInstance().getWsddResource((EObject)first);
 			if (resource == null) {
-				IFile wsdlFile = WorkbenchResourceHelper.getFile(wsdl);
+				IFile wsdlFile = WorkbenchResourceHelper.getFile((EObject)first);
 				if (wsdlFile == null || !wsdlFile.exists()) {
 					openExternalWSDLAction.selectionChanged(selection);
 					theActionBars.setGlobalActionHandler(ICommonActionConstants.OPEN, openExternalWSDLAction);
@@ -121,9 +120,8 @@
 			theActionBars.setGlobalActionHandler(ICommonActionConstants.OPEN, openAction);
 			return;
 			
-		} else if (selection.getFirstElement() instanceof WSDLResourceImpl) {
-			WSDLResourceImpl wsdl = (WSDLResourceImpl) selection.getFirstElement();
-			IFile wsdlFile = WorkbenchResourceHelper.getFile(wsdl);
+		} else if (helper != null && helper.isWSDLResource(first)) {
+			IFile wsdlFile = WorkbenchResourceHelper.getFile((Resource)first);
 			if (wsdlFile == null || !wsdlFile.exists()) {
 				openExternalWSDLAction.selectionChanged(selection);
 				theActionBars.setGlobalActionHandler(ICommonActionConstants.OPEN, openExternalWSDLAction);
@@ -142,18 +140,18 @@
 		if (getContext()==null || getContext().getSelection().isEmpty())
 			return;
 		IStructuredSelection selection = (IStructuredSelection) getContext().getSelection();
-		if (selection.getFirstElement() instanceof ServiceImpl) {
-			ServiceImpl wsdl = (ServiceImpl) selection.getFirstElement();
-			IFile wsdlFile = WorkbenchResourceHelper.getFile(wsdl);
+		Object first = selection.getFirstElement();
+		WSDLServiceHelper helper =	WSDLServiceExtManager.getServiceHelper();
+		if (helper != null && helper.isService(first)) {
+			IFile wsdlFile = WorkbenchResourceHelper.getFile((EObject)first);
 			if (wsdlFile == null || !wsdlFile.exists()) {
 				openExternalWSDLAction.selectionChanged(selection);
 				menu.insertAfter(ICommonMenuConstants.GROUP_OPEN, openExternalWSDLAction);
 				return;
 			}
 		}
-		else if (selection.getFirstElement() instanceof WSDLResourceImpl) {
-			WSDLResourceImpl wsdl = (WSDLResourceImpl) selection.getFirstElement();
-			IFile wsdlFile = WorkbenchResourceHelper.getFile(wsdl);
+		else if (helper != null && helper.isWSDLResource(first)) {
+			IFile wsdlFile = WorkbenchResourceHelper.getFile((Resource)first);
 			if (wsdlFile == null || !wsdlFile.exists()) {
 				openExternalWSDLAction.selectionChanged(selection);
 				menu.insertAfter(ICommonMenuConstants.GROUP_OPEN, openExternalWSDLAction);
diff --git a/plugins/org.eclipse.jst.j2ee.webservice/META-INF/MANIFEST.MF b/plugins/org.eclipse.jst.j2ee.webservice/META-INF/MANIFEST.MF
index 1074b76..756cb4f 100644
--- a/plugins/org.eclipse.jst.j2ee.webservice/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.jst.j2ee.webservice/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.jst.j2ee.webservice; singleton:=true
-Bundle-Version: 1.1.500.qualifier
+Bundle-Version: 1.1.600.qualifier
 Bundle-Activator: org.eclipse.jst.j2ee.internal.webservice.plugin.WebServicePlugin
 Bundle-Vendor: %pluginVendor
 Bundle-Localization: plugin
@@ -10,7 +10,7 @@
  org.eclipse.jst.j2ee.internal.webservice.command;x-internal:=true,
  org.eclipse.jst.j2ee.internal.webservice.componentcore.util;x-internal:=true,
  org.eclipse.jst.j2ee.internal.webservice.constants;x-internal:=true,
- org.eclipse.jst.j2ee.internal.webservice.helper;x-internal:=true,
+ org.eclipse.jst.j2ee.internal.webservice.helper;x-friends:="org.eclipse.jst.ws.consumption",
  org.eclipse.jst.j2ee.internal.webservice.plugin;x-internal:=true,
  org.eclipse.jst.j2ee.internal.webservice.provider;x-internal:=true,
  org.eclipse.jst.j2ee.internal.wsdd.provider;x-internal:=true
@@ -27,9 +27,6 @@
  org.eclipse.jst.common.frameworks;bundle-version="[1.1.0,1.2.0)",
  org.eclipse.core.resources;bundle-version="[3.2.0,4.0.0)",
  org.eclipse.jface;bundle-version="[3.2.0,4.0.0)";resolution:=optional,
- org.eclipse.wst.ws.parser;bundle-version="[1.0.100,1.1.0)",
- org.eclipse.wst.wsdl;bundle-version="[1.2.0,1.3.0)",
- javax.wsdl;bundle-version="[1.5.0,1.6.0)",
  org.eclipse.jem.util;bundle-version="[2.0.0,3.0.0)",
  org.eclipse.wst.common.project.facet.core;bundle-version="[1.3.0,2.0.0)"
 Eclipse-LazyStart: true
diff --git a/plugins/org.eclipse.jst.j2ee.webservice/plugin.xml b/plugins/org.eclipse.jst.j2ee.webservice/plugin.xml
index 3fcd0b4..95210ea 100644
--- a/plugins/org.eclipse.jst.j2ee.webservice/plugin.xml
+++ b/plugins/org.eclipse.jst.j2ee.webservice/plugin.xml
@@ -95,14 +95,6 @@
    </extension>
 
    <extension
-         id="WSDLServiceHelper"
-         name="WSDLServiceHelper"
-         point="org.eclipse.jst.j2ee.WSDLServiceHelper">
-      <wsdlHelper
-            helperClass="org.eclipse.jst.j2ee.internal.webservice.helper.WSDLServiceHelperImpl">
-      </wsdlHelper>
-   </extension>
-   <extension
          point="org.eclipse.wst.common.modulecore.resourceFactories">
       <resourceFactory
             class="org.eclipse.jst.j2ee.webservice.internal.wsdd.WsddResourceFactory"
diff --git a/plugins/org.eclipse.jst.j2ee.webservice/pom.xml b/plugins/org.eclipse.jst.j2ee.webservice/pom.xml
index 6305949..7958605 100644
--- a/plugins/org.eclipse.jst.j2ee.webservice/pom.xml
+++ b/plugins/org.eclipse.jst.j2ee.webservice/pom.xml
@@ -15,13 +15,12 @@
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
+    <artifactId>javaee.plugins</artifactId>
     <version>3.6.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
   </parent>
 
   <groupId>org.eclipse.webtools.javaee</groupId>
   <artifactId>org.eclipse.jst.j2ee.webservice</artifactId>
-  <version>1.1.500-SNAPSHOT</version>
+  <version>1.1.600-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
 </project>
diff --git a/plugins/org.eclipse.jst.j2ee.webservice/webservice/org/eclipse/jst/j2ee/internal/webservice/helper/WSDLServiceHelperImpl.java b/plugins/org.eclipse.jst.j2ee.webservice/webservice/org/eclipse/jst/j2ee/internal/webservice/helper/WSDLServiceHelperImpl.java
deleted file mode 100644
index df42d7c..0000000
--- a/plugins/org.eclipse.jst.j2ee.webservice/webservice/org/eclipse/jst/j2ee/internal/webservice/helper/WSDLServiceHelperImpl.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM 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:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-/*
- * Created on Feb 21, 2005
- *
- * TODO To change the template for this generated file go to
- * Window - Preferences - Java - Code Style - Code Templates
- */
-package org.eclipse.jst.j2ee.internal.webservice.helper;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.jem.util.emf.workbench.WorkbenchResourceHelperBase;
-import org.eclipse.jst.j2ee.client.ApplicationClient;
-import org.eclipse.jst.j2ee.ejb.EnterpriseBean;
-import org.eclipse.jst.j2ee.internal.webservices.WSDLServiceHelper;
-import org.eclipse.jst.j2ee.webapplication.WebApp;
-import org.eclipse.wst.ws.internal.parser.wsil.WebServiceEntity;
-import org.eclipse.wst.ws.internal.parser.wsil.WebServicesParser;
-import org.eclipse.wst.wsdl.Definition;
-import org.eclipse.wst.wsdl.Port;
-import org.eclipse.wst.wsdl.Service;
-import org.eclipse.wst.wsdl.util.WSDLResourceImpl;
-
-/**
- * @author cbridgha
- *
- * TODO To change the template for this generated type comment go to
- * Window - Preferences - Java - Code Style - Code Templates
- */
-public class WSDLServiceHelperImpl implements WSDLServiceHelper {
-
-	/**
-	 * 
-	 */
-	public WSDLServiceHelperImpl() {
-		super();
-	} 
-
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.j2ee.internal.webservices.WSDLServiceHelper#getPortName(java.lang.Object)
-	 */
-	public String getPortName(Object port) {
-		Port aPort = (Port)port;
-		return aPort.getName();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.j2ee.internal.webservices.WSDLServiceHelper#getServicePorts(java.lang.Object)
-	 */
-	public Map getServicePorts(Object aService) {
-		Service service =(Service)aService;
-		return service.getPorts();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.j2ee.internal.webservices.WSDLServiceHelper#getServiceNamespaceURI(java.lang.Object)
-	 */
-	public String getServiceNamespaceURI(Object aService) {
-		Service service =(Service)aService;
-		return service.getQName().getNamespaceURI();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.j2ee.internal.webservices.WSDLServiceHelper#getServiceDefinitionLocation(org.eclipse.emf.ecore.EObject)
-	 */
-	public Object getServiceDefinitionLocation(EObject aService) {
-		Service service =(Service)aService;
-		return service.getEnclosingDefinition().getLocation();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.j2ee.internal.webservices.WSDLServiceHelper#getPortBindingNamespaceURI(java.lang.Object)
-	 */
-	public String getPortBindingNamespaceURI(Object aPort) {
-		Port port = (Port)aPort;
-		return port.getBinding().getQName().getNamespaceURI();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.j2ee.internal.webservices.WSDLServiceHelper#getServiceLocalPart(java.lang.Object)
-	 */
-	public String getServiceLocalPart(Object aService) {
-		Service service =(Service)aService;
-		return service.getQName().getLocalPart();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.j2ee.internal.webservices.WSDLServiceHelper#getServiceQName(java.lang.Object)
-	 */
-	public Object getServiceQName(Object aService) {
-		Service service =(Service)aService;
-		return service.getQName();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.j2ee.internal.webservices.WSDLServiceHelper#getDefinitionServices(java.lang.Object)
-	 */
-	public Map getDefinitionServices(Object aDefinition) {
-		Definition definition =(Definition)aDefinition;
-		return definition.getServices();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.j2ee.internal.webservices.WSDLServiceHelper#getWSDLDefinition(java.lang.String)
-	 */
-	public Object getWSDLDefinition(String wsdlURL) {
-		try {
-			WSDLResourceImpl res = (WSDLResourceImpl) WorkbenchResourceHelperBase.getResource(URI.createURI(wsdlURL), true);
-			if (res == null)
-				return null;
-			return res.getDefinition();
-		} catch (Exception wsdle) {
-			return null;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.j2ee.internal.webservices.WSDLServiceHelper#getWSDLDefinition(org.eclipse.emf.ecore.resource.Resource)
-	 */
-	public Object getWSDLDefinition(Resource wsdlResource) {
-		return ((WSDLResourceImpl)wsdlResource).getDefinition();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.j2ee.internal.webservices.WSDLServiceHelper#getWsdlServicesFromWsilFile(org.eclipse.core.resources.IFile)
-	 */
-	public List getWsdlServicesFromWsilFile(IFile wsil) {
-		List result = new ArrayList();
-		WebServiceEntity entity = parseWsilFile(wsil);
-		if (entity != null && entity.getType() == WebServiceEntity.TYPE_WSIL) {
-			// get all the WSDL references from the WSIL entity
-			List wsdlList = entity.getChildren();
-			for (Iterator it = wsdlList.iterator(); it.hasNext();) {
-				Object item = it.next();
-				if (item != null && item instanceof WebServiceEntity) {
-					if (((WebServiceEntity) item).getModel() != null && ((WebServiceEntity) item).getModel() instanceof Definition) {
-						Definition def = (Definition) ((WebServiceEntity) item).getModel();
-						if (def != null && !def.getServices().isEmpty())
-							result.addAll(def.getServices().values());
-					}
-				}
-			}
-		}
-		return result;
-	}
-	public WebServiceEntity parseWsilFile(IFile wsil) {
-	WebServicesParser parser = null;
-	String url = null;
-	// verify proper input
-	if (wsil == null || !wsil.getFileExtension().equals(WSIL_EXT))
-		return null;
-	// Parse wsil file to get wsdl services
-	try {
-		url = wsil.getLocation().toFile().toURL().toString();
-		parser = new WebServicesParser(url);
-		parser.parse(WebServicesParser.PARSE_WSIL | WebServicesParser.PARSE_WSDL);
-	} catch (Exception e) {
-		//Ignore
-	}
-	if (parser == null)
-		return null;
-	return parser.getWebServiceEntityByURI(url);
-}
-
-	public boolean isService(Object aService) {
-		
-		return aService instanceof Service;
-	}
-	public boolean isWSDLResource(Object aResource) {
-		
-		return aResource instanceof WSDLResourceImpl;
-	}
-	public boolean isDefinition(Object aDefinition) {
-		
-		return aDefinition instanceof Definition;
-	}
-
-
-	public List get13ServiceRefs(EObject j2eeObject) {
-		if (j2eeObject instanceof ApplicationClient)
-			return WebServicesManager.getInstance().get13ServiceRefs((ApplicationClient)j2eeObject);
-		else if (j2eeObject instanceof EnterpriseBean)
-			return WebServicesManager.getInstance().get13ServiceRefs((EnterpriseBean)j2eeObject);
-		else if (j2eeObject instanceof WebApp)
-			return WebServicesManager.getInstance().get13ServiceRefs((WebApp)j2eeObject);
-		else
-			return Collections.EMPTY_LIST;
-	}
-}
diff --git a/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/.classpath b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/.classpath
new file mode 100644
index 0000000..ce73933
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/.cvsignore b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/.cvsignore
new file mode 100644
index 0000000..51e1008
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/.cvsignore
@@ -0,0 +1,5 @@
+bin
+@dot
+javaCompiler...args
+build.xml
+temp.folder
diff --git a/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/.project b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/.project
new file mode 100644
index 0000000..3096307
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.jst.j2ee.xdoclet.runtime</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/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/META-INF/MANIFEST.MF b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..a95e04d
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/META-INF/MANIFEST.MF
@@ -0,0 +1,18 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name.0
+Bundle-SymbolicName: org.eclipse.jst.j2ee.xdoclet.runtime; singleton:=true
+Bundle-Version: 1.1.300.qualifier
+Bundle-Activator: org.eclipse.jst.j2ee.xdoclet.runtime.internal.XDocletRuntimePlugin
+Bundle-Vendor: %Bundle-Vendor.0
+Bundle-Localization: plugin
+Require-Bundle:  org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.jst.j2ee.ejb.annotations.xdoclet;bundle-version="[1.1.0,2.0.0)",
+ org.eclipse.core.resources;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.jst.j2ee.ejb.annotation.model;bundle-version="[1.1.0,1.2.0)"
+Eclipse-LazyStart: true
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.jst.j2ee.xdoclet.runtime.internal;x-internal:=true,
+ org.eclipse.jst.j2ee.xdoclet.runtime.internal.server;x-internal:=true,
+ org.eclipse.jst.j2ee.xdoclet.runtime.internal.tasks;x-internal:=true
+Bundle-RequiredExecutionEnvironment: J2SE-1.4
diff --git a/plugins/org.eclipse.wst.web.ui/about.html b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/about.html
similarity index 100%
copy from plugins/org.eclipse.wst.web.ui/about.html
copy to plugins/org.eclipse.jst.j2ee.xdoclet.runtime/about.html
diff --git a/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/build.properties b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/build.properties
new file mode 100644
index 0000000..2293cda
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/build.properties
@@ -0,0 +1,8 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               plugin.xml,\
+               plugin.properties,\
+               about.html
+               
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/plugin.properties b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/plugin.properties
new file mode 100644
index 0000000..09a8d30
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/plugin.properties
@@ -0,0 +1,70 @@
+name_xdoclet=XDocletRuntime Plug-in
+
+xdoclet.121=XDoclet 1.2.1
+xdoclet.122=XDoclet 1.2.2
+xdoclet.123=XDoclet 1.2.3
+
+webdoclet.deploymentdesc=DeploymentDescriptor Webdoclet Task Provider
+webdoclet.deploymentdesc.desc=Adds DeploymentDescriptor task to webdoclet
+webdoclet.deploymentdesc.useIds=If this attribute is set to true, XDoclet will generate id attributes in the XML document. Note that this is only available in some subtasks.
+webdoclet.deploymentdesc.servletspec=The Servlet spec version to which the web application conforms. Valid values: 2.2, 2.3, 2.4
+webdoclet.deploymentdesc.displayname=Sets the Displayname attribute of the WebXmlSubTask object
+webdoclet.deploymentdesc.validatexml=If this is set to true, the generated XML will be validated against its DTD or XML Schema.
+webdoclet.deploymentdesc.mergedir=Specifies the location of the merge directory. This is where XDoclet will look for merge files.
+webdoclet.deploymentdesc.destdir=Sets the directory where the generated file(s) will be written.
+
+ejbdoclet.deploymentdesc=DeploymentDescriptor Ejbdoclet Task Provider
+ejbdoclet.deploymentdesc.desc=Adds DeploymentDescriptor task to ejbdoclet
+ejbdoclet.deploymentdesc.useIds=If this attribute is set to true, XDoclet will generate id attributes in the XML document. Note that this is only available in some subtasks.
+ejbdoclet.deploymentdesc.description=Sets the Description attribute of the EjbDotXmlSubTask object
+ejbdoclet.deploymentdesc.displayname=Sets the Displayname attribute of the EjbDotXmlSubTask object
+ejbdoclet.deploymentdesc.clientjar=Sets the Clientjar attribute of the EjbDotXmlSubTask object. Automatically excluded if there is no ejb client project.
+ejbdoclet.deploymentdesc.validatexml=If this is set to true, the generated XML will be validated against its DTD or XML Schema.
+ejbdoclet.deploymentdesc.mergedir=Specifies the location of the merge directory. This is where XDoclet will look for merge files.
+ejbdoclet.deploymentdesc.destdir=Sets the directory where the generated file(s) will be written.
+
+ejbdoclet.RemoteInterface=remoteinterface Ejbdoclet Task Provider
+ejbdoclet.RemoteInterface.desc=Adds remoteinterface task to ejbdoclet
+
+ejbdoclet.HomeInterface=homeinterface Ejbdoclet Task Provider
+ejbdoclet.HomeInterface.desc=Adds homeinterface task to ejbdoclet
+
+ejbdoclet.LocalInterface=localinterface Ejbdoclet Task Provider
+ejbdoclet.LocalInterface.desc=Adds localinterface task to ejbdoclet
+
+ejbdoclet.LocalHomeInterface=localhomeinterface Ejbdoclet Task Provider
+ejbdoclet.LocalHomeInterface.desc=Adds localhomeinterface task to ejbdoclet
+
+ejbdoclet.UtilObject=UtilObject Ejbdoclet Task Provider
+ejbdoclet.UtilObject.desc=Adds UtilObject task to ejbdoclet
+ejbdoclet.utilobject.cacheHomes=Cache the homes
+ejbdoclet.utilobject.includeGUID=Include a performant GUID generator in the util object.
+ejbdoclet.utilobject.kind=Sets the Kind attribute of the UtilObjectSubTask object Valid values: physical, logical
+
+ejbdoclet.DataObject=DataObject Ejbdoclet Task Provider
+ejbdoclet.DataObject.desc=Adds DataObject task to ejbdoclet
+
+ejbdoclet.Dao=Dao Ejbdoclet Task Provider
+ejbdoclet.Dao.desc=Adds Dao task to ejbdoclet
+
+ejbdoclet.valueobject=ValueObject Ejbdoclet Task Provider
+ejbdoclet.valueobject.desc=Adds ValueObject task to ejbdoclet
+
+ejbdoclet.Entitypk=Entitypk Ejbdoclet Task Provider
+ejbdoclet.Entitypk.desc=Adds Entitypk task to ejbdoclet
+
+ejbdoclet.Entitycmp=Entitycmp Ejbdoclet Task Provider
+ejbdoclet.Entitycmp.desc=Adds Entitycmp task to ejbdoclet
+
+ejbdoclet.Entitybmp=Entitybmp Ejbdoclet Task Provider
+ejbdoclet.Entitybmp.desc=Adds Entitybmp task to ejbdoclet
+
+ejbdoclet.Session=Entitybmp Ejbdoclet Task Provider
+ejbdoclet.Session.desc=Adds Entitybmp task to ejbdoclet
+
+ejbdoclet.Mdb=Mdb Ejbdoclet Task Provider
+ejbdoclet.Mdb.desc=Adds Mdb task to ejbdoclet
+
+
+Bundle-Name.0 = XDocletRuntime Plug-in
+Bundle-Vendor.0 = Eclipse Web Tools Platform
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/plugin.xml b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/plugin.xml
new file mode 100644
index 0000000..d9caac8
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/plugin.xml
@@ -0,0 +1,937 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+   <extension
+         id="org.eclipse.jst.j2ee.xdoclet.xdocletRuntime.121"
+         name="%xdoclet.121"
+         point="org.eclipse.jst.j2ee.ejb.annotations.xdoclet.xdocletRuntime">
+      <RuntimeVersion
+            ejb="2.0"
+            jsp="1.1"
+            servlet="2.3"
+            xdoclet="1.2.1"/>
+      <RuntimeLib
+            location="xdoclet-1.2.1.jar"
+            name="xdoclet-1.2.1.jar"/>
+      <RuntimeLib
+            location="xjavadoc-1.0.3.jar"
+            name="xjavadoc-1.0.3.jar"/>
+   </extension>
+   <extension
+         id="org.eclipse.jst.j2ee.xdoclet.xdocletRuntime.122"
+         name="%xdoclet.122"
+         point="org.eclipse.jst.j2ee.ejb.annotations.xdoclet.xdocletRuntime">
+      <RuntimeVersion
+            ejb="2.1"
+            jsp="1.2"
+            servlet="2.4"
+            xdoclet="1.2.2"/>
+      <RuntimeLib
+            location="xdoclet-1.2.2.jar"
+            name="xdoclet-1.2.2.jar"/>
+      <RuntimeLib
+            location="xjavadoc-1.1.jar"
+            name="xjavadoc-1.1.jar"/>   
+   </extension>
+   <extension
+         id="org.eclipse.jst.j2ee.xdoclet.xdocletRuntime.123"
+         name="%xdoclet.123"
+         point="org.eclipse.jst.j2ee.ejb.annotations.xdoclet.xdocletRuntime">
+      <RuntimeVersion
+            ejb="2.1"
+            jsp="1.2"
+            servlet="2.4"
+            xdoclet="1.2.3"/>
+      <RuntimeLib
+            location="xdoclet-1.2.3.jar"
+            name="xdoclet-1.2.3.jar"/>
+      <RuntimeLib
+            location="xjavadoc-1.1.jar"
+            name="xjavadoc-1.1.jar"/>   
+   </extension>
+   
+   
+   <!-- Deployment Descriptor (EJB)/WEB -->
+
+   <extension
+         id="org.eclipse.jst.j2ee.xdoclet.webdocletTaskProvider.deploymentdescriptor"
+         name="%webdoclet.deploymentdesc"
+         point="org.eclipse.jst.j2ee.ejb.annotations.xdoclet.webdocletTaskProvider">
+      <WebdocletTaskProvider
+            class="org.eclipse.jst.j2ee.xdoclet.runtime.internal.tasks.DeploymentDescriptorWebdocletTaskProvider"
+            defaultSelection="true"
+            description="%webdoclet.deploymentdesc.desc"
+            id="org.eclipse.jst.j2ee.xdoclet.runtime.internal.tasks.DeploymentDescriptorWebdocletTaskProvider"
+            name="DeploymentDescriptor"/>
+
+      <TaskProperty
+            default="true"
+            id="webdoclet.deploymentdescriptor.useIds"
+            include="true"
+            label="useIds"
+            type="boolean"
+            description="%webdoclet.deploymentdesc.useIds" />
+      <TaskProperty
+            default="${servlet.spec.version}"
+            id="webdoclet.deploymentdescriptor.servletspec"
+            include="true"
+            label="servletspec"
+            type="string"
+            description="%webdoclet.deploymentdesc.servletspec" />
+     <TaskProperty
+            default="${web}"
+            id="webdoclet.deploymentdescriptor.displayname"
+            include="true"
+            label="displayname"
+            type="string"
+            description="%webdoclet.deploymentdesc.displayname"/>
+            
+      <TaskProperty
+            default="false"
+            id="webdoclet.deploymentdescriptor.validatexml"
+            include="true"
+            label="validatexml"
+            type="boolean"
+            description="%webdoclet.deploymentdesc.validatexml"/>
+
+      <TaskProperty
+            default="${web.module.webinf}"
+            id="webdoclet.deploymentdescriptor.mergedir"
+            include="true"
+            label="mergedir"
+            type="string"
+            description="%webdoclet.deploymentdesc.mergedir"/>
+      <TaskProperty
+            default="${web.module.webinf}"
+            id="weboclet.deploymentdescriptor.destdir"
+            include="true"
+            label="destdir"
+            type="string"
+            description="%webdoclet.deploymentdesc.destdir"/>
+   </extension>   
+   
+   <extension
+         id="org.eclipse.jst.j2ee.xdoclet.ejbDocletTaskProvider.deploymentdescriptor"
+         name="%ejbdoclet.deploymentdesc"
+         point="org.eclipse.jst.j2ee.ejb.annotations.xdoclet.ejbDocletTaskProvider">
+      <EjbdocletTaskProvider
+            class="org.eclipse.jst.j2ee.xdoclet.runtime.internal.tasks.DeploymentDescriptorEjbdocletTaskProvider"
+            defaultSelection="true"
+            description="%ejbdoclet.deploymentdesc.desc"
+            id="org.eclipse.jst.j2ee.xdoclet.runtime.internal.tasks.DeploymentDescriptorEjbdocletTaskProvider"
+            name="DeploymentDescriptor"/>
+
+      <TaskProperty
+            default="true"
+            id="ejbdoclet.deploymentdescriptor.useIds"
+            include="true"
+            label="useIds"
+            type="boolean"
+            description="%ejbdoclet.deploymentdesc.useIds" />
+     <TaskProperty
+            default="${ejb.dd.displayname}"
+            id="ejbdoclet.deploymentdescriptor.displayname"
+            include="true"
+            label="displayname"
+            type="string"
+            description="%ejbdoclet.deploymentdesc.displayname"/>
+     <TaskProperty
+            default="${ejb.dd.description}"
+            id="ejbdoclet.deploymentdescriptor.description"
+            include="true"
+            label="description"
+            type="string"
+            description="%ejbdoclet.deploymentdesc.description"/>
+            
+     <TaskProperty
+            default="${ejb.dd.clientjar}"
+            id="ejbdoclet.deploymentdescriptor.clientjar"
+            include="true"
+            label="clientjar"
+            type="string"
+            description="%ejbdoclet.deploymentdesc.clientjar"/>
+            
+      <TaskProperty
+            default="false"
+            id="ejbdoclet.deploymentdescriptor.validatexml"
+            include="true"
+            label="validatexml"
+            type="boolean"
+            description="%ejbdoclet.deploymentdesc.validatexml"/>
+
+      <TaskProperty
+            default="${ejb.dd.dir}"
+            id="ejbdoclet.deploymentdescriptor.mergedir"
+            include="true"
+            label="mergedir"
+            type="string"
+            description="%ejbdoclet.deploymentdesc.mergedir"/>
+      <TaskProperty
+            default="${ejb.dd.dir}"
+            id="ejbdoclet.deploymentdescriptor.destdir"
+            include="true"
+            label="destdir"
+            type="string"
+            description="%ejbdoclet.deploymentdesc.destdir"/>
+   </extension>   
+ 
+   <!-- remoteinterface -->
+   <extension
+         id="org.eclipse.jst.j2ee.xdoclet.ejbDocletTaskProvider.remoteinterface"
+         name="%ejbdoclet.RemoteInterface"
+         point="org.eclipse.jst.j2ee.ejb.annotations.xdoclet.ejbDocletTaskProvider">
+      <EjbdocletTaskProvider
+            class="org.eclipse.jst.j2ee.xdoclet.runtime.internal.tasks.RemoteInterfaceEjbdocletTaskProvider"
+            defaultSelection="true"
+            description="%ejbdoclet.RemoteInterface.desc"
+            id="org.eclipse.jst.j2ee.xdoclet.runtime.internal.tasks.RemoteInterfaceEjbdocletTaskProvider"
+            name="RemoteInterface"/>
+   </extension>   
+
+   <!-- homeinterface -->
+   <extension
+         id="org.eclipse.jst.j2ee.xdoclet.ejbDocletTaskProvider.homeinterface"
+         name="%ejbdoclet.HomeInterface"
+         point="org.eclipse.jst.j2ee.ejb.annotations.xdoclet.ejbDocletTaskProvider">
+      <EjbdocletTaskProvider
+            class="org.eclipse.jst.j2ee.xdoclet.runtime.internal.tasks.HomeInterfaceEjbdocletTaskProvider"
+            defaultSelection="true"
+            description="%ejbdoclet.HomeInterface.desc"
+            id="org.eclipse.jst.j2ee.xdoclet.runtime.internal.tasks.HomeInterfaceEjbdocletTaskProvider"
+            name="HomeInterface"/>
+   </extension>   
+
+   <!-- localinterface -->
+   <extension
+         id="org.eclipse.jst.j2ee.xdoclet.ejbDocletTaskProvider.localinterface"
+         name="%ejbdoclet.LocalInterface"
+         point="org.eclipse.jst.j2ee.ejb.annotations.xdoclet.ejbDocletTaskProvider">
+      <EjbdocletTaskProvider
+            class="org.eclipse.jst.j2ee.xdoclet.runtime.internal.tasks.LocalInterfaceEjbdocletTaskProvider"
+            defaultSelection="true"
+            description="%ejbdoclet.LocalInterface.desc"
+            id="org.eclipse.jst.j2ee.xdoclet.runtime.internal.tasks.LocalInterfaceEjbdocletTaskProvider"
+            name="LocalInterface"/>
+   </extension>   
+
+   <!-- localhomeinterface -->
+   <extension
+         id="org.eclipse.jst.j2ee.xdoclet.ejbDocletTaskProvider.localhomeinterface"
+         name="%ejbdoclet.LocalHomeInterface"
+         point="org.eclipse.jst.j2ee.ejb.annotations.xdoclet.ejbDocletTaskProvider">
+      <EjbdocletTaskProvider
+            class="org.eclipse.jst.j2ee.xdoclet.runtime.internal.tasks.LocalHomeInterfaceEjbdocletTaskProvider"
+            defaultSelection="true"
+            description="%ejbdoclet.LocalHomeInterface.desc"
+            id="org.eclipse.jst.j2ee.xdoclet.runtime.internal.tasks.LocalHomeInterfaceEjbdocletTaskProvider"
+            name="LocalHomeInterface"/>
+   </extension>   
+
+   <!-- utilobject -->
+   <extension
+         id="org.eclipse.jst.j2ee.xdoclet.ejbDocletTaskProvider.utilobject"
+         name="%ejbdoclet.UtilObject"
+         point="org.eclipse.jst.j2ee.ejb.annotations.xdoclet.ejbDocletTaskProvider">
+      <EjbdocletTaskProvider
+            class="org.eclipse.jst.j2ee.xdoclet.runtime.internal.tasks.UtilObjectEjbdocletTaskProvider"
+            defaultSelection="true"
+            description="%ejbdoclet.UtilObject.desc"
+            id="org.eclipse.jst.j2ee.xdoclet.runtime.internal.tasks.UtilObjectEjbdocletTaskProvider"
+            name="UtilObject"/>
+      <TaskProperty
+            default="true"
+            id="ejbdoclet.utilobject.cacheHomes"
+            label="cacheHomes"
+            include="true"            
+            type="boolean"
+            description="%ejbdoclet.utilobject.cacheHomes"/>            
+      <TaskProperty
+            default="true"
+            id="ejbdoclet.utilobject.includeGUID"
+            label="includeGUID"
+            include="true"            
+            type="boolean"
+            description="%ejbdoclet.utilobject.includeGUID"/> 
+      <TaskProperty
+            default="physical"
+            id="ejbdoclet.utilobject.kind"
+            label="kind"
+            include="true"            
+            restriction="physical,logical"
+            type="enum"
+            description="%ejbdoclet.utilobject.kind"/>                       
+   </extension>   
+
+   <!-- dataobject -->
+   <extension
+         id="org.eclipse.jst.j2ee.xdoclet.ejbDocletTaskProvider.dataobject"
+         name="%ejbdoclet.DataObject"
+         point="org.eclipse.jst.j2ee.ejb.annotations.xdoclet.ejbDocletTaskProvider">
+      <EjbdocletTaskProvider
+            class="org.eclipse.jst.j2ee.xdoclet.runtime.internal.tasks.DataObjectEjbdocletTaskProvider"
+            defaultSelection="true"
+            description="%ejbdoclet.DataObject"
+            id="org.eclipse.jst.j2ee.xdoclet.runtime.internal.tasks.DataObjectEjbdocletTaskProvider"
+            name="DataObject"/>
+   </extension>   
+
+   <!-- dao -->
+   <extension
+         id="org.eclipse.jst.j2ee.xdoclet.ejbDocletTaskProvider.dao"
+         name="%ejbdoclet.Dao"
+         point="org.eclipse.jst.j2ee.ejb.annotations.xdoclet.ejbDocletTaskProvider">
+      <EjbdocletTaskProvider
+            class="org.eclipse.jst.j2ee.xdoclet.runtime.internal.tasks.DaoEjbdocletTaskProvider"
+            defaultSelection="true"
+            description="%ejbdoclet.Dao.desc"
+            id="org.eclipse.jst.j2ee.xdoclet.runtime.internal.tasks.DaoEjbdocletTaskProvider"
+            name="Dao"/>
+   </extension>   
+
+   <!-- valueobject -->
+   <extension
+         id="org.eclipse.jst.j2ee.xdoclet.ejbDocletTaskProvider.valueobject"
+         name="%ejbdoclet.valueobject"
+         point="org.eclipse.jst.j2ee.ejb.annotations.xdoclet.ejbDocletTaskProvider">
+      <EjbdocletTaskProvider
+            class="org.eclipse.jst.j2ee.xdoclet.runtime.internal.tasks.ValueObjectEjbdocletTaskProvider"
+            defaultSelection="true"
+            description="%ejbdoclet.valueobject.desc"
+            id="org.eclipse.jst.j2ee.xdoclet.runtime.internal.tasks.ValueObjectEjbdocletTaskProvider"
+            name="valueobject"/>
+       <TaskProperty
+            default="false"
+            id="ejbdoclet.valueobject.generatePKConstructor"
+            label="generatePKConstructor"
+            include="false"            
+            type="boolean"
+            description="Whether to generate a single-parameter constructor in the ValueObject, which only sets up the PK"/>
+   </extension>   
+
+   <!-- entitypk -->
+   <extension
+         id="org.eclipse.jst.j2ee.xdoclet.ejbDocletTaskProvider.entitypk"
+         name="ejbdoclet.Entitypk"
+         point="org.eclipse.jst.j2ee.ejb.annotations.xdoclet.ejbDocletTaskProvider">
+      <EjbdocletTaskProvider
+            class="org.eclipse.jst.j2ee.xdoclet.runtime.internal.tasks.EntitypkEjbdocletTaskProvider"
+            defaultSelection="true"
+            description="%ejbdoclet.Entitypk.desc"
+            id="org.eclipse.jst.j2ee.xdoclet.runtime.internal.tasks.EntitypkEjbdocletTaskProvider"
+            name="Entitypk"/>
+   </extension>   
+
+
+   <!-- entitycmp -->
+   <extension
+         id="org.eclipse.jst.j2ee.xdoclet.ejbDocletTaskProvider.entitycmp"
+         name="%ejbdoclet.Entitycmp"
+         point="org.eclipse.jst.j2ee.ejb.annotations.xdoclet.ejbDocletTaskProvider">
+      <EjbdocletTaskProvider
+            class="org.eclipse.jst.j2ee.xdoclet.runtime.internal.tasks.EntitycmpEjbdocletTaskProvider"
+            defaultSelection="true"
+            description="%ejbdoclet.Entitycmp.desc"
+            id="org.eclipse.jst.j2ee.xdoclet.runtime.internal.tasks.EntitycmpEjbdocletTaskProvider"
+            name="Entitycmp"/>
+      <TaskProperty
+            default="2.x"
+            id="ejbdoclet.Entitycmp.cmpSpec"
+            label="cmpSpec"
+            include="false"            
+            restriction="1.x,2.x"
+            type="enum"
+            description="Sets the CmpSpec attribute of the EntityCmpSubTask object Valid values: 1.x, 2.x"/>
+   </extension>   
+
+   <!-- entitybmp -->
+   <extension
+         id="org.eclipse.jst.j2ee.xdoclet.ejbDocletTaskProvider.entitybmp"
+         name="%ejbdoclet.Entitybmp"
+         point="org.eclipse.jst.j2ee.ejb.annotations.xdoclet.ejbDocletTaskProvider">
+      <EjbdocletTaskProvider
+            class="org.eclipse.jst.j2ee.xdoclet.runtime.internal.tasks.EntitybmpEjbdocletTaskProvider"
+            defaultSelection="true"
+            description="%ejbdoclet.Entitybmp.desc"
+            id="org.eclipse.jst.j2ee.xdoclet.runtime.internal.tasks.EntitybmpEjbdocletTaskProvider"
+            name="Entitybmp"/>
+   </extension>   
+
+
+   <!-- session -->
+   <extension
+         id="org.eclipse.jst.j2ee.xdoclet.ejbDocletTaskProvider.session"
+         name="%ejbdoclet.Session"
+         point="org.eclipse.jst.j2ee.ejb.annotations.xdoclet.ejbDocletTaskProvider">
+      <EjbdocletTaskProvider
+            class="org.eclipse.jst.j2ee.xdoclet.runtime.internal.tasks.SessionEjbdocletTaskProvider"
+            defaultSelection="true"
+            description="%ejbdoclet.Session.desc"
+            id="org.eclipse.jst.j2ee.xdoclet.runtime.internal.tasks.SessionEjbdocletTaskProvider"
+            name="Session"/>
+   </extension>   
+
+   <!-- mdb -->
+   <extension
+         id="org.eclipse.jst.j2ee.xdoclet.ejbDocletTaskProvider.mdb"
+         name="%ejbdoclet.Mdb"
+         point="org.eclipse.jst.j2ee.ejb.annotations.xdoclet.ejbDocletTaskProvider">
+      <EjbdocletTaskProvider
+            class="org.eclipse.jst.j2ee.xdoclet.runtime.internal.tasks.MdbEjbdocletTaskProvider"
+            defaultSelection="true"
+            description="%ejbdoclet.Mdb.desc"
+            id="org.eclipse.jst.j2ee.xdoclet.runtime.internal.tasks.MdbEjbdocletTaskProvider"
+            name="Mdb"/>
+   </extension>   
+
+   <!-- Server Extensions -->  
+
+   <!-- WEBLOGIC -->
+   <extension
+         id="org.eclipse.jst.j2ee.xdoclet.webDocletTaskProvider.weblogic"
+         name="WebLogic WebDoclet Task Provider"
+         point="org.eclipse.jst.j2ee.ejb.annotations.xdoclet.webdocletTaskProvider">
+      <WebdocletTaskProvider
+            class="org.eclipse.jst.j2ee.xdoclet.runtime.internal.server.WeblogicWebdocletTaskProvider"
+            defaultSelection="false"
+            description="Adds weblogic task to webdoclet"
+            id="org.eclipse.jst.j2ee.xdoclet.runtime.internal.server.WeblogicWebdocletTaskProvider"
+            name="WebLogic"/>
+      <TaskProperty
+            default="8.1"
+            id="webdoclet.weblogic.version"
+            label="version"
+            include="true"            
+            restriction="6.0, 6.1, 7.0, 8.1, 9.0"
+            type="enum"
+            description="Sets the target WebLogic version to generate for. Possible values are 6.1, 7.0 and 8.1 Valid values: 6.0, 6.1, 7.0, 8.1"/>
+      <TaskProperty
+            default="${web}"
+            id="webdoclet.weblogic.contextroot"
+            include="true"
+            label="contextroot"
+            type="string"
+            description="The context-root element specifies the context root for the web application."/>
+      <TaskProperty
+            default="UTF-8"
+            id="webdoclet.weblogic.xmlencoding"
+            include="true"
+            label="xmlencoding"
+            type="string"
+            description="The encoding of the produced xml file. If your XML file uses international characters, you might want to set this to UTF-8."/>
+      <TaskProperty
+            default="false"
+            id="webdoclet.weblogic.validatexml"
+            include="true"
+            label="validatexml"
+            type="boolean"
+            description="If this is set to true, the generated XML will be validated against its DTD or XML Schema."/>
+
+      <TaskProperty
+            default="${web.dd.dir}"
+            id="webdoclet.weblogic.mergedir"
+            include="true"
+            label="mergedir"
+            type="string"
+            description="Specifies the location of the merge directory. This is where XDoclet will look for merge files."/>
+      <TaskProperty
+            default="${web.dd.dir}"
+            id="webdoclet.weblogic.destdir"
+            include="true"
+            label="destdir"
+            type="string"
+            description="Sets the directory where the generated file(s) will be written."/>        
+   </extension>
+       
+   <extension
+         id="org.eclipse.jst.j2ee.xdoclet.ejbDocletTaskProvider.weblogic"
+         name="WebLogic Ejbdoclet Task Provider"
+         point="org.eclipse.jst.j2ee.ejb.annotations.xdoclet.ejbDocletTaskProvider">
+      <EjbdocletTaskProvider
+            class="org.eclipse.jst.j2ee.xdoclet.runtime.internal.server.WeblogicEjbdocletTaskProvider"
+            defaultSelection="false"
+            description="Adds weblogic task to ejbdoclet"
+            id="org.eclipse.jst.j2ee.xdoclet.runtime.internal.server.WeblogicEjbdocletTaskProvider"
+            name="Weblogic"/>
+      <AnnotationProvider
+            class="org.eclipse.jst.j2ee.xdoclet.runtime.internal.annotation.WeblogicAnnotationProvider"
+            type="entity" 
+            include="true" />          
+      <TaskProperty
+            default="8.1"
+            id="ejbdoclet.weblogic.version"
+            label="version"
+            include="true"            
+            restriction="6.0, 6.1, 7.0, 8.1, 9.0"
+            type="enum"
+            description="Sets the target WebLogic version to generate for. Possible values are 6.1, 7.0 and 8.1 Valid values: 6.0, 6.1, 7.0, 8.1"/>
+      <TaskProperty
+            default="UTF-8"
+            id="ejbdoclet.weblogic.xmlencoding"
+            include="true"
+            label="xmlencoding"
+            type="string"
+            description="The encoding of the produced xml file. If your XML file uses international characters, you might want to set this to UTF-8."/>
+      <TaskProperty
+            default="false"
+            id="ejbdoclet.weblogic.validatexml"
+            include="true"
+            label="validatexml"
+            type="boolean"
+            description="If this is set to true, the generated XML will be validated against its DTD or XML Schema."/>
+     <TaskProperty
+            default="${data.source.name}"
+            id="ejbdoclet.weblogic.datasource"
+            include="true"
+            label="datasource"
+            type="string"
+            description="Specifies a default value for the data-source-name element in the CMP descriptor, to use if no weblogic.data-source-name tag appears on a bean." />
+     <TaskProperty
+            default="POINTBASE"
+            id="ejbdoclet.weblogic.databaseType"
+            include="false"
+            label="databaseType"
+            type="string"
+            description="Sets the database type specified in the weblogic-cmp-rdbms-jar.xml deployment descriptor. This is a WLS 7.0 and higher feature. Possible values: DB2 INFORMIX ORACLE SQL_SERVER SYBASE POINTBASE Valid values: DB2, INFORMIX, ORACLE, SQL_SERVER, SYBASE, POINTBASE" />
+      <TaskProperty
+            default="Disabled"
+            id="ejbdoclet.weblogic.createtables"
+            label="createtables"
+            include="true"            
+            restriction="True, False, Disabled, CreateOnly, DropAndCreate, DropAndCreateAlways, AlterOrCreate"
+            type="enum"
+            description="If True or CreateOnly, then at deployment time\nif there is no Table in the Database for a CMP Bean,\n the Container will attempt to CREATE the Table \n(based on information found in the deployment files \n and in the Bean Class). Valid values are \n True and False for WLS Servers for versions older than 8.1 \n and CreateOnly, DropAndCreate, DropAndCreateAlways, AlterOrCreate \n and Disabled for WLS Servers  8.1 and above"/>            
+    <TaskProperty
+            default="weblogic"
+            id="ejbdoclet.weblogic.persistence"
+            include="true"
+            label="persistence"
+            type="string"
+            description="Sets the persistence type to use. Default is weblogic. Useful if you're using a different persistence manager like MVCSoft" />
+
+      <TaskProperty
+            default="${ejb.dd.dir}"
+            id="ejbdoclet.weblogic.mergedir"
+            include="true"
+            label="mergedir"
+            type="string"
+            description="Specifies the location of the merge directory. This is where XDoclet will look for merge files."/>
+      <TaskProperty
+            default="${ejb.dd.dir}"
+            id="ejbdoclet.weblogic.destdir"
+            include="true"
+            label="destdir"
+             type="string"
+            description="Sets the directory where the generated file(s) will be written."/>
+            
+   </extension>
+
+   <!-- JBOSS -->
+  
+   <extension
+         id="org.eclipse.jst.j2ee.xdoclet.webDocletTaskProvider.jboss"
+         name="JBoss WebDoclet Task Provider"
+         point="org.eclipse.jst.j2ee.ejb.annotations.xdoclet.webdocletTaskProvider">
+      <WebdocletTaskProvider
+            class="org.eclipse.jst.j2ee.xdoclet.runtime.internal.server.JBossWebdocletTaskProvider"
+            defaultSelection="false"
+            description="Adds jboss task to webdoclet"
+            id="org.eclipse.jst.j2ee.xdoclet.runtime.internal.server.JBossWebdocletTaskProvider"
+            name="JBoss"/>
+      <TaskProperty
+            default="3.2"
+            id="webdoclet.jboss.version"
+            label="version"
+            include="true"            
+            restriction="2.4, 3.0, 3.0.1, 3.0.2, 3.0.3, 3.2, 4.0"
+            type="enum"
+            description="The version of JBoss. Supported versions are 2.4, 3.0, 3.0.1, 3.0.2, 3.0.3, 3.2 and 4.0."/>
+      <TaskProperty
+            default="${web}"
+            id="webdoclet.jboss.contextroot"
+            include="true"
+            label="contextroot"
+            type="string"
+            description="	The context-root element specifies the context root for the web application."/>
+       <TaskProperty
+            default="java:/jaas/MySecurityDomain"
+            id="webdoclet.jboss.securitydomain"
+            include="false"
+            label="securitydomain"
+            type="string"
+            description="Security domain"/> 
+       <TaskProperty
+            default="UTF-8"
+            id="webdoclet.jboss.xmlencoding"
+            include="true"
+            label="xmlencoding"
+            type="string"
+            description="The encoding of the produced xml file. If your XML file uses international characters, you might want to set this to UTF-8."/>
+      <TaskProperty
+            default="false"
+            id="webdoclet.jboss.validatexml"
+            include="true"
+            label="validatexml"
+            type="boolean"
+            description="If this is set to true, the generated XML will be validated against its DTD or XML Schema."/>
+
+      <TaskProperty
+            default="${web.dd.dir}"
+            id="webdoclet.jboss.mergedir"
+            include="true"
+            label="mergedir"
+            type="string"
+            description="Specifies the location of the merge directory. This is where XDoclet will look for merge files."/>
+      <TaskProperty
+            default="${web.dd.dir}"
+            id="webdoclet.jboss.destdir"
+            include="true"
+            label="destdir"
+            type="string"
+            description="Sets the directory where the generated file(s) will be written."/>        
+   </extension>
+   
+   <extension
+         id="org.eclipse.jst.j2ee.xdoclet.ejbDocletTaskProvider.jboss"
+         name="JBoss Ejbdoclet Task Provider"
+         point="org.eclipse.jst.j2ee.ejb.annotations.xdoclet.ejbDocletTaskProvider">
+      <EjbdocletTaskProvider
+            class="org.eclipse.jst.j2ee.xdoclet.runtime.internal.server.JBossEjbdocletTaskProvider"
+            defaultSelection="false"
+            description="Adds jboss task to ejbdoclet"
+            id="org.eclipse.jst.j2ee.xdoclet.runtime.internal.server.JBossEjbdocletTaskProvider"
+            name="JBoss"/>
+      <AnnotationProvider
+            class="org.eclipse.jst.j2ee.xdoclet.runtime.internal.annotation.JBossAnnotationProvider"
+            type="entity" 
+            include="true" />          
+      <TaskProperty
+            default="3.2"
+            id="ejbdoclet.jboss.version"
+            label="version"
+            include="true"            
+            restriction="2.4, 3.0, 3.0.1, 3.0.2, 3.0.3, 3.2, 4.0"
+            type="enum"
+            description="The version of JBoss. Supported versions are 2.4, 3.0, 3.0.1, 3.0.2, 3.0.3, 3.2 and 4.0."/>
+      <TaskProperty
+            default="UTF-8"
+            id="ejbdoclet.jboss.xmlencoding"
+            include="true"
+            label="xmlencoding"
+            type="string"
+            description="The encoding of the produced xml file. If your XML file uses international characters, you might want to set this to UTF-8."/>
+      <TaskProperty
+            default="false"
+            id="ejbdoclet.jboss.validatexml"
+            include="true"
+            label="validatexml"
+            type="boolean"
+            description="If this is set to true, the generated XML will be validated against its DTD or XML Schema."/>
+
+      <TaskProperty
+            default="${ejb.dd.dir}"
+            id="ejbdoclet.jboss.mergedir"
+            include="true"
+            label="mergedir"
+            type="string"
+            description="Specifies the location of the merge directory. This is where XDoclet will look for merge files."/>
+      <TaskProperty
+            default="${ejb.dd.dir}"
+            id="ejbdoclet.jboss.destdir"
+            include="true"
+            label="destdir"
+            type="string"
+            description="Sets the directory where the generated file(s) will be written."/>
+
+       <TaskProperty
+            default="java:/DefaultDS"
+            id="webdoclet.jboss.securitydomain"
+            include="false"
+            label="securitydomain"
+            type="string"
+            description="Security domain"/>           
+       <TaskProperty
+            default="java:/DefaultDS"
+            id="ejbdoclet.jboss.datasource"
+            include="true"
+            label="datasource"
+            type="string"
+            description="JNDI name for the datasource"/>           
+      <TaskProperty
+            default="Hypersonic SQL"
+            id="ejbdoclet.jboss.datasourcemapping"
+            include="true"
+            label="datasourcemapping"
+            type="string"
+            description="One of the type-mapping's name that are defined in the conf/standardjbosscmp-jdbc.xml file (the default value is Hypersonic SQL)"/>
+      <TaskProperty
+            default="foreign-key"
+            id="ejbdoclet.jboss.preferredrelationmapping"
+            include="true"
+            label="preferredrelationmapping"
+            type="string"
+            description="preferredRelationMapping "/>
+      <TaskProperty
+            default="false"
+            id="ejbdoclet.jboss.generaterelations"
+            include="true"
+            label="generateRelations"
+            type="boolean"
+            description="generate relations "/>
+      <TaskProperty
+            default="false"
+            id="ejbdoclet.jboss.createtable"
+            include="true"
+            label="createtable"
+            type="boolean"
+            description="Create a table for the entity"/>
+      <TaskProperty
+            default="false"
+            id="ejbdoclet.jboss.removetable"
+            include="true"
+            label="removetable"
+            type="boolean"
+            description="Whether the JBossCMP should remove tables when the application is undeployed. "/>
+      <TaskProperty
+            default="false"
+            id="ejbdoclet.jboss.altertable"
+            include="true"
+            label="altertable"
+            type="boolean"
+            description="Whether the JBossCMP should alter tables when the application is deployed. "/>
+   </extension>
+ 
+
+   <!-- JONAS -->
+   <extension
+         id="org.eclipse.jst.j2ee.xdoclet.webDocletTaskProvider.jonas"
+         name="JOnAS WebDoclet Task Provider"
+         point="org.eclipse.jst.j2ee.ejb.annotations.xdoclet.webdocletTaskProvider">
+      <WebdocletTaskProvider
+            class="org.eclipse.jst.j2ee.xdoclet.runtime.internal.server.JonasWebdocletTaskProvider"
+            defaultSelection="false"
+            description="Adds jonas task to webdoclet"
+            id="org.eclipse.jst.j2ee.xdoclet.runtime.internal.server.JonasWebdocletTaskProvider"
+            name="JOnAS"/>
+      <TaskProperty
+            default="2.6"
+            id="webdoclet.jonas.version"
+            label="version"
+            include="true"            
+            restriction="2.3, 2.4, 2.5, 2.6, 3.0, 3.2, 4.0, 4.1, 4.5"
+            type="enum"
+            description="Sets the version of JOnAS. Supported versions are: 2.3, 2.4, 2.5, 2.6, 3.0, 3.2, 4.0, 4.1, 4.5"/>
+      <TaskProperty
+            default="${web}"
+            id="webdoclet.jonas.contextroot"
+            include="true"
+            label="contextroot"
+            type="string"
+            description="	The context-root element specifies the context root for the web application."/>
+      <TaskProperty
+            default="UTF-8"
+            id="webdoclet.jonas.xmlencoding"
+            include="true"
+            label="xmlencoding"
+            type="string"
+            description="The encoding of the produced xml file. If your XML file uses international characters, you might want to set this to UTF-8."/>
+      <TaskProperty
+            default="false"
+            id="webdoclet.jonas.validatexml"
+            include="true"
+            label="validatexml"
+            type="boolean"
+            description="If this is set to true, the generated XML will be validated against its DTD or XML Schema."/>
+
+      <TaskProperty
+            default="${web.dd.dir}"
+            id="webdoclet.jonas.mergedir"
+            include="true"
+            label="mergedir"
+            type="string"
+            description="Specifies the location of the merge directory. This is where XDoclet will look for merge files."/>
+      <TaskProperty
+            default="${web.dd.dir}"
+            id="webdoclet.jonas.destdir"
+            include="true"
+            label="destdir"
+            type="string"
+            description="Sets the directory where the generated file(s) will be written."/>        
+ 
+       <TaskProperty
+            default="java:/DefaultDS"
+            id="ejbdoclet.jonas.datasource"
+            include="false"
+            label="datasource"
+            type="string"
+            description="JNDI name for the datasource"/>           
+       <TaskProperty
+            default="false"
+            id="ejbdoclet.jonas.automatic-pk"
+            include="false"
+            label="automatic-pk"
+            type="boolean"
+            description="True or False for use automatic generation of primary"/>           
+   </extension>
+      
+   <extension
+         id="org.eclipse.jst.j2ee.xdoclet.ejbDocletTaskProvider.jonas"
+         name="JOnAS Ejbdoclet Task Provider"
+         point="org.eclipse.jst.j2ee.ejb.annotations.xdoclet.ejbDocletTaskProvider">
+      <EjbdocletTaskProvider
+            class="org.eclipse.jst.j2ee.xdoclet.runtime.internal.server.JonasEjbdocletTaskProvider"
+            defaultSelection="false"
+            description="Adds JOnAS task to ejbdoclet"
+            id="org.eclipse.jst.j2ee.xdoclet.runtime.internal.server.JonasEjbdocletTaskProvider"
+            name="JOnAS"/>
+      <AnnotationProvider
+            class="org.eclipse.jst.j2ee.xdoclet.runtime.internal.annotation.JonasAnnotationProvider"
+            type="entity" 
+            include="true" />          
+      <TaskProperty
+            default="2.4"
+            id="ejbdoclet.jonas.version"
+            label="version"
+            include="true"            
+            restriction="2.3, 2.4, 2.5, 2.6, 3.0, 3.2, 4.0, 4.1, 4.5"
+            type="enum"
+            description="Sets the version of JOnAS. Supported versions are: 2.3, 2.4, 2.5, 2.6, 3.0"/>
+      <TaskProperty
+            default="UTF-8"
+            id="ejbdoclet.jonas.xmlencoding"
+            include="true"
+            label="xmlencoding"
+            type="string"
+            description="The encoding of the produced xml file. If your XML file uses international characters, you might want to set this to UTF-8."/>
+      <TaskProperty
+            default="false"
+            id="ejbdoclet.jonas.validatexml"
+            include="true"
+            label="validatexml"
+            type="boolean"
+            description="If this is set to true, the generated XML will be validated against its DTD or XML Schema."/>
+
+      <TaskProperty
+            default="${ejb.dd.dir}"
+            id="ejbdoclet.jonas.mergedir"
+            include="true"
+            label="mergedir"
+            type="string"
+            description="Specifies the location of the merge directory. This is where XDoclet will look for merge files."/>
+      <TaskProperty
+            default="${ejb.dd.dir}"
+            id="ejbdoclet.jonas.destdir"
+            include="true"
+            label="destdir"
+            type="string"
+            description="Sets the directory where the generated file(s) will be written."/>
+            
+   </extension>
+
+   <!-- WEBPSHERE -->
+      <extension
+         id="org.eclipse.jst.j2ee.xdoclet.webDocletTaskProvider.websphere"
+         name="Websphere WebDoclet Task Provider"
+         point="org.eclipse.jst.j2ee.ejb.annotations.xdoclet.webdocletTaskProvider">
+      <WebdocletTaskProvider
+            class="org.eclipse.jst.j2ee.xdoclet.runtime.internal.server.WebsphereWebdocletTaskProvider"
+            defaultSelection="false"
+            description="Adds websphere task to webdoclet"
+            id="org.eclipse.jst.j2ee.xdoclet.runtime.internal.server.WebsphereWebdocletTaskProvider"
+            name="Websphere"/>
+ 
+ 
+      <TaskProperty
+            default="UTF-8"
+            id="webdoclet.websphere.xmlencoding"
+            include="true"
+            label="xmlencoding"
+            type="string"
+            description="The encoding of the produced xml file. If your XML file uses international characters, you might want to set this to UTF-8."/>
+      <TaskProperty
+            default="false"
+            id="webdoclet.websphere.validatexml"
+            include="true"
+            label="validatexml"
+            type="boolean"
+            description="If this is set to true, the generated XML will be validated against its DTD or XML Schema."/>
+
+      <TaskProperty
+            default="${web.dd.dir}"
+            id="webdoclet.websphere.mergedir"
+            include="true"
+            label="mergedir"
+            type="string"
+            description="Specifies the location of the merge directory. This is where XDoclet will look for merge files."/>
+      <TaskProperty
+            default="${web.dd.dir}"
+            id="webdoclet.websphere.destdir"
+            include="true"
+            label="destdir"
+            type="string"
+            description="Sets the directory where the generated file(s) will be written."/>        
+   </extension>
+   
+   <extension
+         id="org.eclipse.jst.j2ee.xdoclet.ejbDocletTaskProvider.webpshere"
+         name="WebSphere Ejbdoclet Task Provider"
+         point="org.eclipse.jst.j2ee.ejb.annotations.xdoclet.ejbDocletTaskProvider">
+      <EjbdocletTaskProvider
+            class="org.eclipse.jst.j2ee.xdoclet.runtime.internal.server.WebsphereEjbdocletTaskProvider"
+            defaultSelection="false"
+            description="Adds WebSphere task to ejbdoclet"
+            id="org.eclipse.jst.j2ee.xdoclet.runtime.internal.server.WebsphereEjbdocletTaskProvider"
+            name="WebSphere"/>
+      <AnnotationProvider
+            class="org.eclipse.jst.j2ee.xdoclet.runtime.internal.annotation.WebsphereAnnotationProvider"
+            type="entity" 
+            include="true" />          
+
+      <TaskProperty
+            default="UTF-8"
+            id="ejbdoclet.websphere.xmlencoding"
+            include="true"
+            label="xmlencoding"
+            type="string"
+            description="The encoding of the produced xml file. If your XML file uses international characters, you might want to set this to UTF-8."/>
+      <TaskProperty
+            default="false"
+            id="ejbdoclet.websphere.validatexml"
+            include="true"
+            label="validatexml"
+            type="boolean"
+            description="If this is set to true, the generated XML will be validated against its DTD or XML Schema."/>
+
+      <TaskProperty
+            default="${ejb.dd.dir}"
+            id="ejbdoclet.websphere.mergedir"
+            include="true"
+            label="mergedir"
+            type="string"
+            description="Specifies the location of the merge directory. This is where XDoclet will look for merge files."/>
+      <TaskProperty
+            default="${ejb.dd.dir}"
+            id="ejbdoclet.websphere.destdir"
+            include="true"
+            label="destdir"
+            type="string"
+            description="Sets the directory where the generated file(s) will be written."/>
+      <TaskProperty
+            default="MyDataSourceJNDIName"
+            id="ejbdoclet.websphere.datasource"
+            include="false"
+            label="datasource"
+            type="string"
+            description="Sets the default CMP Datasource"/>
+     <TaskProperty
+            default="xxxxx"
+            id="ejbdoclet.websphere.currentBackendId"
+            include="false"
+            label="currentBackendId"
+            type="string"
+            description="Sets the current backend id. This parameter is used to point out the id of the current CMP mapping"/>
+            
+   </extension>   
+   
+
+
+</plugin>
diff --git a/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/pom.xml b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/pom.xml
new file mode 100644
index 0000000..91a0e8a
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/pom.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Copyright (c) 2012, 2013 Eclipse Foundation and others.
+  All rights reserved. This program and the accompanying materials
+  are made available under the terms of the Eclipse Distribution License v1.0
+  which accompanies this distribution, and is available at
+  http://www.eclipse.org/org/documents/edl-v10.php
+ 
+  Contributors:
+    Thanh Ha (Eclipse Foundation) - initial implementation
+-->
+
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.eclipse.webtools.javaee</groupId>
+    <artifactId>javaee.plugins</artifactId>
+    <version>3.6.0-SNAPSHOT</version>
+  </parent>
+
+  <groupId>org.eclipse.webtools.ejb</groupId>
+  <artifactId>org.eclipse.jst.j2ee.xdoclet.runtime</artifactId>
+  <version>1.1.300-SNAPSHOT</version>
+  <packaging>eclipse-plugin</packaging>
+</project>
diff --git a/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/XDocletRuntimeAnnotationImpl.java b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/XDocletRuntimeAnnotationImpl.java
new file mode 100644
index 0000000..f2956a7
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/XDocletRuntimeAnnotationImpl.java
@@ -0,0 +1,37 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+package org.eclipse.jst.j2ee.xdoclet.runtime.internal;
+
+import org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.IXDocletRuntimeAnnotation;
+import org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.XDocletPreferenceStore;
+
+public abstract class XDocletRuntimeAnnotationImpl implements
+		IXDocletRuntimeAnnotation {
+
+	XDocletPreferenceStore preferenceStore;
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jst.j2ee.xdoclet.runtime.internal.Xdoc#setPreferenceStore(org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.XDocletPreferenceStore)
+	 */
+	public void setPreferenceStore(XDocletPreferenceStore preferenceStore) {
+		this.preferenceStore = preferenceStore;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jst.j2ee.xdoclet.runtime.internal.Xdoc#getPreferenceStore()
+	 */
+	public XDocletPreferenceStore getPreferenceStore() {
+		return preferenceStore;
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/XDocletRuntimePlugin.java b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/XDocletRuntimePlugin.java
new file mode 100644
index 0000000..747c95a
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/XDocletRuntimePlugin.java
@@ -0,0 +1,51 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+package org.eclipse.jst.j2ee.xdoclet.runtime.internal;
+
+import org.eclipse.core.runtime.Plugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The main plugin class to be used in the desktop.
+ */
+public class XDocletRuntimePlugin extends Plugin {
+
+	//The shared instance.
+	private static XDocletRuntimePlugin plugin;
+	
+	/**
+	 * The constructor.
+	 */
+	public XDocletRuntimePlugin() {
+		plugin = this;
+	}
+
+	/**
+	 * This method is called upon plug-in activation
+	 */
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+	}
+
+	/**
+	 * This method is called when the plug-in is stopped
+	 */
+	public void stop(BundleContext context) throws Exception {
+		super.stop(context);
+		plugin = null;
+	}
+
+	/**
+	 * Returns the shared instance.
+	 */
+	public static XDocletRuntimePlugin getDefault() {
+		return plugin;
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/XDocletTaskProviderImpl.java b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/XDocletTaskProviderImpl.java
new file mode 100644
index 0000000..3e77b34
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/XDocletTaskProviderImpl.java
@@ -0,0 +1,149 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+package org.eclipse.jst.j2ee.xdoclet.runtime.internal;
+
+import java.util.Properties;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.XDocletPreferenceStore;
+import org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.XDocletTaskProvider;
+
+public abstract class XDocletTaskProviderImpl implements XDocletTaskProvider {
+
+	IExtension extension;
+	Properties properties;
+	XDocletPreferenceStore preferenceStore;
+	IProject project;
+	IProject clientProject;
+
+	protected static String INCLUDE = ".include";
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jst.j2ee.xdoclet.runtime.internal.Xdoc#getNamespace()
+	 */
+	public abstract String getNamespace();
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jst.j2ee.xdoclet.runtime.internal.Xdoc#getTask()
+	 */
+	public abstract String getTask();
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jst.j2ee.xdoclet.runtime.internal.Xdoc#validate()
+	 */
+	public IStatus validate() {
+		return Status.OK_STATUS;
+	}
+
+	protected void buildAttributes(StringBuffer stringBuffer) {
+
+		String[] attributes = getAttributeNames();
+		if (attributes == null)
+			return;
+		for (int i = 0; i < attributes.length; i++) {
+			String attribute = attributes[i];
+			boolean include = getPreferenceStore().getBooleanProperty(getNamespace() + attribute + INCLUDE);
+			if (include) {
+				addAttribute(attribute,stringBuffer);
+			}
+		}
+
+	}
+
+	protected void addAttribute(String attribute, StringBuffer stringBuffer) {
+		stringBuffer.append(" " + attribute + "=\"");
+		stringBuffer.append(getPreferenceStore().getProperty(getNamespace() + attribute).replaceAll("\\$","\\\\\\$"));
+		stringBuffer.append('"');
+	}
+
+	protected String[] getAttributeNames() {
+		IExtension taskConfig = getExtension();
+		IConfigurationElement[] properties = taskConfig.getConfigurationElements();
+		if (properties == null || properties.length == 1)
+			return null;
+		String attributeNames[] = new String[properties.length];
+		for (int i = 1; i < properties.length; i++) {
+			IConfigurationElement property = properties[i];
+			attributeNames[i] = property.getAttribute("label");
+		}
+		return attributeNames;
+
+	}
+
+	
+	public IExtension getExtension() {
+		return extension;
+	}
+
+	
+	public void setExtension(IExtension extension) {
+		this.extension = extension;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jst.j2ee.xdoclet.runtime.internal.Xdoc#getProperties()
+	 */
+	public Properties getProperties() {
+		return properties;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jst.j2ee.xdoclet.runtime.internal.Xdoc#setProperties(java.util.Properties)
+	 */
+	public void setProperties(Properties properties) {
+		this.properties = properties;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jst.j2ee.xdoclet.runtime.internal.Xdoc#setPreferenceStore(org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.XDocletPreferenceStore)
+	 */
+	public void setPreferenceStore(XDocletPreferenceStore preferenceStore) {
+		this.preferenceStore = preferenceStore;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jst.j2ee.xdoclet.runtime.internal.Xdoc#getPreferenceStore()
+	 */
+	public XDocletPreferenceStore getPreferenceStore() {
+		return preferenceStore;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jst.j2ee.xdoclet.runtime.internal.Xdoc#getClientProject()
+	 */
+	public IProject getClientProject() {
+		return clientProject;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jst.j2ee.xdoclet.runtime.internal.Xdoc#setClientProject(org.eclipse.core.resources.IProject)
+	 */
+	public void setClientProject(IProject clientProject) {
+		this.clientProject = clientProject;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jst.j2ee.xdoclet.runtime.internal.Xdoc#getProject()
+	 */
+	public IProject getProject() {
+		return project;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jst.j2ee.xdoclet.runtime.internal.Xdoc#setProject(org.eclipse.core.resources.IProject)
+	 */
+	public void setProject(IProject project) {
+		this.project = project;
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/annotation/JBossAnnotationProvider.java b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/annotation/JBossAnnotationProvider.java
new file mode 100644
index 0000000..27fcc5e
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/annotation/JBossAnnotationProvider.java
@@ -0,0 +1,27 @@
+package org.eclipse.jst.j2ee.xdoclet.runtime.internal.annotation;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.model.IContainerManagedEntityBean;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.model.IEnterpriseBean;
+import org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.XDocletPreferenceStore;
+import org.eclipse.jst.j2ee.xdoclet.runtime.internal.XDocletRuntimeAnnotationImpl;
+
+public class JBossAnnotationProvider extends XDocletRuntimeAnnotationImpl {
+
+	public String getTypeAnnotations(IProject project, IEnterpriseBean bean) {
+		if (!IContainerManagedEntityBean.class.isAssignableFrom(bean.getClass()))
+			return "";
+		IContainerManagedEntityBean cmp = (IContainerManagedEntityBean) bean;
+		XDocletPreferenceStore ps = getPreferenceStore();
+		StringBuffer annotation = new StringBuffer();
+		annotation.append(" * @jboss.persistence ");
+		annotation.append("datasource=\"" + ps.getProperty("ejbdoclet.jboss.datasource") + "\" ");
+		annotation.append("datasource-mapping=\"" + ps.getProperty("ejbdoclet.jboss.datasourcemapping") + "\" ");
+		annotation.append("table-name=\"" + cmp.getTable() + "\" ");
+		annotation.append("create-table=\"" + ps.getBooleanProperty("ejbdoclet.jboss.createtable") + "\" ");
+		annotation.append("remove-table=\"" + ps.getBooleanProperty("ejbdoclet.jboss.removetable") + "\" ");
+		annotation.append("alter-table=\"" + ps.getBooleanProperty("ejbdoclet.jboss.altertable") + "\"" );
+		return annotation.toString();
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/annotation/JonasAnnotationProvider.java b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/annotation/JonasAnnotationProvider.java
new file mode 100644
index 0000000..6cf6049
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/annotation/JonasAnnotationProvider.java
@@ -0,0 +1,24 @@
+package org.eclipse.jst.j2ee.xdoclet.runtime.internal.annotation;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.model.IContainerManagedEntityBean;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.model.IEnterpriseBean;
+import org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.XDocletPreferenceStore;
+import org.eclipse.jst.j2ee.xdoclet.runtime.internal.XDocletRuntimeAnnotationImpl;
+
+public class JonasAnnotationProvider extends XDocletRuntimeAnnotationImpl {
+
+	public String getTypeAnnotations(IProject project, IEnterpriseBean bean) {
+		if (!IContainerManagedEntityBean.class.isAssignableFrom(bean.getClass()))
+			return "";
+		IContainerManagedEntityBean cmp = (IContainerManagedEntityBean) bean;
+		XDocletPreferenceStore ps = getPreferenceStore();
+		StringBuffer annotation = new StringBuffer();
+		annotation.append(" * @jonas.jdbc-mapping ");
+		annotation.append("jndi-name=\"" + ps.getProperty("ejbdoclet.jonas.datasource") + "\" ");
+		annotation.append("automatic-pk=\"" + ps.getBooleanProperty("ejbdoclet.jonas.automatic-pk") + "\" ");
+		annotation.append("jdbc-table-name=\"" + cmp.getTable() + "\"");
+		return annotation.toString();
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/annotation/WeblogicAnnotationProvider.java b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/annotation/WeblogicAnnotationProvider.java
new file mode 100644
index 0000000..2121c76
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/annotation/WeblogicAnnotationProvider.java
@@ -0,0 +1,21 @@
+package org.eclipse.jst.j2ee.xdoclet.runtime.internal.annotation;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.model.IContainerManagedEntityBean;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.model.IEnterpriseBean;
+import org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.XDocletPreferenceStore;
+import org.eclipse.jst.j2ee.xdoclet.runtime.internal.XDocletRuntimeAnnotationImpl;
+
+public class WeblogicAnnotationProvider extends XDocletRuntimeAnnotationImpl {
+
+	public String getTypeAnnotations(IProject project, IEnterpriseBean bean) {
+		if (!IContainerManagedEntityBean.class.isAssignableFrom(bean.getClass()))
+			return "";
+		IContainerManagedEntityBean cmp = (IContainerManagedEntityBean) bean;
+		XDocletPreferenceStore ps = getPreferenceStore();
+		StringBuffer annotation = new StringBuffer();
+		annotation.append(" * @weblogic.data-source-name " + ps.getProperty("ejbdoclet.weblogic.datasource"));
+		return annotation.toString();
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/annotation/WebsphereAnnotationProvider.java b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/annotation/WebsphereAnnotationProvider.java
new file mode 100644
index 0000000..cb7eefe
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/annotation/WebsphereAnnotationProvider.java
@@ -0,0 +1,22 @@
+package org.eclipse.jst.j2ee.xdoclet.runtime.internal.annotation;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.model.IContainerManagedEntityBean;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.model.IEnterpriseBean;
+import org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.XDocletPreferenceStore;
+import org.eclipse.jst.j2ee.xdoclet.runtime.internal.XDocletRuntimeAnnotationImpl;
+
+public class WebsphereAnnotationProvider extends XDocletRuntimeAnnotationImpl {
+
+	public String getTypeAnnotations(IProject project, IEnterpriseBean bean) {
+		if (!IContainerManagedEntityBean.class.isAssignableFrom(bean.getClass()))
+			return "";
+		IContainerManagedEntityBean cmp = (IContainerManagedEntityBean) bean;
+		XDocletPreferenceStore ps = getPreferenceStore();
+		StringBuffer annotation = new StringBuffer();
+		annotation.append(" * @websphere.cmp ");
+		annotation.append("datasource=\"" + ps.getProperty("ejbdoclet.websphere.datasource") + "\" ");
+		return annotation.toString();
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/server/JBossEjbdocletTaskProvider.java b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/server/JBossEjbdocletTaskProvider.java
new file mode 100644
index 0000000..12c295b
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/server/JBossEjbdocletTaskProvider.java
@@ -0,0 +1,34 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+package org.eclipse.jst.j2ee.xdoclet.runtime.internal.server;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jst.j2ee.xdoclet.runtime.internal.XDocletTaskProviderImpl;
+
+public class JBossEjbdocletTaskProvider extends XDocletTaskProviderImpl {
+
+	public static String NAMESPACE = "ejbdoclet.jboss.";
+
+	public String getTask() {
+		StringBuffer buffer = new StringBuffer(256);
+		buffer.append("<jboss ");
+		buildAttributes(buffer);
+		buffer.append(" />");
+		return buffer.toString();
+	}
+
+	public String getNamespace() {
+		return NAMESPACE;
+	}
+
+	public IStatus validate() {
+		return Status.OK_STATUS;
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/server/JBossWebdocletTaskProvider.java b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/server/JBossWebdocletTaskProvider.java
new file mode 100644
index 0000000..986f6dc
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/server/JBossWebdocletTaskProvider.java
@@ -0,0 +1,35 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+package org.eclipse.jst.j2ee.xdoclet.runtime.internal.server;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jst.j2ee.xdoclet.runtime.internal.XDocletTaskProviderImpl;
+
+public class JBossWebdocletTaskProvider extends XDocletTaskProviderImpl {
+
+	public static String NAMESPACE = "webdoclet.jboss.";
+
+	public String getTask() {
+
+		StringBuffer buffer = new StringBuffer(256);
+		buffer.append("<jbosswebxml ");
+		buildAttributes(buffer);
+		buffer.append(" />");
+		return buffer.toString();
+	}
+
+	public String getNamespace() {
+		return NAMESPACE;
+	}
+
+	public IStatus validate() {
+		return Status.OK_STATUS;
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/server/JonasEjbdocletTaskProvider.java b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/server/JonasEjbdocletTaskProvider.java
new file mode 100644
index 0000000..fda961f
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/server/JonasEjbdocletTaskProvider.java
@@ -0,0 +1,34 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+package org.eclipse.jst.j2ee.xdoclet.runtime.internal.server;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jst.j2ee.xdoclet.runtime.internal.XDocletTaskProviderImpl;
+
+public class JonasEjbdocletTaskProvider extends XDocletTaskProviderImpl {
+
+	public static String NAMESPACE = "ejbdoclet.jonas.";
+
+	public String getTask() {
+		StringBuffer buffer = new StringBuffer(256);
+		buffer.append("<jonas ");
+		buildAttributes(buffer);
+		buffer.append(" />");
+		return buffer.toString();
+	}
+
+	public String getNamespace() {
+		return NAMESPACE;
+	}
+
+	public IStatus validate() {
+		return Status.OK_STATUS;
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/server/JonasWebdocletTaskProvider.java b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/server/JonasWebdocletTaskProvider.java
new file mode 100644
index 0000000..d04e732
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/server/JonasWebdocletTaskProvider.java
@@ -0,0 +1,34 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+package org.eclipse.jst.j2ee.xdoclet.runtime.internal.server;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jst.j2ee.xdoclet.runtime.internal.XDocletTaskProviderImpl;
+
+public class JonasWebdocletTaskProvider extends XDocletTaskProviderImpl {
+
+	public static String NAMESPACE = "webdoclet.jonas.";
+
+	public String getTask() {
+		StringBuffer buffer = new StringBuffer(256);
+		buffer.append("<jonaswebxml ");
+		buildAttributes(buffer);
+		buffer.append(" />");
+		return buffer.toString();
+	}
+
+	public String getNamespace() {
+		return NAMESPACE;
+	}
+
+	public IStatus validate() {
+		return Status.OK_STATUS;
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/server/WeblogicEjbdocletTaskProvider.java b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/server/WeblogicEjbdocletTaskProvider.java
new file mode 100644
index 0000000..7b59917
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/server/WeblogicEjbdocletTaskProvider.java
@@ -0,0 +1,34 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+package org.eclipse.jst.j2ee.xdoclet.runtime.internal.server;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jst.j2ee.xdoclet.runtime.internal.XDocletTaskProviderImpl;
+
+public class WeblogicEjbdocletTaskProvider extends XDocletTaskProviderImpl {
+
+	public static String NAMESPACE = "ejbdoclet.weblogic.";
+
+	public String getTask() {
+		StringBuffer buffer = new StringBuffer(256);
+		buffer.append("<weblogic ");
+		buildAttributes(buffer);
+		buffer.append(" />");
+		return buffer.toString();
+	}
+
+	public String getNamespace() {
+		return NAMESPACE;
+	}
+
+	public IStatus validate() {
+		return Status.OK_STATUS;
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/server/WeblogicWebdocletTaskProvider.java b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/server/WeblogicWebdocletTaskProvider.java
new file mode 100644
index 0000000..80a04f0
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/server/WeblogicWebdocletTaskProvider.java
@@ -0,0 +1,34 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+package org.eclipse.jst.j2ee.xdoclet.runtime.internal.server;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jst.j2ee.xdoclet.runtime.internal.XDocletTaskProviderImpl;
+
+public class WeblogicWebdocletTaskProvider extends XDocletTaskProviderImpl {
+
+	public static String NAMESPACE = "webdoclet.weblogic.";
+
+	public String getTask() {
+		StringBuffer buffer = new StringBuffer(256);
+		buffer.append("<weblogicwebxml ");
+		buildAttributes(buffer);
+		buffer.append(" />");
+		return buffer.toString();
+	}
+
+	public String getNamespace() {
+		return NAMESPACE;
+	}
+
+	public IStatus validate() {
+		return Status.OK_STATUS;
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/server/WebsphereEjbdocletTaskProvider.java b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/server/WebsphereEjbdocletTaskProvider.java
new file mode 100644
index 0000000..ead9643
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/server/WebsphereEjbdocletTaskProvider.java
@@ -0,0 +1,34 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+package org.eclipse.jst.j2ee.xdoclet.runtime.internal.server;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jst.j2ee.xdoclet.runtime.internal.XDocletTaskProviderImpl;
+
+public class WebsphereEjbdocletTaskProvider extends XDocletTaskProviderImpl {
+
+	public static String NAMESPACE = "ejbdoclet.websphere.";
+
+	public String getTask() {
+		StringBuffer buffer = new StringBuffer(256);
+		buffer.append("<webSphere ");
+		buildAttributes(buffer);
+		buffer.append(" />");
+		return buffer.toString();
+	}
+
+	public String getNamespace() {
+		return NAMESPACE;
+	}
+
+	public IStatus validate() {
+		return Status.OK_STATUS;
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/server/WebsphereWebdocletTaskProvider.java b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/server/WebsphereWebdocletTaskProvider.java
new file mode 100644
index 0000000..c931815
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/server/WebsphereWebdocletTaskProvider.java
@@ -0,0 +1,34 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+package org.eclipse.jst.j2ee.xdoclet.runtime.internal.server;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jst.j2ee.xdoclet.runtime.internal.XDocletTaskProviderImpl;
+
+public class WebsphereWebdocletTaskProvider extends XDocletTaskProviderImpl {
+
+	public static String NAMESPACE = "webdoclet.websphere.";
+
+	public String getTask() {
+		StringBuffer buffer = new StringBuffer(256);
+		buffer.append("<webspherewebxml ");
+		buildAttributes(buffer);
+		buffer.append(" />");
+		return buffer.toString();
+	}
+
+	public String getNamespace() {
+		return NAMESPACE;
+	}
+
+	public IStatus validate() {
+		return Status.OK_STATUS;
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/tasks/DaoEjbdocletTaskProvider.java b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/tasks/DaoEjbdocletTaskProvider.java
new file mode 100644
index 0000000..b320cc2
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/tasks/DaoEjbdocletTaskProvider.java
@@ -0,0 +1,28 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+package org.eclipse.jst.j2ee.xdoclet.runtime.internal.tasks;
+
+import org.eclipse.jst.j2ee.xdoclet.runtime.internal.XDocletTaskProviderImpl;
+
+public class DaoEjbdocletTaskProvider extends XDocletTaskProviderImpl {
+
+	public static String NAMESPACE = "ejbdoclet.dao.";
+
+	public String getTask() {
+		StringBuffer buffer = new StringBuffer(256);
+		buffer.append("<dao ");
+		buildAttributes(buffer);
+		buffer.append(" />");
+		return buffer.toString();
+	}
+
+	public String getNamespace() {
+		return NAMESPACE;
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/tasks/DataObjectEjbdocletTaskProvider.java b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/tasks/DataObjectEjbdocletTaskProvider.java
new file mode 100644
index 0000000..4902a0d
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/tasks/DataObjectEjbdocletTaskProvider.java
@@ -0,0 +1,28 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+package org.eclipse.jst.j2ee.xdoclet.runtime.internal.tasks;
+
+import org.eclipse.jst.j2ee.xdoclet.runtime.internal.XDocletTaskProviderImpl;
+
+public class DataObjectEjbdocletTaskProvider extends XDocletTaskProviderImpl {
+
+	public static String NAMESPACE = "ejbdoclet.dataobject.";
+
+	public String getTask() {
+		StringBuffer buffer = new StringBuffer(256);
+		buffer.append("<dataobject ");
+		buildAttributes(buffer);
+		buffer.append(" />");
+		return buffer.toString();
+	}
+
+	public String getNamespace() {
+		return NAMESPACE;
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/tasks/DeploymentDescriptorEjbdocletTaskProvider.java b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/tasks/DeploymentDescriptorEjbdocletTaskProvider.java
new file mode 100644
index 0000000..d935596
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/tasks/DeploymentDescriptorEjbdocletTaskProvider.java
@@ -0,0 +1,38 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+package org.eclipse.jst.j2ee.xdoclet.runtime.internal.tasks;
+
+import org.eclipse.jst.j2ee.xdoclet.runtime.internal.XDocletTaskProviderImpl;
+
+public class DeploymentDescriptorEjbdocletTaskProvider extends XDocletTaskProviderImpl {
+
+	public static String NAMESPACE = "ejbdoclet.deploymentdescriptor.";
+
+	public String getTask() {
+		StringBuffer buffer = new StringBuffer(256);
+		buffer.append("<deploymentdescriptor ");
+		buildAttributes(buffer);
+		buffer.append(" />");
+		return buffer.toString();
+	}
+
+	public String getNamespace() {
+		return NAMESPACE;
+	}
+
+	protected void addAttribute(String attribute, StringBuffer stringBuffer) {
+		if ("clientjar".equals(attribute)) {
+			if (getClientProject() != null) {
+				super.addAttribute(attribute, stringBuffer);
+			}
+		} else {
+			super.addAttribute(attribute, stringBuffer);
+		}
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/tasks/DeploymentDescriptorWebdocletTaskProvider.java b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/tasks/DeploymentDescriptorWebdocletTaskProvider.java
new file mode 100644
index 0000000..a1c3522
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/tasks/DeploymentDescriptorWebdocletTaskProvider.java
@@ -0,0 +1,38 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+package org.eclipse.jst.j2ee.xdoclet.runtime.internal.tasks;
+
+import org.eclipse.jst.j2ee.xdoclet.runtime.internal.XDocletTaskProviderImpl;
+
+public class DeploymentDescriptorWebdocletTaskProvider extends XDocletTaskProviderImpl {
+
+	public static String NAMESPACE = "webdoclet.deploymentdescriptor.";
+
+	public String getTask() {
+		StringBuffer buffer = new StringBuffer(256);
+		buffer.append("<deploymentdescriptor ");
+		buildAttributes(buffer);
+		buffer.append(" />");
+		return buffer.toString();
+	}
+
+	public String getNamespace() {
+		return NAMESPACE;
+	}
+
+	protected void addAttribute(String attribute, StringBuffer stringBuffer) {
+		if ("clientjar".equals(attribute)) {
+			if (getClientProject() != null) {
+				super.addAttribute(attribute, stringBuffer);
+			}
+		} else {
+			super.addAttribute(attribute, stringBuffer);
+		}
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/tasks/EntitybmpEjbdocletTaskProvider.java b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/tasks/EntitybmpEjbdocletTaskProvider.java
new file mode 100644
index 0000000..2f74062
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/tasks/EntitybmpEjbdocletTaskProvider.java
@@ -0,0 +1,28 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+package org.eclipse.jst.j2ee.xdoclet.runtime.internal.tasks;
+
+import org.eclipse.jst.j2ee.xdoclet.runtime.internal.XDocletTaskProviderImpl;
+
+public class EntitybmpEjbdocletTaskProvider extends XDocletTaskProviderImpl {
+
+	public static String NAMESPACE = "ejbdoclet.entitybmp.";
+
+	public String getTask() {
+		StringBuffer buffer = new StringBuffer(256);
+		buffer.append("<entitybmp ");
+		buildAttributes(buffer);
+		buffer.append(" />");
+		return buffer.toString();
+	}
+
+	public String getNamespace() {
+		return NAMESPACE;
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/tasks/EntitycmpEjbdocletTaskProvider.java b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/tasks/EntitycmpEjbdocletTaskProvider.java
new file mode 100644
index 0000000..2981f16
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/tasks/EntitycmpEjbdocletTaskProvider.java
@@ -0,0 +1,28 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+package org.eclipse.jst.j2ee.xdoclet.runtime.internal.tasks;
+
+import org.eclipse.jst.j2ee.xdoclet.runtime.internal.XDocletTaskProviderImpl;
+
+public class EntitycmpEjbdocletTaskProvider extends XDocletTaskProviderImpl {
+
+	public static String NAMESPACE = "ejbdoclet.entitycmp.";
+
+	public String getTask() {
+		StringBuffer buffer = new StringBuffer(256);
+		buffer.append("<entitycmp ");
+		buildAttributes(buffer);
+		buffer.append(" />");
+		return buffer.toString();
+	}
+
+	public String getNamespace() {
+		return NAMESPACE;
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/tasks/EntitypkEjbdocletTaskProvider.java b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/tasks/EntitypkEjbdocletTaskProvider.java
new file mode 100644
index 0000000..86cae79
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/tasks/EntitypkEjbdocletTaskProvider.java
@@ -0,0 +1,28 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+package org.eclipse.jst.j2ee.xdoclet.runtime.internal.tasks;
+
+import org.eclipse.jst.j2ee.xdoclet.runtime.internal.XDocletTaskProviderImpl;
+
+public class EntitypkEjbdocletTaskProvider extends XDocletTaskProviderImpl {
+
+	public static String NAMESPACE = "ejbdoclet.entitypk.";
+
+	public String getTask() {
+		StringBuffer buffer = new StringBuffer(256);
+		buffer.append("<entitypk ");
+		buildAttributes(buffer);
+		buffer.append(" />");
+		return buffer.toString();
+	}
+
+	public String getNamespace() {
+		return NAMESPACE;
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/tasks/HomeInterfaceEjbdocletTaskProvider.java b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/tasks/HomeInterfaceEjbdocletTaskProvider.java
new file mode 100644
index 0000000..5b8bf66
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/tasks/HomeInterfaceEjbdocletTaskProvider.java
@@ -0,0 +1,28 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+package org.eclipse.jst.j2ee.xdoclet.runtime.internal.tasks;
+
+import org.eclipse.jst.j2ee.xdoclet.runtime.internal.XDocletTaskProviderImpl;
+
+public class HomeInterfaceEjbdocletTaskProvider extends XDocletTaskProviderImpl {
+
+	public static String NAMESPACE = "ejbdoclet.homeinterface.";
+
+	public String getTask() {
+		StringBuffer buffer = new StringBuffer(256);
+		buffer.append("<homeinterface ");
+		buildAttributes(buffer);
+		buffer.append(" />");
+		return buffer.toString();
+	}
+
+	public String getNamespace() {
+		return NAMESPACE;
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/tasks/LocalHomeInterfaceEjbdocletTaskProvider.java b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/tasks/LocalHomeInterfaceEjbdocletTaskProvider.java
new file mode 100644
index 0000000..569eca3
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/tasks/LocalHomeInterfaceEjbdocletTaskProvider.java
@@ -0,0 +1,28 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+package org.eclipse.jst.j2ee.xdoclet.runtime.internal.tasks;
+
+import org.eclipse.jst.j2ee.xdoclet.runtime.internal.XDocletTaskProviderImpl;
+
+public class LocalHomeInterfaceEjbdocletTaskProvider extends XDocletTaskProviderImpl {
+
+	public static String NAMESPACE = "ejbdoclet.localhomeinterface.";
+
+	public String getTask() {
+		StringBuffer buffer = new StringBuffer(256);
+		buffer.append("<localhomeinterface ");
+		buildAttributes(buffer);
+		buffer.append(" />");
+		return buffer.toString();
+	}
+
+	public String getNamespace() {
+		return NAMESPACE;
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/tasks/LocalInterfaceEjbdocletTaskProvider.java b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/tasks/LocalInterfaceEjbdocletTaskProvider.java
new file mode 100644
index 0000000..8f37da9
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/tasks/LocalInterfaceEjbdocletTaskProvider.java
@@ -0,0 +1,28 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+package org.eclipse.jst.j2ee.xdoclet.runtime.internal.tasks;
+
+import org.eclipse.jst.j2ee.xdoclet.runtime.internal.XDocletTaskProviderImpl;
+
+public class LocalInterfaceEjbdocletTaskProvider extends XDocletTaskProviderImpl {
+
+	public static String NAMESPACE = "ejbdoclet.localinterface.";
+
+	public String getTask() {
+		StringBuffer buffer = new StringBuffer(256);
+		buffer.append("<localinterface ");
+		buildAttributes(buffer);
+		buffer.append(" />");
+		return buffer.toString();
+	}
+
+	public String getNamespace() {
+		return NAMESPACE;
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/tasks/MdbEjbdocletTaskProvider.java b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/tasks/MdbEjbdocletTaskProvider.java
new file mode 100644
index 0000000..ddf15d5
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/tasks/MdbEjbdocletTaskProvider.java
@@ -0,0 +1,28 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+package org.eclipse.jst.j2ee.xdoclet.runtime.internal.tasks;
+
+import org.eclipse.jst.j2ee.xdoclet.runtime.internal.XDocletTaskProviderImpl;
+
+public class MdbEjbdocletTaskProvider extends XDocletTaskProviderImpl {
+
+	public static String NAMESPACE = "ejbdoclet.mdb.";
+
+	public String getTask() {
+		StringBuffer buffer = new StringBuffer(256);
+		buffer.append("<mdb ");
+		buildAttributes(buffer);
+		buffer.append(" />");
+		return buffer.toString();
+	}
+
+	public String getNamespace() {
+		return NAMESPACE;
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/tasks/RemoteInterfaceEjbdocletTaskProvider.java b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/tasks/RemoteInterfaceEjbdocletTaskProvider.java
new file mode 100644
index 0000000..2aa43fe
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/tasks/RemoteInterfaceEjbdocletTaskProvider.java
@@ -0,0 +1,28 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+package org.eclipse.jst.j2ee.xdoclet.runtime.internal.tasks;
+
+import org.eclipse.jst.j2ee.xdoclet.runtime.internal.XDocletTaskProviderImpl;
+
+public class RemoteInterfaceEjbdocletTaskProvider extends XDocletTaskProviderImpl {
+
+	public static String NAMESPACE = "ejbdoclet.remoteinterface.";
+
+	public String getTask() {
+		StringBuffer buffer = new StringBuffer(256);
+		buffer.append("<remoteinterface ");
+		buildAttributes(buffer);
+		buffer.append(" />");
+		return buffer.toString();
+	}
+
+	public String getNamespace() {
+		return NAMESPACE;
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/tasks/SessionEjbdocletTaskProvider.java b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/tasks/SessionEjbdocletTaskProvider.java
new file mode 100644
index 0000000..9882c47
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/tasks/SessionEjbdocletTaskProvider.java
@@ -0,0 +1,28 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+package org.eclipse.jst.j2ee.xdoclet.runtime.internal.tasks;
+
+import org.eclipse.jst.j2ee.xdoclet.runtime.internal.XDocletTaskProviderImpl;
+
+public class SessionEjbdocletTaskProvider extends XDocletTaskProviderImpl {
+
+	public static String NAMESPACE = "ejbdoclet.session.";
+
+	public String getTask() {
+		StringBuffer buffer = new StringBuffer(256);
+		buffer.append("<session ");
+		buildAttributes(buffer);
+		buffer.append(" />");
+		return buffer.toString();
+	}
+
+	public String getNamespace() {
+		return NAMESPACE;
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/tasks/UtilObjectEjbdocletTaskProvider.java b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/tasks/UtilObjectEjbdocletTaskProvider.java
new file mode 100644
index 0000000..e65dc74
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/tasks/UtilObjectEjbdocletTaskProvider.java
@@ -0,0 +1,28 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+package org.eclipse.jst.j2ee.xdoclet.runtime.internal.tasks;
+
+import org.eclipse.jst.j2ee.xdoclet.runtime.internal.XDocletTaskProviderImpl;
+
+public class UtilObjectEjbdocletTaskProvider extends XDocletTaskProviderImpl {
+
+	public static String NAMESPACE = "ejbdoclet.utilobject.";
+
+	public String getTask() {
+		StringBuffer buffer = new StringBuffer(256);
+		buffer.append("<utilobject ");
+		buildAttributes(buffer);
+		buffer.append(" />");
+		return buffer.toString();
+	}
+
+	public String getNamespace() {
+		return NAMESPACE;
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/tasks/ValueObjectEjbdocletTaskProvider.java b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/tasks/ValueObjectEjbdocletTaskProvider.java
new file mode 100644
index 0000000..0acd13c
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.xdoclet.runtime/src/org/eclipse/jst/j2ee/xdoclet/runtime/internal/tasks/ValueObjectEjbdocletTaskProvider.java
@@ -0,0 +1,28 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+package org.eclipse.jst.j2ee.xdoclet.runtime.internal.tasks;
+
+import org.eclipse.jst.j2ee.xdoclet.runtime.internal.XDocletTaskProviderImpl;
+
+public class ValueObjectEjbdocletTaskProvider extends XDocletTaskProviderImpl {
+
+	public static String NAMESPACE = "ejbdoclet.valueobject.";
+
+	public String getTask() {
+		StringBuffer buffer = new StringBuffer(256);
+		buffer.append("<valueobject ");
+		buildAttributes(buffer);
+		buffer.append(" />");
+		return buffer.toString();
+	}
+
+	public String getNamespace() {
+		return NAMESPACE;
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee/META-INF/MANIFEST.MF b/plugins/org.eclipse.jst.j2ee/META-INF/MANIFEST.MF
index 4cb277f..03043e5 100644
--- a/plugins/org.eclipse.jst.j2ee/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.jst.j2ee/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %Bundle-Name.0
 Bundle-SymbolicName: org.eclipse.jst.j2ee; singleton:=true
-Bundle-Version: 1.2.200.qualifier
+Bundle-Version: 1.2.300.qualifier
 Bundle-Activator: org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin
 Bundle-Vendor: %Bundle-Vendor.0
 Bundle-Localization: plugin
diff --git a/plugins/org.eclipse.jst.j2ee/earproject/org/eclipse/jst/j2ee/project/facet/JavaProjectMigrationOperation.java b/plugins/org.eclipse.jst.j2ee/earproject/org/eclipse/jst/j2ee/project/facet/JavaProjectMigrationOperation.java
index 6df1cd5..945e2b8 100644
--- a/plugins/org.eclipse.jst.j2ee/earproject/org/eclipse/jst/j2ee/project/facet/JavaProjectMigrationOperation.java
+++ b/plugins/org.eclipse.jst.j2ee/earproject/org/eclipse/jst/j2ee/project/facet/JavaProjectMigrationOperation.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2003, 2007 IBM Corporation and others.
+ * Copyright (c) 2003, 2018 IBM 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
@@ -20,7 +20,7 @@
 import org.eclipse.jdt.core.JavaCore;
 import org.eclipse.jem.workbench.utility.JemProjectUtilities;
 import org.eclipse.jst.common.project.facet.JavaFacetInstallDataModelProvider;
-import org.eclipse.jst.common.project.facet.JavaFacetUtils;
+import org.eclipse.jst.common.project.facet.core.JavaFacet;
 import org.eclipse.jst.j2ee.internal.plugin.IJ2EEModuleConstants;
 import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
 import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
@@ -90,12 +90,18 @@
 		String jdtVersion = jProj.getOption(JavaCore.COMPILER_COMPLIANCE, true );
 		
 		if (jdtVersion.startsWith("1.3")) { //$NON-NLS-1$
-			return JavaFacetUtils.JAVA_13;
+			return JavaFacet.VERSION_1_3;
 		} else if (jdtVersion.startsWith("1.4")) { //$NON-NLS-1$
-			return JavaFacetUtils.JAVA_14;
+			return JavaFacet.VERSION_1_4;
 		}else if (jdtVersion.startsWith("1.5")) { //$NON-NLS-1$
-			return JavaFacetUtils.JAVA_50;
+			return JavaFacet.VERSION_1_5;
+		}else if (jdtVersion.startsWith("1.6")) { //$NON-NLS-1$
+			return JavaFacet.VERSION_1_6;
+		}else if (jdtVersion.startsWith("1.7")) { //$NON-NLS-1$
+			return JavaFacet.VERSION_1_7;
+		}else if (jdtVersion.startsWith("1.8")) { //$NON-NLS-1$
+			return JavaFacet.VERSION_1_8;
 		}
-		return JavaFacetUtils.JAVA_60;	
+		return JavaFacet.VERSION_9;
 	}
 }
diff --git a/plugins/org.eclipse.jst.j2ee/pom.xml b/plugins/org.eclipse.jst.j2ee/pom.xml
index b720d07..1e6c424 100644
--- a/plugins/org.eclipse.jst.j2ee/pom.xml
+++ b/plugins/org.eclipse.jst.j2ee/pom.xml
@@ -15,13 +15,12 @@
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
+    <artifactId>javaee.plugins</artifactId>
     <version>3.6.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
   </parent>
 
   <groupId>org.eclipse.webtools.javaee</groupId>
   <artifactId>org.eclipse.jst.j2ee</artifactId>
-  <version>1.2.200-SNAPSHOT</version>
+  <version>1.2.300-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
 </project>
diff --git a/plugins/org.eclipse.jst.jee.ejb/.classpath b/plugins/org.eclipse.jst.jee.ejb/.classpath
new file mode 100644
index 0000000..d4c5c7d
--- /dev/null
+++ b/plugins/org.eclipse.jst.jee.ejb/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="ejb"/>
+	<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="output" path="bin"/>
+</classpath>
diff --git a/plugins/org.eclipse.jst.jee.ejb/.cvsignore b/plugins/org.eclipse.jst.jee.ejb/.cvsignore
new file mode 100644
index 0000000..7722bc8
--- /dev/null
+++ b/plugins/org.eclipse.jst.jee.ejb/.cvsignore
@@ -0,0 +1,2 @@
+build.xml
+javaCompiler...args
diff --git a/plugins/org.eclipse.jst.jee.ejb/.project b/plugins/org.eclipse.jst.jee.ejb/.project
new file mode 100644
index 0000000..ed47413
--- /dev/null
+++ b/plugins/org.eclipse.jst.jee.ejb/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.jst.jee.ejb</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/plugins/org.eclipse.wst.web.ui/.settings/org.eclipse.jdt.core.prefs b/plugins/org.eclipse.jst.jee.ejb/.settings/org.eclipse.jdt.core.prefs
similarity index 100%
copy from plugins/org.eclipse.wst.web.ui/.settings/org.eclipse.jdt.core.prefs
copy to plugins/org.eclipse.jst.jee.ejb/.settings/org.eclipse.jdt.core.prefs
diff --git a/plugins/org.eclipse.jst.jee.ejb/META-INF/MANIFEST.MF b/plugins/org.eclipse.jst.jee.ejb/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..8ab4add
--- /dev/null
+++ b/plugins/org.eclipse.jst.jee.ejb/META-INF/MANIFEST.MF
@@ -0,0 +1,33 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name.0
+Bundle-SymbolicName: org.eclipse.jst.jee.ejb;singleton:=true
+Bundle-Version: 1.0.500.qualifier
+Bundle-Activator: org.eclipse.jst.jee.ejb.Activator
+Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.wst.common.modulecore;bundle-version="[1.1.0,2.0.0)",
+ org.eclipse.core.resources;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.jdt.core;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.wst.common.frameworks;bundle-version="[1.1.0,2.0.0)",
+ org.eclipse.wst.common.project.facet.core;bundle-version="[1.2.0,2.0.0)",
+ org.eclipse.jst.j2ee;bundle-version="[1.1.0,1.3.0)",
+ org.eclipse.jst.common.frameworks;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.jst.common.project.facet.core;bundle-version="[1.1.0,2.0.0)",
+ org.eclipse.jem.util;bundle-version="[2.0.0,3.0.0)",
+ org.eclipse.jst.j2ee.core;bundle-version="[1.1.0,2.0.0)",
+ org.eclipse.jst.jee;bundle-version="[1.0.0,1.1.0)",
+ org.eclipse.core.commands;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.emf.common;bundle-version="[2.2.0,3.0.0)",
+ org.eclipse.emf.ecore;bundle-version="[2.2.0,3.0.0)",
+ org.eclipse.emf.ecore.xmi;bundle-version="[2.2.0,3.0.0)",
+ org.eclipse.jst.j2ee.ejb;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.wst.common.emf;bundle-version="[1.1.0,2.0.0)",
+ org.eclipse.wst.common.emfworkbench.integration;bundle-version="[1.1.0,2.0.0)",
+ org.eclipse.wst.validation;bundle-version="[1.2.0,2.0.0)"
+Eclipse-LazyStart: true
+Bundle-Localization: plugin
+Bundle-Vendor: %Bundle-Vendor.0
+Export-Package: org.eclipse.jst.jee.ejb,
+ org.eclipse.jst.jee.model.internal,
+ org.eclipse.jst.jee.model.internal.mergers
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/plugins/org.eclipse.jst.jee.ejb/about.html b/plugins/org.eclipse.jst.jee.ejb/about.html
new file mode 100644
index 0000000..0799bdb
--- /dev/null
+++ b/plugins/org.eclipse.jst.jee.ejb/about.html
@@ -0,0 +1,34 @@
+<!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">
+
+<H3>About This Content</H3>
+
+<P>June, 2008</P>
+
+<H3>License</H3>
+
+<P>The Eclipse Foundation makes available all content in this plug-in 
+("Content"). Unless otherwise indicated below, the Content is provided to you 
+under the terms and conditions of the Eclipse Public License Version 1.0 
+("EPL"). A copy of the EPL is available at
+<A href="http://www.eclipse.org/org/documents/epl-v10.php">http://www.eclipse.org/org/documents/epl-v10.php</A>. 
+For purposes of the EPL, "Program" 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 ("Redistributor") 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 
+and such source code may be obtained at
+<A href="http://www.eclipse.org/">http://www.eclipse.org/</A>.</P>
+
+</BODY>
+</HTML>
diff --git a/plugins/org.eclipse.jst.jee.ejb/build.properties b/plugins/org.eclipse.jst.jee.ejb/build.properties
new file mode 100644
index 0000000..3cfb4c5
--- /dev/null
+++ b/plugins/org.eclipse.jst.jee.ejb/build.properties
@@ -0,0 +1,17 @@
+###############################################################################
+# Copyright (c) 2005, 2007 IBM 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:
+#     IBM Corporation - initial API and implementation
+###############################################################################
+source.. = ejb/
+output.. = bin/
+bin.includes = plugin.xml,\
+               .,\
+               META-INF/,\
+               plugin.properties,\
+               about.html
diff --git a/plugins/org.eclipse.jst.jee.ejb/ejb/org/eclipse/jst/jee/ejb/Activator.java b/plugins/org.eclipse.jst.jee.ejb/ejb/org/eclipse/jst/jee/ejb/Activator.java
new file mode 100644
index 0000000..7df626c
--- /dev/null
+++ b/plugins/org.eclipse.jst.jee.ejb/ejb/org/eclipse/jst/jee/ejb/Activator.java
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.jee.ejb;
+
+import org.eclipse.wst.common.frameworks.internal.WTPPlugin;
+import org.osgi.framework.BundleContext;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import java.lang.Throwable;
+import org.eclipse.core.runtime.CoreException;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class Activator extends WTPPlugin {
+
+	// The plug-in ID
+	public static final String PLUGIN_ID = "org.eclipse.jst.jee.ejb"; //$NON-NLS-1$
+
+	// The shared instance
+	private static Activator plugin;
+	
+	/**
+	 * The constructor
+	 */
+	public Activator() {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+	 */
+	@Override
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+		plugin = this;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+	 */
+	@Override
+	public void stop(BundleContext context) throws Exception {
+		plugin = null;
+		super.stop(context);
+	}
+
+	/**
+	 * Returns the shared instance
+	 *
+	 * @return the shared instance
+	 */
+	public static Activator getDefault() {
+		return plugin;
+	}
+
+	   /*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.common.frameworks.internal.WTPPlugin#getPluginID()
+	 */
+	@Override
+	public String getPluginID() {
+		return PLUGIN_ID;
+	}
+
+	public static IStatus createStatus(int severity, String message, Throwable exception) {
+		return new Status(severity, PLUGIN_ID, message, exception);
+	}
+
+	public static IStatus createStatus(int severity, String message) {
+		return createStatus(severity, message, null);
+	}
+
+	public static void logError(Throwable exception) {
+		Platform.getLog(Platform.getBundle(PLUGIN_ID)).log( createStatus(IStatus.ERROR, exception.getMessage(), exception));
+	}
+
+	public static void logError(CoreException exception) {
+		Platform.getLog(Platform.getBundle(PLUGIN_ID)).log( exception.getStatus() );
+	}
+	
+}
diff --git a/plugins/org.eclipse.jst.jee.ejb/ejb/org/eclipse/jst/jee/ejb/validation/internal/Messages.java b/plugins/org.eclipse.jst.jee.ejb/ejb/org/eclipse/jst/jee/ejb/validation/internal/Messages.java
new file mode 100644
index 0000000..766fef9
--- /dev/null
+++ b/plugins/org.eclipse.jst.jee.ejb/ejb/org/eclipse/jst/jee/ejb/validation/internal/Messages.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2010 SAP AG 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:
+ *     SAP AG - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.jee.ejb.validation.internal;
+
+import org.eclipse.osgi.util.NLS;
+
+
+public class Messages extends NLS {
+
+	private static final String BUNDLE_NAME = "org.eclipse.jst.jee.ejb.validation.internal.messages"; //$NON-NLS-1$
+	
+
+	private Messages() {
+		// Do not instantiate
+	}
+	
+	public static String NO_BEANS_ERROR;
+	public static String NO_BEANS_ERROR_LOCATION;
+
+	static {
+		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+	}
+}
diff --git a/plugins/org.eclipse.jst.jee.ejb/ejb/org/eclipse/jst/jee/ejb/validation/internal/UIEJB3Validator.java b/plugins/org.eclipse.jst.jee.ejb/ejb/org/eclipse/jst/jee/ejb/validation/internal/UIEJB3Validator.java
new file mode 100644
index 0000000..849ea39
--- /dev/null
+++ b/plugins/org.eclipse.jst.jee.ejb/ejb/org/eclipse/jst/jee/ejb/validation/internal/UIEJB3Validator.java
@@ -0,0 +1,97 @@
+/*******************************************************************************
+ * Copyright (c) 2010 SAP AG 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:
+ *     SAP AG - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.jee.ejb.validation.internal;
+
+import java.text.MessageFormat;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceDelta;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jst.j2ee.model.ModelProviderManager;
+import org.eclipse.jst.j2ee.project.JavaEEProjectUtilities;
+import org.eclipse.jst.javaee.ejb.EJBJar;
+import org.eclipse.jst.javaee.ejb.EnterpriseBeans;
+import org.eclipse.jst.jee.ejb.Activator;
+import org.eclipse.wst.validation.AbstractValidator;
+import org.eclipse.wst.validation.ValidationEvent;
+import org.eclipse.wst.validation.ValidationResult;
+import org.eclipse.wst.validation.ValidationState;
+import org.eclipse.wst.validation.Validator;
+import org.eclipse.wst.validation.ValidatorMessage;
+import org.eclipse.wst.validation.internal.MarkerManager;
+import org.eclipse.wst.validation.internal.ValManager;
+import org.eclipse.wst.validation.internal.ValOperation;
+
+@SuppressWarnings("restriction")
+public class UIEJB3Validator extends AbstractValidator {
+
+	private static final String NO_BEANS_MESSAGE = "org.eclipse.jst.jee.ejb3.nobeansmessage"; //$NON-NLS-1$
+	
+	public static String ID = "org.eclipse.jst.jee.ejb3.validator"; //$NON-NLS-1$
+	public static String MARKER_ID_NO_BEANS = "org.eclipse.jst.jee.ejb3.nobeans"; //$NON-NLS-1$
+		
+	@Override
+	public void validationStarting(IProject project, ValidationState state, IProgressMonitor monitor){		
+		Validator v = ValManager.getDefault().getValidator(UIEJB3Validator.ID, project);
+		if (project != null) 
+			ValManager.getDefault().validate(v, new ValOperation(), project, IResourceDelta.NO_CHANGE, new NullProgressMonitor(), null);
+	}	
+	
+	@Override
+	public ValidationResult validate(IResource resource, int kind, ValidationState state, IProgressMonitor monitor) {
+		if ((resource == null) || !IProject.class.isInstance(resource))  
+			return null;
+		IProject proj = (IProject)resource;
+		try {
+			MarkerManager.getDefault().clearMarker(proj, getParent());
+		} catch (CoreException e) {
+			Activator.logError(e);
+		}
+		if (!JavaEEProjectUtilities.isEJBProject(proj)) 
+			return null;
+		EJBJar ejbJar = (EJBJar)ModelProviderManager.getModelProvider(proj).getModelObject();
+		EnterpriseBeans ebs = ejbJar.getEnterpriseBeans();
+		if (ebs == null || ebs.getSessionBeans().size() + ebs.getMessageDrivenBeans().size() + ebs.getEntityBeans().size() == 0) {
+			ValidationResult vRes = new ValidationResult();
+			ValidatorMessage vMsg = createValidatorMessage(
+					Messages.NO_BEANS_ERROR, 
+					proj, 
+					getParent().getMessage(NO_BEANS_MESSAGE).getCurrent().getMarkerSeverity(), 
+					IMarker.PRIORITY_HIGH); 
+			vRes.add(vMsg);
+			return vRes;
+		}		
+		return null;
+	}	
+	
+	@Override
+	public ValidationResult validate(ValidationEvent event, ValidationState state, IProgressMonitor monitor){
+		IResource res = event.getResource();
+		return validate(res, 0, state, monitor);
+	}	
+	
+	private static ValidatorMessage createValidatorMessage(String txt, 
+			  IResource res,
+			  int severity,
+			  int priority) {
+		ValidatorMessage msg = ValidatorMessage.create(txt, res);
+		msg.setAttribute(IMarker.SEVERITY, severity);
+		msg.setAttribute(IMarker.PRIORITY, priority);
+		msg.setAttribute(IMarker.LOCATION, MessageFormat.format(Messages.NO_BEANS_ERROR_LOCATION, new Object[] { res.getName() }));
+		msg.setType(MARKER_ID_NO_BEANS); 
+		return msg;
+	}	
+	
+}
diff --git a/plugins/org.eclipse.jst.jee.ejb/ejb/org/eclipse/jst/jee/ejb/validation/internal/messages.properties b/plugins/org.eclipse.jst.jee.ejb/ejb/org/eclipse/jst/jee/ejb/validation/internal/messages.properties
new file mode 100644
index 0000000..128c286
--- /dev/null
+++ b/plugins/org.eclipse.jst.jee.ejb/ejb/org/eclipse/jst/jee/ejb/validation/internal/messages.properties
@@ -0,0 +1,12 @@
+###############################################################################
+# Copyright (c) 2010 SAP AG 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:
+#     SAP AG - initial API and implementation
+###############################################################################
+NO_BEANS_ERROR=An EJB module must contain one or more enterprise beans.
+NO_BEANS_ERROR_LOCATION={0} project
diff --git a/plugins/org.eclipse.jst.jee.ejb/ejb/org/eclipse/jst/jee/model/internal/EJB3MergedModelProvider.java b/plugins/org.eclipse.jst.jee.ejb/ejb/org/eclipse/jst/jee/model/internal/EJB3MergedModelProvider.java
new file mode 100644
index 0000000..92a9398
--- /dev/null
+++ b/plugins/org.eclipse.jst.jee.ejb/ejb/org/eclipse/jst/jee/model/internal/EJB3MergedModelProvider.java
@@ -0,0 +1,233 @@
+/***********************************************************************
+ * Copyright (c) 2008 by SAP AG, Walldorf. 
+ * 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:
+ *     SAP AG - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jst.jee.model.internal;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jst.j2ee.internal.J2EEConstants;
+import org.eclipse.jst.j2ee.internal.plugin.IJ2EEModuleConstants;
+import org.eclipse.jst.j2ee.model.IModelProvider;
+import org.eclipse.jst.j2ee.model.IModelProviderEvent;
+import org.eclipse.jst.j2ee.model.IModelProviderListener;
+import org.eclipse.jst.javaee.ejb.EJBJar;
+import org.eclipse.jst.javaee.ejb.EjbFactory;
+import org.eclipse.jst.jee.model.internal.common.AbstractMergedModelProvider;
+import org.eclipse.jst.jee.model.internal.mergers.EjbJarMerger;
+import org.eclipse.jst.jee.model.internal.mergers.ModelElementMerger;
+import org.eclipse.jst.jee.model.internal.mergers.ModelException;
+import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
+import org.eclipse.jst.jee.ejb.Activator;
+
+/**
+ * This model provider gives a "merged" view of the model loaded from the
+ * deployment descriptor and from annotated java classes.
+ * 
+ * <p>
+ * A "merged" view contains all the elements that are described in the xml but
+ * not with annotation.
+ * 
+ * A "merged" view contains all the elements that are described with annotations
+ * but not in the xml.
+ * 
+ * In case of conflicts a "merged" view contains the value of the xml.
+ * </p>
+ * 
+ * 
+ * Listeners registered with {@link #addListener(IModelProviderListener)} will
+ * receive notification for changes in the deployment descriptor and in the
+ * annotations model. Notifications may come in different thread from the one
+ * changing the resource.
+ * 
+ * <p>
+ * After a notification for changes in the model it is mandatory to call
+ * {@link #getModelObject()} to get a new reference to the model object. A new
+ * model object might have been created after processing the notification and
+ * merging the views.
+ * </p>
+ * 
+ * In case there is an ejb-client-jar element in the deployment descriptor
+ * EJB3MergedModelProvider will provide this information to the
+ * {@link EJBAnnotationReader}.
+ * 
+ * 
+ * 
+ * @author Kiril Mitov k.mitov@sap.com
+ * 
+ */
+public class EJB3MergedModelProvider extends AbstractMergedModelProvider<EJBJar> {
+
+	private IProject clientProject;
+	protected Path EJB_JAR_XML_PATH = new Path(J2EEConstants.EJBJAR_DD_URI);
+
+
+	public EJB3MergedModelProvider(IProject project) {
+		super(project);
+	}
+
+	@Override
+	protected IModelProvider loadAnnotationModel(EJBJar ddModel) throws CoreException {
+		if (ddModel.getEjbClientJar() != null)
+			clientProject = ResourcesPlugin.getWorkspace().getRoot().getProject(
+					getClientNameFromJarName(ddModel.getEjbClientJar()));
+		return new EJBAnnotationReader(ProjectFacetsManager.create(project), clientProject);
+	}
+
+	@Override
+	protected IModelProvider loadDeploymentDescriptorModel() throws CoreException {
+		return new Ejb3ModelProvider(project);
+	}
+
+	protected EJBJar getAnnotationEjbJar() {
+		return (EJBJar) annotationModelProvider.getModelObject();
+	}
+
+	protected EJBJar getXmlEjbJar() {
+		return (EJBJar) ddProvider.getModelObject();
+	}
+
+	public Object getModelObject(IPath modelPath) {
+		if (modelPath == null){
+			return getModelObject();
+		} else if (EJB_JAR_XML_PATH.equals(modelPath)){
+			return getXmlEjbJar();
+		} else if ("java".equals(modelPath.getFileExtension()) || "class".equals(modelPath.getFileExtension())) { //$NON-NLS-1$ //$NON-NLS-2$
+			return getAnnotationEjbJar();
+		}
+		return getModelObject();
+	}
+
+	@Override
+	public void modify(Runnable runnable, IPath modelPath) {
+		/*
+		 * Someone has called modify before loading the model. Try to load the
+		 * model.
+		 */
+		if (mergedModel == null)
+			getMergedModel();
+		if (isDisposed()) {
+			return;
+		}
+		modifyWithBackup(runnable, modelPath);
+	}
+
+	/*
+	 * The method will call modify to the ddProvider and during this time the
+	 * getMergedModel() method will return the ddModel.
+	 * 
+	 * After dd modify is finished there will be a merge between dd model and
+	 * annotation model.
+	 * 
+	 * During dd modify there might be notifications from ddProvider which will
+	 * result in changes of the mergedModel.
+	 */
+	private void modifyWithBackup(Runnable runnable, IPath modelPath) {
+		EJBJar backup = mergedModel;
+		try {
+			mergedModel = (EJBJar) ddProvider.getModelObject();
+			ddProvider.modify(runnable, modelPath);
+		} finally {
+			mergedModel = backup;
+		}
+		clearModel(mergedModel);
+		/*
+		 * Reload the model.
+		 */
+		merge(getXmlEjbJar(), getAnnotationEjbJar());
+	}
+
+	@Override
+	protected void annotationModelChanged(IModelProviderEvent event) {
+		internalModelChanged(event);
+	}
+
+	@Override
+	protected void xmlModelChanged(IModelProviderEvent event) {
+		internalModelChanged(event);
+	}
+
+	/*
+	 * Notifications from xml and annotation may come in different threads. This
+	 * depends on the implementation of the model providers, but to make sure
+	 * that no race conditions occurs I am synchronizing this method.
+	 */
+	private synchronized void internalModelChanged(IModelProviderEvent event) {
+		/*
+		 * The client project was changed. Reload the annotation model.
+		 */
+		if (clientProject == null && getXmlEjbJar().getEjbClientJar() != null) {
+			reloadAnnotationModel();
+		} else if (clientProject != null
+				&& !clientProject.getName().equals(getClientNameFromJarName(getXmlEjbJar().getEjbClientJar()))) {
+			reloadAnnotationModel();
+		}
+		merge(getXmlEjbJar(), getAnnotationEjbJar());
+		notifyListeners(event);
+	}
+
+	private void reloadAnnotationModel() {
+		try {
+			disableInternalNotifications();
+			((EJBAnnotationReader) annotationModelProvider).dispose();
+			annotationModelProvider = loadAnnotationModel(getXmlEjbJar());
+			enableInternalNotifications();
+		} catch (CoreException e) {
+			Activator.logError(e);
+		}
+	}
+
+	private String getClientNameFromJarName(String jarName) {
+		if (jarName == null)
+			return null;
+		if (jarName.endsWith(IJ2EEModuleConstants.JAR_EXT))
+			return jarName.substring(0, jarName.lastIndexOf(IJ2EEModuleConstants.JAR_EXT));
+		return jarName;
+	}
+
+	@Override
+	protected EJBJar merge(EJBJar ddModel, EJBJar annotationsModel) {
+		try {
+			if (mergedModel != ddModel) {
+				clearModel(mergedModel);
+				mergedModel.setEnterpriseBeans(EjbFactory.eINSTANCE.createEnterpriseBeans());
+				mergeWithModel(ddModel);
+				mergeWithModel(annotationsModel);
+			}
+		} catch (ModelException e) {
+			Activator.logError(e);
+		}
+		return mergedModel;
+	}
+
+	private void mergeWithModel(EJBJar annotationsModel) throws ModelException {
+		EjbJarMerger merger = new EjbJarMerger(mergedModel, annotationsModel, ModelElementMerger.ADD);
+		merger.process();
+	}
+
+	private void clearModel(EJBJar jar) {
+		jar.setAssemblyDescriptor(null);
+		jar.setEnterpriseBeans(null);
+		jar.getDescriptions().clear();
+		jar.getDisplayNames().clear();
+		jar.setRelationships(null);
+		jar.setEjbClientJar(null);
+		jar.setInterceptors(null);
+		jar.getIcons().clear();
+	}
+
+	@Override
+	protected EJBJar createNewModelInstance() {
+		return EjbFactory.eINSTANCE.createEJBJar();
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.jee.ejb/ejb/org/eclipse/jst/jee/model/internal/EJBAnnotationReader.java b/plugins/org.eclipse.jst.jee.ejb/ejb/org/eclipse/jst/jee/model/internal/EJBAnnotationReader.java
new file mode 100644
index 0000000..5362105
--- /dev/null
+++ b/plugins/org.eclipse.jst.jee.ejb/ejb/org/eclipse/jst/jee/model/internal/EJBAnnotationReader.java
@@ -0,0 +1,646 @@
+/***********************************************************************
+ * Copyright (c) 2008 by SAP AG, Walldorf. 
+ * 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:
+ *     SAP AG - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jst.jee.model.internal;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.IJavaElementDelta;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IPackageFragmentRoot;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jst.j2ee.model.IModelProviderEvent;
+import org.eclipse.jst.j2ee.model.IModelProviderListener;
+import org.eclipse.jst.javaee.core.EjbLocalRef;
+import org.eclipse.jst.javaee.core.JavaEEObject;
+import org.eclipse.jst.javaee.core.ResourceRef;
+import org.eclipse.jst.javaee.core.SecurityRole;
+import org.eclipse.jst.javaee.core.SecurityRoleRef;
+import org.eclipse.jst.javaee.ejb.EJBJar;
+import org.eclipse.jst.javaee.ejb.EjbFactory;
+import org.eclipse.jst.javaee.ejb.EnterpriseBeans;
+import org.eclipse.jst.javaee.ejb.MessageDrivenBean;
+import org.eclipse.jst.javaee.ejb.SessionBean;
+import org.eclipse.jst.jee.model.internal.common.AbstractAnnotationModelProvider;
+import org.eclipse.jst.jee.model.internal.common.ManyToOneRelation;
+import org.eclipse.jst.jee.model.internal.common.Result;
+import org.eclipse.wst.common.project.facet.core.IFacetedProject;
+
+/**
+ * This class provides a javaee ejb EMF model builded from the *.java files
+ * located in the project, over which the instance is working on.
+ * 
+ * The project is passed in the constructor
+ * {@link #EJBAnnotationReader(IFacetedProject, IProject))}.
+ * 
+ * The loaded model is returned from {@link #getEJBJar()}.
+ * 
+ * Model changes can occur if a java file in the project is changed. When JDT
+ * model is changed, EJBAnnotationReader will rebuild is model. The current
+ * implementation is doing a best try to minimize the number of change events
+ * from JDT that cause the model to be rebuild.
+ * 
+ * A listener is notified for changes in the model. The notification of the
+ * listener may occur in the same or in another thread from the one changing the
+ * resource.
+ * 
+ * <p>
+ * The class is maintaining a reference between the bean and the interfaces it
+ * depends on. A bean depends on the resources of it business interfaces, of the
+ * interfaces of the resource and ejb annotation and probably other. This is an
+ * implementation detail. What the EJBAnnotationReader guarantees is that when a
+ * file is changed and there is a model object depending on this file the ejbJar
+ * will be successfully rebuilded.
+ * 
+ * For example two bean can implements the same interface
+ * <p>
+ * <code>class Bean1 implements Interface {}</code>
+ * <code>class Bean2 implements Interface {}</code>
+ * <code>@Local interface Interface {}</code>
+ * 
+ * If in this moment Interface is changed to :
+ * <code>@Remote interface Interface {}</code>
+ * 
+ * then Bean1 and Bean2 will be rebuilded and will contain Interface1 in their
+ * business remotes list. Not it their business locals list
+ * </p>
+ * </p>
+ * 
+ * @author Kiril Mitov k.mitov@sap.com
+ * 
+ */
+public class EJBAnnotationReader extends AbstractAnnotationModelProvider<EJBJar>{
+
+	/**
+	 * An abstraction of a reference between a model object and an interface.
+	 * This class can be used in collections as a key for differing a reference
+	 * from a bean to an interface.
+	 * 
+	 * <p>
+	 * One bean can refer to many interfaces. One interface can be referred by
+	 * many beans. This leads to a situation of many to many relation which is
+	 * model using {@link ManyToOneRelation} with this BeanInterfaceRef class.
+	 * Many unique BeanInterfaceRefs can refer to one interface.
+	 * </p>
+	 * 
+	 * One BeanInterfaceRef is considered equal to another BeanInterfaceRef if
+	 * they refer to the same "modelObject" with the same "interface" value.
+	 * 
+	 * @see EJBAnnotationReader#beanRefToResolvedInterface
+	 * @author Kiril Mitov k.mitov@sap.com
+	 * 
+	 */
+	private static class BeanInterfaceRef {
+
+		private String interfacee;
+		private JavaEEObject modelObject;
+
+		public BeanInterfaceRef(String interfacee, JavaEEObject modelObject) {
+			super();
+			this.interfacee = interfacee;
+			this.modelObject = modelObject;
+		}
+
+		public JavaEEObject getModelObject() {
+			return modelObject;
+		}
+
+		@Override
+		public int hashCode() {
+			final int prime = 31;
+			int result = 1;
+			result = prime * result + ((interfacee == null) ? 0 : interfacee.hashCode());
+			result = prime * result + ((modelObject == null) ? 0 : modelObject.hashCode());
+			return result;
+		}
+
+		@Override
+		public boolean equals(Object obj) {
+			if (this == obj)
+				return true;
+			if (obj == null)
+				return false;
+			if (getClass() != obj.getClass())
+				return false;
+			BeanInterfaceRef other = (BeanInterfaceRef) obj;
+			if (interfacee == null) {
+				if (other.interfacee != null)
+					return false;
+			} else if (!interfacee.equals(other.interfacee))
+				return false;
+			if (modelObject == null) {
+				if (other.modelObject != null)
+					return false;
+			} else if (!modelObject.equals(other.modelObject))
+				return false;
+			return true;
+		}
+
+	}
+
+	private IProject clientProject;
+
+	public Map<ICompilationUnit, JavaEEObject> unitToModel;
+
+	/**
+	 * An instance of {@link ManyToOneRelation}. This instance is used to
+	 * maintain the references between a compilation unit which stores an
+	 * interface and the beans that depend on this interface.
+	 * 
+	 * Since one bean can refer to many interfaces and one interface can refer
+	 * to many beans a many-to-many relation must be modeled. This is done using
+	 * {@link BeanInterfaceRef} and {@link ManyToOneRelation}
+	 * 
+	 * @see BeanInterfaceRef
+	 */
+	private ManyToOneRelation<BeanInterfaceRef, ICompilationUnit> beanRefToResolvedInterfaceUnit;
+
+	private EjbAnnotationFactory annotationFactory;
+
+	/**
+	 * Constructs a new EJBAnnotation reader for this faceted project. An
+	 * illegal argument if a project with value <code>null</code> is passed. No
+	 * loading is done in this constructor. Loading the model is made on demand
+	 * when calling {@link #getEJBJar()}.
+	 * 
+	 * It is possible to specify the additional clientProject for this
+	 * ejbProject. A client project can contain part of the java files that make
+	 * up the model. In this case EJBAnnotationReader will also listen for
+	 * resources changes in the client project.
+	 * 
+	 * @param project
+	 *            the ejb project. Can not be <code>null</code>
+	 * @param clientProject
+	 *            the client ejb project or <code>null</code> if there is no
+	 *            client project.
+	 */
+	public EJBAnnotationReader(IFacetedProject project, IProject clientProject) {
+		super(project);
+		this.clientProject = clientProject;
+	}
+
+	/**
+	 * Loads the model from the related java files.
+	 * 
+	 * @throws CoreException
+	 */
+	@Override
+	public void loadModel() throws CoreException {
+		IJavaProject javaProject = JavaCore.create(facetedProject.getProject());
+		final Collection<ICompilationUnit> javaFiles = new HashSet<ICompilationUnit>();
+		for (final IPackageFragmentRoot root : javaProject.getAllPackageFragmentRoots()) {
+			visitJavaFiles(javaFiles, root);
+		}
+
+		if (clientProject != null) {
+			IJavaProject clientProjectJavaView = JavaCore.create(facetedProject.getProject());
+			for (final IPackageFragmentRoot root : clientProjectJavaView.getAllPackageFragmentRoots()) {
+				visitJavaFiles(javaFiles, root);
+			}
+		}
+		unitToModel = new HashMap<ICompilationUnit, JavaEEObject>();
+		beanRefToResolvedInterfaceUnit = new ManyToOneRelation<BeanInterfaceRef, ICompilationUnit>();
+		for (ICompilationUnit unit : javaFiles) {
+			Result result = analyzeUnitForBean(unit);
+			if (result == null)
+				continue;
+			processResult(unit, result);
+		}
+	}
+
+	@Override
+	protected void preLoad() {
+		super.preLoad();
+		modelObject = EjbFactory.eINSTANCE.createEJBJar();
+		annotationFactory = EjbAnnotationFactory.createFactory();
+	}
+	
+	/**
+	 * Process the result from parsing the compilation unit. Depending on the
+	 * result this might include adding a session bean, message driven bean,
+	 * securityRole etc.
+	 * 
+	 * @see #sessionBeanFound(ICompilationUnit, SessionBean, Collection)
+	 * @see #messageBeanFound(ICompilationUnit, MessageDrivenBean, Collection)
+	 * @see #securityRoleFound(ICompilationUnit, SecurityRole)
+	 * @param unit
+	 * @param result
+	 * @throws JavaModelException
+	 */
+	private void processResult(ICompilationUnit unit, Result result) throws JavaModelException {
+		JavaEEObject modelObject = result.getMainObject();
+		if (SessionBean.class.isInstance(modelObject)) {
+			sessionBeanFound(unit, (SessionBean) modelObject, result.getDependedTypes());
+		} else if (MessageDrivenBean.class.isInstance(modelObject)) {
+			messageBeanFound(unit, (MessageDrivenBean) modelObject, result.getDependedTypes());
+		}
+		for (JavaEEObject additional : result.getAdditional()) {
+			if (SecurityRole.class.isInstance(additional)) {
+				securityRoleFound((SessionBean) unitToModel.get(unit), (SecurityRole) additional);
+			}
+		}
+	}
+
+	/**
+	 * Analyze this compilation unit for a bean. If the file is not a valid java
+	 * compilation unit or it does not contain a class the method returns
+	 * <code>null</code>
+	 * 
+	 * Only the primary type of the compilation unit is processed.
+	 * 
+	 * @see EjbAnnotationFactory
+	 * @param unit
+	 *            the file to be processed.
+	 * @return result from processing the file
+	 * @throws JavaModelException
+	 */
+	private Result analyzeUnitForBean(ICompilationUnit compilationUnit) throws JavaModelException {
+		if (compilationUnit == null)
+			return null;
+		IType rootType = compilationUnit.findPrimaryType();
+		/*
+		 * If the compilation unit is not valid and can not be compiled the
+		 * rootType may be null. This can happen if a class is define as follows
+		 * <code> @Stateless public SomeClass implements SomeInterface{}</code>.
+		 * Here the "class" word is missed and the type is not valid.
+		 */
+		if (rootType == null || !rootType.isClass())
+			return null;
+		return annotationFactory.createJavaeeObject(rootType);
+	}
+
+	/**
+	 * A message driven bean was found in the given compilation unit. Add this
+	 * messageDriven bean to the list of mdbs in the
+	 * {@link EnterpriseBeans#getMessageDrivenBeans()}
+	 * 
+	 * @param unit
+	 * @param messageBean
+	 * @param dependedTypes
+	 *            the types on which this mdb depends. This list specifies
+	 *            changes on which types should lead to rebuilding the mdb.
+	 * @throws JavaModelException
+	 */
+	private void messageBeanFound(ICompilationUnit unit, MessageDrivenBean messageBean, Collection<IType> dependedTypes)
+			throws JavaModelException {
+		if (modelObject.getEnterpriseBeans() == null)
+			modelObject.setEnterpriseBeans(EjbFactory.eINSTANCE.createEnterpriseBeans());
+		modelObject.getEnterpriseBeans().getMessageDrivenBeans().add(messageBean);
+		connectBeanWithTypes(unit, messageBean, dependedTypes);
+	}
+
+	/**
+	 * A session bean was found in the given compilation unit. The session bean
+	 * is also depended on the types in dependedTypes. Here "depended" means
+	 * that if any of the types in dependedTypes is change the bean will also be
+	 * rebuilded. For example a session bean is depended on the types of it
+	 * local and remote interfaces.
+	 * 
+	 * <p>
+	 * Since a bean can depended on more then one compilation unit this method
+	 * also establish an appropriate connection between the bean and all the
+	 * units it depends on. This are the "unit" and the units of
+	 * "dependedTypes".
+	 * </p>
+	 * 
+	 * @see #getFilesFromTypes(Collection)
+	 * 
+	 * @param unit
+	 * @param sessionBean
+	 * @param dependedTypes
+	 * @throws JavaModelException
+	 */
+	private void sessionBeanFound(ICompilationUnit unit, SessionBean sessionBean, Collection<IType> dependedTypes)
+			throws JavaModelException {
+		if (modelObject.getEnterpriseBeans() == null)
+			modelObject.setEnterpriseBeans(EjbFactory.eINSTANCE.createEnterpriseBeans());
+		modelObject.getEnterpriseBeans().getSessionBeans().add(sessionBean);
+		connectBeanWithTypes(unit, sessionBean, dependedTypes);
+	}
+
+	/**
+	 * 
+	 * @param unit
+	 * @param bean
+	 * @param dependedTypes
+	 * @throws JavaModelException
+	 */
+	private void connectBeanWithTypes(ICompilationUnit unit, JavaEEObject bean, Collection<IType> dependedTypes)
+			throws JavaModelException {
+		unitToModel.put(unit, bean);
+		for (IType type : dependedTypes) {
+			if (type.isBinary() || type.isInterface() == false)
+				continue;
+			beanRefToResolvedInterfaceUnit.connect(new BeanInterfaceRef(type.getFullyQualifiedName(), bean), type
+					.getCompilationUnit());
+		}
+	}
+
+	/**
+	 * Dispose the current instance. The actual dispose may occur in another
+	 * thread. Use {@link #addListener(IModelProviderListener)} to register a
+	 * listener that will be notified when the instance is disposed. After all
+	 * the listeners are notified the list of listeners is cleared.
+	 */
+	@Override
+	public void dispose() {
+		beanRefToResolvedInterfaceUnit = null;
+		if (unitToModel != null)
+			// bug 249234. If the model is not loaded and dispose is called a
+			// NPE occurs.
+			unitToModel.clear();
+		super.dispose();
+	}
+
+	/**
+	 * @param javaProject
+	 * @return true if the given project contains resources that are relative to
+	 *         the model. This method returns <code>true</code> for the
+	 *         ejbProject on which this instance is working a <code>true</code>
+	 *         for its client project.
+	 */
+	@Override
+	protected boolean isProjectRelative(IJavaProject javaProject) {
+		if (super.isProjectRelative(javaProject) == true)
+			return true;
+		else if (clientProject != null && javaProject.getProject().equals(clientProject.getProject()))
+			return true;
+		return false;
+	}
+
+	/**
+	 * {non-Javadoc}
+	 * 
+	 * @see org.eclipse.jst.jee.model.internal.common.AbstractAnnotationModelProvider#processAddedCompilationUnit(org.eclipse.jst.j2ee.model.IModelProviderEvent,
+	 *      org.eclipse.core.resources.ICompilationUnit)
+	 */
+	@Override
+	protected void processAddedCompilationUnit(IModelProviderEvent modelEvent, ICompilationUnit unit)
+			throws CoreException {
+		if (unit == null)
+			return;
+		Collection<ICompilationUnit> unitsToRebuild = new HashSet<ICompilationUnit>();
+		IType rootType = unit.findPrimaryType();
+		if (rootType == null)
+			return;
+		if (rootType.isClass()) {
+			Result result = analyzeUnitForBean(unit);
+			if (result == null || result.isEmpty())
+				return;
+			processResult(unit, result);
+			modelEvent.addResource(unit);
+		} else if (rootType.isInterface()) {
+			unitsToRebuild.addAll(processAddedInterface(rootType));
+		}
+		if (unitsToRebuild.isEmpty())
+			return;
+		for (ICompilationUnit changedUnit : unitsToRebuild) {
+			processRemovedCompilationUnit(modelEvent, changedUnit);
+			processAddedCompilationUnit(modelEvent, changedUnit);
+		}
+		unitsToRebuild.clear();
+
+	}
+
+	private Collection<ICompilationUnit> processAddedInterface(IType rootType) {
+		Collection<ICompilationUnit> unitsToRebuild = new HashSet<ICompilationUnit>();
+		String rootTypeSimpleName = rootType.getElementName();
+		if (getConcreteModel().getEnterpriseBeans() == null)
+			return unitsToRebuild;
+		
+		for (Iterator beanIter = getConcreteModel().getEnterpriseBeans().getSessionBeans().iterator(); beanIter
+				.hasNext();) {
+			SessionBean bean = (SessionBean) beanIter.next();
+			for (Iterator interfaceIter = bean.getBusinessLocals().iterator(); interfaceIter.hasNext();) {
+				String inter = (String) interfaceIter.next();
+				if (rootTypeSimpleName.equals(inter))
+					unitsToRebuild.add(getCompilationUnitFromModel(bean));
+			}
+			if (rootTypeSimpleName.equals(bean.getLocalHome()) || rootTypeSimpleName.equals(bean.getHome()))
+				unitsToRebuild.add(getCompilationUnitFromModel(bean));
+			findDependedFiles(bean, rootTypeSimpleName, bean.getEjbLocalRefs(), bean.getResourceRefs(), unitsToRebuild);
+		}
+		for (Iterator beanIter = getConcreteModel().getEnterpriseBeans().getMessageDrivenBeans().iterator(); beanIter
+				.hasNext();) {
+			MessageDrivenBean bean = (MessageDrivenBean) beanIter.next();
+			findDependedFiles(bean, rootTypeSimpleName, bean.getEjbLocalRefs(), bean.getResourceRefs(), unitsToRebuild);
+		}
+		return unitsToRebuild;
+	}
+
+	private ICompilationUnit getCompilationUnitFromModel(JavaEEObject bean) {
+		for (Map.Entry<ICompilationUnit, JavaEEObject> entry : unitToModel.entrySet()) {
+			if (entry.getValue().equals(bean))
+				return entry.getKey();
+		}
+		return null;
+	}
+
+	private void findDependedFiles(JavaEEObject bean, String rootTypeSimpleName, Collection<EjbLocalRef> ejbRefs,
+			Collection<ResourceRef> resourceRefs, Collection<ICompilationUnit> filesToRebuild) {
+		for (Iterator refsIter = ejbRefs.iterator(); refsIter.hasNext();) {
+			String localRefInterface = ((EjbLocalRef) refsIter.next()).getLocal();
+			if (rootTypeSimpleName.equals(localRefInterface))
+				filesToRebuild.add(getCompilationUnitFromModel(bean));
+		}
+		for (Iterator refsIter = resourceRefs.iterator(); refsIter.hasNext();) {
+			String resourceRef = ((ResourceRef) refsIter.next()).getResType();
+			if (rootTypeSimpleName.equals(resourceRef)) {
+				filesToRebuild.add(getCompilationUnitFromModel(bean));
+			}
+		}
+	}
+
+	@Override
+	protected void processRemovedCompilationUnit(IModelProviderEvent modelEvent, ICompilationUnit unit)
+			throws CoreException {
+		if (unitToModel.containsKey(unit))
+			processRemoveBean(modelEvent, unit);
+		else if (beanRefToResolvedInterfaceUnit.containsTarget(unit))
+			processRemovedInterface(modelEvent, unit);
+
+	}
+
+	/**
+	 * Process a unit as a removed interface. It is the responsibility of the
+	 * caller to make sure the unit really contains an interface and that this
+	 * interface is really removed.
+	 * 
+	 * Removing an interface will also remove the connections between the
+	 * interface and the beans that depend on it -
+	 * {@link #beanRefToResolvedInterfaceUnit}.
+	 * 
+	 * Removing an interface will result in rebuilding all the modelObjects that
+	 * depend on this interface.
+	 * 
+	 * @see #beanRefToResolvedInterfaceUnit
+	 * @see #processRemovedCompilationUnit(IModelProviderEvent,
+	 *      ICompilationUnit)
+	 * @see #processRemoveBean(IModelProviderEvent, ICompilationUnit)
+	 * @param modelEvent
+	 * @param unit
+	 * @throws JavaModelException
+	 */
+	private void processRemovedInterface(IModelProviderEvent modelEvent, ICompilationUnit unit) throws CoreException {
+		Collection<BeanInterfaceRef> refs = beanRefToResolvedInterfaceUnit.getSources(unit);
+		Collection<ICompilationUnit> filesToRebuild = new HashSet<ICompilationUnit>();
+		for (BeanInterfaceRef ref : refs) {
+			filesToRebuild.add(getCompilationUnitFromModel(ref.getModelObject()));
+		}
+		if (filesToRebuild.isEmpty())
+			return;
+		for (ICompilationUnit changedFile : filesToRebuild) {
+			processRemovedCompilationUnit(modelEvent, changedFile);
+			processAddedCompilationUnit(modelEvent, changedFile);
+		}
+		filesToRebuild.clear();
+		beanRefToResolvedInterfaceUnit.disconnect(unit);
+	}
+
+	/**
+	 * Process a unit as a removed bean. It is the responsibility of the caller
+	 * to make sure the file really contains a bean and that this bean is really
+	 * removed.
+	 * 
+	 * @see #processRemovedCompilationUnit(IModelProviderEvent,
+	 *      ICompilationUnit)
+	 * @see #processRemovedInterface(IModelProviderEvent, ICompilationUnit)
+	 * @see #beanRefToResolvedInterface
+	 * @param modelEvent
+	 * @param unit
+	 *            the removed compilation unit
+	 * @throws JavaModelException
+	 */
+	private void processRemoveBean(IModelProviderEvent modelEvent, ICompilationUnit unit) throws JavaModelException {
+		EObject modelObject = (EObject) unitToModel.get(unit);
+		EcoreUtil.remove(modelObject);
+		if (getConcreteModel().getEnterpriseBeans().getGroup().isEmpty())
+			getConcreteModel().setEnterpriseBeans(null);
+		unitToModel.remove(unit);
+		modelEvent.setEventCode(modelEvent.getEventCode() | IModelProviderEvent.REMOVED_RESOURCE);
+		modelEvent.addResource(unit);
+		disconnectFromRoles((JavaEEObject) modelObject);
+	}
+
+	/**
+	 * Process a unit as "changed". If no model object depends on this unit the
+	 * unit will be process as added (since it may not have been a bean till
+	 * now, but an annotation was added).
+	 * 
+	 * It is the responsibility of the caller to make sure the unit really
+	 * contains a bean/interface and that this bean is really changed and can be
+	 * accessed.
+	 * 
+	 * @see #processChangedBean(IModelProviderEvent, ICompilationUnit)
+	 * @see #processChangedInterface(IModelProviderEvent, ICompilationUnit)
+	 * @param modelEvent
+	 * @param unit
+	 * @throws JavaModelException
+	 */
+	@Override
+	protected void processChangedCompilationUnit(IModelProviderEvent modelEvent, ICompilationUnit unit)
+			throws CoreException {
+		if (unitToModel.containsKey(unit))
+			processChangedBean(modelEvent, unit);
+		else if (beanRefToResolvedInterfaceUnit.containsTarget(unit))
+			processChangedInterface(modelEvent, unit);
+		else
+			processAddedCompilationUnit(modelEvent, unit);
+	}
+
+	/**
+	 * Process a unit as a changed bean. It is the responsibility of the caller
+	 * to make sure the unit really contains a bean and that this bean is really
+	 * changed.
+	 * 
+	 * Changing a bean may mean removing it from the model (if it was a bean
+	 * till now, but the annotation was deleted)
+	 * 
+	 * @see #processChangedBean(IModelProviderEvent, ICompilationUnit)
+	 * @see {@link #processChangedInterface(IModelProviderEvent, ICompilationUnit)}
+	 * @param modelEvent
+	 * @param unit
+	 * @throws JavaModelException
+	 */
+	private void processChangedBean(IModelProviderEvent modelEvent, ICompilationUnit unit) throws CoreException {
+		EObject oldBean = (EObject) unitToModel.get(unit);
+		ICompilationUnit beanUnit = getCompilationUnitFromModel((JavaEEObject) oldBean);
+		processRemovedCompilationUnit(modelEvent, beanUnit);
+		processAddedCompilationUnit(modelEvent, beanUnit);
+	}
+
+	/**
+	 * Process a unit as a changed interface. It is the responsibility of the
+	 * caller to make sure the file really contains an interface and that this
+	 * interface is really changed.
+	 * 
+	 * Changing an interface may mean rebuilding all the beans that depend on
+	 * this interface (if it was annotated with "@Local", but this annotation
+	 * was changed to "@Remote" )
+	 * 
+	 * @param modelEvent
+	 * @param unit
+	 * @throws JavaModelException
+	 */
+	private void processChangedInterface(IModelProviderEvent modelEvent, ICompilationUnit unit) throws CoreException {
+		Collection<BeanInterfaceRef> references = beanRefToResolvedInterfaceUnit.getSources(unit);
+		for (BeanInterfaceRef ref : references) {
+			ICompilationUnit next = getCompilationUnitFromModel(ref.getModelObject());
+			processRemovedCompilationUnit(modelEvent, next);
+			processAddedCompilationUnit(modelEvent, next);
+		}
+	}
+
+	public void modify(Runnable runnable, IPath modelPath) {
+	}
+
+	public IStatus validateEdit(IPath modelPath, Object context) {
+		return null;
+	}
+
+	@Override
+	protected Collection<SecurityRoleRef> getSecurityRoleRefs(JavaEEObject target) {
+		if (SessionBean.class.isInstance(target))
+			return ((SessionBean) target).getSecurityRoleRefs();
+		return null;
+	}
+
+	@Override
+	protected Collection<SecurityRole> getSecurityRoles() {
+		if (modelObject.getAssemblyDescriptor() == null)
+			modelObject.setAssemblyDescriptor(EjbFactory.eINSTANCE.createAssemblyDescriptor());
+		return modelObject.getAssemblyDescriptor().getSecurityRoles();
+	}
+
+	@Override
+	protected void processRemovedPackage(IModelProviderEvent modelEvent, IJavaElementDelta delta) throws CoreException {
+		Set<ICompilationUnit> keySet = new HashSet<ICompilationUnit>(unitToModel.keySet());
+		for (ICompilationUnit unit : keySet) {
+			if (unit.getParent().getElementName().equals(delta.getElement().getElementName())) {
+				processRemovedCompilationUnit(modelEvent, unit);
+			}
+		}
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.jee.ejb/ejb/org/eclipse/jst/jee/model/internal/Ejb3MergedModelProviderFactory.java b/plugins/org.eclipse.jst.jee.ejb/ejb/org/eclipse/jst/jee/model/internal/Ejb3MergedModelProviderFactory.java
new file mode 100644
index 0000000..d16c3f7
--- /dev/null
+++ b/plugins/org.eclipse.jst.jee.ejb/ejb/org/eclipse/jst/jee/model/internal/Ejb3MergedModelProviderFactory.java
@@ -0,0 +1,66 @@
+/***********************************************************************
+ * Copyright (c) 2008 by SAP AG, Walldorf. 
+ * 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:
+ *     SAP AG - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jst.jee.model.internal;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jst.j2ee.model.IModelProvider;
+import org.eclipse.jst.j2ee.model.IModelProviderFactory;
+import org.eclipse.jst.j2ee.model.IModelProviderListener;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+
+/**
+ * @author  Kiril Mitov k.mitov@sap.com
+ *
+ */
+public class Ejb3MergedModelProviderFactory implements IModelProviderFactory {
+
+	private HashMap<IProject, IModelProvider> xmlResources = new HashMap<IProject, IModelProvider>();
+
+	public IModelProvider create(IProject project) {
+		IModelProvider result = getResource(project);
+		if(result == null || ((EJB3MergedModelProvider)result).isDisposed()){
+			Collection<IModelProviderListener> listeners = new ArrayList<IModelProviderListener>();
+			if (result != null){
+				listeners = ( (EJB3MergedModelProvider)result).getListeners();
+			}
+			result = new EJB3MergedModelProvider(project);
+			
+			addListeners(result, listeners);
+			addResource(project, result);
+		}
+		return result;
+	}
+	
+	private void addListeners(IModelProvider modelProvider,
+			Collection<IModelProviderListener> listeners) {
+		for (IModelProviderListener iModelProviderListener : listeners) {
+			if (iModelProviderListener != null)
+				modelProvider.addListener(iModelProviderListener);
+		}
+	}
+
+	public IModelProvider create(IVirtualComponent component) {
+		return create(component.getProject());
+	}
+
+	private void addResource(IProject project, IModelProvider modelProvider){
+		xmlResources.put(project, modelProvider);
+	}
+
+	private IModelProvider getResource(IProject project){
+		return xmlResources.get(project);
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.jee.ejb/ejb/org/eclipse/jst/jee/model/internal/Ejb3ModelProvider.java b/plugins/org.eclipse.jst.jee.ejb/ejb/org/eclipse/jst/jee/model/internal/Ejb3ModelProvider.java
new file mode 100644
index 0000000..dac4e8f
--- /dev/null
+++ b/plugins/org.eclipse.jst.jee.ejb/ejb/org/eclipse/jst/jee/model/internal/Ejb3ModelProvider.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.jee.model.internal;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl;
+import org.eclipse.jst.j2ee.internal.J2EEConstants;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
+import org.eclipse.jst.javaee.core.DisplayName;
+import org.eclipse.jst.javaee.core.JavaeeFactory;
+import org.eclipse.jst.javaee.ejb.EJBJar;
+import org.eclipse.jst.javaee.ejb.EJBJarDeploymentDescriptor;
+import org.eclipse.jst.javaee.ejb.EjbFactory;
+import org.eclipse.jst.javaee.ejb.IEJBResource;
+
+public class Ejb3ModelProvider extends JEE5ModelProvider {
+	
+	private static final String EJB3_CONTENT_TYPE = "org.eclipse.jst.jee.ee5ejbDD"; //$NON-NLS-1$
+	public Ejb3ModelProvider(IProject proj) {
+		super();
+		this.proj = proj;
+		setDefaultResourcePath(new Path(J2EEConstants.EJBJAR_DD_URI));
+	}
+
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jst.j2ee.model.IModelProvider#getModelObject(org.eclipse.core.runtime.IPath)
+	 */
+	@Override
+	public Object getModelObject(IPath modelPath) {
+		IEJBResource ejbRes = (IEJBResource)getModelResource(modelPath);
+		if (ejbRes != null && ejbRes.getRootObject() != null) 
+			return ejbRes.getEjbJar();
+		return null;
+	}
+	@Override
+	protected String getContentTypeDescriber() {
+		return EJB3_CONTENT_TYPE;
+	}
+
+
+	@Override
+	public void populateRoot(XMLResourceImpl res, String name) {
+		EJBJarDeploymentDescriptor dd = EjbFactory.eINSTANCE.createEJBJarDeploymentDescriptor();
+		dd.getXMLNSPrefixMap().put("", J2EEConstants.JAVAEE_NS_URL);  //$NON-NLS-1$
+		dd.getXMLNSPrefixMap().put("xsi", J2EEConstants.XSI_NS_URL); //$NON-NLS-1$
+		EJBJar jar = EjbFactory.eINSTANCE.createEJBJar();
+		DisplayName dn = JavaeeFactory.eINSTANCE.createDisplayName();
+		dn.setValue(name);
+		jar.getDisplayNames().add(dn);
+
+		String version = J2EEProjectUtilities.getJ2EEProjectVersion(proj);
+		if(version != null && version.equals(J2EEVersionConstants.VERSION_3_0_TEXT)) {
+			dd.getXSISchemaLocation().put(J2EEConstants.JAVAEE_NS_URL, J2EEConstants.EJB_JAR_SCHEMA_LOC_3_0);
+			jar.setVersion(J2EEVersionConstants.VERSION_3_0_TEXT);
+		}
+		else if(version != null && version.equals(J2EEVersionConstants.VERSION_3_1_TEXT)) {
+			dd.getXSISchemaLocation().put(J2EEConstants.JAVAEE_NS_URL, J2EEConstants.EJB_JAR_SCHEMA_LOC_3_1);
+			jar.setVersion(J2EEVersionConstants.VERSION_3_1_TEXT);
+		}
+		else {
+			dd.getXMLNSPrefixMap().put("", J2EEConstants.JAVAEE7_NS_URL);  //$NON-NLS-1$
+			dd.getXSISchemaLocation().put(J2EEConstants.JAVAEE7_NS_URL, J2EEConstants.EJB_JAR_SCHEMA_LOC_3_2);
+			jar.setVersion(J2EEVersionConstants.VERSION_3_2_TEXT);
+		}
+		dd.setEjbJar(jar);
+		res.getContents().add((EObject) dd);
+	}
+
+
+
+}
diff --git a/plugins/org.eclipse.jst.jee.ejb/ejb/org/eclipse/jst/jee/model/internal/Ejb3ModelProviderFactory.java b/plugins/org.eclipse.jst.jee.ejb/ejb/org/eclipse/jst/jee/model/internal/Ejb3ModelProviderFactory.java
new file mode 100644
index 0000000..71afbd4
--- /dev/null
+++ b/plugins/org.eclipse.jst.jee.ejb/ejb/org/eclipse/jst/jee/model/internal/Ejb3ModelProviderFactory.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.jee.model.internal;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jst.j2ee.model.IModelProvider;
+import org.eclipse.jst.j2ee.model.IModelProviderFactory;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+
+public class Ejb3ModelProviderFactory implements IModelProviderFactory {
+
+	public IModelProvider create(IProject project) {
+		return new Ejb3ModelProvider(project);
+	}
+
+	public IModelProvider create(IVirtualComponent component) {
+		return new Ejb3ModelProvider(component.getProject());
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.jee.ejb/ejb/org/eclipse/jst/jee/model/internal/EjbAnnotationFactory.java b/plugins/org.eclipse.jst.jee.ejb/ejb/org/eclipse/jst/jee/model/internal/EjbAnnotationFactory.java
new file mode 100644
index 0000000..dfd0d8a
--- /dev/null
+++ b/plugins/org.eclipse.jst.jee.ejb/ejb/org/eclipse/jst/jee/model/internal/EjbAnnotationFactory.java
@@ -0,0 +1,653 @@
+/***********************************************************************
+ * Copyright (c) 2008 by SAP AG, Walldorf. 
+ * 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:
+ *     SAP AG - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jst.jee.model.internal;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jdt.core.Flags;
+import org.eclipse.jdt.core.IAnnotation;
+import org.eclipse.jdt.core.IField;
+import org.eclipse.jdt.core.IMemberValuePair;
+import org.eclipse.jdt.core.IMethod;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.core.Signature;
+import org.eclipse.jst.javaee.core.Description;
+import org.eclipse.jst.javaee.core.EjbLocalRef;
+import org.eclipse.jst.javaee.core.JavaEEObject;
+import org.eclipse.jst.javaee.core.JavaeeFactory;
+import org.eclipse.jst.javaee.core.LifecycleCallback;
+import org.eclipse.jst.javaee.core.ResourceRef;
+import org.eclipse.jst.javaee.core.RunAs;
+import org.eclipse.jst.javaee.ejb.ActivationConfigProperty;
+import org.eclipse.jst.javaee.ejb.EjbFactory;
+import org.eclipse.jst.javaee.ejb.InitMethodType;
+import org.eclipse.jst.javaee.ejb.MessageDrivenBean;
+import org.eclipse.jst.javaee.ejb.MethodParams;
+import org.eclipse.jst.javaee.ejb.NamedMethodType;
+import org.eclipse.jst.javaee.ejb.RemoveMethodType;
+import org.eclipse.jst.javaee.ejb.SecurityIdentityType;
+import org.eclipse.jst.javaee.ejb.SessionBean;
+import org.eclipse.jst.javaee.ejb.SessionType;
+import org.eclipse.jst.javaee.ejb.TransactionType;
+import org.eclipse.jst.jee.model.internal.common.AbstractAnnotationFactory;
+import org.eclipse.jst.jee.model.internal.common.Result;
+
+/**
+ * @author Kiril Mitov k.mitov@sap.com
+ * 
+ */
+public class EjbAnnotationFactory extends AbstractAnnotationFactory {
+
+	
+	private static final String INIT = "Init"; //$NON-NLS-1$
+	private static final String RUN_AS = "RunAs"; //$NON-NLS-1$
+	private static final String RESOURCES = "Resources"; //$NON-NLS-1$
+	private static final String CONTAINER = "CONTAINER"; //$NON-NLS-1$
+	private static final String TRANSACTION_MANAGEMENT_TYPE_CONTAINER = "TransactionManagementType.CONTAINER"; //$NON-NLS-1$
+	private static final String VALUE = "value"; //$NON-NLS-1$
+	private static final String TRANSACTION_MANAGEMENT = "TransactionManagement"; //$NON-NLS-1$
+	private static final String EJBS = "EJBs"; //$NON-NLS-1$
+	private static final String DECLARE_ROLES = "DeclareRoles"; //$NON-NLS-1$
+	private static final String LOCAL_HOME = "LocalHome"; //$NON-NLS-1$
+	private static final String REMOTE_HOME = "RemoteHome"; //$NON-NLS-1$
+	private static final String JAVAX_EJB_TIMER = "javax.ejb.Timer"; //$NON-NLS-1$
+	private static final String TIMER = "Timer"; //$NON-NLS-1$
+	private static final String RETAIN_IF_EXCEPTION = "retainIfException"; //$NON-NLS-1$
+	private static final String REMOVE = "Remove"; //$NON-NLS-1$
+	private static final String PRE_PASSIVATE = "PrePassivate"; //$NON-NLS-1$
+	private static final String POST_ACTIVATE = "PostActivate"; //$NON-NLS-1$
+	private static final String TIMEOUT = "Timeout"; //$NON-NLS-1$
+	private static final String PRE_DESTROY = "PreDestroy"; //$NON-NLS-1$
+	private static final String POST_CONSTRUCT = "PostConstruct"; //$NON-NLS-1$
+	private static final String LOCAL = "Local"; //$NON-NLS-1$
+	private static final String REMOTE = "Remote"; //$NON-NLS-1$
+	private static final String RESOURCE = "Resource"; //$NON-NLS-1$
+	private static final String EJB = "EJB"; //$NON-NLS-1$
+	private static final String DESCRIPTION = "description"; //$NON-NLS-1$
+	private static final String MAPPED_NAME = "mappedName"; //$NON-NLS-1$
+	private static final String NAME = "name"; //$NON-NLS-1$
+	private static final String VOID_RETURN_TYPE = "V"; //$NON-NLS-1$
+	private static final String JAVAX_EJB_STATEFUL = "javax.ejb.Stateful"; //$NON-NLS-1$
+	private static final String JAVAX_EJB_SINGLETON = "javax.ejb.Singleton"; //$NON-NLS-1$
+	private static final String STATEFUL = "Stateful"; //$NON-NLS-1$
+	private static final String JAVAX_EJB_MESSAGE_DRIVEN = "javax.ejb.MessageDriven"; //$NON-NLS-1$
+	private static final String MESSAGE_DRIVEN = "MessageDriven"; //$NON-NLS-1$
+	private static final String JAVAX_EJB_STATELESS = "javax.ejb.Stateless"; //$NON-NLS-1$
+	private static final String STATELESS = "Stateless"; //$NON-NLS-1$
+	private static final String SINGLETON = "Singleton"; //$NON-NLS-1$
+	
+	private static final String CREATE_METHOD = "create"; //$NON-NLS-1$
+
+	public static EjbAnnotationFactory createFactory() {
+		return new EjbAnnotationFactory();
+	}
+
+	private EjbAnnotationFactory() {
+	}
+
+	/**
+	 * Creates a java ee object (SessionBean, MessageDrivenBean) depending of
+	 * the type and its annotations.
+	 * 
+	 * Always returns a non null result. The result is of type ({@link Result}
+	 * and the java ee object created by this method is retrieved with
+	 * {@link Result#getMainObject()}
+	 * 
+	 * @param type
+	 * @return the result from creating a javaee object from this type
+	 * @throws JavaModelException
+	 */
+	public Result createJavaeeObject(IType type) throws JavaModelException {
+		Result result = new Result();
+		for (IAnnotation annotation : type.getAnnotations()) {
+			String annotationName = annotation.getElementName();
+			if (STATELESS.equals(annotationName) || JAVAX_EJB_STATELESS.equals(annotationName)) {
+				processStatelessBean(result, annotation, type);
+				break;
+			} else if (MESSAGE_DRIVEN.equals(annotationName) || JAVAX_EJB_MESSAGE_DRIVEN.equals(annotationName)) {
+				processMessageDrivenBean(result, annotation, type);
+				break;
+			} else if (STATEFUL.equals(annotationName) || JAVAX_EJB_STATEFUL.equals(annotationName)) {
+				processStatefulBean(result, annotation, type);
+				break;
+			} else if (SINGLETON.equals(annotationName) || JAVAX_EJB_SINGLETON.equals(annotationName)) {
+				processSingletonBean(result, annotation, type);
+				break;
+			}
+		}
+		return result;
+	}
+
+	private void processMessageDrivenBean(Result result, IAnnotation annotation, IType type) throws JavaModelException {
+		MessageDrivenBean mdb = createMDB(result, annotation, type);
+		result.setMainObject(mdb);
+	}
+
+	private void processStatelessBean(Result result, IAnnotation annotation, IType type) throws JavaModelException {
+		SessionBean sessionBean = createSession(result, SessionType.STATELESS_LITERAL, annotation, type);
+		result.setMainObject(sessionBean);
+	}
+	
+	private void processSingletonBean(Result result, IAnnotation annotation, IType type) throws JavaModelException {
+		SessionBean sessionBean = createSession(result, SessionType.SINGLETON_LITERAL, annotation, type);
+		result.setMainObject(sessionBean);
+		
+	}
+
+	private void processStatefulBean(Result result, IAnnotation annotation, IType type) throws JavaModelException {
+		SessionBean sessionBean = createSession(result, SessionType.STATEFUL_LITERAL, annotation, type);
+		processStatefulMethods(sessionBean, type);
+		result.setMainObject(sessionBean);
+	}
+
+	private void addInterfaces(List list, IType type, IMemberValuePair pair, Collection<IType> dependedTypes)
+			throws JavaModelException {
+		if (!isArrayOfObject(pair.getValue())) {
+			return;
+		}
+		Object[] value = (Object[]) pair.getValue();
+		IType interfaceType = null;
+		for (int i = 0; i < value.length; i++) {
+			interfaceType = resolveType(type, (String) value[i]);
+			if (interfaceType != null) {
+				list.add(interfaceType.getFullyQualifiedName());
+				dependedTypes.add(interfaceType);
+			} else
+				list.add(value[i]);
+		}
+	}
+
+	private static void addLifecycleMethod(List callbacks, IMethod method, IAnnotation annotation) {
+		LifecycleCallback callback = JavaeeFactory.eINSTANCE.createLifecycleCallback();
+		callback.setLifecycleCallbackClass(method.getDeclaringType().getFullyQualifiedName());
+		callback.setLifecycleCallbackMethod(method.getElementName());
+		callbacks.add(callback);
+	}
+
+	private MessageDrivenBean createMDB(Result result, IAnnotation annotation, IType type) throws JavaModelException {
+		result.getDependedTypes().add(type);
+		MessageDrivenBean mdbBean = EjbFactory.eINSTANCE.createMessageDrivenBean();
+		mdbBean.setEjbClass(type.getFullyQualifiedName());
+		processMessageDrivenAnnotation(mdbBean, annotation, type);
+		processTypeAnnotations(result, mdbBean, type);
+		processFieldAnnotations(mdbBean, type, result.getDependedTypes());
+		processMethodAnnotations(mdbBean, type, result.getDependedTypes());
+		return mdbBean;
+	}
+
+	private SessionBean createSession(Result result, SessionType sessionType, IAnnotation annotation, IType type)
+			throws JavaModelException {
+		result.getDependedTypes().add(type);
+		SessionBean sessionBean = EjbFactory.eINSTANCE.createSessionBean();
+		sessionBean.setSessionType(sessionType);
+		processAnnotation(sessionBean, annotation, type);
+		processTypeAnnotations(result, sessionBean, type);
+		processFieldAnnotations(sessionBean, type, result.getDependedTypes());
+		processMethodAnnotations(sessionBean, type, result.getDependedTypes());
+		processImplementedInterfaces(sessionBean, type, result.getDependedTypes(), null);
+		return sessionBean;
+	}
+
+	/**
+	 * Checks if this method can be classified as a "lifecycle" method. One on
+	 * which a lifecycle annotation like "@PostConstruct", "@PreDestory", etc
+	 * will be valid.
+	 * 
+	 * Such method must have only one param, return type <code>void</code> and
+	 * no exceptions thrown. It must not be static or final.
+	 * 
+	 * @param method
+	 * @return true if this can be classified as lifecycle method
+	 * @throws JavaModelException
+	 */
+	private static boolean isLifecycleMethod(IMethod method) throws JavaModelException {
+		if (!VOID_RETURN_TYPE.equals(method.getReturnType()))
+			return false;
+		if ((method.getFlags() & Flags.AccStatic) != 0 || (method.getFlags() & Flags.AccFinal) != 0)
+			return false;
+		if (method.getNumberOfParameters() != 0)
+			return false;
+		if (method.getExceptionTypes().length != 0)
+			return false;
+		return true;
+	}
+
+	private void procesRemoteHomeAnnotation(IAnnotation annotation, SessionBean sessionBean, IType type,
+			Collection<IType> dependedTypes) throws JavaModelException {
+		IMemberValuePair[] pair = annotation.getMemberValuePairs();
+		if (pair.length == 1) {
+			String value = (String) pair[0].getValue();
+			IType interfaceType = resolveType(type, value);
+			if (interfaceType != null) {
+				sessionBean.setHome(interfaceType.getFullyQualifiedName());
+				dependedTypes.add(interfaceType);
+				try {
+					IMethod method = interfaceType.getMethod(CREATE_METHOD, null);
+					if (method != null && !Signature.SIG_VOID.equals(method.getReturnType()) ){
+						String componentType = Signature.toString(method.getReturnType());
+						String[][] resolveType = interfaceType.resolveType(componentType);
+						if (resolveType[0].length == 2){
+							componentType = resolveType[0][0]+"." + resolveType[0][1]; //$NON-NLS-1$
+						}
+
+
+						sessionBean.setRemote(componentType);
+					}
+				} catch (CoreException e) {
+					// nothing to do create method is missing and component interface cannot be extracted 
+				}
+			} else
+				sessionBean.setHome(value);
+		}
+	}
+
+	private void processActivationConfig(IAnnotation activationAnnotation, MessageDrivenBean mdbBean, IType type)
+			throws JavaModelException {
+		IMemberValuePair[] pairs = activationAnnotation.getMemberValuePairs();
+		if (pairs.length != 2)
+			return;
+		String name = (String) getAnnotatedValue("propertyName", pairs); //$NON-NLS-1$
+		String value = (String) getAnnotatedValue("propertyValue", pairs); //$NON-NLS-1$
+		ActivationConfigProperty property = EjbFactory.eINSTANCE.createActivationConfigProperty();
+		property.setActivationConfigPropertyName(name);
+		property.setActivationConfigPropertyValue(value);
+		if (mdbBean.getActivationConfig() == null)
+			mdbBean.setActivationConfig(EjbFactory.eINSTANCE.createActivationConfig());
+		mdbBean.getActivationConfig().getActivationConfigProperties().add(property);
+	}
+
+	private SessionBean processAnnotation(SessionBean sessionBean, IAnnotation annotation, IType type)
+			throws JavaModelException {
+		String fullyQualifiedName = type.getFullyQualifiedName();
+		sessionBean.setEjbClass(fullyQualifiedName);
+		sessionBean.setEjbName(type.getElementName());
+		IMemberValuePair[] memberValuePairs = annotation.getMemberValuePairs();
+		String name = (String) getAnnotatedValue(NAME, memberValuePairs);
+		String mappedName = (String) getAnnotatedValue(MAPPED_NAME, memberValuePairs);
+		String descr = (String) getAnnotatedValue(DESCRIPTION, memberValuePairs);
+		if (name != null) {
+			sessionBean.setEjbName(name);
+		}
+		if (mappedName != null) {
+			sessionBean.setMappedName(mappedName);
+		}
+		if (descr != null) {
+			Description description = JavaeeFactory.eINSTANCE.createDescription();
+			description.setValue(descr);
+			if (sessionBean.getDescriptions().isEmpty())
+				sessionBean.getDescriptions().add(description);
+			else
+				sessionBean.getDescriptions().set(0, description);
+		}
+		return sessionBean;
+	}
+
+	private void processFieldAnnotations(JavaEEObject bean, IType type, Collection<IType> dependedTypes)
+			throws JavaModelException {
+		SessionBean sessionBean = null;
+		MessageDrivenBean messageBean = null;
+		List<EjbLocalRef> ejbRefs = null;
+		List<ResourceRef> resourceRefs = null;
+				if (SessionBean.class.isInstance(bean)) {
+			sessionBean = (SessionBean) bean;
+			ejbRefs = sessionBean.getEjbLocalRefs();
+			resourceRefs = sessionBean.getResourceRefs();
+		} else if (MessageDrivenBean.class.isInstance(bean)) {
+			messageBean = (MessageDrivenBean) bean;
+			ejbRefs = messageBean.getEjbLocalRefs();
+			resourceRefs = messageBean.getResourceRefs();
+		}
+		for (IField field : type.getFields()) {
+			for (IAnnotation annotation : field.getAnnotations()) {
+				String annotationName = annotation.getElementName();
+				if (EJB.equals(annotationName)) {
+					processEjbAnnotation(annotation, ejbRefs, field, dependedTypes);
+				} else if (RESOURCE.equals(annotationName)) {
+					processResourceRefAnnotation(annotation, resourceRefs, field, dependedTypes);
+				}
+			}
+		}
+	}
+
+	private void processImplementedInterfaces(SessionBean sessionBean, IType type, Collection<IType> dependedTypes,
+			IProgressMonitor monitor) throws JavaModelException {
+		List<String> superInterfaces = new ArrayList<String>(Arrays.asList(type.getSuperInterfaceNames()));
+
+		for (String interfaceName : type.getSuperInterfaceNames()) {
+			String[][] fullTypeName = type.resolveType(interfaceName);
+			if (fullTypeName == null) {
+				/*
+				 * Can not be resolved. Maybe it does not exists. Continue.
+				 */
+				continue;
+			}
+			IType inter = type.getJavaProject().findType(fullTypeName[0][0], fullTypeName[0][1]);
+			if (isDefinedInBeanClass(inter, sessionBean.getBusinessLocals())
+					|| isDefinedInBeanClass(inter, sessionBean.getBusinessRemotes())) {
+				superInterfaces.remove(interfaceName);
+				continue;
+			}
+			String fullyQualifiedName = inter.getFullyQualifiedName();
+			for (IAnnotation annotation : inter.getAnnotations()) {
+				String annotationName = annotation.getElementName();
+				if (REMOTE.equals(annotationName)) {
+					sessionBean.getBusinessRemotes().add(fullyQualifiedName);
+					if (dependedTypes != null)
+						dependedTypes.add(inter);
+					superInterfaces.remove(interfaceName);
+				} else if (LOCAL.equals(annotationName)) {
+					sessionBean.getBusinessLocals().add(fullyQualifiedName);
+					if (dependedTypes != null)
+						dependedTypes.add(inter);
+					superInterfaces.remove(interfaceName);
+				}
+			}
+			if (!sessionBean.getBusinessRemotes().contains(fullyQualifiedName)
+					&& !sessionBean.getBusinessLocals().contains(fullyQualifiedName)) {
+				sessionBean.getBusinessLocals().add(fullyQualifiedName);
+				if (dependedTypes != null)
+					dependedTypes.add(inter);
+				superInterfaces.remove(interfaceName);
+			}
+
+		}
+		for (String string : superInterfaces) {
+			if (!sessionBean.getBusinessRemotes().contains(string) && !sessionBean.getBusinessLocals().contains(string)) {
+				sessionBean.getBusinessLocals().add(string);
+			}
+		}
+		// sessionBean.getBusinessLocals().addAll(superInterfaces);
+
+	}
+
+	private static boolean isDefinedInBeanClass(IType type, List list) {
+		if (list == null) {
+			return false;
+		}
+
+		for (Object object : list) {
+			if (type.getFullyQualifiedName().equals(object.toString())) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	private void processLocalHomeAnnotation(IAnnotation annotation, SessionBean sessionBean, IType type,
+			Collection<IType> dependedTypes) throws JavaModelException {
+		IMemberValuePair[] pair = annotation.getMemberValuePairs();
+		if (pair.length == 1) {
+			String value = (String) pair[0].getValue();
+			IType interfaceType = resolveType(type, value);
+			if (interfaceType != null) {
+				sessionBean.setLocalHome(interfaceType.getFullyQualifiedName());
+				dependedTypes.add(interfaceType);
+				try {
+					IMethod method = interfaceType.getMethod(CREATE_METHOD, null);
+					if (method != null && !Signature.SIG_VOID.equals(method.getReturnType()) ){
+						String componentType = Signature.toString(method.getReturnType());
+						String[][] resolveType = interfaceType.resolveType(componentType);
+						if (resolveType[0].length == 2){
+							componentType = resolveType[0][0]+"." + resolveType[0][1]; //$NON-NLS-1$
+						}
+						sessionBean.setLocal(componentType);	
+					}
+				} catch (CoreException e) {
+					// nothing to do create method is missing and component interface cannot be extracted 
+				}
+			} else
+				sessionBean.setLocalHome(value);
+		}
+	}
+
+	private void processMessageDrivenAnnotation(MessageDrivenBean mdbBean, IAnnotation annotation, IType type)
+			throws JavaModelException {
+		IMemberValuePair[] pairs = annotation.getMemberValuePairs();
+		String beanName = type.getElementName();
+		String beanName2 = (String) getAnnotatedValue(NAME, pairs);
+		mdbBean.setEjbName(beanName2 == null ? beanName : beanName2);
+		String mappedName = (String) getAnnotatedValue(MAPPED_NAME, pairs);
+		String descr = (String) getAnnotatedValue(DESCRIPTION, pairs);
+
+		if (mappedName != null) {
+			mdbBean.setMappedName(mappedName);
+		}
+		if (descr != null) {
+			Description description = JavaeeFactory.eINSTANCE.createDescription();
+			description.setValue(descr);
+			if (mdbBean.getDescriptions().isEmpty())
+				mdbBean.getDescriptions().add(description);
+			else
+				mdbBean.getDescriptions().set(0, description);
+		}
+
+		Object values = getAnnotatedValue("activationConfig", pairs); //$NON-NLS-1$
+		if (!isArrayOfObject(values))
+			return;
+		for (Object activationAnnotation : (Object[]) values) {
+			processActivationConfig((IAnnotation) activationAnnotation, mdbBean, type);
+		}
+	}
+
+	@SuppressWarnings("unchecked")
+	private void processMethodAnnotations(JavaEEObject bean, IType type, Collection<IType> dependedTypes)
+			throws JavaModelException {
+		SessionBean sessionBean = null;
+		MessageDrivenBean messageBean = null;
+		List<EjbLocalRef> ejbRefs = null;
+		List<ResourceRef> resourceRefs = null;
+		List<LifecycleCallback> postConstructs = null;
+		List<LifecycleCallback> preDestroys = null;
+		if (SessionBean.class.isInstance(bean)) {
+			sessionBean = (SessionBean) bean;
+			ejbRefs = sessionBean.getEjbLocalRefs();
+			resourceRefs = sessionBean.getResourceRefs();
+			postConstructs = sessionBean.getPostConstructs();
+			preDestroys = sessionBean.getPreDestroys();
+		} else if (MessageDrivenBean.class.isInstance(bean)) {
+			messageBean = (MessageDrivenBean) bean;
+			ejbRefs = messageBean.getEjbLocalRefs();
+			resourceRefs = messageBean.getResourceRefs();
+			postConstructs = messageBean.getPostConstructs();
+			preDestroys =  messageBean.getPreDestroys();
+		}
+		for (IMethod method : type.getMethods()) {
+			boolean isLifecycle = isLifecycleMethod(method);
+			for (IAnnotation annotation : method.getAnnotations()) {
+				String annotationName = annotation.getElementName();
+				if (isLifecycle) {
+					if (POST_CONSTRUCT.equals(annotationName)) {
+						addLifecycleMethod(postConstructs, method, annotation);
+						continue;
+					} else if (PRE_DESTROY.equals(annotationName)) {
+						addLifecycleMethod(preDestroys, method, annotation);
+						continue;
+					}
+				}
+				if (EJB.equals(annotationName)) {
+					processEjbAnnotation(annotation, ejbRefs, method, dependedTypes);
+				} else if (RESOURCE.equals(annotationName)) {
+					processResourceRefAnnotation(annotation, resourceRefs, method, dependedTypes);
+				} else if (sessionBean != null && sessionBean.getSessionType().getValue() == SessionType.STATELESS
+						&& TIMEOUT.equals(annotationName)) {
+					// time out annotations are set only ot stateless beans
+					processTimeoutAnnotation(sessionBean, method, annotation);
+				}
+			}
+		}
+	}
+
+	/**
+	 * Process the methods of a stateful bean and looks for annotation that make
+	 * sence only in the context of the stateful bean.
+	 * 
+	 * No checks for whether the bean is really a stateful are made.
+	 * 
+	 * @param bean
+	 * @param type
+	 * @throws JavaModelException
+	 */
+	private void processStatefulMethods(SessionBean bean, IType type) throws JavaModelException {
+		IMethod[] methods = type.getMethods();
+		boolean searchForInit = bean.getLocalHome() != null || bean.getHome() != null;
+		for (IMethod method : methods) {
+			/*
+			 * Since the type maybe in a working copy the preferred way (and
+			 * only one working) is to iterate through the annotations and check
+			 * for the annotation name. In a working copy the call to
+			 * annotation.exists() always return true so it is NOT possible to
+			 * use the IAnnotation annotation =
+			 * method.getAnnotation("AnnotationName") and then check for
+			 * annotation.exists() - this will always return true in a working
+			 * copy.
+			 */
+			for (IAnnotation annotation : method.getAnnotations()) {
+				if (searchForInit) {
+					if (annotation.getElementName().equals(INIT)) {
+						if (!VOID_RETURN_TYPE.equals(method.getReturnType()))
+							continue;
+						InitMethodType initMethod = EjbFactory.eINSTANCE.createInitMethodType();
+						NamedMethodType methodType = EjbFactory.eINSTANCE.createNamedMethodType();
+						methodType.setMethodName(method.getElementName());
+						MethodParams params = EjbFactory.eINSTANCE.createMethodParams();
+						for (String param : method.getParameterTypes()) {
+							params.getMethodParams().add(Signature.toString(param));
+						}
+						methodType.setMethodParams(params);
+						initMethod.setBeanMethod(methodType);
+						bean.getInitMethods().add(initMethod);
+					}
+				}
+				if (isLifecycleMethod(method) == false)
+					continue;
+				if (annotation.getElementName().equals(POST_ACTIVATE)) {
+					addLifecycleMethod(bean.getPostActivates(), method, annotation);
+				} else if (annotation.getElementName().equals(PRE_PASSIVATE)) {
+					addLifecycleMethod(bean.getPrePassivates(), method, annotation);
+				} else if (annotation.getElementName().equals(REMOVE)) {
+					RemoveMethodType removeMethod = EjbFactory.eINSTANCE.createRemoveMethodType();
+					Boolean retainIfException = (Boolean) getAnnotatedValue(RETAIN_IF_EXCEPTION, annotation
+							.getMemberValuePairs());
+					removeMethod.setRetainIfException(retainIfException != null ? retainIfException : false);
+					NamedMethodType methodType = EjbFactory.eINSTANCE.createNamedMethodType();
+					methodType.setMethodName(method.getElementName());
+					removeMethod.setBeanMethod(methodType);
+					bean.getRemoveMethods().add(removeMethod);
+				}
+			}
+		}
+	}
+
+	private void processTimeoutAnnotation(SessionBean sessionBean, IMethod method, IAnnotation annotation)
+			throws JavaModelException {
+		if (method.getNumberOfParameters() != 1)
+			return;
+		String paramName = Signature.toString(method.getParameterTypes()[0]);
+		if (!TIMER.equals(paramName) && !JAVAX_EJB_TIMER.equals(paramName))
+			return;
+		if (method.getExceptionTypes().length != 0)
+			return;
+		NamedMethodType methodType = EjbFactory.eINSTANCE.createNamedMethodType();
+		methodType.setMethodName(method.getElementName());
+		MethodParams params = EjbFactory.eINSTANCE.createMethodParams();
+		params.getMethodParams().add(paramName);
+		methodType.setMethodParams(params);
+		sessionBean.setTimeoutMethod(methodType);
+	}
+
+	private void processTypeAnnotations(Result result, JavaEEObject bean, IType type) throws JavaModelException {
+		SessionBean sessionBean = null;
+		MessageDrivenBean messageBean = null;
+		List<EjbLocalRef> ejbRefs  = null;
+		List<ResourceRef> resourceRefs  = null;
+		if (SessionBean.class.isInstance(bean)) {
+			sessionBean = (SessionBean) bean;
+			ejbRefs = sessionBean.getEjbLocalRefs();
+			resourceRefs = sessionBean.getResourceRefs();
+		} else if (MessageDrivenBean.class.isInstance(bean)) {
+			messageBean = (MessageDrivenBean) bean;
+			ejbRefs = messageBean.getEjbLocalRefs();
+			resourceRefs = messageBean.getResourceRefs();
+		}
+		
+		for (IAnnotation annotation : type.getAnnotations()) {
+			IMemberValuePair[] pairs = annotation.getMemberValuePairs();
+			String annotationName = annotation.getElementName();
+			if (sessionBean != null) {
+				if (LOCAL.equals(annotationName)) {
+					if (pairs.length == 1) {
+						addInterfaces(sessionBean.getBusinessLocals(), type, pairs[0], result.getDependedTypes());
+					}
+				} else if (REMOTE.equals(annotationName)) {
+					if (pairs.length == 1) {
+						addInterfaces(sessionBean.getBusinessRemotes(), type, pairs[0], result.getDependedTypes());
+					}
+				} else if (REMOTE_HOME.equals(annotationName)) {
+					procesRemoteHomeAnnotation(annotation, sessionBean, type, result.getDependedTypes());
+				} else if (LOCAL_HOME.equals(annotationName)) {
+					processLocalHomeAnnotation(annotation, sessionBean, type, result.getDependedTypes());
+				} else if (DECLARE_ROLES.equals(annotationName)) {
+					processDeclareRoles(result, sessionBean.getSecurityRoleRefs(), annotation, type);
+				}
+			}
+			if (EJB.equals(annotationName)) {
+				processEjbAnnotation(annotation, ejbRefs, type, result.getDependedTypes());
+			} else if (EJBS.equals(annotationName)) {
+				if (!isArrayOfObject(pairs[0].getValue()))
+					return;
+				Object[] values = (Object[]) pairs[0].getValue();
+				for (Object ejbAnnotation : values) {
+					processEjbAnnotation((IAnnotation) ejbAnnotation, ejbRefs, type, result.getDependedTypes());
+				}
+			} else if (TRANSACTION_MANAGEMENT.equals(annotationName)) {
+				String value = (String) getAnnotatedValue(VALUE, pairs);
+				TransactionType transaction = null;
+				/*
+				 * the default value is TransactionType.BEAN which is handled by
+				 * the EMF. no need to check for this value
+				 */
+				if (TRANSACTION_MANAGEMENT_TYPE_CONTAINER.equals(value)) {
+					transaction = TransactionType.CONTAINER_LITERAL;
+				} else if (CONTAINER.equals(value)
+						&& containsImport(type.getCompilationUnit(), TRANSACTION_MANAGEMENT_TYPE_CONTAINER)) {
+					transaction = TransactionType.CONTAINER_LITERAL;
+				}
+				if (transaction != null) {
+					if (sessionBean != null)
+						sessionBean.setTransactionType(transaction);
+					else if( messageBean != null)
+						messageBean.setTransactionType(transaction);
+				}
+			} else if (RESOURCE.equals(annotationName)) {
+				processResourceRefAnnotation(annotation, resourceRefs, type, result.getDependedTypes());
+			} else if (RESOURCES.equals(annotationName)) {
+				processResourcesAnnotation(annotation, resourceRefs, type, result.getDependedTypes());
+			} else if (RUN_AS.equals(annotationName)) {
+				SecurityIdentityType identity = EjbFactory.eINSTANCE.createSecurityIdentityType();
+				RunAs runAs = JavaeeFactory.eINSTANCE.createRunAs();
+				processRunAs(annotation, runAs);
+				identity.setRunAs(runAs);
+				if (identity.getRunAs().getRoleName() != null)
+					if (sessionBean != null)
+						sessionBean.setSecurityIdentities(identity);
+					else if( messageBean != null)
+						messageBean.setSecurityIdentity(identity);
+			}
+		}
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.jee.ejb/ejb/org/eclipse/jst/jee/model/internal/Messages.java b/plugins/org.eclipse.jst.jee.ejb/ejb/org/eclipse/jst/jee/model/internal/Messages.java
new file mode 100644
index 0000000..36bac76
--- /dev/null
+++ b/plugins/org.eclipse.jst.jee.ejb/ejb/org/eclipse/jst/jee/model/internal/Messages.java
@@ -0,0 +1,31 @@
+/***********************************************************************
+ * Copyright (c) 2008 by SAP AG, Walldorf. 
+ * 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:
+ *     SAP AG - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jst.jee.model.internal;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+public class Messages {
+	private static final String BUNDLE_NAME = "org.eclipse.jst.jee.model.internal.messages"; //$NON-NLS-1$
+
+	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME);
+
+	private Messages() {
+	}
+
+	public static String getString(String key) {
+		try {
+			return RESOURCE_BUNDLE.getString(key);
+		} catch (MissingResourceException e) {
+			return '!' + key + '!';
+		}
+	}
+}
diff --git a/plugins/org.eclipse.jst.jee.ejb/ejb/org/eclipse/jst/jee/model/internal/mergers/AccessibleBeanMerger.java b/plugins/org.eclipse.jst.jee.ejb/ejb/org/eclipse/jst/jee/model/internal/mergers/AccessibleBeanMerger.java
new file mode 100644
index 0000000..09556af
--- /dev/null
+++ b/plugins/org.eclipse.jst.jee.ejb/ejb/org/eclipse/jst/jee/model/internal/mergers/AccessibleBeanMerger.java
@@ -0,0 +1,100 @@
+/***********************************************************************
+ * Copyright (c) 2008 by SAP AG, Walldorf. 
+ * 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:
+ *     SAP AG - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jst.jee.model.internal.mergers;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jst.javaee.ejb.SessionBean;
+/**
+ * Accessible Bean Merger is used to merge beans that are accessible via interfaces.
+ * For the time being it is used to merge only Session Beans.
+ * 
+ * @author Dimitar Giormov
+ */
+public class AccessibleBeanMerger extends EnterpriseBeanMerger {
+
+  /**
+   * @param baseBean element is the main element that values will be taken with highest priority.
+   * @param toMergeBean element will give all of his extra values to base.
+   * @param _kind
+   */
+  public AccessibleBeanMerger(SessionBean baseBean,
+      SessionBean toMergeBean, int _kind) {
+    super(baseBean, toMergeBean, _kind);
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.jst.javaee.ejb.model.mergers.EnterpriseBeanMerger#process()
+   */
+  @Override
+public List process() throws ModelException {
+    List warnings = new ArrayList();
+    warnings.addAll(super.process());
+    mergeInterfaces(warnings);
+    return warnings;
+  }
+
+  private void mergeInterfaces(List warnings) throws ModelException {
+      SessionBean baseBean = getBaseBean();
+      SessionBean toMergeBean = getToMergeBean();
+
+      List<String> toMergeBusinessLocal = toMergeBean.getBusinessLocals();
+      for(String toMergeIntfs:toMergeBusinessLocal){
+        if (containsInterface(baseBean.getBusinessRemotes(), toMergeIntfs)) {
+          continue;
+        }
+        if (!containsInterface(baseBean.getBusinessLocals(), toMergeIntfs)) {
+          baseBean.getBusinessLocals().add(toMergeIntfs);
+        }
+      }
+
+      List<String> toMergeIntfs = toMergeBean.getBusinessRemotes();       
+      for(String toMergeRemoteIntf:toMergeIntfs){
+        if (containsInterface(baseBean.getBusinessLocals(), toMergeRemoteIntf)) {
+          continue;
+        }
+        if (!containsInterface(baseBean.getBusinessRemotes(), toMergeRemoteIntf)) {
+          baseBean.getBusinessRemotes().add(toMergeRemoteIntf);
+        }
+      }
+
+
+      if (baseBean.getLocal() == null){
+        String toMergeLocal = toMergeBean.getLocal();
+        baseBean.setLocal(toMergeLocal);   
+      }
+
+      if (baseBean.getLocalHome() == null){
+        String toMergeLocalHome = toMergeBean.getLocalHome();
+        baseBean.setLocalHome(toMergeLocalHome);   
+      }
+
+      if (baseBean.getRemote() == null){
+        String toMergeRemote = toMergeBean.getRemote();
+        baseBean.setRemote(toMergeRemote);   
+      }
+      
+      if (baseBean.getHome() == null){
+        String toMergeRemoteHome = toMergeBean.getHome();
+        baseBean.setHome(toMergeRemoteHome);   
+      }
+  }
+
+  private boolean containsInterface(List business, String intfs) {
+    for (Object object : business) {
+      if (object.toString().equals(intfs)){
+        return true;
+      }
+    }
+    return false;
+  }
+}
diff --git a/plugins/org.eclipse.jst.jee.ejb/ejb/org/eclipse/jst/jee/model/internal/mergers/AssemblyDescriptorMerger.java b/plugins/org.eclipse.jst.jee.ejb/ejb/org/eclipse/jst/jee/model/internal/mergers/AssemblyDescriptorMerger.java
new file mode 100644
index 0000000..f0a7222
--- /dev/null
+++ b/plugins/org.eclipse.jst.jee.ejb/ejb/org/eclipse/jst/jee/model/internal/mergers/AssemblyDescriptorMerger.java
@@ -0,0 +1,135 @@
+/***********************************************************************
+ * Copyright (c) 2008 by SAP AG, Walldorf. 
+ * 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:
+ *     SAP AG - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jst.jee.model.internal.mergers;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.jst.javaee.core.JavaEEObject;
+import org.eclipse.jst.javaee.core.SecurityRole;
+import org.eclipse.jst.javaee.ejb.AssemblyDescriptor;
+
+/**
+ * Assembly Descriptor Merger is used to merge the artifacts under assembly descriptor tag. 
+ * 
+ * @author Dimitar Giormov
+ */
+public class AssemblyDescriptorMerger extends ModelElementMerger {
+
+  /**
+   * @param _base - is the base element, into which the values will be merged.
+   * @param merge - is the conflicting element, which will be merged into base.
+   * @param _kind
+   */
+  public AssemblyDescriptorMerger(JavaEEObject _base, JavaEEObject merge,
+      int _kind) {
+    super(_base, merge, _kind);
+  }
+
+  /**
+   * Returns the base element, into which the values will be merged.
+   * 
+   * @return base and result element.
+   */
+  AssemblyDescriptor getBaseAssemblyDescriptor(){
+    return (AssemblyDescriptor) getBase();
+  }
+
+  /**
+   * Returns the conflicting element, which will be merged into base.
+   * @return to merge element.
+   */
+  AssemblyDescriptor getToMergeAssemblyDescriptor(){
+    return (AssemblyDescriptor) getToMerge();
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.jst.javaee.ejb.model.mergers.ModelElementMerger#process()
+   */
+  @Override
+  public List process() throws ModelException {
+    List warnings = new ArrayList();
+    mergeSecurityRoles(warnings);
+    mergeTransactionAttribute(warnings);
+    copyGeneralData(warnings);
+    return warnings;
+  }
+  //TODO 
+  private void mergeTransactionAttribute(List warnings) {
+//    List containerTransactionsBase = getBaseAssemblyDescriptor().getContainerTransactions();
+//    List containerTransactionsToMerge = getToMergeAssemblyDescriptor().getContainerTransactions();
+//    if (containerTransactionsToMerge == null){
+//      return;
+//    }
+  }
+
+  private void mergeSecurityRoles(List warnings) {
+    List securityRolesBase = getBaseAssemblyDescriptor().getSecurityRoles();
+    List securityRolesToMerge = getToMergeAssemblyDescriptor().getSecurityRoles();
+    if (securityRolesToMerge == null){
+      return;
+    }
+    for (Object sRoles : securityRolesToMerge) {
+      if(!containsSecRole((SecurityRole) sRoles, securityRolesBase)){
+        securityRolesBase.add(EcoreUtil.copy((EObject) sRoles));
+      }
+    }
+  }
+  
+
+  private boolean containsSecRole(SecurityRole secRole, List secRoles){
+    for (Object sRoles : secRoles) {
+      if(((SecurityRole)sRoles).getRoleName() == null || secRole.getRoleName() == null){
+        return ((SecurityRole)sRoles).getRoleName() == secRole.getRoleName();
+      }
+      if (((SecurityRole)sRoles).getRoleName().equals(secRole.getRoleName())){
+        return true;
+      }
+    }
+    return false;
+  }
+  
+  private void copyGeneralData(List warnings){
+
+	    if (getToMergeAssemblyDescriptor().getApplicationExceptions() != null && getToMergeAssemblyDescriptor().getApplicationExceptions().size() > 0){
+	      copyMissingContentInBase(getToMergeAssemblyDescriptor().getApplicationExceptions(), getBaseAssemblyDescriptor().getApplicationExceptions());
+	    }
+
+	    if (getToMergeAssemblyDescriptor().getInterceptorBindings() != null && getToMergeAssemblyDescriptor().getInterceptorBindings().size() > 0){
+		      copyMissingContentInBase(getToMergeAssemblyDescriptor().getInterceptorBindings(), getBaseAssemblyDescriptor().getInterceptorBindings());
+		}
+
+	    if (getToMergeAssemblyDescriptor().getContainerTransactions() != null && getToMergeAssemblyDescriptor().getContainerTransactions().size() > 0){
+		      copyMissingContentInBase(getToMergeAssemblyDescriptor().getContainerTransactions(), getBaseAssemblyDescriptor().getContainerTransactions());
+		}
+
+	    if (getToMergeAssemblyDescriptor().getMessageDestinations() != null && getToMergeAssemblyDescriptor().getMessageDestinations().size() > 0){
+		      copyMissingContentInBase(getToMergeAssemblyDescriptor().getMessageDestinations(), getBaseAssemblyDescriptor().getMessageDestinations());
+		}
+
+	    if (getToMergeAssemblyDescriptor().getMethodPermissions() != null && getToMergeAssemblyDescriptor().getMethodPermissions().size() > 0){
+		      copyMissingContentInBase(getToMergeAssemblyDescriptor().getMethodPermissions(), getBaseAssemblyDescriptor().getMethodPermissions());
+		}
+
+	    if (getToMergeAssemblyDescriptor().getExcludeList() != null && getToMergeAssemblyDescriptor().getExcludeList().getMethods().size() > 0){
+		      copyMissingContentInBase(getToMergeAssemblyDescriptor().getExcludeList().getMethods(), getBaseAssemblyDescriptor().getExcludeList().getMethods());
+		}
+
+	  }
+
+	  private void copyMissingContentInBase(List listSource, List target) {
+	    for (Object object : listSource) {
+	        target.add(EcoreUtil.copy((EObject) object));        
+	    }
+	  }
+}
diff --git a/plugins/org.eclipse.jst.jee.ejb/ejb/org/eclipse/jst/jee/model/internal/mergers/EjbJarMerger.java b/plugins/org.eclipse.jst.jee.ejb/ejb/org/eclipse/jst/jee/model/internal/mergers/EjbJarMerger.java
new file mode 100644
index 0000000..369b8e7
--- /dev/null
+++ b/plugins/org.eclipse.jst.jee.ejb/ejb/org/eclipse/jst/jee/model/internal/mergers/EjbJarMerger.java
@@ -0,0 +1,282 @@
+/***********************************************************************
+ * Copyright (c) 2008 by SAP AG, Walldorf. 
+ * 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:
+ *     SAP AG - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jst.jee.model.internal.mergers;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.jst.javaee.core.JavaEEObject;
+import org.eclipse.jst.javaee.ejb.EJBJar;
+import org.eclipse.jst.javaee.ejb.EjbFactory;
+import org.eclipse.jst.javaee.ejb.EntityBean;
+import org.eclipse.jst.javaee.ejb.InterceptorsType;
+import org.eclipse.jst.javaee.ejb.MessageDrivenBean;
+import org.eclipse.jst.javaee.ejb.Relationships;
+import org.eclipse.jst.javaee.ejb.SessionBean;
+
+/**
+ * Ejb Jar merger merges the Ejb jar artifact it will call 
+ * the assembly descriptor merger or corresponding bean merger 
+ * if conflict is detected.
+ *  
+ * @author Dimitar Giormov
+ */
+public class EjbJarMerger extends ModelElementMerger {
+
+	/**
+	 * Constructor which gets the base and to merge ejb jar element.
+	 * 
+	 * @param _base - is the base element, into which the values will be merged.
+	 * @param merge - is the conflicting element, which will be merged into base.
+	 * @param kind
+	 */
+	public EjbJarMerger(JavaEEObject _base, JavaEEObject merge, int kind) {
+		super(_base, merge, kind);
+	}
+
+	/**
+	 * Returns the base element, into which the values will be merged.
+	 * 
+	 * @return base element, into which the values will be merged.
+	 */
+	EJBJar getBaseEjbJar(){
+		return (EJBJar) getBase();
+	}
+
+	/**
+	 * Returns the conflicting element, which will be merged into base.
+	 * 
+	 * @return the conflicting element, which will be merged into base.
+	 */
+	EJBJar getToMergeEjbJar(){
+		return (EJBJar) getToMerge();
+	}
+
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jst.javaee.ejb.model.mergers.ModelElementMerger#process()
+	 */
+	@Override
+	public List process() throws ModelException {
+		List warnings = new ArrayList();
+		try {
+			copyGeneralData(warnings);
+			mergeSessionBeans(warnings);
+			mergeMdbs(warnings);
+			mergeEntities(warnings);
+			mergeAssemblyDescriptor(warnings);
+		} catch (Exception e) {
+			throw new ModelException(e);
+		}
+		return warnings;
+	}
+
+
+	private void mergeAssemblyDescriptor(List warnings) throws ModelException {
+		if(getToMergeEjbJar().getAssemblyDescriptor() == null){
+			return;
+		}
+		if(getBaseEjbJar().getAssemblyDescriptor() == null){
+			getBaseEjbJar().setAssemblyDescriptor(EjbFactory.eINSTANCE.createAssemblyDescriptor()); 
+		}
+		AssemblyDescriptorMerger adMerger = new AssemblyDescriptorMerger(getBaseEjbJar().getAssemblyDescriptor(), 
+				getToMergeEjbJar().getAssemblyDescriptor(), ModelElementMerger.ADD);
+		warnings.addAll(adMerger.process());
+
+	}
+
+	private void mergeEntities(List warnings) {
+
+		if(!isEnterpriseBeansTagPresent()){
+			return;
+		}
+
+		List entityBeansToMerge = getToMergeEjbJar().getEnterpriseBeans().getEntityBeans();      
+		List entityBeansBase = getBaseEjbJar().getEnterpriseBeans().getEntityBeans();
+		if(!entityBeansToMerge.isEmpty()) {
+			for (Object entity : entityBeansToMerge) {
+				EntityBean entityType = (EntityBean) entity;
+				EntityBean entityBean = getEntityBean(entityType.getEjbName(), entityBeansBase);
+				if (entityBean == null && isValidArtifact(entity)){
+					entityBeansBase.add(EcoreUtil.copy((EObject) entity));          
+				}
+			}
+		}
+
+	}
+
+	private boolean isEnterpriseBeansTagPresent() {
+		if(getToMergeEjbJar().getEnterpriseBeans() == null){
+			return false;
+		}
+		if(getBaseEjbJar().getEnterpriseBeans() == null){
+			getBaseEjbJar().setEnterpriseBeans(EjbFactory.eINSTANCE.createEnterpriseBeans());
+		}
+		if((getToMergeEjbJar().getEnterpriseBeans().getEntityBeans() == null || 
+				getToMergeEjbJar().getEnterpriseBeans().getEntityBeans().isEmpty()) && 
+				(getToMergeEjbJar().getEnterpriseBeans().getSessionBeans() == null || 
+						getToMergeEjbJar().getEnterpriseBeans().getSessionBeans().isEmpty()) &&
+						(getToMergeEjbJar().getEnterpriseBeans().getMessageDrivenBeans() == null || 
+								getToMergeEjbJar().getEnterpriseBeans().getMessageDrivenBeans().isEmpty())
+		){
+			return false;
+		}
+
+		return true;
+	}
+
+	private void mergeSessionBeans(List warnings) throws Exception {
+		if(!isEnterpriseBeansTagPresent()){
+			return;
+		}
+
+		List sessionBeansToMerge = getToMergeEjbJar().getEnterpriseBeans().getSessionBeans();      
+		List sessionBeansBase = getBaseEjbJar().getEnterpriseBeans().getSessionBeans();
+		for (Object session : sessionBeansToMerge) {
+			SessionBean sessionType = (SessionBean) session;
+
+			SessionBean baseBean = getSessionBean(sessionType.getEjbName(), sessionBeansBase);
+			if (baseBean != null){
+				IMerger m = getSessionMerger(baseBean, sessionType, getKind());
+				if(m != null){
+					warnings.addAll(m.process());
+					continue;
+				}
+			} else {
+				if (isValidArtifact(session)){
+					sessionBeansBase.add(EcoreUtil.copy((EObject) session));
+				}
+			}      
+		}
+	}
+
+	private IMerger getSessionMerger(SessionBean baseBean, SessionBean toMergeType, int kind) {
+		return new SessionBeanMerger(baseBean, toMergeType, kind);
+	}
+
+	private void mergeMdbs(List warnings) throws Exception {
+		if(!isEnterpriseBeansTagPresent()){
+			return;
+		}
+
+		List mdBeansToMerge = getToMergeEjbJar().getEnterpriseBeans().getMessageDrivenBeans();      
+		List mdBeansBase = getBaseEjbJar().getEnterpriseBeans().getMessageDrivenBeans();
+		for (Object mdb : mdBeansToMerge) {
+			MessageDrivenBean sessionType = (MessageDrivenBean) mdb;
+			MessageDrivenBean baseBean = getMdbBean(sessionType.getEjbName(), mdBeansBase);
+			if (baseBean != null){
+				IMerger m = getMdbMerger(baseBean, sessionType, getKind());
+				if(m != null){
+					warnings.addAll(m.process());
+				}
+			} else {
+				if (isValidArtifact(mdb)){
+					mdBeansBase.add(EcoreUtil.copy((EObject) mdb));
+				}
+
+			}
+		}
+	}
+
+	private IMerger getMdbMerger(MessageDrivenBean baseBean, MessageDrivenBean toMergeType, int kind) {
+		return new MessageDrivenBeanMerger(baseBean, toMergeType, kind);
+	}
+
+	private MessageDrivenBean getMdbBean(String name, List enterpriseBeans){
+		for (Object bean : enterpriseBeans) {
+			MessageDrivenBean sBean = (MessageDrivenBean) bean;
+			if (sBean.getEjbName().equals(name)){
+				return sBean;
+			}
+
+		}
+		return null;
+	}
+
+	private SessionBean getSessionBean(String name, List enterpriseBeans){
+		for (Object bean : enterpriseBeans) {
+			SessionBean sBean = (SessionBean) bean;
+			if (sBean.getEjbName().equals(name)){
+				return sBean;
+			}
+
+		}
+		return null;
+	}
+
+	private EntityBean getEntityBean(String name, List enterpriseBeans){
+		for (Object bean : enterpriseBeans) {
+			EntityBean sBean = (EntityBean) bean;
+			if (sBean.getEjbName().equals(name)){
+				return sBean;
+			}
+
+		}
+		return null;
+	}
+
+	private void copyGeneralData(List warnings){
+
+		copyJavaEEGroup();
+		if (getToMergeEjbJar().getRelationships() != null && getToMergeEjbJar().getRelationships().getEjbRelations() != null
+				&& getToMergeEjbJar().getRelationships().getEjbRelations().size() > 0){
+			getBaseEjbJar().setRelationships((Relationships) EcoreUtil.copy((EObject) getToMergeEjbJar().getRelationships()));
+		}
+		if (getToMergeEjbJar().getEjbClientJar() != null){
+			getBaseEjbJar().setEjbClientJar(getToMergeEjbJar().getEjbClientJar());
+		}
+
+		if (getToMergeEjbJar().getInterceptors() != null && getToMergeEjbJar().getInterceptors().getInterceptors() != null
+				&& getToMergeEjbJar().getInterceptors().getInterceptors().size() > 0){
+			getBaseEjbJar().setInterceptors((InterceptorsType) (EcoreUtil.copy((EObject) getToMergeEjbJar().getInterceptors())));
+		}
+
+		    if (getToMergeEjbJar().isSetVersion()){
+			      getBaseEjbJar().setVersion(getToMergeEjbJar().getVersion());
+			    }
+	}
+
+	private void copyAllContentInBase(List listSource, List target) {
+		for (Object object : listSource) {
+			target.add(EcoreUtil.copy((EObject) object));
+		}
+
+	}
+
+
+	private boolean isValidArtifact(Object javaEEObject){
+		if (javaEEObject instanceof SessionBean){
+			return ( (SessionBean)javaEEObject).getEjbName() != null;
+		} else if (javaEEObject instanceof EntityBean){        
+			return ((EntityBean)javaEEObject).getEjbName() != null;
+		} else if (javaEEObject instanceof MessageDrivenBean){
+			return ((MessageDrivenBean)javaEEObject).getEjbName() != null;
+		} 
+		return true;
+	}
+
+	private void copyJavaEEGroup(){
+		if (getToMergeEjbJar().getDescriptions() != null){
+			copyAllContentInBase(getToMergeEjbJar().getDescriptions(), getBaseEjbJar().getDescriptions());
+		}
+
+		if (getToMergeEjbJar().getDisplayNames() != null){
+			copyAllContentInBase(getToMergeEjbJar().getDisplayNames(), getBaseEjbJar().getDisplayNames());
+		}
+
+		if (getToMergeEjbJar().getIcons() != null){
+			copyAllContentInBase(getToMergeEjbJar().getIcons(), getBaseEjbJar().getIcons());
+		}
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.jee.ejb/ejb/org/eclipse/jst/jee/model/internal/mergers/EnterpriseBeanMerger.java b/plugins/org.eclipse.jst.jee.ejb/ejb/org/eclipse/jst/jee/model/internal/mergers/EnterpriseBeanMerger.java
new file mode 100644
index 0000000..c260d5f
--- /dev/null
+++ b/plugins/org.eclipse.jst.jee.ejb/ejb/org/eclipse/jst/jee/model/internal/mergers/EnterpriseBeanMerger.java
@@ -0,0 +1,110 @@
+/***********************************************************************
+ * Copyright (c) 2008 by SAP AG, Walldorf. 
+ * 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:
+ *     SAP AG - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jst.jee.model.internal.mergers;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.jst.javaee.ejb.NamedMethodType;
+import org.eclipse.jst.javaee.ejb.SecurityIdentityType;
+import org.eclipse.jst.javaee.ejb.SessionBean;
+import org.eclipse.jst.javaee.ejb.TransactionType;
+
+/**
+ * Enterprise Bean Merger is used to merge all the common bean properties.
+ * For the time being it is used only on Session Beans, until a proper structure in Emf model is introduced.
+ * 
+ * @author Dimitar Giormov
+ */
+public class EnterpriseBeanMerger extends ModelElementMerger {
+
+
+  /**
+   * Constructor of the class.
+   * 
+   * @param _base Session bean artifact element is the main element that values will be taken with highest priority.
+   * @param _toMerge Session bean artifact element will give all of his extra values to base.
+   * @param _kind
+   */
+  public EnterpriseBeanMerger(SessionBean base, SessionBean toMerge, int _kind) {
+    super(base, toMerge, _kind);
+  }
+
+  /**
+   * Returns the Session bean base element, which is also the merged result.
+   * 
+   * @return Session bean base element.
+   */
+  SessionBean getBaseBean() {
+    return (SessionBean) getBase();
+  }
+
+  /**
+   * 
+   * @return toMergeBean element, which will be merged in base.
+   */
+  SessionBean getToMergeBean() {
+    return (SessionBean) getToMerge();
+  }
+
+
+  /* (non-Javadoc)
+   * @see org.eclipse.jst.javaee.ejb.model.mergers.ModelElementMerger#process()
+   */
+  @Override
+public List process() throws ModelException {
+    List warnings = new ArrayList();
+    if(getToMerge() == null){
+      return warnings;
+    }
+    String beanClass = getBaseBean().getEjbClass();
+    if (beanClass == null) {
+      beanClass = getToMergeBean().getEjbClass();
+    }
+    getBaseBean().setEjbClass(beanClass);
+    mergeJNDIRefs(warnings);
+    mergeTransactionType();
+    mergeSecurityIdentity(warnings);
+    mergeTimeoutMethods(warnings);
+    return warnings;
+  }
+
+
+  private void mergeTransactionType() {
+    TransactionType toMergeTransaction = getToMergeBean().getTransactionType();
+    if (!getBaseBean().isSetTransactionType()){
+      getBaseBean().setTransactionType(toMergeTransaction);
+    }
+  }
+
+
+  private void mergeTimeoutMethods(List warnings) throws ModelException {
+    NamedMethodType timeoutMethod = getBaseBean().getTimeoutMethod();
+    if(timeoutMethod == null && getToMergeBean().getTimeoutMethod() != null){
+      getBaseBean().setTimeoutMethod((NamedMethodType) EcoreUtil.copy((EObject) getToMergeBean().getTimeoutMethod()));
+    }
+  }
+
+  private void mergeSecurityIdentity(List warnings) throws ModelException {
+    SecurityIdentityType baseSecId = getBaseBean().getSecurityIdentities();
+    SecurityIdentityType toMergeSecId = getToMergeBean().getSecurityIdentities();
+    if(baseSecId == null && toMergeSecId != null){
+      getBaseBean().setSecurityIdentities((SecurityIdentityType) EcoreUtil.copy((EObject)toMergeSecId));              
+    }
+  }
+
+  private void mergeJNDIRefs(List warnings) throws ModelException {
+    JNDIRefsMerger jndiRefsMerger = new JNDIRefsMerger(getBaseBean(), getToMergeBean(), getKind());
+    warnings.addAll(jndiRefsMerger.process());
+  }    
+}
diff --git a/plugins/org.eclipse.jst.jee.ejb/ejb/org/eclipse/jst/jee/model/internal/mergers/EntityBeanMerger.java b/plugins/org.eclipse.jst.jee.ejb/ejb/org/eclipse/jst/jee/model/internal/mergers/EntityBeanMerger.java
new file mode 100644
index 0000000..94a36b2
--- /dev/null
+++ b/plugins/org.eclipse.jst.jee.ejb/ejb/org/eclipse/jst/jee/model/internal/mergers/EntityBeanMerger.java
@@ -0,0 +1,125 @@
+/***********************************************************************
+ * Copyright (c) 2008 by SAP AG, Walldorf. 
+ * 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:
+ *     SAP AG - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jst.jee.model.internal.mergers;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jst.javaee.core.SecurityRoleRef;
+import org.eclipse.jst.javaee.ejb.EntityBean;
+
+/**
+ * @author Dimitar Giormov
+ *
+ */
+public class EntityBeanMerger extends ModelElementMerger {
+
+  /**
+   * @param _base
+   * @param _toMergeBean
+   * @param _kind
+   */
+  public EntityBeanMerger(EntityBean _base, EntityBean _toMergeBean, int _kind) {
+    super(_base, _toMergeBean, _kind);
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.jst.javaee.ejb.model.mergers.ModelElementMerger#process()
+   */
+  @Override
+public List process() throws ModelException {
+    List warnings = new ArrayList();
+    if(getToMerge() == null){
+      return warnings;
+    }
+    String beanClass = getBaseBean().getEjbClass();
+    if (beanClass == null) {
+      beanClass = getToMergeBean().getEjbClass();
+    }
+    getBaseBean().setEjbClass(beanClass);
+
+
+    mergeInterfaces(warnings);
+    mergeSecurityRoleRefs(warnings);
+    mergeJNDIRefs(warnings);
+    return warnings;
+  }
+
+  EntityBean getBaseBean() {
+    return (EntityBean) getBase();
+  }
+
+  EntityBean getToMergeBean() {
+    return (EntityBean) getToMerge();
+  }
+
+
+
+  private void mergeSecurityRoleRefs(List warnings) throws ModelException {
+    List<SecurityRoleRef> toMergeList = getToMergeBean().getSecurityRoleRefs();
+    addAllRoleRefs(toMergeList, warnings);
+  }
+
+  private void addAllRoleRefs(List<SecurityRoleRef> roleRefs, List warnings) {
+    for (SecurityRoleRef roleRef:roleRefs) {
+      if(!existingSecRoleRef(getBaseBean().getSecurityRoleRefs(), roleRef)){
+        getBaseBean().getSecurityRoleRefs().add(roleRef);
+      }
+
+    }
+  }
+
+  private boolean existingSecRoleRef(List roles, SecurityRoleRef secRole){
+    for (Object object : roles) {
+      SecurityRoleRef cRole = (SecurityRoleRef) object;
+      if (cRole.getRoleName().equals(secRole.getRoleName())){
+
+      }
+    }
+    return false;
+  }
+
+
+
+  private void mergeInterfaces(List warnings) throws ModelException {
+      EntityBean baseBean = getBaseBean();
+      EntityBean toMergeBean = getToMergeBean();
+
+      if (baseBean.getLocal() == null){
+        String toMergeLocal = toMergeBean.getLocal();
+        baseBean.setLocal(toMergeLocal);   
+      }
+
+      if (baseBean.getLocalHome() == null){
+        String toMergeLocalHome = toMergeBean.getLocalHome();
+        baseBean.setLocalHome(toMergeLocalHome);   
+      }
+
+      if (baseBean.getRemote() == null){
+        String toMergeRemote = toMergeBean.getRemote();
+        baseBean.setRemote(toMergeRemote);   
+      }
+
+      if (baseBean.getRemote() == null){
+        String toMergeRemoteHome = toMergeBean.getRemote();
+        baseBean.setRemote(toMergeRemoteHome);   
+      }
+  }
+
+  private void mergeJNDIRefs(List warnings) throws ModelException {
+    
+      JNDIRefsMerger jndiRefsMerger = new JNDIRefsMerger(getBaseBean(), getToMergeBean(), getKind());
+      warnings.addAll(jndiRefsMerger.process());
+  }    
+
+
+
+}
diff --git a/plugins/org.eclipse.jst.jee.ejb/ejb/org/eclipse/jst/jee/model/internal/mergers/MessageDrivenBeanMerger.java b/plugins/org.eclipse.jst.jee.ejb/ejb/org/eclipse/jst/jee/model/internal/mergers/MessageDrivenBeanMerger.java
new file mode 100644
index 0000000..7f41f84
--- /dev/null
+++ b/plugins/org.eclipse.jst.jee.ejb/ejb/org/eclipse/jst/jee/model/internal/mergers/MessageDrivenBeanMerger.java
@@ -0,0 +1,159 @@
+/***********************************************************************
+ * Copyright (c) 2008 by SAP AG, Walldorf. 
+ * 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:
+ *     SAP AG - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jst.jee.model.internal.mergers;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.jst.javaee.ejb.ActivationConfig;
+import org.eclipse.jst.javaee.ejb.ActivationConfigProperty;
+import org.eclipse.jst.javaee.ejb.MessageDrivenBean;
+import org.eclipse.jst.javaee.ejb.NamedMethodType;
+import org.eclipse.jst.javaee.ejb.SecurityIdentityType;
+import org.eclipse.jst.javaee.ejb.TransactionType;
+
+/**
+ * Merger for Message Driven Beans.
+ * This class will merge all the values of the two beans into the Base bean. 
+ * 
+ * @author Dimitar Giormov
+ */
+public class MessageDrivenBeanMerger extends ModelElementMerger {
+
+  /**
+   * Constructor for the Merger class.
+   * 
+   * @param baseBean element is the main element that values will be taken with highest priority.
+   * @param toMergeBean element will give all of his extra values to base.
+   * @param _kind
+   */
+  public MessageDrivenBeanMerger(MessageDrivenBean _baseBean, MessageDrivenBean _toMergeBean, int _kind) {
+    super(_baseBean, _toMergeBean, _kind);
+  }
+
+  private void mergeMessagingType(List<String> warnings) {
+    if (getBaseBean().getMessagingType() == null){
+      getBaseBean().setMessagingType(getToMergeBean().getMessagingType());
+    }
+  }
+
+  private void mergeActivationConfigurationProps(List<String> warnings) {
+    ActivationConfig baseActConf = getBaseBean().getActivationConfig();
+    if(baseActConf == null){
+      getBaseBean().setActivationConfig(getToMergeBean().getActivationConfig());
+    } else{
+      List baseActConfProps = baseActConf.getActivationConfigProperties();
+      if(getToMergeBean().getActivationConfig() == null){
+        return;
+      }
+      List annotationProps = getToMergeBean().getActivationConfig().getActivationConfigProperties();
+      for (Object object : annotationProps) {
+        ActivationConfigProperty element = (ActivationConfigProperty) object;
+        if(!containsActivationConfigProperty(baseActConfProps, element)){
+          baseActConfProps.add(EcoreUtil.copy((EObject) element));
+        }
+      }
+    }
+
+  }
+
+  private boolean containsActivationConfigProperty(List properties, ActivationConfigProperty acp){
+    for (Object object : properties) {
+      ActivationConfigProperty actConfProp = (ActivationConfigProperty) object;
+      if(actConfProp.getActivationConfigPropertyName().equals(acp.getActivationConfigPropertyName())){
+        return true;
+      }
+    }
+    return false;
+  }
+
+
+  /**
+   * @return base element is the main element that values will be taken with highest priority.
+   */
+  MessageDrivenBean getBaseBean() {
+    return (MessageDrivenBean) getBase();
+  }
+
+  /**
+   * @return toMergeBean element will give all of his extra values to base.
+   */
+  MessageDrivenBean getToMergeBean() {
+    return (MessageDrivenBean) getToMerge();
+  }
+
+
+  /* (non-Javadoc)
+   * @see org.eclipse.jst.javaee.ejb.model.mergers.ModelElementMerger#process()
+   */
+  @Override
+public List process() throws ModelException {
+    List warnings = new ArrayList();
+    if(getToMerge() == null){
+      return warnings;
+    }
+    String beanClass = getBaseBean().getEjbClass();
+    if (beanClass == null) {
+      beanClass = getToMergeBean().getEjbClass();
+    }
+    getBaseBean().setEjbClass(beanClass);
+    mergeJNDIRefs(warnings);
+    //  mergeInterceptors(warnings);
+    mergeTransactionType();
+    mergeContainerTransactions(warnings);
+    mergeSecurityIdentity(warnings);
+    mergeTimeoutMethods(warnings);
+
+    mergeMessagingType(warnings);
+    mergeActivationConfigurationProps(warnings);
+    return warnings;
+  }
+
+
+  private void mergeTransactionType() {
+    TransactionType toMergeTransaction = getToMergeBean().getTransactionType();
+    TransactionType baseTransaction = getBaseBean().getTransactionType();
+    if (baseTransaction != null){
+      //		          getBaseBean().setTransactionType(toMergeTransaction);
+    } else {
+      if (toMergeTransaction != null){
+        getBaseBean().setTransactionType(toMergeTransaction);
+      }
+    }
+  }
+  
+  private void mergeJNDIRefs(List warnings) throws ModelException {
+    JNDIRefsMerger jndiRefsMerger = new JNDIRefsMerger(getBaseBean(), getToMergeBean(), getKind());
+    warnings.addAll(jndiRefsMerger.process());
+  } 
+
+  private void mergeSecurityIdentity(List warnings) throws ModelException {
+    SecurityIdentityType baseSecId = getBaseBean().getSecurityIdentity();
+    SecurityIdentityType toMergeSecId = getToMergeBean().getSecurityIdentity();
+    if(baseSecId == null && toMergeSecId != null){
+      getBaseBean().setSecurityIdentity((SecurityIdentityType) EcoreUtil.copy((EObject)toMergeSecId));              
+    }
+  }
+
+  private void mergeContainerTransactions(List warnings) throws ModelException {
+  }
+
+  private void mergeTimeoutMethods(List warnings) throws ModelException {
+    NamedMethodType timeoutMethod = getBaseBean().getTimeoutMethod();
+    if(timeoutMethod == null && getToMergeBean().getTimeoutMethod() != null){
+      getBaseBean().setTimeoutMethod((NamedMethodType) EcoreUtil.copy((EObject) getToMergeBean().getTimeoutMethod()));
+    }
+
+
+  }
+}
diff --git a/plugins/org.eclipse.jst.jee.ejb/ejb/org/eclipse/jst/jee/model/internal/mergers/SessionBeanMerger.java b/plugins/org.eclipse.jst.jee.ejb/ejb/org/eclipse/jst/jee/model/internal/mergers/SessionBeanMerger.java
new file mode 100644
index 0000000..1253c06
--- /dev/null
+++ b/plugins/org.eclipse.jst.jee.ejb/ejb/org/eclipse/jst/jee/model/internal/mergers/SessionBeanMerger.java
@@ -0,0 +1,152 @@
+/***********************************************************************
+ * Copyright (c) 2008 by SAP AG, Walldorf. 
+ * 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:
+ *     SAP AG - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jst.jee.model.internal.mergers;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.jst.javaee.core.SecurityRoleRef;
+import org.eclipse.jst.javaee.ejb.InitMethodType;
+import org.eclipse.jst.javaee.ejb.MethodParams;
+import org.eclipse.jst.javaee.ejb.RemoveMethodType;
+import org.eclipse.jst.javaee.ejb.SessionBean;
+
+/**
+ * 
+ * Merger for Session Beans.
+ * This class will merge all the values of the two beans into the Base bean. 
+ * 
+ * @author Dimitar Giormov
+ *
+ */
+public class SessionBeanMerger extends AccessibleBeanMerger {
+
+  /**
+   * @param _baseBean element is the main element that values will be taken with highest priority.
+   * @param _toMergeBean element will give all of his extra values to base.
+   * @param _kind
+   */
+  public SessionBeanMerger(SessionBean _baseBean, SessionBean _toMergeBean, int _kind) {
+    super(_baseBean, _toMergeBean, _kind);
+  }
+
+
+  /* (non-Javadoc)
+   * @see org.eclipse.jst.javaee.ejb.model.mergers.AccessibleBeanMerger#process()
+   */
+  @Override
+public List process() throws ModelException {
+
+    List warnings = new ArrayList();
+    warnings.addAll(super.process());
+    mergeInitMethods(warnings);
+    mergeRemoveMethods(warnings);
+    mergeSecurityRoleRefs(warnings);
+    return warnings;
+  }
+
+  private void mergeInitMethods(List warnings) throws ModelException {
+    List initXMLMappings = getBaseBean().getInitMethods();
+    List initAnnotationMappings = getToMergeBean().getInitMethods();
+    for (Object object : initAnnotationMappings) {
+      if (!containsInitMethod(initXMLMappings, (InitMethodType) object)){
+        initXMLMappings.add(EcoreUtil.copy((EObject) object));
+      }
+    }
+  }
+
+  private boolean containsInitMethod(List initXMLMappings, InitMethodType initMethod) {
+    for (Object object : initXMLMappings) {
+      InitMethodType searched = (InitMethodType) object;
+      if(initMethod.getBeanMethod().getMethodName().equals(searched.getBeanMethod().getMethodName()) &&
+          sameParams(initMethod.getBeanMethod().getMethodParams(), searched.getBeanMethod().getMethodParams())){
+
+        //CHECK for create method
+        return true;
+      }
+    }
+    return false;
+  }
+
+
+  private void mergeRemoveMethods(List warnings) throws ModelException {
+
+    List removeBaseMethods = getBaseBean().getRemoveMethods();
+    List removeToMergeMethods = getToMergeBean().getRemoveMethods();
+    if(removeToMergeMethods == null || removeToMergeMethods.isEmpty()){
+      return;
+    }
+    for (Object object : removeToMergeMethods) {
+      RemoveMethodType base = getRemoveMethodType(removeBaseMethods, (RemoveMethodType) object);
+      if(base != null){
+        if (((RemoveMethodType)object).isRetainIfException() != base.isRetainIfException()){
+          base.setRetainIfException(((RemoveMethodType)object).isRetainIfException());
+        }
+      } else {
+        getBaseBean().getRemoveMethods().add((RemoveMethodType) EcoreUtil.copy((EObject) object)); 
+      }
+    } 
+  }
+  private RemoveMethodType getRemoveMethodType(List removeBaseMethods, RemoveMethodType object) {
+    for (Object base: removeBaseMethods) {
+      RemoveMethodType tmpBase = (RemoveMethodType)base;
+      if ( tmpBase.getBeanMethod().getMethodName().equals(object.getBeanMethod().getMethodName()) 
+          && sameParams(tmpBase.getBeanMethod().getMethodParams(), object.getBeanMethod().getMethodParams())) {
+        return (RemoveMethodType) base;
+      }
+    }
+    return null;
+  }
+
+
+  private boolean sameParams(MethodParams methodParams,
+      MethodParams methodParams2) {
+    if(methodParams == null && methodParams2 == null){
+      return true;
+    }
+    if(methodParams == null || methodParams2 == null){
+      return false;
+    }
+
+    if (methodParams.getMethodParams().size() != methodParams2.getMethodParams().size()){
+      return false;
+    }
+
+    for (int i = 0; i < methodParams.getMethodParams().size(); i++) {
+      if(!methodParams.getMethodParams().get(i).equals(methodParams2.getMethodParams().get(i))){
+        return false;
+      }
+    }
+    return true;
+  }
+
+  private void mergeSecurityRoleRefs(List warnings) throws ModelException {
+    List toMergeList = getToMergeBean().getSecurityRoleRefs();
+    for (Object roleRef:toMergeList) {
+      if(!existingSecRoleRef(getBaseBean().getSecurityRoleRefs(), (SecurityRoleRef) roleRef)){
+        getBaseBean().getSecurityRoleRefs().add((SecurityRoleRef) EcoreUtil.copy((EObject) roleRef));
+      }
+
+    } 
+  }
+  
+  private boolean existingSecRoleRef(List roles, SecurityRoleRef secRole){
+    for (Object object : roles) {
+      SecurityRoleRef cRole = (SecurityRoleRef) object;
+      if (cRole.getRoleName().equals(secRole.getRoleName())){
+        return true;
+      }
+    }
+    return false;
+  }
+}
diff --git a/plugins/org.eclipse.jst.jee.ejb/ejb/org/eclipse/jst/jee/model/internal/messages.properties b/plugins/org.eclipse.jst.jee.ejb/ejb/org/eclipse/jst/jee/model/internal/messages.properties
new file mode 100644
index 0000000..8468b62
--- /dev/null
+++ b/plugins/org.eclipse.jst.jee.ejb/ejb/org/eclipse/jst/jee/model/internal/messages.properties
@@ -0,0 +1 @@
+EJBAnnotationReader.DisposeEjbAnnotationReader=Dispose ejb annotation reader
diff --git a/plugins/org.eclipse.jst.jee.ejb/plugin.properties b/plugins/org.eclipse.jst.jee.ejb/plugin.properties
new file mode 100644
index 0000000..3ac2794
--- /dev/null
+++ b/plugins/org.eclipse.jst.jee.ejb/plugin.properties
@@ -0,0 +1,16 @@
+###############################################################################
+# Copyright (c) 2005, 2007 IBM 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:
+#     IBM Corporation - initial API and implementation
+###############################################################################
+# properties file for org.eclipse.jst.jee.ejb
+Bundle-Name.0 = Java EE Ejb Plug-in
+Bundle-Vendor.0 = Eclipse Web Tools Platform
+org.eclipse.jst.jee.ejb3.nobeans.marker.type = EJB Problem
+org.eclipse.jst.jee.ejb3.validator.name = EJB 3.x Validator
+org.eclipse.jst.jee.ejb3.nobeansmessage.label = No enterprise bean in the EJB project
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.jee.ejb/plugin.xml b/plugins/org.eclipse.jst.jee.ejb/plugin.xml
new file mode 100644
index 0000000..b9c46a9
--- /dev/null
+++ b/plugins/org.eclipse.jst.jee.ejb/plugin.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.2"?>
+<plugin>
+ 	
+          
+    <!--EJB3  -->
+
+   <extension
+        point="org.eclipse.jst.j2ee.J2EEModelProvider">
+      	<provider>
+            	<modelProvider factoryClass="org.eclipse.jst.jee.model.internal.Ejb3MergedModelProviderFactory"/>
+<!--	<modelProvider factoryClass="org.eclipse.jst.jee.model.internal.Ejb3ModelProviderFactory"/>-->		
+
+      		<facet id="jst.ejb" versions="3.0,3.1,3.2"/>
+      	</provider>
+   </extension>      
+   <extension
+         id="org.eclipse.jst.jee.ejb3.validator"
+         name="%org.eclipse.jst.jee.ejb3.validator.name"
+         point="org.eclipse.wst.validation.validatorV2">
+      <validator
+            build="true"
+            class="org.eclipse.jst.jee.ejb.validation.internal.UIEJB3Validator"
+            manual="true"
+            markerId="org.eclipse.jst.jee.ejb3.nobeans">
+         <include>
+            <rules>
+               <facet
+                     id="jst.ejb"
+                     version="3.0,3.1">
+               </facet>     
+            </rules>
+         </include>
+         <messageCategory
+               id="org.eclipse.jst.jee.ejb3.nobeansmessage"
+               label="%org.eclipse.jst.jee.ejb3.nobeansmessage.label"
+               severity="warning">
+         </messageCategory>
+      </validator>
+   </extension>  
+	<extension
+            id="org.eclipse.jst.jee.ejb3.nobeans"
+            name="%org.eclipse.jst.jee.ejb3.nobeans.marker.type"
+            point="org.eclipse.core.resources.markers">
+         <super
+               type="org.eclipse.wst.validation.problemmarker">
+         </super>
+	</extension>
+  
+</plugin>
diff --git a/plugins/org.eclipse.jst.jee.ejb/pom.xml b/plugins/org.eclipse.jst.jee.ejb/pom.xml
new file mode 100644
index 0000000..0718bc4
--- /dev/null
+++ b/plugins/org.eclipse.jst.jee.ejb/pom.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Copyright (c) 2012, 2013 Eclipse Foundation and others.
+  All rights reserved. This program and the accompanying materials
+  are made available under the terms of the Eclipse Distribution License v1.0
+  which accompanies this distribution, and is available at
+  http://www.eclipse.org/org/documents/edl-v10.php
+ 
+  Contributors:
+    Thanh Ha (Eclipse Foundation) - initial implementation
+-->
+
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.eclipse.webtools.javaee</groupId>
+    <artifactId>javaee.plugins</artifactId>
+    <version>3.6.0-SNAPSHOT</version>
+  </parent>
+
+  <groupId>org.eclipse.webtools.ejb</groupId>
+  <artifactId>org.eclipse.jst.jee.ejb</artifactId>
+  <version>1.0.500-SNAPSHOT</version>
+  <packaging>eclipse-plugin</packaging>
+</project>
diff --git a/plugins/org.eclipse.jst.jee.ui/pom.xml b/plugins/org.eclipse.jst.jee.ui/pom.xml
index 71e49ba..3575fa5 100644
--- a/plugins/org.eclipse.jst.jee.ui/pom.xml
+++ b/plugins/org.eclipse.jst.jee.ui/pom.xml
@@ -15,9 +15,8 @@
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
+    <artifactId>javaee.plugins</artifactId>
     <version>3.6.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
   </parent>
 
   <groupId>org.eclipse.webtools.javaee</groupId>
diff --git a/plugins/org.eclipse.jst.jee.ui/src/org/eclipse/jst/jee/ui/internal/navigator/ConnectorLabelProvider.java b/plugins/org.eclipse.jst.jee.ui/src/org/eclipse/jst/jee/ui/internal/navigator/ConnectorLabelProvider.java
index 120dbbe..dc77fcc 100644
--- a/plugins/org.eclipse.jst.jee.ui/src/org/eclipse/jst/jee/ui/internal/navigator/ConnectorLabelProvider.java
+++ b/plugins/org.eclipse.jst.jee.ui/src/org/eclipse/jst/jee/ui/internal/navigator/ConnectorLabelProvider.java
@@ -21,11 +21,11 @@
 		} else if (element instanceof org.eclipse.jst.javaee.jca.License){

 			return Messages.ConnectorLabelProvider_LICENSE_ARTIFACT;

 		}  else if (element instanceof ConfigProperty){

-			return Messages.ConnectorLabelProvider_CONFIG_PROPERTY != null && ((ConfigProperty)element).getConfigPropertyName() != null ? ((ConfigProperty)element).getConfigPropertyName() : ""; //$NON-NLS-1$

+			return Messages.ConnectorLabelProvider_CONFIG_PROPERTY + (((ConfigProperty)element).getConfigPropertyName() != null ? ((ConfigProperty)element).getConfigPropertyName() : ""); //$NON-NLS-1$

 		}  else if (element instanceof RequiredConfigProperty){

-			return Messages.ConnectorLabelProvider_RequiredConfigProperty != null && ((RequiredConfigProperty)element).getConfigPropertyName() != null ? ((RequiredConfigProperty)element).getConfigPropertyName() : ""; //$NON-NLS-1$

+			return Messages.ConnectorLabelProvider_RequiredConfigProperty + (((RequiredConfigProperty)element).getConfigPropertyName() != null ? ((RequiredConfigProperty)element).getConfigPropertyName() : ""); //$NON-NLS-1$

 		}  else if (element instanceof ConnectionDefinition){

-			return Messages.ConnectorLabelProvider_ConnectionDefinition != null && ((ConnectionDefinition)element).getManagedconnectionfactoryClass() != null ?((ConnectionDefinition)element).getManagedconnectionfactoryClass() : ""; //$NON-NLS-1$

+			return Messages.ConnectorLabelProvider_ConnectionDefinition + (((ConnectionDefinition)element).getManagedconnectionfactoryClass() != null ?((ConnectionDefinition)element).getManagedconnectionfactoryClass() : ""); //$NON-NLS-1$

 		}

 		

 		return super.getText(element);

diff --git a/plugins/org.eclipse.jst.jee.web/pom.xml b/plugins/org.eclipse.jst.jee.web/pom.xml
index f6437d1..3af6bab 100644
--- a/plugins/org.eclipse.jst.jee.web/pom.xml
+++ b/plugins/org.eclipse.jst.jee.web/pom.xml
@@ -15,9 +15,8 @@
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
+    <artifactId>javaee.plugins</artifactId>
     <version>3.6.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
   </parent>
 
   <groupId>org.eclipse.webtools.javaee</groupId>
diff --git a/plugins/org.eclipse.jst.jee/docs/org.eclipse.jst.j2ee.doc.user/pom.xml b/plugins/org.eclipse.jst.jee/docs/org.eclipse.jst.j2ee.doc.user/pom.xml
deleted file mode 100644
index 817a153..0000000
--- a/plugins/org.eclipse.jst.jee/docs/org.eclipse.jst.j2ee.doc.user/pom.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Copyright (c) 2012, 2013 Eclipse Foundation and others.
-  All rights reserved. This program and the accompanying materials
-  are made available under the terms of the Eclipse Distribution License v1.0
-  which accompanies this distribution, and is available at
-  http://www.eclipse.org/org/documents/edl-v10.php
- 
-  Contributors:
-    Thanh Ha (Eclipse Foundation) - initial implementation
--->
-
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
-    <version>3.5.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
-  </parent>
-
-  <groupId>org.eclipse.webtools.javaee</groupId>
-  <artifactId>org.eclipse.jst.j2ee.doc.user</artifactId>
-  <version>1.1.400-SNAPSHOT</version>
-  <packaging>eclipse-plugin</packaging>
-</project>
diff --git a/plugins/org.eclipse.jst.jee/docs/org.eclipse.jst.j2ee.infopop/pom.xml b/plugins/org.eclipse.jst.jee/docs/org.eclipse.jst.j2ee.infopop/pom.xml
deleted file mode 100644
index 344039b..0000000
--- a/plugins/org.eclipse.jst.jee/docs/org.eclipse.jst.j2ee.infopop/pom.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Copyright (c) 2012, 2013 Eclipse Foundation and others.
-  All rights reserved. This program and the accompanying materials
-  are made available under the terms of the Eclipse Distribution License v1.0
-  which accompanies this distribution, and is available at
-  http://www.eclipse.org/org/documents/edl-v10.php
- 
-  Contributors:
-    Thanh Ha (Eclipse Foundation) - initial implementation
--->
-
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
-    <version>3.5.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
-  </parent>
-
-  <groupId>org.eclipse.webtools.javaee</groupId>
-  <artifactId>org.eclipse.jst.j2ee.infopop</artifactId>
-  <version>1.0.300-SNAPSHOT</version>
-  <packaging>eclipse-plugin</packaging>
-</project>
diff --git a/plugins/org.eclipse.jst.jee/docs/org.eclipse.jst.servlet.ui.infopop/pom.xml b/plugins/org.eclipse.jst.jee/docs/org.eclipse.jst.servlet.ui.infopop/pom.xml
deleted file mode 100644
index cb19593..0000000
--- a/plugins/org.eclipse.jst.jee/docs/org.eclipse.jst.servlet.ui.infopop/pom.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Copyright (c) 2012, 2013 Eclipse Foundation and others.
-  All rights reserved. This program and the accompanying materials
-  are made available under the terms of the Eclipse Distribution License v1.0
-  which accompanies this distribution, and is available at
-  http://www.eclipse.org/org/documents/edl-v10.php
- 
-  Contributors:
-    Thanh Ha (Eclipse Foundation) - initial implementation
--->
-
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
-    <version>3.5.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
-  </parent>
-
-  <groupId>org.eclipse.webtools.javaee</groupId>
-  <artifactId>org.eclipse.jst.servlet.ui.infopop</artifactId>
-  <version>1.0.500-SNAPSHOT</version>
-  <packaging>eclipse-plugin</packaging>
-</project>
diff --git a/plugins/org.eclipse.jst.jee/docs/org.eclipse.wst.web.ui.infopop/pom.xml b/plugins/org.eclipse.jst.jee/docs/org.eclipse.wst.web.ui.infopop/pom.xml
deleted file mode 100644
index 927bb1e..0000000
--- a/plugins/org.eclipse.jst.jee/docs/org.eclipse.wst.web.ui.infopop/pom.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Copyright (c) 2012, 2013 Eclipse Foundation and others.
-  All rights reserved. This program and the accompanying materials
-  are made available under the terms of the Eclipse Distribution License v1.0
-  which accompanies this distribution, and is available at
-  http://www.eclipse.org/org/documents/edl-v10.php
- 
-  Contributors:
-    Thanh Ha (Eclipse Foundation) - initial implementation
--->
-
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
-    <version>3.5.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
-  </parent>
-
-  <groupId>org.eclipse.webtools.javaee</groupId>
-  <artifactId>org.eclipse.wst.web.ui.infopop</artifactId>
-  <version>1.0.300-SNAPSHOT</version>
-  <packaging>eclipse-plugin</packaging>
-</project>
diff --git a/plugins/org.eclipse.jst.jee/features/org.eclipse.jst.doc.user.feature/pom.xml b/plugins/org.eclipse.jst.jee/features/org.eclipse.jst.doc.user.feature/pom.xml
deleted file mode 100644
index 51fb9d1..0000000
--- a/plugins/org.eclipse.jst.jee/features/org.eclipse.jst.doc.user.feature/pom.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Copyright (c) 2012, 2013 Eclipse Foundation and others.
-  All rights reserved. This program and the accompanying materials
-  are made available under the terms of the Eclipse Distribution License v1.0
-  which accompanies this distribution, and is available at
-  http://www.eclipse.org/org/documents/edl-v10.php
- 
-  Contributors:
-    Thanh Ha (Eclipse Foundation) - initial implementation
--->
-
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
-    <version>3.5.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
-  </parent>
-
-  <groupId>org.eclipse.webtools.javaee</groupId>
-  <artifactId>org.eclipse.jst.doc.user.feature</artifactId>
-  <version>1.6.0-SNAPSHOT</version>
-  <packaging>eclipse-feature</packaging>
-</project>
diff --git a/plugins/org.eclipse.jst.jee/features/org.eclipse.jst.enterprise_core.feature.patch/pom.xml b/plugins/org.eclipse.jst.jee/features/org.eclipse.jst.enterprise_core.feature.patch/pom.xml
deleted file mode 100644
index 5dbe8f2..0000000
--- a/plugins/org.eclipse.jst.jee/features/org.eclipse.jst.enterprise_core.feature.patch/pom.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Copyright (c) 2012, 2013 Eclipse Foundation and others.
-  All rights reserved. This program and the accompanying materials
-  are made available under the terms of the Eclipse Distribution License v1.0
-  which accompanies this distribution, and is available at
-  http://www.eclipse.org/org/documents/edl-v10.php
- 
-  Contributors:
-    Thanh Ha (Eclipse Foundation) - initial implementation
--->
-
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
-    <version>3.5.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
-  </parent>
-
-  <groupId>org.eclipse.webtools.javaee</groupId>
-  <artifactId>org.eclipse.jst.enterprise_core.feature.patch</artifactId>
-  <version>1.0.0-SNAPSHOT</version>
-  <packaging>eclipse-feature</packaging>
-</project>
diff --git a/plugins/org.eclipse.jst.jee/features/org.eclipse.jst.enterprise_core.feature/pom.xml b/plugins/org.eclipse.jst.jee/features/org.eclipse.jst.enterprise_core.feature/pom.xml
deleted file mode 100644
index 1a887ff..0000000
--- a/plugins/org.eclipse.jst.jee/features/org.eclipse.jst.enterprise_core.feature/pom.xml
+++ /dev/null
@@ -1,60 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Copyright (c) 2012, 2013 Eclipse Foundation and others.
-  All rights reserved. This program and the accompanying materials
-  are made available under the terms of the Eclipse Distribution License v1.0
-  which accompanies this distribution, and is available at
-  http://www.eclipse.org/org/documents/edl-v10.php
- 
-  Contributors:
-    Thanh Ha (Eclipse Foundation) - initial implementation
--->
-
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
-    <version>3.5.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
-  </parent>
-
-  <groupId>org.eclipse.webtools.javaee</groupId>
-  <artifactId>org.eclipse.jst.enterprise_core.feature</artifactId>
-  <version>3.5.0-SNAPSHOT</version>
-  <packaging>eclipse-feature</packaging>
-
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.eclipse.tycho.extras</groupId>
-        <artifactId>tycho-source-feature-plugin</artifactId>
-        <version>${tycho-extras.version}</version>
-        <executions>
-          <execution>
-            <id>source-feature</id>
-            <phase>package</phase>
-            <goals>
-              <goal>source-feature</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <groupId>org.eclipse.tycho</groupId>
-        <artifactId>tycho-p2-plugin</artifactId>
-        <version>${tycho.version}</version>
-        <executions>
-          <execution>
-            <id>attach-p2-metadata</id>
-            <phase>package</phase>
-            <goals>
-              <goal>p2-metadata</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
-</project>
diff --git a/plugins/org.eclipse.jst.jee/features/org.eclipse.jst.enterprise_sdk.feature/pom.xml b/plugins/org.eclipse.jst.jee/features/org.eclipse.jst.enterprise_sdk.feature/pom.xml
deleted file mode 100644
index b8f0fae..0000000
--- a/plugins/org.eclipse.jst.jee/features/org.eclipse.jst.enterprise_sdk.feature/pom.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Copyright (c) 2012, 2013 Eclipse Foundation and others.
-  All rights reserved. This program and the accompanying materials
-  are made available under the terms of the Eclipse Distribution License v1.0
-  which accompanies this distribution, and is available at
-  http://www.eclipse.org/org/documents/edl-v10.php
- 
-  Contributors:
-    Thanh Ha (Eclipse Foundation) - initial implementation
--->
-
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
-    <version>3.5.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
-  </parent>
-
-  <groupId>org.eclipse.webtools.javaee</groupId>
-  <artifactId>org.eclipse.jst.enterprise_sdk.feature</artifactId>
-  <version>3.5.0-SNAPSHOT</version>
-  <packaging>eclipse-feature</packaging>
-</project>
diff --git a/plugins/org.eclipse.jst.jee/features/org.eclipse.jst.enterprise_ui.feature.patch/pom.xml b/plugins/org.eclipse.jst.jee/features/org.eclipse.jst.enterprise_ui.feature.patch/pom.xml
deleted file mode 100644
index 98b84a3..0000000
--- a/plugins/org.eclipse.jst.jee/features/org.eclipse.jst.enterprise_ui.feature.patch/pom.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Copyright (c) 2012, 2013 Eclipse Foundation and others.
-  All rights reserved. This program and the accompanying materials
-  are made available under the terms of the Eclipse Distribution License v1.0
-  which accompanies this distribution, and is available at
-  http://www.eclipse.org/org/documents/edl-v10.php
- 
-  Contributors:
-    Thanh Ha (Eclipse Foundation) - initial implementation
--->
-
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
-    <version>3.5.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
-  </parent>
-
-  <groupId>org.eclipse.webtools.javaee</groupId>
-  <artifactId>org.eclipse.jst.enterprise_ui.feature.patch</artifactId>
-  <version>1.0.0-SNAPSHOT</version>
-  <packaging>eclipse-feature</packaging>
-</project>
diff --git a/plugins/org.eclipse.jst.jee/features/org.eclipse.jst.enterprise_ui.feature/pom.xml b/plugins/org.eclipse.jst.jee/features/org.eclipse.jst.enterprise_ui.feature/pom.xml
deleted file mode 100644
index 479c22a..0000000
--- a/plugins/org.eclipse.jst.jee/features/org.eclipse.jst.enterprise_ui.feature/pom.xml
+++ /dev/null
@@ -1,60 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Copyright (c) 2012, 2013 Eclipse Foundation and others.
-  All rights reserved. This program and the accompanying materials
-  are made available under the terms of the Eclipse Distribution License v1.0
-  which accompanies this distribution, and is available at
-  http://www.eclipse.org/org/documents/edl-v10.php
- 
-  Contributors:
-    Thanh Ha (Eclipse Foundation) - initial implementation
--->
-
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
-    <version>3.5.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
-  </parent>
-
-  <groupId>org.eclipse.webtools.javaee</groupId>
-  <artifactId>org.eclipse.jst.enterprise_ui.feature</artifactId>
-  <version>3.5.0-SNAPSHOT</version>
-  <packaging>eclipse-feature</packaging>
-
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.eclipse.tycho.extras</groupId>
-        <artifactId>tycho-source-feature-plugin</artifactId>
-        <version>${tycho-extras.version}</version>
-        <executions>
-          <execution>
-            <id>source-feature</id>
-            <phase>package</phase>
-            <goals>
-              <goal>source-feature</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <groupId>org.eclipse.tycho</groupId>
-        <artifactId>tycho-p2-plugin</artifactId>
-        <version>${tycho.version}</version>
-        <executions>
-          <execution>
-            <id>attach-p2-metadata</id>
-            <phase>package</phase>
-            <goals>
-              <goal>p2-metadata</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
-</project>
diff --git a/plugins/org.eclipse.jst.jee/features/org.eclipse.jst.enterprise_userdoc.feature/pom.xml b/plugins/org.eclipse.jst.jee/features/org.eclipse.jst.enterprise_userdoc.feature/pom.xml
deleted file mode 100644
index b41482c..0000000
--- a/plugins/org.eclipse.jst.jee/features/org.eclipse.jst.enterprise_userdoc.feature/pom.xml
+++ /dev/null
@@ -1,60 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Copyright (c) 2012, 2013 Eclipse Foundation and others.
-  All rights reserved. This program and the accompanying materials
-  are made available under the terms of the Eclipse Distribution License v1.0
-  which accompanies this distribution, and is available at
-  http://www.eclipse.org/org/documents/edl-v10.php
- 
-  Contributors:
-    Thanh Ha (Eclipse Foundation) - initial implementation
--->
-
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
-    <version>3.5.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
-  </parent>
-
-  <groupId>org.eclipse.webtools.javaee</groupId>
-  <artifactId>org.eclipse.jst.enterprise_userdoc.feature</artifactId>
-  <version>3.3.100-SNAPSHOT</version>
-  <packaging>eclipse-feature</packaging>
-
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.eclipse.tycho.extras</groupId>
-        <artifactId>tycho-source-feature-plugin</artifactId>
-        <version>${tycho-extras.version}</version>
-        <executions>
-          <execution>
-            <id>source-feature</id>
-            <phase>package</phase>
-            <goals>
-              <goal>source-feature</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <groupId>org.eclipse.tycho</groupId>
-        <artifactId>tycho-p2-plugin</artifactId>
-        <version>${tycho.version}</version>
-        <executions>
-          <execution>
-            <id>attach-p2-metadata</id>
-            <phase>package</phase>
-            <goals>
-              <goal>p2-metadata</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
-</project>
diff --git a/plugins/org.eclipse.jst.jee/features/org.eclipse.jst.servlet.ui.patch/pom.xml b/plugins/org.eclipse.jst.jee/features/org.eclipse.jst.servlet.ui.patch/pom.xml
deleted file mode 100644
index 4bd0c38..0000000
--- a/plugins/org.eclipse.jst.jee/features/org.eclipse.jst.servlet.ui.patch/pom.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Copyright (c) 2012, 2013 Eclipse Foundation and others.
-  All rights reserved. This program and the accompanying materials
-  are made available under the terms of the Eclipse Distribution License v1.0
-  which accompanies this distribution, and is available at
-  http://www.eclipse.org/org/documents/edl-v10.php
- 
-  Contributors:
-    Thanh Ha (Eclipse Foundation) - initial implementation
--->
-
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
-    <version>3.5.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
-  </parent>
-
-  <groupId>org.eclipse.webtools.javaee</groupId>
-  <artifactId>org.eclipse.jst.servlet.ui.patch</artifactId>
-  <version>1.0.0-SNAPSHOT</version>
-  <packaging>eclipse-feature</packaging>
-</project>
diff --git a/plugins/org.eclipse.jst.jee/features/org.eclipse.jst.web_core.feature/pom.xml b/plugins/org.eclipse.jst.jee/features/org.eclipse.jst.web_core.feature/pom.xml
deleted file mode 100644
index 776ea4e..0000000
--- a/plugins/org.eclipse.jst.jee/features/org.eclipse.jst.web_core.feature/pom.xml
+++ /dev/null
@@ -1,60 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Copyright (c) 2012, 2013 Eclipse Foundation and others.
-  All rights reserved. This program and the accompanying materials
-  are made available under the terms of the Eclipse Distribution License v1.0
-  which accompanies this distribution, and is available at
-  http://www.eclipse.org/org/documents/edl-v10.php
- 
-  Contributors:
-    Thanh Ha (Eclipse Foundation) - initial implementation
--->
-
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
-    <version>3.5.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
-  </parent>
-
-  <groupId>org.eclipse.webtools.javaee</groupId>
-  <artifactId>org.eclipse.jst.web_core.feature</artifactId>
-  <version>3.5.0-SNAPSHOT</version>
-  <packaging>eclipse-feature</packaging>
-
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.eclipse.tycho.extras</groupId>
-        <artifactId>tycho-source-feature-plugin</artifactId>
-        <version>${tycho-extras.version}</version>
-        <executions>
-          <execution>
-            <id>source-feature</id>
-            <phase>package</phase>
-            <goals>
-              <goal>source-feature</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <groupId>org.eclipse.tycho</groupId>
-        <artifactId>tycho-p2-plugin</artifactId>
-        <version>${tycho.version}</version>
-        <executions>
-          <execution>
-            <id>attach-p2-metadata</id>
-            <phase>package</phase>
-            <goals>
-              <goal>p2-metadata</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
-</project>
diff --git a/plugins/org.eclipse.jst.jee/features/org.eclipse.jst.web_sdk.feature/pom.xml b/plugins/org.eclipse.jst.jee/features/org.eclipse.jst.web_sdk.feature/pom.xml
deleted file mode 100644
index 6f49610..0000000
--- a/plugins/org.eclipse.jst.jee/features/org.eclipse.jst.web_sdk.feature/pom.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Copyright (c) 2012, 2013 Eclipse Foundation and others.
-  All rights reserved. This program and the accompanying materials
-  are made available under the terms of the Eclipse Distribution License v1.0
-  which accompanies this distribution, and is available at
-  http://www.eclipse.org/org/documents/edl-v10.php
- 
-  Contributors:
-    Thanh Ha (Eclipse Foundation) - initial implementation
--->
-
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
-    <version>3.5.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
-  </parent>
-
-  <groupId>org.eclipse.webtools.javaee</groupId>
-  <artifactId>org.eclipse.jst.web_sdk.feature</artifactId>
-  <version>3.5.0-SNAPSHOT</version>
-  <packaging>eclipse-feature</packaging>
-</project>
diff --git a/plugins/org.eclipse.jst.jee/features/org.eclipse.jst.web_ui.feature.patch/pom.xml b/plugins/org.eclipse.jst.jee/features/org.eclipse.jst.web_ui.feature.patch/pom.xml
deleted file mode 100644
index 87ccb30..0000000
--- a/plugins/org.eclipse.jst.jee/features/org.eclipse.jst.web_ui.feature.patch/pom.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Copyright (c) 2012, 2013 Eclipse Foundation and others.
-  All rights reserved. This program and the accompanying materials
-  are made available under the terms of the Eclipse Distribution License v1.0
-  which accompanies this distribution, and is available at
-  http://www.eclipse.org/org/documents/edl-v10.php
- 
-  Contributors:
-    Thanh Ha (Eclipse Foundation) - initial implementation
--->
-
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
-    <version>3.5.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
-  </parent>
-
-  <groupId>org.eclipse.webtools.javaee</groupId>
-  <artifactId>org.eclipse.jst.web_ui.feature.patch</artifactId>
-  <version>1.5.5-SNAPSHOT</version>
-  <packaging>eclipse-feature</packaging>
-</project>
diff --git a/plugins/org.eclipse.jst.jee/features/org.eclipse.jst.web_ui.feature/pom.xml b/plugins/org.eclipse.jst.jee/features/org.eclipse.jst.web_ui.feature/pom.xml
deleted file mode 100644
index f11aa82..0000000
--- a/plugins/org.eclipse.jst.jee/features/org.eclipse.jst.web_ui.feature/pom.xml
+++ /dev/null
@@ -1,60 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Copyright (c) 2012, 2013 Eclipse Foundation and others.
-  All rights reserved. This program and the accompanying materials
-  are made available under the terms of the Eclipse Distribution License v1.0
-  which accompanies this distribution, and is available at
-  http://www.eclipse.org/org/documents/edl-v10.php
- 
-  Contributors:
-    Thanh Ha (Eclipse Foundation) - initial implementation
--->
-
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
-    <version>3.5.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
-  </parent>
-
-  <groupId>org.eclipse.webtools.javaee</groupId>
-  <artifactId>org.eclipse.jst.web_ui.feature</artifactId>
-  <version>3.5.0-SNAPSHOT</version>
-  <packaging>eclipse-feature</packaging>
-
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.eclipse.tycho.extras</groupId>
-        <artifactId>tycho-source-feature-plugin</artifactId>
-        <version>${tycho-extras.version}</version>
-        <executions>
-          <execution>
-            <id>source-feature</id>
-            <phase>package</phase>
-            <goals>
-              <goal>source-feature</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <groupId>org.eclipse.tycho</groupId>
-        <artifactId>tycho-p2-plugin</artifactId>
-        <version>${tycho.version}</version>
-        <executions>
-          <execution>
-            <id>attach-p2-metadata</id>
-            <phase>package</phase>
-            <goals>
-              <goal>p2-metadata</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
-</project>
diff --git a/plugins/org.eclipse.jst.jee/features/org.eclipse.jst.web_userdoc.feature/pom.xml b/plugins/org.eclipse.jst.jee/features/org.eclipse.jst.web_userdoc.feature/pom.xml
deleted file mode 100644
index f2ed058..0000000
--- a/plugins/org.eclipse.jst.jee/features/org.eclipse.jst.web_userdoc.feature/pom.xml
+++ /dev/null
@@ -1,60 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Copyright (c) 2012, 2013 Eclipse Foundation and others.
-  All rights reserved. This program and the accompanying materials
-  are made available under the terms of the Eclipse Distribution License v1.0
-  which accompanies this distribution, and is available at
-  http://www.eclipse.org/org/documents/edl-v10.php
- 
-  Contributors:
-    Thanh Ha (Eclipse Foundation) - initial implementation
--->
-
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
-    <version>3.5.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
-  </parent>
-
-  <groupId>org.eclipse.webtools.javaee</groupId>
-  <artifactId>org.eclipse.jst.web_userdoc.feature</artifactId>
-  <version>3.5.0-SNAPSHOT</version>
-  <packaging>eclipse-feature</packaging>
-
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.eclipse.tycho.extras</groupId>
-        <artifactId>tycho-source-feature-plugin</artifactId>
-        <version>${tycho-extras.version}</version>
-        <executions>
-          <execution>
-            <id>source-feature</id>
-            <phase>package</phase>
-            <goals>
-              <goal>source-feature</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <groupId>org.eclipse.tycho</groupId>
-        <artifactId>tycho-p2-plugin</artifactId>
-        <version>${tycho.version}</version>
-        <executions>
-          <execution>
-            <id>attach-p2-metadata</id>
-            <phase>package</phase>
-            <goals>
-              <goal>p2-metadata</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
-</project>
diff --git a/plugins/org.eclipse.jst.jee/jeecreation/org/eclipse/jst/jee/model/internal/JEE5ModelProvider.java b/plugins/org.eclipse.jst.jee/jeecreation/org/eclipse/jst/jee/model/internal/JEE5ModelProvider.java
index 574d0ae..b83cc0a 100644
--- a/plugins/org.eclipse.jst.jee/jeecreation/org/eclipse/jst/jee/model/internal/JEE5ModelProvider.java
+++ b/plugins/org.eclipse.jst.jee/jeecreation/org/eclipse/jst/jee/model/internal/JEE5ModelProvider.java
@@ -126,7 +126,7 @@
 			notifyListeners(evt);
 		}
 	}
-	private void addManagedResource(XMLResourceImpl res) {
+	private synchronized void addManagedResource(XMLResourceImpl res) {
 		if (res == null || modelResources.contains(res)) {
 			return;
 		}
@@ -399,10 +399,10 @@
 	/**
 	 * Remove reference to the aResource.
 	 */
-	protected boolean removeResource(Resource aResource) {
+	protected synchronized boolean removeResource(Resource aResource) {
 		if (aResource != null) {
 			aResource.eAdapters().remove(resourceAdapter);
-			return getResources().remove(aResource);
+			return modelResources.remove(aResource);
 		}
 		return false;
 	}
@@ -524,8 +524,8 @@
 		return null;
 	}
 
-	public List getResources() {
-		return modelResources;
+	public synchronized List getResources() {
+		return new ArrayList(modelResources);
 	}
 
 
@@ -538,4 +538,4 @@
 			}
 			return false;
 	}
-}
\ No newline at end of file
+}
diff --git a/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jem.beaninfo.vm.common/pom.xml b/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jem.beaninfo.vm.common/pom.xml
deleted file mode 100644
index 3ff9f33..0000000
--- a/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jem.beaninfo.vm.common/pom.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Copyright (c) 2012, 2013 Eclipse Foundation and others.
-  All rights reserved. This program and the accompanying materials
-  are made available under the terms of the Eclipse Distribution License v1.0
-  which accompanies this distribution, and is available at
-  http://www.eclipse.org/org/documents/edl-v10.php
- 
-  Contributors:
-    Thanh Ha (Eclipse Foundation) - initial implementation
--->
-
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
-    <version>3.5.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
-  </parent>
-
-  <groupId>org.eclipse.webtools.javaee</groupId>
-  <artifactId>org.eclipse.jem.beaninfo.vm.common</artifactId>
-  <version>2.0.300-SNAPSHOT</version>
-  <packaging>eclipse-plugin</packaging>
-</project>
diff --git a/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jem.beaninfo.vm/pom.xml b/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jem.beaninfo.vm/pom.xml
deleted file mode 100644
index dd149c2..0000000
--- a/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jem.beaninfo.vm/pom.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Copyright (c) 2012, 2013 Eclipse Foundation and others.
-  All rights reserved. This program and the accompanying materials
-  are made available under the terms of the Eclipse Distribution License v1.0
-  which accompanies this distribution, and is available at
-  http://www.eclipse.org/org/documents/edl-v10.php
- 
-  Contributors:
-    Thanh Ha (Eclipse Foundation) - initial implementation
--->
-
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
-    <version>3.5.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
-  </parent>
-
-  <groupId>org.eclipse.webtools.javaee</groupId>
-  <artifactId>org.eclipse.jem.beaninfo.vm</artifactId>
-  <version>2.0.300-SNAPSHOT</version>
-  <packaging>eclipse-plugin</packaging>
-</project>
diff --git a/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jem.beaninfo/pom.xml b/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jem.beaninfo/pom.xml
deleted file mode 100644
index 236d421..0000000
--- a/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jem.beaninfo/pom.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Copyright (c) 2012, 2013 Eclipse Foundation and others.
-  All rights reserved. This program and the accompanying materials
-  are made available under the terms of the Eclipse Distribution License v1.0
-  which accompanies this distribution, and is available at
-  http://www.eclipse.org/org/documents/edl-v10.php
- 
-  Contributors:
-    Thanh Ha (Eclipse Foundation) - initial implementation
--->
-
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
-    <version>3.5.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
-  </parent>
-
-  <groupId>org.eclipse.webtools.javaee</groupId>
-  <artifactId>org.eclipse.jem.beaninfo</artifactId>
-  <version>2.0.300-SNAPSHOT</version>
-  <packaging>eclipse-plugin</packaging>
-</project>
diff --git a/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jem.proxy/pom.xml b/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jem.proxy/pom.xml
deleted file mode 100644
index 64e9d60..0000000
--- a/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jem.proxy/pom.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Copyright (c) 2012, 2013 Eclipse Foundation and others.
-  All rights reserved. This program and the accompanying materials
-  are made available under the terms of the Eclipse Distribution License v1.0
-  which accompanies this distribution, and is available at
-  http://www.eclipse.org/org/documents/edl-v10.php
- 
-  Contributors:
-    Thanh Ha (Eclipse Foundation) - initial implementation
--->
-
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
-    <version>3.5.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
-  </parent>
-
-  <groupId>org.eclipse.webtools.javaee</groupId>
-  <artifactId>org.eclipse.jem.proxy</artifactId>
-  <version>2.0.400-SNAPSHOT</version>
-  <packaging>eclipse-plugin</packaging>
-</project>
diff --git a/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jem.workbench/pom.xml b/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jem.workbench/pom.xml
deleted file mode 100644
index 325b3ea..0000000
--- a/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jem.workbench/pom.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Copyright (c) 2012, 2013 Eclipse Foundation and others.
-  All rights reserved. This program and the accompanying materials
-  are made available under the terms of the Eclipse Distribution License v1.0
-  which accompanies this distribution, and is available at
-  http://www.eclipse.org/org/documents/edl-v10.php
- 
-  Contributors:
-    Thanh Ha (Eclipse Foundation) - initial implementation
--->
-
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
-    <version>3.5.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
-  </parent>
-
-  <groupId>org.eclipse.webtools.javaee</groupId>
-  <artifactId>org.eclipse.jem.workbench</artifactId>
-  <version>2.0.400-SNAPSHOT</version>
-  <packaging>eclipse-plugin</packaging>
-</project>
diff --git a/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jem/pom.xml b/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jem/pom.xml
deleted file mode 100644
index 7c03d60..0000000
--- a/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jem/pom.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Copyright (c) 2012, 2013 Eclipse Foundation and others.
-  All rights reserved. This program and the accompanying materials
-  are made available under the terms of the Eclipse Distribution License v1.0
-  which accompanies this distribution, and is available at
-  http://www.eclipse.org/org/documents/edl-v10.php
- 
-  Contributors:
-    Thanh Ha (Eclipse Foundation) - initial implementation
--->
-
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
-    <version>3.5.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
-  </parent>
-
-  <groupId>org.eclipse.webtools.javaee</groupId>
-  <artifactId>org.eclipse.jem</artifactId>
-  <version>2.0.600-SNAPSHOT</version>
-  <packaging>eclipse-plugin</packaging>
-</project>
diff --git a/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jst.common.annotations.controller/pom.xml b/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jst.common.annotations.controller/pom.xml
deleted file mode 100644
index 6447c64..0000000
--- a/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jst.common.annotations.controller/pom.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Copyright (c) 2012, 2013 Eclipse Foundation and others.
-  All rights reserved. This program and the accompanying materials
-  are made available under the terms of the Eclipse Distribution License v1.0
-  which accompanies this distribution, and is available at
-  http://www.eclipse.org/org/documents/edl-v10.php
- 
-  Contributors:
-    Thanh Ha (Eclipse Foundation) - initial implementation
--->
-
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
-    <version>3.5.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
-  </parent>
-
-  <groupId>org.eclipse.webtools.javaee</groupId>
-  <artifactId>org.eclipse.jst.common.annotations.controller</artifactId>
-  <version>1.1.300-SNAPSHOT</version>
-  <packaging>eclipse-plugin</packaging>
-</project>
diff --git a/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jst.common.annotations.core/pom.xml b/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jst.common.annotations.core/pom.xml
deleted file mode 100644
index 587e973..0000000
--- a/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jst.common.annotations.core/pom.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Copyright (c) 2012, 2013 Eclipse Foundation and others.
-  All rights reserved. This program and the accompanying materials
-  are made available under the terms of the Eclipse Distribution License v1.0
-  which accompanies this distribution, and is available at
-  http://www.eclipse.org/org/documents/edl-v10.php
- 
-  Contributors:
-    Thanh Ha (Eclipse Foundation) - initial implementation
--->
-
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
-    <version>3.5.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
-  </parent>
-
-  <groupId>org.eclipse.webtools.javaee</groupId>
-  <artifactId>org.eclipse.jst.common.annotations.core</artifactId>
-  <version>1.1.300-SNAPSHOT</version>
-  <packaging>eclipse-plugin</packaging>
-</project>
diff --git a/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jst.common.annotations.ui/pom.xml b/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jst.common.annotations.ui/pom.xml
deleted file mode 100644
index bc0932e..0000000
--- a/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jst.common.annotations.ui/pom.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Copyright (c) 2012, 2013 Eclipse Foundation and others.
-  All rights reserved. This program and the accompanying materials
-  are made available under the terms of the Eclipse Distribution License v1.0
-  which accompanies this distribution, and is available at
-  http://www.eclipse.org/org/documents/edl-v10.php
- 
-  Contributors:
-    Thanh Ha (Eclipse Foundation) - initial implementation
--->
-
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
-    <version>3.5.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
-  </parent>
-
-  <groupId>org.eclipse.webtools.javaee</groupId>
-  <artifactId>org.eclipse.jst.common.annotations.ui</artifactId>
-  <version>1.1.300-SNAPSHOT</version>
-  <packaging>eclipse-plugin</packaging>
-</project>
diff --git a/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jst.common.frameworks/pom.xml b/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jst.common.frameworks/pom.xml
deleted file mode 100644
index 802bf93..0000000
--- a/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jst.common.frameworks/pom.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Copyright (c) 2012, 2013 Eclipse Foundation and others.
-  All rights reserved. This program and the accompanying materials
-  are made available under the terms of the Eclipse Distribution License v1.0
-  which accompanies this distribution, and is available at
-  http://www.eclipse.org/org/documents/edl-v10.php
- 
-  Contributors:
-    Thanh Ha (Eclipse Foundation) - initial implementation
--->
-
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
-    <version>3.5.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
-  </parent>
-
-  <groupId>org.eclipse.webtools.javaee</groupId>
-  <artifactId>org.eclipse.jst.common.frameworks</artifactId>
-  <version>1.1.601-SNAPSHOT</version>
-  <packaging>eclipse-plugin</packaging>
-</project>
diff --git a/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jst.j2ee.core/pom.xml b/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jst.j2ee.core/pom.xml
deleted file mode 100644
index 45e419f..0000000
--- a/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jst.j2ee.core/pom.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Copyright (c) 2012, 2013 Eclipse Foundation and others.
-  All rights reserved. This program and the accompanying materials
-  are made available under the terms of the Eclipse Distribution License v1.0
-  which accompanies this distribution, and is available at
-  http://www.eclipse.org/org/documents/edl-v10.php
- 
-  Contributors:
-    Thanh Ha (Eclipse Foundation) - initial implementation
--->
-
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
-    <version>3.5.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
-  </parent>
-
-  <groupId>org.eclipse.webtools.javaee</groupId>
-  <artifactId>org.eclipse.jst.j2ee.core</artifactId>
-  <version>1.3.0-SNAPSHOT</version>
-  <packaging>eclipse-plugin</packaging>
-</project>
diff --git a/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jst.j2ee.jca.ui/pom.xml b/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jst.j2ee.jca.ui/pom.xml
deleted file mode 100644
index a9c93f3..0000000
--- a/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jst.j2ee.jca.ui/pom.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Copyright (c) 2012, 2013 Eclipse Foundation and others.
-  All rights reserved. This program and the accompanying materials
-  are made available under the terms of the Eclipse Distribution License v1.0
-  which accompanies this distribution, and is available at
-  http://www.eclipse.org/org/documents/edl-v10.php
- 
-  Contributors:
-    Thanh Ha (Eclipse Foundation) - initial implementation
--->
-
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
-    <version>3.5.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
-  </parent>
-
-  <groupId>org.eclipse.webtools.javaee</groupId>
-  <artifactId>org.eclipse.jst.j2ee.jca.ui</artifactId>
-  <version>1.1.500-SNAPSHOT</version>
-  <packaging>eclipse-plugin</packaging>
-</project>
diff --git a/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jst.j2ee.jca/pom.xml b/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jst.j2ee.jca/pom.xml
deleted file mode 100644
index c83229c..0000000
--- a/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jst.j2ee.jca/pom.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Copyright (c) 2012, 2013 Eclipse Foundation and others.
-  All rights reserved. This program and the accompanying materials
-  are made available under the terms of the Eclipse Distribution License v1.0
-  which accompanies this distribution, and is available at
-  http://www.eclipse.org/org/documents/edl-v10.php
- 
-  Contributors:
-    Thanh Ha (Eclipse Foundation) - initial implementation
--->
-
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
-    <version>3.5.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
-  </parent>
-
-  <groupId>org.eclipse.webtools.javaee</groupId>
-  <artifactId>org.eclipse.jst.j2ee.jca</artifactId>
-  <version>1.1.700-SNAPSHOT</version>
-  <packaging>eclipse-plugin</packaging>
-</project>
diff --git a/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jst.j2ee.navigator.ui/pom.xml b/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jst.j2ee.navigator.ui/pom.xml
deleted file mode 100644
index 60346f8..0000000
--- a/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jst.j2ee.navigator.ui/pom.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Copyright (c) 2012, 2013 Eclipse Foundation and others.
-  All rights reserved. This program and the accompanying materials
-  are made available under the terms of the Eclipse Distribution License v1.0
-  which accompanies this distribution, and is available at
-  http://www.eclipse.org/org/documents/edl-v10.php
- 
-  Contributors:
-    Thanh Ha (Eclipse Foundation) - initial implementation
--->
-
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
-    <version>3.5.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
-  </parent>
-
-  <groupId>org.eclipse.webtools.javaee</groupId>
-  <artifactId>org.eclipse.jst.j2ee.navigator.ui</artifactId>
-  <version>1.1.600-SNAPSHOT</version>
-  <packaging>eclipse-plugin</packaging>
-</project>
diff --git a/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jst.j2ee.ui/pom.xml b/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jst.j2ee.ui/pom.xml
deleted file mode 100644
index 9f3264b..0000000
--- a/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jst.j2ee.ui/pom.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Copyright (c) 2012, 2013 Eclipse Foundation and others.
-  All rights reserved. This program and the accompanying materials
-  are made available under the terms of the Eclipse Distribution License v1.0
-  which accompanies this distribution, and is available at
-  http://www.eclipse.org/org/documents/edl-v10.php
- 
-  Contributors:
-    Thanh Ha (Eclipse Foundation) - initial implementation
--->
-
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
-    <version>3.5.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
-  </parent>
-
-  <groupId>org.eclipse.webtools.javaee</groupId>
-  <artifactId>org.eclipse.jst.j2ee.ui</artifactId>
-  <version>1.1.700-SNAPSHOT</version>
-  <packaging>eclipse-plugin</packaging>
-</project>
diff --git a/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jst.j2ee.web/pom.xml b/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jst.j2ee.web/pom.xml
deleted file mode 100644
index 4ee9935..0000000
--- a/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jst.j2ee.web/pom.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Copyright (c) 2012, 2013 Eclipse Foundation and others.
-  All rights reserved. This program and the accompanying materials
-  are made available under the terms of the Eclipse Distribution License v1.0
-  which accompanies this distribution, and is available at
-  http://www.eclipse.org/org/documents/edl-v10.php
- 
-  Contributors:
-    Thanh Ha (Eclipse Foundation) - initial implementation
--->
-
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
-    <version>3.5.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
-  </parent>
-
-  <groupId>org.eclipse.webtools.javaee</groupId>
-  <artifactId>org.eclipse.jst.j2ee.web</artifactId>
-  <version>1.1.700-SNAPSHOT</version>
-  <packaging>eclipse-plugin</packaging>
-</project>
diff --git a/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jst.j2ee.webservice.ui/pom.xml b/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jst.j2ee.webservice.ui/pom.xml
deleted file mode 100644
index cd049dd..0000000
--- a/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jst.j2ee.webservice.ui/pom.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Copyright (c) 2012, 2013 Eclipse Foundation and others.
-  All rights reserved. This program and the accompanying materials
-  are made available under the terms of the Eclipse Distribution License v1.0
-  which accompanies this distribution, and is available at
-  http://www.eclipse.org/org/documents/edl-v10.php
- 
-  Contributors:
-    Thanh Ha (Eclipse Foundation) - initial implementation
--->
-
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
-    <version>3.5.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
-  </parent>
-
-  <groupId>org.eclipse.webtools.javaee</groupId>
-  <artifactId>org.eclipse.jst.j2ee.webservice.ui</artifactId>
-  <version>1.1.500-SNAPSHOT</version>
-  <packaging>eclipse-plugin</packaging>
-</project>
diff --git a/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jst.j2ee.webservice/pom.xml b/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jst.j2ee.webservice/pom.xml
deleted file mode 100644
index 798d5ba..0000000
--- a/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jst.j2ee.webservice/pom.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Copyright (c) 2012, 2013 Eclipse Foundation and others.
-  All rights reserved. This program and the accompanying materials
-  are made available under the terms of the Eclipse Distribution License v1.0
-  which accompanies this distribution, and is available at
-  http://www.eclipse.org/org/documents/edl-v10.php
- 
-  Contributors:
-    Thanh Ha (Eclipse Foundation) - initial implementation
--->
-
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
-    <version>3.5.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
-  </parent>
-
-  <groupId>org.eclipse.webtools.javaee</groupId>
-  <artifactId>org.eclipse.jst.j2ee.webservice</artifactId>
-  <version>1.1.400-SNAPSHOT</version>
-  <packaging>eclipse-plugin</packaging>
-</project>
diff --git a/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jst.j2ee/pom.xml b/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jst.j2ee/pom.xml
deleted file mode 100644
index cb69620..0000000
--- a/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jst.j2ee/pom.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Copyright (c) 2012, 2013 Eclipse Foundation and others.
-  All rights reserved. This program and the accompanying materials
-  are made available under the terms of the Eclipse Distribution License v1.0
-  which accompanies this distribution, and is available at
-  http://www.eclipse.org/org/documents/edl-v10.php
- 
-  Contributors:
-    Thanh Ha (Eclipse Foundation) - initial implementation
--->
-
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
-    <version>3.5.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
-  </parent>
-
-  <groupId>org.eclipse.webtools.javaee</groupId>
-  <artifactId>org.eclipse.jst.j2ee</artifactId>
-  <version>1.1.700-SNAPSHOT</version>
-  <packaging>eclipse-plugin</packaging>
-</project>
diff --git a/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jst.jee.ui/pom.xml b/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jst.jee.ui/pom.xml
deleted file mode 100644
index ca65d1a..0000000
--- a/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jst.jee.ui/pom.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Copyright (c) 2012, 2013 Eclipse Foundation and others.
-  All rights reserved. This program and the accompanying materials
-  are made available under the terms of the Eclipse Distribution License v1.0
-  which accompanies this distribution, and is available at
-  http://www.eclipse.org/org/documents/edl-v10.php
- 
-  Contributors:
-    Thanh Ha (Eclipse Foundation) - initial implementation
--->
-
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
-    <version>3.5.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
-  </parent>
-
-  <groupId>org.eclipse.webtools.javaee</groupId>
-  <artifactId>org.eclipse.jst.jee.ui</artifactId>
-  <version>1.0.600-SNAPSHOT</version>
-  <packaging>eclipse-plugin</packaging>
-</project>
diff --git a/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jst.jee.web/pom.xml b/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jst.jee.web/pom.xml
deleted file mode 100644
index c782c1a..0000000
--- a/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jst.jee.web/pom.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Copyright (c) 2012, 2013 Eclipse Foundation and others.
-  All rights reserved. This program and the accompanying materials
-  are made available under the terms of the Eclipse Distribution License v1.0
-  which accompanies this distribution, and is available at
-  http://www.eclipse.org/org/documents/edl-v10.php
- 
-  Contributors:
-    Thanh Ha (Eclipse Foundation) - initial implementation
--->
-
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
-    <version>3.5.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
-  </parent>
-
-  <groupId>org.eclipse.webtools.javaee</groupId>
-  <artifactId>org.eclipse.jst.jee.web</artifactId>
-  <version>1.0.400-SNAPSHOT</version>
-  <packaging>eclipse-plugin</packaging>
-</project>
diff --git a/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jst.jee/pom.xml b/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jst.jee/pom.xml
deleted file mode 100644
index 0e01921..0000000
--- a/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jst.jee/pom.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Copyright (c) 2012, 2013 Eclipse Foundation and others.
-  All rights reserved. This program and the accompanying materials
-  are made available under the terms of the Eclipse Distribution License v1.0
-  which accompanies this distribution, and is available at
-  http://www.eclipse.org/org/documents/edl-v10.php
- 
-  Contributors:
-    Thanh Ha (Eclipse Foundation) - initial implementation
--->
-
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
-    <version>3.5.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
-  </parent>
-
-  <groupId>org.eclipse.webtools.javaee</groupId>
-  <artifactId>org.eclipse.jst.jee</artifactId>
-  <version>1.0.600-SNAPSHOT</version>
-  <packaging>eclipse-plugin</packaging>
-</project>
diff --git a/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jst.servlet.ui/pom.xml b/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jst.servlet.ui/pom.xml
deleted file mode 100644
index cf93895..0000000
--- a/plugins/org.eclipse.jst.jee/plugins/org.eclipse.jst.servlet.ui/pom.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Copyright (c) 2012, 2013 Eclipse Foundation and others.
-  All rights reserved. This program and the accompanying materials
-  are made available under the terms of the Eclipse Distribution License v1.0
-  which accompanies this distribution, and is available at
-  http://www.eclipse.org/org/documents/edl-v10.php
- 
-  Contributors:
-    Thanh Ha (Eclipse Foundation) - initial implementation
--->
-
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
-    <version>3.5.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
-  </parent>
-
-  <groupId>org.eclipse.webtools.javaee</groupId>
-  <artifactId>org.eclipse.jst.servlet.ui</artifactId>
-  <version>1.1.700-SNAPSHOT</version>
-  <packaging>eclipse-plugin</packaging>
-</project>
diff --git a/plugins/org.eclipse.jst.jee/plugins/org.eclipse.wst.web.ui/pom.xml b/plugins/org.eclipse.jst.jee/plugins/org.eclipse.wst.web.ui/pom.xml
deleted file mode 100644
index 2959c09..0000000
--- a/plugins/org.eclipse.jst.jee/plugins/org.eclipse.wst.web.ui/pom.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Copyright (c) 2012, 2013 Eclipse Foundation and others.
-  All rights reserved. This program and the accompanying materials
-  are made available under the terms of the Eclipse Distribution License v1.0
-  which accompanies this distribution, and is available at
-  http://www.eclipse.org/org/documents/edl-v10.php
- 
-  Contributors:
-    Thanh Ha (Eclipse Foundation) - initial implementation
--->
-
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
-    <version>3.5.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
-  </parent>
-
-  <groupId>org.eclipse.webtools.javaee</groupId>
-  <artifactId>org.eclipse.wst.web.ui</artifactId>
-  <version>1.1.600-SNAPSHOT</version>
-  <packaging>eclipse-plugin</packaging>
-</project>
diff --git a/plugins/org.eclipse.jst.jee/plugins/org.eclipse.wst.web/pom.xml b/plugins/org.eclipse.jst.jee/plugins/org.eclipse.wst.web/pom.xml
deleted file mode 100644
index a730a80..0000000
--- a/plugins/org.eclipse.jst.jee/plugins/org.eclipse.wst.web/pom.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Copyright (c) 2012, 2013 Eclipse Foundation and others.
-  All rights reserved. This program and the accompanying materials
-  are made available under the terms of the Eclipse Distribution License v1.0
-  which accompanies this distribution, and is available at
-  http://www.eclipse.org/org/documents/edl-v10.php
- 
-  Contributors:
-    Thanh Ha (Eclipse Foundation) - initial implementation
--->
-
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
-    <version>3.5.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
-  </parent>
-
-  <groupId>org.eclipse.webtools.javaee</groupId>
-  <artifactId>org.eclipse.wst.web</artifactId>
-  <version>1.1.700-SNAPSHOT</version>
-  <packaging>eclipse-plugin</packaging>
-</project>
diff --git a/plugins/org.eclipse.jst.jee/plugins/org.eclipse.wtp.jee.capabilities/pom.xml b/plugins/org.eclipse.jst.jee/plugins/org.eclipse.wtp.jee.capabilities/pom.xml
deleted file mode 100644
index 2bb71ce..0000000
--- a/plugins/org.eclipse.jst.jee/plugins/org.eclipse.wtp.jee.capabilities/pom.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Copyright (c) 2012, 2013 Eclipse Foundation and others.
-  All rights reserved. This program and the accompanying materials
-  are made available under the terms of the Eclipse Distribution License v1.0
-  which accompanies this distribution, and is available at
-  http://www.eclipse.org/org/documents/edl-v10.php
- 
-  Contributors:
-    Thanh Ha (Eclipse Foundation) - initial implementation
--->
-
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
-    <version>3.5.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
-  </parent>
-
-  <groupId>org.eclipse.webtools.javaee</groupId>
-  <artifactId>org.eclipse.wtp.jee.capabilities</artifactId>
-  <version>1.0.100-SNAPSHOT</version>
-  <packaging>eclipse-plugin</packaging>
-</project>
diff --git a/plugins/org.eclipse.jst.jee/pom.xml b/plugins/org.eclipse.jst.jee/pom.xml
index 4b5b4e6..120ccb3 100644
--- a/plugins/org.eclipse.jst.jee/pom.xml
+++ b/plugins/org.eclipse.jst.jee/pom.xml
@@ -15,9 +15,8 @@
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
+    <artifactId>javaee.plugins</artifactId>
     <version>3.6.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
   </parent>
 
   <groupId>org.eclipse.webtools.javaee</groupId>
diff --git a/plugins/org.eclipse.jst.servlet.ui/pom.xml b/plugins/org.eclipse.jst.servlet.ui/pom.xml
index 908ae50..0466e0b 100644
--- a/plugins/org.eclipse.jst.servlet.ui/pom.xml
+++ b/plugins/org.eclipse.jst.servlet.ui/pom.xml
@@ -15,9 +15,8 @@
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
+    <artifactId>javaee.plugins</artifactId>
     <version>3.6.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
   </parent>
 
   <groupId>org.eclipse.webtools.javaee</groupId>
diff --git a/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/internal/wizard/AddFilterWizardPage.java b/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/internal/wizard/AddFilterWizardPage.java
index c6cc790..11335ac 100644
--- a/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/internal/wizard/AddFilterWizardPage.java
+++ b/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/internal/wizard/AddFilterWizardPage.java
@@ -178,7 +178,7 @@
 	public void setVisible(boolean visible) {
 		super.setVisible(visible);
 		String javaEEVersion = model.getStringProperty(INewServletClassDataModelProperties.JAVA_EE_VERSION);
-		if("3.0".equals(javaEEVersion) || "3.1".equals(javaEEVersion)){ //$NON-NLS-1$ //$NON-NLS-2$			
+		if("3.0".equals(javaEEVersion) || "3.1".equals(javaEEVersion) || "4.0".equals(javaEEVersion)){ //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$			
 			asyncSupportCheckBox.setVisible(true);
 		}
 		else
diff --git a/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/internal/wizard/AddListenerWizardPage.java b/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/internal/wizard/AddListenerWizardPage.java
index 13fac90..987615e 100644
--- a/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/internal/wizard/AddListenerWizardPage.java
+++ b/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/internal/wizard/AddListenerWizardPage.java
@@ -276,7 +276,7 @@
 	public void setVisible(boolean visible) {
 		super.setVisible(visible);
 		String javaEEVersion = model.getStringProperty(INewServletClassDataModelProperties.JAVA_EE_VERSION);
-		if("3.1".equals(javaEEVersion)){ //$NON-NLS-1$ 	
+		if("3.1".equals(javaEEVersion) || "4.0".equals(javaEEVersion)){ //$NON-NLS-1$ //$NON-NLS-2$ 	
 			setServlet31ListenersVisible(true);
 		}
 		else{
diff --git a/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/internal/wizard/AddServletWizardPage.java b/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/internal/wizard/AddServletWizardPage.java
index 9df611a..6140d85 100644
--- a/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/internal/wizard/AddServletWizardPage.java
+++ b/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/internal/wizard/AddServletWizardPage.java
@@ -217,7 +217,7 @@
 	public void setVisible(boolean visible) {
 		super.setVisible(visible);
 		String javaEEVersion = model.getStringProperty(INewServletClassDataModelProperties.JAVA_EE_VERSION);
-		if("3.0".equals(javaEEVersion) || "3.1".equals(javaEEVersion)){ //$NON-NLS-1$ //$NON-NLS-2$			
+		if("3.0".equals(javaEEVersion) || "3.1".equals(javaEEVersion) || "4.0".equals(javaEEVersion)){ //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$			
 			asyncSupportCheckBox.setVisible(true);
 		}
 		else
diff --git a/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/project/facet/WebFragmentProjectFirstPage.java b/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/project/facet/WebFragmentProjectFirstPage.java
index 38ba6b1..6b7cfd8 100644
--- a/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/project/facet/WebFragmentProjectFirstPage.java
+++ b/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/project/facet/WebFragmentProjectFirstPage.java
@@ -101,7 +101,11 @@
 	    else {
 		    facets.add(primaryFacetVersion);
 		    
-		    if(primaryFacetVersion == WebFacetUtils.WEBFRAGMENT_31)
+		    if(primaryFacetVersion == WebFacetUtils.WEBFRAGMENT_40)
+		    {
+		        facets.add(JavaFacet.VERSION_1_8);
+		    }
+		    else if(primaryFacetVersion == WebFacetUtils.WEBFRAGMENT_31)
 		    {
 		        facets.add(JavaFacet.VERSION_1_7);
 		    }
diff --git a/plugins/org.eclipse.wst.web.ui/.classpath b/plugins/org.eclipse.wst.web.ui/.classpath
deleted file mode 100644
index b0b3094..0000000
--- a/plugins/org.eclipse.wst.web.ui/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="static_web_ui"/>
-	<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="output" path="bin"/>
-</classpath>
diff --git a/plugins/org.eclipse.wst.web.ui/.gitignore b/plugins/org.eclipse.wst.web.ui/.gitignore
deleted file mode 100644
index 5e56e04..0000000
--- a/plugins/org.eclipse.wst.web.ui/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-/bin
diff --git a/plugins/org.eclipse.wst.web.ui/.project b/plugins/org.eclipse.wst.web.ui/.project
deleted file mode 100644
index 3858f90..0000000
--- a/plugins/org.eclipse.wst.web.ui/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.wst.web.ui</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/plugins/org.eclipse.wst.web.ui/META-INF/MANIFEST.MF b/plugins/org.eclipse.wst.web.ui/META-INF/MANIFEST.MF
deleted file mode 100644
index 37a03d7..0000000
--- a/plugins/org.eclipse.wst.web.ui/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,31 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %Bundle-Name.0
-Bundle-SymbolicName: org.eclipse.wst.web.ui; singleton:=true
-Bundle-Version: 1.1.601.qualifier
-Bundle-Activator: org.eclipse.wst.web.ui.internal.WSTWebUIPlugin
-Bundle-Vendor: %Bundle-Vendor.0
-Bundle-Localization: plugin
-Export-Package: org.eclipse.wst.web.ui.internal,
- org.eclipse.wst.web.ui.internal.wizards
-Require-Bundle: 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.ui;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.ui.ide;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.wst.common.frameworks;bundle-version="[1.2.0,2.0.0)",
- org.eclipse.wst.common.frameworks.ui;bundle-version="[1.2.0,2.0.0)",
- org.eclipse.wst.web;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.common.modulecore;bundle-version="[1.2.0,2.0.0)",
- org.eclipse.wst.common.project.facet.ui;bundle-version="[1.3.0,2.0.0)",
- org.eclipse.wst.common.project.facet.core;bundle-version="[1.1.0,2.0.0)",
- org.eclipse.wst.server.ui;bundle-version="[1.0.102,2.0.0)",
- org.eclipse.wst.common.environment;bundle-version="[1.0.100,1.1.0)",
- org.eclipse.emf.ecore;bundle-version="[2.2.0,3.0.0)",
- org.eclipse.search;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.ui.console;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.wst.css.ui;bundle-version="[1.0.0,1.1.0)",
- org.eclipse.wst.html.ui;bundle-version="[1.0.0,1.1.0)",
- org.eclipse.wst.jsdt.ui;bundle-version="[2.0.0,3.0.0)",
- org.eclipse.ui.navigator;bundle-version="[3.2.0,4.0.0)
-Eclipse-LazyStart: true
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/plugins/org.eclipse.wst.web.ui/about.ini b/plugins/org.eclipse.wst.web.ui/about.ini
deleted file mode 100644
index 68af291..0000000
--- a/plugins/org.eclipse.wst.web.ui/about.ini
+++ /dev/null
@@ -1,12 +0,0 @@
-# about.ini
-# contains information about a feature
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# "%key" are externalized strings defined in about.properties
-# This file does not need to be translated.
-
-# Property "aboutText" contains blurb for "About" dialog (translated)
-aboutText=%blurb
-
-# Property "featureImage" contains path to feature image (32x32)
-featureImage=icons/WTP_icon_x32_v2.png
-
diff --git a/plugins/org.eclipse.wst.web.ui/about.properties b/plugins/org.eclipse.wst.web.ui/about.properties
deleted file mode 100644
index 839c201..0000000
--- a/plugins/org.eclipse.wst.web.ui/about.properties
+++ /dev/null
@@ -1,24 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2009 IBM 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:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-
-blurb=Eclipse Web Developer Tools\n\
-\n\
-Version: {featureVersion}\n\
-Build id: {0}\n\
-\n\
-(c) Copyright Eclipse contributors and others 2000, 2009.  All rights reserved.\n\
-Visit http://www.eclipse.org/webtools
diff --git a/plugins/org.eclipse.wst.web.ui/build.properties b/plugins/org.eclipse.wst.web.ui/build.properties
deleted file mode 100644
index 3bc606f..0000000
--- a/plugins/org.eclipse.wst.web.ui/build.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-bin.includes = plugin.xml,\
-               icons/,\
-               plugin.properties,\
-               META-INF/,\
-               about.html,\
-               .,\
-               about.properties,\
-               about.mappings,\
-               about.ini
-jars.compile.order = .
-source.. = static_web_ui/
-output.. = bin/
diff --git a/plugins/org.eclipse.wst.web.ui/icons/WTP_icon_x32_v2.png b/plugins/org.eclipse.wst.web.ui/icons/WTP_icon_x32_v2.png
deleted file mode 100644
index 6f09c2a..0000000
--- a/plugins/org.eclipse.wst.web.ui/icons/WTP_icon_x32_v2.png
+++ /dev/null
Binary files differ
diff --git a/plugins/org.eclipse.wst.web.ui/icons/full/ctool16/newwebprj_wiz.gif b/plugins/org.eclipse.wst.web.ui/icons/full/ctool16/newwebprj_wiz.gif
deleted file mode 100644
index 8956b3d..0000000
--- a/plugins/org.eclipse.wst.web.ui/icons/full/ctool16/newwebprj_wiz.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/org.eclipse.wst.web.ui/icons/full/cview16/web_perspective.gif b/plugins/org.eclipse.wst.web.ui/icons/full/cview16/web_perspective.gif
deleted file mode 100644
index c7b3278..0000000
--- a/plugins/org.eclipse.wst.web.ui/icons/full/cview16/web_perspective.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/org.eclipse.wst.web.ui/icons/full/obj16/web_application.gif b/plugins/org.eclipse.wst.web.ui/icons/full/obj16/web_application.gif
deleted file mode 100644
index 09f609d..0000000
--- a/plugins/org.eclipse.wst.web.ui/icons/full/obj16/web_application.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/org.eclipse.wst.web.ui/icons/full/wizban/newwprj_wiz.png b/plugins/org.eclipse.wst.web.ui/icons/full/wizban/newwprj_wiz.png
deleted file mode 100644
index 1edd090..0000000
--- a/plugins/org.eclipse.wst.web.ui/icons/full/wizban/newwprj_wiz.png
+++ /dev/null
Binary files differ
diff --git a/plugins/org.eclipse.wst.web.ui/plugin.properties b/plugins/org.eclipse.wst.web.ui/plugin.properties
deleted file mode 100644
index 7ae3b12..0000000
--- a/plugins/org.eclipse.wst.web.ui/plugin.properties
+++ /dev/null
@@ -1,24 +0,0 @@
-#########################################
-# (c) Copyright IBM Corp. 2000, 2009.
-# All Rights Reserved.
-#########################################
-
-Bundle-Vendor.0 = Eclipse Web Tools Platform
-Bundle-Name.0 = Eclipse Web Developer Tools
-
-
-StaticWebProject.name=Static Web Project
-StaticWebProject.description=Create a Web project for static content (HTML files) only
-
-StaticWebSettings=Simple Web
-WebProjectFeatures.name=Web Project Features
-web.category_ui_=Web
-StaticWebModule.name=Simple Web Module
-perspective.name = Web
-webActionSet.label = Web Project Wizards Action Set
-action.label.CSS = CSS
-action.tooltip.CSS = Create a new Cascading Style Sheet
-action.label.JS = JavaScript
-action.tooltip.JS = Create a new JavaScript file
-action.label.HTML = HTML
-action.tooltip.HTML = Create a new HTML page
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.web.ui/plugin.xml b/plugins/org.eclipse.wst.web.ui/plugin.xml
deleted file mode 100644
index 634c030..0000000
--- a/plugins/org.eclipse.wst.web.ui/plugin.xml
+++ /dev/null
@@ -1,165 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-
-     <!-- static web project wizard -->
-   <extension
-       point="org.eclipse.ui.newWizards">
-      <category
-            name="%web.category_ui_"
-            id="org.eclipse.wst.web.ui">
-      </category>
-      <wizard
-            name="%StaticWebProject.name"
-            icon="icons/full/ctool16/newwebprj_wiz.gif"
-            category="org.eclipse.wst.web.ui"
-            class="org.eclipse.wst.web.ui.internal.wizards.SimpleWebProjectWizard"
-            project="true"
-            finalPerspective="org.eclipse.wst.web.ui.webDevPerspective"
-            id="org.eclipse.wst.web.ui.internal.wizards.SimpleWebProjectWizard">
-         <description>
-            %StaticWebProject.description
-         </description>
-         <selection
-               class="org.eclipse.core.resources.IResource">
-         </selection>
-      </wizard>
-   </extension> -->
-   
-   <!-- the following 2 are needed to add an image for SWPs into the "Add/Remove Project" dialog -->
-	<extension point="org.eclipse.wst.server.core.moduleTypes">
-		<moduleType
-			id="web.static"
-			name="%StaticWebModule.name"/>
-	</extension>
-	<extension point="org.eclipse.wst.server.ui.serverImages">
-		<image
-			id="org.eclipse.wst.web.static"
-			typeIds="web.static"
-			icon="icons/full/obj16/web_application.gif"/>
-	</extension>
-	
-	
-<!-- ====================================================== -->
-<!-- Extension point: org.eclipse.ui.projectNatureImages    -->
-<!-- Purpose: Attach icon overlays for J2EE project natures -->
-<!-- ====================================================== -->
-   <extension
-         point="org.eclipse.ui.ide.projectNatureImages">
-      <image
-            icon="icons/full/ovr16/web_module_ovr.gif"
-            natureId="org.eclipse.wst.web.StaticWebNature"
-            id="org.eclipse.ui.simpleWebProjectNatureImage">
-      </image>
-   </extension>
-   
-  <extension point="org.eclipse.wst.common.project.facet.ui.wizardPages">
-    <wizard-pages action="wst.web.install">
-      <page class="org.eclipse.wst.web.ui.internal.wizards.SimpleWebFacetInstallPage"/>
-    </wizard-pages>
-  </extension>
-  
-	<extension
-    point="org.eclipse.ui.ide.markerResolution">
-	<markerResolutionGenerator
-      markerType="org.eclipse.wst.common.modulecore.ModuleCoreValidatorMarker"
-      class="org.eclipse.wst.web.ui.internal.ModuleCoreValidatorMarkerResolutions">
-    </markerResolutionGenerator>
-  </extension>
-
-	<extension
-         point="org.eclipse.ui.perspectives">
-      <perspective
-            name="%perspective.name"
-            icon="icons/full/cview16/web_perspective.gif"
-            class="org.eclipse.wst.web.ui.internal.WebDevelopmentPerspective"
-            id="org.eclipse.wst.web.ui.webDevPerspective">
-      </perspective>
-   </extension>
-   <extension point="org.eclipse.ui.perspectiveExtensions"> 
-        <perspectiveExtension targetID="org.eclipse.wst.web.ui.webDevPerspective">
-        	
-        	<actionSet id="org.eclipse.debug.ui.launchActionSet"/>
-        	<actionSet id="org.eclipse.wst.web.ui.wizardsActionSet" />
-        	<actionSet id="org.eclipse.wst.server.ui.internal.webbrowser.actionSet"/>
-        	<actionSet id="org.eclipse.debug.ui.breakpointActionSet"/>
-         
-            <newWizardShortcut id="org.eclipse.wst.web.ui.internal.wizards.SimpleWebProjectWizard"/>
-            <newWizardShortcut id="org.eclipse.jst.servlet.ui.project.facet.WebProjectWizard"/>
-            <newWizardShortcut id="org.eclipse.wst.css.ui.internal.wizard.NewCSSWizard"/>
-            <newWizardShortcut id="org.eclipse.wst.html.ui.internal.wizard.NewHTMLWizard"/>
-            <newWizardShortcut id="org.eclipse.wst.jsdt.ui.NewJSWizard"/>
-            <newWizardShortcut id="org.eclipse.ui.wizards.new.folder"/>
-            <newWizardShortcut id="org.eclipse.ui.wizards.new.file"/>
-            
-            <viewShortcut id="org.eclipse.ui.navigator.ProjectExplorer"/> 
-            <viewShortcut id="org.eclipse.ui.views.ContentOutline"/> 
-            <viewShortcut id="org.eclipse.ui.views.PropertySheet"/> 
-            <viewShortcut id="org.eclipse.ui.views.ProblemView"/> 
-            <viewShortcut id="org.eclipse.wst.server.ui.ServersView"/>
-
-            <perspectiveShortcut id="org.eclipse.jdt.ui.JavaPerspective"/>
-        </perspectiveExtension> 
-    </extension>
-
-	<!-- Toolbar action set for web project and HTML, JS and CSS files -->
-	<extension point="org.eclipse.ui.actionSets">
-		<actionSet
-				id="org.eclipse.wst.web.ui.wizardsActionSet"
-				label="%webActionSet.label">
-			<action
-					class="org.eclipse.wst.web.ui.internal.actions.OpenCSSWizardAction"
-					icon="platform:/plugin/org.eclipse.wst.css.ui/icons/full/etool16/newcss_wiz.gif"
-					id="org.eclipse.wst.web.ui.actions.newCSSFile"
-					label="%action.label.CSS"
-					style="push"
-					toolbarPath="Normal/webActions"
-					tooltip="%action.tooltip.CSS" />
-			<action
-					class="org.eclipse.wst.web.ui.internal.actions.OpenJSWizardAction"
-					icon="platform:/plugin/org.eclipse.wst.jsdt.ui/icons/full/etool16/newjscript_wiz.gif"
-					id="org.eclipse.wst.web.ui.actions.newJSFile"
-					label="%action.label.JS"
-					style="push"
-					toolbarPath="Normal/webActions"
-					tooltip="%action.tooltip.JS" />
-			<action
-					class="org.eclipse.wst.web.ui.internal.actions.OpenHTMLWizardAction"
-					icon="platform:/plugin/org.eclipse.wst.html.ui/icons/full/etool16/newhtml_wiz.gif"
-					id="org.eclipse.wst.web.ui.actions.newHTMLFile"
-					label="%action.label.HTML"
-					style="push"
-					toolbarPath="Normal/webActions"
-					tooltip="%action.tooltip.HTML" />
-		</actionSet>
-	</extension>
-	 <extension
-	       point="org.eclipse.ui.navigator.navigatorContent">
-			<commonWizard
-				menuGroupId="org.eclipse.jst.j2ee.ui.newProjects" 
-				type="new"
-				wizardId="org.eclipse.wst.web.ui.internal.wizards.SimpleWebProjectWizard">
-				<enablement>
-					<or>
-						<instanceof
-							value="org.eclipse.core.resources.IWorkspaceRoot" />
-						<and>
-							<adapt
-								type="org.eclipse.core.resources.IProject">
-								<or>
-									<test forcePluginActivation="true"
-										property="org.eclipse.wst.common.project.facet.core.projectFacet"
-										value="jst.ear" />
-								</or>
-							</adapt>
-						</and>
-					    <and>
-						  <instanceof value="java.util.Collection"/>
-						  <count value="0" />
-						</and>
-					</or>
-				</enablement>
-			</commonWizard>    
-	 </extension>
-
-</plugin>
diff --git a/plugins/org.eclipse.wst.web.ui/pom.xml b/plugins/org.eclipse.wst.web.ui/pom.xml
deleted file mode 100644
index f0ab04f..0000000
--- a/plugins/org.eclipse.wst.web.ui/pom.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Copyright (c) 2012, 2013 Eclipse Foundation and others.
-  All rights reserved. This program and the accompanying materials
-  are made available under the terms of the Eclipse Distribution License v1.0
-  which accompanies this distribution, and is available at
-  http://www.eclipse.org/org/documents/edl-v10.php
- 
-  Contributors:
-    Thanh Ha (Eclipse Foundation) - initial implementation
--->
-
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
-    <version>3.6.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
-  </parent>
-
-  <groupId>org.eclipse.webtools.javaee</groupId>
-  <artifactId>org.eclipse.wst.web.ui</artifactId>
-  <version>1.1.601-SNAPSHOT</version>
-  <packaging>eclipse-plugin</packaging>
-</project>
diff --git a/plugins/org.eclipse.wst.web.ui/static_web_ui/org/eclipse/wst/web/ui/internal/Logger.java b/plugins/org.eclipse.wst.web.ui/static_web_ui/org/eclipse/wst/web/ui/internal/Logger.java
deleted file mode 100644
index e3357cc..0000000
--- a/plugins/org.eclipse.wst.web.ui/static_web_ui/org/eclipse/wst/web/ui/internal/Logger.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM 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:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.web.ui.internal;
-
-
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.osgi.framework.Bundle;
-
-/**
- * Small convenience class to log messages to plugin's log file and also, if
- * desired, the console. This class should only be used by classes in this
- * plugin. Other plugins should make their own copy, with appropriate ID.
- */
-public class Logger {
-	private static final String PLUGIN_ID = "org.eclipse.wst.web.ui"; //$NON-NLS-1$
-	/**
-	 * true if both platform and this plugin are in debug mode
-	 */
-	public static final boolean DEBUG = Platform.inDebugMode() && "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.wst.web.ui/debug")); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/*
-	 * Keep our own copy in case we want to add other severity levels
-	 */
-	public static final int OK = IStatus.OK;
-	public static final int INFO = IStatus.INFO;
-	public static final int WARNING = IStatus.WARNING;
-	public static final int ERROR = IStatus.ERROR;
-
-	/**
-	 * Adds message to log.
-	 * 
-	 * @param level
-	 *            severity level of the message (OK, INFO, WARNING, ERROR,
-	 * @param message
-	 *            text to add to the log
-	 * @param exception
-	 *            exception thrown
-	 */
-	private static void _log(int level, String message, Throwable exception) {
-		Status statusObj = new Status(level, PLUGIN_ID, level, message, exception);
-		Bundle bundle = Platform.getBundle(PLUGIN_ID);
-		if (bundle != null)
-			Platform.getLog(bundle).log(statusObj);
-	}
-
-	/**
-	 * Write a message to the log with the given severity level
-	 * 
-	 * @param level
-	 *            ERROR, WARNING, INFO, OK
-	 * @param message
-	 *            message to add to the log
-	 */
-	public static void log(int level, String message) {
-		_log(level, message, null);
-	}
-
-	/**
-	 * Writes a message and exception to the log with the given severity level
-	 * 
-	 * @param level
-	 *            ERROR, WARNING, INFO, OK
-	 * @param message
-	 *            message to add to the log
-	 * @param exception
-	 *            exception to add to the log
-	 */
-	public static void log(int level, String message, Throwable exception) {
-		_log(level, message, exception);
-	}
-
-	/**
-	 * Writes the exception as an error in the log along with an accompanying
-	 * message
-	 * 
-	 * @param message
-	 *            message to add to the log
-	 * @param exception
-	 *            exception to add to the log
-	 */
-	public static void logException(String message, Throwable exception) {
-		_log(IStatus.ERROR, message, exception);
-	}
-
-	/**
-	 * Writes the exception as an error in the log
-	 * 
-	 * @param exception
-	 *            exception to add to the log
-	 */
-	public static void logException(Throwable exception) {
-		_log(IStatus.ERROR, exception.getMessage(), exception);
-	}
-}
diff --git a/plugins/org.eclipse.wst.web.ui/static_web_ui/org/eclipse/wst/web/ui/internal/ModuleCoreValidatorMarkerResolutions.java b/plugins/org.eclipse.wst.web.ui/static_web_ui/org/eclipse/wst/web/ui/internal/ModuleCoreValidatorMarkerResolutions.java
deleted file mode 100644
index 7a59260..0000000
--- a/plugins/org.eclipse.wst.web.ui/static_web_ui/org/eclipse/wst/web/ui/internal/ModuleCoreValidatorMarkerResolutions.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/******************************************************************************
- * Copyright (c) 2005 BEA Systems, Inc.
- * 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:
- *    Konstantin Komissarchik - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.wst.web.ui.internal;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.IMarkerResolution;
-import org.eclipse.ui.IMarkerResolutionGenerator;
-import org.eclipse.ui.views.markers.WorkbenchMarkerResolution;
-import org.eclipse.wst.common.componentcore.internal.ModuleMigratorManager;
-import org.eclipse.wst.web.ui.internal.WSTWebUIPlugin;
-
-/**
- * This has been deprecated since WTP 3.1.2 and will be deleted post WTP 3.2.
- * See https://bugs.eclipse.org/bugs/show_bug.cgi?id=292934
- * @deprecated 
- * @author <a href="mailto:kosta@bea.com">Konstantin Komissarchik</a>
- */
-public final class ModuleCoreValidatorMarkerResolutions
-
-    implements IMarkerResolutionGenerator
-    
-{
-    public IMarkerResolution[] getResolutions( IMarker marker )
-    {
-        return new IMarkerResolution[] 
-        { 
-            new ModuleCoreMigrationResolution( marker ) 
-        };
-    }
-    
-    private class ModuleCoreMigrationResolution extends WorkbenchMarkerResolution
-        
-    {
-        private final IMarker theMarker;
-        private final String MARKERTYPE = "org.eclipse.wst.common.modulecore.ModuleCoreValidatorMarker"; //$NON-NLS-1$
-        
-        public ModuleCoreMigrationResolution( IMarker marker )
-        {
-            this.theMarker = marker;
-        }
-        
-        public String getLabel()
-        {
-            return Resources.migrateMetaData;
-        }
-
-        
-        
-        public void run( IMarker marker )
-        {
-            
-            IProject proj = marker.getResource().getProject();
-            
-            try
-            {
-        		ModuleMigratorManager manager = ModuleMigratorManager.getManager(proj);
-        		if (!manager.isMigrating() && !ResourcesPlugin.getWorkspace().isTreeLocked()) 
-        				manager.migrateOldMetaData(proj,true);
-            }
-            catch( Exception e )
-            {
-            	WSTWebUIPlugin.logError(e);
-            }
-        }
-
-		public String getDescription() {
-			return Resources.migrateMetaData;
-		}
-
-		public Image getImage() {
-			return null;
-		}
-
-		@Override
-		public IMarker[] findOtherMarkers(IMarker[] markers) {
-			List marks = new ArrayList();
-			for (int i = 0; i < markers.length; i++) {
-				IMarker marker = markers[i];
-				try {
-					if (marker.getType().equals(MARKERTYPE) && !(marker.equals(theMarker)))
-						marks.add(marker);
-				} catch (CoreException e) {
-					WSTWebUIPlugin.logError(e);
-				}
-			}
-			return (IMarker[])marks.toArray(new IMarker[marks.size()]);
-		}
-     
-    }
-
-    private static final class Resources
-    
-        extends NLS
-        
-    {
-    	public static String migrateMetaData;
-        
-        static
-        {
-            initializeMessages( ModuleCoreValidatorMarkerResolutions.class.getName(), 
-                                Resources.class );
-        }
-    }
-    
-    
-}
diff --git a/plugins/org.eclipse.wst.web.ui/static_web_ui/org/eclipse/wst/web/ui/internal/ModuleCoreValidatorMarkerResolutions.properties b/plugins/org.eclipse.wst.web.ui/static_web_ui/org/eclipse/wst/web/ui/internal/ModuleCoreValidatorMarkerResolutions.properties
deleted file mode 100644
index 4491dfe..0000000
--- a/plugins/org.eclipse.wst.web.ui/static_web_ui/org/eclipse/wst/web/ui/internal/ModuleCoreValidatorMarkerResolutions.properties
+++ /dev/null
@@ -1,11 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2006 IBM 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:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-migrateMetaData=Migrate metadata
diff --git a/plugins/org.eclipse.wst.web.ui/static_web_ui/org/eclipse/wst/web/ui/internal/WSTWebPreferences.java b/plugins/org.eclipse.wst.web.ui/static_web_ui/org/eclipse/wst/web/ui/internal/WSTWebPreferences.java
deleted file mode 100644
index 931f9ef..0000000
--- a/plugins/org.eclipse.wst.web.ui/static_web_ui/org/eclipse/wst/web/ui/internal/WSTWebPreferences.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2005 IBM 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:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.wst.web.ui.internal;
-
-import org.eclipse.core.runtime.Plugin;
-import org.eclipse.core.runtime.Preferences;
-
-public class WSTWebPreferences {
-	public interface Keys {
-		final static String STATIC_WEB_CONTENT = "org.eclipse.jst.j2ee.preference.staticWebContentName"; //$NON-NLS-1$
-	}
-	public interface Values {
-		final static String STATIC_WEB_CONTENT = "WebContent"; //$NON-NLS-1$
-	}
-	public interface Defaults {
-		final static String STATIC_WEB_CONTENT = Values.STATIC_WEB_CONTENT;
-	}
-	private Plugin owner = null;
-	private Preferences preferences = null;
-	private boolean persistOnChange = false;
-
-	public WSTWebPreferences(Plugin owner) {
-		this.owner = owner;
-	}
-	protected void initializeDefaultPreferences() {
-		getPreferences().setDefault(Keys.STATIC_WEB_CONTENT, Defaults.STATIC_WEB_CONTENT);
-	}
-
-	public String getStaticWebContentFolderName() {
-		return getPreferences().getString(Keys.STATIC_WEB_CONTENT);
-	}
-
-	public void setStaticWebContentFolderName(String value) {
-		getPreferences().setValue(Keys.STATIC_WEB_CONTENT, value);
-		firePreferenceChanged();
-	}
-
-	public void firePreferenceChanged() {
-		if (isPersistOnChange())
-			persist();
-	}
-
-	public void persist() {
-		getOwner().savePluginPreferences();
-	}
-
-	/**
-	 * @return Returns the persistOnChange.
-	 */
-	public boolean isPersistOnChange() {
-		return this.persistOnChange;
-	}
-
-	/**
-	 * @param persistOnChange
-	 *            The persistOnChange to set.
-	 */
-	public void setPersistOnChange(boolean persistOnChange) {
-		this.persistOnChange = persistOnChange;
-	}
-
-	private Preferences getPreferences() {
-		if (this.preferences == null)
-			this.preferences = getOwner().getPluginPreferences();
-		return this.preferences;
-	}
-
-	/**
-	 * @return Returns the owner.
-	 */
-	private Plugin getOwner() {
-		return this.owner;
-	}
-}
diff --git a/plugins/org.eclipse.wst.web.ui/static_web_ui/org/eclipse/wst/web/ui/internal/WSTWebUIPlugin.java b/plugins/org.eclipse.wst.web.ui/static_web_ui/org/eclipse/wst/web/ui/internal/WSTWebUIPlugin.java
deleted file mode 100644
index 5e37665..0000000
--- a/plugins/org.eclipse.wst.web.ui/static_web_ui/org/eclipse/wst/web/ui/internal/WSTWebUIPlugin.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM 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:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.web.ui.internal;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import java.lang.Throwable;
-import org.eclipse.core.runtime.CoreException;
-
-/**
- * The main plugin class to be used in the desktop.
- */
-public class WSTWebUIPlugin extends AbstractUIPlugin {
-    
-    public static final String PLUGIN_ID = "org.eclipse.wst.web.ui"; //$NON-NLS-1$
-    
-	// The shared instance.
-	private static WSTWebUIPlugin plugin;
-	public static final String[] ICON_DIRS = new String[]{"icons/full/obj16", //$NON-NLS-1$
-		"icons/full/ctool16", //$NON-NLS-1$
-		"icons/full/wizban", //$NON-NLS-1$
-		"icons", //$NON-NLS-1$
-		""}; //$NON-NLS-1$
-
-	/**
-	 * The constructor.
-	 */
-	public WSTWebUIPlugin() {
-		super();
-		plugin = this;
-	}
-	/**
-	 * This method is called upon plug-in activation
-	 */
-	@Override
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-	}
-
-	/**
-	 * This method is called when the plug-in is stopped
-	 */
-	@Override
-	public void stop(BundleContext context) throws Exception {
-		super.stop(context);
-		plugin = null;
-	}
-	
-	/**
-	 * This gets a .gif from the icons folder.
-	 */
-	public ImageDescriptor getImageDescriptor(String key) {
-		ImageDescriptor imageDescriptor = null;
-		URL imageURL = getImageURL(key, getBundle());
-		if (imageURL==null)
-			imageURL = getPNGImageURL(key, getBundle());
-		if (imageURL != null)
-			imageDescriptor = ImageDescriptor.createFromURL(imageURL);
-		return imageDescriptor;
-	}
-	/**
-	 * This gets a .gif from the icons folder.
-	 */
-	public static URL getImageURL(String key, Bundle bundle) {
-		String gif = "/" + key + ".gif"; //$NON-NLS-1$ //$NON-NLS-2$
-		IPath path = null;
-		for (int i = 0; i < ICON_DIRS.length; i++) {
-			path = new Path(ICON_DIRS[i]).append(gif);
-			if (bundle.getEntry(path.toString()) == null)
-				continue;
-			try {
-				return new URL(bundle.getEntry("/"), path.toString()); //$NON-NLS-1$
-			} catch (MalformedURLException exception) {
-				Logger.log(Logger.WARNING, "Load_Image_Error_", exception); //$NON-NLS-1$
-				continue;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * This gets a .png from the icons folder.
-	 */
-	public static URL getPNGImageURL(String key, Bundle bundle) {
-		String gif = "/" + key + ".png"; //$NON-NLS-1$ //$NON-NLS-2$
-		IPath path = null;
-		for (int i = 0; i < ICON_DIRS.length; i++) {
-			path = new Path(ICON_DIRS[i]).append(gif);
-			if (bundle.getEntry(path.toString()) == null)
-				continue;
-			try {
-				return new URL(bundle.getEntry("/"), path.toString()); //$NON-NLS-1$
-			} catch (MalformedURLException exception) {
-				Logger.log(Logger.WARNING, "Load_Image_Error_", exception); //$NON-NLS-1$
-				continue;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the shared instance.
-	 */
-	public static WSTWebUIPlugin getDefault() {
-		return plugin;
-	}
-	public static IStatus createStatus(int severity, String message, Throwable exception) {
-		return new Status(severity, PLUGIN_ID, message, exception);
-	}
-	public static IStatus createStatus(int severity, String message) {
-		return createStatus(severity, message, null);
-	}
-	public static void logError(Throwable exception) {
-		Platform.getLog(Platform.getBundle(PLUGIN_ID)).log( createStatus(IStatus.ERROR, exception.getMessage(), exception));
-	}
-	public static void logError(CoreException exception) {
-		Platform.getLog(Platform.getBundle(PLUGIN_ID)).log( exception.getStatus() );
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.web.ui/static_web_ui/org/eclipse/wst/web/ui/internal/WebDevelopmentPerspective.java b/plugins/org.eclipse.wst.web.ui/static_web_ui/org/eclipse/wst/web/ui/internal/WebDevelopmentPerspective.java
deleted file mode 100644
index 2445ff1..0000000
--- a/plugins/org.eclipse.wst.web.ui/static_web_ui/org/eclipse/wst/web/ui/internal/WebDevelopmentPerspective.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM 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:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.web.ui.internal;
-
-import org.eclipse.search.ui.NewSearchUI;
-import org.eclipse.ui.IFolderLayout;
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.IPerspectiveFactory;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.console.IConsoleConstants;
-import org.eclipse.ui.progress.IProgressConstants;
-import org.eclipse.wst.project.facet.IProductConstants;
-import org.eclipse.wst.project.facet.ProductManager;
-
-public class WebDevelopmentPerspective implements IPerspectiveFactory {
-
-	public static final String ID = "org.eclipse.wst.web.ui.webDevPerspective"; //$NON-NLS-1$
-
-	protected static final String TOP_LEFT_LOCATION = "topLeft"; //$NON-NLS-1$
-	protected static final String BOTTOM_LEFT_LOCATION = "bottomLeft"; //$NON-NLS-1$ 
-	protected static final String BOTTOM_RIGHT_LOCATION = "bottomRight"; //$NON-NLS-1$
-	protected static final String TOP_RIGHT_LOCATION = "topRight"; //$NON-NLS-1$
-	protected static final String BOTTOM_LOCATION = "bottom"; //$NON-NLS-1$
-
-	// view id's
-	protected static String ID_PROJECT_EXPLORER = "org.eclipse.ui.navigator.ProjectExplorer"; //$NON-NLS-1$
-	protected static final String ID_SERVER = "org.eclipse.wst.server.ui.ServersView"; //$NON-NLS-1$
-	protected static String ID_WST_SNIPPETS_VIEW = "org.eclipse.wst.common.snippets.internal.ui.SnippetsView"; //$NON-NLS-1$
-
-	public WebDevelopmentPerspective() {
-		super();
-		//If preference exists for alternate view, replace.
-		String viewerID = ProductManager.getProperty(IProductConstants.ID_PERSPECTIVE_HIERARCHY_VIEW);
-		if (viewerID != null) {
-			// verify that the view actually exists
-			if (PlatformUI.getWorkbench().getViewRegistry().find(viewerID) != null){
-				ID_PROJECT_EXPLORER = viewerID;
-			}
-		}
-	}
-
-	/*
-	 *____ ________________ _____
-	 *|    |                |     |
-	 *| P  |                |  O  |
-	 *| R  |     ED         |  u  |
-	 *| o  |                |  t  |
-	 *| j  |                |  l  |
-	 *|    |________________|  i  |
-	 *| E  |                |  n  |
-	 *| X  | PROB/SERV/PROP |  e  |
-	 *|_P__|________________|_____|
-	 *
-	 */
-	public void createInitialLayout(IPageLayout layout) {
-		// everything is based off the editor area
-		String editorArea = layout.getEditorArea();
-
-		// LEFT Area (Project Explorer)
-		IFolderLayout topLeft = layout.createFolder(TOP_LEFT_LOCATION,
-				IPageLayout.LEFT, 0.25f, editorArea);
-		topLeft.addView(ID_PROJECT_EXPLORER);
-		topLeft.addPlaceholder(IPageLayout.ID_RES_NAV);
-
-		// TOP RIGHT Area (Outline)
-		IFolderLayout topRight = layout.createFolder(TOP_RIGHT_LOCATION,
-				IPageLayout.RIGHT, 0.80f, editorArea);
-		topRight.addView(IPageLayout.ID_OUTLINE);
-		topRight.addView(ID_WST_SNIPPETS_VIEW);
-
-		// BOTTOM Area (Problems, Server, Properties)
-		IFolderLayout bottom = layout.createFolder(BOTTOM_LOCATION,
-				IPageLayout.BOTTOM, 0.70f, editorArea);
-		bottom.addView(IPageLayout.ID_PROBLEM_VIEW);
-		bottom.addView(ID_SERVER);
-		bottom.addView(IPageLayout.ID_PROP_SHEET);
-		bottom.addPlaceholder(NewSearchUI.SEARCH_VIEW_ID);
-		bottom.addPlaceholder(IConsoleConstants.ID_CONSOLE_VIEW);
-		bottom.addPlaceholder(IPageLayout.ID_BOOKMARKS);
-		bottom.addPlaceholder(IProgressConstants.PROGRESS_VIEW_ID);
-		bottom.addPlaceholder(IPageLayout.ID_TASK_LIST);
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.web.ui/static_web_ui/org/eclipse/wst/web/ui/internal/actions/AbstractOpenWizardAction.java b/plugins/org.eclipse.wst.web.ui/static_web_ui/org/eclipse/wst/web/ui/internal/actions/AbstractOpenWizardAction.java
deleted file mode 100644
index 809dfe2..0000000
--- a/plugins/org.eclipse.wst.web.ui/static_web_ui/org/eclipse/wst/web/ui/internal/actions/AbstractOpenWizardAction.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM 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:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.web.ui.internal.actions;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkbenchWindowActionDelegate;
-import org.eclipse.ui.IWorkbenchWizard;
-
-public abstract class AbstractOpenWizardAction implements IWorkbenchWindowActionDelegate
-{
-
-	private IWorkbenchWindow window;
-
-	public AbstractOpenWizardAction()
-	{
-		super();
-	}
-
-	public void dispose()
-	{
-	}
-
-	public void init( IWorkbenchWindow window )
-	{
-		this.window = window;
-	}
-
-	abstract public void run( IAction action );
-
-	public void selectionChanged( IAction action, ISelection selection )
-	{
-	}
-
-	protected void openWizardDialog( IWorkbenchWizard wizard )
-	{
-		ISelection selection = window.getSelectionService().getSelection();
-	
-		if ( selection instanceof IStructuredSelection )
-		{
-			wizard.init( window.getWorkbench(), (IStructuredSelection) selection );
-		}
-		else
-		{
-			wizard.init( window.getWorkbench(), StructuredSelection.EMPTY );
-		}
-	
-		Shell parent = window.getShell();
-		WizardDialog dialog = new WizardDialog( parent, wizard );
-	
-		dialog.create();
-		dialog.open();
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.web.ui/static_web_ui/org/eclipse/wst/web/ui/internal/actions/OpenCSSWizardAction.java b/plugins/org.eclipse.wst.web.ui/static_web_ui/org/eclipse/wst/web/ui/internal/actions/OpenCSSWizardAction.java
deleted file mode 100644
index 2527044..0000000
--- a/plugins/org.eclipse.wst.web.ui/static_web_ui/org/eclipse/wst/web/ui/internal/actions/OpenCSSWizardAction.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM 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:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.web.ui.internal.actions;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.wst.css.ui.internal.wizard.NewCSSWizard;
-
-public class OpenCSSWizardAction extends AbstractOpenWizardAction
-{
-
-	@Override
-	public void run( IAction action )
-	{
-		openWizardDialog( new NewCSSWizard() );
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.web.ui/static_web_ui/org/eclipse/wst/web/ui/internal/actions/OpenHTMLWizardAction.java b/plugins/org.eclipse.wst.web.ui/static_web_ui/org/eclipse/wst/web/ui/internal/actions/OpenHTMLWizardAction.java
deleted file mode 100644
index b009c15..0000000
--- a/plugins/org.eclipse.wst.web.ui/static_web_ui/org/eclipse/wst/web/ui/internal/actions/OpenHTMLWizardAction.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM 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:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.web.ui.internal.actions;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.wst.html.ui.internal.wizard.NewHTMLWizard;
-
-public class OpenHTMLWizardAction extends AbstractOpenWizardAction
-{
-
-	@Override
-	public void run( IAction action )
-	{
-		openWizardDialog( new NewHTMLWizard() );
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.web.ui/static_web_ui/org/eclipse/wst/web/ui/internal/actions/OpenJSWizardAction.java b/plugins/org.eclipse.wst.web.ui/static_web_ui/org/eclipse/wst/web/ui/internal/actions/OpenJSWizardAction.java
deleted file mode 100644
index 0e4bb24..0000000
--- a/plugins/org.eclipse.wst.web.ui/static_web_ui/org/eclipse/wst/web/ui/internal/actions/OpenJSWizardAction.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM 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:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.web.ui.internal.actions;
-
-import org.eclipse.jface.action.IAction;
-
-public class OpenJSWizardAction extends AbstractOpenWizardAction
-{
-
-	@Override
-	public void run( IAction action )
-	{
-		openWizardDialog( new org.eclipse.wst.jsdt.internal.ui.wizards.NewJSWizard() );
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.web.ui/static_web_ui/org/eclipse/wst/web/ui/internal/wizards/DataModelFacetCreationWizardPage.java b/plugins/org.eclipse.wst.web.ui/static_web_ui/org/eclipse/wst/web/ui/internal/wizards/DataModelFacetCreationWizardPage.java
deleted file mode 100644
index 4aa87c5..0000000
--- a/plugins/org.eclipse.wst.web.ui/static_web_ui/org/eclipse/wst/web/ui/internal/wizards/DataModelFacetCreationWizardPage.java
+++ /dev/null
@@ -1,698 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2011 IBM 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:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.web.ui.internal.wizards;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-import java.util.SortedSet;
-
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.layout.GridDataFactory;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkingSet;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.WorkingSetGroup;
-import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties;
-import org.eclipse.wst.common.frameworks.datamodel.DataModelEvent;
-import org.eclipse.wst.common.frameworks.datamodel.DataModelPropertyDescriptor;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModelListener;
-import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizardPage;
-import org.eclipse.wst.common.frameworks.internal.operations.IProjectCreationPropertiesNew;
-import org.eclipse.wst.common.frameworks.internal.ui.NewProjectGroup;
-import org.eclipse.wst.common.project.facet.core.IFacetedProjectWorkingCopy;
-import org.eclipse.wst.common.project.facet.core.IPreset;
-import org.eclipse.wst.common.project.facet.core.IProjectFacet;
-import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
-import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
-import org.eclipse.wst.common.project.facet.core.events.IFacetedProjectEvent;
-import org.eclipse.wst.common.project.facet.core.events.IFacetedProjectListener;
-import org.eclipse.wst.common.project.facet.core.events.IProjectFacetsChangedEvent;
-import org.eclipse.wst.common.project.facet.core.runtime.IRuntime;
-import org.eclipse.wst.common.project.facet.core.runtime.IRuntimeComponent;
-import org.eclipse.wst.common.project.facet.core.runtime.RuntimeManager;
-import org.eclipse.wst.common.project.facet.core.util.AbstractFilter;
-import org.eclipse.wst.common.project.facet.core.util.FilterEvent;
-import org.eclipse.wst.common.project.facet.core.util.IFilter;
-import org.eclipse.wst.common.project.facet.ui.ModifyFacetedProjectWizard;
-import org.eclipse.wst.common.project.facet.ui.PresetSelectionPanel;
-import org.eclipse.wst.project.facet.ProductManager;
-import org.eclipse.wst.server.ui.ServerUIUtil;
-import org.eclipse.wst.web.internal.ResourceHandler;
-import org.eclipse.wst.web.internal.facet.RuntimePresetMappingRegistry;
-
-public class DataModelFacetCreationWizardPage extends DataModelWizardPage implements IFacetProjectCreationDataModelProperties {
-
-	private static final String NULL_RUNTIME = "NULL_RUNTIME"; //$NON-NLS-1$
-	private static final String MRU_RUNTIME_STORE = "MRU_RUNTIME_STORE"; //$NON-NLS-1$
-	
-	protected static final String RESOURCE_WORKING_SET = "org.eclipse.ui.resourceWorkingSetPage"; //$NON-NLS-1$
-	protected static final String JAVA_WORKING_SET = "org.eclipse.jdt.ui.JavaWorkingSetPage"; //$NON-NLS-1$
-	
-	protected IProjectFacet primaryProjectFacet = null;
-	protected Combo primaryVersionCombo = null;
-	
-	protected WorkingSetGroup workingSetGroup;
-	
-	private List<IFacetedProjectListener> facetedProjectListeners = new ArrayList<IFacetedProjectListener>();
-	
-	protected Set<IProjectFacetVersion> getFacetConfiguration( final IProjectFacetVersion primaryFacetVersion )
-	{
-	    final Set<IProjectFacetVersion> config = new HashSet<IProjectFacetVersion>();
-	    
-	    for( IProjectFacet fixedFacet : this.fpjwc.getFixedProjectFacets() )
-	    {
-	        if( fixedFacet == primaryFacetVersion.getProjectFacet() )
-	        {
-	            config.add( primaryFacetVersion );
-	        }
-	        else
-	        {
-	            config.add( this.fpjwc.getHighestAvailableVersion( fixedFacet ) );
-	        }
-	    }
-	    
-	    return config;
-	}
-	
-	private static final String[] VALIDATION_PROPERTIES = 
-	{
-	    IProjectCreationPropertiesNew.PROJECT_NAME, 
-	    IProjectCreationPropertiesNew.PROJECT_LOCATION, 
-	    FACET_RUNTIME,
-	    FACETED_PROJECT_WORKING_COPY
-	};
-	
-	protected static GridData gdhfill() {
-		return new GridData(GridData.FILL_HORIZONTAL);
-	}
-    
-    protected static GridData hspan( final GridData gd,
-                                     final int span ) 
-    {
-        gd.horizontalSpan = span;
-        return gd;
-    }
-
-	@Override
-	protected Composite createTopLevelComposite(Composite parent) {
-		Composite top = new Composite(parent, SWT.NONE);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(top, getInfopopID());
-		top.setLayout(new GridLayout());
-		top.setLayoutData(new GridData(GridData.FILL_BOTH));
-		createProjectGroup(top);
-		createServerTargetComposite(top);
-		createPrimaryFacetComposite(top);
-        createPresetPanel(top);
-        return top;
-	}
-	
-	private String getPrimaryFacetCompositeLabel()
-	{
-	    final StringBuilder buf = new StringBuilder();
-	    boolean firstWord = true;
-	    
-	    for( String word : primaryProjectFacet.getLabel().split( " " ) ) //$NON-NLS-1$
-	    {
-	        if( firstWord )
-	        {
-	            buf.append( word );
-	            firstWord = false;
-	        }
-	        else
-	        {
-	            buf.append( ' ' );
-	            
-    	        if( word.length() == 1 || ! Character.isUpperCase( word.charAt( 1 ) ) )
-    	        {
-    	            buf.append( Character.toLowerCase( word.charAt( 0 ) ) );
-    	            buf.append( word.substring( 1 ) );
-    	        }
-    	        else
-    	        {
-    	            buf.append( word );
-    	        }
-	        }
-	    }
-	    
-	    buf.append( ' ' );
-	    buf.append( Messages.FACET_VERSION );
-	    
-	    return buf.toString();
-	}
-
-	protected void createPrimaryFacetComposite(Composite top) {
-		primaryProjectFacet = ProjectFacetsManager.getProjectFacet( getModuleTypeID() );
-		if (primaryProjectFacet.getVersions().size()  <= 1){
-			//there is no need to create this section if there is only one
-			//facet version to choose from (e.g. utility and static web)
-			return;
-		}
-		
-		final Group group = new Group( top, SWT.NONE );
-        group.setLayoutData( gdhfill() );
-        group.setLayout( new GridLayout( 1, false ) );
-        group.setText( getPrimaryFacetCompositeLabel() );
-		
-        primaryVersionCombo = new Combo( group, SWT.BORDER | SWT.READ_ONLY );
-        primaryVersionCombo.setLayoutData( gdhfill() );
-        updatePrimaryVersions();
-        
-        primaryVersionCombo.addSelectionListener
-        (
-            new SelectionAdapter()
-            {
-                @Override
-                public void widgetSelected( final SelectionEvent e )
-                {
-                    handlePrimaryFacetVersionSelectedEvent();
-                }
-            }
-        );
-        
-        IFacetedProjectListener fpjwcListenerForPrimaryFacetCombo = new IFacetedProjectListener() {
-			public void handleEvent(IFacetedProjectEvent event) {
-				if(event.getType() == IFacetedProjectEvent.Type.PROJECT_FACETS_CHANGED){
-					//this block is to update the combo when the underlying facet version changes
-					IProjectFacetsChangedEvent actionEvent = (IProjectFacetsChangedEvent)event;
-					Set<IProjectFacetVersion> changedVersions = actionEvent.getFacetsWithChangedVersions();
-					
-					boolean foundComboVersion = false;
-					for(Iterator <IProjectFacetVersion> iterator = changedVersions.iterator(); iterator.hasNext() && !foundComboVersion;){
-						IProjectFacetVersion next = iterator.next();
-						if(next.getProjectFacet().equals(primaryProjectFacet)){
-							foundComboVersion = true;
-							final IProjectFacetVersion selectedVersion = next;
-							Display.getDefault().asyncExec(new Runnable(){
-								public void run() {
-									String selectedText = primaryVersionCombo.getItem(primaryVersionCombo.getSelectionIndex());
-									if(!selectedText.equals(selectedVersion.getVersionString())){
-										String [] items = primaryVersionCombo.getItems();
-										int selectedVersionIndex = -1;
-										for(int i=0;i<items.length && selectedVersionIndex == -1; i++){
-											if(items[i].equals(selectedVersion.getVersionString())){
-												selectedVersionIndex = i;
-												primaryVersionCombo.select(selectedVersionIndex);
-											}
-										}
-									}	
-								}
-							});
-						}
-					}
-				} else if(event.getType() == IFacetedProjectEvent.Type.PRIMARY_RUNTIME_CHANGED){
-					//this block updates the items in the combo when the runtime changes
-					Display.getDefault().asyncExec(new Runnable(){
-						public void run() {
-							updatePrimaryVersions();
-						}
-					});
-				}
-			}
-        	
-        };
-        this.facetedProjectListeners.add(fpjwcListenerForPrimaryFacetCombo);
-        fpjwc.addListener(fpjwcListenerForPrimaryFacetCombo, IFacetedProjectEvent.Type.PROJECT_FACETS_CHANGED, IFacetedProjectEvent.Type.PRIMARY_RUNTIME_CHANGED);
-	}
-	
-	protected IProjectFacet getPrimaryFacet()
-	{
-	    return this.primaryProjectFacet;
-	}
-	
-	public IProjectFacetVersion getPrimaryFacetVersion()
-	{
-	    IProjectFacetVersion fv = null;
-	    
-	    if( this.primaryProjectFacet.getVersions().size() > 1 )
-	    {
-            final int selectedIndex = this.primaryVersionCombo.getSelectionIndex();
-    
-            if( selectedIndex != -1 )
-            {
-                final String fvstr = this.primaryVersionCombo.getItem( selectedIndex );
-                fv = this.primaryProjectFacet.getVersion( fvstr );
-            }
-	    }
-	    else
-	    {
-	        fv = this.primaryProjectFacet.getDefaultVersion();
-	    }
-        
-        return fv;
-	}
-	
-	protected void handlePrimaryFacetVersionSelectedEvent()
-	{
-	    final IProjectFacetVersion fv = getPrimaryFacetVersion();
-        if( fv != null )
-        {
-        	String presetID = null;
-        	IRuntime runtime = (IRuntime)model.getProperty(IFacetProjectCreationDataModelProperties.FACET_RUNTIME);
-        	if(runtime != null){
-        		if(runtime.getRuntimeComponents().size() > 0){
-        			IRuntimeComponent runtimeComponent = runtime.getRuntimeComponents().get(0);
-        			String facetRuntimeTypeID = runtimeComponent.getRuntimeComponentType().getId();
-        			String facetRuntimeVersion = runtimeComponent.getRuntimeComponentVersion().getVersionString();
-        			String facetID = fv.getProjectFacet().getId();
-		    	    String facetVersion = fv.getVersionString();
-		    	    presetID = RuntimePresetMappingRegistry.INSTANCE.getPresetID(facetRuntimeTypeID, facetRuntimeVersion, facetID, facetVersion);	
-        		}
-        	}
-        	
-        	if( presetID == null )
-        	{
-                final Set<IProjectFacetVersion> facets = getFacetConfiguration( fv );
-                this.fpjwc.setProjectFacets( facets );
-        	}
-        	else
-        	{  // setting the facets prior to setting the preset is to let the dynamic presets adjust
-        		final Set<IProjectFacetVersion> facets = getFacetConfiguration( fv );
-                this.fpjwc.setProjectFacets( facets );
-        		this.fpjwc.setSelectedPreset(presetID);
-        		
-        	}
-        }
-	}
-
-	protected void updatePrimaryVersions(){
-		IProjectFacetVersion selectedVersion = fpjwc.getProjectFacetVersion(primaryProjectFacet);
-		SortedSet<IProjectFacetVersion> initialVersions = fpjwc.getAvailableVersions(primaryProjectFacet);
-        String [] items = new String[initialVersions.size()];
-        int i=0;
-        int selectedVersionIndex = -1;
-        for(Iterator <IProjectFacetVersion> iterator = initialVersions.iterator(); iterator.hasNext(); i++){
-        	items[i] = iterator.next().getVersionString();
-        	if(selectedVersionIndex == -1 && items[i].equals(selectedVersion.getVersionString())){
-        		selectedVersionIndex = i;
-        	}
-        }
-        primaryVersionCombo.clearSelection();
-        primaryVersionCombo.setItems(items);
-        primaryVersionCombo.select(selectedVersionIndex);
-	}
-	
-	public static class Messages extends NLS {
-		private static final String BUNDLE_NAME = "org.eclipse.wst.web.ui.internal.wizards.facetcreationpagemessages"; //$NON-NLS-1$
-
-		public static String FACET_VERSION;
-		
-		static {
-			// initialize resource bundle
-			NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-		}
-
-		private Messages() {
-		}
-	}
-	
-	protected void createPresetPanel(Composite top) {
-		final IFacetedProjectWorkingCopy fpjwc
-            = ( (ModifyFacetedProjectWizard) getWizard() ).getFacetedProjectWorkingCopy();
-		
-		final IFilter<IPreset> filter = new AbstractFilter<IPreset>()
-		{
-		    {
-		    	IFacetedProjectListener fpjwcListenerForPreset = new IFacetedProjectListener()
-	            {
-                    public void handleEvent( final IFacetedProjectEvent event )
-                    {
-                        handleProjectFacetsChangedEvent( (IProjectFacetsChangedEvent) event );
-                    }
-	            };
-	            facetedProjectListeners.add(fpjwcListenerForPreset);
-		        fpjwc.addListener(fpjwcListenerForPreset, IFacetedProjectEvent.Type.PROJECT_FACETS_CHANGED );
-		    }
-		    
-            public boolean check( final IPreset preset )
-            {
-                final IProjectFacetVersion primaryFacetVersion = getPrimaryFacetVersion();
-                return preset.getProjectFacets().contains( primaryFacetVersion );
-            }
-            
-            private void handleProjectFacetsChangedEvent( final IProjectFacetsChangedEvent event )
-            {
-                for( IProjectFacetVersion fv : event.getFacetsWithChangedVersions() )
-                {
-                    if( fv.getProjectFacet() == getPrimaryFacet() )
-                    {
-                        final IFilterEvent<IPreset> filterEvent
-                            = new FilterEvent<IPreset>( this, IFilterEvent.Type.FILTER_CHANGED );
-                        
-                        notifyListeners( filterEvent );
-                    }
-                }
-            }
-		};
-
-        final PresetSelectionPanel ppanel = new PresetSelectionPanel( top, fpjwc, filter );
-        
-        ppanel.setLayoutData( gdhfill() );
-	}
-	
-	public static boolean launchNewRuntimeWizard(Shell shell, IDataModel model) {
-		return launchNewRuntimeWizard(shell, model, null);
-	}
-	
-	public static boolean launchNewRuntimeWizard(Shell shell, final IDataModel model, String serverTypeID) 
-	{
-	    if( model == null )
-	    {
-	        return false;
-	    }
-	    
-		final DataModelPropertyDescriptor[] preAdditionDescriptors = model.getValidPropertyDescriptors(FACET_RUNTIME);
-		
-		final boolean[] keepWaiting = { true };
-		
-		final IDataModelListener listener = new IDataModelListener()
-		{
-            public void propertyChanged( final DataModelEvent event )
-            {
-                if( event.getPropertyName().equals( FACET_RUNTIME ) &&
-                    event.getFlag() == DataModelEvent.VALID_VALUES_CHG )
-                {
-                    synchronized( keepWaiting )
-                    {
-                        keepWaiting[ 0 ] = false;
-                        keepWaiting.notify();
-                    }
-                    
-                    model.removeListener( this );
-                }
-            }
-		};
-		
-		model.addListener( listener );
-		
-		boolean isOK = ServerUIUtil.showNewRuntimeWizard(shell, serverTypeID, null);
-		
-		if( isOK ) 
-		{
-		    // Do the rest of the processing in a separate thread. Since we are going to block
-		    // and wait, doing this on the UI thread can cause hangs.
-		    
-		    final Thread newRuntimeSelectionThread = new Thread()
-		    {
-		        @Override
-				public void run()
-		        {
-        		    // Causes the list of runtimes held by the RuntimeManager to be refreshed and 
-        		    // triggers events to listeners on that list.
-        		    
-        		    RuntimeManager.getRuntimes();
-        		    
-        		    // Wait until the list of valid values has updated to include the new runtime.
-        		    
-        		    synchronized( keepWaiting )
-        		    {
-        		        while( keepWaiting[ 0 ] == true )
-        		        {
-        		            try
-        		            {
-        		                keepWaiting.wait();
-        		            }
-        		            catch( InterruptedException e ) {}
-        		        }
-        		    }
-        		    
-        		    // Select the new runtime.
-        		    
-        			DataModelPropertyDescriptor[] postAdditionDescriptors = model.getValidPropertyDescriptors(FACET_RUNTIME);
-        			Object[] preAddition = new Object[preAdditionDescriptors.length];
-        			for (int i = 0; i < preAddition.length; i++) {
-        				preAddition[i] = preAdditionDescriptors[i].getPropertyValue();
-        			}
-        			Object[] postAddition = new Object[postAdditionDescriptors.length];
-        			for (int i = 0; i < postAddition.length; i++) {
-        				postAddition[i] = postAdditionDescriptors[i].getPropertyValue();
-        			}
-        			Object newAddition = getNewObject(preAddition, postAddition);
-        
-        			if (newAddition != null) // can this ever be null?
-        				model.setProperty(FACET_RUNTIME, newAddition);
-		        }
-		    };
-		    
-		    newRuntimeSelectionThread.start();
-		    
-		    return true;
-		}
-	    model.removeListener( listener );
-	    return false;
-	}
-	
-	public boolean internalLaunchNewRuntimeWizard(Shell shell, IDataModel model) {
-		return launchNewRuntimeWizard(shell, model, getModuleTypeID());
-	}
-	
-	protected String getModuleTypeID() {
-		return null;
-	}
-	
-	protected Combo serverTargetCombo;
-	protected NewProjectGroup projectNameGroup;
-	private final IFacetedProjectWorkingCopy fpjwc;
-	private final IFacetedProjectListener fpjwcListener;
-
-	public DataModelFacetCreationWizardPage(IDataModel dataModel, String pageName) 
-	{
-		super(dataModel, pageName);
-		
-        this.fpjwc = (IFacetedProjectWorkingCopy) this.model.getProperty( FACETED_PROJECT_WORKING_COPY );
-        
-        this.fpjwcListener = new IFacetedProjectListener()
-        {
-            public void handleEvent( final IFacetedProjectEvent event )
-            {
-                final Runnable runnable = new Runnable()
-                {
-                    public void run()
-                    {
-                        validatePage();
-                    }
-                };
-                
-                getContainer().getShell().getDisplay().asyncExec( runnable );
-            }
-        };
-        
-        this.fpjwc.addListener( this.fpjwcListener, IFacetedProjectEvent.Type.VALIDATION_PROBLEMS_CHANGED );
-	}
-
-	protected void createServerTargetComposite(Composite parent) {
-        Group group = new Group(parent, SWT.NONE);
-        group.setText(ResourceHandler.TargetRuntime);
-        group.setLayoutData(gdhfill());
-        group.setLayout(new GridLayout(2, false));
-		serverTargetCombo = new Combo(group, SWT.BORDER | SWT.READ_ONLY);
-		serverTargetCombo.setLayoutData(gdhfill());
-		Button newServerTargetButton = new Button(group, SWT.NONE);
-		newServerTargetButton.setText(Resources.newRuntimeButton);
-		GridDataFactory.defaultsFor(newServerTargetButton).applyTo(newServerTargetButton);		
-		newServerTargetButton.addSelectionListener(new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				if (!internalLaunchNewRuntimeWizard(getShell(), model)) {
-					//Bugzilla 135288
-					//setErrorMessage(ResourceHandler.InvalidServerTarget);
-				}
-			}
-		});
-		Control[] deps = new Control[]{newServerTargetButton};
-		synchHelper.synchCombo(serverTargetCombo, FACET_RUNTIME, deps);
-		if (serverTargetCombo.getSelectionIndex() == -1 && serverTargetCombo.getVisibleItemCount() != 0)
-			serverTargetCombo.select(0);
-	}
-
-	protected void createProjectGroup(Composite parent) {
-		IDataModel nestedProjectDM = model.getNestedModel(NESTED_PROJECT_DM);
-		nestedProjectDM.addListener(this);
-		projectNameGroup = new NewProjectGroup(parent, nestedProjectDM);
-	}
-
-	@Override
-	protected String[] getValidationPropertyNames() 
-	{
-	    return VALIDATION_PROPERTIES;
-	}
-
-	@Override
-	public void dispose() {
-		super.dispose();
-		if (projectNameGroup != null)
-			projectNameGroup.dispose();
-		
-		this.fpjwc.removeListener( this.fpjwcListener );
-		for (IFacetedProjectListener listener:this.facetedProjectListeners){
-			fpjwc.removeListener(listener);
-		}	
-		model = null;
-		
-	}
-
-	@Override
-	public void storeDefaultSettings() {
-		IDialogSettings settings = getDialogSettings();
-		DataModelFacetCreationWizardPage.saveRuntimeSettings(settings, model);
-	}
-
-	@Override
-	public void restoreDefaultSettings() {
-		IDialogSettings settings = getDialogSettings();
-		DataModelFacetCreationWizardPage.restoreRuntimeSettings(settings, model);
-	}
-	
-	public static void saveRuntimeSettings(IDialogSettings settings, IDataModel model){
-		if (settings != null) {
-			String[] mruRuntimeArray = settings.getArray(MRU_RUNTIME_STORE);
-			List mruRuntimes = new ArrayList();
-			if(mruRuntimeArray != null)
-				mruRuntimes.addAll(Arrays.asList(mruRuntimeArray));
-			
-			IRuntime runtime = (IRuntime) model.getProperty(IFacetProjectCreationDataModelProperties.FACET_RUNTIME);
-			String runtimeName = runtime == null ? NULL_RUNTIME : runtime.getName();
-			
-			if (mruRuntimes.contains(runtimeName)) {
-				mruRuntimes.remove(runtimeName);
-			}
-			mruRuntimes.add(0, runtimeName);
-			while (mruRuntimes.size() > 5) {
-				mruRuntimes.remove(5);
-			}
-			mruRuntimeArray = new String[mruRuntimes.size()];
-			for (int i = 0; i < mruRuntimeArray.length; i++) {
-				mruRuntimeArray[i] = (String) mruRuntimes.get(i);
-			}
-			settings.put(MRU_RUNTIME_STORE, mruRuntimeArray);
-		}
-	}
-	
-	public static void restoreRuntimeSettings(IDialogSettings settings, IDataModel model){
-		if (settings != null) {
-			if (!model.isPropertySet(IFacetProjectCreationDataModelProperties.FACET_RUNTIME)) {
-				boolean runtimeSet = false;
-				String[] mruRuntimeArray = settings.getArray(MRU_RUNTIME_STORE);
-				DataModelPropertyDescriptor[] descriptors = model.getValidPropertyDescriptors(IFacetProjectCreationDataModelProperties.FACET_RUNTIME);
-				List mruRuntimes = new ArrayList();
-				if (mruRuntimeArray == null) {
-					List defRuntimes = ProductManager.getDefaultRuntimes();
-					for (Iterator iter = defRuntimes.iterator(); iter.hasNext();)
-						mruRuntimes.add(((IRuntime) iter.next()).getName());
-				} else {
-					mruRuntimes.addAll(Arrays.asList(mruRuntimeArray));
-				}
-				if (!mruRuntimes.isEmpty()) {
-					for (int i = 0; i < mruRuntimes.size() && !runtimeSet; i++) {
-						for (int j = 0; j < descriptors.length-1 && !runtimeSet; j++) {
-							if (mruRuntimes.get(i).equals(((IRuntime)descriptors[j].getPropertyValue()).getName())) {
-								model.setProperty(IFacetProjectCreationDataModelProperties.FACET_RUNTIME, descriptors[j].getPropertyValue());
-								runtimeSet = true;
-							}
-						}
-						if(!runtimeSet && mruRuntimes.get(i).equals(NULL_RUNTIME)){
-							model.setProperty(IFacetProjectCreationDataModelProperties.FACET_RUNTIME, descriptors[descriptors.length -1].getPropertyValue());
-							runtimeSet = true;
-						}
-					}
-				}
-				if (!runtimeSet && descriptors.length > 0) {
-					model.setProperty(IFacetProjectCreationDataModelProperties.FACET_RUNTIME, descriptors[0].getPropertyValue());
-				}
-			}
-		}
-	}
-	
-
-	/**
-	 * Find first newObject that is not in the oldObjects array (using "==").
-	 * 
-	 * @param oldObjects
-	 * @param newObjects
-	 * @return first newObject not found in oldObjects, or <code>null</code> if all found.
-	 * 
-	 * @since 1.0.0
-	 */
-	private static Object getNewObject(Object[] oldObjects, Object[] newObjects) {
-		if (oldObjects != null && newObjects != null && oldObjects.length < newObjects.length) {
-			for (int i = 0; i < newObjects.length; i++) {
-				boolean found = false;
-				Object object = newObjects[i];
-				for (int j = 0; j < oldObjects.length; j++) {
-					if (oldObjects[j] == object) {
-						found = true;
-						break;
-					}
-				}
-				if (!found)
-					return object;
-			}
-		}
-		if (oldObjects == null && newObjects != null && newObjects.length == 1)
-			return newObjects[0];
-		return null;
-	}
-	
-	protected WorkingSetGroup createWorkingSetGroup(Composite composite,
-			IStructuredSelection selection, String[] supportedWorkingSetTypes) {
-		if (workingSetGroup != null)
-			return workingSetGroup;
-		workingSetGroup = new WorkingSetGroup(composite, selection,
-				supportedWorkingSetTypes);
-		return workingSetGroup;
-	}
-	
-	protected WorkingSetGroup createWorkingSetGroupPanel(Composite composite, String[] workingSetTypes) {
-		IStructuredSelection structuredSelection = null;
-		ISelection currentSelection = PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getSelectionService()
-				.getSelection();
-		if (currentSelection instanceof IStructuredSelection) {
-			structuredSelection = (IStructuredSelection) currentSelection;
-		}
-		WorkingSetGroup group = createWorkingSetGroup(composite, structuredSelection, workingSetTypes);
-		return group;
-	} 
-	
-	public IWorkingSet[] getSelectedWorkingSets() {
-		return workingSetGroup == null ? new IWorkingSet[0] : workingSetGroup
-				.getSelectedWorkingSets();
-	}
-	
-    private static final class Resources extends NLS
-    {
-        public static String newRuntimeButton;
-        
-        static
-        {
-            initializeMessages( DataModelFacetCreationWizardPage.class.getName(), Resources.class );
-        }
-    }
-	
-}
diff --git a/plugins/org.eclipse.wst.web.ui/static_web_ui/org/eclipse/wst/web/ui/internal/wizards/DataModelFacetCreationWizardPage.properties b/plugins/org.eclipse.wst.web.ui/static_web_ui/org/eclipse/wst/web/ui/internal/wizards/DataModelFacetCreationWizardPage.properties
deleted file mode 100644
index 8f54320..0000000
--- a/plugins/org.eclipse.wst.web.ui/static_web_ui/org/eclipse/wst/web/ui/internal/wizards/DataModelFacetCreationWizardPage.properties
+++ /dev/null
@@ -1 +0,0 @@
-newRuntimeButton = New &Runtime...
diff --git a/plugins/org.eclipse.wst.web.ui/static_web_ui/org/eclipse/wst/web/ui/internal/wizards/DataModelFacetInstallPage.java b/plugins/org.eclipse.wst.web.ui/static_web_ui/org/eclipse/wst/web/ui/internal/wizards/DataModelFacetInstallPage.java
deleted file mode 100644
index da031f5..0000000
--- a/plugins/org.eclipse.wst.web.ui/static_web_ui/org/eclipse/wst/web/ui/internal/wizards/DataModelFacetInstallPage.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2005 IBM 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:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.web.ui.internal.wizards;
-
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetInstallDataModelProperties;
-import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelProvider;
-import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizardPage;
-import org.eclipse.wst.common.project.facet.ui.IFacetWizardPage;
-import org.eclipse.wst.common.project.facet.ui.IWizardContext;
-
-public abstract class DataModelFacetInstallPage extends DataModelWizardPage implements IFacetWizardPage, IFacetInstallDataModelProperties {
-
-	public DataModelFacetInstallPage(String pageName) {
-		// TODO figure out a better way to do this without compromising the IDataModelWizard
-		// framework.
-		super(DataModelFactory.createDataModel(new AbstractDataModelProvider() {
-		}), pageName);
-	}
-
-	protected static GridData gdhfill() {
-		return new GridData(GridData.FILL_HORIZONTAL);
-	}
-
-	public void setWizardContext(IWizardContext context) {
-		// Intentionally empty
-	}
-
-	public void transferStateToConfig() {
-		// Intentionally empty
-	}
-
-	public void setConfig(final Object config) {
-		model.removeListener(this);
-		synchHelper.dispose();
-
-		model = (IDataModel) config;
-		model.addListener(this);
-		synchHelper = initializeSynchHelper(model);
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.web.ui/static_web_ui/org/eclipse/wst/web/ui/internal/wizards/IWstWebUIContextIds.java b/plugins/org.eclipse.wst.web.ui/static_web_ui/org/eclipse/wst/web/ui/internal/wizards/IWstWebUIContextIds.java
deleted file mode 100644
index 565a9f3..0000000
--- a/plugins/org.eclipse.wst.web.ui/static_web_ui/org/eclipse/wst/web/ui/internal/wizards/IWstWebUIContextIds.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM 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:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.web.ui.internal.wizards;
-
-public interface IWstWebUIContextIds {
-
-	public static final String PLUGIN_WST_WEB_UI = "org.eclipse.wst.web.ui."; //$NON-NLS-1$
-	
-	public static final String NEW_STATIC_WEB_PROJECT_PAGE1 = PLUGIN_WST_WEB_UI + "webw2000"; //$NON-NLS-1$
-	public static final String NEW_STATIC_WEB_PROJECT_PAGE2 = PLUGIN_WST_WEB_UI + "webw2100"; //$NON-NLS-1$
-	public static final String NEW_STATIC_WEB_PROJECT_PAGE3 = PLUGIN_WST_WEB_UI + "webw2200"; //$NON-NLS-1$
-	
-}
diff --git a/plugins/org.eclipse.wst.web.ui/static_web_ui/org/eclipse/wst/web/ui/internal/wizards/NewProjectDataModelFacetWizard.java b/plugins/org.eclipse.wst.web.ui/static_web_ui/org/eclipse/wst/web/ui/internal/wizards/NewProjectDataModelFacetWizard.java
deleted file mode 100644
index 6f30a45..0000000
--- a/plugins/org.eclipse.wst.web.ui/static_web_ui/org/eclipse/wst/web/ui/internal/wizards/NewProjectDataModelFacetWizard.java
+++ /dev/null
@@ -1,505 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2007 IBM 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:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.web.ui.internal.wizards;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.INewWizard;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkingSet;
-import org.eclipse.ui.wizards.newresource.BasicNewProjectResourceWizard;
-import org.eclipse.ui.wizards.newresource.BasicNewResourceWizard;
-import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetDataModelProperties;
-import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties;
-import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
-import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelProvider;
-import org.eclipse.wst.common.frameworks.datamodel.DataModelEvent;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModelListener;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
-import org.eclipse.wst.common.frameworks.internal.datamodel.DataModelPausibleOperationImpl;
-import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizardPage;
-import org.eclipse.wst.common.project.facet.core.FacetedProjectFramework;
-import org.eclipse.wst.common.project.facet.core.IFacetedProject;
-import org.eclipse.wst.common.project.facet.core.IFacetedProjectTemplate;
-import org.eclipse.wst.common.project.facet.core.IFacetedProjectWorkingCopy;
-import org.eclipse.wst.common.project.facet.core.IPreset;
-import org.eclipse.wst.common.project.facet.core.IProjectFacet;
-import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
-import org.eclipse.wst.common.project.facet.core.events.IFacetedProjectEvent;
-import org.eclipse.wst.common.project.facet.core.events.IFacetedProjectListener;
-import org.eclipse.wst.common.project.facet.core.runtime.IRuntime;
-import org.eclipse.wst.common.project.facet.ui.ModifyFacetedProjectWizard;
-import org.eclipse.wst.web.internal.DelegateConfigurationElement;
-import org.eclipse.wst.web.ui.internal.Logger;
-import org.eclipse.wst.web.ui.internal.WSTWebUIPlugin;
-
-public abstract class NewProjectDataModelFacetWizard extends ModifyFacetedProjectWizard implements INewWizard, IFacetProjectCreationDataModelProperties {
-
-	protected IDataModel model = null;
-	protected IFacetedProjectTemplate template;
-	private IWizardPage[] beginingPages;
-	private IConfigurationElement configurationElement;
-
-	public NewProjectDataModelFacetWizard(IDataModel model) 
-	{
-		this.model = ( model == null ? createDataModel() : model );
-		this.template = getTemplate();
-		
-		setFacetedProjectWorkingCopy((IFacetedProjectWorkingCopy)this.model.getProperty(FACETED_PROJECT_WORKING_COPY));
-		getFacetedProjectWorkingCopy().setFixedProjectFacets( this.template.getFixedProjectFacets() );
-		setDefaultPageImageDescriptor(getDefaultPageImageDescriptor());
-		setShowFacetsSelectionPage( false );
-	}
-	
-	public NewProjectDataModelFacetWizard() 
-	{
-	    this( null );
-	}
-
-	public IDataModel getDataModel() {
-		return model;
-	}
-
-	protected abstract IDataModel createDataModel();
-
-	protected abstract ImageDescriptor getDefaultPageImageDescriptor();
-
-	protected abstract IFacetedProjectTemplate getTemplate();
-
-	/**
-	 * Returns the first page that shows up before the facets page. If multiple pages are required,
-	 * also override {@link #createBeginingPages()}.
-	 * 
-	 * @return
-	 */
-	protected abstract IWizardPage createFirstPage();
-
-	/**
-	 * Subclasses should override to add more than one page before the facets page. If only one page
-	 * is required, then use {@link #createFirstPage()}. The default implementation will return the
-	 * result of {@link #createFirstPage()}.
-	 * 
-	 * @return
-	 */
-	protected IWizardPage[] createBeginingPages() {
-		return new IWizardPage[]{createFirstPage()};
-	}
-
-	@Override
-	public void addPages() {
-		beginingPages = createBeginingPages();
-		for (int i = 0; i < beginingPages.length; i++) {
-			addPage(beginingPages[i]);
-		}
-
-		super.addPages();
-
-        getFacetedProjectWorkingCopy().addListener
-        (
-            new IFacetedProjectListener()
-            {
-                public void handleEvent( final IFacetedProjectEvent event )
-                {
-                    facetSelectionChangedEvent();
-                }
-            },
-            IFacetedProjectEvent.Type.PROJECT_FACETS_CHANGED
-        );
-    }
-
-	@Override
-	public void createPageControls(Composite container) {
-		super.createPageControls(container);
-
-        final IPreset preset = this.template.getInitialPreset();
-        final IRuntime runtime = (IRuntime) model.getProperty( FACET_RUNTIME );
-
-        if( preset == null )
-        {
-            // If no preset is specified, select the runtime and it's default
-            // facets.
-            
-            setRuntimeAndDefaultFacets( runtime );
-        }
-        else
-        {
-            // If preset is specified, select the runtime only if supports all
-            // of the facets included in the preset.
-
-            getFacetedProjectWorkingCopy().setSelectedPreset( preset.getId() );
-            
-            boolean supports = false;
-            
-            if( runtime != null )
-            {
-                supports = true;
-                
-                for( Iterator itr = preset.getProjectFacets().iterator(); itr.hasNext(); )
-                {
-                    final IProjectFacetVersion fv = (IProjectFacetVersion) itr.next();
-                    
-                    if( ! runtime.supports( fv ) )
-                    {
-                        supports = false;
-                        break;
-                    }
-                }
-            }
-            
-            if( supports )
-            {
-                getFacetedProjectWorkingCopy().setTargetedRuntimes( Collections.singleton( runtime ) );
-            }
-            else
-            {
-                model.setProperty( FACET_RUNTIME, null );
-            }
-        }
-        
-        synchRuntimes();
-	}
-
-	@Override
-	public IWizardPage[] getPages() {
-		final IWizardPage[] base = super.getPages();
-		final IWizardPage[] pages = new IWizardPage[base.length + beginingPages.length];
-
-		for (int i = 0; i < beginingPages.length; i++) {
-			pages[i] = beginingPages[i];
-		}
-
-		System.arraycopy(base, 0, pages, beginingPages.length, base.length);
-
-		return pages;
-	}
-
-	public void init(IWorkbench workbench, IStructuredSelection selection) {
-	}
-
-	protected void synchRuntimes() 
-    {
-        final Boolean[] suppressBackEvents = { Boolean.FALSE };
-        
-		model.addListener(new IDataModelListener() {
-			public void propertyChanged(DataModelEvent event) {
-				if (IDataModel.VALUE_CHG == event.getFlag() || IDataModel.DEFAULT_CHG == event.getFlag()) {
-					if (FACET_RUNTIME.equals(event.getPropertyName())) {
-                        if( ! suppressBackEvents[ 0 ].booleanValue() ) {
-                            IRuntime runtime = (IRuntime) event.getProperty();
-                            setRuntimeAndDefaultFacets( runtime );
-                        }
-					}
-				}
-			}
-		});
-
-        getFacetedProjectWorkingCopy().addListener
-        ( 
-            new IFacetedProjectListener()
-            {
-                public void handleEvent( final IFacetedProjectEvent event )
-                {
-                    suppressBackEvents[ 0 ] = Boolean.TRUE;
-                    model.setProperty(FACET_RUNTIME, getFacetedProjectWorkingCopy().getPrimaryRuntime());
-                    suppressBackEvents[ 0 ] = Boolean.FALSE;
-                }
-            },
-            IFacetedProjectEvent.Type.PRIMARY_RUNTIME_CHANGED
-        );
-	}
-    
-    protected void setRuntimeAndDefaultFacets( final IRuntime runtime )
-    {
-        final IFacetedProjectWorkingCopy dm = getFacetedProjectWorkingCopy();
-
-        dm.setTargetedRuntimes( Collections.<IRuntime>emptySet() );
-
-        if( runtime != null )
-        {
-            final Set<IProjectFacetVersion> minFacets = new HashSet<IProjectFacetVersion>();
-
-            try
-            {
-                for( IProjectFacet f : dm.getFixedProjectFacets() )
-                {
-                    minFacets.add( f.getLatestSupportedVersion( runtime ) );
-                }
-            }
-            catch( CoreException e )
-            {
-                throw new RuntimeException( e );
-            }
-            
-            dm.setProjectFacets( minFacets );
-            
-            dm.setTargetedRuntimes( Collections.singleton( runtime ) );
-        }
-        
-        dm.setSelectedPreset( FacetedProjectFramework.DEFAULT_CONFIGURATION_PRESET_ID );
-    }
-    
-	public String getProjectName() {
-		return model.getStringProperty(IFacetProjectCreationDataModelProperties.FACET_PROJECT_NAME);
-	}
-
-	@Override
-	protected void performFinish(final IProgressMonitor monitor)
-
-	throws CoreException
-
-	{
-		monitor.beginTask("", 10); //$NON-NLS-1$
-		storeDefaultSettings();
-		try {
-			super.performFinish(new SubProgressMonitor(monitor, 8));
-
-            try {
-                getFacetProjectNotificationOperation().execute(new NullProgressMonitor(), null);
-            } catch (ExecutionException e) {
-                String msg = e.getMessage();
-                if( msg == null ) msg = ""; //$NON-NLS-1$
-                final IStatus st = new Status( IStatus.ERROR, WSTWebUIPlugin.PLUGIN_ID, 0, msg, e );
-                throw new CoreException( st );
-            }
-        } finally {
-			monitor.done();
-		}
-	}
-
-	@Override
-	public boolean performFinish() {
-		if (super.performFinish() == false) {
-			return false;
-		}
-
-		try {
-			postPerformFinish();
-		} catch (InvocationTargetException e) {
-			Logger.logException(e);
-		}
-
-		return true;
-	}
-
-	/**
-	 * <p>
-	 * Override to return the final perspective ID (if any). The final perspective ID can be
-	 * hardcoded by the subclass or determined programmatically (possibly using the value of a field
-	 * on the Wizard's WTP Operation Data Model).
-	 * </p>
-	 * <p>
-	 * The default implementation returns no perspective id unless overriden by product definition
-	 * via the "wtp.project.final.perspective" property.
-	 * </p>
-	 * 
-	 * @return Returns the ID of the Perspective which is preferred by this wizard upon completion.
-	 */
-
-	protected String getFinalPerspectiveID() {
-		return null;
-	}
-
-	/**
-	 * {@inheritDoc}
-	 * 
-	 * <p>
-	 * The configuration element is saved to use when the wizard completes in order to change the
-	 * current perspective using either (1) the value specified by {@link #getFinalPerspectiveID()}
-	 * or (2) the value specified by the finalPerspective attribute in the Wizard's configuration
-	 * element.
-	 * </p>
-	 * 
-	 * @see org.eclipse.core.runtime.IExecutableExtension#setInitializationData(org.eclipse.core.runtime.IConfigurationElement,
-	 *      java.lang.String, java.lang.Object)
-	 */
-	public final void setInitializationData(IConfigurationElement aConfigurationElement, String aPropertyName, Object theData) throws CoreException {
-		configurationElement = aConfigurationElement;
-		doSetInitializeData(aConfigurationElement, aPropertyName, theData);
-
-	}
-
-	/**
-	 * <p>
-	 * Override method for clients that wish to take advantage of the information provided by
-	 * {@see #setInitializationData(IConfigurationElement, String, Object)}.
-	 * </p>
-	 * 
-	 * @param aConfigurationElement
-	 *            The configuration element provided from the templated method.
-	 * @param aPropertyName
-	 *            The property name provided from the templated method.
-	 * @param theData
-	 *            The data provided from the templated method.
-	 */
-	protected void doSetInitializeData(IConfigurationElement aConfigurationElement, String aPropertyName, Object theData) {
-		// Default do nothing
-	}
-
-	/**
-	 * <p>
-	 * Returns the an id component used for Activity filtering.
-	 * </p>
-	 * 
-	 * <p>
-	 * The Plugin ID is determined from the configuration element specified in
-	 * {@see #setInitializationData(IConfigurationElement, String, Object)}.
-	 * </p>
-	 * 
-	 * @return Returns the plugin id associated with this wizard
-	 */
-	public final String getPluginId() {
-		return (configurationElement != null) ? configurationElement.getDeclaringExtension().getNamespace() : ""; //$NON-NLS-1$
-	}
-
-	/**
-	 * 
-	 * <p>
-	 * Invoked after the user has clicked the "Finish" button of the wizard. The default
-	 * implementation will attempt to update the final perspective to the value specified by
-	 * { @link #getFinalPerspectiveID() }
-	 * </p>
-	 * 
-	 * @throws InvocationTargetException
-	 * 
-	 * @see org.eclipse.wst.common.frameworks.internal.ui.wizard.WTPWizard#postPerformFinish()
-	 */
-	protected void postPerformFinish() throws InvocationTargetException {
-		String projName = getProjectName();
-		IProject newProject = ResourcesPlugin.getWorkspace().getRoot().getProject(projName);
-		IWorkbench workbench = WSTWebUIPlugin.getDefault().getWorkbench();
-		
-		// add to the selected working sets
-		if (newProject != null && 
-				beginingPages != null && 
-				beginingPages.length > 0 && 
-				beginingPages[0] instanceof DataModelFacetCreationWizardPage) {
-			DataModelFacetCreationWizardPage mainPage = (DataModelFacetCreationWizardPage) beginingPages[0];
-			IWorkingSet[] workingSets = mainPage.getSelectedWorkingSets();
-			workbench.getWorkingSetManager().addToWorkingSets(newProject, workingSets);
-		}
-		
-		// open the "final" perspective
-		if (getFinalPerspectiveID() != null && getFinalPerspectiveID().length() > 0) {
-			final IConfigurationElement element = new DelegateConfigurationElement(configurationElement) {
-				@Override
-				public String getAttribute(String aName) {
-					if (aName.equals("finalPerspective")) { //$NON-NLS-1$
-						return getFinalPerspectiveID();
-					}
-					return super.getAttribute(aName);
-				}
-			};
-			BasicNewProjectResourceWizard.updatePerspective(element);
-		} else
-			BasicNewProjectResourceWizard.updatePerspective(configurationElement);
-
-		// select and reveal
-		BasicNewResourceWizard.selectAndReveal(newProject, workbench.getActiveWorkbenchWindow());
-	}
-
-	protected IDataModelOperation getFacetProjectNotificationOperation() {
-		return new DataModelPausibleOperationImpl(new AbstractDataModelOperation(this.model) {
-			@Override
-			public String getID() {
-				return NewProjectDataModelFacetWizard.class.getName();
-			}
-
-			@Override
-			public IStatus execute(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
-				return AbstractDataModelProvider.OK_STATUS;
-			}
-		});
-	}
-
-	/**
-	 * Need to keep the model in sync with the UI. This method will pickup changes coming from the
-	 * UI and push them into the model
-	 */
-	protected void facetSelectionChangedEvent() {
-	    Set actions = getFacetedProjectWorkingCopy().getProjectFacetActions();
-		Iterator iterator = actions.iterator();
-		Set activeIds = new HashSet();
-		while (iterator.hasNext()) {
-			IFacetedProject.Action action = (IFacetedProject.Action) iterator.next();
-			String id = action.getProjectFacetVersion().getProjectFacet().getId();
-			activeIds.add(id);
-		}
-		// First handle all the actions tracked by IDataModels
-		FacetDataModelMap dataModelMap = (FacetDataModelMap) model.getProperty(FACET_DM_MAP);
-		iterator = dataModelMap.keySet().iterator();
-		while (iterator.hasNext()) {
-			String id = (String) iterator.next();
-			IDataModel configDM = (IDataModel) dataModelMap.get(id);
-			boolean active = activeIds.contains(id);
-			configDM.setBooleanProperty(IFacetDataModelProperties.SHOULD_EXECUTE, active);
-			activeIds.remove(id);
-		}
-		// Now handle the actions not tracked by IDataModels
-		FacetActionMap actionMap = (FacetActionMap) model.getProperty(FACET_ACTION_MAP);
-		actionMap.clear();
-		iterator = actions.iterator();
-		while (iterator.hasNext()) {
-			IFacetedProject.Action action = (IFacetedProject.Action) iterator.next();
-			String id = action.getProjectFacetVersion().getProjectFacet().getId();
-			if (activeIds.contains(id)) {
-				actionMap.add(action);
-			}
-		}
-		model.notifyPropertyChange(FACET_RUNTIME, IDataModel.VALID_VALUES_CHG);
-	}
-
-	protected void storeDefaultSettings() {
-		IWizardPage[] pages = getPages();
-		for (int i = 0; i < pages.length; i++)
-			storeDefaultSettings(pages[i], i);
-	}
-
-	/**
-	 * Subclasses may override if they need to do something special when storing the default
-	 * settings for a particular page.
-	 * 
-	 * @param page
-	 * @param pageIndex
-	 */
-	protected void storeDefaultSettings(IWizardPage page, int pageIndex) {
-		if (page instanceof DataModelWizardPage)
-			((DataModelWizardPage) page).storeDefaultSettings();
-	}
-
-	@Override
-	public void dispose() {
-		if(this.model != null){
-			this.model.dispose();
-		}
-		super.dispose();
-	}
-	
-}
diff --git a/plugins/org.eclipse.wst.web.ui/static_web_ui/org/eclipse/wst/web/ui/internal/wizards/SimpleWebFacetInstallPage.java b/plugins/org.eclipse.wst.web.ui/static_web_ui/org/eclipse/wst/web/ui/internal/wizards/SimpleWebFacetInstallPage.java
deleted file mode 100644
index f4e9286..0000000
--- a/plugins/org.eclipse.wst.web.ui/static_web_ui/org/eclipse/wst/web/ui/internal/wizards/SimpleWebFacetInstallPage.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM 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:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.web.ui.internal.wizards;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.wst.project.facet.ISimpleWebFacetInstallDataModelProperties;
-import org.eclipse.wst.web.internal.ResourceHandler;
-
-public class SimpleWebFacetInstallPage extends DataModelFacetInstallPage implements ISimpleWebFacetInstallDataModelProperties {
-
-	private Label configFolderLabel;
-	private Text configFolder;
-	private Label contextRootLabel;
-	private Text contextRoot;
-	
-	public SimpleWebFacetInstallPage() {
-		super("simpleweb.facet.install.page"); //$NON-NLS-1$
-		setTitle(ResourceHandler.StaticWebProjectWizardBasePage_Page_Title);
-		setDescription(ResourceHandler.ConfigureSettings);
-	}
-
-	@Override
-	protected String[] getValidationPropertyNames() {
-		return new String[]{CONTEXT_ROOT, CONTENT_DIR};
-	}
-
-	@Override
-	protected Composite createTopLevelComposite(Composite parent) {
-		setInfopopID(IWstWebUIContextIds.NEW_STATIC_WEB_PROJECT_PAGE3);
-		final Composite composite = new Composite(parent, SWT.NONE);
-		composite.setLayout(new GridLayout(1, false));
-		
-		this.contextRootLabel = new Label(composite, SWT.NONE);
-		this.contextRootLabel.setText(ResourceHandler.StaticContextRootComposite_Context_Root_Label);
-		this.contextRootLabel.setLayoutData(gdhfill());
-
-		this.contextRoot = new Text(composite, SWT.BORDER);
-		this.contextRoot.setLayoutData(gdhfill());
-		this.contextRoot.setData("label", this.contextRootLabel); //$NON-NLS-1$
-		synchHelper.synchText(contextRoot, CONTEXT_ROOT, new Control[]{contextRootLabel});
-		
-		configFolderLabel = new Label(composite, SWT.NONE);
-		configFolderLabel.setText(ResourceHandler.StaticWebSettingsPropertiesPage_Web_Content_Label);
-		configFolderLabel.setLayoutData(gdhfill());
-
-		configFolder = new Text(composite, SWT.BORDER);
-		configFolder.setLayoutData(gdhfill());
-		configFolder.setData("label", configFolderLabel); //$NON-NLS-1$
-		synchHelper.synchText(configFolder, CONTENT_DIR, null);
-	    Dialog.applyDialogFont(parent);
-		
-		return composite;
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.web.ui/static_web_ui/org/eclipse/wst/web/ui/internal/wizards/SimpleWebProjectFirstPage.java b/plugins/org.eclipse.wst.web.ui/static_web_ui/org/eclipse/wst/web/ui/internal/wizards/SimpleWebProjectFirstPage.java
deleted file mode 100644
index ec05607..0000000
--- a/plugins/org.eclipse.wst.web.ui/static_web_ui/org/eclipse/wst/web/ui/internal/wizards/SimpleWebProjectFirstPage.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM 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:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.web.ui.internal.wizards;
-
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.wst.common.componentcore.internal.util.IModuleConstants;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.web.internal.ResourceHandler;
-import org.eclipse.wst.web.ui.internal.WSTWebUIPlugin;
-
-public class SimpleWebProjectFirstPage extends DataModelFacetCreationWizardPage {
-
-	public SimpleWebProjectFirstPage(IDataModel dataModel, String pageName) {
-		super(dataModel, pageName);
-		setDescription(ResourceHandler.StaticWebProjectWizardBasePage_Page_Description); 
-		setTitle(ResourceHandler.StaticWebProjectWizardBasePage_Page_Title); 
-		setImageDescriptor(WSTWebUIPlugin.getDefault().getImageDescriptor("newwprj_wiz")); //$NON-NLS-1$
-		setInfopopID(IWstWebUIContextIds.NEW_STATIC_WEB_PROJECT_PAGE1);
-	}
-	
-	@Override
-	protected String getModuleTypeID() {
-		return IModuleConstants.WST_WEB_MODULE;
-	}
-
-	@Override
-	protected Composite createTopLevelComposite(Composite parent) {
-        final Composite top = super.createTopLevelComposite(parent);
-        createWorkingSetGroupPanel(top, new String[] { RESOURCE_WORKING_SET });
-		return top;
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.web.ui/static_web_ui/org/eclipse/wst/web/ui/internal/wizards/SimpleWebProjectWizard.java b/plugins/org.eclipse.wst.web.ui/static_web_ui/org/eclipse/wst/web/ui/internal/wizards/SimpleWebProjectWizard.java
deleted file mode 100644
index 8749672..0000000
--- a/plugins/org.eclipse.wst.web.ui/static_web_ui/org/eclipse/wst/web/ui/internal/wizards/SimpleWebProjectWizard.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM 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:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.web.ui.internal.wizards;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.project.facet.core.IFacetedProjectTemplate;
-import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
-import org.eclipse.wst.project.facet.IProductConstants;
-import org.eclipse.wst.project.facet.ProductManager;
-import org.eclipse.wst.project.facet.SimpleWebFacetProjectCreationDataModelProvider;
-import org.eclipse.wst.web.internal.ResourceHandler;
-import org.eclipse.wst.web.ui.internal.WSTWebUIPlugin;
-
-public class SimpleWebProjectWizard extends NewProjectDataModelFacetWizard {
-
-	public SimpleWebProjectWizard(IDataModel model) {
-		super(model);
-		setWindowTitle(ResourceHandler.StaticWebProjectCreationWizard_Wizard_Title);
-	}
-
-	public SimpleWebProjectWizard() {
-		super();
-		setWindowTitle(ResourceHandler.StaticWebProjectCreationWizard_Wizard_Title);
-	}
-
-	@Override
-	protected IDataModel createDataModel() {
-		return DataModelFactory.createDataModel(new SimpleWebFacetProjectCreationDataModelProvider());
-	}
-
-	@Override
-	protected ImageDescriptor getDefaultPageImageDescriptor() {
-		return WSTWebUIPlugin.getDefault().getImageDescriptor("newwprj_wiz"); //$NON-NLS-1$
-	}
-
-	@Override
-	protected IFacetedProjectTemplate getTemplate() {
-		return ProjectFacetsManager.getTemplate("template.wst.web"); //$NON-NLS-1$
-	}
-
-	@Override
-	protected IWizardPage createFirstPage() {
-		return new SimpleWebProjectFirstPage(model, "first.page"); //$NON-NLS-1$
-	}
-	
-	@Override
-	protected String getFinalPerspectiveID() {
-        return ProductManager.getProperty(IProductConstants.FINAL_PERSPECTIVE_STATICWEB);
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.web.ui/static_web_ui/org/eclipse/wst/web/ui/internal/wizards/facetcreationpagemessages.properties b/plugins/org.eclipse.wst.web.ui/static_web_ui/org/eclipse/wst/web/ui/internal/wizards/facetcreationpagemessages.properties
deleted file mode 100644
index 08afb68..0000000
--- a/plugins/org.eclipse.wst.web.ui/static_web_ui/org/eclipse/wst/web/ui/internal/wizards/facetcreationpagemessages.properties
+++ /dev/null
@@ -1 +0,0 @@
-FACET_VERSION= &version
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.web/.classpath b/plugins/org.eclipse.wst.web/.classpath
deleted file mode 100644
index 15a90f8..0000000
--- a/plugins/org.eclipse.wst.web/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="static_web_project"/>
-	<classpathentry kind="src" path="property_files"/>
-	<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="output" path="bin"/>
-</classpath>
diff --git a/plugins/org.eclipse.wst.web/.gitignore b/plugins/org.eclipse.wst.web/.gitignore
deleted file mode 100644
index 5e56e04..0000000
--- a/plugins/org.eclipse.wst.web/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-/bin
diff --git a/plugins/org.eclipse.wst.web/.project b/plugins/org.eclipse.wst.web/.project
deleted file mode 100644
index fb86548..0000000
--- a/plugins/org.eclipse.wst.web/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.wst.web</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/plugins/org.eclipse.wst.web/.settings/org.eclipse.jdt.core.prefs b/plugins/org.eclipse.wst.web/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 51c2889..0000000
--- a/plugins/org.eclipse.wst.web/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,97 +0,0 @@
-#Tue Sep 29 10:42:06 EDT 2009
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.comparingIdentical=error
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=error
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.emptyStatement=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=warning
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.incompatibleJDKLevel=ignore
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=error
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.builder.cleanOutputFolder=clean
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=error
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=enabled
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=error
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
-org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=error
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
-org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
-org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=error
-org.eclipse.jdt.core.builder.invalidClasspath=abort
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error
-org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=error
-org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
-org.eclipse.jdt.core.codeComplete.argumentSuffixes=
-org.eclipse.jdt.core.codeComplete.argumentPrefixes=
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=error
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=error
-org.eclipse.jdt.core.compiler.problem.nullReference=error
-org.eclipse.jdt.core.compiler.source=1.5
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.builder.duplicateResourceTask=warning
-org.eclipse.jdt.core.compiler.problem.fieldHiding=error
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=error
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=error
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning
-org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=error
-eclipse.preferences.version=1
-org.eclipse.jdt.core.incompleteClasspath=error
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=error
-org.eclipse.jdt.core.compiler.problem.deadCode=error
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=enabled
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeUncheckedExceptions=disabled
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning
-org.eclipse.jdt.core.codeComplete.fieldPrefixes=
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=error
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=warning
-org.eclipse.jdt.core.circularClasspath=error
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.codeComplete.fieldSuffixes=
-org.eclipse.jdt.core.codeComplete.localSuffixes=
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=error
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.codeComplete.localPrefixes=
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=error
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
diff --git a/plugins/org.eclipse.wst.web/.settings/org.eclipse.jdt.ui.prefs b/plugins/org.eclipse.wst.web/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 9602203..0000000
--- a/plugins/org.eclipse.wst.web/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,6 +0,0 @@
-#Tue Sep 29 10:42:06 EDT 2009
-org.eclipse.jdt.ui.exception.name=e
-eclipse.preferences.version=1
-org.eclipse.jdt.ui.keywordthis=false
-org.eclipse.jdt.ui.overrideannotation=true
-org.eclipse.jdt.ui.gettersetter.use.is=true
diff --git a/plugins/org.eclipse.wst.web/META-INF/MANIFEST.MF b/plugins/org.eclipse.wst.web/META-INF/MANIFEST.MF
deleted file mode 100644
index dfdd603..0000000
--- a/plugins/org.eclipse.wst.web/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,28 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %Bundle-Name.0
-Bundle-SymbolicName: org.eclipse.wst.web; singleton:=true
-Bundle-Version: 1.1.900.qualifier
-Bundle-Activator: org.eclipse.wst.web.internal.WSTWebPlugin
-Bundle-Vendor: %Bundle-Vendor.0
-Bundle-Localization: plugin
-Export-Package: org.eclipse.wst.project.facet,
- org.eclipse.wst.web.internal;x-internal:=true,
- org.eclipse.wst.web.internal.deployables;x-internal:=true,
- org.eclipse.wst.web.internal.facet,
- org.eclipse.wst.web.internal.operation;x-internal:=true
-Require-Bundle: org.eclipse.core.resources;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.core.runtime;bundle-version="[3.13.0,4.0.0)",
- org.eclipse.core.commands;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.wst.common.frameworks;bundle-version="[1.2.0,2.0.0)",
- org.eclipse.wst.validation;bundle-version="[1.2.0,2.0.0)",
- org.eclipse.wst.common.emfworkbench.integration;bundle-version="[1.2.0,2.0.0)",
- org.eclipse.wst.server.core;bundle-version="[1.0.102,2.0.0)",
- org.eclipse.jem.util;bundle-version="[2.0.0,3.0.0)",
- org.eclipse.wst.common.modulecore;bundle-version="[1.2.0,2.0.0)",
- org.eclipse.emf.ecore;bundle-version="[2.2.0,3.0.0)",
- org.eclipse.wst.common.project.facet.core;bundle-version="[1.1.0,2.0.0)",
- com.ibm.icu;bundle-version="3.8.1",
- org.eclipse.wst.common.environment;bundle-version="[1.0.100,1.1.0)"
-Eclipse-LazyStart: true
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/plugins/org.eclipse.wst.web/build.properties b/plugins/org.eclipse.wst.web/build.properties
deleted file mode 100644
index 182b94a..0000000
--- a/plugins/org.eclipse.wst.web/build.properties
+++ /dev/null
@@ -1,11 +0,0 @@
-bin.includes = plugin.xml,\
-               plugin.properties,\
-               icons/,\
-               META-INF/,\
-               about.html,\
-               .
-jars.compile.order = .
-src.includes = component.xml
-output.. = bin/
-source.. = static_web_project/,\
-           property_files/
diff --git a/plugins/org.eclipse.wst.web/component.xml b/plugins/org.eclipse.wst.web/component.xml
deleted file mode 100644
index 89207cb..0000000
--- a/plugins/org.eclipse.wst.web/component.xml
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><component  xmlns="http://eclipse.org/wtp/releng/tools/component-model" name="org.eclipse.wst.web"><component-depends unrestricted="true"></component-depends><plugin id="org.eclipse.wst.web" fragment="false"/><plugin id="org.eclipse.wst.web.ui" fragment="false"/></component>
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.web/icons/full/obj16/web_application.gif b/plugins/org.eclipse.wst.web/icons/full/obj16/web_application.gif
deleted file mode 100644
index 09f609d..0000000
--- a/plugins/org.eclipse.wst.web/icons/full/obj16/web_application.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/org.eclipse.wst.web/icons/full/wizban/newwprj_wiz.png b/plugins/org.eclipse.wst.web/icons/full/wizban/newwprj_wiz.png
deleted file mode 100644
index 1edd090..0000000
--- a/plugins/org.eclipse.wst.web/icons/full/wizban/newwprj_wiz.png
+++ /dev/null
Binary files differ
diff --git a/plugins/org.eclipse.wst.web/plugin.properties b/plugins/org.eclipse.wst.web/plugin.properties
deleted file mode 100644
index d686a74..0000000
--- a/plugins/org.eclipse.wst.web/plugin.properties
+++ /dev/null
@@ -1,11 +0,0 @@
-#########################################
-# (c) Copyright IBM Corp. 2000, 2001.
-# All Rights Reserved.
-#########################################
-
-Bundle-Vendor.0 = Eclipse Web Tools Platform
-Bundle-Name.0 = Simple Web Plug-in
-
-SIMPLE_WEB_LABEL=Static Web Module
-SIMPLE_WEB_DESCRIPTION=Enables the project to be deployed as a static web module.
-SIMPLE_WEB_TEMPLATE=Static Web Project
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.web/plugin.xml b/plugins/org.eclipse.wst.web/plugin.xml
deleted file mode 100644
index 0fd8b4d..0000000
--- a/plugins/org.eclipse.wst.web/plugin.xml
+++ /dev/null
@@ -1,98 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-   <extension-point id="runtimePresetMappings" name="Runtime Preset Mappings Extension" schema="schema/runtimePresetMappings.exsd"/> 
-   <extension
-         point="org.eclipse.wst.server.core.moduleFactories">
-      <moduleFactory
-            projects="true"
-            class="org.eclipse.wst.web.internal.deployables.StaticWebDeployableFactory"
-            id="org.eclipse.wst.web.internal.deployables.static">
-         <moduleType
-               versions="1.0, 1.2, 1.3, 1.4"
-               types="wst.web">
-         </moduleType>
-      </moduleFactory>
-     </extension>
-     
-    <extension
-         point="org.eclipse.wst.server.core.moduleArtifactAdapters">
-       <moduleArtifactAdapter
-            id="org.eclipse.jst.web.server.webstatic1"
-            class="org.eclipse.wst.web.internal.deployables.StaticWebDeployableObjectAdapter">
-         <enablement>
-           <with variable="selection">
-             <adapt type="org.eclipse.core.resources.IProject">
-             <test forcePluginActivation="true"
-							property="org.eclipse.wst.common.project.facet.core.projectFacet"
-							value="wst.web" />
-			 </adapt>
-           </with>
-         </enablement>
-       </moduleArtifactAdapter>
-       <moduleArtifactAdapter
-            id="org.eclipse.jst.web.server.webstatic2"
-            class="org.eclipse.wst.web.internal.deployables.StaticWebDeployableObjectAdapter">
-         <enablement>
-           <with variable="selection">
-             <adapt type="org.eclipse.core.resources.IFile">
-             <test forcePluginActivation="true"
-							property="org.eclipse.wst.common.project.facet.core.projectFacet"
-							value="wst.web" />
-			 </adapt>
-           </with>
-         </enablement>
-      </moduleArtifactAdapter>   
-   </extension>
-   <extension point="org.eclipse.core.runtime.adapters">
-         <factory
-             class="org.eclipse.wst.web.internal.deployables.StaticWebDeployableObjectAdapter"
-             adaptableType="org.eclipse.core.resources.IProject">
-            <adapter type="org.eclipse.wst.web.internal.deployables.IStaticWebModuleArtifact"/>
-        </factory>    
-   </extension> 
-   
-    <!--============================-->
-   <!-- Builder Provider registrations-->
-   <!--============================-->
-	<extension
-         point="org.eclipse.wst.common.frameworks.DataModelProviderExtension">
-     	<ProviderDefinesType
-      		providerType="wst.web.builder"
-      		providerID="org.eclipse.wst.common.componentcore.internal.builder.WorkbenchComponentBuilderDataModelProvider"/>
-		<DataModelProvider
-            class="org.eclipse.wst.web.internal.operation.SimpleWebModuleCreationDataModelProvider"
-            id="org.eclipse.wst.web.internal.operation.SimpleWebModuleCreationDataModelProvider"/>
-	</extension>
-	
-  <!-- Project Facets -->
-	<extension point="org.eclipse.wst.common.project.facet.core.facets">
-
-    <project-facet id="wst.web">
-      <label>%SIMPLE_WEB_LABEL</label>
-      <description>%SIMPLE_WEB_DESCRIPTION</description>
-      <property name="hide.version" value="true"/>
-    </project-facet>
-
-    <project-facet-version facet="wst.web" version="1.0">
-      <action type="install" id="wst.web.install">
-        <delegate class="org.eclipse.wst.project.facet.SimpleWebFacetInstallDelegate"/>
-        <config-factory class="org.eclipse.wst.project.facet.SimpleWebFacetInstallDataModelProvider"/>
-      </action>
-      <action type="uninstall" id="wst.web.uninstall">
-        <delegate class="org.eclipse.wst.project.facet.SimpleWebFacetUninstallDelegate"/>
-        <config-factory class="org.eclipse.wst.project.facet.SimpleWebFacetInstallDataModelProvider"/>
-      </action>
-      <constraint>
-        <conflicts group="modules"/>
-      </constraint>
-      <group-member id="modules"/>
-    </project-facet-version>
-        
-    <template id="template.wst.web">
-      <label>%SIMPLE_WEB_TEMPLATE</label>
-      <fixed facet="wst.web"/>
-    </template>
-
-  </extension>	
-</plugin>
diff --git a/plugins/org.eclipse.wst.web/pom.xml b/plugins/org.eclipse.wst.web/pom.xml
deleted file mode 100644
index cf2df51..0000000
--- a/plugins/org.eclipse.wst.web/pom.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Copyright (c) 2012, 2013 Eclipse Foundation and others.
-  All rights reserved. This program and the accompanying materials
-  are made available under the terms of the Eclipse Distribution License v1.0
-  which accompanies this distribution, and is available at
-  http://www.eclipse.org/org/documents/edl-v10.php
- 
-  Contributors:
-    Thanh Ha (Eclipse Foundation) - initial implementation
--->
-
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
-    <version>3.6.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
-  </parent>
-
-  <groupId>org.eclipse.webtools.javaee</groupId>
-  <artifactId>org.eclipse.wst.web</artifactId>
-  <version>1.1.900-SNAPSHOT</version>
-  <packaging>eclipse-plugin</packaging>
-</project>
diff --git a/plugins/org.eclipse.wst.web/property_files/staticwebproject.properties b/plugins/org.eclipse.wst.web/property_files/staticwebproject.properties
deleted file mode 100644
index c3c3687..0000000
--- a/plugins/org.eclipse.wst.web/property_files/staticwebproject.properties
+++ /dev/null
@@ -1,23 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2006 IBM 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:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-StaticWebProjectCreationWizard_Wizard_Title=New Static Web Project
-StaticWebProjectWizardBasePage_Page_Description=Create a Web project for simple content (HTML files) only.
-StaticWebSettingsPropertiesPage_Web_Content_Label=&Web content folder name:
-StaticContextRootComposite_Context_Root_Label=&Context root:
-StaticWebProjectWizardBasePage_Page_Title=Static Web Project
-StaticWebSettingsPropertiesPage_Not_available_for_closed_projects=Web settings are not available for a closed project.
-TargetRuntime=Target r&untime
-NewDotDotDot=N&ew...
-InvalidServerTarget=Invalid target server selected.
-ConfigureSettings=Configure Static Web module settings.
-Context_Root_cannot_be_empty_2=Context root cannot be empty
-Names_cannot_contain_whitespace=Context root cannot contain whitespace
-The_character_is_invalid_in_a_context_root=The character ''{0}'' is invalid in a context root.
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.web/schema/runtimePresetMappings.exsd b/plugins/org.eclipse.wst.web/schema/runtimePresetMappings.exsd
deleted file mode 100644
index 3d27116..0000000
--- a/plugins/org.eclipse.wst.web/schema/runtimePresetMappings.exsd
+++ /dev/null
@@ -1,141 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.wst.web" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="org.eclipse.wst.web" id="RuntimePresetMappings" name="Runtime Preset Mappings Extension"/>
-      </appinfo>
-      <documentation>
-         This extension point allows the configuration of a default facet preset for any Runtime Type ID, Facet ID &amp; Fact Version combination.  For example, given runtime type X, facet jst.web, and version 2.4, the preset Y should be selected by default where as given runtime type X, facet jst.web, and version 2.5, the preset Z should be selected by default.
-
-For each of the four facetRuntimeTypeID, facetRuntimeVersion, facetID, facetVersion the following pattern is used to ease the definition process.  The pattern specified allows a comma deliminated list of possible values.  For example to match only &quot;1.0&quot; the pattern should be &quot;1.0&quot;.  To match multiple values, say 1.0, 2.0, and 3.0, use &quot;1.0,2.0,3.0&quot;.  Asterests may be used to specify multiple values.  For example, &quot;1.*&quot; will match any values starting with &apos;1.&apos; including 1., 1.0, 1.1, 1.2, but not 1  Likewise, &quot;*.0&quot; will match any values ending with &apos;.0&apos; including 1.0, 2.0, 3.0, but not 1 or 0  Asterists may be added both at the begining and end of a string, so &quot;*00*&quot; will match any string that contains &apos;00&apos; such as 00, 100, 1001.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <annotation>
-         <appinfo>
-            <meta.element />
-         </appinfo>
-      </annotation>
-      <complexType>
-         <sequence minOccurs="1" maxOccurs="unbounded">
-            <element ref="mapping" minOccurs="1" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="mapping">
-      <annotation>
-         <documentation>
-            Each mapping element defineds a mapping from (runtimeid, facetid, facetversion) to presetid.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="facetRuntimeTypeID" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Follows the pattern outlined in the overview
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="facetRuntimeVersion" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Follows the pattern outlined in the overview
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="facetID" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Follows the pattern outlined in the overview
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="facetVersion" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Follows the pattern outlined in the overview
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="presetID" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="since"/>
-      </appinfo>
-      <documentation>
-         [Enter the first release in which this extension point appears.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="examples"/>
-      </appinfo>
-      <documentation>
-         [Enter extension point usage example here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="apiinfo"/>
-      </appinfo>
-      <documentation>
-         [Enter API information here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="implementation"/>
-      </appinfo>
-      <documentation>
-         [Enter information about supplied implementation of this extension point.]
-      </documentation>
-   </annotation>
-
-
-</schema>
diff --git a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/project/facet/IProductConstants.java b/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/project/facet/IProductConstants.java
deleted file mode 100644
index a1dac21..0000000
--- a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/project/facet/IProductConstants.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2012 IBM 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:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.project.facet;
-
-/**
- * These constants define the set of properties that this pluging expects to
- * be available via <code>IProduct.getProperty(String)</code>. The status of
- * this interface and the facilities offered is highly provisional. 
- * Productization support will be reviewed and possibly modified in future 
- * releases.
- * <p>This interface is not intended to be implemented by clients.</p>
- * 
- * @noimplement
- * 
- * @see org.eclipse.core.runtime.IProduct#getProperty(String)
- */
-
-public interface IProductConstants {   
-    
-    public static final String APPLICATION_CONTENT_FOLDER = "earContent"; //$NON-NLS-1$
-	public static final String WEB_CONTENT_FOLDER = "webContent"; //$NON-NLS-1$
-	public static final String EJB_CONTENT_FOLDER = "ejbContent"; //$NON-NLS-1$
-	public static final String APP_CLIENT_CONTENT_FOLDER = "appClientContent"; //$NON-NLS-1$
-	public static final String JCA_CONTENT_FOLDER = "jcaContent"; //$NON-NLS-1$
-	public static final String DEFAULT_SOURCE_FOLDER = "defaultSource"; //$NON-NLS-1$
-	public static final String ADD_TO_EAR_BY_DEFAULT = "addToEarByDefault"; //$NON-NLS-1$
-	public static final String ADD_TO_EAR_RUNTIME_EXCEPTIONS = "addToEARruntimeExceptions"; //$NON-NLS-1$
-	public static final String OUTPUT_FOLDER = "outputFolder"; //$NON-NLS-1$
-	public static final String USE_SINGLE_ROOT_STRUCTURE = "useSingleRootStructure"; //$NON-NLS-1$
-	public static final String ID_PERSPECTIVE_HIERARCHY_VIEW = "idPerspectiveHierarchyView"; //$NON-NLS-1$
-	public static final String SHOW_JAVA_EE_MODULE_DEPENDENCY_PAGE = "showJavaEEModuleDependencyPage"; //$NON-NLS-1$
-	public static final String DYNAMIC_WEB_GENERATE_DD = "dynamic_web_generate_dd"; //$NON-NLS-1$
-	public static final String EE6_CONNECTOR_GENERATE_DD = "ee6_connector_generate_dd"; //$NON-NLS-1$
-	public static final String EE7_CONNECTOR_GENERATE_DD = "ee7_connector_generate_dd"; //$NON-NLS-1$
-	public static final String EJB_BUSINESS_INTERFACE_ANNOTATION_IN_BEAN = "ejb_business_interaface_annotation_in_bean"; //$NON-NLS-1$
-	public static final String EJB_BUSINESS_INTERFACE_ANNOTATION_IN_INTERFACE = "ejb_business_interaface_annotation_in_interface"; //$NON-NLS-1$
-	public static final String EJB_INTERFACE_PACKAGE_SUFFIX = "ejb_interface_package_suffix"; //$NON-NLS-1$
-
-	
-	/**
-	 * @deprecated Do not use. The ALLOW_CLASSPATH_DEP preference has been deprecated and its ability to disable dynamic manifest updates will soon be removed.
-	 */
-	public static final String ALLOW_CLASSPATH_DEP = "allowClasspathDep"; //$NON-NLS-1$
-	public static final String VALIDATE_DUPLICATE_CLASSPATH_COMPONENT_URI = "validateDupClasspathCompURI"; //$NON-NLS-1$
-	
-	public static final String DYN_WEB_OUTPUT_FOLDER = "dynWebOutput"; //$NON-NLS-1$
-	public static final String EJB_OUTPUT_FOLDER = "ejbOutput"; //$NON-NLS-1$
-	public static final String APP_CLIENT_OUTPUT_FOLDER = "appClientOutput"; //$NON-NLS-1$
-	public static final String JCA_OUTPUT_FOLDER = "jcaOutput"; //$NON-NLS-1$
-	public static final String UTILITY_OUTPUT_FOLDER ="utilOutput"; //$NON-NLS-1$
-	
-	/**
-     * Alters the final perspective used by the following new project wizards
-     */
-	public static final String FINAL_PERSPECTIVE_WEB = "finalPerspectiveWeb"; //$NON-NLS-1$
-	public static final String FINAL_PERSPECTIVE_EJB = "finalPerspectiveEjb"; //$NON-NLS-1$
-	public static final String FINAL_PERSPECTIVE_EAR = "finalPerspectiveEar"; //$NON-NLS-1$
-	public static final String FINAL_PERSPECTIVE_APPCLIENT = "finalPerspectiveAppClient"; //$NON-NLS-1$
-	public static final String FINAL_PERSPECTIVE_JCA = "finalPerspectiveJca"; //$NON-NLS-1$
-	public static final String FINAL_PERSPECTIVE_UTILITY = "finalPerspectiveUtility"; //$NON-NLS-1$
-	public static final String FINAL_PERSPECTIVE_STATICWEB = "finalPerspectiveStaticWeb"; //$NON-NLS-1$
-	public static final String FINAL_PERSPECTIVE_WEBFRAGMENT = "finalPerspectiveWebFragment"; //$NON-NLS-1$
-	
-	/**
-	 * Ability to default initial runtimes chosen in wizards
-	 */
-	public static final String DEFAULT_RUNTIME_1 = "defaultRuntime1"; //$NON-NLS-1$
-	public static final String DEFAULT_RUNTIME_2 = "defaultRuntime2"; //$NON-NLS-1$
-	public static final String DEFAULT_RUNTIME_3 = "defaultRuntime3"; //$NON-NLS-1$
-	public static final String DEFAULT_RUNTIME_4 = "defaultRuntime4"; //$NON-NLS-1$
-	public static final String VIEWER_SYNC_FOR_WEBSERVICES = "viewerSyncForWebservices"; //$NON-NLS-1$
-	
-}
diff --git a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/project/facet/ISimpleWebFacetInstallDataModelProperties.java b/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/project/facet/ISimpleWebFacetInstallDataModelProperties.java
deleted file mode 100644
index 2f3263e..0000000
--- a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/project/facet/ISimpleWebFacetInstallDataModelProperties.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM 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:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.project.facet;
-
-import org.eclipse.wst.common.frameworks.datamodel.IDataModelProperties;
-
-public interface ISimpleWebFacetInstallDataModelProperties extends IDataModelProperties {
-	/**
-	 * This field should not be used.  It is not part of the API and may be modified in the future.
-	 */
-	public static Class _provider_class = SimpleWebFacetProjectCreationDataModelProvider.class;
-
-	public static final String CONTENT_DIR = "IStaticWebFacetInstallDataModelProperties.CONTENT_DIR"; //$NON-NLS-1$
-	
-	public static final String CONTEXT_ROOT = "IStaticWebFacetInstallDataModelProperties.CONTEXT_ROOT"; //$NON-NLS-1$
-}
diff --git a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/project/facet/ProductManager.java b/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/project/facet/ProductManager.java
deleted file mode 100644
index 9fdbfe9..0000000
--- a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/project/facet/ProductManager.java
+++ /dev/null
@@ -1,187 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2012 IBM 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:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.project.facet;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.wst.common.project.facet.core.runtime.IRuntime;
-import org.eclipse.wst.common.project.facet.core.runtime.IRuntimeComponent;
-import org.eclipse.wst.common.project.facet.core.runtime.RuntimeManager;
-import org.eclipse.wst.web.internal.WSTWebPlugin;
-
-public class ProductManager {
-
-	/**
-	 * Default values for WTP level product
-	 */
-	private static final String APPLICATION_CONTENT_FOLDER = "EarContent"; //$NON-NLS-1$
-	private static final String WEB_CONTENT_FOLDER = "WebContent"; //$NON-NLS-1$
-	private static final String EJB_CONTENT_FOLDER = "ejbModule"; //$NON-NLS-1$
-	private static final String APP_CLIENT_CONTENT_FOLDER = "appClientModule"; //$NON-NLS-1$
-	private static final String JCA_CONTENT_FOLDER = "connectorModule"; //$NON-NLS-1$
-	private static final String DEFAULT_SOURCE_FOLDER = "src"; //$NON-NLS-1$
-	private static final String ADD_TO_EAR_BY_DEFAULT = "false"; //$NON-NLS-1$
-	private static final String ADD_TO_EAR_RUNTIME_EXCEPTIONS = ""; //$NON-NLS-1$
-	private static final String OUTPUT_FOLDER = "build/classes"; //$NON-NLS-1$
-	private static final String USE_SINGLE_ROOT_STRUCTURE = "false"; //$NON-NLS-1$
-	private static final String VIEWER_SYNC_FOR_WEBSERVICES = "true"; //$NON-NLS-1$
-	private static final String ID_PERSPECTIVE_HIERARCHY_VIEW = "org.eclipse.ui.navigator.ProjectExplorer"; //$NON-NLS-1$
-	private static final String SHOW_JAVA_EE_MODULE_DEPENDENCY_PAGE = "true"; //$NON-NLS-1$
-	private static final String FINAL_PERSPECTIVE = "org.eclipse.jst.j2ee.J2EEPerspective"; //$NON-NLS-1$
-	private static final String FINAL_WEB_PERSPECTIVE = "org.eclipse.wst.web.ui.webDevPerspective"; //$NON-NLS-1$
-	private static final String DYNAMIC_WEB_GENERATE_DD = "true"; //$NON-NLS-1$
-	private static final char RUNTIME_SEPARATOR = ':';
-	private static final String[] DEFAULT_RUNTIME_KEYS = 
-							new String[]{IProductConstants.DEFAULT_RUNTIME_1,
-										IProductConstants.DEFAULT_RUNTIME_2,
-										IProductConstants.DEFAULT_RUNTIME_3,
-										IProductConstants.DEFAULT_RUNTIME_4};
-	
-	/**
-	 * Return the value for the associated key from the Platform Product registry or return the
-	 * WTP default for the J2EE cases.
-	 * 
-	 * @param key
-	 * @return String value of product's property
-	 */
-	public static String getProperty(String key) {
-		if (key == null)
-			return null;
-		String value = null;
-		if (Platform.getProduct()!=null)
-			value = Platform.getProduct().getProperty(key);
-		if (value == null)
-		{
-			value = Platform.getPreferencesService().getString(WSTWebPlugin.PLUGIN_ID, key, null, null);
-		}
-		if (value == null) {
-			if (key.equals(IProductConstants.APPLICATION_CONTENT_FOLDER))
-				return APPLICATION_CONTENT_FOLDER;
-			else if (key.equals(IProductConstants.WEB_CONTENT_FOLDER))
-				return WEB_CONTENT_FOLDER;
-			else if (key.equals(IProductConstants.EJB_CONTENT_FOLDER))
-				return EJB_CONTENT_FOLDER;
-			else if (key.equals(IProductConstants.APP_CLIENT_CONTENT_FOLDER))
-				return APP_CLIENT_CONTENT_FOLDER;
-			else if (key.equals(IProductConstants.JCA_CONTENT_FOLDER))
-				return JCA_CONTENT_FOLDER;
-			else if (key.equals(IProductConstants.DEFAULT_SOURCE_FOLDER))
-				return DEFAULT_SOURCE_FOLDER;
-			else if (key.equals(IProductConstants.ADD_TO_EAR_BY_DEFAULT))
-				return ADD_TO_EAR_BY_DEFAULT;
-			else if (key.equals(IProductConstants.ADD_TO_EAR_RUNTIME_EXCEPTIONS))
-				return ADD_TO_EAR_RUNTIME_EXCEPTIONS;
-			else if (key.equals(IProductConstants.USE_SINGLE_ROOT_STRUCTURE))
-				return USE_SINGLE_ROOT_STRUCTURE;
-			else if (key.equals(IProductConstants.VIEWER_SYNC_FOR_WEBSERVICES))
-				return VIEWER_SYNC_FOR_WEBSERVICES;
-			else if (key.equals(IProductConstants.OUTPUT_FOLDER))
-				return OUTPUT_FOLDER;
-			else if (key.equals(IProductConstants.ID_PERSPECTIVE_HIERARCHY_VIEW))
-				return ID_PERSPECTIVE_HIERARCHY_VIEW;
-			else if (key.equals(IProductConstants.FINAL_PERSPECTIVE_APPCLIENT))
-				return FINAL_PERSPECTIVE;
-			else if (key.equals(IProductConstants.FINAL_PERSPECTIVE_EAR))
-				return FINAL_PERSPECTIVE;
-			else if (key.equals(IProductConstants.FINAL_PERSPECTIVE_EJB))
-				return FINAL_PERSPECTIVE;
-			else if (key.equals(IProductConstants.FINAL_PERSPECTIVE_JCA))
-				return FINAL_PERSPECTIVE;
-			else if (key.equals(IProductConstants.FINAL_PERSPECTIVE_STATICWEB))
-				return FINAL_WEB_PERSPECTIVE;
-			else if (key.equals(IProductConstants.FINAL_PERSPECTIVE_UTILITY))
-				return FINAL_PERSPECTIVE;
-			else if (key.equals(IProductConstants.FINAL_PERSPECTIVE_WEB))
-				return FINAL_PERSPECTIVE;
-			else if (key.equals(IProductConstants.SHOW_JAVA_EE_MODULE_DEPENDENCY_PAGE))
-				return SHOW_JAVA_EE_MODULE_DEPENDENCY_PAGE;
-			else if (key.equals(IProductConstants.DYNAMIC_WEB_GENERATE_DD))
-				return DYNAMIC_WEB_GENERATE_DD;
-			else if (key.equals(IProductConstants.EJB_INTERFACE_PACKAGE_SUFFIX))
-				return ""; //$NON-NLS-1$
-		}
-		return value;
-	}
-	
-	public static boolean shouldAddToEARByDefault() {
-		String value = getProperty(IProductConstants.ADD_TO_EAR_BY_DEFAULT);
-		return Boolean.valueOf(value).booleanValue();
-	}
-	
-	public static boolean shouldUseSingleRootStructure() {
-		String value = getProperty(IProductConstants.USE_SINGLE_ROOT_STRUCTURE);
-		return Boolean.valueOf(value).booleanValue();
-	}
-	
-	public static boolean shouldUseViewerSyncForWebservices() {
-		String value = getProperty(IProductConstants.VIEWER_SYNC_FOR_WEBSERVICES);
-		return Boolean.valueOf(value).booleanValue();
-	}
-
-	public static List/*<IRuntime>*/ getDefaultRuntimes() {
-		List theRuntimes = null;
-		Set runtimes = RuntimeManager.getRuntimes();
-		if (!runtimes.isEmpty()) {
-			IRuntime defaultRuntime = null;
-			//	First check if defaults are defined
-			for (int i = 0; i < DEFAULT_RUNTIME_KEYS.length; i++) {
-				defaultRuntime = getMatchingRuntime(DEFAULT_RUNTIME_KEYS[i], runtimes);
-				if (defaultRuntime != null) {
-					if (theRuntimes == null) {
-						theRuntimes = new ArrayList(DEFAULT_RUNTIME_KEYS.length);
-					}
-					theRuntimes.add(defaultRuntime);
-				}
-			}
-		}
-		if (theRuntimes == null) {
-			theRuntimes = Collections.EMPTY_LIST;
-		}
-		return theRuntimes;
-	}
-	
-	private static IRuntime getMatchingRuntime(String defaultProductRuntimeProperty, Set runtimes) {
-		String defaultProductRuntimeKey = getProperty(defaultProductRuntimeProperty);
-		if (defaultProductRuntimeKey == null || defaultProductRuntimeKey.length() == 0) {
-			return null;
-		}
-		//The defaultProductRuntimeKey needs to be in the following format
-		//<facet runtime id>:<facet version>.
-		int seperatorIndex = defaultProductRuntimeKey.indexOf(RUNTIME_SEPARATOR);
-		if (seperatorIndex < 0 && seperatorIndex < defaultProductRuntimeKey.length()) {
-			//Consider throwing an exception here.
-			WSTWebPlugin.logError("Invalid default product runtime id.  It should follow the format <facet runtime id>:<facet version>.  Id processed: " + defaultProductRuntimeKey); //$NON-NLS-1$
-			return null;
-		}
-		String defaultRuntimeID = defaultProductRuntimeKey.substring(0, seperatorIndex);
-		String defaultFacetVersion = defaultProductRuntimeKey.substring(seperatorIndex + 1);
-		for (Iterator runtimeIt = runtimes.iterator(); runtimeIt.hasNext();) {
-			IRuntime runtime = (IRuntime) runtimeIt.next();
-			List runtimeComps = runtime.getRuntimeComponents();
-			if (!runtimeComps.isEmpty()) {
-				for (Iterator compsIter = runtimeComps.iterator(); compsIter.hasNext();) {
-					IRuntimeComponent runtimeComp = (IRuntimeComponent) compsIter.next();
-					if (defaultRuntimeID.equals(runtimeComp.getRuntimeComponentType().getId()) &&
-						(defaultFacetVersion.equals(runtimeComp.getRuntimeComponentVersion().getVersionString()))) {
-							return runtime;
-					}
-				}
-			}
-		}
-		//No matches found.
-		return null;
-	}
-}
diff --git a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/project/facet/SimpleWebFacetInstallDataModelProvider.java b/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/project/facet/SimpleWebFacetInstallDataModelProvider.java
deleted file mode 100644
index c551407..0000000
--- a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/project/facet/SimpleWebFacetInstallDataModelProvider.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM 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:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.project.facet;
-
-import java.util.Set;
-
-import org.eclipse.core.internal.resources.ResourceStatus;
-import org.eclipse.core.internal.utils.Messages;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceStatus;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.wst.common.componentcore.datamodel.FacetInstallDataModelProvider;
-import org.eclipse.wst.common.componentcore.internal.util.IModuleConstants;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonMessages;
-import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
-import org.eclipse.wst.web.internal.ResourceHandler;
-
-import com.ibm.icu.text.UTF16;
-import com.ibm.icu.util.StringTokenizer;
-
-public class SimpleWebFacetInstallDataModelProvider extends FacetInstallDataModelProvider implements ISimpleWebFacetInstallDataModelProperties {
-
-	public SimpleWebFacetInstallDataModelProvider() {
-		super();
-	}
-
-	@Override
-	public Set getPropertyNames() {
-		Set names = super.getPropertyNames();
-		names.add(CONTENT_DIR);
-		names.add(CONTEXT_ROOT);
-		return names;
-	}
-
-	@Override
-	public Object getDefaultProperty(String propertyName) {
-		if (propertyName.equals(CONTENT_DIR)) {
-			return "WebContent"; //$NON-NLS-1$
-		} else if (propertyName.equals(CONTEXT_ROOT)) {
-			return getStringProperty(FACET_PROJECT_NAME).replace(' ', '_');
-		} else if (propertyName.equals(FACET_ID)) {
-			return IModuleConstants.WST_WEB_MODULE;
-		}
-		return super.getDefaultProperty(propertyName);
-	}
-	
-	@Override
-	public boolean propertySet(String propertyName, Object propertyValue) {
-		if (FACET_PROJECT_NAME.equals(propertyName)) {
-			model.notifyPropertyChange(CONTEXT_ROOT, IDataModel.VALID_VALUES_CHG);
-		}
-		return super.propertySet(propertyName, propertyValue);
-	}
-	
-	@Override
-	public IStatus validate(String name) {
-		if (name.equals(CONTEXT_ROOT)) {
-			return validateContextRoot(getStringProperty(CONTEXT_ROOT));
-		} 
-		else if (name.equals(CONTENT_DIR)) {
-			String folderName = model.getStringProperty(CONTENT_DIR);
-			if (folderName == null || folderName.length() == 0 || folderName.equals("/") || folderName.equals("\\")) { //$NON-NLS-1$ //$NON-NLS-2$
-				// all folders which meet the criteria of "CONFIG_FOLDER" are required
-				String errorMessage = WTPCommonPlugin.getResourceString(WTPCommonMessages.WEBCONTENTFOLDER_EMPTY);
-				return WTPCommonPlugin.createErrorStatus(errorMessage);
-			}
-			IStatus status = validateFolderName(folderName);
-			if (status.isOK())
-			{
-				if (folderName.indexOf('#') != -1) { 
-					String message = NLS.bind(Messages.resources_invalidCharInName, "#", folderName); //$NON-NLS-1$
-					status = new ResourceStatus(IResourceStatus.INVALID_VALUE, null, message);
-				}
-			}
-			return status;
-		}
-		
-		return super.validate(name);
-	}
-	
-	protected IStatus validateContextRoot(String contextRoot) {
-		if (contextRoot == null || contextRoot.length() == 0) {
-			return new ResourceStatus(IResourceStatus.INVALID_VALUE, null, ResourceHandler.Context_Root_cannot_be_empty_2);
-		} else if (contextRoot.trim().equals(contextRoot)) {
-			StringTokenizer stok = new StringTokenizer(contextRoot, "."); //$NON-NLS-1$
-			while (stok.hasMoreTokens()) {
-				String token = stok.nextToken();
-				int cp;
-		        for (int i = 0; i < token.length(); i += UTF16.getCharCount(cp)) {
-		            cp = UTF16.charAt(token, i);
-					if(token.charAt(i) == ' ')
-					{
-						return new ResourceStatus(IResourceStatus.INVALID_VALUE, null, ResourceHandler.Names_cannot_contain_whitespace);
-					}
-					else if (!(token.charAt(i) == '_') && !(token.charAt(i) == '-') && !(token.charAt(i) == '/') && Character.isLetterOrDigit(token.charAt(i)) == false) {
-						String invalidCharString = null;
-						if (UTF16.getCharCount(cp)>1)
-						{
-							invalidCharString = UTF16.valueOf(cp); 
-						}
-						else
-						{
-							invalidCharString = (new Character(token.charAt(i))).toString();
-						}
-						Object[] invalidChar = new Object[]{invalidCharString};
-						String errorStatus = ResourceHandler.getString(ResourceHandler.The_character_is_invalid_in_a_context_root, invalidChar); 
-						return new ResourceStatus(IResourceStatus.INVALID_VALUE, null, errorStatus);
-					}
-				}
-			}
-		} else
-		{
-			return new ResourceStatus(IResourceStatus.INVALID_VALUE, null, ResourceHandler.Names_cannot_contain_whitespace);
-		}
-		return OK_STATUS;
-	}
-	
-		protected IStatus validateFolderName(String folderName) {
-		// the directory is not required, but if the name is entered ensure that it 
-		// contains only valid characters.
-		if (folderName == null || folderName.length() == 0) {
-			return OK_STATUS;
-		}
-		IWorkspace workspace = ResourcesPlugin.getWorkspace();
-		IPath path = new Path(folderName);
-		for (int i = 0, max = path.segmentCount(); i < max; i++) {
-			IStatus status = workspace.validateName(path.segment(i), IResource.FOLDER);
-			if (! status.isOK())
-				return status;
-		}
-
-		// all of the potential segments of the folder have been verified
-		return OK_STATUS;
-	}
-}
diff --git a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/project/facet/SimpleWebFacetInstallDelegate.java b/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/project/facet/SimpleWebFacetInstallDelegate.java
deleted file mode 100644
index 15276d6..0000000
--- a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/project/facet/SimpleWebFacetInstallDelegate.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM 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:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.project.facet;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IProjectDescription;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.wst.common.componentcore.ComponentCore;
-import org.eclipse.wst.common.componentcore.datamodel.FacetDataModelProvider;
-import org.eclipse.wst.common.componentcore.internal.util.ComponentUtilities;
-import org.eclipse.wst.common.componentcore.internal.util.IModuleConstants;
-import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
-import org.eclipse.wst.common.project.facet.core.IDelegate;
-import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
-import org.eclipse.wst.web.internal.WSTWebPlugin;
-
-public class SimpleWebFacetInstallDelegate implements IDelegate {
-
-	public void execute(IProject project, IProjectFacetVersion fv, Object config, IProgressMonitor monitor) throws CoreException {
-		if (monitor != null)
-			monitor.beginTask("", 1); //$NON-NLS-1$
-		try {
-			IDataModel model = (IDataModel) config;
-			addNatures(project);
-			final IVirtualComponent c = ComponentCore.createComponent(project, false);
-			c.create(0, null);
-			
-			final IWorkspace ws = ResourcesPlugin.getWorkspace();
-			final IPath pjpath = project.getFullPath();
-			final IPath contentdir = setContentPropertyIfNeeded(model, pjpath, project);
-			mkdirs(ws.getRoot().getFolder(contentdir));
-			
-			final IVirtualFolder webroot = c.getRootFolder();
-			if (webroot.getProjectRelativePath().equals(new Path("/"))) { //$NON-NLS-1$
-				webroot.createLink(new Path("/" + model.getStringProperty(ISimpleWebFacetInstallDataModelProperties.CONTENT_DIR)), 0, null); //$NON-NLS-1$
-			}
-			
-			ComponentUtilities.setServerContextRoot(project,model.getStringProperty(ISimpleWebFacetInstallDataModelProperties.CONTEXT_ROOT));
-			
-			try {
-				((IDataModelOperation) model.getProperty(FacetDataModelProvider.NOTIFICATION_OPERATION)).execute(monitor, null);
-			} catch (ExecutionException e) {
-				WSTWebPlugin.logError(e);
-			}
-		} finally {
-			if (monitor != null)
-				monitor.done();
-		}
-	}
-	
-	private IPath setContentPropertyIfNeeded(final IDataModel model, final IPath pjpath, IProject project) {
-		IVirtualComponent c = ComponentCore.createComponent(project);
-		if (c.exists()) {
-			if( !c.getRootFolder().getProjectRelativePath().isRoot() ){
-				return c.getRootFolder().getUnderlyingResource().getFullPath();
-			}
-		}
-		return pjpath.append(model.getStringProperty(ISimpleWebFacetInstallDataModelProperties.CONTENT_DIR));
-	}
-
-	private void addNatures(final IProject project) throws CoreException {
-		final IProjectDescription desc = project.getDescription();
-		final String[] current = desc.getNatureIds();
-		final String[] replacement = new String[current.length + 1];
-		System.arraycopy(current, 0, replacement, 0, current.length);
-		replacement[current.length] = IModuleConstants.MODULE_NATURE_ID;
-		desc.setNatureIds(replacement);
-		project.setDescription(desc, null);
-	}
-	
-	private static void mkdirs(final IFolder folder) throws CoreException {
-		if (!folder.exists()) {
-			if (folder.getParent() instanceof IFolder) {
-				mkdirs((IFolder) folder.getParent());
-			}
-			folder.create(true, true, null);
-		}
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/project/facet/SimpleWebFacetProjectCreationDataModelProvider.java b/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/project/facet/SimpleWebFacetProjectCreationDataModelProvider.java
deleted file mode 100644
index 90020ff..0000000
--- a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/project/facet/SimpleWebFacetProjectCreationDataModelProvider.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM 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:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.project.facet;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.eclipse.wst.common.componentcore.datamodel.FacetProjectCreationDataModelProvider;
-import org.eclipse.wst.common.componentcore.internal.util.IModuleConstants;
-import org.eclipse.wst.common.project.facet.core.IProjectFacet;
-import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
-
-public class SimpleWebFacetProjectCreationDataModelProvider extends FacetProjectCreationDataModelProvider {
-
-	public SimpleWebFacetProjectCreationDataModelProvider() {
-		super();
-	}
-	
-	@Override
-	public void init() {
-		super.init();
-
-        Collection<IProjectFacet> requiredFacets = new ArrayList<IProjectFacet>();
-        requiredFacets.add(ProjectFacetsManager.getProjectFacet(IModuleConstants.WST_WEB_MODULE));
-        setProperty(REQUIRED_FACETS_COLLECTION, requiredFacets);
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/project/facet/SimpleWebFacetUninstallDelegate.java b/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/project/facet/SimpleWebFacetUninstallDelegate.java
deleted file mode 100644
index 2445796..0000000
--- a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/project/facet/SimpleWebFacetUninstallDelegate.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM 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:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.project.facet;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
-import org.eclipse.wst.common.componentcore.internal.StructureEdit;
-import org.eclipse.wst.common.componentcore.internal.util.IModuleConstants;
-import org.eclipse.wst.common.project.facet.core.IDelegate;
-import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
-
-public class SimpleWebFacetUninstallDelegate implements IDelegate {
-
-	public SimpleWebFacetUninstallDelegate() {
-		super();
-	}
-
-	public void execute(IProject project, IProjectFacetVersion fv, Object config, IProgressMonitor monitor) throws CoreException {
-		if (monitor != null)
-			monitor.beginTask("", 1); //$NON-NLS-1$
-		try {
-			// Remove the .component file
-			IFile file = project.getFile(StructureEdit.MODULE_META_FILE_NAME);
-			file.delete(true, monitor);
-			
-			// Remove the module core nature
-			ProjectUtilities.removeNatureFromProject(project, IModuleConstants.MODULE_NATURE_ID);
-		} finally {
-			if (monitor != null)
-				monitor.done();
-		}
-	}
-}
diff --git a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/DelegateConfigurationElement.java b/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/DelegateConfigurationElement.java
deleted file mode 100644
index 1eedfa2..0000000
--- a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/DelegateConfigurationElement.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM 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:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-/*
- * Created on December 14, 2004
- */
-package org.eclipse.wst.web.internal;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IContributor;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.InvalidRegistryObjectException;
-
-/**
- * An object which represents the user-defined contents of an extension in a plug-in manifest.
- */
-public class DelegateConfigurationElement implements IConfigurationElement {
-
-	private final IConfigurationElement delegateElement;
-	private static final String DELEGATE_NAME = "delegateConfigurationElement"; //$NON-NLS-1$ 
-	private static final String DELEGATE_NAMESPACE = "delegateConfigurationElementNamespace"; //$NON-NLS-1$ 
-	private static final String DELEGATE_NULL_STRING = "delegateConfigurationElement: NULL"; //$NON-NLS-1$ 
-
-	public DelegateConfigurationElement(IConfigurationElement aDelegate) {
-		delegateElement = aDelegate;
-	}
-
-	/**
-	 * @param propertyName
-	 * @return
-	 * @throws org.eclipse.core.runtime.CoreException
-	 */
-	public Object createExecutableExtension(String propertyName) throws CoreException {
-		if (delegateElement == null)
-			return null;
-		return delegateElement.createExecutableExtension(propertyName);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	@Override
-	public boolean equals(Object obj) {
-		if (delegateElement == null)
-			return false;
-		return delegateElement.equals(obj);
-	}
-
-	/**
-	 * @param name
-	 * @return
-	 * @throws org.eclipse.core.runtime.InvalidRegistryObjectException
-	 */
-	public String getAttribute(String name) throws InvalidRegistryObjectException {
-		if (delegateElement == null)
-			return null;
-		return delegateElement.getAttribute(name);
-	}
-
-	/**
-	 * @param name
-	 * @return
-	 * @throws org.eclipse.core.runtime.InvalidRegistryObjectException
-	 */
-	public String getAttributeAsIs(String name) throws InvalidRegistryObjectException {
-		if (delegateElement == null)
-			return null;
-		return delegateElement.getAttributeAsIs(name);
-	}
-
-	/**
-	 * @return
-	 * @throws org.eclipse.core.runtime.InvalidRegistryObjectException
-	 */
-	public String[] getAttributeNames() throws InvalidRegistryObjectException {
-		if (delegateElement == null)
-			return new String[0];
-		return delegateElement.getAttributeNames();
-	}
-
-	/**
-	 * @return
-	 * @throws org.eclipse.core.runtime.InvalidRegistryObjectException
-	 */
-	public IConfigurationElement[] getChildren() throws InvalidRegistryObjectException {
-		if (delegateElement == null)
-			return new IConfigurationElement[0];
-		return delegateElement.getChildren();
-	}
-
-	/**
-	 * @param name
-	 * @return
-	 * @throws org.eclipse.core.runtime.InvalidRegistryObjectException
-	 */
-	public IConfigurationElement[] getChildren(String name) throws InvalidRegistryObjectException {
-		if (delegateElement == null)
-			return new IConfigurationElement[0];
-		return delegateElement.getChildren(name);
-	}
-
-	/**
-	 * @return
-	 * @throws org.eclipse.core.runtime.InvalidRegistryObjectException
-	 */
-	public IExtension getDeclaringExtension() throws InvalidRegistryObjectException {
-		if (delegateElement == null)
-			throw new InvalidRegistryObjectException();
-		return delegateElement.getDeclaringExtension();
-	}
-
-	/**
-	 * @return
-	 * @throws org.eclipse.core.runtime.InvalidRegistryObjectException
-	 */
-	public String getName() throws InvalidRegistryObjectException {
-		if (delegateElement == null)
-			return DELEGATE_NAME;
-		return delegateElement.getName();
-	}
-
-	/**
-	 * @return
-	 * @throws org.eclipse.core.runtime.InvalidRegistryObjectException
-	 */
-	public String getNamespace() throws InvalidRegistryObjectException {
-		if (delegateElement == null)
-			return DELEGATE_NAMESPACE;
-		return delegateElement.getNamespace();
-	}
-
-	/**
-	 * @return
-	 * @throws org.eclipse.core.runtime.InvalidRegistryObjectException
-	 */
-	public Object getParent() throws InvalidRegistryObjectException {
-		if (delegateElement == null)
-			return null;
-		return delegateElement.getParent();
-	}
-
-	/**
-	 * @return
-	 * @throws org.eclipse.core.runtime.InvalidRegistryObjectException
-	 */
-	public String getValue() throws InvalidRegistryObjectException {
-		if (delegateElement == null)
-			return null;
-		return delegateElement.getValue();
-	}
-
-	/**
-	 * @return
-	 * @throws org.eclipse.core.runtime.InvalidRegistryObjectException
-	 */
-	public String getValueAsIs() throws InvalidRegistryObjectException {
-		if (delegateElement == null)
-			return null;
-		return delegateElement.getValueAsIs();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#hashCode()
-	 */
-	@Override
-	public int hashCode() {
-		if (delegateElement == null)
-			return -1;
-		return delegateElement.hashCode();
-	}
-
-	/**
-	 * @return
-	 */
-	public boolean isValid() {
-
-		if (delegateElement == null)
-			return false;
-		return delegateElement.isValid();
-	}
-
-	/**
-	 * @return 
-	 */
-	public int getHandleId() {
-		if( delegateElement == null )
-			return -1;
-		return delegateElement.getHandleId();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#toString()
-	 */
-	@Override
-	public String toString() {
-		if (delegateElement == null)
-			return DELEGATE_NULL_STRING;
-		return delegateElement.toString();
-	}
-
-	public IConfigurationElement toEquinox() {
-		return null;
-	}
-
-	public IContributor getContributor() throws InvalidRegistryObjectException {
-		if (delegateElement == null)
-			throw new InvalidRegistryObjectException();
-		return delegateElement.getContributor();
-	}
-
-	public String getNamespaceIdentifier() throws InvalidRegistryObjectException {
-		if (delegateElement == null)
-			return DELEGATE_NAMESPACE;
-		return delegateElement.getNamespaceIdentifier();
-	}
-
-	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=296122
-	public String getAttribute(String attrName, String locale) throws InvalidRegistryObjectException {
-		if (delegateElement == null) return null;
-		return delegateElement.getAttribute(attrName, locale);
-	}
-
-	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=296122
-	public String getValue(String locale) throws InvalidRegistryObjectException {
-		if (delegateElement == null) return null;
-		return delegateElement.getValue(locale);
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/ISimpleWebModuleConstants.java b/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/ISimpleWebModuleConstants.java
deleted file mode 100644
index e58e260..0000000
--- a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/ISimpleWebModuleConstants.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2005 IBM 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:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.wst.web.internal;
-
-
-public interface ISimpleWebModuleConstants
-{
-	public static final String PLUG_IN_ID = "org.eclipse.wst.web"; //$NON-NLS-1$
-	public static final String STATIC_PROJECT_TYPE = "STATIC"; //$NON-NLS-1$
-	public static final String CSS_DIRECTORY = "theme"; //$NON-NLS-1$
-	public static final String INFO_DIRECTORY = "WEB-INF"; //$NON-NLS-1$
-	public static final String LIBRARY_DIRECTORY = "lib"; //$NON-NLS-1$
-	public static final String CLASSES_DIRECTORY = "classes"; //$NON-NLS-1$
-}
diff --git a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/IWSTWebPreferences.java b/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/IWSTWebPreferences.java
deleted file mode 100644
index 0f4e7aa..0000000
--- a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/IWSTWebPreferences.java
+++ /dev/null
@@ -1,13 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 2004 IBM 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: IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.wst.web.internal;
-
-public interface IWSTWebPreferences {
-	String PREF_STATICWEBCONTENT = "org.eclipse.jst.j2ee.preference.staticWebContentName"; //$NON-NLS-1$
-}
diff --git a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/ResourceHandler.java b/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/ResourceHandler.java
deleted file mode 100644
index 7167724..0000000
--- a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/ResourceHandler.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM 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:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.web.internal;
-
-import org.eclipse.osgi.util.NLS;
-
-public final class ResourceHandler extends NLS {
-
-	private static final String BUNDLE_NAME = "staticwebproject";//$NON-NLS-1$
-
-	private ResourceHandler() {
-		// Do not instantiate
-	}
-
-	public static String StaticWebProjectCreationWizard_Wizard_Title;
-	public static String StaticWebProjectWizardBasePage_Page_Description;
-	public static String StaticWebSettingsPropertiesPage_Web_Content_Label;
-	public static String StaticContextRootComposite_Context_Root_Label;
-	public static String StaticWebProjectWizardBasePage_Page_Title;
-	public static String StaticWebSettingsPropertiesPage_Not_available_for_closed_projects;
-	public static String TargetRuntime;
-	public static String NewDotDotDot;
-	public static String InvalidServerTarget;
-	public static String ConfigureSettings;
-	public static String Context_Root_cannot_be_empty_2;
-	public static String Names_cannot_contain_whitespace;
-	public static String The_character_is_invalid_in_a_context_root;
-
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, ResourceHandler.class);
-	}
-	
-	public static String getString(String key, Object[] args) {
-		return NLS.bind(key, args);
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/WSTWebPlugin.java b/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/WSTWebPlugin.java
deleted file mode 100644
index d14b6c8..0000000
--- a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/WSTWebPlugin.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2005 IBM 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:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.wst.web.internal;
-
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.Plugin;
-import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import java.lang.Throwable;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.MultiStatus;
-
-/**
- * The main plugin class to be used in the desktop.
- */
-public class WSTWebPlugin extends Plugin
-{
-	//The shared instance.
-	private static WSTWebPlugin plugin;
-
-	private WSTWebPreferences preferences;
-	
-	public static final String VALIDATION_BUILDER_ID = ValidationPlugin.VALIDATION_BUILDER_ID; // plugin
-	
-	public static final String[] ICON_DIRS = new String[]{"icons/full/obj16", //$NON-NLS-1$
-				"icons/full/ctool16", //$NON-NLS-1$
-				"icons/full/wizban", //$NON-NLS-1$
-				"icons", //$NON-NLS-1$
-				""}; //$NON-NLS-1$
-
-	//the ID for this plugin (added automatically by logging quickfix)
-	public static final String PLUGIN_ID = "org.eclipse.wst.web"; //$NON-NLS-1$
-	/**
-	 * The constructor.
-	 */
-	public WSTWebPlugin() {
-		super();
-		plugin = this;
-	}
-
-	/**
-	 * Returns the shared instance.
-	 */
-	public static WSTWebPlugin getDefault()
-	{
-		return plugin;
-	}
-
-	public static IWorkspace getWorkspace() {
-		return ResourcesPlugin.getWorkspace();
-	}
-	
-	@Override
-	protected void initializeDefaultPluginPreferences() {
-		getWSTWebPreferences().initializeDefaultPreferences();
-	}
-	/**
-	 * @return Returns the preferences.
-	 */
-	public WSTWebPreferences getWSTWebPreferences() {
-		if (this.preferences == null)
-			this.preferences = new WSTWebPreferences(this);
-		return this.preferences;
-	}
-
-	public static IStatus createStatus(int severity, String message, Throwable exception) {
-		return new Status(severity, PLUGIN_ID, message, exception);
-	}
-
-	public static IStatus createStatus(int severity, String message) {
-		return createStatus(severity, message, null);
-	}
-
-	public static void logError(String message) {
-		Platform.getLog(Platform.getBundle(PLUGIN_ID)).log( createStatus(IStatus.ERROR, message));
-	}
-
-	public static void logError(String message, Throwable exception) {
-		Platform.getLog(Platform.getBundle(PLUGIN_ID)).log( createStatus(IStatus.ERROR, message, exception));
-	}
-
-	public static void logError(String message, CoreException exception) {
-		MultiStatus status = new MultiStatus(PLUGIN_ID,IStatus.ERROR,new IStatus[]{exception.getStatus()},message,exception);
-		Platform.getLog(Platform.getBundle(PLUGIN_ID)).log( status );
-	}
-
-	public static void logError(Throwable exception) {
-		Platform.getLog(Platform.getBundle(PLUGIN_ID)).log( createStatus(IStatus.ERROR, exception.getMessage(), exception));
-	}
-
-	public static void logError(CoreException exception) {
-		Platform.getLog(Platform.getBundle(PLUGIN_ID)).log( exception.getStatus() );
-	}
-}
diff --git a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/WSTWebPreferences.java b/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/WSTWebPreferences.java
deleted file mode 100644
index fd5256a..0000000
--- a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/WSTWebPreferences.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 2004 IBM 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: IBM Corporation - initial API and implementation
- **************************************************************************************************/
-
-package org.eclipse.wst.web.internal;
-
-import org.eclipse.core.runtime.Plugin;
-import org.eclipse.core.runtime.Preferences;
-
-public class WSTWebPreferences {
-	public interface Keys {
-		final static String STATIC_WEB_CONTENT = "org.eclipse.jst.j2ee.preference.staticWebContentName"; //$NON-NLS-1$
-	}
-	public interface Values {
-		final static String STATIC_WEB_CONTENT = "WebContent"; //$NON-NLS-1$
-	}
-	public interface Defaults {
-		final static String STATIC_WEB_CONTENT = Values.STATIC_WEB_CONTENT;
-	}
-	private Plugin owner = null;
-	private Preferences preferences = null;
-	private boolean persistOnChange = false;
-	
-	public WSTWebPreferences(Plugin owner) {
-		this.owner = owner;
-	}
-	protected void initializeDefaultPreferences() {
-		getPreferences().setDefault(Keys.STATIC_WEB_CONTENT, Defaults.STATIC_WEB_CONTENT);
-	}
-	
-	public String getStaticWebContentFolderName() {
-		return getPreferences().getString(Keys.STATIC_WEB_CONTENT);
-	}
-	
-	public void setStaticWebContentFolderName(String value) {
-		getPreferences().setValue(Keys.STATIC_WEB_CONTENT, value);
-		firePreferenceChanged();
-	}
-	
-	public void firePreferenceChanged() {
-		if (isPersistOnChange())
-			persist();
-	}
-
-	public void persist() {
-		getOwner().savePluginPreferences();
-	}
-
-	/**
-	 * @return Returns the persistOnChange.
-	 */
-	public boolean isPersistOnChange() {
-		return this.persistOnChange;
-	}
-
-	/**
-	 * @param persistOnChange
-	 *            The persistOnChange to set.
-	 */
-	public void setPersistOnChange(boolean persistOnChange) {
-		this.persistOnChange = persistOnChange;
-	}
-
-	private Preferences getPreferences() {
-		if (this.preferences == null)
-			this.preferences = getOwner().getPluginPreferences();
-		return this.preferences;
-	}
-
-	/**
-	 * @return Returns the owner.
-	 */
-	private Plugin getOwner() {
-		return this.owner;
-	}
-}
diff --git a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/WebPropertiesUtil.java b/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/WebPropertiesUtil.java
deleted file mode 100644
index efa92d0..0000000
--- a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/WebPropertiesUtil.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM 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:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.web.internal;
-
-import com.ibm.icu.util.StringTokenizer;
-
-public class WebPropertiesUtil {
-	private static final char[] BAD_CHARS = {'/', '\\', ':'};
-	/**
-	 * @param project
-	 *            org.eclipse.core.resources.IProject
-	 */
-	/**
-	 * Returns a error message that states whether a context root is valid or not returns null if
-	 * context root is fine
-	 * 
-	 * @return java.lang.String
-	 * @param contextRoot
-	 *            java.lang.String
-	 */
-	public static String validateContextRoot(String contextRoot) {
-
-		if (contextRoot == null)
-			return null;
-
-		String errorMessage = null;
-
-		String name = contextRoot;
-		if (name.equals("")) { //$NON-NLS-1$
-			//  this was added because the error message shouldnt be shown initially. It should be
-			// shown only if context root field is edited to
-			errorMessage = ResourceHandler.StaticWebProjectWizardBasePage_Page_Title; 
-			
-			//errorMessage = ProjectSupportResourceHandler.getString("Context_Root_cannot_be_empty_2"); //$NON-NLS-1$
-			return errorMessage;
-		}
-
-		/*******************************************************************************************
-		 * // JZ - fix to defect 204264, "/" is valid in context root if (name.indexOf("//") != -1) {
-		 * //$NON-NLS-1$ errorMessage = "// are invalid characters in a resource name"; return
-		 * errorMessage;
-		 *  }
-		 ******************************************************************************************/
-
-		if (name.trim().equals(name)) {
-			StringTokenizer stok = new StringTokenizer(name, "."); //$NON-NLS-1$
-			outer : while (stok.hasMoreTokens()) {
-				String token = stok.nextToken();
-				for (int i = 0; i < token.length(); i++) {
-					if (!(token.charAt(i) == '_') && !(token.charAt(i) == '-') && !(token.charAt(i) == '/') && Character.isLetterOrDigit(token.charAt(i)) == false) {
-						if (Character.isWhitespace(token.charAt(i))) {
-							//Removed because context roots can contain white space
-							//errorMessage =
-							//	ResourceHandler.getString("_Context_root_cannot_conta_UI_");//$NON-NLS-1$
-							// = " Context root cannot contain whitespaces."
-						} else {
-							errorMessage = ResourceHandler.StaticWebProjectWizardBasePage_Page_Title; 
-							
-							//errorMessage = ProjectSupportResourceHandler.getString("The_character_is_invalid_in_a_context_root", new Object[]{(new Character(token.charAt(i))).toString()}); //$NON-NLS-1$
-							break outer;
-						}
-					}
-				}
-			}
-		} // en/ end of if(name.trim
-		else
-			errorMessage = ResourceHandler.StaticWebProjectWizardBasePage_Page_Title; 
-			//errorMessage = ProjectSupportResourceHandler.getString("Names_cannot_begin_or_end_with_whitespace_5"); //$NON-NLS-1$
-
-		return errorMessage;
-	}
-
-
-	/**
-	 * Return true if the string contains any of the characters in the array.
-	 */
-	private static boolean contains(String str, char[] chars) {
-		for (int i = 0; i < chars.length; i++) {
-			if (str.indexOf(chars[i]) != -1)
-				return true;
-		}
-		return false;
-	}
-
-
-	public static String validateFolderName(String folderName) {
-		if (folderName.length() == 0)
-			return ResourceHandler.StaticWebProjectWizardBasePage_Page_Title; 
-			
-			//return ProjectSupportResourceHandler.getString("Folder_name_cannot_be_empty_2"); //$NON-NLS-1$
-
-		if (contains(folderName, BAD_CHARS))
-			return ResourceHandler.StaticWebProjectWizardBasePage_Page_Title; 
-			
-			//return ProjectSupportResourceHandler.getString("Folder_name_is_not_valid", new Object[]{folderName}); //$NON-NLS-1$
-
-		return null;
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/deployables/ComponentDeployable.java b/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/deployables/ComponentDeployable.java
deleted file mode 100644
index afc69b6..0000000
--- a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/deployables/ComponentDeployable.java
+++ /dev/null
@@ -1,429 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2007 IBM 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:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.web.internal.deployables;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.wst.common.componentcore.ArtifactEdit;
-import org.eclipse.wst.common.componentcore.ComponentCore;
-import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-import org.eclipse.wst.common.componentcore.resources.IVirtualContainer;
-import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
-import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
-import org.eclipse.wst.common.componentcore.resources.IVirtualResource;
-import org.eclipse.wst.common.project.facet.core.IFacetedProject;
-import org.eclipse.wst.common.project.facet.core.IProjectFacet;
-import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
-import org.eclipse.wst.server.core.IModule;
-import org.eclipse.wst.server.core.ServerUtil;
-import org.eclipse.wst.server.core.model.IModuleFile;
-import org.eclipse.wst.server.core.model.IModuleFolder;
-import org.eclipse.wst.server.core.model.IModuleResource;
-import org.eclipse.wst.server.core.util.ModuleFile;
-import org.eclipse.wst.server.core.util.ModuleFolder;
-import org.eclipse.wst.server.core.util.ProjectModule;
-
-/**
- * @deprecated as of WTP 3.2
- */
-public abstract class ComponentDeployable extends ProjectModule {
-
-	protected IVirtualComponent component = null;
-	protected List<IModuleResource> members = new ArrayList<IModuleResource>();
-	
-	public ComponentDeployable(IProject project) {
-		this(project,ComponentCore.createComponent(project));
-	}
-	
-	public ComponentDeployable(IProject project, IVirtualComponent aComponent) {
-		super(project);
-		this.component = aComponent;
-	}
-	
-	/**
-	 * @see org.eclipse.jst.server.core.IJ2EEModule#isBinary()
-	 */
-	public boolean isBinary() {
-		if (component==null)
-			return false;
-		return component.isBinary();
-	}
-	
-	/**
-	 * Add the resources from mr to the existing resources in Module Folder mf
-	 * @param ModuleFolder mf
-	 * @param IModuleResource[] mr
-	 */
-	protected void addMembersToModuleFolder(ModuleFolder mf, IModuleResource[] mr) {
-		// If the folder is null or the resources to add are null or empty, bail and return
-		if (mf == null || mr == null || mr.length==0) 
-			return;
-		// Get the existing members in the module folder
-		IModuleResource[] mf_members = mf.members();
-		int mf_size = 0;
-		// Get the length of the existing members in the module folder
-		if (mf_members != null)
-			mf_size = mf_members.length;
-		// Create a new array to set on the module folder which will combine the existing and
-		// new module resources
-		IModuleResource[] res = new IModuleResource[mf_size + mr.length];
-		// Copy the existing members into the array if there are any
-		if (mf_members != null && mf_size > 0)
-			System.arraycopy(mf_members, 0, res, 0, mf_size);
-		// Copy the new members into the array
-		System.arraycopy(mr, 0, res, mf_size, mr.length);
-		// Set the new members array on the module folder
-		mf.setMembers(res);
-	}
-
-	 /**
-     * Returns the child modules of this module.
-     * 
-     * @return org.eclipse.wst.server.core.model.IModule[]
-     */
-    @Override
-	public IModule[] getChildModules() {
-        return getModules();
-    }
-    
-    public IModule[] getModules() {
-		List<IModule> modules = new ArrayList<IModule>();
-		if (component != null) {
-	    	IVirtualReference[] components = getReferences(component);
-	    	for (int i = 0; i < components.length; i++) {
-				IVirtualReference reference = components[i];
-				if (reference != null && reference.getDependencyType()==IVirtualReference.DEPENDENCY_TYPE_USES) {
-					IVirtualComponent virtualComp = reference.getReferencedComponent();
-					IModule module = gatherModuleReference(component, virtualComp);
-					if (module != null && !modules.contains(module))
-						modules.add(module);
-				}
-			}
-		}
-        return modules.toArray(new IModule[modules.size()]);
-	}
-    
-    protected IVirtualReference[] getReferences(IVirtualComponent aComponent) {
-    	return aComponent.getReferences();
-    }
-    
-    protected IModule gatherModuleReference(IVirtualComponent component, IVirtualComponent targetComponent ) {
-    	// Handle workspace project module components
-		if (targetComponent != null && targetComponent.getProject()!=component.getProject()) {
-			if (!targetComponent.isBinary())
-				return ServerUtil.getModule(targetComponent.getProject());
-		}
-		return null;
-    }
-    
-    /**
-	 * Find the module resources for a given container and path. Inserts in the java containers
-	 * at a given path if not null.
-	 * 
-	 * @param cont a container
-	 * @param path the current module relative path
-	 * @param javaPath the path where Java resources fit in the root
-	 * @param javaCont
-	 * @return a possibly-empty array of module resources
-	 * @throws CoreException
-	 */
-	protected IModuleResource[] getMembers(IContainer cont, IPath path, IPath javaPath, IContainer[] javaCont) throws CoreException {
-		IResource[] res = cont.members();
-		int size2 = res.length;
-		List<IModuleFile> list = new ArrayList<IModuleFile>(size2);
-		for (int j = 0; j < size2; j++) {
-			if (res[j] instanceof IContainer) {
-				IContainer cc = (IContainer) res[j];
-				
-				IPath newPath = path.append(cc.getName()).makeRelative();
-				// Retrieve already existing module folder if applicable
-				ModuleFolder mf = (ModuleFolder) getExistingModuleResource(members,newPath);
-				if (mf == null) {
-					mf = new ModuleFolder(cc, cc.getName(), path);
-					ModuleFolder parent = (ModuleFolder) getExistingModuleResource(members, path);
-					if (path.isEmpty())
-						members.add(mf);
-					else {
-						if (parent == null)
-							parent = ensureParentExists(path, cc);
-						addMembersToModuleFolder(parent, new IModuleResource[] {mf});
-					}
-				}
-				IModuleResource[] mr = getMembers(cc, newPath, javaPath, javaCont);
-				
-				if (javaPath != null && newPath.isPrefixOf(javaPath))
-					mr = handleJavaPath(path, javaPath, newPath, javaCont, mr, cc);
-
-				addMembersToModuleFolder(mf, mr);
-				
-			} else {
-				IFile f = (IFile) res[j];
-				// Handle the default package case
-				if (path.equals(javaPath)) {
-					ModuleFolder mFolder = (ModuleFolder) getExistingModuleResource(members,javaPath);
-					IModuleFile mFile = createModuleFile(f, javaPath);
-					if (mFolder != null)
-						addMembersToModuleFolder(mFolder,new IModuleResource[]{mFile});
-					else
-						list.add(mFile);
-				} else {
-					IModuleFile mf = createModuleFile(f, path);
-					list.add(mf);
-				}
-			}
-		}
-		IModuleResource[] mr = new IModuleResource[list.size()];
-		list.toArray(mr);
-		return mr;
-	}
-	
-	protected IModuleFile createModuleFile(final IFile file, final IPath path) {
-		return new ModuleFile(file, file.getName(), path);
-	}
-	
-	protected IModuleResource[] getMembers(IVirtualContainer cont, IPath path) throws CoreException {
-		IVirtualResource[] res = cont.members();
-		int size2 = res.length;
-		List<IModuleFile> list = new ArrayList<IModuleFile>(size2);
-		for (int j = 0; j < size2; j++) {
-			if (res[j] instanceof IVirtualContainer) {
-				IVirtualContainer cc = (IVirtualContainer) res[j];
-				// Retrieve already existing module folder if applicable
-				ModuleFolder mf = (ModuleFolder) getExistingModuleResource(members,path.append(new Path(cc.getName()).makeRelative()));
-				if (mf == null) {
-					mf = new ModuleFolder((IContainer)cc.getUnderlyingResource(), cc.getName(), path);
-					ModuleFolder parent = (ModuleFolder) getExistingModuleResource(members, path);
-					if (path.isEmpty())
-						members.add(mf);
-					else {
-						if (parent == null)
-							parent = ensureParentExists(path, (IContainer)cc.getUnderlyingResource());
-						addMembersToModuleFolder(parent, new IModuleResource[] {mf});
-					}
-				}
-				IModuleResource[] mr = getMembers(cc, path.append(cc.getName()));
-				addMembersToModuleFolder(mf, mr);
-			} else {
-				IFile f = (IFile) res[j].getUnderlyingResource();
-				IModuleFile mf = null;
-				if (shouldAddComponentFile(f)) {
-					mf = createModuleFile(f, path);
-					list.add(mf);
-				}
-			}
-		}
-		IModuleResource[] mr = new IModuleResource[list.size()];
-		list.toArray(mr);
-		return mr;
-	}
-	
-	protected ModuleFolder ensureParentExists(IPath path, IContainer cc) {
-		ModuleFolder parent = (ModuleFolder) getExistingModuleResource(members, path);
-		if (parent == null) {
-			String folderName = path.lastSegment();
-			IPath folderPath = Path.EMPTY;
-			if (path.segmentCount()>1)
-				folderPath = path.removeLastSegments(1);
-			parent = new ModuleFolder(cc, folderName, folderPath);
-			if (path.segmentCount()>1)
-				addMembersToModuleFolder(ensureParentExists(path.removeLastSegments(1),cc), new IModuleResource[] {parent});
-			else
-				members.add(parent);
-		}
-		return parent;
-	}
-	
-	/**
-	 * This method is meant to be overridden by subclasses.  Return whether or not to add this file
-	 * to the members list.
-	 * 
-	 * @param file
-	 * @return boolean should add file?
-	 */
-	protected boolean shouldAddComponentFile(IFile file) {
-		return true;
-	}
-	
-	/**
-	 * Check the current cache to see if we already have an existing module resource for
-	 * the given path.
-	 * @param aList
-	 * @param path
-	 * @return an existing moduleResource from the cached result
-	 */
-	 
-	protected IModuleResource getExistingModuleResource(List aList, IPath path) { 
-    	// If the list is empty, return null
-    	if (aList==null || aList.isEmpty() || path == null)
-    		return null;
-    	// Otherwise recursively check to see if given resource matches current resource or if it is a child
-    	String[] pathSegments = path.segments(); 
-    	IModuleResource moduleResource = null;
-    	
-    	if(pathSegments.length == 0)
-    		return null;
-    	for (Iterator iter = aList.iterator(); iter.hasNext();) {
-    		moduleResource = (IModuleResource) iter.next();     	
-    		String[] moduleSegments = moduleResource.getModuleRelativePath().segments();
-    		// If the last segment in passed in path equals the module resource name 
-    		// and segment count is the same and the path segments start with the module path segments
-    		// then we have a match and we return the existing moduleResource
-    		if (pathSegments[pathSegments.length - 1].equals(moduleResource.getName()) && 
-		    		(moduleSegments.length + 1) == pathSegments.length && 
-		    		startsWith(moduleSegments, pathSegments))
-		    	return moduleResource; 
-    		
-    		// Otherwise, if it is a folder, check its children for the existing resource path
-    		// but only check if the beginning segments are a match
-	    	if(moduleResource instanceof IModuleFolder && 
-	    			startsWith(moduleSegments, pathSegments) && pathSegments.length > moduleSegments.length &&
-	    			moduleResource.getName().equals(pathSegments[moduleSegments.length > 0 ? moduleSegments.length : 0]))	    	  
-    			if (((IModuleFolder)moduleResource).members()!=null)
-    				return getExistingModuleResource(Arrays.asList(((IModuleFolder)moduleResource).members()),path);		
-    	}
-    	return null;
-    }
-	
-	/**
-	 * 
-	 * @param beginningSegments
-	 * @param testSegments
-	 * @return True if beginningSegments[i] == testSegments[i] for all 0<=i<beginningSegments[i] 
-	 */
-	private boolean startsWith(String[] beginningSegments, String[] testSegments) { 
-		for(int i=0; i < beginningSegments.length; i++) {
-			if(!beginningSegments[i].equals(testSegments[i]))
-				return false;
-		}
-		return true;
-	}
-
-	protected IModuleResource[] handleJavaPath(IPath path, IPath javaPath, IPath curPath, IContainer[] javaCont, IModuleResource[] mr, IContainer cc) throws CoreException {
-		//subclasses may override
-		return new IModuleResource[]{};
-	}
-	
-	@Override
-	public IModuleResource[] members() throws CoreException {
-		members.clear();
-		IVirtualComponent vc = ComponentCore.createComponent(getProject());
-		if (vc != null) {
-			IVirtualFolder vFolder = vc.getRootFolder();
-			IModuleResource[] mr = getMembers(vFolder, Path.EMPTY);
-			int size = mr.length;
-			for (int j = 0; j < size; j++) {
-				members.add(mr[j]);
-			}
-			addUtilMembers(vc);
-		}
-		
-		IModuleResource[] mr = new IModuleResource[members.size()];
-		members.toArray(mr);
-		return mr;
-	}
-	
-	protected boolean shouldIncludeUtilityComponent(IVirtualComponent virtualComp, IVirtualReference[] components, ArtifactEdit edit) {
-		return virtualComp != null && virtualComp.isBinary() && virtualComp.getProject()==component.getProject();
-	}
-	
-	protected void addUtilMembers(IVirtualComponent vc) {
-		ArtifactEdit edit = null;
-		try {
-			edit = getComponentArtifactEditForRead();
-			IVirtualReference[] components = vc.getReferences();
-	    	for (int i = 0; i < components.length; i++) {
-	    		IVirtualReference reference = components[i];
-				IVirtualComponent virtualComp = reference.getReferencedComponent();
-				if (shouldIncludeUtilityComponent(virtualComp,components,edit)) {
-					addUtilMember(vc, reference, reference.getRuntimePath());
-				}
-	    	}
-		} finally {
-			if (edit!=null)
-				edit.dispose();
-		}
-	}
-	
-	protected void addUtilMember(IVirtualComponent parent, IVirtualReference reference, IPath runtimePath) {
-		IModuleFile mf = null;
-		final String archiveName2 = reference.getArchiveName();
-		final String archiveName = new Path(archiveName2).lastSegment();
-		final IVirtualComponent virtualComp = reference.getReferencedComponent();
-		IFile ifile = virtualComp.getAdapter(IFile.class);
-		if (ifile != null) { //In Workspace
-			String name = null != archiveName ? archiveName : ifile.getName();
-			mf = new ModuleFile(ifile, name, runtimePath.makeRelative());
-		} else {
-			File extFile = virtualComp.getAdapter(File.class);
-			String name = null != archiveName ? archiveName : extFile.getName();
-			mf = new ModuleFile(extFile, name, runtimePath.makeRelative());
-		}
-		IModuleResource moduleParent = getExistingModuleResource(members, mf.getModuleRelativePath());
-		if (moduleParent != null && moduleParent instanceof ModuleFolder) {
-			addMembersToModuleFolder((ModuleFolder)moduleParent, new IModuleResource[]{mf});
-		} else {
-			if (mf.getModuleRelativePath().isEmpty()) {
-				members.add(mf);
-			} else {
-				if (moduleParent == null) {
-					moduleParent = ensureParentExists(mf.getModuleRelativePath(), (IContainer)parent.getRootFolder().getUnderlyingResource());
-				}
-				addMembersToModuleFolder((ModuleFolder)moduleParent, new IModuleResource[] {mf});
-			}
-		}
-	}
-	
-	protected ArtifactEdit getComponentArtifactEditForRead() {
-		return null;
-	}
-
-	protected static boolean isProjectOfType(IProject project, String typeID) {
-		IFacetedProject facetedProject = null;
-		try {
-			facetedProject = ProjectFacetsManager.create(project);
-		} catch (CoreException e) {
-			return false;
-		}
-		
-		if (facetedProject !=null && ProjectFacetsManager.isProjectFacetDefined(typeID)) {
-			IProjectFacet projectFacet = ProjectFacetsManager.getProjectFacet(typeID);
-			return projectFacet!=null && facetedProject.hasProjectFacet(projectFacet);
-		}
-		return false;
-	}
-
-	/**
-	 * Returns the root folders for the resources in this module.
-	 * 
-	 * @return a possibly-empty array of resource folders
-	 */
-	public IContainer[] getResourceFolders() {
-		IVirtualComponent vc = ComponentCore.createComponent(getProject());
-		if (vc != null) {
-			IVirtualFolder vFolder = vc.getRootFolder();
-			if (vFolder != null)
-				return vFolder.getUnderlyingFolders();
-		}
-		return new IContainer[]{};
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/deployables/FlatComponentDeployable.java b/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/deployables/FlatComponentDeployable.java
deleted file mode 100644
index 5aaa05c..0000000
--- a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/deployables/FlatComponentDeployable.java
+++ /dev/null
@@ -1,464 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 Red Hat 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:
- *     Red Hat - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.web.internal.deployables;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdapterFactory;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.wst.common.componentcore.ComponentCore;
-import org.eclipse.wst.common.componentcore.internal.flat.FlatVirtualComponent;
-import org.eclipse.wst.common.componentcore.internal.flat.FlatVirtualComponent.FlatComponentTaskModel;
-import org.eclipse.wst.common.componentcore.internal.flat.FlattenParticipantModel;
-import org.eclipse.wst.common.componentcore.internal.flat.IChildModuleReference;
-import org.eclipse.wst.common.componentcore.internal.flat.IFlatFile;
-import org.eclipse.wst.common.componentcore.internal.flat.IFlatFolder;
-import org.eclipse.wst.common.componentcore.internal.flat.IFlatResource;
-import org.eclipse.wst.common.componentcore.internal.flat.IFlatVirtualComponent;
-import org.eclipse.wst.common.componentcore.internal.flat.IFlattenParticipant;
-import org.eclipse.wst.common.componentcore.internal.util.VirtualReferenceUtilities;
-import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-import org.eclipse.wst.common.project.facet.core.IFacetedProject;
-import org.eclipse.wst.common.project.facet.core.IProjectFacet;
-import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
-import org.eclipse.wst.server.core.IModule;
-import org.eclipse.wst.server.core.ServerUtil;
-import org.eclipse.wst.server.core.model.IModuleFile;
-import org.eclipse.wst.server.core.model.IModuleFolder;
-import org.eclipse.wst.server.core.model.IModuleResource;
-import org.eclipse.wst.server.core.model.ModuleDelegate;
-import org.eclipse.wst.server.core.util.ModuleFile;
-import org.eclipse.wst.server.core.util.ProjectModule;
-
-public abstract class FlatComponentDeployable extends ProjectModule implements IFlatDeployable {
-
-	public static final String FLATTEN_PARTICIPANTS = "org.eclipse.wst.web.deployables.flatten.participants"; //$NON-NLS-1$
-	private static final String FLATTEN_PARTICIPANTS_DELIM = ","; //$NON-NLS-1$
-	
-	/*
-	 * Register an adapt IModule to IVirtualComponent 
-	 */
-	static {
-		Platform.getAdapterManager().registerAdapters(new IAdapterFactory() {
-			public Class[] getAdapterList() {
-				return new Class[] { IVirtualComponent.class };
-			}
-
-			public Object getAdapter(Object adaptableObject, Class adapterType) {
-				if (adaptableObject instanceof IModule) {
-					IModule module = (IModule) adaptableObject;
-					FlatComponentDeployable deployable = (FlatComponentDeployable) module.loadAdapter(FlatComponentDeployable.class, null);
-					if(deployable != null){
-						IVirtualComponent virtualComponent = deployable.getComponent();
-						return virtualComponent;
-					}
- 				}
-				return null;
-			}
-		}, IModule.class);
-	}
-	
-	protected IVirtualComponent component = null;
-	protected List<IModuleResource> members = new ArrayList<IModuleResource>();
-	
-	public FlatComponentDeployable(IProject project) {
-		this(project,ComponentCore.createComponent(project));
-	}
-	
-	public FlatComponentDeployable(IProject project, IVirtualComponent aComponent) {
-		super(project);
-		this.component = aComponent;
-	}
-
-	public IVirtualComponent getComponent() {
-		return component;
-	}
-	
-	/**
-	 * We will cache the flattened piece here, and instead redirect
-	 * the module factories to recreate the modules *whenever* there is 
-	 * a workspace change. This will still be much more efficient than
-	 * traversing the tree each time a call to getResources() or getChildModules(). 
-	 */
-	private FlatVirtualComponent cacheFlattened = null;
-
-	
-	public boolean shouldCache() {
-		return false;
-	}
-	
-	public void clearCache() {
-		cacheFlattened = null;
-	}
-	
-	/**
-	 * The export model is what does the grunt of the work
-	 * @return
-	 */
-	protected IFlatVirtualComponent getFlatComponent() {
-		if( !shouldCache() || cacheFlattened == null ) {
-			FlatComponentTaskModel options = new FlatComponentTaskModel();
-			options.put(FlatVirtualComponent.PARTICIPANT_LIST, Arrays.asList(getParticipants()));
-			FlatVirtualComponent tmp = new FlatVirtualComponent(component, options);
-			if( shouldCache())
-				cacheFlattened = tmp;
-			return tmp;
-		}
-		return cacheFlattened;
-	}
-	
-	/**
-	 * Subclasses can provide a list of participants who may
-	 * be involved in forming the export model
-	 * 
-	 * A deployable with no participant should still properly
-	 * consume consumed references and traverse the model appropriately
-	 * 
-	 * @return
-	 */
-	public IFlattenParticipant[] getParticipants() {
-		String[] ids = getParticipantIds();
-		return getFlattenParticipants(ids);
-	}
-
-	public String[] getParticipantIds() {
-		// If file exists, load from file
-		String participants = component.getMetaProperties().getProperty(FLATTEN_PARTICIPANTS);
-		// else, get the default ones
-		String[] split = participants == null ? getDefaultFlattenParticipantIDs() : participants.split(FLATTEN_PARTICIPANTS_DELIM); 
-		for( int i = 0; i < split.length; i++ ) {
-			split[i] = split[i].trim();
-		}
-		return split;
-	}
-
-	protected IFlattenParticipant[] getFlattenParticipants(String[] ids) {
-		ArrayList<IFlattenParticipant> participants = new ArrayList<IFlattenParticipant>();
-		IFlattenParticipant tmp;
-		for( int i = 0; i < ids.length; i++ ) {
-			tmp = FlattenParticipantModel.getDefault().getParticipant(ids[i]);
-			if( tmp != null )
-				participants.add(tmp);
-			else {
-				// Log? This is an error somehow
-			}
-		}
-		return participants.toArray(new IFlattenParticipant[participants.size()]);
-	}
-	
-	
-	public void addFlattenParticipant(String id, int position) {
-		String participants = component.getMetaProperties().getProperty(FLATTEN_PARTICIPANTS);
-		String[] split = participants == null ? getDefaultFlattenParticipantIDs() : participants.split(","); //$NON-NLS-1$
-		ArrayList<String> asList = new ArrayList<String>();
-		asList.addAll(Arrays.asList(split));
-		if( !asList.contains(id)) {
-			if( position < asList.size())
-				asList.add(position, id);
-			else
-				asList.add(id);
-		}
-		String asString = implode(asList.toArray(new String[asList.size()]), FLATTEN_PARTICIPANTS_DELIM);
-		component.setMetaProperty(FLATTEN_PARTICIPANTS, asString);
-	}
-
-	private String implode(String[] array, String delim) {
-		String retval;
-		if (array.length==0) {
-			retval = ""; //$NON-NLS-1$
-		} else {
-			StringBuffer sb = new StringBuffer();
-			sb.append(array[0]);
-			for (int i=1;i<array.length;i++) {
-				sb.append(delim);
-				sb.append(array[i]);
-			}
-			retval = sb.toString();
-		}
-		return retval;
-	}
-	
-	public void removeFlattenParticipant(String id) {
-		String participants = component.getMetaProperties().getProperty(FLATTEN_PARTICIPANTS);
-		String[] split = participants == null ? getDefaultFlattenParticipantIDs() : participants.split(","); //$NON-NLS-1$
-		ArrayList<String> asList = new ArrayList<String>();
-		asList.addAll(Arrays.asList(split));
-		asList.remove(id);
-		String asString = implode(asList.toArray(new String[asList.size()]), FLATTEN_PARTICIPANTS_DELIM);
-		component.setMetaProperty(FLATTEN_PARTICIPANTS, asString);
-	}
-
-	
-	/**
-	 * Get a list of participant keys that are default for this project type
-	 * @return
-	 */
-	public String[] getDefaultFlattenParticipantIDs() {
-		return new String[0];
-	}
-	
-	public boolean isBinary() {
-		return component == null ? false : component.isBinary();
-	}
-
-	@Override
-	public IModuleResource[] members() throws CoreException {
-		if( component.isBinary() ) 
-			return LEGACY_binaryMembers();
-		
-		IFlatVirtualComponent em = getFlatComponent();
-		IFlatResource[] resources = em.fetchResources();
-		return convert(resources);
-		
-	}
-
-	protected IModuleResource[] LEGACY_binaryMembers() {
-		IFile ifile = component.getAdapter(IFile.class);
-		File file = component.getAdapter(File.class);
-		ModuleFile mf = ifile != null ? new ModuleFile(ifile, ifile.getName(), new Path(""))  //$NON-NLS-1$
-		 		: new ModuleFile(file, file.getName(), new Path("")); //$NON-NLS-1$
-		return new IModuleResource[]{mf};
-	}
-	
-	 /**
-     * Returns the child modules of this module.
-     * 
-     * @return org.eclipse.wst.server.core.model.IModule[]
-     */
-    @Override
-	public IModule[] getChildModules() {
-        return getModules();
-    }
-    
-    public /* non api */ IChildModuleReference[] getExportModelChildren() throws CoreException {
-    	IFlatVirtualComponent em = getFlatComponent();
-    	IChildModuleReference[] children = em.getChildModules();
-    	return children;
-    }
-    
-    public IModule[] getModules() {
-    	// Legacy, here in case the old modules are used
-    	if( component.isBinary() ) 
-    		return new IModule[]{};
-    		
-    	try {
-    		List<IModule> modules = new ArrayList<IModule>();
-	    	IChildModuleReference[] children = getExportModelChildren();
-	    	for( int i = 0; i < children.length; i++ ) {
-	    		IModule child = gatherModuleReference(component, children[i]);
-	    		if( child != null )
-	    			modules.add(child);
-	    	}
-	    	return modules.toArray(new IModule[modules.size()]);
-    	} catch( CoreException ce ) {
-    	}
-    	return new IModule[]{};
-	}
-    
-	@Override
-	public String getPath(IModule m) {
-		return getURI(m);
-	}
-
-	/**
-	 * Returns the URI of the given contained CHILD module.
-	 * 
-	 * SOFT requirements (NOT API!!) in use by some adopters
-	 * If the passed in module is equal to this module, return our own deployed name
-	 *
-	 * @param module a module
-	 * @return the URI of the given module, or <code>null</code> if the URI could
-	 *    not be found
-	 */
-	public String getURI(IModule module) {
-		ProjectModule md = (ProjectModule)module.loadAdapter(ProjectModule.class, new NullProgressMonitor());
-		if( md == this ) {
-			// guess my own name
-			return VirtualReferenceUtilities.INSTANCE.getDefaultProjectArchiveName(this.component);
-		}
-		try {
-			FlatComponentDeployable cd = (FlatComponentDeployable)module.loadAdapter(FlatComponentDeployable.class, new NullProgressMonitor());
-			if( cd != null ) {
-		    	IFlatVirtualComponent em = getFlatComponent();
-		    	IChildModuleReference[] children = em.getChildModules();
-		    	for( int i = 0; i < children.length; i++ ) {
-		    		IModule child = gatherModuleReference(component, children[i]);
-		    		if( child != null && child.getId().equals(module.getId()))
-		    			return children[i].getRelativeURI().toString();
-		    	}
-			}
-		} catch( CoreException ce ) {
-		}
-		return null;
-	}
-    
-    /**
-     * If I know how to find an IModule for this child, do so now
-     * 
-     * I would love to see this replaced with some API to locate a 
-     * possible child module based on a virtual component.
-     * 
-     * @param component
-     * @param targetComponent
-     * @return
-     */
-    protected IModule gatherModuleReference(IVirtualComponent component, IChildModuleReference child) {
-    	// Handle workspace project module components
-    	// Subclasses should extend 
-    	IVirtualComponent targetComponent = child.getComponent();
-    	if (targetComponent != null && targetComponent.getProject()!= component.getProject()) {
-			if (!targetComponent.isBinary()) {
-				return filterModuleDelegates(ServerUtil.getModules(targetComponent.getProject()));
-			}
-		}
-		return null;
-    }
-    	
-    /**
-     * An extender may wish to override this method in order to control which
-     * delegate is returned in the scenario where more than one exist.  By default
-     * the first one found is returned.
-     * 
-     * @param IModule[] modules
-     * @return IModule[]
-     */
-    protected IModule filterModuleDelegates(IModule[] modules) {
-    	for (int i = 0; i < modules.length; i++) {
-			ModuleDelegate md = (ModuleDelegate)modules[i].loadAdapter(ModuleDelegate.class, new NullProgressMonitor());
-			if (md instanceof ProjectModule) {
-				return modules[i];
-			}
-		}
-    	return modules.length > 0 ? modules[0] : null;
-	}
-    
-    /*
-     * Below are STATIC utility classes and methods
-     */
-	protected static IModuleResource[] convert(IFlatResource[] resources) {
-		ArrayList<IModuleResource> list = new ArrayList<IModuleResource>();
-		for( int i = 0; i < resources.length; i++ ) {
-			if( resources[i] instanceof IFlatFile)
-				list.add(new ComponentModuleFile(resources[i]));
-			else if( resources[i] instanceof IFlatFolder) 
-				list.add(new ComponentModuleFolder(resources[i]));
-		}
-		return list.toArray(new IModuleResource[list.size()]);
-	}
-	
-	public static class ComponentModuleResource {
-		protected IFlatResource delegate;
-		public ComponentModuleResource(IFlatResource resource) {
-			this.delegate = resource;
-		}
-		public long getModificationStamp() {
-			return ((IFlatFile)delegate).getModificationStamp();
-		}
-		
-		public IPath getModuleRelativePath() {
-			return delegate.getModuleRelativePath();
-		}
-		public String getName() {
-			return delegate.getName();
-		}
-		public Object getAdapter(Class adapter) {
-			return delegate.getAdapter(adapter);
-		}
-		public IModuleResource[] members() {
-			IFlatResource[] children = ((IFlatFolder)delegate).members();
-			return convert(children);
-		}
-
-		@Override
-		public String toString() {
-
-			return getName();
-		}
-	}
-
-	public static class ComponentModuleFile extends ComponentModuleResource implements IModuleFile{
-		public ComponentModuleFile(IFlatResource resource) {
-			super(resource);
-		}
-		
-		@Override
-		public boolean equals(Object obj) {
-			if (obj == this)
-				return true;
-			
-			if (!(obj instanceof IModuleFile))
-				return false;
-			
-			IModuleFile mf = (IModuleFile) obj;
-			if (!getName().equals(mf.getName()))
-				return false;
-			if (!getModuleRelativePath().equals(mf.getModuleRelativePath()))
-				return false;
-			return true;
-		}
-		
-		@Override
-		public int hashCode() {
-			return getName().hashCode() * 37 + getModuleRelativePath().hashCode();
-		}
-	}
-
-	public static class ComponentModuleFolder extends ComponentModuleResource implements IModuleFolder {
-		public ComponentModuleFolder(IFlatResource resource) {
-			super(resource);
-		}
-
-		@Override
-		public boolean equals(Object obj) {
-			if (obj == this)
-				return true;
-			
-			if (!(obj instanceof IModuleFolder))
-				return false;
-			
-			IModuleFolder mf = (IModuleFolder) obj;
-			if (!getName().equals(mf.getName()))
-				return false;
-			if (!getModuleRelativePath().equals(mf.getModuleRelativePath()))
-				return false;
-			return true;
-		}
-		
-		@Override
-		public int hashCode() {
-			return getName().hashCode() * 37 + getModuleRelativePath().hashCode();
-		}
-	}
-
-	protected static boolean isProjectOfType(IProject project, String typeID) {
-		IFacetedProject facetedProject = null;
-		try {
-			facetedProject = ProjectFacetsManager.create(project);
-		} catch (CoreException e) {
-			return false;
-		}
-		
-		if (facetedProject !=null && ProjectFacetsManager.isProjectFacetDefined(typeID)) {
-			IProjectFacet projectFacet = ProjectFacetsManager.getProjectFacet(typeID);
-			return projectFacet!=null && facetedProject.hasProjectFacet(projectFacet);
-		}
-		return false;
-	}
-}
diff --git a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/deployables/IFlatDeployable.java b/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/deployables/IFlatDeployable.java
deleted file mode 100644
index cf28154..0000000
--- a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/deployables/IFlatDeployable.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 Red Hat 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:
- *     Red Hat - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.web.internal.deployables;
-
-import org.eclipse.wst.common.componentcore.internal.flat.IFlattenParticipant;
-
-public interface IFlatDeployable {
-	/**
-	 * Get a list of current flatten participants for this deployable
-	 * @return
-	 */
-	public IFlattenParticipant[] getParticipants();
-
-	/**
-	 * Get a list of current flatten participant id's for this deployable
-	 * @return
-	 */
-	public String[] getParticipantIds();
-
-	/**
-	 * Get a list of default flatten participants involved
-	 * for this module type
-	 * 
-	 * @return
-	 */
-	public String[] getDefaultFlattenParticipantIDs();
-	
-	/**
-	 * Add the flatten participant of the given id
-	 * and persist it in the project settings.
-	 * 
-	 * @param id
-	 * @param position
-	 * @return
-	 */
-	public void addFlattenParticipant(String id, int position);
-	
-	/**
-	 * Remove the flatten participant of the given id
-	 * and persist it in the project settings.
-	 * 
-	 * @param id
-	 * @return
-	 */
-	public void removeFlattenParticipant(String id);
-	
-
-}
diff --git a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/deployables/IStaticWebModuleArtifact.java b/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/deployables/IStaticWebModuleArtifact.java
deleted file mode 100644
index 7fd5bfb..0000000
--- a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/deployables/IStaticWebModuleArtifact.java
+++ /dev/null
@@ -1,14 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 2004 IBM 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: IBM Corporation - initial API and implementation
- **************************************************************************************************/
-
-package org.eclipse.wst.web.internal.deployables;
-
-public interface IStaticWebModuleArtifact {
-
-}
diff --git a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/deployables/StaticWebDeployable.java b/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/deployables/StaticWebDeployable.java
deleted file mode 100644
index a8e0b9a..0000000
--- a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/deployables/StaticWebDeployable.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM 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:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.web.internal.deployables;
-
-import java.util.Properties;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.wst.common.componentcore.internal.util.IModuleConstants;
-import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-import org.eclipse.wst.common.project.facet.core.IFacetedProject;
-import org.eclipse.wst.common.project.facet.core.IProjectFacet;
-import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
-import org.eclipse.wst.server.core.util.IStaticWeb;
-
-public class StaticWebDeployable extends FlatComponentDeployable implements IStaticWeb {
-
-	public StaticWebDeployable(IProject project, IVirtualComponent component) {
-		super(project);
-	}
-	
-	public String getContextRoot() {
-		Properties props = component.getMetaProperties();
-		if(props.containsKey("context-root")) //$NON-NLS-1$
-			return props.getProperty("context-root"); //$NON-NLS-1$
-	    return component.getName();
-    }
-	
-	/* TODO This is never called ?? */
-//	 public String getURI(IModule module) {
-//	    IVirtualComponent comp = ComponentCore.createComponent(module.getProject());
-//	    String aURI = null;
-//	    if (comp !=null) {
-//	    	if (!comp.isBinary() && isProjectOfType(module.getProject(),IModuleConstants.WST_WEB_MODULE)) {
-//        		IVirtualReference ref = component.getReference(comp.getName());
-//        		aURI = ref.getRuntimePath().append(comp.getName()+".war").toString(); //$NON-NLS-1$
-//        	}
-//	    }
-//	    	
-//    	if (aURI !=null && aURI.length()>1 && aURI.startsWith("/")) //$NON-NLS-1$
-//    		aURI = aURI.substring(1);
-//    	return aURI;
-//	 }
-	 
-	public String getVersion() {
-		IFacetedProject facetedProject = null;
-		try {
-			facetedProject = ProjectFacetsManager.create(component.getProject());
-			if (facetedProject !=null && ProjectFacetsManager.isProjectFacetDefined(IModuleConstants.WST_WEB_MODULE)) {
-				IProjectFacet projectFacet = ProjectFacetsManager.getProjectFacet(IModuleConstants.WST_WEB_MODULE);
-				return facetedProject.getInstalledVersion(projectFacet).getVersionString();
-			}
-		} catch (Exception e) {
-			//Ignore
-		}
-		return "1.0"; //$NON-NLS-1$
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/deployables/StaticWebDeployableFactory.java b/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/deployables/StaticWebDeployableFactory.java
deleted file mode 100644
index 4c4c6f0..0000000
--- a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/deployables/StaticWebDeployableFactory.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM 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:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.web.internal.deployables;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.wst.common.componentcore.ComponentCore;
-import org.eclipse.wst.common.componentcore.ModuleCoreNature;
-import org.eclipse.wst.common.componentcore.internal.StructureEdit;
-import org.eclipse.wst.common.componentcore.internal.util.IModuleConstants;
-import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-import org.eclipse.wst.common.project.facet.core.IFacetedProject;
-import org.eclipse.wst.common.project.facet.core.IProjectFacet;
-import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
-import org.eclipse.wst.server.core.IModule;
-import org.eclipse.wst.server.core.model.ModuleDelegate;
-import org.eclipse.wst.server.core.util.ProjectModuleFactoryDelegate;
-import org.eclipse.wst.web.internal.WSTWebPlugin;
-
-public class StaticWebDeployableFactory extends ProjectModuleFactoryDelegate {
-	private static final String ID = "org.eclipse.wst.web.internal.deployables.static"; //$NON-NLS-1$
-	protected ArrayList moduleDelegates = new ArrayList();
-
-	/*
-	 * @see DeployableProjectFactoryDelegate#getFactoryID()
-	 */
-	public static String getFactoryId() {
-		return ID;
-	}
-	
-	/**
-	 * Use {@link #createModules(IProject)} instead.
-	 * @deprecated
-	 * @param nature
-	 * @return
-	 */
-	protected IModule[] createModules(ModuleCoreNature nature) {
-		if(nature != null){
-			return createModules(nature.getProject());
-		}
-		return null;
-	}
-	/**
-	 * Returns true if the project represents a deployable project of this type.
-	 * 
-	 * @param project
-	 *            org.eclipse.core.resources.IProject
-	 * @return boolean
-	 */
-	protected boolean isValidModule(IProject project) {
-		try {
-			IFacetedProject facetedProject = ProjectFacetsManager.create(project);
-			if (facetedProject == null)
-				return false;
-			IProjectFacet webFacet = ProjectFacetsManager.getProjectFacet(IModuleConstants.WST_WEB_MODULE);
-			return facetedProject.hasProjectFacet(webFacet);
-		} catch (Exception e) {
-			return false;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.server.core.model.ModuleFactoryDelegate#getModuleDelegate(org.eclipse.wst.server.core.IModule)
-	 */
-	@Override
-	public ModuleDelegate getModuleDelegate(IModule module) {
-		for (Iterator iter = moduleDelegates.iterator(); iter.hasNext();) {
-			ModuleDelegate element = (ModuleDelegate) iter.next();
-			if (module == element.getModule())
-				return element;
-		}
-		return null;
-
-	}
-
-	@Override
-	protected IModule[] createModules(IProject project) {
-		IVirtualComponent component = ComponentCore.createComponent(project);
-		if(component != null){
-			try {
-				return createModuleDelegates(component);
-			} catch (CoreException e) {
-				WSTWebPlugin.logError(e);
-			}
-		}
-		return null;
-	}
-
-	protected IModule[] createModuleDelegates(IVirtualComponent component) throws CoreException {
-		if(component == null){
-			return null;
-		}
-		StaticWebDeployable moduleDelegate = null;
-		IModule module = null;
-		try {
-			if(isValidModule(component.getProject())) {
-				moduleDelegate = new StaticWebDeployable(component.getProject(),component);
-				module = createModule(component.getName(), component.getName(), IModuleConstants.WST_WEB_MODULE, moduleDelegate.getVersion(), moduleDelegate.getProject());
-				moduleDelegate.initialize(module);
-			}
-		} catch (Exception e) {
-			WSTWebPlugin.logError(e);
-		} finally {
-			if (module != null) {
-				if (getModuleDelegate(module) == null)
-					moduleDelegates.add(moduleDelegate);
-			}
-		}
-		if (module == null)
-			return null;
-		return new IModule[] {module};
-	}
-	
-	/**
-	 * Returns the list of resources that the module should listen to
-	 * for state changes. The paths should be project relative paths.
-	 * Subclasses can override this method to provide the paths.
-	 *
-	 * @return a possibly empty array of paths
-	 */
-	@Override
-	protected IPath[] getListenerPaths() {
-		return new IPath[] {
-			new Path(".project"), // nature //$NON-NLS-1$
-			new Path(StructureEdit.MODULE_META_FILE_NAME), // component
-			new Path(".settings/org.eclipse.wst.common.project.facet.core.xml") // facets //$NON-NLS-1$
-		};
-	}
-}
diff --git a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/deployables/StaticWebDeployableObjectAdapter.java b/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/deployables/StaticWebDeployableObjectAdapter.java
deleted file mode 100644
index b4ed6ad..0000000
--- a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/deployables/StaticWebDeployableObjectAdapter.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 2004 IBM 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: IBM Corporation - initial API and implementation
- **************************************************************************************************/
-
-package org.eclipse.wst.web.internal.deployables;
-
-import org.eclipse.core.runtime.IAdapterFactory;
-import org.eclipse.wst.server.core.IModuleArtifact;
-import org.eclipse.wst.server.core.model.ModuleArtifactAdapterDelegate;
-
-public class StaticWebDeployableObjectAdapter extends ModuleArtifactAdapterDelegate implements IAdapterFactory
-
-{
-
-	public StaticWebDeployableObjectAdapter() {
-		super();
-	}
-
-	public Object getAdapter(Object adaptableObject, Class adapterType) {
-		return null;
-	}
-
-	public Class[] getAdapterList() {
-		return new Class[]{IStaticWebModuleArtifact.class};
-	}
-
-	@Override
-	public IModuleArtifact getModuleArtifact(Object obj) {
-		return StaticWebDeployableObjectAdapterUtil.getModuleObject(obj);
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/deployables/StaticWebDeployableObjectAdapterUtil.java b/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/deployables/StaticWebDeployableObjectAdapterUtil.java
deleted file mode 100644
index 4049324..0000000
--- a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/deployables/StaticWebDeployableObjectAdapterUtil.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2007 IBM 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:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.wst.web.internal.deployables;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
-import org.eclipse.wst.common.componentcore.ComponentCore;
-import org.eclipse.wst.common.componentcore.internal.util.IModuleConstants;
-import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-import org.eclipse.wst.common.project.facet.core.IFacetedProject;
-import org.eclipse.wst.common.project.facet.core.IProjectFacet;
-import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
-import org.eclipse.wst.server.core.IModule;
-import org.eclipse.wst.server.core.IModuleArtifact;
-import org.eclipse.wst.server.core.ServerUtil;
-import org.eclipse.wst.server.core.util.WebResource;
-
-public class StaticWebDeployableObjectAdapterUtil {
-
-	private final static String[] extensionsToExclude = new String[]{"sql", "xmi"}; //$NON-NLS-1$ //$NON-NLS-2$
-	static String INFO_DIRECTORY = "WEB-INF"; //$NON-NLS-1$
-
-	public static IModuleArtifact getModuleObject(Object obj) {
-		IResource resource = null;
-		if (obj instanceof IResource)
-			resource = (IResource) obj;
-		else if (obj instanceof IAdaptable)
-			resource = ((IAdaptable) obj).getAdapter(IResource.class);
-		
-		if (resource == null)
-			return null;
-		
-		if (resource instanceof IProject) {
-			IProject project = (IProject) resource;
-			if (hasInterestedComponents(project))
-				return new WebResource(getModule(project), new Path("")); //$NON-NLS-1$
-			return null;	
-		}
-		
-		IProject project = ProjectUtilities.getProject(resource);
-		if (project != null && !hasInterestedComponents(project))
-			return null;
-		
-		IVirtualComponent comp = ComponentCore.createComponent(project);
-		// determine path
-		IPath rootPath = comp.getRootFolder().getProjectRelativePath();
-		IPath resourcePath = resource.getProjectRelativePath();
-
-		// Check to make sure the resource is under the webApplication directory
-		if (resourcePath.matchingFirstSegments(rootPath) != rootPath.segmentCount())
-			return null;
-
-		// Do not allow resource under the web-inf directory
-		resourcePath = resourcePath.removeFirstSegments(rootPath.segmentCount());
-		if (resourcePath.segmentCount() > 1 && resourcePath.segment(0).equals(INFO_DIRECTORY))
-			return null;
-
-		if (shouldExclude(resource))
-			return null;
-
-		// return Web resource type
-		return new WebResource(getModule(project), resourcePath);
-
-	}
-
-	/**
-	 * Method shouldExclude.
-	 * 
-	 * @param resource
-	 * @return boolean
-	 */
-	private static boolean shouldExclude(IResource resource) {
-		String fileExt = resource.getFileExtension();
-
-		// Exclude files of certain extensions
-		for (int i = 0; i < extensionsToExclude.length; i++) {
-			String extension = extensionsToExclude[i];
-			if (extension.equalsIgnoreCase(fileExt))
-				return true;
-		}
-		return false;
-	}
-
-	protected static IModule getModule(IProject project) {
-		if (hasInterestedComponents(project))
-			return ServerUtil.getModule(project);
-		return null;
-	}
-	
-	protected static boolean hasInterestedComponents(IProject project) {
-		return isProjectOfType(project, IModuleConstants.WST_WEB_MODULE);
-	}
-	
-	protected static boolean isProjectOfType(IProject project, String typeID) {
-		IFacetedProject facetedProject = null;
-		try {
-			facetedProject = ProjectFacetsManager.create(project);
-		} catch (CoreException e) {
-			return false;
-		}
-
-		if (facetedProject != null && ProjectFacetsManager.isProjectFacetDefined(typeID)) {
-			IProjectFacet projectFacet = ProjectFacetsManager.getProjectFacet(typeID);
-			return projectFacet != null && facetedProject.hasProjectFacet(projectFacet);
-		}
-		return false;
-	}
-}
diff --git a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/facet/MappingDescriptor.java b/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/facet/MappingDescriptor.java
deleted file mode 100644
index 8b5f3c5..0000000
--- a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/facet/MappingDescriptor.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package org.eclipse.wst.web.internal.facet;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-
-public class MappingDescriptor {
-
-	protected IConfigurationElement element = null;
-
-	public MappingDescriptor(IConfigurationElement configurationElement) {
-		this.element = configurationElement;
-	}
-
-	public IConfigurationElement getElement() {
-		return element;
-	}
-
-	public String getID() {
-		return element.getAttribute(RuntimePresetMappingRegistry.ATTRIBUTE_ID);
-	}
-	
-	public String getFacetRuntimeTypeID() {
-		return element.getAttribute(RuntimePresetMappingRegistry.ATTRIBUTE_FACET_RUNTIME_TYPE_ID);
-	}
-
-	public String getFacetRuntimeVersion() {
-		return element.getAttribute(RuntimePresetMappingRegistry.ATTRIBUTE_FACET_RUNTIME_VERSION);
-	}
-	
-	public String getFacetID() {
-		return element.getAttribute(RuntimePresetMappingRegistry.ATTRIBUTE_FACET_ID);
-	}
-
-	public String getFacetVersion() {
-		return element.getAttribute(RuntimePresetMappingRegistry.ATTRIBUTE_FACET_VERSION);
-	}
-
-	public String getPresetID() {
-		return element.getAttribute(RuntimePresetMappingRegistry.ATTRIBUTE_PRESET_ID);
-	}
-
-	@Override
-	public String toString() {
-		StringBuffer buff = new StringBuffer();
-		buff.append("id:"); //$NON-NLS-1$
-		buff.append(getID());
-		buff.append(" facetRuntimeTypeID:"); //$NON-NLS-1$
-		buff.append(getFacetRuntimeTypeID());
-		buff.append(" facetRuntimeVersion:"); //$NON-NLS-1$
-		buff.append(getFacetRuntimeVersion());
-		buff.append(" facetID:"); //$NON-NLS-1$
-		buff.append(getFacetID());
-		buff.append(" facetVersion:"); //$NON-NLS-1$
-		buff.append(getFacetVersion());
-		buff.append(" presetID:"); //$NON-NLS-1$
-		buff.append(getPresetID());
-		return buff.toString();
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/facet/RuntimePresetMappingRegistry.java b/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/facet/RuntimePresetMappingRegistry.java
deleted file mode 100644
index b2bcd0b..0000000
--- a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/facet/RuntimePresetMappingRegistry.java
+++ /dev/null
@@ -1,261 +0,0 @@
-package org.eclipse.wst.web.internal.facet;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.StringTokenizer;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.wst.common.project.facet.core.IProjectFacet;
-import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
-import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
-import org.eclipse.wst.common.project.facet.core.runtime.IRuntimeComponentType;
-import org.eclipse.wst.common.project.facet.core.runtime.IRuntimeComponentVersion;
-import org.eclipse.wst.common.project.facet.core.runtime.RuntimeManager;
-import org.eclipse.wst.web.internal.WSTWebPlugin;
-
-public class RuntimePresetMappingRegistry {
-
-	static final String EXTENSION_POINT = "runtimePresetMappings"; //$NON-NLS-1$
-
-	static final String ELEMENT_MAPPING = "mapping"; //$NON-NLS-1$
-
-	static final String ATTRIBUTE_ID = "id"; //$NON-NLS-1$
-
-	static final String ATTRIBUTE_FACET_RUNTIME_TYPE_ID = "facetRuntimeTypeID"; //$NON-NLS-1$
-
-	static final String ATTRIBUTE_FACET_RUNTIME_VERSION = "facetRuntimeVersion"; //$NON-NLS-1$
-
-	static final String ATTRIBUTE_FACET_ID = "facetID"; //$NON-NLS-1$
-
-	static final String ATTRIBUTE_FACET_VERSION = "facetVersion"; //$NON-NLS-1$
-
-	static final String ATTRIBUTE_PRESET_ID = "presetID"; //$NON-NLS-1$
-
-	public static RuntimePresetMappingRegistry INSTANCE = new RuntimePresetMappingRegistry();
-
-	private List<MappingDescriptor> descriptors = null;
-
-	public String getPresetID(String facetRuntimeTypeID,
-			String facetRuntimeVersion, String facetID, String facetVersion) {
-		if (descriptors == null) {
-			readDescriptors();
-		}
-		for (MappingDescriptor descriptor : descriptors) {
-			if(matches(facetRuntimeTypeID, descriptor.getFacetRuntimeTypeID()) &&
-			   matches(facetRuntimeVersion, descriptor.getFacetRuntimeVersion()) &&
-			   matches(facetID, descriptor.getFacetID()) &&
-			   matches(facetVersion, descriptor.getFacetVersion())){
-				return descriptor.getPresetID();
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns true if the value is matched by the pattern The pattern consists
-	 * of a common deliminated list of simple patterns Each simple pattern has
-	 * an optional starting or ending * so a String.startsWith() or
-	 * String.endsWith(). Both may be combined to compute a String.indexOf() !=
-	 * -1
-	 *
-	 * @param value
-	 * @param pattern
-	 * @return
-	 */
-	private static boolean matches(String value, String pattern){
-		StringTokenizer strTok = new StringTokenizer(pattern, ","); //$NON-NLS-1$
-		while(strTok.hasMoreTokens()){
-			String simplePattern = strTok.nextToken().trim();
-			if(simplePattern.startsWith("*")){ //$NON-NLS-1$
-				if(simplePattern.length() < 2){
-					return true; // i.e. *
-				}
-				if(simplePattern.endsWith("*")){ //$NON-NLS-1$
-					if(simplePattern.length() < 3){ 
-						return true; // i.e. **
-					}
-					if(value.indexOf(simplePattern.substring(1, simplePattern.length()-2)) != -1){
-						return true;
-					}
-				} else {
-					if(value.endsWith(simplePattern.substring(1))){
-						return true;
-					}
-				}
-			} else if(simplePattern.endsWith("*")){ //$NON-NLS-1$
-				if(value.startsWith(simplePattern.substring(0, simplePattern.length()-2))){
-					return true;
-				}
-			} else if(value.equals(simplePattern)){
-				return true;
-			}
-		}
-		return false;
-	}
-	
-	private static List <String> getStaticTokens(String pattern){
-		List <String> staticTokens = new ArrayList <String> ();
-		StringTokenizer strTok = new StringTokenizer(pattern, ","); //$NON-NLS-1$
-		while(strTok.hasMoreTokens()){
-			String simplePattern = strTok.nextToken().trim();
-			if(!simplePattern.startsWith("*") && !simplePattern.endsWith("*")){ //$NON-NLS-1$ //$NON-NLS-2$
-				staticTokens.add(simplePattern);
-			}
-		}
-		return staticTokens;
-	}
-	
-	
-	private void readDescriptors() {
-		descriptors = new ArrayList<MappingDescriptor>();
-		IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(WSTWebPlugin.PLUGIN_ID, EXTENSION_POINT);
-		if (point == null)
-			return;
-		IConfigurationElement[] elements = point.getConfigurationElements();
-		for (int i = 0; i < elements.length; i++) {
-			IConfigurationElement element = elements[i];
-			if (ELEMENT_MAPPING.equals(element.getName())) {
-				String id = element.getAttribute(ATTRIBUTE_ID);
-				if (null == id || id.trim().length() == 0) {
-					WSTWebPlugin.logError("Extension: " + EXTENSION_POINT + " Element: " + ELEMENT_MAPPING + " is missing attribute " + ATTRIBUTE_ID); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-					continue;
-				}
-
-				String runtimeID = element.getAttribute(ATTRIBUTE_FACET_RUNTIME_TYPE_ID);
-				if (null == runtimeID || runtimeID.trim().length() == 0) {
-					WSTWebPlugin.logError("Extension: " + EXTENSION_POINT + " Element: " + ELEMENT_MAPPING + " is missing attribute " + ATTRIBUTE_FACET_RUNTIME_TYPE_ID); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-					continue;
-				}
-
-				List <String> staticRuntimeIDs = getStaticTokens(runtimeID);
-				List <IRuntimeComponentType> staticRuntimeTypes = new ArrayList<IRuntimeComponentType>();
-				for(String staticRuntimeID : staticRuntimeIDs){
-					try {
-						IRuntimeComponentType runtimeType = RuntimeManager.getRuntimeComponentType(staticRuntimeID);
-						if(runtimeType != null){
-							staticRuntimeTypes.add(runtimeType);
-						}
-					} catch (IllegalArgumentException e) {
-						WSTWebPlugin.logError("Extension: " + EXTENSION_POINT + " Element: " + ELEMENT_MAPPING + " defined invalid attribute " + ATTRIBUTE_FACET_RUNTIME_TYPE_ID + ": " + runtimeID +" unable to resolve runtime: "+staticRuntimeID, e); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
-					}
-				}
-					
-				String runtimeVersionStr = element.getAttribute(ATTRIBUTE_FACET_RUNTIME_VERSION);
-				if (null == runtimeVersionStr || runtimeVersionStr.trim().length() == 0) {
-					WSTWebPlugin.logError("Extension: " + EXTENSION_POINT + " Element: " + ELEMENT_MAPPING + " is missing attribute " + ATTRIBUTE_FACET_RUNTIME_VERSION); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-					continue;
-				}
-				if(!staticRuntimeTypes.isEmpty()){
-					List <String> staticRuntimeVersions = getStaticTokens(runtimeVersionStr);
-					for(String staticVersion : staticRuntimeVersions){
-						boolean foundVersion = false;
-						for(int k=0;k<staticRuntimeTypes.size() && !foundVersion;k++){
-							IRuntimeComponentType runtimeType = staticRuntimeTypes.get(k);
-							try {
-								runtimeType.getVersion(staticVersion);
-								foundVersion = true;
-							} catch (IllegalArgumentException e) {
-								//eat it
-							}
-						}
-						if(!foundVersion){
-							StringBuffer validVersions = new StringBuffer(" valid versions include: "); //$NON-NLS-1$
-							for(IRuntimeComponentType runtimeType : staticRuntimeTypes) {
-								validVersions.append("\n"); //$NON-NLS-1$
-								validVersions.append(runtimeType.getId());
-								validVersions.append(": "); //$NON-NLS-1$
-								for (Iterator<IRuntimeComponentVersion> iterator = runtimeType.getVersions().iterator(); iterator.hasNext();) {
-									validVersions.append(iterator.next().getVersionString());
-									if (iterator.hasNext()) {
-										validVersions.append(" "); //$NON-NLS-1$
-									}
-								}
-							}
-							WSTWebPlugin.logError("Extension: " + EXTENSION_POINT + " Element: " + ELEMENT_MAPPING + " defined invalid attribute " + ATTRIBUTE_FACET_RUNTIME_VERSION + ": " + staticVersion //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-									+ validVersions);
-						}
-					}
-				}
-				
-				String facetID = element.getAttribute(ATTRIBUTE_FACET_ID);
-				if (null == facetID || facetID.trim().length() == 0) {
-					WSTWebPlugin.logError("Extension: " + EXTENSION_POINT + " Element: " + ELEMENT_MAPPING + " is missing attribute " + ATTRIBUTE_FACET_ID); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-					continue;
-				}
-				
-				List <String> staticFacetIDs = getStaticTokens(facetID);
-				List <IProjectFacet> staticFacets = new ArrayList <IProjectFacet>();
-				for(String staticFacetID:staticFacetIDs){
-					try {
-						IProjectFacet facet = ProjectFacetsManager.getProjectFacet(staticFacetID);
-						if(null != facet){
-							staticFacets.add(facet);
-						}
-					} catch (IllegalArgumentException e) {
-						WSTWebPlugin.logError("Extension: " + EXTENSION_POINT + " Element: " + ELEMENT_MAPPING + " defined invalid attribute " + ATTRIBUTE_FACET_ID + ": " + staticFacetID, e); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-					}
-				}
-				
-				String facetVersionStr = element.getAttribute(ATTRIBUTE_FACET_VERSION);
-				if (null == facetVersionStr || facetVersionStr.trim().length() == 0) {
-					WSTWebPlugin.logError("Extension: " + EXTENSION_POINT + " Element: " + ELEMENT_MAPPING + " is missing attribute " + ATTRIBUTE_FACET_VERSION); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-					continue;
-				}
-				List <String>staticFacetVersionStrs = getStaticTokens(facetVersionStr);
-				if(!staticFacets.isEmpty() && !staticFacetVersionStrs.isEmpty()){
-					for(String staticFacetVersion:staticFacetVersionStrs){
-						boolean foundFacetVersion = false;
-						for(int k=0;k< staticFacets.size() && !foundFacetVersion; k++) {
-							IProjectFacet staticFacet = staticFacets.get(k);
-							try {
-								IProjectFacetVersion staticVersion = staticFacet.getVersion(staticFacetVersion);
-								if(staticVersion != null){
-									foundFacetVersion = true;
-								}
-							} catch (IllegalArgumentException e) {
-								//eat it
-							}
-						}
-						if(!foundFacetVersion){
-							StringBuffer validVersions = new StringBuffer(" valid versions include: "); //$NON-NLS-1$
-							for(IProjectFacet staticFacet:staticFacets){
-								validVersions.append("\n"); //$NON-NLS-1$
-								validVersions.append(staticFacet.getId());
-								validVersions.append(": "); //$NON-NLS-1$
-								for (Iterator<IProjectFacetVersion> iterator = staticFacet.getVersions().iterator(); iterator.hasNext();) {
-									validVersions.append(iterator.next().getVersionString());
-									if (iterator.hasNext()) {
-										validVersions.append(" "); //$NON-NLS-1$
-									}
-								}
-							}
-							WSTWebPlugin.logError("Extension: " + EXTENSION_POINT + " Element: " + ELEMENT_MAPPING + " defined invalid attribute " + ATTRIBUTE_FACET_VERSION + ": " + staticFacetVersion //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-									+ validVersions);
-							continue;
-						}
-					}	
-				}
-				String presetID = element.getAttribute(ATTRIBUTE_PRESET_ID);
-				if (null == presetID || presetID.trim().length() == 0) {
-					WSTWebPlugin.logError("Extension: " + EXTENSION_POINT + " Element: " + ELEMENT_MAPPING + " is missing attribute " + ATTRIBUTE_PRESET_ID); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-					continue;
-				}
-				try {
-					ProjectFacetsManager.getPreset(presetID);
-				} catch (IllegalArgumentException e) {
-					WSTWebPlugin.logError("Extension: " + EXTENSION_POINT + " Element: " + ELEMENT_MAPPING + " defined invalid attribute " + ATTRIBUTE_PRESET_ID + ": " + presetID, e); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-					continue;
-				}
-				MappingDescriptor descriptor = new MappingDescriptor(element);
-				descriptors.add(descriptor);
-			} else {
-				WSTWebPlugin.logError("Elements must be named: " + ELEMENT_MAPPING + " within the extension: " + EXTENSION_POINT); //$NON-NLS-1$ //$NON-NLS-2$
-				WSTWebPlugin.logError("Element: " + element.getName() + " is invalid within the extension: " + EXTENSION_POINT); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/operation/IWebProjectPropertiesUpdateDataModelProperties.java b/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/operation/IWebProjectPropertiesUpdateDataModelProperties.java
deleted file mode 100644
index 5d7622b..0000000
--- a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/operation/IWebProjectPropertiesUpdateDataModelProperties.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM 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:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.web.internal.operation;
-
-import org.eclipse.wst.common.componentcore.datamodel.properties.IServerContextRootDataModelProperties;
-
-/**
- * @deprecated Replaced by {@link IServerContextRootDataModelProperties}
- * 
- */
-public interface IWebProjectPropertiesUpdateDataModelProperties {
-
-	public static final String PROJECT = "IWebProjectPropertiesUpdateDataModelProperties.PROJECT"; //$NON-NLS-1$	
-	public static final String CONTEXT_ROOT = "IWebProjectPropertiesUpdateDataModelProperties.CONTEXT_ROOT"; //$NON-NLS-1$
-
-}
diff --git a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/operation/WebProjectPropertiesUpdateDataModelProvider.java b/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/operation/WebProjectPropertiesUpdateDataModelProvider.java
deleted file mode 100644
index b602f5a..0000000
--- a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/operation/WebProjectPropertiesUpdateDataModelProvider.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package org.eclipse.wst.web.internal.operation;
-
-/*******************************************************************************
- * Copyright (c) 2003, 2004, 2005 IBM 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:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-import java.util.Set;
-
-import org.eclipse.wst.common.componentcore.internal.operation.ServerContextRootDataModelProvider;
-import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelProvider;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
-
-/**
- * @deprecated Replaced by {@link ServerContextRootDataModelProvider}
- *
- */
-public class WebProjectPropertiesUpdateDataModelProvider 
- extends AbstractDataModelProvider
- implements IWebProjectPropertiesUpdateDataModelProperties{
-
-	public WebProjectPropertiesUpdateDataModelProvider(){
-		super();
-	}
-
-	@Override
-	public Set getPropertyNames() {
-		Set names = super.getPropertyNames();
-		names.add(PROJECT);
-		names.add(CONTEXT_ROOT);
-		return names;
-	}
-	
-	@Override
-	public IDataModelOperation getDefaultOperation() {
-		return new WebProjectPropertiesUpdateOperation(model);
-	}
-	
-}
diff --git a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/operation/WebProjectPropertiesUpdateOperation.java b/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/operation/WebProjectPropertiesUpdateOperation.java
deleted file mode 100644
index 71ab6e9..0000000
--- a/plugins/org.eclipse.wst.web/static_web_project/org/eclipse/wst/web/internal/operation/WebProjectPropertiesUpdateOperation.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package org.eclipse.wst.web.internal.operation;
-
-/*******************************************************************************
- * Copyright (c) 2003, 2004, 2005 IBM 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:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.wst.common.componentcore.internal.operation.ServerContextRootUpdateOperation;
-import org.eclipse.wst.common.componentcore.internal.util.ComponentUtilities;
-import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-
-
-
-
-/**
- * @deprecated 
- *   Replaced by {@link ServerContextRootUpdateOperation} 
- * @version 	1.0
- * @author
- */
-public class WebProjectPropertiesUpdateOperation 
- extends  AbstractDataModelOperation 
- implements IWebProjectPropertiesUpdateDataModelProperties{
-	
-
-	public WebProjectPropertiesUpdateOperation(IDataModel model) {
-		super(model);
-	}
-
-	@Override
-	public IStatus execute(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
-		IProject project = (IProject)model.getProperty( IWebProjectPropertiesUpdateDataModelProperties.PROJECT );
-		String contextRoot = model.getStringProperty( IWebProjectPropertiesUpdateDataModelProperties.CONTEXT_ROOT );
-		if (contextRoot != null) {
-			ComponentUtilities.setServerContextRoot(project, contextRoot);			
-		}
-		return OK_STATUS;
-	}
-
-}
diff --git a/plugins/org.eclipse.wtp.jee.capabilities/pom.xml b/plugins/org.eclipse.wtp.jee.capabilities/pom.xml
index 531d769..b2401f5 100644
--- a/plugins/org.eclipse.wtp.jee.capabilities/pom.xml
+++ b/plugins/org.eclipse.wtp.jee.capabilities/pom.xml
@@ -15,9 +15,8 @@
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <groupId>org.eclipse.webtools.javaee</groupId>
-    <artifactId>org.eclipse.webtools.javaee</artifactId>
+    <artifactId>javaee.plugins</artifactId>
     <version>3.6.0-SNAPSHOT</version>
-    <relativePath>../../</relativePath>
   </parent>
 
   <groupId>org.eclipse.webtools.javaee</groupId>
diff --git a/plugins/pom.xml b/plugins/pom.xml
new file mode 100644
index 0000000..02e1d2b
--- /dev/null
+++ b/plugins/pom.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Copyright (c) 2017 Eclipse Foundation and others.
+  All rights reserved. This program and the accompanying materials
+  are made available under the terms of the Eclipse Distribution License v1.0
+  which accompanies this distribution, and is available at
+  http://www.eclipse.org/org/documents/edl-v10.php
+ 
+  Contributors:
+    Nick Boldt (Red Hat) - initial implementation
+    Rob Stryker (Red Hat) - initial implementation
+-->
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.eclipse.webtools.javaee</groupId>
+    <artifactId>org.eclipse.webtools.javaee</artifactId>
+    <version>3.6.0-SNAPSHOT</version>
+  </parent>
+
+  <groupId>org.eclipse.webtools.javaee</groupId>
+  <artifactId>javaee.plugins</artifactId>
+  <version>3.6.0-SNAPSHOT</version>
+  <packaging>pom</packaging>
+
+  <modules>
+    <module>org.eclipse.jem</module>
+    <module>org.eclipse.jem.beaninfo</module>
+    <module>org.eclipse.jem.beaninfo.vm</module>
+    <module>org.eclipse.jem.beaninfo.vm.common</module>
+    <module>org.eclipse.jem.proxy</module>
+    <module>org.eclipse.jem.workbench</module>
+    <module>org.eclipse.jst.common.annotations.controller</module>
+    <module>org.eclipse.jst.common.annotations.core</module>
+    <module>org.eclipse.jst.common.annotations.ui</module>
+    <module>org.eclipse.jst.common.frameworks</module>
+    <module>org.eclipse.jst.common.ui</module>
+    <module>org.eclipse.jst.ejb.ui</module>
+    <module>org.eclipse.jst.j2ee</module>
+    <module>org.eclipse.jst.j2ee.core</module>
+    <module>org.eclipse.jst.j2ee.ejb</module>
+    <module>org.eclipse.jst.j2ee.ejb.annotation.model</module>
+    <module>org.eclipse.jst.j2ee.ejb.annotations.emitter</module>
+    <module>org.eclipse.jst.j2ee.ejb.annotations.ui</module>
+    <module>org.eclipse.jst.j2ee.ejb.annotations.xdoclet</module>
+    <module>org.eclipse.jst.j2ee.jca</module>
+    <module>org.eclipse.jst.j2ee.jca.ui</module>
+    <module>org.eclipse.jst.j2ee.navigator.ui</module>
+    <module>org.eclipse.jst.j2ee.ui</module>
+    <module>org.eclipse.jst.j2ee.web</module>
+    <module>org.eclipse.jst.j2ee.webservice</module>
+    <module>org.eclipse.jst.j2ee.webservice.ui</module>
+    <module>org.eclipse.jst.j2ee.xdoclet.runtime</module>
+    <module>org.eclipse.jst.jee</module>
+    <module>org.eclipse.jst.jee.ejb</module>
+    <module>org.eclipse.jst.jee.ui</module>
+    <module>org.eclipse.jst.jee.web</module>
+    <module>org.eclipse.jst.servlet.ui</module>
+    <module>org.eclipse.wtp.jee.capabilities</module>
+  </modules>
+</project>
diff --git a/pom.xml b/pom.xml
index d936719..91dd4ea 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,77 +1,80 @@
-<?xml version="1.0" encoding="UTF-8"?>

-<!--

-  Copyright (c) 2012, 2013 Eclipse Foundation and others.

-  All rights reserved. This program and the accompanying materials

-  are made available under the terms of the Eclipse Distribution License v1.0

-  which accompanies this distribution, and is available at

-  http://www.eclipse.org/org/documents/edl-v10.php

- 

-  Contributors:

-    Thanh Ha (Eclipse Foundation) - initial implementation

--->

-

-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"

-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

-  <modelVersion>4.0.0</modelVersion>

-

-  <parent>

-    <groupId>org.eclipse</groupId>

-    <artifactId>wtp-parent</artifactId>

-    <version>3.6.0-SNAPSHOT</version>

-    <relativePath>../wtp-parent</relativePath>

-  </parent>

-

-  <groupId>org.eclipse.webtools.javaee</groupId>

-  <artifactId>org.eclipse.webtools.javaee</artifactId>

-  <version>3.6.0-SNAPSHOT</version>

-  <packaging>pom</packaging>

-

-  <properties>

-    <tycho.scmUrl>scm:git:git://git.eclipse.org/gitroot/jeetools/webtools.javaee.git</tycho.scmUrl>

-  </properties>

-

-  <modules>

-    <module>docs/org.eclipse.jst.j2ee.doc.user</module>

-    <module>docs/org.eclipse.jst.j2ee.infopop</module>

-    <module>docs/org.eclipse.jst.servlet.ui.infopop</module>

-    <module>docs/org.eclipse.wst.web.ui.infopop</module>

-

-    <module>features/org.eclipse.jst.doc.user.feature</module>

-    <module>features/org.eclipse.jst.enterprise_core.feature</module>

-    <module>features/org.eclipse.jst.enterprise_sdk.feature</module>

-    <module>features/org.eclipse.jst.enterprise_ui.feature</module>

-    <module>features/org.eclipse.jst.enterprise_userdoc.feature</module>

-    <module>features/org.eclipse.jst.web_core.feature</module>

-    <module>features/org.eclipse.jst.web_sdk.feature</module>

-    <module>features/org.eclipse.jst.web_ui.feature</module>

-    <module>features/org.eclipse.jst.web_userdoc.feature</module>

-

-    <module>plugins/org.eclipse.jem</module>

-    <module>plugins/org.eclipse.jem.beaninfo</module>

-    <module>plugins/org.eclipse.jem.beaninfo.vm</module>

-    <module>plugins/org.eclipse.jem.beaninfo.vm.common</module>

-    <module>plugins/org.eclipse.jem.proxy</module>

-    <module>plugins/org.eclipse.jem.workbench</module>

-    <module>plugins/org.eclipse.jst.common.annotations.controller</module>

-    <module>plugins/org.eclipse.jst.common.annotations.core</module>

-    <module>plugins/org.eclipse.jst.common.annotations.ui</module>

-    <module>plugins/org.eclipse.jst.common.frameworks</module>

-    <module>plugins/org.eclipse.jst.common.ui</module>
-    <module>plugins/org.eclipse.jst.j2ee</module>

-    <module>plugins/org.eclipse.jst.j2ee.core</module>

-    <module>plugins/org.eclipse.jst.j2ee.jca</module>

-    <module>plugins/org.eclipse.jst.j2ee.jca.ui</module>

-    <module>plugins/org.eclipse.jst.j2ee.navigator.ui</module>

-    <module>plugins/org.eclipse.jst.j2ee.ui</module>

-    <module>plugins/org.eclipse.jst.j2ee.web</module>

-    <module>plugins/org.eclipse.jst.j2ee.webservice</module>

-    <module>plugins/org.eclipse.jst.j2ee.webservice.ui</module>

-    <module>plugins/org.eclipse.jst.jee</module>

-    <module>plugins/org.eclipse.jst.jee.ui</module>

-    <module>plugins/org.eclipse.jst.jee.web</module>

-    <module>plugins/org.eclipse.jst.servlet.ui</module>

-    <module>plugins/org.eclipse.wst.web</module>

-    <module>plugins/org.eclipse.wst.web.ui</module>

-    <module>plugins/org.eclipse.wtp.jee.capabilities</module>

-  </modules>

-</project>

+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!--
+  Copyright (c) 2012, 2013 Eclipse Foundation and others.
+  All rights reserved. This program and the accompanying materials
+  are made available under the terms of the Eclipse Distribution License v1.0
+  which accompanies this distribution, and is available at
+  http://www.eclipse.org/org/documents/edl-v10.php
+ 
+  Contributors:
+    Thanh Ha (Eclipse Foundation) - initial implementation
+    Nick Boldt (Red Hat Inc.) - support for Tycho 1.0 and upstream component builds
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.eclipse</groupId>
+    <artifactId>wtp-parent</artifactId>
+    <version>3.6.0-SNAPSHOT</version>
+    <relativePath>../wtp-parent</relativePath>
+  </parent>
+
+  <groupId>org.eclipse.webtools.javaee</groupId>
+  <artifactId>org.eclipse.webtools.javaee</artifactId>
+  <version>3.6.0-SNAPSHOT</version>
+  <packaging>pom</packaging>
+
+  <properties>
+    <tycho.scmUrl>scm:git:git://git.eclipse.org/gitroot/jeetools/webtools.javaee.git</tycho.scmUrl>
+    <tycho.version>1.0.0</tycho.version>
+    <tycho-extras.version>1.0.0</tycho-extras.version>
+  </properties>
+
+  <repositories>
+    <repository>
+      <id>webtools-common-site</id>
+      <layout>p2</layout>
+      <url>${webtools-common-site}</url>
+    </repository>
+    <!-- org.eclipse.jst.doc.user.feature requires org.eclipse.jst.server.ui.* -->
+    <repository>
+      <id>webtools-servertools-site</id>
+      <layout>p2</layout>
+      <url>${webtools-servertools-site}</url>
+    </repository>
+    <!-- org.eclipse.jst.doc.user.feature requires org.eclipse.jst.jsp.* -->
+    <repository>
+      <id>webtools-sourceediting-site</id>
+      <layout>p2</layout>
+      <url>${webtools-sourceediting-site}</url>
+    </repository>
+    <!-- org.eclipse.wst.web.ui requires org.eclipse.wst.jsdt.ui -->
+    <repository>
+      <id>webtools-jsdt-site</id>
+      <layout>p2</layout>
+      <url>${webtools-jsdt-site}</url>
+    </repository>
+    <!-- TODO: org.eclipse.jst.doc.user.feature requires org.eclipse.jst.ws.* so that feature should move into webservices (or releng) -->
+
+    <!-- To reference parent pom -->
+    <repository>
+      <id>Webtools Repository - Releases</id>
+      <name>Webtools Repository - Releases</name>
+      <url>https://repo.eclipse.org/content/repositories/webtools-releases/</url>
+    </repository>
+    <repository>
+      <id>Webtools Repository - Snapshots</id>
+      <name>Webtools Repository - Snapshots</name>
+      <url>https://repo.eclipse.org/content/repositories/webtools-snapshots/</url>
+    </repository>
+  </repositories>
+
+  <modules>
+    <module>docs</module>
+    <module>features</module>
+    <module>plugins</module>
+    <module>tests</module>
+    <module>site</module>
+  </modules>
+</project>
diff --git a/site/category.xml b/site/category.xml
new file mode 100644
index 0000000..a63a88f
--- /dev/null
+++ b/site/category.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<site>
+
+    <bundle id="org.eclipse.jem"/>
+    <bundle id="org.eclipse.jem.beaninfo"/>
+    <bundle id="org.eclipse.jem.beaninfo.vm"/>
+    <bundle id="org.eclipse.jem.beaninfo.vm.common"/>
+    <bundle id="org.eclipse.jem.proxy"/>
+    <bundle id="org.eclipse.jem.workbench"/>
+    <bundle id="org.eclipse.jst.common.annotations.controller"/>
+    <bundle id="org.eclipse.jst.common.annotations.core"/>
+    <bundle id="org.eclipse.jst.common.annotations.ui"/>
+    <bundle id="org.eclipse.jst.common.frameworks"/>
+    <bundle id="org.eclipse.jst.common.ui"/>
+    <bundle id="org.eclipse.jst.ejb.ui"/>
+    <bundle id="org.eclipse.jst.j2ee"/>
+    <bundle id="org.eclipse.jst.j2ee.core"/>
+    <bundle id="org.eclipse.jst.j2ee.ejb"/>
+    <bundle id="org.eclipse.jst.j2ee.ejb.annotation.model"/>
+    <bundle id="org.eclipse.jst.j2ee.ejb.annotations.emitter"/>
+    <bundle id="org.eclipse.jst.j2ee.ejb.annotations.ui"/>
+    <bundle id="org.eclipse.jst.j2ee.ejb.annotations.xdoclet"/>
+    <bundle id="org.eclipse.jst.j2ee.jca"/>
+    <bundle id="org.eclipse.jst.j2ee.jca.ui"/>
+    <bundle id="org.eclipse.jst.j2ee.navigator.ui"/>
+    <bundle id="org.eclipse.jst.j2ee.ui"/>
+    <bundle id="org.eclipse.jst.j2ee.web"/>
+    <bundle id="org.eclipse.jst.j2ee.webservice"/>
+    <bundle id="org.eclipse.jst.j2ee.webservice.ui"/>
+    <bundle id="org.eclipse.jst.j2ee.xdoclet.runtime"/>
+    <bundle id="org.eclipse.jst.jee"/>
+    <bundle id="org.eclipse.jst.jee.ejb"/>
+    <bundle id="org.eclipse.jst.jee.ui"/>
+    <bundle id="org.eclipse.jst.jee.web"/>
+    <bundle id="org.eclipse.jst.servlet.ui"/>
+    <bundle id="org.eclipse.wtp.jee.capabilities"/>
+    <bundle id="org.eclipse.jst.ejb.doc.user"/>
+
+    <category-def name="jeetools" label="WTP Java EE / EJB Tools"><description>
+        Web Tools Platform (WTP) Java EE / EJB Tools
+    </description></category-def>
+    <category-def name="jeetools.sdk" label="WTP Java EE / EJB Tools - Docs and SDKs"><description>
+        Web Tools Platform (WTP) Java EE / EJB Tools - Docs and SDKs
+    </description></category-def>
+    <category-def name="jeetools.tests" label="WTP Java EE / EJB Tools - Tests"><description>
+        Web Tools Platform (WTP) Java EE / EJB Tools - Tests
+    </description></category-def>
+
+</site>
diff --git a/site/pom.xml b/site/pom.xml
new file mode 100644
index 0000000..39db45c
--- /dev/null
+++ b/site/pom.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Copyright (c) 2017 Red Hat Inc.
+  All rights reserved. This program and the accompanying materials
+  are made available under the terms of the Eclipse Distribution License v1.0
+  which accompanies this distribution, and is available at
+  http://www.eclipse.org/org/documents/edl-v10.php
+ 
+  Contributors:
+    Nick Boldt (Red Hat Inc.) - initial implementation
+-->
+
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.eclipse.webtools.javaee</groupId>
+    <artifactId>org.eclipse.webtools.javaee</artifactId>
+    <version>3.6.0-SNAPSHOT</version>
+  </parent>
+
+  <groupId>org.eclipse.webtools.javaee</groupId>
+  <artifactId>org.eclipse.webtools.javaee.site</artifactId>
+  <packaging>eclipse-repository</packaging>
+</project>
diff --git a/tests/org.eclipse.jem.tests/.classpath b/tests/org.eclipse.jem.tests/.classpath
new file mode 100644
index 0000000..db77f44
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/.classpath
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="javatests/"/>
+	<classpathentry kind="src" path="vm_tests"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/tests/org.eclipse.jem.tests/.cvsignore b/tests/org.eclipse.jem.tests/.cvsignore
new file mode 100644
index 0000000..60463af
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/.cvsignore
@@ -0,0 +1,2 @@
+bin
+build.xml
diff --git a/tests/org.eclipse.jem.tests/.project b/tests/org.eclipse.jem.tests/.project
new file mode 100644
index 0000000..abd595b
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.jem.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/tests/org.eclipse.jem.tests/.settings/org.eclipse.core.resources.prefs b/tests/org.eclipse.jem.tests/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..02d0770
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,3 @@
+#Sun Apr 15 21:10:03 EDT 2007
+eclipse.preferences.version=1
+encoding/<project>=ISO-8859-1
diff --git a/tests/org.eclipse.jem.tests/.settings/org.eclipse.jdt.core.prefs b/tests/org.eclipse.jem.tests/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..7f2dae3
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,292 @@
+#Sat Mar 31 23:15:49 EDT 2007
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
+org.eclipse.jdt.core.compiler.compliance=1.4
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=error
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=error
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=error
+org.eclipse.jdt.core.compiler.problem.unusedLocal=error
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.3
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=1
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=150
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=150
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
diff --git a/tests/org.eclipse.jem.tests/.settings/org.eclipse.jdt.ui.prefs b/tests/org.eclipse.jem.tests/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..855e136
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,8 @@
+#Tue Feb 21 10:09:18 EST 2006
+eclipse.preferences.version=1
+formatter_profile=_jve
+formatter_settings_version=10
+org.eclipse.jdt.ui.ignorelowercasenames=true
+org.eclipse.jdt.ui.importorder=java;javax;org;org.eclipse.wtp;org.eclipse.jem;org.eclipse.ve.internal.cdm;org.eclipse.ve.internal.cde;org.eclipse.ve.internal.jcm;org.eclipse.ve.internal.java;org.eclipse.ve;com;
+org.eclipse.jdt.ui.ondemandthreshold=3
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates/>
diff --git a/tests/org.eclipse.jem.tests/BeanInfo AllSuites with Remote Debug.launch b/tests/org.eclipse.jem.tests/BeanInfo AllSuites with Remote Debug.launch
new file mode 100644
index 0000000..92e5c81
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/BeanInfo AllSuites with Remote Debug.launch
@@ -0,0 +1,222 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<launchConfiguration type="org.eclipse.pde.ui.JunitLaunchConfig">
+<stringAttribute key="product" value="org.eclipse.platform.ide"/>
+<stringAttribute key="bootstrap" value=""/>
+<booleanAttribute key="useProduct" value="false"/>
+<stringAttribute key="vminstall" value="jdk1.4.2_05"/>
+<booleanAttribute key="tracing" value="true"/>
+<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value=""/>
+<mapAttribute key="tracingOptions">
+<mapEntry key="org.eclipse.core.runtime/compatibility/debug" value="false"/>
+<mapEntry key="org.eclipse.update.core/debug/parsing" value="false"/>
+<mapEntry key="org.eclipse.jem.proxy/remote/debug/ioconsole" value="false"/>
+<mapEntry key="org.eclipse.help.base/debug/search" value="false"/>
+<mapEntry key="org.eclipse.help.ui/debug" value="true"/>
+<mapEntry key="org.eclipse.team.cvs.ssh/debug" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/loader/debug" value="false"/>
+<mapEntry key="org.eclipse.osgi/eclipseadaptor/debug/location" value="false"/>
+<mapEntry key="org.eclipse.osgi/debug/filter" value="false"/>
+<mapEntry key="org.eclipse.core.resources/monitor/builders" value="false"/>
+<mapEntry key="org.eclipse.osgi/debug/packages" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/loader/debug/success" value="false"/>
+<mapEntry key="org.eclipse.jem.beaninfo/debug/logtrace" value="default"/>
+<mapEntry key="org.eclipse.core.runtime/debug" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/debug/context" value="false"/>
+<mapEntry key="org.eclipse.osgi/monitor/classes" value="false"/>
+<mapEntry key="org.eclipse.jem/debug/logtracefile" value="default"/>
+<mapEntry key="org.eclipse.jdt.core/debug/indexmanager" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/jobs" value="false"/>
+<mapEntry key="org.eclipse.team.cvs.core/cvsprotocol" value="true"/>
+<mapEntry key="org.eclipse.core.runtime/url/debug/cachecopy" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/loader/debug/prefixes/success" value="false"/>
+<mapEntry key="org.eclipse.ve.java.core/debug/loglevel" value="default"/>
+<mapEntry key="org.eclipse.core.runtime/registry/debug/events/plugin" value="false"/>
+<mapEntry key="org.eclipse.jdt.core/debug/builder" value="false"/>
+<mapEntry key="org.eclipse.jdt.core/debug/hierarchy" value="false"/>
+<mapEntry key="org.eclipse.core.resources/monitor/listeners" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/loader/debug/prefixes" value="false"/>
+<mapEntry key="org.eclipse.core.resources/save/tree" value="false"/>
+<mapEntry key="org.eclipse.team.cvs.core/debug" value="false"/>
+<mapEntry key="org.eclipse.ui/trace/keyBindings.verbose" value="false"/>
+<mapEntry key="org.eclipse.jem/debug/logtrace" value="default"/>
+<mapEntry key="org.eclipse.jdt.core/debug/javadelta/verbose" value="false"/>
+<mapEntry key="org.eclipse.update.core/debug/reconciler" value="false"/>
+<mapEntry key="org.eclipse.core.resources/save/mastertable" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/timing/startup" value="false"/>
+<mapEntry key="org.eclipse.ui/trace/contexts" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/loader/debug/activateplugin" value="false"/>
+<mapEntry key="org.eclipse.jdt.debug/debug" value="true"/>
+<mapEntry key="org.eclipse.jdt.core/debug/selection" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/jobs/errorondeadlock" value="false"/>
+<mapEntry key="org.eclipse.jdt.core/debug/buffermanager" value="false"/>
+<mapEntry key="org.eclipse.ui/trace/workbench.restore" value="false"/>
+<mapEntry key="org.eclipse.jem.util/debug/logtrace" value="false"/>
+<mapEntry key="org.eclipse.jdt.ui/debug" value="true"/>
+<mapEntry key="org.eclipse.core.runtime/loader/debug/filter/native" value="*"/>
+<mapEntry key="org.eclipse.team.core/debug" value="false"/>
+<mapEntry key="org.eclipse.core.resources/save/snapshots" value="false"/>
+<mapEntry key="org.eclipse.jdt.core/debug/compiler" value="false"/>
+<mapEntry key="org.eclipse.osgi/trace/activation" value="false"/>
+<mapEntry key="org.eclipse.jem.ui/debug/loglevel" value="default"/>
+<mapEntry key="org.eclipse.team.cvs.core/metafiles" value="false"/>
+<mapEntry key="org.eclipse.help.ui/debug/infopop" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/registry/debug" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/url/debug" value="false"/>
+<mapEntry key="org.eclipse.osgi/debug/monitorbundles" value="false"/>
+<mapEntry key="org.eclipse.core.resources/debug" value="false"/>
+<mapEntry key="org.eclipse.ui/debug/uijob.longwarning" value="false"/>
+<mapEntry key="org.eclipse.jem.proxy/debug/logtrace" value="default"/>
+<mapEntry key="org.eclipse.core.resources/restore/metainfo" value="false"/>
+<mapEntry key="org.eclipse.osgi/debug" value="false"/>
+<mapEntry key="org.eclipse.ui/debug/internalerror/openDialog" value="false"/>
+<mapEntry key="org.eclipse.jdt.core/debug/javamodel" value="false"/>
+<mapEntry key="org.eclipse.debug.core/debug" value="true"/>
+<mapEntry key="org.eclipse.jdt.ui/debug/allTypesCache" value="false"/>
+<mapEntry key="org.eclipse.help/debug" value="true"/>
+<mapEntry key="org.eclipse.core.resources/restore" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/loader/debug/failure" value="false"/>
+<mapEntry key="org.eclipse.jface.text/debug/ContentAssistSubjectAdapters" value="false"/>
+<mapEntry key="org.eclipse.jdt.debug.ui/debug" value="true"/>
+<mapEntry key="org.eclipse.osgi/debug/events" value="false"/>
+<mapEntry key="org.eclipse.ui.intro/trace/printHTML" value="false"/>
+<mapEntry key="org.eclipse.osgi/debug/services" value="false"/>
+<mapEntry key="org.eclipse.update.core/debug/type" value="false"/>
+<mapEntry key="org.eclipse.jdt.core/debug" value="true"/>
+<mapEntry key="org.eclipse.help.base/debug" value="true"/>
+<mapEntry key="org.eclipse.core.runtime/registry/debug/events/extension" value="false"/>
+<mapEntry key="org.eclipse.ui/debug" value="false"/>
+<mapEntry key="org.eclipse.osgi/eclipseadaptor/debug/platformadmin" value="false"/>
+<mapEntry key="org.eclipse.core.resources/build/delta" value="false"/>
+<mapEntry key="org.eclipse.debug.ui/debug" value="true"/>
+<mapEntry key="org.eclipse.update.core/debug/configuration" value="false"/>
+<mapEntry key="org.eclipse.ui/trace/part.activate" value="false"/>
+<mapEntry key="org.eclipse.jem.proxy/remote/debug/notimeouts" value="false"/>
+<mapEntry key="org.eclipse.help.ui/debug/embeddedBrowser" value="false"/>
+<mapEntry key="org.eclipse.jdt.core/debug/javadelta" value="false"/>
+<mapEntry key="org.eclipse.osgi/debug/manifest" value="false"/>
+<mapEntry key="org.eclipse.osgi/debug/security" value="false"/>
+<mapEntry key="org.eclipse.ui/trace/keyBindings" value="false"/>
+<mapEntry key="org.eclipse.core.resources/restore/markers" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/timing/shutdown" value="false"/>
+<mapEntry key="org.eclipse.jem.ui/debug/logtracefile" value="default"/>
+<mapEntry key="org.eclipse.help.webapp/debug" value="true"/>
+<mapEntry key="org.eclipse.ve.java.core/debug/vetimetrace" value="false"/>
+<mapEntry key="org.eclipse.core.resources/save" value="false"/>
+<mapEntry key="org.eclipse.ve.java.core/debug/logtracefile" value="default"/>
+<mapEntry key="org.eclipse.ui/trace/part.create" value="false"/>
+<mapEntry key="org.eclipse.ve.java.core/debug/livewindow" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/loader/debug/create" value="false"/>
+<mapEntry key="org.eclipse.osgi/debug/startlevel" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/loader/debug/prefixes/failure" value="false"/>
+<mapEntry key="org.eclipse.ui/trace/workbench.start" value="false"/>
+<mapEntry key="org.eclipse.ui/trace/handlers.verbose.commandId" value=""/>
+<mapEntry key="org.eclipse.ant.core/debug" value="true"/>
+<mapEntry key="org.eclipse.team.cvs.core/dirtycaching" value="false"/>
+<mapEntry key="org.eclipse.core.resources/save/metainfo" value="false"/>
+<mapEntry key="org.eclipse.update.configurator/debug" value="false"/>
+<mapEntry key="org.eclipse.update.core/debug/installhandler" value="false"/>
+<mapEntry key="org.eclipse.osgi/debug/bundleTime" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/loader/debug/filter/loader" value="*"/>
+<mapEntry key="org.eclipse.core.resources/build/needbuild" value="false"/>
+<mapEntry key="org.eclipse.ve.java.core/debug/logtrace" value="default"/>
+<mapEntry key="org.eclipse.help.ui/debug/embeddedBrowser/inprocess" value="false"/>
+<mapEntry key="org.eclipse.core.resources/restore/syncinfo" value="false"/>
+<mapEntry key="org.eclipse.core.resources/build/invoking" value="false"/>
+<mapEntry key="org.eclipse.team.cvs.core/syncchangeevents" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/loader/debug/actions" value="false"/>
+<mapEntry key="org.eclipse.ui.intro/trace/logInfo" value="true"/>
+<mapEntry key="org.eclipse.core.runtime/loader/debug/filter/resource" value="*"/>
+<mapEntry key="org.eclipse.core.resources/build/failure" value="false"/>
+<mapEntry key="org.eclipse.update.core/debug/web" value="false"/>
+<mapEntry key="org.eclipse.core.resources/refresh" value="false"/>
+<mapEntry key="org.eclipse.osgi/debug/loader" value="false"/>
+<mapEntry key="org.eclipse.osgi/monitor/activation" value="false"/>
+<mapEntry key="org.eclipse.ui/trace/handlers.verbose" value="false"/>
+<mapEntry key="org.eclipse.jem.beaninfo/debug/loglevel" value="default"/>
+<mapEntry key="org.eclipse.osgi/debug/packageadmin" value="false"/>
+<mapEntry key="org.eclipse.jdt.core/debug/search" value="false"/>
+<mapEntry key="org.eclipse.team.core/streams" value="false"/>
+<mapEntry key="org.eclipse.osgi/debug/packageadmin/timing" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/jobs/beginend" value="false"/>
+<mapEntry key="org.eclipse.update.core/debug/install" value="false"/>
+<mapEntry key="org.eclipse.jem.proxy/remote/debug/debugvm" value="true"/>
+<mapEntry key="org.eclipse.core.resources/history" value="false"/>
+<mapEntry key="org.eclipse.ve.java.core/debug/xmltext" value="false"/>
+<mapEntry key="org.eclipse.jem.util/debug/logtracefile" value="false"/>
+<mapEntry key="org.eclipse.jdt.core/debug/postaction" value="false"/>
+<mapEntry key="org.eclipse.team.cvs.core/threading" value="false"/>
+<mapEntry key="org.eclipse.jdt.core/debug/zipaccess" value="false"/>
+<mapEntry key="org.eclipse.osgi/eclipseadaptor/debug/platformadmin/resolver" value="false"/>
+<mapEntry key="org.eclipse.core.resources/save/markers" value="false"/>
+<mapEntry key="org.eclipse.jem.proxy/remote/debug/vmtraceout" value="true"/>
+<mapEntry key="org.eclipse.jem.ui/debug/logtrace" value="default"/>
+<mapEntry key="org.eclipse.core.resources/restore/tree" value="false"/>
+<mapEntry key="org.eclipse.update.core/debug/warning" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/contenttypes/debug" value="false"/>
+<mapEntry key="org.eclipse.core.expressions/tracePropertyResolving" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/url/debug/cachelookup" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/registry/debug/dump" value=""/>
+<mapEntry key="org.eclipse.jem/debug/loglevel" value="default"/>
+<mapEntry key="org.eclipse.pde.build/debug" value="false"/>
+<mapEntry key="org.eclipse.core.resources/preferences" value="false"/>
+<mapEntry key="org.eclipse.osgi/trace/classLoading" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/jobs/timing" value="false"/>
+<mapEntry key="org.eclipse.osgi/eclipseadaptor/debug" value="false"/>
+<mapEntry key="org.eclipse.core.resources/save/syncinfo" value="false"/>
+<mapEntry key="org.eclipse.osgi/trace/filters" value="trace.properties"/>
+<mapEntry key="org.eclipse.jem.util/debug/loglevel" value="WARNING"/>
+<mapEntry key="org.eclipse.ui/trace/graphics" value="false"/>
+<mapEntry key="org.eclipse.jdt.ui/debug/ASTProvider" value="false"/>
+<mapEntry key="org.eclipse.jem.beaninfo/debug/logtracefile" value="default"/>
+<mapEntry key="org.eclipse.core.runtime/config/debug" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/url/debug/connect" value="false"/>
+<mapEntry key="org.eclipse.team.core/refreshjob" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/loader/debug/properties" value="false"/>
+<mapEntry key="org.eclipse.ui/trace/part.listeners" value="false"/>
+<mapEntry key="org.eclipse.team.cvs.ssh/ssh_protocol" value="false"/>
+<mapEntry key="org.eclipse.team.core/backgroundevents" value="false"/>
+<mapEntry key="org.eclipse.update.core/debug" value="true"/>
+<mapEntry key="org.eclipse.jem.proxy/debug/logtracefile" value="default"/>
+<mapEntry key="org.eclipse.core.runtime/jobs/locks" value="false"/>
+<mapEntry key="org.eclipse.core.resources/natures" value="false"/>
+<mapEntry key="org.eclipse.jem.proxy/debug/loglevel" value="default"/>
+<mapEntry key="org.eclipse.ui/trace/contexts.verbose" value="false"/>
+<mapEntry key="org.eclipse.core.resources/restore/mastertable" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/preferences/debug" value="false"/>
+<mapEntry key="org.eclipse.ui/trace/perspective" value="false"/>
+<mapEntry key="org.eclipse.ui/debug/job.stale" value="false"/>
+<mapEntry key="org.eclipse.jdt.core/debug/cpresolution" value="false"/>
+<mapEntry key="org.eclipse.core.resources/restore/snapshots" value="false"/>
+<mapEntry key="org.eclipse.ui/trace/handlers" value="false"/>
+<mapEntry key="org.eclipse.jdt.core/debug/completion" value="false"/>
+<mapEntry key="org.eclipse.osgi/monitor/resources" value="false"/>
+<mapEntry key="org.eclipse.help.webapp/debug/workingsets" value="false"/>
+<mapEntry key="org.eclipse.ui.intro/debug" value="true"/>
+<mapEntry key="org.eclipse.core.runtime/debug/pluginstopper" value="false"/>
+<mapEntry key="org.eclipse.osgi/eclipseadaptor/converter/debug" value="false"/>
+<mapEntry key="org.eclipse.help/debug/context" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/registry/debug/resolve" value="false"/>
+<mapEntry key="org.eclipse.osgi/trace/filename" value="runtime.traces"/>
+<mapEntry key="org.eclipse.jface.text/debug/AnnotationPainter" value="false"/>
+<mapEntry key="org.eclipse.help/debug/protocols" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/loader/debug/filter/class" value="*"/>
+</mapAttribute>
+<stringAttribute key="selectedPlugin" value="org.eclipse.jem.proxy"/>
+<booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/>
+<stringAttribute key="checked" value="org.eclipse.jem.proxy"/>
+<stringAttribute key="application" value="org.eclipse.pde.junit.runtime.coretestapplication"/>
+<booleanAttribute key="clearws" value="true"/>
+<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.eclipse.jem.tests.beaninfo.BeanInfoSuite"/>
+<stringAttribute key="location1" value="D:\runtime-junit-test-workspace"/>
+<booleanAttribute key="default" value="true"/>
+<stringAttribute key="vmargs" value=""/>
+<booleanAttribute key="clearConfig" value="false"/>
+<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
+<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
+<stringAttribute key="progargs" value="-os win32 -ws win32 -arch x86 -nl en_US"/>
+<booleanAttribute key="useDefaultConfig" value="true"/>
+<stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.jem.tests"/>
+<booleanAttribute key="askclear" value="true"/>
+<stringAttribute key="location0" value="D:\runtime-junit-test-workspace"/>
+</launchConfiguration>
diff --git a/tests/org.eclipse.jem.tests/BeanInfo AllSuites.launch b/tests/org.eclipse.jem.tests/BeanInfo AllSuites.launch
new file mode 100644
index 0000000..f487a8c
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/BeanInfo AllSuites.launch
@@ -0,0 +1,222 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<launchConfiguration type="org.eclipse.pde.ui.JunitLaunchConfig">
+<stringAttribute key="product" value="org.eclipse.platform.ide"/>
+<stringAttribute key="bootstrap" value=""/>
+<booleanAttribute key="useProduct" value="false"/>
+<stringAttribute key="vminstall" value="J9_142_20040926"/>
+<booleanAttribute key="tracing" value="true"/>
+<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value=""/>
+<mapAttribute key="tracingOptions">
+<mapEntry key="org.eclipse.core.runtime/compatibility/debug" value="false"/>
+<mapEntry key="org.eclipse.update.core/debug/parsing" value="false"/>
+<mapEntry key="org.eclipse.help.base/debug/search" value="false"/>
+<mapEntry key="org.eclipse.jem.proxy/remote/debug/ioconsole" value="false"/>
+<mapEntry key="org.eclipse.help.ui/debug" value="true"/>
+<mapEntry key="org.eclipse.team.cvs.ssh/debug" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/loader/debug" value="false"/>
+<mapEntry key="org.eclipse.osgi/eclipseadaptor/debug/location" value="false"/>
+<mapEntry key="org.eclipse.osgi/debug/filter" value="false"/>
+<mapEntry key="org.eclipse.core.resources/monitor/builders" value="false"/>
+<mapEntry key="org.eclipse.osgi/debug/packages" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/loader/debug/success" value="false"/>
+<mapEntry key="org.eclipse.jem.beaninfo/debug/logtrace" value="default"/>
+<mapEntry key="org.eclipse.core.runtime/debug" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/debug/context" value="false"/>
+<mapEntry key="org.eclipse.osgi/monitor/classes" value="false"/>
+<mapEntry key="org.eclipse.jdt.core/debug/indexmanager" value="false"/>
+<mapEntry key="org.eclipse.jem/debug/logtracefile" value="default"/>
+<mapEntry key="org.eclipse.core.runtime/jobs" value="false"/>
+<mapEntry key="org.eclipse.team.cvs.core/cvsprotocol" value="true"/>
+<mapEntry key="org.eclipse.core.runtime/url/debug/cachecopy" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/loader/debug/prefixes/success" value="false"/>
+<mapEntry key="org.eclipse.ve.java.core/debug/loglevel" value="default"/>
+<mapEntry key="org.eclipse.core.runtime/registry/debug/events/plugin" value="false"/>
+<mapEntry key="org.eclipse.jdt.core/debug/builder" value="false"/>
+<mapEntry key="org.eclipse.jdt.core/debug/hierarchy" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/loader/debug/prefixes" value="false"/>
+<mapEntry key="org.eclipse.core.resources/monitor/listeners" value="false"/>
+<mapEntry key="org.eclipse.core.resources/save/tree" value="false"/>
+<mapEntry key="org.eclipse.ui/trace/keyBindings.verbose" value="false"/>
+<mapEntry key="org.eclipse.team.cvs.core/debug" value="false"/>
+<mapEntry key="org.eclipse.jem/debug/logtrace" value="default"/>
+<mapEntry key="org.eclipse.update.core/debug/reconciler" value="false"/>
+<mapEntry key="org.eclipse.jdt.core/debug/javadelta/verbose" value="false"/>
+<mapEntry key="org.eclipse.core.resources/save/mastertable" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/timing/startup" value="false"/>
+<mapEntry key="org.eclipse.ui/trace/contexts" value="false"/>
+<mapEntry key="org.eclipse.jdt.debug/debug" value="true"/>
+<mapEntry key="org.eclipse.core.runtime/loader/debug/activateplugin" value="false"/>
+<mapEntry key="org.eclipse.jdt.core/debug/selection" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/jobs/errorondeadlock" value="false"/>
+<mapEntry key="org.eclipse.jdt.core/debug/buffermanager" value="false"/>
+<mapEntry key="org.eclipse.ui/trace/workbench.restore" value="false"/>
+<mapEntry key="org.eclipse.jem.util/debug/logtrace" value="false"/>
+<mapEntry key="org.eclipse.jdt.ui/debug" value="true"/>
+<mapEntry key="org.eclipse.core.runtime/loader/debug/filter/native" value="*"/>
+<mapEntry key="org.eclipse.team.core/debug" value="false"/>
+<mapEntry key="org.eclipse.core.resources/save/snapshots" value="false"/>
+<mapEntry key="org.eclipse.jdt.core/debug/compiler" value="false"/>
+<mapEntry key="org.eclipse.jem.ui/debug/loglevel" value="default"/>
+<mapEntry key="org.eclipse.osgi/trace/activation" value="false"/>
+<mapEntry key="org.eclipse.team.cvs.core/metafiles" value="false"/>
+<mapEntry key="org.eclipse.help.ui/debug/infopop" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/registry/debug" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/url/debug" value="false"/>
+<mapEntry key="org.eclipse.core.resources/debug" value="false"/>
+<mapEntry key="org.eclipse.osgi/debug/monitorbundles" value="false"/>
+<mapEntry key="org.eclipse.ui/debug/uijob.longwarning" value="false"/>
+<mapEntry key="org.eclipse.jem.proxy/debug/logtrace" value="default"/>
+<mapEntry key="org.eclipse.core.resources/restore/metainfo" value="false"/>
+<mapEntry key="org.eclipse.osgi/debug" value="false"/>
+<mapEntry key="org.eclipse.ui/debug/internalerror/openDialog" value="false"/>
+<mapEntry key="org.eclipse.debug.core/debug" value="true"/>
+<mapEntry key="org.eclipse.jdt.core/debug/javamodel" value="false"/>
+<mapEntry key="org.eclipse.help/debug" value="true"/>
+<mapEntry key="org.eclipse.jdt.ui/debug/allTypesCache" value="false"/>
+<mapEntry key="org.eclipse.core.resources/restore" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/loader/debug/failure" value="false"/>
+<mapEntry key="org.eclipse.jface.text/debug/ContentAssistSubjectAdapters" value="false"/>
+<mapEntry key="org.eclipse.ui.intro/trace/printHTML" value="false"/>
+<mapEntry key="org.eclipse.osgi/debug/events" value="false"/>
+<mapEntry key="org.eclipse.jdt.debug.ui/debug" value="true"/>
+<mapEntry key="org.eclipse.osgi/debug/services" value="false"/>
+<mapEntry key="org.eclipse.update.core/debug/type" value="false"/>
+<mapEntry key="org.eclipse.jdt.core/debug" value="true"/>
+<mapEntry key="org.eclipse.help.base/debug" value="true"/>
+<mapEntry key="org.eclipse.core.runtime/registry/debug/events/extension" value="false"/>
+<mapEntry key="org.eclipse.ui/debug" value="false"/>
+<mapEntry key="org.eclipse.osgi/eclipseadaptor/debug/platformadmin" value="false"/>
+<mapEntry key="org.eclipse.core.resources/build/delta" value="false"/>
+<mapEntry key="org.eclipse.debug.ui/debug" value="true"/>
+<mapEntry key="org.eclipse.update.core/debug/configuration" value="false"/>
+<mapEntry key="org.eclipse.ui/trace/part.activate" value="false"/>
+<mapEntry key="org.eclipse.jem.proxy/remote/debug/notimeouts" value="false"/>
+<mapEntry key="org.eclipse.help.ui/debug/embeddedBrowser" value="false"/>
+<mapEntry key="org.eclipse.jdt.core/debug/javadelta" value="false"/>
+<mapEntry key="org.eclipse.osgi/debug/manifest" value="false"/>
+<mapEntry key="org.eclipse.ui/trace/keyBindings" value="false"/>
+<mapEntry key="org.eclipse.osgi/debug/security" value="false"/>
+<mapEntry key="org.eclipse.core.resources/restore/markers" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/timing/shutdown" value="false"/>
+<mapEntry key="org.eclipse.help.webapp/debug" value="true"/>
+<mapEntry key="org.eclipse.ve.java.core/debug/vetimetrace" value="false"/>
+<mapEntry key="org.eclipse.jem.ui/debug/logtracefile" value="default"/>
+<mapEntry key="org.eclipse.core.resources/save" value="false"/>
+<mapEntry key="org.eclipse.ve.java.core/debug/logtracefile" value="default"/>
+<mapEntry key="org.eclipse.ui/trace/part.create" value="false"/>
+<mapEntry key="org.eclipse.ve.java.core/debug/livewindow" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/loader/debug/create" value="false"/>
+<mapEntry key="org.eclipse.osgi/debug/startlevel" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/loader/debug/prefixes/failure" value="false"/>
+<mapEntry key="org.eclipse.ui/trace/workbench.start" value="false"/>
+<mapEntry key="org.eclipse.ui/trace/handlers.verbose.commandId" value=""/>
+<mapEntry key="org.eclipse.ant.core/debug" value="true"/>
+<mapEntry key="org.eclipse.team.cvs.core/dirtycaching" value="false"/>
+<mapEntry key="org.eclipse.core.resources/save/metainfo" value="false"/>
+<mapEntry key="org.eclipse.update.configurator/debug" value="false"/>
+<mapEntry key="org.eclipse.update.core/debug/installhandler" value="false"/>
+<mapEntry key="org.eclipse.osgi/debug/bundleTime" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/loader/debug/filter/loader" value="*"/>
+<mapEntry key="org.eclipse.ve.java.core/debug/logtrace" value="default"/>
+<mapEntry key="org.eclipse.core.resources/build/needbuild" value="false"/>
+<mapEntry key="org.eclipse.core.resources/restore/syncinfo" value="false"/>
+<mapEntry key="org.eclipse.help.ui/debug/embeddedBrowser/inprocess" value="false"/>
+<mapEntry key="org.eclipse.core.resources/build/invoking" value="false"/>
+<mapEntry key="org.eclipse.team.cvs.core/syncchangeevents" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/loader/debug/actions" value="false"/>
+<mapEntry key="org.eclipse.ui.intro/trace/logInfo" value="true"/>
+<mapEntry key="org.eclipse.core.runtime/loader/debug/filter/resource" value="*"/>
+<mapEntry key="org.eclipse.update.core/debug/web" value="false"/>
+<mapEntry key="org.eclipse.core.resources/build/failure" value="false"/>
+<mapEntry key="org.eclipse.core.resources/refresh" value="false"/>
+<mapEntry key="org.eclipse.osgi/debug/loader" value="false"/>
+<mapEntry key="org.eclipse.osgi/monitor/activation" value="false"/>
+<mapEntry key="org.eclipse.ui/trace/handlers.verbose" value="false"/>
+<mapEntry key="org.eclipse.jem.beaninfo/debug/loglevel" value="default"/>
+<mapEntry key="org.eclipse.osgi/debug/packageadmin" value="false"/>
+<mapEntry key="org.eclipse.jdt.core/debug/search" value="false"/>
+<mapEntry key="org.eclipse.team.core/streams" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/jobs/beginend" value="false"/>
+<mapEntry key="org.eclipse.osgi/debug/packageadmin/timing" value="false"/>
+<mapEntry key="org.eclipse.update.core/debug/install" value="false"/>
+<mapEntry key="org.eclipse.jem.proxy/remote/debug/debugvm" value="false"/>
+<mapEntry key="org.eclipse.core.resources/history" value="false"/>
+<mapEntry key="org.eclipse.ve.java.core/debug/xmltext" value="false"/>
+<mapEntry key="org.eclipse.jem.util/debug/logtracefile" value="false"/>
+<mapEntry key="org.eclipse.team.cvs.core/threading" value="false"/>
+<mapEntry key="org.eclipse.jdt.core/debug/postaction" value="false"/>
+<mapEntry key="org.eclipse.jdt.core/debug/zipaccess" value="false"/>
+<mapEntry key="org.eclipse.core.resources/save/markers" value="false"/>
+<mapEntry key="org.eclipse.osgi/eclipseadaptor/debug/platformadmin/resolver" value="false"/>
+<mapEntry key="org.eclipse.jem.proxy/remote/debug/vmtraceout" value="false"/>
+<mapEntry key="org.eclipse.jem.ui/debug/logtrace" value="default"/>
+<mapEntry key="org.eclipse.core.resources/restore/tree" value="false"/>
+<mapEntry key="org.eclipse.update.core/debug/warning" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/contenttypes/debug" value="false"/>
+<mapEntry key="org.eclipse.core.expressions/tracePropertyResolving" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/url/debug/cachelookup" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/registry/debug/dump" value=""/>
+<mapEntry key="org.eclipse.jem/debug/loglevel" value="default"/>
+<mapEntry key="org.eclipse.pde.build/debug" value="false"/>
+<mapEntry key="org.eclipse.core.resources/preferences" value="false"/>
+<mapEntry key="org.eclipse.osgi/trace/classLoading" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/jobs/timing" value="false"/>
+<mapEntry key="org.eclipse.osgi/eclipseadaptor/debug" value="false"/>
+<mapEntry key="org.eclipse.core.resources/save/syncinfo" value="false"/>
+<mapEntry key="org.eclipse.osgi/trace/filters" value="trace.properties"/>
+<mapEntry key="org.eclipse.jem.util/debug/loglevel" value="WARNING"/>
+<mapEntry key="org.eclipse.ui/trace/graphics" value="false"/>
+<mapEntry key="org.eclipse.jdt.ui/debug/ASTProvider" value="false"/>
+<mapEntry key="org.eclipse.jem.beaninfo/debug/logtracefile" value="default"/>
+<mapEntry key="org.eclipse.core.runtime/config/debug" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/url/debug/connect" value="false"/>
+<mapEntry key="org.eclipse.team.core/refreshjob" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/loader/debug/properties" value="false"/>
+<mapEntry key="org.eclipse.ui/trace/part.listeners" value="false"/>
+<mapEntry key="org.eclipse.team.cvs.ssh/ssh_protocol" value="false"/>
+<mapEntry key="org.eclipse.team.core/backgroundevents" value="false"/>
+<mapEntry key="org.eclipse.update.core/debug" value="true"/>
+<mapEntry key="org.eclipse.jem.proxy/debug/logtracefile" value="default"/>
+<mapEntry key="org.eclipse.core.runtime/jobs/locks" value="false"/>
+<mapEntry key="org.eclipse.core.resources/natures" value="false"/>
+<mapEntry key="org.eclipse.jem.proxy/debug/loglevel" value="default"/>
+<mapEntry key="org.eclipse.ui/trace/contexts.verbose" value="false"/>
+<mapEntry key="org.eclipse.core.resources/restore/mastertable" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/preferences/debug" value="false"/>
+<mapEntry key="org.eclipse.ui/trace/perspective" value="false"/>
+<mapEntry key="org.eclipse.ui/debug/job.stale" value="false"/>
+<mapEntry key="org.eclipse.jdt.core/debug/cpresolution" value="false"/>
+<mapEntry key="org.eclipse.core.resources/restore/snapshots" value="false"/>
+<mapEntry key="org.eclipse.ui/trace/handlers" value="false"/>
+<mapEntry key="org.eclipse.jdt.core/debug/completion" value="false"/>
+<mapEntry key="org.eclipse.osgi/monitor/resources" value="false"/>
+<mapEntry key="org.eclipse.help.webapp/debug/workingsets" value="false"/>
+<mapEntry key="org.eclipse.ui.intro/debug" value="true"/>
+<mapEntry key="org.eclipse.core.runtime/debug/pluginstopper" value="false"/>
+<mapEntry key="org.eclipse.osgi/eclipseadaptor/converter/debug" value="false"/>
+<mapEntry key="org.eclipse.help/debug/context" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/registry/debug/resolve" value="false"/>
+<mapEntry key="org.eclipse.osgi/trace/filename" value="runtime.traces"/>
+<mapEntry key="org.eclipse.jface.text/debug/AnnotationPainter" value="false"/>
+<mapEntry key="org.eclipse.help/debug/protocols" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/loader/debug/filter/class" value="*"/>
+</mapAttribute>
+<stringAttribute key="selectedPlugin" value="org.eclipse.jem.proxy"/>
+<booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/>
+<stringAttribute key="checked" value="org.eclipse.jem.proxy"/>
+<stringAttribute key="application" value="org.eclipse.pde.junit.runtime.coretestapplication"/>
+<booleanAttribute key="clearws" value="true"/>
+<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.eclipse.jem.tests.beaninfo.BeanInfoSuite"/>
+<stringAttribute key="location1" value="D:\runtime-junit-test-workspace"/>
+<booleanAttribute key="default" value="true"/>
+<stringAttribute key="vmargs" value=""/>
+<booleanAttribute key="clearConfig" value="false"/>
+<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
+<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
+<stringAttribute key="progargs" value="-os win32 -ws win32 -arch x86 -nl en_US"/>
+<booleanAttribute key="useDefaultConfig" value="true"/>
+<stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.jem.tests"/>
+<booleanAttribute key="askclear" value="true"/>
+<stringAttribute key="location0" value="D:\runtime-junit-test-workspace"/>
+</launchConfiguration>
diff --git a/tests/org.eclipse.jem.tests/Java AllSuites with Remote Debug.launch b/tests/org.eclipse.jem.tests/Java AllSuites with Remote Debug.launch
new file mode 100644
index 0000000..9a46c52
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/Java AllSuites with Remote Debug.launch
@@ -0,0 +1,303 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<launchConfiguration type="org.eclipse.pde.ui.JunitLaunchConfig">
+<stringAttribute key="product" value="org.eclipse.platform.ide"/>
+<stringAttribute key="bootstrap" value=""/>
+<booleanAttribute key="useProduct" value="false"/>
+<booleanAttribute key="tracing" value="true"/>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
+<listEntry value="4"/>
+</listAttribute>
+<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value=""/>
+<mapAttribute key="tracingOptions">
+<mapEntry key="org.eclipse.team.cvs.core/syncchangeevents" value="false"/>
+<mapEntry key="org.eclipse.equinox.registry/debug" value="false"/>
+<mapEntry key="org.eclipse.jem.proxy/debug/traceexpressionstimethreshold" value="100"/>
+<mapEntry key="org.eclipse.core.resources/perf/listeners" value="500"/>
+<mapEntry key="org.eclipse.core.resources/build/needbuild" value="false"/>
+<mapEntry key="org.eclipse.debug.ui/debug/viewers/viewer" value="false"/>
+<mapEntry key="org.eclipse.jem.util/debug/logtrace" value="false"/>
+<mapEntry key="org.eclipse.update.configurator/debug" value="false"/>
+<mapEntry key="org.eclipse.osgi/monitor/activation" value="false"/>
+<mapEntry key="org.eclipse.jdt.ui/perf/content_assist/extensions" value="1000"/>
+<mapEntry key="org.eclipse.ui.ide/debug/gc" value="false"/>
+<mapEntry key="org.eclipse.core.resources/contenttype/cache" value="false"/>
+<mapEntry key="org.eclipse.ui/debug/showSystemJobs" value="false"/>
+<mapEntry key="org.eclipse.jem.proxy/remote/debug/vmtraceout" value="true"/>
+<mapEntry key="org.eclipse.core.jobs/jobs/shutdown" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/url/debug" value="false"/>
+<mapEntry key="org.eclipse.osgi/monitor/classes" value="false"/>
+<mapEntry key="org.eclipse.equinox.preferences/get" value="false"/>
+<mapEntry key="org.eclipse.update.core/debug" value="true"/>
+<mapEntry key="org.eclipse.core.runtime/debug/context" value="false"/>
+<mapEntry key="org.eclipse.core.jobs/jobs/locks" value="false"/>
+<mapEntry key="org.eclipse.ui/debug/swtdebug" value="false"/>
+<mapEntry key="org.eclipse.jdt.core/debug/javamodel" value="false"/>
+<mapEntry key="org.eclipse.ui.intro.universal/trace/logInfo" value="true"/>
+<mapEntry key="org.eclipse.ui.intro/trace/printHTML" value="false"/>
+<mapEntry key="org.eclipse.equinox.registry/debug/events" value="false"/>
+<mapEntry key="org.eclipse.jdt.core/debug/javadelta/verbose" value="false"/>
+<mapEntry key="org.eclipse.jdt.core/debug" value="true"/>
+<mapEntry key="org.eclipse.core.expressions/tracePropertyResolving" value="false"/>
+<mapEntry key="org.eclipse.ltk.core.refactoring/perf/participants/checkConditions" value="300"/>
+<mapEntry key="org.eclipse.core.resources/restore" value="false"/>
+<mapEntry key="org.eclipse.ui/perf/perspective.listeners" value="200"/>
+<mapEntry key="org.eclipse.jdt.core/perf/containerinitializer" value="5000"/>
+<mapEntry key="org.eclipse.osgi/trace/filename" value="runtime.traces"/>
+<mapEntry key="org.eclipse.update.core/debug/web" value="false"/>
+<mapEntry key="org.eclipse.osgi/debug" value="false"/>
+<mapEntry key="org.eclipse.osgi/trace/activation" value="false"/>
+<mapEntry key="org.eclipse.ui/perf/perspective.switch" value="800"/>
+<mapEntry key="org.eclipse.ve.java.core/debug/logtrace" value="default"/>
+<mapEntry key="org.eclipse.ui/perf/part.input" value="200"/>
+<mapEntry key="org.eclipse.jface.text/debug/AnnotationPainter" value="false"/>
+<mapEntry key="org.eclipse.osgi/resolver/imports" value="false"/>
+<mapEntry key="org.eclipse.osgi/trace/filters" value="trace.properties"/>
+<mapEntry key="org.eclipse.osgi/eclipseadaptor/debug/platformadmin/resolver" value="false"/>
+<mapEntry key="org.eclipse.help.ui/debug/infopop" value="false"/>
+<mapEntry key="org.eclipse.jem.ui/debug/logtracefile" value="default"/>
+<mapEntry key="org.eclipse.equinox.preferences/general" value="false"/>
+<mapEntry key="org.eclipse.team.cvs.core/debug" value="false"/>
+<mapEntry key="org.eclipse.team.cvs.core/threading" value="false"/>
+<mapEntry key="org.eclipse.jdt.ui/perf/search/participants" value="300"/>
+<mapEntry key="org.eclipse.ui/perf/part.listeners" value="200"/>
+<mapEntry key="org.eclipse.osgi/resolver/debug" value="false"/>
+<mapEntry key="org.eclipse.update.core/debug/install" value="false"/>
+<mapEntry key="org.eclipse.help.ui/debug/embeddedBrowser/inprocess" value="false"/>
+<mapEntry key="org.eclipse.core.resources/debug" value="false"/>
+<mapEntry key="org.eclipse.osgi/profile/impl" value="org.eclipse.osgi.profile.DefaultProfileLogger"/>
+<mapEntry key="org.eclipse.ui/perf/part.control" value="800"/>
+<mapEntry key="org.eclipse.osgi/profile/benchmark" value="false"/>
+<mapEntry key="org.eclipse.team.cvs.core/cvsprotocol" value="true"/>
+<mapEntry key="org.eclipse.jdt.core/debug/postaction" value="false"/>
+<mapEntry key="org.eclipse.jem.proxy/remote/debug/notimeouts" value="true"/>
+<mapEntry key="org.eclipse.osgi/debug/manifest" value="false"/>
+<mapEntry key="org.eclipse.jdt.core/perf/selection" value="300"/>
+<mapEntry key="org.eclipse.help/debug/context" value="false"/>
+<mapEntry key="org.eclipse.jdt.ui/perf/content_assist_sorters/extensions" value=""/>
+<mapEntry key="org.eclipse.jdt.core/debug/builder" value="false"/>
+<mapEntry key="org.eclipse.osgi/resolver/requires" value="false"/>
+<mapEntry key="org.eclipse.team.cvs.ssh/debug" value="false"/>
+<mapEntry key="org.eclipse.ui/trace/handlers.verbose" value="false"/>
+<mapEntry key="org.eclipse.ve.java.core/debug/livewindow" value="false"/>
+<mapEntry key="org.eclipse.update.core/debug/installhandler" value="false"/>
+<mapEntry key="org.eclipse.osgi/debug/startlevel" value="false"/>
+<mapEntry key="org.eclipse.jdt.core/debug/javadelta" value="false"/>
+<mapEntry key="org.eclipse.core.resources/preferences" value="false"/>
+<mapEntry key="org.eclipse.core.resources/restore/tree" value="false"/>
+<mapEntry key="org.eclipse.help/debug/protocols" value="false"/>
+<mapEntry key="org.eclipse.core.resources/perf/save.participants" value="500"/>
+<mapEntry key="org.eclipse.core.resources/natures" value="false"/>
+<mapEntry key="org.eclipse.help.base/debug/search" value="false"/>
+<mapEntry key="org.eclipse.jem/debug/loglevel" value="default"/>
+<mapEntry key="org.eclipse.osgi/defaultprofile/buffersize" value="256"/>
+<mapEntry key="org.eclipse.osgi/resolver/cycles" value="false"/>
+<mapEntry key="org.eclipse.jdt.core/perf/variableinitializer" value="5000"/>
+<mapEntry key="org.eclipse.debug.ui/debug/viewers/model" value="false"/>
+<mapEntry key="org.eclipse.ui/trace/keyBindings.verbose" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/perf/success" value="true"/>
+<mapEntry key="org.eclipse.ui/trace/contexts.performance" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/compatibility/debug" value="false"/>
+<mapEntry key="org.eclipse.ui/debug/declaredImages" value="false"/>
+<mapEntry key="org.eclipse.pde.build/debug" value="false"/>
+<mapEntry key="org.eclipse.jem.util/debug/logtracefile" value="false"/>
+<mapEntry key="org.eclipse.osgi/eclipseadaptor/debug/location" value="false"/>
+<mapEntry key="org.eclipse.ui/trace/contexts.verbose" value="false"/>
+<mapEntry key="org.eclipse.help.base/debug" value="true"/>
+<mapEntry key="org.eclipse.ui/listeners/IWorkbenchPage.IPartListener" value="false"/>
+<mapEntry key="org.eclipse.jem.proxy/debug/logtrace" value="default"/>
+<mapEntry key="org.eclipse.core.jobs/jobs" value="false"/>
+<mapEntry key="org.eclipse.ui/perf/perspective.create" value="800"/>
+<mapEntry key="org.eclipse.ui/trace/sources" value="false"/>
+<mapEntry key="org.eclipse.core.resources/strings" value="false"/>
+<mapEntry key="org.eclipse.ui/listeners/IWorkbenchPartReference" value="false"/>
+<mapEntry key="org.eclipse.core.resources/save/metainfo" value="false"/>
+<mapEntry key="org.eclipse.ui/perf/part.activate" value="200"/>
+<mapEntry key="org.eclipse.ui.intro.universal/debug" value="true"/>
+<mapEntry key="org.eclipse.core.runtime/perf" value="false"/>
+<mapEntry key="org.eclipse.core.resources/contenttype" value="false"/>
+<mapEntry key="org.eclipse.ui/debug/contributions" value="false"/>
+<mapEntry key="org.eclipse.ui/debug/job.stale" value="false"/>
+<mapEntry key="org.eclipse.jem.proxy/debug/logtracefile" value="default"/>
+<mapEntry key="org.eclipse.jdt.core/debug/completion" value="false"/>
+<mapEntry key="org.eclipse.ui/perf/workbench.start" value="45000"/>
+<mapEntry key="org.eclipse.osgi/eclipseadaptor/debug" value="false"/>
+<mapEntry key="org.eclipse.ui/listeners/IWorkbenchWindow.IPartListener" value="false"/>
+<mapEntry key="org.eclipse.jdt.core/debug/indexmanager" value="false"/>
+<mapEntry key="org.eclipse.ui/listeners/IWorkbenchWindow.IPerspectiveListener" value="false"/>
+<mapEntry key="org.eclipse.osgi/debug/loader" value="false"/>
+<mapEntry key="org.eclipse.ui.workbench/debug" value="false"/>
+<mapEntry key="org.eclipse.osgi/defaultprofile/logsynchronously" value="false"/>
+<mapEntry key="org.eclipse.osgi/trace/classLoading" value="false"/>
+<mapEntry key="org.eclipse.jface.text/debug/FastPartitioner/PositionCache" value="false"/>
+<mapEntry key="org.eclipse.debug.ui/debug" value="false"/>
+<mapEntry key="org.eclipse.ui/trace/handlers.performance" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/debug" value="false"/>
+<mapEntry key="org.eclipse.ui/trace/handlers.verbose.commandId" value=""/>
+<mapEntry key="org.eclipse.osgi/debug/filter" value="false"/>
+<mapEntry key="org.eclipse.jdt.ui/debug/ASTProvider" value="false"/>
+<mapEntry key="org.eclipse.ve.java.core/debug/xmltext" value="false"/>
+<mapEntry key="org.eclipse.ve.cde/debug/logtrace" value="default"/>
+<mapEntry key="org.eclipse.help.webapp/debug/workingsets" value="false"/>
+<mapEntry key="org.eclipse.osgi/defaultprofile/logfilename" value=""/>
+<mapEntry key="org.eclipse.jem/debug/logtrace" value="default"/>
+<mapEntry key="org.eclipse.core.runtime/url/debug/connect" value="false"/>
+<mapEntry key="org.eclipse.jface.text/debug/ContentAssistSubjectAdapters" value="false"/>
+<mapEntry key="org.eclipse.core.resources/restore/markers" value="false"/>
+<mapEntry key="org.eclipse.ui/trace/graphics" value="false"/>
+<mapEntry key="org.eclipse.jdt.core/debug/resolution" value="false"/>
+<mapEntry key="org.eclipse.team.cvs.ssh/ssh_protocol" value="false"/>
+<mapEntry key="org.eclipse.core.resources/perf/snapshot" value="500"/>
+<mapEntry key="org.eclipse.ui/perf/part.init" value="800"/>
+<mapEntry key="org.eclipse.ui.intro/trace/logPerformance" value="false"/>
+<mapEntry key="org.eclipse.osgi/eclipseadaptor/converter/debug" value="false"/>
+<mapEntry key="org.eclipse.ui/perf/part.create" value="800"/>
+<mapEntry key="org.eclipse.osgi/eclipseadaptor/debug/platformadmin" value="false"/>
+<mapEntry key="org.eclipse.help.ui/debug/embeddedBrowser" value="false"/>
+<mapEntry key="org.eclipse.equinox.preferences/set" value="false"/>
+<mapEntry key="org.eclipse.team.core/streams" value="false"/>
+<mapEntry key="org.eclipse.ui/trace/keyBindings" value="false"/>
+<mapEntry key="org.eclipse.core.resources/build/stacktrace" value="false"/>
+<mapEntry key="org.eclipse.jdt.ui/debug/TypeConstraints" value="false"/>
+<mapEntry key="org.eclipse.ve.cde/debug/logtracefile" value="default"/>
+<mapEntry key="org.eclipse.core.jobs/jobs/beginend" value="false"/>
+<mapEntry key="org.eclipse.core.resources/build/interrupt" value="false"/>
+<mapEntry key="org.eclipse.ui/perf/showHeapStatus" value="true"/>
+<mapEntry key="org.eclipse.ui/perf/contentTypes" value="200"/>
+<mapEntry key="org.eclipse.ui/trace/commands" value="false"/>
+<mapEntry key="org.eclipse.core.resources/build/delta" value="false"/>
+<mapEntry key="org.eclipse.jdt.core/debug/search" value="false"/>
+<mapEntry key="org.eclipse.jdt.core/perf/completion" value="300"/>
+<mapEntry key="org.eclipse.jdt.core/debug/compiler" value="false"/>
+<mapEntry key="org.eclipse.jdt.ui/debug" value="true"/>
+<mapEntry key="org.eclipse.jdt.core/debug/javamodel/cache" value="false"/>
+<mapEntry key="org.eclipse.update.core/debug/configuration" value="false"/>
+<mapEntry key="org.eclipse.jem.beaninfo/debug/logtrace" value="default"/>
+<mapEntry key="org.eclipse.ve.java.core/debug/clipboardtext" value="false"/>
+<mapEntry key="org.eclipse.osgi/debug/messageBundles" value="false"/>
+<mapEntry key="org.eclipse.jem.beaninfo/debug/logtracefile" value="default"/>
+<mapEntry key="org.eclipse.jdt.core.manipulation/debug" value="true"/>
+<mapEntry key="org.eclipse.ui/listeners/IWorkbenchWindow.IPartListener2" value="false"/>
+<mapEntry key="org.eclipse.ui/listeners/IWorkbenchPage.IPartListener2" value="false"/>
+<mapEntry key="org.eclipse.jem.ui/debug/logtrace" value="default"/>
+<mapEntry key="org.eclipse.jdt.core/perf/reconcile" value="1000"/>
+<mapEntry key="org.eclipse.help.webapp/debug" value="true"/>
+<mapEntry key="org.eclipse.jdt.core/debug/hierarchy" value="false"/>
+<mapEntry key="org.eclipse.core.resources/refresh" value="false"/>
+<mapEntry key="org.eclipse.team.core/backgroundevents" value="false"/>
+<mapEntry key="org.eclipse.ltk.core.refactoring/perf/participants/createChanges" value="300"/>
+<mapEntry key="org.eclipse.jdt.core/debug/cpresolution" value="false"/>
+<mapEntry key="org.eclipse.jem.proxy/debug/loglevel" value="default"/>
+<mapEntry key="org.eclipse.update.core/debug/warning" value="false"/>
+<mapEntry key="org.eclipse.jem.beaninfo/debug/loglevel" value="default"/>
+<mapEntry key="org.eclipse.core.resources/save" value="false"/>
+<mapEntry key="org.eclipse.ve.cde/debug/loglevel" value="default"/>
+<mapEntry key="org.eclipse.jem/debug/logtracefile" value="default"/>
+<mapEntry key="org.eclipse.update.core/debug/parsing" value="false"/>
+<mapEntry key="org.eclipse.jdt.ui/perf/explorer/makeActions" value="1000"/>
+<mapEntry key="org.eclipse.core.resources/restore/syncinfo" value="false"/>
+<mapEntry key="org.eclipse.ui/listeners/IWorkbenchWindow.IPageListener" value="false"/>
+<mapEntry key="org.eclipse.team.core/threading" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/url/debug/cachelookup" value="false"/>
+<mapEntry key="org.eclipse.update.core/debug/reconciler" value="false"/>
+<mapEntry key="org.eclipse.jem.proxy/debug/traceexpressions" value="false"/>
+<mapEntry key="org.eclipse.osgi/debug/security" value="false"/>
+<mapEntry key="org.eclipse.jem.proxy/remote/debug/debugvm" value="true"/>
+<mapEntry key="org.eclipse.core.resources/save/syncinfo" value="false"/>
+<mapEntry key="org.eclipse.ve.java.core/debug/loglevel" value="default"/>
+<mapEntry key="org.eclipse.osgi/profile/startup" value="false"/>
+<mapEntry key="org.eclipse.osgi/debug/services" value="false"/>
+<mapEntry key="org.eclipse.core.resources/save/markers" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/preferences/plugin" value="false"/>
+<mapEntry key="org.eclipse.osgi/monitor/resources" value="false"/>
+<mapEntry key="org.eclipse.jem.proxy/remote/debug/ioconsole" value="false"/>
+<mapEntry key="org.eclipse.ve.java.core/debug/vetimetrace" value="false"/>
+<mapEntry key="org.eclipse.jem.ui/debug/loglevel" value="default"/>
+<mapEntry key="org.eclipse.core.jobs/jobs/timing" value="false"/>
+<mapEntry key="org.eclipse.jdt.core/debug/selection" value="false"/>
+<mapEntry key="org.eclipse.jdt.ui/debug/ResultCollector" value="false"/>
+<mapEntry key="org.eclipse.core.resources/restore/snapshots" value="false"/>
+<mapEntry key="org.eclipse.jdt.ui/perf/explorer/createPartControl" value="1300"/>
+<mapEntry key="org.eclipse.team.cvs.core/dirtycaching" value="false"/>
+<mapEntry key="org.eclipse.jdt.core/debug/zipaccess" value="false"/>
+<mapEntry key="org.eclipse.pde.core/cache" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/url/debug/cachecopy" value="false"/>
+<mapEntry key="org.eclipse.osgi/debug/bundleTime" value="false"/>
+<mapEntry key="org.eclipse.ui/trace/operations.verbose" value="false"/>
+<mapEntry key="org.eclipse.team.cvs.core/metafiles" value="false"/>
+<mapEntry key="org.eclipse.team.core/debug" value="false"/>
+<mapEntry key="org.eclipse.ui/perf/workbench.restore" value="30000"/>
+<mapEntry key="org.eclipse.osgi/debug/events" value="false"/>
+<mapEntry key="org.eclipse.osgi/debug/monitorbundles" value="false"/>
+<mapEntry key="org.eclipse.core.jobs/jobs/errorondeadlock" value="false"/>
+<mapEntry key="org.eclipse.ui.ide/debug/internalerror/openDialog" value="false"/>
+<mapEntry key="org.eclipse.ui.intro.universal/trace/logPerformance" value="false"/>
+<mapEntry key="org.eclipse.ui/perf/uijob" value="200"/>
+<mapEntry key="org.eclipse.jdt.core/debug/sourcemapper" value="false"/>
+<mapEntry key="org.eclipse.debug.ui/debug/viewers/deltas" value="false"/>
+<mapEntry key="org.eclipse.osgi/resolver/generics" value="false"/>
+<mapEntry key="org.eclipse.osgi/resolver/wiring" value="false"/>
+<mapEntry key="org.eclipse.jdt.core/perf/javadeltalistener" value="500"/>
+<mapEntry key="org.eclipse.osgi/profile/debug" value="false"/>
+<mapEntry key="org.eclipse.ui/trace/contexts" value="false"/>
+<mapEntry key="org.eclipse.core.contenttype/debug" value="false"/>
+<mapEntry key="org.eclipse.core.resources/build/invoking" value="false"/>
+<mapEntry key="org.eclipse.jem.util/debug/loglevel" value="WARNING"/>
+<mapEntry key="org.eclipse.core.resources/perf/builders" value="10000"/>
+<mapEntry key="org.eclipse.update.core/debug/type" value="false"/>
+<mapEntry key="org.eclipse.ui/trace/operations" value="false"/>
+<mapEntry key="org.eclipse.ui/perf/page.listeners" value="200"/>
+<mapEntry key="org.eclipse.jdt.ui/perf/explorer/RefactorActionGroup" value="150"/>
+<mapEntry key="org.eclipse.core.resources/history" value="false"/>
+<mapEntry key="org.eclipse.team.core/refreshjob" value="false"/>
+<mapEntry key="org.eclipse.ui.intro/debug" value="true"/>
+<mapEntry key="org.eclipse.debug.core/debug" value="true"/>
+<mapEntry key="org.eclipse.help/debug" value="true"/>
+<mapEntry key="org.eclipse.jface.text.source/debug/RevisionRulerColumn" value="false"/>
+<mapEntry key="org.eclipse.ui/debug" value="false"/>
+<mapEntry key="org.eclipse.osgi/debug/packageadmin" value="false"/>
+<mapEntry key="org.eclipse.core.resources/build/failure" value="false"/>
+<mapEntry key="org.eclipse.ui/trace/handlers" value="false"/>
+<mapEntry key="org.eclipse.ui/listeners/IWorkbenchPage.IPropertyChangeListener" value="false"/>
+<mapEntry key="org.eclipse.ui.browser/debug" value="false"/>
+<mapEntry key="org.eclipse.core.resources/save/tree" value="false"/>
+<mapEntry key="org.eclipse.help.ui/debug" value="true"/>
+<mapEntry key="org.eclipse.core.resources/restore/metainfo" value="false"/>
+<mapEntry key="org.eclipse.core.resources/save/mastertable" value="false"/>
+<mapEntry key="org.eclipse.pde.core/debug" value="true"/>
+<mapEntry key="org.eclipse.jdt.core/debug/buffermanager" value="false"/>
+<mapEntry key="org.eclipse.osgi/resolver/grouping" value="false"/>
+<mapEntry key="org.eclipse.ui.ide/debug" value="false"/>
+<mapEntry key="org.eclipse.jdt.core/formatter/enable_new" value="false"/>
+<mapEntry key="org.eclipse.core.resources/restore/mastertable" value="false"/>
+<mapEntry key="org.eclipse.ui.intro/trace/logInfo" value="true"/>
+<mapEntry key="org.eclipse.ve.java.core/debug/logtracefile" value="default"/>
+<mapEntry key="org.eclipse.ui/experimental/menus" value="false"/>
+<mapEntry key="org.eclipse.pde.core/classpath" value="false"/>
+</mapAttribute>
+<booleanAttribute key="automaticValidate" value="false"/>
+<stringAttribute key="selectedPlugin" value="org.eclipse.jem.proxy"/>
+<booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/>
+<booleanAttribute key="automaticAdd" value="true"/>
+<stringAttribute key="location" value="D:\runtime-junit-test-workspace"/>
+<stringAttribute key="application" value="org.eclipse.pde.junit.runtime.coretestapplication"/>
+<stringAttribute key="configLocation" value=""/>
+<booleanAttribute key="clearws" value="true"/>
+<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.eclipse.jem.tests.AllSuites"/>
+<stringAttribute key="location1" value="D:\runtime-junit-test-workspace"/>
+<stringAttribute key="pde.version" value="3.2a"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os win32 -ws win32 -arch x86 -nl en_US"/>
+<booleanAttribute key="default" value="true"/>
+<booleanAttribute key="clearConfig" value="false"/>
+<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
+<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
+<booleanAttribute key="useDefaultConfigArea" value="true"/>
+<booleanAttribute key="useDefaultConfig" value="true"/>
+<stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.jem.tests"/>
+<booleanAttribute key="askclear" value="true"/>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
+<listEntry value="/org.eclipse.jem.tests"/>
+</listAttribute>
+<booleanAttribute key="includeOptional" value="true"/>
+<stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit3"/>
+</launchConfiguration>
diff --git a/tests/org.eclipse.jem.tests/Java AllSuites.launch b/tests/org.eclipse.jem.tests/Java AllSuites.launch
new file mode 100644
index 0000000..ca96791
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/Java AllSuites.launch
@@ -0,0 +1,260 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<launchConfiguration type="org.eclipse.pde.ui.JunitLaunchConfig">
+<stringAttribute key="product" value="org.eclipse.platform.ide"/>
+<stringAttribute key="bootstrap" value=""/>
+<booleanAttribute key="useProduct" value="false"/>
+<booleanAttribute key="tracing" value="true"/>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
+<listEntry value="4"/>
+</listAttribute>
+<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value=""/>
+<booleanAttribute key="automaticValidate" value="false"/>
+<mapAttribute key="tracingOptions">
+<mapEntry key="org.eclipse.team.cvs.core/syncchangeevents" value="false"/>
+<mapEntry key="org.eclipse.ve.java.core/debug/xmltext" value="false"/>
+<mapEntry key="org.eclipse.help.webapp/debug/workingsets" value="false"/>
+<mapEntry key="org.eclipse.osgi/defaultprofile/logfilename" value=""/>
+<mapEntry key="org.eclipse.core.runtime/loader/debug/filter/loader" value="*"/>
+<mapEntry key="org.eclipse.jem/debug/logtrace" value="default"/>
+<mapEntry key="org.eclipse.core.runtime/loader/debug/actions" value="false"/>
+<mapEntry key="org.eclipse.jem.proxy/debug/traceexpressionstimethreshold" value="100"/>
+<mapEntry key="org.eclipse.jface.text/debug/ContentAssistSubjectAdapters" value="false"/>
+<mapEntry key="org.eclipse.core.resources/perf/listeners" value="500"/>
+<mapEntry key="org.eclipse.core.runtime/url/debug/connect" value="false"/>
+<mapEntry key="org.eclipse.core.resources/restore/markers" value="false"/>
+<mapEntry key="org.eclipse.core.resources/build/needbuild" value="false"/>
+<mapEntry key="org.eclipse.jem.util/debug/logtrace" value="false"/>
+<mapEntry key="org.eclipse.ui/trace/graphics" value="false"/>
+<mapEntry key="org.eclipse.jdt.core/debug/resolution" value="false"/>
+<mapEntry key="org.eclipse.update.configurator/debug" value="false"/>
+<mapEntry key="org.eclipse.team.cvs.ssh/ssh_protocol" value="false"/>
+<mapEntry key="org.eclipse.core.resources/perf/snapshot" value="500"/>
+<mapEntry key="org.eclipse.osgi/monitor/activation" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/registry/debug" value="false"/>
+<mapEntry key="org.eclipse.osgi/debug/packages" value="false"/>
+<mapEntry key="org.eclipse.ui/debug/showSystemJobs" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/loader/debug" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/loader/debug/prefixes" value="false"/>
+<mapEntry key="org.eclipse.jem.proxy/remote/debug/vmtraceout" value="true"/>
+<mapEntry key="org.eclipse.core.runtime/url/debug" value="false"/>
+<mapEntry key="org.eclipse.osgi/monitor/classes" value="false"/>
+<mapEntry key="org.eclipse.update.core/debug" value="true"/>
+<mapEntry key="org.eclipse.core.runtime/debug/context" value="false"/>
+<mapEntry key="org.eclipse.osgi/eclipseadaptor/converter/debug" value="false"/>
+<mapEntry key="org.eclipse.osgi/eclipseadaptor/debug/platformadmin" value="false"/>
+<mapEntry key="org.eclipse.help.ui/debug/embeddedBrowser" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/preferences/set" value="false"/>
+<mapEntry key="org.eclipse.ui/debug/swtdebug" value="false"/>
+<mapEntry key="org.eclipse.jdt.core/debug/javamodel" value="false"/>
+<mapEntry key="org.eclipse.team.core/streams" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/jobs/locks" value="false"/>
+<mapEntry key="org.eclipse.ui/trace/keyBindings" value="false"/>
+<mapEntry key="org.eclipse.ui.intro/trace/printHTML" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/registry/debug/dump" value=""/>
+<mapEntry key="org.eclipse.jdt.ui/debug/TypeConstraints" value="false"/>
+<mapEntry key="org.eclipse.jdt.core/debug/javadelta/verbose" value="false"/>
+<mapEntry key="org.eclipse.jdt.core/debug" value="true"/>
+<mapEntry key="org.eclipse.core.expressions/tracePropertyResolving" value="false"/>
+<mapEntry key="org.eclipse.core.resources/restore" value="false"/>
+<mapEntry key="org.eclipse.osgi/trace/filename" value="runtime.traces"/>
+<mapEntry key="org.eclipse.update.core/debug/web" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/registry/debug/resolve" value="false"/>
+<mapEntry key="org.eclipse.osgi/debug" value="false"/>
+<mapEntry key="org.eclipse.core.resources/build/delta" value="false"/>
+<mapEntry key="org.eclipse.osgi/trace/activation" value="false"/>
+<mapEntry key="org.eclipse.jdt.core/debug/search" value="false"/>
+<mapEntry key="org.eclipse.jdt.ui/debug/checkCoreBindingIsEqualTo" value="false"/>
+<mapEntry key="org.eclipse.ve.java.core/debug/logtrace" value="default"/>
+<mapEntry key="org.eclipse.jdt.core/debug/compiler" value="false"/>
+<mapEntry key="org.eclipse.jface.text/debug/AnnotationPainter" value="false"/>
+<mapEntry key="org.eclipse.jdt.ui/debug" value="true"/>
+<mapEntry key="org.eclipse.core.runtime/registry/debug/events/plugin" value="false"/>
+<mapEntry key="org.eclipse.jem.beaninfo/debug/logtrace" value="default"/>
+<mapEntry key="org.eclipse.update.core/debug/configuration" value="false"/>
+<mapEntry key="org.eclipse.ui/trace/part.activate" value="false"/>
+<mapEntry key="org.eclipse.osgi/resolver/imports" value="false"/>
+<mapEntry key="org.eclipse.help.ui/debug/infopop" value="false"/>
+<mapEntry key="org.eclipse.osgi/trace/filters" value="trace.properties"/>
+<mapEntry key="org.eclipse.osgi/eclipseadaptor/debug/platformadmin/resolver" value="false"/>
+<mapEntry key="org.eclipse.jem.beaninfo/debug/logtracefile" value="default"/>
+<mapEntry key="org.eclipse.core.runtime/registry/debug/events/extension" value="false"/>
+<mapEntry key="org.eclipse.jem.ui/debug/logtracefile" value="default"/>
+<mapEntry key="org.eclipse.jem.ui/debug/logtrace" value="default"/>
+<mapEntry key="org.eclipse.help.webapp/debug" value="true"/>
+<mapEntry key="org.eclipse.jdt.core/debug/hierarchy" value="false"/>
+<mapEntry key="org.eclipse.core.resources/refresh" value="false"/>
+<mapEntry key="org.eclipse.team.cvs.core/debug" value="false"/>
+<mapEntry key="org.eclipse.team.core/backgroundevents" value="false"/>
+<mapEntry key="org.eclipse.jdt.core/debug/cpresolution" value="false"/>
+<mapEntry key="org.eclipse.team.cvs.core/threading" value="false"/>
+<mapEntry key="org.eclipse.jem.proxy/debug/loglevel" value="default"/>
+<mapEntry key="org.eclipse.jem.beaninfo/debug/loglevel" value="default"/>
+<mapEntry key="org.eclipse.update.core/debug/warning" value="false"/>
+<mapEntry key="org.eclipse.osgi/resolver/debug" value="false"/>
+<mapEntry key="org.eclipse.core.resources/save" value="false"/>
+<mapEntry key="org.eclipse.update.core/debug/install" value="false"/>
+<mapEntry key="org.eclipse.ui/debug/internalerror/openDialog" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/jobs/errorondeadlock" value="false"/>
+<mapEntry key="org.eclipse.core.resources/debug" value="false"/>
+<mapEntry key="org.eclipse.help.ui/debug/embeddedBrowser/inprocess" value="false"/>
+<mapEntry key="org.eclipse.osgi/profile/impl" value="org.eclipse.osgi.profile.DefaultProfileLogger"/>
+<mapEntry key="org.eclipse.jem/debug/logtracefile" value="default"/>
+<mapEntry key="org.eclipse.osgi/profile/benchmark" value="false"/>
+<mapEntry key="org.eclipse.update.core/debug/parsing" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/preferences/general" value="false"/>
+<mapEntry key="org.eclipse.core.resources/restore/syncinfo" value="false"/>
+<mapEntry key="org.eclipse.team.cvs.core/cvsprotocol" value="true"/>
+<mapEntry key="org.eclipse.jdt.core/debug/postaction" value="false"/>
+<mapEntry key="org.eclipse.ui/trace/perspective.listeners" value="false"/>
+<mapEntry key="org.eclipse.jem.proxy/remote/debug/notimeouts" value="false"/>
+<mapEntry key="org.eclipse.team.core/threading" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/url/debug/cachelookup" value="false"/>
+<mapEntry key="org.eclipse.osgi/debug/packageadmin/timing" value="false"/>
+<mapEntry key="org.eclipse.update.core/debug/reconciler" value="false"/>
+<mapEntry key="org.eclipse.osgi/debug/security" value="false"/>
+<mapEntry key="org.eclipse.jem.proxy/debug/traceexpressions" value="false"/>
+<mapEntry key="org.eclipse.jem.proxy/remote/debug/debugvm" value="false"/>
+<mapEntry key="org.eclipse.osgi/debug/manifest" value="false"/>
+<mapEntry key="org.eclipse.help/debug/context" value="false"/>
+<mapEntry key="org.eclipse.jdt.core/debug/builder" value="false"/>
+<mapEntry key="org.eclipse.osgi/resolver/requires" value="false"/>
+<mapEntry key="org.eclipse.core.resources/save/syncinfo" value="false"/>
+<mapEntry key="org.eclipse.ve.java.core/debug/loglevel" value="default"/>
+<mapEntry key="org.eclipse.core.runtime/loader/debug/filter/resource" value="*"/>
+<mapEntry key="org.eclipse.osgi/profile/startup" value="false"/>
+<mapEntry key="org.eclipse.osgi/debug/services" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/loader/debug/activateplugin" value="false"/>
+<mapEntry key="org.eclipse.team.cvs.ssh/debug" value="false"/>
+<mapEntry key="org.eclipse.ui/trace/handlers.verbose" value="false"/>
+<mapEntry key="org.eclipse.core.resources/save/markers" value="false"/>
+<mapEntry key="org.eclipse.ve.java.core/debug/livewindow" value="false"/>
+<mapEntry key="org.eclipse.update.core/debug/installhandler" value="false"/>
+<mapEntry key="org.eclipse.osgi/debug/startlevel" value="false"/>
+<mapEntry key="org.eclipse.jem.proxy/remote/debug/ioconsole" value="false"/>
+<mapEntry key="org.eclipse.osgi/monitor/resources" value="false"/>
+<mapEntry key="org.eclipse.ve.java.core/debug/vetimetrace" value="false"/>
+<mapEntry key="org.eclipse.jem.ui/debug/loglevel" value="default"/>
+<mapEntry key="org.eclipse.jdt.core/debug/javadelta" value="false"/>
+<mapEntry key="org.eclipse.jdt.core/debug/selection" value="false"/>
+<mapEntry key="org.eclipse.core.resources/restore/tree" value="false"/>
+<mapEntry key="org.eclipse.core.resources/preferences" value="false"/>
+<mapEntry key="org.eclipse.ui/trace/workbench.restore" value="false"/>
+<mapEntry key="org.eclipse.ui/trace/part.create" value="false"/>
+<mapEntry key="org.eclipse.help/debug/protocols" value="false"/>
+<mapEntry key="org.eclipse.core.resources/restore/snapshots" value="false"/>
+<mapEntry key="org.eclipse.core.resources/natures" value="false"/>
+<mapEntry key="org.eclipse.help.base/debug/search" value="false"/>
+<mapEntry key="org.eclipse.team.cvs.core/dirtycaching" value="false"/>
+<mapEntry key="org.eclipse.osgi/defaultprofile/buffersize" value="256"/>
+<mapEntry key="org.eclipse.jem/debug/loglevel" value="default"/>
+<mapEntry key="org.eclipse.core.runtime/loader/debug/filter/native" value="*"/>
+<mapEntry key="org.eclipse.jdt.core/debug/zipaccess" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/url/debug/cachecopy" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/loader/debug/properties" value="false"/>
+<mapEntry key="org.eclipse.osgi/resolver/cycles" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/loader/debug/create" value="false"/>
+<mapEntry key="org.eclipse.ui/trace/include.timings" value="true"/>
+<mapEntry key="org.eclipse.ui/trace/keyBindings.verbose" value="false"/>
+<mapEntry key="org.eclipse.osgi/debug/bundleTime" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/jobs/beginend" value="false"/>
+<mapEntry key="org.eclipse.team.cvs.core/metafiles" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/preferences/get" value="false"/>
+<mapEntry key="org.eclipse.team.core/debug" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/perf/success" value="true"/>
+<mapEntry key="org.eclipse.osgi/debug/events" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/compatibility/debug" value="false"/>
+<mapEntry key="org.eclipse.ui/debug/declaredImages" value="false"/>
+<mapEntry key="org.eclipse.osgi/debug/monitorbundles" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/loader/debug/prefixes/success" value="false"/>
+<mapEntry key="org.eclipse.pde.build/debug" value="false"/>
+<mapEntry key="org.eclipse.jem.util/debug/logtracefile" value="false"/>
+<mapEntry key="org.eclipse.osgi/eclipseadaptor/debug/location" value="false"/>
+<mapEntry key="org.eclipse.ui/trace/contexts.verbose" value="false"/>
+<mapEntry key="org.eclipse.help.base/debug" value="true"/>
+<mapEntry key="org.eclipse.core.runtime/debug/pluginstopper" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/jobs" value="false"/>
+<mapEntry key="org.eclipse.ui/trace/workbench.start" value="false"/>
+<mapEntry key="org.eclipse.jem.proxy/debug/logtrace" value="default"/>
+<mapEntry key="org.eclipse.core.runtime/contenttypes/debug" value="false"/>
+<mapEntry key="org.eclipse.core.resources/strings" value="false"/>
+<mapEntry key="org.eclipse.jdt.ui/debug/checkCoreBindingGetJavaElement" value="false"/>
+<mapEntry key="org.eclipse.core.resources/save/metainfo" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/timing/startup" value="false"/>
+<mapEntry key="org.eclipse.osgi/resolver/wiring" value="false"/>
+<mapEntry key="org.eclipse.osgi/profile/debug" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/perf" value="false"/>
+<mapEntry key="org.eclipse.ui/trace/contexts" value="false"/>
+<mapEntry key="org.eclipse.core.resources/build/invoking" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/loader/debug/failure" value="false"/>
+<mapEntry key="org.eclipse.ui/debug/uijob.longwarning" value="false"/>
+<mapEntry key="org.eclipse.jem.util/debug/loglevel" value="WARNING"/>
+<mapEntry key="org.eclipse.update.core/debug/type" value="false"/>
+<mapEntry key="org.eclipse.core.resources/perf/builders" value="10000"/>
+<mapEntry key="org.eclipse.ui/trace/page.listeners" value="false"/>
+<mapEntry key="org.eclipse.ui/debug/job.stale" value="false"/>
+<mapEntry key="org.eclipse.jdt.ui/debug/allTypesCache" value="false"/>
+<mapEntry key="org.eclipse.jem.proxy/debug/logtracefile" value="default"/>
+<mapEntry key="org.eclipse.core.resources/history" value="false"/>
+<mapEntry key="org.eclipse.team.core/refreshjob" value="false"/>
+<mapEntry key="org.eclipse.ui.intro/debug" value="true"/>
+<mapEntry key="org.eclipse.jdt.core/debug/completion" value="false"/>
+<mapEntry key="org.eclipse.osgi/eclipseadaptor/debug" value="false"/>
+<mapEntry key="org.eclipse.debug.core/debug" value="true"/>
+<mapEntry key="org.eclipse.help/debug" value="true"/>
+<mapEntry key="org.eclipse.ui/trace/perspective" value="false"/>
+<mapEntry key="org.eclipse.ui/debug" value="false"/>
+<mapEntry key="org.eclipse.jdt.core/debug/indexmanager" value="false"/>
+<mapEntry key="org.eclipse.osgi/debug/packageadmin" value="false"/>
+<mapEntry key="org.eclipse.osgi/debug/loader" value="false"/>
+<mapEntry key="org.eclipse.core.resources/build/failure" value="false"/>
+<mapEntry key="org.eclipse.ui/trace/handlers" value="false"/>
+<mapEntry key="org.eclipse.core.resources/save/tree" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/config/debug" value="false"/>
+<mapEntry key="org.eclipse.osgi/defaultprofile/logsynchronously" value="false"/>
+<mapEntry key="org.eclipse.help.ui/debug" value="true"/>
+<mapEntry key="org.eclipse.osgi/trace/classLoading" value="false"/>
+<mapEntry key="org.eclipse.core.resources/restore/metainfo" value="false"/>
+<mapEntry key="org.eclipse.core.resources/save/mastertable" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/perf/failure" value="true"/>
+<mapEntry key="org.eclipse.core.runtime/debug" value="false"/>
+<mapEntry key="org.eclipse.ui/trace/handlers.verbose.commandId" value=""/>
+<mapEntry key="org.eclipse.jdt.core/debug/buffermanager" value="false"/>
+<mapEntry key="org.eclipse.osgi/debug/filter" value="false"/>
+<mapEntry key="org.eclipse.osgi/resolver/grouping" value="false"/>
+<mapEntry key="org.eclipse.jdt.ui/debug/ASTProvider" value="false"/>
+<mapEntry key="org.eclipse.ui/trace/part.listeners" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/loader/debug/success" value="false"/>
+<mapEntry key="org.eclipse.core.resources/restore/mastertable" value="false"/>
+<mapEntry key="org.eclipse.ui.intro/trace/logInfo" value="true"/>
+<mapEntry key="org.eclipse.ve.java.core/debug/logtracefile" value="default"/>
+<mapEntry key="org.eclipse.core.runtime/loader/debug/filter/class" value="*"/>
+<mapEntry key="org.eclipse.core.runtime/jobs/timing" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/loader/debug/prefixes/failure" value="false"/>
+</mapAttribute>
+<stringAttribute key="selectedPlugin" value="org.eclipse.jem.proxy"/>
+<booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/>
+<booleanAttribute key="automaticAdd" value="true"/>
+<stringAttribute key="timestamp" value="1172079346936"/>
+<stringAttribute key="location" value="D:\runtime-junit-test-workspace"/>
+<stringAttribute key="application" value="org.eclipse.pde.junit.runtime.coretestapplication"/>
+<stringAttribute key="configLocation" value=""/>
+<booleanAttribute key="clearws" value="true"/>
+<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.eclipse.jem.tests.AllSuites"/>
+<stringAttribute key="location1" value="D:\runtime-junit-test-workspace"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os win32 -ws win32 -arch x86 -nl en_US"/>
+<stringAttribute key="pde.version" value="3.3"/>
+<booleanAttribute key="default" value="true"/>
+<booleanAttribute key="clearConfig" value="false"/>
+<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
+<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
+<booleanAttribute key="useDefaultConfigArea" value="true"/>
+<booleanAttribute key="useDefaultConfig" value="true"/>
+<stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.jem.tests"/>
+<booleanAttribute key="askclear" value="true"/>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
+<listEntry value="/org.eclipse.jem.tests"/>
+</listAttribute>
+<booleanAttribute key="includeOptional" value="true"/>
+<stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit3"/>
+</launchConfiguration>
diff --git a/tests/org.eclipse.jem.tests/META-INF/MANIFEST.MF b/tests/org.eclipse.jem.tests/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..3b21034
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/META-INF/MANIFEST.MF
@@ -0,0 +1,36 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.jem.tests; singleton:=true
+Bundle-Version: 1.2.300.qualifier
+Bundle-ClassPath: javatests.jar
+Bundle-Activator: org.eclipse.jem.tests.JavaTestsPlugin
+Bundle-Vendor: %providerName
+Bundle-Localization: plugin
+Export-Package: initParserTest46376;x-internal:=true,
+ org.eclipse.jem.tests,
+ org.eclipse.jem.tests.basic,
+ org.eclipse.jem.tests.beaninfo,
+ org.eclipse.jem.tests.instantiation,
+ org.eclipse.jem.tests.modelListeners,
+ org.eclipse.jem.tests.proxy,
+ org.eclipse.jem.tests.proxy.ide,
+ org.eclipse.jem.tests.proxy.initParser,
+ org.eclipse.jem.tests.proxy.initParser.tree,
+ org.eclipse.jem.tests.proxy.remote
+Require-Bundle: org.eclipse.jem.proxy;bundle-version="[2.0.0,3.0.0)",
+ org.junit;bundle-version="[3.8.1,5.0.0)",
+ org.eclipse.ant.core;bundle-version="[3.1.100,4.0.0)",
+ org.eclipse.jem.beaninfo;bundle-version="[2.0.0,3.0.0)",
+ org.eclipse.jdt.core;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.jem.workbench;bundle-version="[2.0.0,3.0.0)",
+ org.eclipse.core.resources;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.jdt.launching;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.emf.ecore;bundle-version="[2.2.0,3.0.0)",
+ org.eclipse.jem;bundle-version="[2.0.0,3.0.0)",
+ org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.debug.core;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.jem.util;bundle-version="[2.0.0,3.0.0)"
+Eclipse-LazyStart: true
+Bundle-RequiredExecutionEnvironment: J2SE-1.4
+Bundle-ActivationPolicy: lazy
diff --git a/tests/org.eclipse.jem.tests/about.html b/tests/org.eclipse.jem.tests/about.html
new file mode 100644
index 0000000..5acea59
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/about.html
@@ -0,0 +1,25 @@
+<!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>June, 2008</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
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body></html>
\ No newline at end of file
diff --git a/tests/org.eclipse.jem.tests/about.ini b/tests/org.eclipse.jem.tests/about.ini
new file mode 100644
index 0000000..1931489
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/about.ini
@@ -0,0 +1,29 @@
+# about.ini
+# contains information about a feature
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# "%key" are externalized strings defined in about.properties
+# This file does not need to be translated.
+
+# Property "aboutText" contains blurb for "About" dialog (translated)
+aboutText=%blurb
+
+# Property "windowImage" contains path to window icon (16x16)
+# needed for primary features only
+
+# Property "featureImage" contains path to feature image (32x32)
+featureImage=eclipse32.png
+
+# Property "aboutImage" contains path to product image (500x330 or 115x164)
+# needed for primary features only
+
+# Property "appName" contains name of the application (translated)
+# needed for primary features only
+
+# Property "welcomePage" contains path to welcome page (special XML-based format)
+# optional
+
+# Property "welcomePerspective" contains the id of the perspective in which the
+# welcome page is to be opened.
+# optional
+
+
diff --git a/plugins/org.eclipse.wst.web.ui/about.mappings b/tests/org.eclipse.jem.tests/about.mappings
similarity index 100%
rename from plugins/org.eclipse.wst.web.ui/about.mappings
rename to tests/org.eclipse.jem.tests/about.mappings
diff --git a/tests/org.eclipse.jem.tests/about.properties b/tests/org.eclipse.jem.tests/about.properties
new file mode 100644
index 0000000..7929ea5
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/about.properties
@@ -0,0 +1,28 @@
+###############################################################################
+# Copyright (c) 2003, 2005 IBM 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:
+#     IBM Corporation - initial API and implementation
+###############################################################################
+#
+# $Source: /cvsroot/webtools/jeetools.move/webtools.javaee.tests.git/tests/org.eclipse.jem.tests/about.properties,v $
+# $Revision: 1.8 $  $Date: 2006/05/18 19:09:56 $
+#
+
+# about.properties
+# contains externalized strings for about.ini
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# fill-ins are supplied by about.mappings
+# This file should be translated.
+
+blurb=Java EMF Model Tests\n\
+\n\
+Version: {featureVersion}\n\
+Build id: {0}\n\
+\n\
+(c) Copyright Eclipse contributors and others. 2000, 2006.  All rights reserved.\n\
+Visit http://www.eclipse.org/vep
diff --git a/tests/org.eclipse.jem.tests/build.properties b/tests/org.eclipse.jem.tests/build.properties
new file mode 100644
index 0000000..4195120
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/build.properties
@@ -0,0 +1,27 @@
+###############################################################################
+# Copyright (c) 2003, 2006 IBM 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:
+#     IBM Corporation - initial API and implementation
+###############################################################################
+bin.includes = plugin.xml,\
+               plugin.properties,\
+               javatests.jar,\
+               vm/tests.jar,\
+               about.html,\
+               testdata/,\
+               test.xml.off,\
+               about.ini,\
+               about.mappings,\
+               about.properties,\
+               eclipse32.png,\
+               META-INF/
+jars.compile.order = vm/tests.jar,\
+                     javatests.jar
+source.vm/tests.jar = vm_tests/
+source.javatests.jar = javatests/
+src.includes = proxy.jars
diff --git a/tests/org.eclipse.jem.tests/eclipse32.png b/tests/org.eclipse.jem.tests/eclipse32.png
new file mode 100644
index 0000000..568fac1
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/eclipse32.png
Binary files differ
diff --git a/tests/org.eclipse.jem.tests/javatests/InitParserTest46376.java b/tests/org.eclipse.jem.tests/javatests/InitParserTest46376.java
new file mode 100644
index 0000000..7336ada
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/InitParserTest46376.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $RCSfile: InitParserTest46376.java,v $
+ *  $Revision: 1.3 $  $Date: 2005/08/24 20:58:54 $ 
+ */
+ 
+/**
+ * This is to test for defect [46376].
+ * 
+ * SameName test. This is test where you have this:
+ * 	initParserTest46376.SameNameTestClass.java
+ * 	InitParserTest46376.java
+ *  
+ * Before [46376] the Static parser would find throw NoClassDefFoundError on initParserTest46376 when looking for
+ * SameNameTestClass and never find the class.
+ * 
+ * To compile in Eclipse we need to have one of the classes be in the default package. Eclipse complains if we didn't.
+ * But there is nothing to stop this from happening with packages too if they are spread across compile groups.  
+ */
+public class InitParserTest46376 {
+
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/initParserTest46376/SameNameTestClass.java b/tests/org.eclipse.jem.tests/javatests/initParserTest46376/SameNameTestClass.java
new file mode 100644
index 0000000..6a1f7b0
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/initParserTest46376/SameNameTestClass.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package initParserTest46376;
+/*
+ *  $RCSfile: SameNameTestClass.java,v $
+ *  $Revision: 1.3 $  $Date: 2005/08/24 20:58:55 $ 
+ */
+/**
+ * This is to test for defect [46376].
+ * 
+ * SameName test. This is test where you have this:
+ * 	InitParserTest46376.SameNameTestClass.java
+ * 	InitParserTest46376.java
+ * 
+ * and
+ * 
+ * 	new org.eclipse.jem.tests.proxy.initParser.SameNameTestClass.RealClass()
+ * 
+ * Before [46376] the Static parser would find SameNameTestClass.java instead of the RealClass and would of failed.
+ * To compile in Eclipse we need to have one of the classes be in the default package. Eclipse complains if we didn't.
+ * But there is nothing to stop this from happening with packages too if they are spread across compile groups.  
+ */
+public class SameNameTestClass {
+	
+	public boolean equals(Object other) {
+		// To make test easier, we simply looking if both of same type.
+		return other != null && other.getClass() == SameNameTestClass.class;
+	}
+
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/.classpath b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/.classpath
new file mode 100644
index 0000000..fb50116
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/.classpath
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/AllSuites.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/AllSuites.java
new file mode 100644
index 0000000..f8ed979
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/AllSuites.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jem.tests;
+/*
+ *  $RCSfile: AllSuites.java,v $
+ *  $Revision: 1.10 $  $Date: 2007/03/14 01:22:06 $ 
+ */
+import org.eclipse.jem.tests.basic.BasicSuite;
+import org.eclipse.jem.tests.beaninfo.BeanInfoSuite;
+import org.eclipse.jem.tests.instantiation.InstantiationSuite;
+import org.eclipse.jem.tests.modelListeners.ListenersSuite;
+import org.eclipse.jem.tests.proxy.ide.IDEProxySuite;
+import org.eclipse.jem.tests.proxy.initParser.InitParserSuite;
+import org.eclipse.jem.tests.proxy.initParser.tree.ASTParserSuite;
+import org.eclipse.jem.tests.proxy.remote.RemoteProxySuite;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+public class AllSuites extends TestSuite {
+	// Testa cases to be include in the suite
+	private static Class suitesList[] = {
+		BasicSuite.class,
+		JDK5ReflectionSuite.class,
+		InitParserSuite.class,  
+		ASTParserSuite.class,
+		RemoteProxySuite.class,
+		IDEProxySuite.class,
+		BeanInfoSuite.class,
+		InstantiationSuite.class,
+		ListenersSuite.class,
+		                                 } ;
+	public static String pkgName = "Java EMF Model jUnit Test Suite" ;
+    
+	/**
+	 * Constructor for PackageSuite.
+	 */
+	public AllSuites() {
+		super();
+		populateSuite() ;
+	}
+
+	/**
+	 * Constructor for PackageSuite.
+	 * @param theClass
+	 */
+	public AllSuites(Class theClass) {
+		super(theClass);
+		populateSuite() ;
+	}
+
+	/**
+	 * Constructor for PackageSuite.
+	 * @param name
+	 */
+	public AllSuites(String name) {
+		super(name);
+		populateSuite() ;
+	}
+
+    private void populateSuite () {
+    	for (int i=0; i<suitesList.length; i++)
+    	  try {
+			Test ts = (Test) suitesList[i].newInstance() ;
+			addTest(ts) ;
+		  }
+		  catch (Exception e) {}		 
+    }
+    
+	public static Test suite() {
+		return new AllSuites(pkgName);
+	}
+
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/JDK5BinReflectionTests.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/JDK5BinReflectionTests.java
new file mode 100644
index 0000000..70dcf46
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/JDK5BinReflectionTests.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jem.tests;
+
+
+/**
+ * Test case for testing the reflection of concepts
+ * from JDK 5 when source is not available.
+ * @since 1.2.2
+ *
+ */
+public class JDK5BinReflectionTests extends JDK5ReflectionTests {
+
+	/**
+	 * 
+	 */
+	public JDK5BinReflectionTests() {
+		isReflectingSource = false;
+	}
+
+	/**
+	 * @param name
+	 */
+	public JDK5BinReflectionTests(String name) {
+		super(name);
+		isReflectingSource = false;
+	}
+	
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/JDK5ReflectionSuite.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/JDK5ReflectionSuite.java
new file mode 100644
index 0000000..4f77967
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/JDK5ReflectionSuite.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $RCSfile: JDK5ReflectionSuite.java,v $
+ *  $Revision: 1.1 $  $Date: 2006/10/27 19:36:33 $ 
+ */
+package org.eclipse.jem.tests;
+
+import junit.extensions.TestSetup;
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * This is basic JEM JDK5 toleration mode tests.
+ * 
+ * @author richkulp
+ *
+ */
+public class JDK5ReflectionSuite extends TestSetup {
+
+	// Test cases to be include in the suite
+	private static final Class testsList[] = { JDK5ReflectionTests.class, JDK5BinReflectionTests.class};
+
+	/**
+	 * 
+	 */
+	public JDK5ReflectionSuite() {
+		this("Test Basic JEM JDK5 toleration mode Suite");
+	}
+
+	/**
+	 * @param name
+	 */
+	public JDK5ReflectionSuite(String name) {
+		super(new TestSuite(name) {
+			{
+				for (int i = 0; i < testsList.length; i++) {
+					addTestSuite(testsList[i]);
+				}
+
+			}
+		});
+	}
+
+	public static Test suite() {
+		return new JDK5ReflectionSuite();
+	}
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/JDK5ReflectionTests.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/JDK5ReflectionTests.java
new file mode 100644
index 0000000..e8ae859
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/JDK5ReflectionTests.java
@@ -0,0 +1,689 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jem.tests;
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.*;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.resources.*;
+import org.eclipse.core.runtime.*;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
+import org.eclipse.jdt.core.*;
+
+import org.eclipse.jem.internal.adapters.jdom.JavaJDOMAdapterFactory;
+import org.eclipse.jem.java.*;
+
+/**
+ * Test case for testing the reflection of concepts
+ * from JDK 5.
+ * @since 1.2.2
+ *
+ */
+public class JDK5ReflectionTests extends TestCase {
+	
+	private static final String PROJECT_NAME = "JDK5Tests"; //$NON-NLS-1$
+	private IJavaProject javaProject;
+	private ResourceSet resourceSet;
+	
+	private boolean oldAutoBuildingState; // autoBuilding state before we started.
+
+	protected boolean isReflectingSource;
+	
+	/**
+	 * 
+	 */
+	public JDK5ReflectionTests() {
+		isReflectingSource = true;
+	}
+
+	/**
+	 * @param name
+	 */
+	public JDK5ReflectionTests(String name) {
+		super(name);
+		isReflectingSource = true;
+	}
+	
+	protected void setUp() throws Exception {
+		super.setUp();
+		if (isReflectingSource)
+			setUpForSource();
+		else
+			setUpForNoSource();
+	}
+
+	protected void setUpForSource() throws CoreException, IOException, MalformedURLException {
+		oldAutoBuildingState = JavaProjectUtil.setAutoBuild(true);
+		URL installURL = JavaTestsPlugin.getPlugin().getBundle().getEntry("/");
+		String[] zipPaths = new String[1];
+		zipPaths[0] = FileLocator.toFileURL(new URL(installURL, "testdata/JDK5Tests.zip")).getFile();
+		IProject[] projects =
+			JavaProjectUtil.importProjects(
+				new String[] { PROJECT_NAME },
+				zipPaths);
+		assertNotNull(projects[0]);
+		JavaProjectUtil.waitForAutoBuild();
+		javaProject = JavaCore.create(projects[0]);
+		javaProject.setOption(JavaCore.COMPILER_COMPLIANCE, "1.5");
+		resourceSet = new ResourceSetImpl();
+		resourceSet.getAdapterFactories().add(new JavaJDOMAdapterFactory(javaProject));
+	}
+
+	protected void setUpForNoSource() throws CoreException, IOException, MalformedURLException {
+		oldAutoBuildingState = JavaProjectUtil.setAutoBuild(true);
+		URL installURL = JavaTestsPlugin.getPlugin().getBundle().getEntry("/");
+		String[] jarPaths = new String[1];
+		jarPaths[0] = FileLocator.toFileURL(new URL(installURL, "testdata/JDK5BinTests.jar")).getFile();
+		IProject project = JavaProjectUtil.createEmptyJavaProject(ResourcesPlugin.getWorkspace(), new Path(PROJECT_NAME), null);
+		assertNotNull(project);
+		JavaProjectUtil.waitForAutoBuild();
+		javaProject = JavaCore.create(project);
+		javaProject.setOption(JavaCore.COMPILER_COMPLIANCE, "1.5");
+		ArrayList classpath = new ArrayList(Arrays.asList(javaProject.getRawClasspath()));
+		classpath.add(JavaCore.newLibraryEntry(new Path(jarPaths[0]), null, null));
+		javaProject.setRawClasspath((IClasspathEntry[]) classpath.toArray(new IClasspathEntry[0]), null);	
+		JavaProjectUtil.waitForAutoBuild();
+		resourceSet = new ResourceSetImpl();
+		resourceSet.getAdapterFactories().add(new JavaJDOMAdapterFactory(javaProject));
+	}
+	
+	protected void tearDown() throws Exception {
+		super.tearDown();
+		ResourcesPlugin.getWorkspace().run(new IWorkspaceRunnable() {
+			public void run(IProgressMonitor monitor) throws CoreException {
+				JavaProjectUtil.deleteProject(javaProject.getProject());
+			}
+		}, ResourcesPlugin.getWorkspace().getRoot(), 0, null);
+
+		JavaProjectUtil.setAutoBuild(oldAutoBuildingState);
+	}
+	
+	private JavaHelpers reflectClass(String qualifiedName) {
+		return JavaRefFactory.eINSTANCE.reflectType(qualifiedName, resourceSet);
+	}
+	
+	/**
+	 * Test method test1 from Test class.
+	 * 
+	 * public Collection<String> test1()
+	 *
+	 */
+	public void test1() {
+ 		JavaHelpers testHelper = reflectClass("test.me.Test");
+		assertFalse(testHelper.isPrimitive());
+		JavaClass testClass = (JavaClass) testHelper;
+		assertTrue((testClass).isExistingType());
+		
+		Method method = testClass.getMethod("test1", Collections.EMPTY_LIST);
+		assertNotNull(method);
+		JavaHelpers returnType = method.getReturnType();
+		
+		
+		assertEquals("java.util.Collection", returnType.getQualifiedName());
+		assertEquals("Collection", returnType.getSimpleName());
+	}
+	
+	/**
+	 * Test method test2 from Test class.
+	 * 
+	 * public void test2(Collection<? extends IFoo> aCollection) 
+	 *
+	 */
+	public void test2() {
+		JavaHelpers testHelper = reflectClass("test.me.Test");
+		JavaClass testClass = (JavaClass) testHelper;
+		assertTrue((testClass).isExistingType());
+		
+		Method method = null;
+		List methods = testClass.getMethods();
+		for (int i = 0; i < methods.size(); i++) {
+			method = (Method) methods.get(i);
+			if (method.getName().equals("test2")) {
+				break;
+			} else {
+				method = null;
+			}
+		}
+		
+		assertNotNull(method);
+		JavaHelpers returnType = method.getReturnType();
+		assertNotNull(returnType); //void
+		List params = method.getParameters();
+		assertTrue(params.size() == 1);
+		JavaParameter param = (JavaParameter) params.get(0);
+		if (isReflectingSource)
+			assertTrue(param.getName().equals("aCollection"));
+		JavaHelpers paramType = param.getJavaType();
+		assertNotNull(paramType);
+		
+		assertEquals("java.util.Collection", paramType.getQualifiedName());
+		assertEquals("Collection", paramType.getSimpleName());
+	}
+
+	/**
+	 * Test method test3 from Test class.
+	 * 
+	 * public <T extends IFoo> T test3(Class<T> aClass, String s, List<Integer> aList) 
+	 *
+	 */
+	public void test3() {
+		JavaHelpers testHelper = reflectClass("test.me.Test");
+		JavaClass testClass = (JavaClass) testHelper;
+		assertTrue((testClass).isExistingType());
+		
+		Method method = null;
+		List methods = testClass.getMethods();
+		for (int i = 0; i < methods.size(); i++) {
+			method = (Method) methods.get(i);
+			if (method.getName().equals("test3")) {
+				break;
+			} else {
+				method = null;
+			}
+		}
+		
+		assertNotNull(method);
+		
+		//Verify return type.		
+		JavaHelpers returnType = method.getReturnType();
+		assertNotNull(returnType); 
+		
+		assertEquals("test.dependents.IFoo", returnType.getQualifiedName());
+		assertEquals("IFoo", returnType.getSimpleName());
+		
+		//Verify parameters
+		List params = method.getParameters();
+		assertTrue(params.size() == 3);
+		
+		//Verify Class<T> aClass
+		JavaParameter param1 = (JavaParameter) params.get(0);
+		if (isReflectingSource)
+			assertTrue(param1.getName().equals("aClass"));
+		JavaHelpers param1Type = param1.getJavaType();
+		assertNotNull(param1Type);
+
+		assertEquals("java.lang.Class", param1Type.getQualifiedName());
+		assertEquals("Class", param1Type.getSimpleName());
+		
+		//Verify String s
+		JavaParameter param2 = (JavaParameter) params.get(1);
+		if (isReflectingSource)
+			assertEquals("s", param2.getName());
+		JavaHelpers param2Type = param2.getJavaType();
+		assertNotNull(param2Type);
+
+		//Verify List<Integer> aList
+		JavaHelpers listType = reflectClass("java.util.List");
+		JavaParameter param3 = (JavaParameter) params.get(2);
+		if (isReflectingSource)
+			assertEquals("aList", param3.getName());
+		JavaHelpers param3Type = param3.getJavaType();
+		assertNotNull(param3Type);
+		assertEquals(listType, param3Type);
+	}
+	
+	/**
+	 * Test method test4 from Test class.
+	 * 
+	 * public Map<Integer, String> test4(Integer anInteger) 
+	 *
+	 */
+	public void test4() {
+		JavaHelpers testHelper = reflectClass("test.me.Test");
+		JavaClass testClass = (JavaClass) testHelper;
+		assertTrue((testClass).isExistingType());
+		
+		Method method = null;
+		List methods = testClass.getMethods();
+		for (int i = 0; i < methods.size(); i++) {
+			method = (Method) methods.get(i);
+			if (method.getName().equals("test4")) {
+				break;
+			} else {
+				method = null;
+			}
+		}
+		
+		assertNotNull(method);
+		
+		//Verify return type.		
+		JavaHelpers returnType = method.getReturnType();
+		assertNotNull(returnType); 
+		
+		assertEquals("java.util.Map", returnType.getQualifiedName());
+		assertEquals("Map", returnType.getSimpleName());
+	}
+	
+	/**
+	 * Test method test5 from Test class.
+	 * 
+	 * public void test5(List<? super IFoo> aList)
+	 *
+	 */
+	public void test5() {
+		JavaHelpers testHelper = reflectClass("test.me.Test");
+		JavaClass testClass = (JavaClass) testHelper;
+		assertTrue((testClass).isExistingType());
+		
+		Method method = null;
+		List methods = testClass.getMethods();
+		for (int i = 0; i < methods.size(); i++) {
+			method = (Method) methods.get(i);
+			if (method.getName().equals("test5")) {
+				break;
+			} else {
+				method = null;
+			}
+		}
+		
+		assertNotNull(method);
+		
+		//Verify parameters
+		List params = method.getParameters();
+		assertTrue(params.size() == 1);
+		
+		JavaParameter param1 = (JavaParameter) params.get(0);
+		if (isReflectingSource)
+			assertTrue(param1.getName().equals("aList"));
+		JavaHelpers param1Type = param1.getJavaType();
+		assertNotNull(param1Type);
+		
+		assertEquals("java.util.List", param1Type.getQualifiedName());
+		assertEquals("List", param1Type.getSimpleName());
+	}
+
+	/**
+	 * Test method test6 from Test class.
+	 * 
+	 * public <T> void test6(Class<T>[] aClassArray, List<String>[] anArrayOfListsOfString, Class<?>[] aWildcardClassArray, Class<?>[][][] aMultiDimWildcardArray)
+	 *
+	 */
+	public void test6() {
+		JavaHelpers testHelper = reflectClass("test.me.Test");
+		JavaClass testClass = (JavaClass) testHelper;
+		assertTrue((testClass).isExistingType());
+		
+		Method method = null;
+		List methods = testClass.getMethods();
+		for (int i = 0; i < methods.size(); i++) {
+			method = (Method) methods.get(i);
+			if (method.getName().equals("test6")) {
+				break;
+			} else {
+				method = null;
+			}
+		}
+		
+		assertNotNull(method);
+		
+		//Verify parameters
+		List params = method.getParameters();
+		assertEquals(4, params.size());
+		
+		// Verify Class<T>[] aClassArray
+		JavaParameter param1 = (JavaParameter) params.get(0);
+		if (isReflectingSource)
+			assertTrue(param1.getName().equals("aClassArray"));
+		JavaHelpers param1Type = param1.getJavaType();
+		assertNotNull(param1Type);
+		assertTrue(((ArrayType)param1Type).getArrayDimensions() == 1);
+		assertEquals("java.lang.Class[]", param1Type.getQualifiedName());
+		assertEquals("Class[]", param1Type.getSimpleName());
+		assertEquals("java.lang.Class", ((ArrayType)param1Type).getComponentTypeAsHelper().getQualifiedName());
+		assertEquals("Class", ((ArrayType)param1Type).getComponentTypeAsHelper().getSimpleName());
+
+		// Verify List<String>[] anArrayOfListsOfString
+		JavaParameter param2 = (JavaParameter) params.get(1);
+		if (isReflectingSource)
+			assertTrue(param2.getName().equals("anArrayOfListsOfString"));
+		JavaHelpers param2Type = param2.getJavaType();
+		assertNotNull(param2Type);
+		assertTrue(((ArrayType)param2Type).getArrayDimensions() == 1);
+		assertEquals("java.util.List[]", param2Type.getQualifiedName());
+		assertEquals("List[]", param2Type.getSimpleName());
+		assertEquals("java.util.List", ((ArrayType)param2Type).getComponentTypeAsHelper().getQualifiedName());
+		assertEquals("List", ((ArrayType)param2Type).getComponentTypeAsHelper().getSimpleName());
+		
+		// Verify Class<?>[] aWildcardClassArray
+		JavaParameter param3 = (JavaParameter) params.get(2);
+		if (isReflectingSource)
+			assertTrue(param3.getName().equals("aWildcardClassArray"));
+		JavaHelpers param3Type = param3.getJavaType();
+		assertNotNull(param3Type);
+		assertTrue(((ArrayType)param3Type).getArrayDimensions() == 1);
+		assertEquals("java.lang.Class[]", param3Type.getQualifiedName());
+		assertEquals("Class[]", param3Type.getSimpleName());
+		assertEquals("java.lang.Class", ((ArrayType)param3Type).getComponentTypeAsHelper().getQualifiedName());
+		assertEquals("Class", ((ArrayType)param3Type).getComponentTypeAsHelper().getSimpleName());
+
+		// Verify Class<?>[][][] aMultiDimWildcardArray
+		JavaParameter param4 = (JavaParameter) params.get(3);
+		if (isReflectingSource)
+			assertTrue(param4.getName().equals("aMultiDimWildcardArray"));
+		JavaHelpers param4Type = param4.getJavaType();
+		assertNotNull(param4Type);
+		assertTrue(((ArrayType)param4Type).getArrayDimensions() == 3);
+		assertEquals("java.lang.Class[][][]", param4Type.getQualifiedName());
+		assertEquals("Class[][][]", param4Type.getSimpleName());
+		JavaHelpers componentType = ((ArrayType)param4Type).getComponentTypeAsHelper();
+		assertEquals("java.lang.Class[][]", componentType.getQualifiedName());
+		assertEquals("Class[][]", componentType.getSimpleName());
+		componentType = ((ArrayType) componentType).getComponentTypeAsHelper();
+		assertEquals("java.lang.Class[]", componentType.getQualifiedName());
+		assertEquals("Class[]", componentType.getSimpleName());
+		componentType = ((ArrayType) componentType).getComponentTypeAsHelper();
+		
+	}	
+
+	/**
+	 * Test method test7 from Test class.
+	 * 
+	 * public <T> void test7(List<List<String>> aListOfListOfString, List<List<T>> aListOfListOfT, Map<IFoo, List<Map<IBar, T>>> aMap)
+	 *
+	 */
+	public void test7() {
+		JavaHelpers testHelper = reflectClass("test.me.Test");
+		JavaClass testClass = (JavaClass) testHelper;
+		assertTrue((testClass).isExistingType());
+		
+		Method method = null;
+		List methods = testClass.getMethods();
+		for (int i = 0; i < methods.size(); i++) {
+			method = (Method) methods.get(i);
+			if (method.getName().equals("test7")) {
+				break;
+			} else {
+				method = null;
+			}
+		}
+		
+		assertNotNull(method);
+		
+		//Verify parameters
+		List params = method.getParameters();
+		assertTrue(params.size() == 3);
+
+		
+		// Verify List<List<String>> aListOfListOfString
+		JavaParameter param1 = (JavaParameter) params.get(0);
+		if (isReflectingSource)
+			assertTrue(param1.getName().equals("aListOfListOfString"));
+		JavaHelpers param1Type = param1.getJavaType();
+		assertNotNull(param1Type);
+		assertEquals("java.util.List", param1Type.getQualifiedName());
+		assertEquals("List", param1Type.getSimpleName());
+
+		// Verify List<List<T>> aListOfListOfT
+		JavaParameter param2 = (JavaParameter) params.get(1);
+		if (isReflectingSource)
+			assertTrue(param2.getName().equals("aListOfListOfT"));
+		JavaHelpers param2Type = param2.getJavaType();
+		assertNotNull(param2Type);
+		assertEquals("java.util.List", param2Type.getQualifiedName());
+		assertEquals("List", param2Type.getSimpleName());
+
+		// Verify Map<IFoo, List<Map<IBar, T>>> aMap
+		JavaParameter param3 = (JavaParameter) params.get(2);
+		if (isReflectingSource)
+			assertTrue(param3.getName().equals("aMap"));
+		JavaHelpers param3Type = param3.getJavaType();
+		assertNotNull(param3Type);
+		assertEquals("java.util.Map", param3Type.getQualifiedName());
+		assertEquals("Map", param3Type.getSimpleName());
+		
+	}
+	
+	/**
+	 * Test method test8 from Test class.
+	 * 
+	 * public void test8(List<? extends List<String>> aList)
+	 *
+	 */
+	public void test8() {
+		JavaHelpers testHelper = reflectClass("test.me.Test");
+		JavaClass testClass = (JavaClass) testHelper;
+		assertTrue((testClass).isExistingType());
+		
+		Method method = null;
+		List methods = testClass.getMethods();
+		for (int i = 0; i < methods.size(); i++) {
+			method = (Method) methods.get(i);
+			if (method.getName().equals("test8")) {
+				break;
+			} else {
+				method = null;
+			}
+		}
+		
+		assertNotNull(method);
+		
+		//Verify parameters
+		List params = method.getParameters();
+		assertTrue(params.size() == 1);
+		
+		// Verify List<? extends List<String>> aList
+		JavaParameter param1 = (JavaParameter) params.get(0);
+		if (isReflectingSource)
+			assertTrue(param1.getName().equals("aList"));
+		JavaHelpers param1Type = param1.getJavaType();
+		assertNotNull(param1Type);
+		
+		assertEquals("java.util.List", param1Type.getQualifiedName());
+		assertEquals("List", param1Type.getSimpleName());
+		
+	}
+	
+	/**
+	 * Test method test9 from Test class.
+	 * This is the same test as test7 but with qualified names.
+	 * 
+	 * public <T> void test9(java.util.List<java.util.List<java.lang.String>> aListOfListOfString, java.util.List<java.util.List<T>> aListOfListOfT, java.util.Map<test.dependents.IFoo, java.util.List<java.util.Map<test.dependents.IBar, T>>> aMap)
+	 *
+	 */
+	public void test9() {
+		JavaHelpers testHelper = reflectClass("test.me.Test");
+		JavaClass testClass = (JavaClass) testHelper;
+		assertTrue((testClass).isExistingType());
+		
+		Method method = null;
+		List methods = testClass.getMethods();
+		for (int i = 0; i < methods.size(); i++) {
+			method = (Method) methods.get(i);
+			if (method.getName().equals("test9")) {
+				break;
+			} else {
+				method = null;
+			}
+		}
+		
+		assertNotNull(method);
+		
+		//Verify parameters
+		List params = method.getParameters();
+		assertTrue(params.size() == 3);
+	
+		
+		// Verify List<List<String>> aListOfListOfString
+		JavaParameter param1 = (JavaParameter) params.get(0);
+		if (isReflectingSource)
+			assertTrue(param1.getName().equals("aListOfListOfString"));
+		JavaHelpers param1Type = param1.getJavaType();
+		assertNotNull(param1Type);
+		assertEquals("java.util.List", param1Type.getQualifiedName());
+		assertEquals("List", param1Type.getSimpleName());
+	
+		// Verify List<List<T>> aListOfListOfT
+		JavaParameter param2 = (JavaParameter) params.get(1);
+		if (isReflectingSource)
+			assertTrue(param2.getName().equals("aListOfListOfT"));
+		JavaHelpers param2Type = param2.getJavaType();
+		assertNotNull(param2Type);
+
+		assertEquals("java.util.List", param2Type.getQualifiedName());
+		assertEquals("List", param2Type.getSimpleName());
+	
+		// Verify Map<IFoo, List<Map<IBar, T>>> aMap
+		JavaParameter param3 = (JavaParameter) params.get(2);
+		if (isReflectingSource)
+			assertTrue(param3.getName().equals("aMap"));
+		JavaHelpers param3Type = param3.getJavaType();
+		assertNotNull(param3Type);
+		
+		assertEquals("java.util.Map", param3Type.getQualifiedName());
+		assertEquals("Map", param3Type.getSimpleName());
+	}
+	
+	/**
+	 * Test method test10 from Test class.
+	 * 
+	 * public <T extends Tester> T test10(List<Integer> list)
+	 *
+	 */
+	public void test10() {
+		JavaHelpers testHelper = reflectClass("test.me.Test");
+		JavaClass testClass = (JavaClass) testHelper;
+		assertTrue((testClass).isExistingType());
+		
+		Method method = null;
+		List methods = testClass.getMethods();
+		for (int i = 0; i < methods.size(); i++) {
+			method = (Method) methods.get(i);
+			if (method.getName().equals("test10")) {
+				break;
+			} else {
+				method = null;
+			}
+		}
+		
+		assertNotNull(method);
+		
+		JavaHelpers returnType = method.getReturnType();
+		
+		assertEquals("test.dependents.Tester", returnType.getQualifiedName());
+		assertEquals("Tester", returnType.getSimpleName());
+		
+		//Verify parameters
+		List params = method.getParameters();
+		assertTrue(params.size() == 1);
+	
+		
+		// Verify List<List<String>> aListOfListOfString
+		JavaParameter param1 = (JavaParameter) params.get(0);
+		if (isReflectingSource)
+			assertTrue(param1.getName().equals("list"));
+		JavaHelpers param1Type = param1.getJavaType();
+		assertNotNull(param1Type);
+		assertEquals("java.util.List", param1Type.getQualifiedName());
+		assertEquals("List", param1Type.getSimpleName());
+	}
+	
+	/**
+	 * Test method test11 from Test class.
+	 * 
+	 * public <T extends Tester> T[] test11()
+	 *
+	 */
+	public void test11() {
+		JavaHelpers testHelper = reflectClass("test.me.Test");
+		JavaClass testClass = (JavaClass) testHelper;
+		assertTrue((testClass).isExistingType());
+		
+		Method method = null;
+		List methods = testClass.getMethods();
+		for (int i = 0; i < methods.size(); i++) {
+			method = (Method) methods.get(i);
+			if (method.getName().equals("test11")) {
+				break;
+			} else {
+				method = null;
+			}
+		}
+		//TODO need to revisit
+//		assertNotNull(method);
+//		
+//		JavaHelpers returnType = method.getReturnType();
+//		
+//		assertEquals("test.dependents.Tester[]", returnType.getQualifiedName());
+//		assertEquals("Tester[]", returnType.getSimpleName());
+	}
+
+	/**
+	 * Test method test11 from Test class.
+	 * 
+	 * public <T extends Tester> T[][][] test11()
+	 *
+	 */
+	public void test12() {
+		JavaHelpers testHelper = reflectClass("test.me.Test");
+		JavaClass testClass = (JavaClass) testHelper;
+		assertTrue((testClass).isExistingType());
+		
+		Method method = null;
+		List methods = testClass.getMethods();
+		for (int i = 0; i < methods.size(); i++) {
+			method = (Method) methods.get(i);
+			if (method.getName().equals("test12")) {
+				break;
+			} else {
+				method = null;
+			}
+		}
+		//TODO need to revisit
+//		assertNotNull(method);
+//		
+//		JavaHelpers returnType = method.getReturnType();
+//		
+//		assertEquals("test.dependents.Tester[][][]", returnType.getQualifiedName());
+//		assertEquals("Tester[][][]", returnType.getSimpleName());
+	}
+	/**
+	 * Test method test13 from Test class.
+	 * 
+	 * public void test13(Y param) (where Y is a class-level type parameter
+	 *
+	 */
+	public void test13() {
+		JavaHelpers testHelper = reflectClass("test.me.Test");
+		JavaClass testClass = (JavaClass) testHelper;
+		assertTrue((testClass).isExistingType());
+		
+		Method method = null;
+		List methods = testClass.getMethods();
+		for (int i = 0; i < methods.size(); i++) {
+			method = (Method) methods.get(i);
+			if (method.getName().equals("test13")) {
+				break;
+			} else {
+				method = null;
+			}
+		}
+		assertNotNull(method);
+		
+		//Verify parameters
+		List params = method.getParameters();
+		assertTrue(params.size() == 1);
+	
+		
+		// Verify Y param
+		JavaParameter param1 = (JavaParameter) params.get(0);
+		if (isReflectingSource)
+			assertTrue(param1.getName().equals("param"));
+		JavaHelpers param1Type = param1.getJavaType();
+		assertNotNull(param1Type);
+		assertEquals("java.io.Serializable", param1Type.getQualifiedName());
+		assertEquals("Serializable", param1Type.getSimpleName());
+	}
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/JavaProjectUtil.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/JavaProjectUtil.java
new file mode 100644
index 0000000..d7e041b
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/JavaProjectUtil.java
@@ -0,0 +1,259 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jem.tests;
+/*
+ *  $RCSfile: JavaProjectUtil.java,v $
+ *  $Revision: 1.16 $  $Date: 2007/04/01 03:28:18 $ 
+ */
+
+
+import java.io.File;
+import java.io.IOException;
+import java.net.MalformedURLException;
+
+import org.eclipse.ant.core.AntRunner;
+import org.eclipse.core.resources.*;
+import org.eclipse.core.runtime.*;
+import org.eclipse.core.runtime.jobs.IJobManager;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jdt.core.*;
+import org.osgi.framework.Bundle;
+
+import org.eclipse.jem.internal.proxy.core.ProxyPlugin;
+
+/**
+ * The purpose of this class is to be a utility for manipulating/populating java projects.
+ *  1) Get a java project as one of the resources.
+ *  2) Create a project from a directory. The directory needs to be all set up to be a project already. Typically
+ *     from an unzip.
+ */
+
+public class JavaProjectUtil {	
+	public static IProject getProject(String projectName) throws CoreException {
+		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
+		return (project.exists()) ? project: null;
+	}
+	
+	
+	/**
+	 * Create a project from the path. The path will be a complete project, including a .project file.
+	 * 
+	 * @param workspace
+	 * @param projectPath Needs to be a complete path to a directory within the file system. The directory must be a complete project including .project file.
+	 * @param pm
+	 * @return The new IProject.
+	 * @throws CoreException
+	 */
+	public static IProject createProject(IWorkspace workspace, IPath projectPath, final IProgressMonitor pm) throws CoreException {
+		IProjectDescription newDescription = null;
+		
+		File projectFile = new File(projectPath.toFile(), IProjectDescription.DESCRIPTION_FILE_NAME);
+		if (!projectFile.exists())
+			throw new CoreException(new Status(IStatus.ERROR, JavaTestsPlugin.getPlugin().getBundle().getSymbolicName(), 0, "Project file not in project directory. Couldn't create project \""+projectPath.toString()+"\"", null));
+
+
+		IPath projectFilePath = new Path(projectFile.getPath());
+		newDescription = workspace.loadProjectDescription(projectFilePath);
+		
+		// create the new project operation
+		final IProject project = workspace.getRoot().getProject(newDescription.getName());		
+		final IProjectDescription description = newDescription;
+		ResourcesPlugin.getWorkspace().run(new IWorkspaceRunnable() {		
+			public void run(IProgressMonitor monitor) throws CoreException {
+				project.create(description, new SubProgressMonitor(monitor, 1000));
+				project.open(new SubProgressMonitor(monitor, 1000));				
+			}
+		}, project, 0, pm);
+		
+		return project;
+	}
+
+	/**
+	 * Create an empty project in the workspace root. If there is a .project file already there, then use it.
+	 * @param workspace The workspace to create projec in.
+	 * @param projectPath The name of the project. It should only be one segment long, and that will be the name of the project.
+	 * @param pm
+	 * @return The project.
+	 * @throws CoreException
+	 * 
+	 * @since 1.0.0
+	 */
+	public static IProject createEmptyJavaProject(IWorkspace workspace, IPath projectPath, final IProgressMonitor pm) throws CoreException {
+		projectPath = workspace.getRoot().getFullPath().append(projectPath);	// Put it into the workspace relative.
+		File projectFile = new File(projectPath.toFile(), IProjectDescription.DESCRIPTION_FILE_NAME);
+		if (projectFile.exists())
+			return createProject(workspace, projectPath, pm);	// Let it be created normally.
+
+		// create the new project operation
+		final IProject project = workspace.getRoot().getProject(projectPath.lastSegment());		
+		ResourcesPlugin.getWorkspace().run(new IWorkspaceRunnable() {		
+			public void run(IProgressMonitor monitor) throws CoreException {
+				project.create(new SubProgressMonitor(monitor, 1000));
+				project.open(new SubProgressMonitor(monitor, 1000));
+				IProjectDescription description = project.getDescription();
+				String[] natureids = description.getNatureIds();
+				for (int i = 0; i < natureids.length; i++) {
+					if (natureids[i].equals("org.eclipse.jdt.core.javanature"))
+						return;	// Already has nature.
+				}
+				String[] newNatureids = new String[natureids.length+1];
+				newNatureids[0] = "org.eclipse.jdt.core.javanature";
+				System.arraycopy(natureids, 0, newNatureids, 1, natureids.length);
+				description.setNatureIds(newNatureids);
+				project.setDescription(description, new SubProgressMonitor(monitor, 1000));
+				// Need to put out a classfile too. We need a src and a bin directory for the classpath.
+				IFolder sf = project.getFolder("src");
+				sf.create(true, true, new SubProgressMonitor(monitor, 1000));
+				IFolder bf = project.getFolder("bin");
+				bf.create(true, true, new SubProgressMonitor(monitor, 1000));
+				IFile cp = project.getFile(".classpath"); 
+				try {
+					cp.create(getClass().getResource(".classpath").openStream(), true, new SubProgressMonitor(monitor, 1000));
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+		}, workspace.getRoot(), 0, pm);
+		
+		return project;
+	}
+	
+	/**
+	 * Delete a project and all files from the project.
+	 * @param project
+	 * @throws CoreException
+	 */
+	public static void deleteProject(IProject project) throws CoreException {
+		if (project != null) {
+			project.delete(true, false, null); // Get rid of the project and the files themselves.
+		}
+	}
+	
+
+	/**
+	 * This sets the workspace autobuild to the specified state. It returns what
+	 * the state was previously so that it can be later restored.
+	 * @param autoBuild
+	 * @return Previous autoBuild state.
+	 * @throws CoreException
+	 */
+	public static boolean setAutoBuild(boolean autoBuild) throws CoreException {
+		IWorkspace workspace = ResourcesPlugin.getWorkspace();
+		if (autoBuild != workspace.isAutoBuilding()) {
+			IWorkspaceDescription description = workspace.getDescription();
+			description.setAutoBuilding(true);
+			workspace.setDescription(description);
+			return !autoBuild;	// It wasn't this state.			
+		} else
+			return autoBuild;	// It already is this state. 		
+	}
+	
+	/**
+	 * Import the given projects from the given zipfiles into the current workspace root.
+	 * @param projectNames The array of project names to create
+	 * @param zipFiles The zipfiles containing each project. It must be a complete project. 
+	 *                 The first directory in the zip must be the project directory. 
+	 *                 It must be the same name as from projectNames. Also it must include a .project file
+	 *                 in that directory.
+	 * @return The array of IProjects that were created.
+	 * @throws CoreException
+	 */
+	public static IProject[] importProjects(final String[] projectNames, final String[] zipFiles) throws CoreException {
+		// Delete/create/populate within a runnable so that the build is done only after all changes have been made.
+		// Make sure autobuild is on.
+		final IWorkspace workspace = ResourcesPlugin.getWorkspace();
+		final IProject[] result = new IProject[projectNames.length];
+		workspace.run(new IWorkspaceRunnable() {
+			public void run(IProgressMonitor monitor) throws CoreException {
+				// First import all, then after that, create the projects.
+				IPath rootLocation = workspace.getRoot().getLocation();
+				try {
+					String antFile = FileLocator.toFileURL(JavaTestsPlugin.getPlugin().getBundle().getEntry("testdata/unzip.xml")).getFile();
+					for (int i = 0; i < zipFiles.length; i++) {
+						// First create/recreate the project.
+						IProject p = getProject(projectNames[i]);
+						if (p != null)
+							p.delete(true, true, new SubProgressMonitor(monitor, 50)); // Get rid of it, we want a clean one for testing.
+					
+						// Now import the requested files.
+						AntRunner ant = new AntRunner();
+						ant.setBuildFileLocation(antFile);
+						ant.setArguments(new String[] { "-Dzipfrom=" + zipFiles[i], "-Dzipto=" + rootLocation.toString()});
+						ant.run(new SubProgressMonitor(monitor, 50));
+					}
+					for (int i = 0; i < zipFiles.length; i++) {
+						result[i] = createProject(workspace, rootLocation.append(projectNames[i]), new SubProgressMonitor(monitor, 50));
+					}
+				} catch (MalformedURLException e) {
+				} catch (IOException e) {
+				}
+			}
+		}, workspace.getRoot(), 0, null);
+		
+		return result;
+	}
+
+	static int cfSuffix = 0;
+	/**
+	 * Add a path to plugin jar to the java project's class path.
+	 * @param bundle The plugin where the jar is located.
+	 * @param pathToJar Path to the jar within the above plugin
+	 * @param project java project to add to.
+	 * 
+	 * @since 1.0.0
+	 */
+	public static void addBundleJarToPath(Bundle bundle, String pathToJar, final IJavaProject project, IProgressMonitor pm) throws CoreException {
+		final IPath actualPath = new Path(ProxyPlugin.getPlugin().localizeFromBundleAndFragments(bundle, pathToJar));
+		if (actualPath.isEmpty())
+			return;	// Didn't exist.
+		
+		final IWorkspace workspace = ResourcesPlugin.getWorkspace();
+		workspace.run(new IWorkspaceRunnable() {
+			public void run(IProgressMonitor monitor) throws CoreException {		
+				if (actualPath.toFile().isFile()) {
+					// It is a jar, this will be during runtime
+					// Create an external jar entry.
+					IClasspathEntry[] raw = project.getRawClasspath();
+					IClasspathEntry[] newRaw = new IClasspathEntry[raw.length+1];
+					newRaw[raw.length] = JavaCore.newLibraryEntry(actualPath, null, null);
+					System.arraycopy(raw, 0, newRaw, 0, raw.length);
+					project.setRawClasspath(newRaw, new SubProgressMonitor(monitor, 100));
+				} else {
+					// It is a path to class folder, this will be during development time.
+					// But classfolders MUST exist in the workspace. JDT doesn't understand them outside workspace,
+					// so we will link it into the project.
+					IFolder cf = project.getProject().getFolder("linkbin"+(++cfSuffix));
+					cf.createLink(actualPath, 0, new SubProgressMonitor(monitor, 100));
+					// Create class folder entry.
+					IClasspathEntry[] raw = project.getRawClasspath();
+					IClasspathEntry[] newRaw = new IClasspathEntry[raw.length+1];
+					newRaw[raw.length] = JavaCore.newLibraryEntry(cf.getFullPath(), null, null);
+					System.arraycopy(raw, 0, newRaw, 0, raw.length);
+					project.setRawClasspath(newRaw, new SubProgressMonitor(monitor, 100));
+				}
+			}
+		}, workspace.getRoot(), 0, pm);
+	}
+	
+	public static void waitForAutoBuild() throws CoreException {
+		IJobManager jobManager = Job.getJobManager();
+		if (jobManager.find(ResourcesPlugin.FAMILY_AUTO_BUILD).length > 0) {
+			while (true) {
+				try {
+					jobManager.join(ResourcesPlugin.FAMILY_AUTO_BUILD, new NullProgressMonitor());
+					break;
+				} catch (InterruptedException e) {
+				}
+			}
+		}
+
+	}
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/JavaTestsPlugin.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/JavaTestsPlugin.java
new file mode 100644
index 0000000..7ad62ae
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/JavaTestsPlugin.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jem.tests;
+/*
+ *  $RCSfile: JavaTestsPlugin.java,v $
+ *  $Revision: 1.6 $  $Date: 2005/08/24 20:58:54 $ 
+ */
+import org.eclipse.core.runtime.Plugin;
+
+/**
+ * @author richkulp
+ *
+ * To change the template for this generated type comment go to
+ * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
+ */
+public class JavaTestsPlugin extends Plugin {
+
+	private static JavaTestsPlugin PLUGIN;
+	/**
+	 * @param descriptor
+	 */
+	public JavaTestsPlugin() {
+		PLUGIN = this;
+	}
+	
+	public static JavaTestsPlugin getPlugin() {
+		return PLUGIN;
+	}
+
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/UITester.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/UITester.java
new file mode 100644
index 0000000..818a765
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/UITester.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jem.tests;
+
+/**
+ * This is used to make the JEM tests run in UI mode instead of HEADLESS mode,
+ * even though a UI is not available. The tests will normally need that mode.
+ */
+public class UITester implements org.eclipse.jem.util.UITester {
+
+	/* (non-Javadoc)
+	 * @see com.ibm.wtp.common.UITester#isCurrentContextUI()
+	 */
+	public boolean isCurrentContextUI() {
+		return true;
+	}
+
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/basic/BasicSuite.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/basic/BasicSuite.java
new file mode 100644
index 0000000..c64ffb8
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/basic/BasicSuite.java
@@ -0,0 +1,94 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $RCSfile: BasicSuite.java,v $
+ *  $Revision: 1.3 $  $Date: 2006/05/17 20:13:56 $ 
+ */
+package org.eclipse.jem.tests.basic;
+
+import java.net.URL;
+
+import junit.extensions.TestSetup;
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.core.resources.*;
+import org.eclipse.core.runtime.*;
+
+import org.eclipse.jem.tests.JavaProjectUtil;
+import org.eclipse.jem.tests.JavaTestsPlugin;
+
+/**
+ * This is basic JEM testing not covered by specific components tests.
+ * 
+ * @author richkulp
+ *
+ */
+public class BasicSuite extends TestSetup {
+
+	// Test cases to be include in the suite
+	private static final Class testsList[] = { TestWorkbenchUtils112678.class};
+
+	/**
+	 * 
+	 */
+	public BasicSuite() {
+		this("Test Basic JEM Suite");
+	}
+
+	/**
+	 * @param name
+	 */
+	public BasicSuite(String name) {
+		super(new TestSuite(name) {
+			{
+				for (int i = 0; i < testsList.length; i++) {
+					addTestSuite(testsList[i]);
+				}
+
+			}
+		});
+	}
+
+	public static Test suite() {
+		return new BasicSuite();
+	}
+
+	public static final String TEST_BASIC_PROJECT = "Test Basic";	//$NON-NLS-1$
+	
+	private boolean oldAutoBuildingState; // autoBuilding state before we started.	
+	protected void setUp() throws Exception {
+		System.out.println("-- Initializing the Basic test data --"); //$NON-NLS-1$
+		oldAutoBuildingState = JavaProjectUtil.setAutoBuild(true);
+		URL installURL = JavaTestsPlugin.getPlugin().getBundle().getEntry("/");
+		String[] zipPaths = new String[1];
+		zipPaths[0] = FileLocator.toFileURL(new URL(installURL, "testdata/testbasic.zip")).getFile();
+		IProject[] projects =
+			JavaProjectUtil.importProjects(
+				new String[] { TEST_BASIC_PROJECT },
+				zipPaths);
+		assertNotNull(projects[0]);
+		JavaProjectUtil.waitForAutoBuild();
+		System.out.println("-- Data initialized --"); //$NON-NLS-1$
+
+	}
+
+	protected void tearDown() throws Exception {
+		ResourcesPlugin.getWorkspace().run(new IWorkspaceRunnable() {
+			public void run(IProgressMonitor monitor) throws CoreException {
+				JavaProjectUtil.deleteProject(JavaProjectUtil.getProject(TEST_BASIC_PROJECT));
+			}
+		}, ResourcesPlugin.getWorkspace().getRoot(), 0, null);
+
+		JavaProjectUtil.setAutoBuild(oldAutoBuildingState);
+	}
+
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/basic/TestWorkbenchUtils112678.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/basic/TestWorkbenchUtils112678.java
new file mode 100644
index 0000000..c031d3d
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/basic/TestWorkbenchUtils112678.java
@@ -0,0 +1,166 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.jem.tests.basic;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.common.util.WrappedException;
+import org.eclipse.emf.ecore.resource.Resource;
+
+import org.eclipse.jem.util.emf.workbench.WorkbenchResourceHelperBase;
+ 
+
+/**
+ * Test bug:  https://bugs.eclipse.org/bugs/show_bug.cgi?id=112678
+ * @since 1.2.0
+ */
+public class TestWorkbenchUtils112678 extends TestCase {
+
+	/**
+	 * 
+	 * 
+	 * @since 1.2.0
+	 */
+	public TestWorkbenchUtils112678() {
+		super();
+	}
+
+	/**
+	 * @param name
+	 * 
+	 * @since 1.2.0
+	 */
+	public TestWorkbenchUtils112678(String name) {
+		super(name);
+	}
+	
+	public static final String FILE_RESOURCE_PATH = "Test Basic/workbenchUtil/FileResource.xmi";
+	public static final String NOT_FOUND_FILE_RESOURCE_PATH = "Test Basic/workbenchUtil/NoFileResource.xmi";
+	
+	/**
+	 * Test {@link WorkbenchResourceHelperBase#getIFile(URI)} with platform resource uri.
+	 * 
+	 * 
+	 * @since 1.2.0
+	 */
+	public void testGetIFilePlatformResource() {
+		URI uri = URI.createPlatformResourceURI(FILE_RESOURCE_PATH);
+		IFile file = WorkbenchResourceHelperBase.getIFile(uri);
+		assertNotNull(file);
+		assertTrue(file.exists());
+
+		uri = URI.createPlatformResourceURI(NOT_FOUND_FILE_RESOURCE_PATH);
+		file = WorkbenchResourceHelperBase.getIFile(uri);
+		assertNotNull(file);
+		assertFalse(file.exists());
+		
+		// Test a relative form that is not a valid project.
+		uri = URI.createPlatformResourceURI("NotProject/file.xmi"); 	
+		file = WorkbenchResourceHelperBase.getIFile(uri);
+		assertNull(file);		
+	}
+	
+	/**
+	 * Test {@link WorkbenchResourceHelperBase#getIFile(URI)} with a relative uri (e.g. "project/file").
+	 * 
+	 * 
+	 * @since 1.2.0
+	 */
+	public void testGetIFileProjectRelativeResource() {
+		URI uri = URI.createURI(FILE_RESOURCE_PATH);
+		IFile file = WorkbenchResourceHelperBase.getIFile(uri);
+		assertNotNull(file);
+		assertTrue(file.exists());
+
+		uri = URI.createURI(NOT_FOUND_FILE_RESOURCE_PATH);
+		file = WorkbenchResourceHelperBase.getIFile(uri);
+		assertNotNull(file);
+		assertFalse(file.exists());
+		
+		// Test a relative form that is not a valid project.
+		uri = URI.createURI("NotProject/file.xmi"); 	
+		file = WorkbenchResourceHelperBase.getIFile(uri);
+		assertNull(file);
+		
+	}
+	
+	/**
+	 * Test {@link WorkbenchResourceHelperBase#getIFile(URI)} with a non-platform resource uri.
+	 * 
+	 * 
+	 * @since 1.2.0
+	 */
+	public void testGetIFileNotPlatformResource() {
+		URI uri = URI.createURI("platform:/plugin/xyz/abc");
+		IFile file = WorkbenchResourceHelperBase.getIFile(uri);
+		assertNull(file);
+	}
+	
+	/**
+	 * Test {@link WorkbenchResourceHelperBase#getResource(URI)} with a platform resource uri.
+	 * 
+	 * 
+	 * @since 1.2.0
+	 */
+	public void testGetResourcePlatformResource() {
+		URI uri = URI.createPlatformResourceURI(FILE_RESOURCE_PATH);
+		Resource res = WorkbenchResourceHelperBase.getResource(uri);
+		assertNotNull(res);
+		assertTrue(res.isLoaded());
+		
+		uri = URI.createPlatformResourceURI(NOT_FOUND_FILE_RESOURCE_PATH);
+		boolean good = false;
+		try {
+			res = WorkbenchResourceHelperBase.getResource(uri);
+		} catch (WrappedException e) {
+			good = true;
+		}
+		assertTrue(good);
+
+		// Test a relative form that is not a valid project.
+		uri = URI.createPlatformResourceURI("NotProject/file.xmi"); 	
+		res = WorkbenchResourceHelperBase.getResource(uri);
+		assertNull(res);
+	}
+	
+	/**
+	 * Test {@link WorkbenchResourceHelperBase#getResource(URI)} with a relative uri (e.g. "project/file").
+	 * 
+	 * 
+	 * @since 1.2.0
+	 */
+	public void testGetResourceProjectRelativeResource() {
+		URI uri = URI.createURI(FILE_RESOURCE_PATH);
+		Resource res = WorkbenchResourceHelperBase.getResource(uri);
+		assertNotNull(res);
+		assertTrue(res.isLoaded());
+
+/*
+		boolean good = false;
+		uri = URI.createURI(NOT_FOUND_FILE_RESOURCE_PATH);
+		try {
+			res = WorkbenchResourceHelperBase.getResource(uri);
+		} catch (WrappedException e) {
+			good = true;
+		}
+
+		assertTrue(good);
+
+		// Test a relative form that is not a valid project.
+		uri = URI.createURI("NotProject/file.xmi"); 	
+		res = WorkbenchResourceHelperBase.getResource(uri);
+		assertNull(res);
+*/
+	}
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/beaninfo/AbstractBeanInfoTestCase.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/beaninfo/AbstractBeanInfoTestCase.java
new file mode 100644
index 0000000..4f4d28c
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/beaninfo/AbstractBeanInfoTestCase.java
@@ -0,0 +1,99 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jem.tests.beaninfo;
+/*
+ *  $RCSfile: AbstractBeanInfoTestCase.java,v $
+ *  $Revision: 1.10 $  $Date: 2005/08/24 20:58:54 $ 
+ */
+import java.util.*;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+
+import org.eclipse.jem.internal.beaninfo.ImplicitItem;
+import org.eclipse.jem.internal.beaninfo.PropertyDecorator;
+import org.eclipse.jem.internal.beaninfo.adapters.BeaninfoNature;
+import org.eclipse.jem.internal.beaninfo.core.Utilities;
+import org.eclipse.jem.internal.proxy.core.*;
+import org.eclipse.jem.java.JavaClass;
+import org.eclipse.jem.tests.JavaProjectUtil;
+
+/**
+ * @author richkulp
+ *
+ */
+public abstract class AbstractBeanInfoTestCase extends TestCase {
+
+	public AbstractBeanInfoTestCase() {
+		super();
+	}
+
+	public AbstractBeanInfoTestCase(String name) {
+		super(name);
+	}
+	
+	protected BeaninfoNature nature;
+	protected ResourceSet rset;
+
+	public static final String 
+		TEST_BEANINFO_PROJECT = "Test BeanInfo",	//$NON-NLS-1$
+		TEST_BEANINFO_BEANINFOS_PROJECT = "Test BeanInfo BeanInfos", //$NON-NLS-1$
+		TEST_BEANINFO_PREREQ_PROJECT = "Test BeanInfo Prereq"; //$NON-NLS-1$
+
+	/* (non-Javadoc)
+	 * @see junit.framework.TestCase#setUp()
+	 */
+	protected void setUp() throws Exception {
+		super.setUp();
+		IProject biProject = JavaProjectUtil.getProject(TEST_BEANINFO_PROJECT);
+		assertNotNull(biProject); 
+		nature = BeaninfoNature.getRuntime(biProject);
+		assertNotNull(nature);
+		rset = nature.getResourceSet();
+		assertNotNull(rset);
+		// We also want to remove any beaninfos from the search path that aren't from testing so that we don't get any weird side-effects.
+		ProxyFactoryRegistry registry = nature.getRegistry();
+		IArrayBeanProxy sp = Utilities.getBeanInfoSearchPath(registry);
+		// remove any that don't start with org.eclipse.jem.tests.
+		int len = sp.getLength();
+		for (int i = 0; i < len; i++) {
+			String path = ((IStringBeanProxy) sp.get(i)).stringValue();
+			if (!path.startsWith("org.eclipse.jem.tests"))
+				Utilities.removeBeanInfoPath(registry, path);
+		}
+	}
+	
+	protected int objFeatures, objNonProperties;	// Object features count and Object non-properties count. This is only initialized as needed.
+	protected Set objFeaturesSet;
+	/**
+	 * To initialize the objFeatures and objNonProperties counts when necessary. Not needed for all tests.
+	 */
+	protected void objFeaturesSetup() {
+		// Get the number of features that java.lang.Object has:
+		JavaClass objClass = (JavaClass) rset.getEObject(URI.createURI("java:/java.lang#Object"), true); //$NON-NLS-1$
+		objFeaturesSet = new HashSet();
+		objFeatures = objClass.getProperties().size();
+		// Find the number of always inherited properties.
+		objNonProperties = 0;
+		for (Iterator itr0 = objClass.getProperties().iterator(); itr0.hasNext();) {
+			EStructuralFeature p = (EStructuralFeature) itr0.next();
+			objFeaturesSet.add(p);
+			PropertyDecorator pd = Utilities.getPropertyDecorator(p);
+			if ( pd == null || (pd.getImplicitDecoratorFlag() == ImplicitItem.NOT_IMPLICIT_LITERAL && !pd.isMergeIntrospection()))
+				objNonProperties++;
+		}
+	}
+
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/beaninfo/BeanInfoSuite.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/beaninfo/BeanInfoSuite.java
new file mode 100644
index 0000000..8dfbbda
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/beaninfo/BeanInfoSuite.java
@@ -0,0 +1,101 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jem.tests.beaninfo;
+/*
+ *  $RCSfile: BeanInfoSuite.java,v $
+ *  $Revision: 1.13 $  $Date: 2007/03/14 17:26:59 $ 
+ */
+import java.net.URL;
+
+import junit.extensions.TestSetup;
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.core.resources.*;
+import org.eclipse.core.runtime.*;
+
+import org.eclipse.jem.internal.beaninfo.adapters.BeaninfoNature;
+import org.eclipse.jem.tests.JavaProjectUtil;
+import org.eclipse.jem.tests.JavaTestsPlugin;
+
+/**
+ * @author richkulp
+ *
+ * This is the true test suite for Beaninfo Testing.
+ */
+public class BeanInfoSuite extends TestSetup {
+
+	// Test cases to be include in the suite
+	private static final Class testsList[] =
+		{ TestReflection.class, // NOTE: This one must always be first because it does some tests that depend on this.
+		TestStandard.class, /*TestAWTSwingUI.class*/ };
+
+	/**
+	 * Constructor for BeanInfoSuite.
+	 */
+	public BeanInfoSuite(String name) {
+		super(new TestSuite(name) {
+			{
+				for (int i = 0; i < testsList.length; i++) {
+					addTestSuite(testsList[i]);
+				}
+			}
+
+		});
+	}
+	
+	public BeanInfoSuite() {
+		this("Test BeanInfo Suite");
+	}
+
+	public static Test suite() {
+		return new BeanInfoSuite();
+	}
+
+	private boolean oldAutoBuildingState; // autoBuilding state before we started.
+	protected void setUp() throws Exception {
+		System.out.println("-- Initializing the BeanInfo test data --"); //$NON-NLS-1$
+		oldAutoBuildingState = JavaProjectUtil.setAutoBuild(true);
+		URL installURL = JavaTestsPlugin.getPlugin().getBundle().getEntry("/");
+		String[] zipPaths = new String[3];
+		zipPaths[0] = FileLocator.toFileURL(new URL(installURL, "testdata/testbeaninfo.zip")).getFile();
+		zipPaths[1] = FileLocator.toFileURL(new URL(installURL, "testdata/testbeaninfobeaninfos.zip")).getFile();
+		zipPaths[2] = FileLocator.toFileURL(new URL(installURL, "testdata/testbeaninfopreq.zip")).getFile();
+		IProject[] projects =
+			JavaProjectUtil.importProjects(
+				new String[] {
+					AbstractBeanInfoTestCase.TEST_BEANINFO_PROJECT,
+					AbstractBeanInfoTestCase.TEST_BEANINFO_BEANINFOS_PROJECT,
+					AbstractBeanInfoTestCase.TEST_BEANINFO_PREREQ_PROJECT },
+				zipPaths);
+		assertNotNull(projects[0]);
+		assertNotNull(projects[1]);
+		assertNotNull(projects[2]);
+		JavaProjectUtil.waitForAutoBuild();
+		System.out.println("-- Data initialized --"); //$NON-NLS-1$
+
+		BeaninfoNature nature = BeaninfoNature.getRuntime(projects[0]);
+		assertNotNull(nature);
+	}
+
+	protected void tearDown() throws Exception {
+		ResourcesPlugin.getWorkspace().run(new IWorkspaceRunnable() {
+			public void run(IProgressMonitor monitor) throws CoreException {
+				JavaProjectUtil.deleteProject(JavaProjectUtil.getProject(AbstractBeanInfoTestCase.TEST_BEANINFO_PROJECT));
+				JavaProjectUtil.deleteProject(JavaProjectUtil.getProject(AbstractBeanInfoTestCase.TEST_BEANINFO_BEANINFOS_PROJECT));
+				JavaProjectUtil.deleteProject(JavaProjectUtil.getProject(AbstractBeanInfoTestCase.TEST_BEANINFO_PREREQ_PROJECT));
+			}
+		}, ResourcesPlugin.getWorkspace().getRoot(), 0, null);
+
+		JavaProjectUtil.setAutoBuild(oldAutoBuildingState);
+	}
+
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/beaninfo/TestAWTSwingUI.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/beaninfo/TestAWTSwingUI.java
new file mode 100644
index 0000000..629a504
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/beaninfo/TestAWTSwingUI.java
@@ -0,0 +1,536 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jem.tests.beaninfo;
+/*
+ *  $RCSfile: TestAWTSwingUI.java,v $
+ *  $Revision: 1.8 $  $Date: 2005/08/24 20:58:55 $ 
+ */
+import java.io.BufferedReader;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.PrintWriter;
+import java.net.URL;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.ENamedElement;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.jem.internal.beaninfo.MethodProxy;
+import org.eclipse.jem.internal.beaninfo.PropertyDecorator;
+import org.eclipse.jem.internal.beaninfo.core.Utilities;
+import org.eclipse.jem.java.JavaClass;
+import org.eclipse.jem.tests.JavaTestsPlugin;
+
+/**
+ * @author richkulp
+ *
+ * AWT/Swing tests
+ */
+public class TestAWTSwingUI extends AbstractBeanInfoTestCase {
+
+	/**
+	 * 
+	 */
+	public TestAWTSwingUI() {
+		super();
+	}
+
+	/**
+	 * @param name
+	 */
+	public TestAWTSwingUI(String name) {
+		super(name);
+	}
+	
+	/*
+	 * The number of properties keep increasing by version,
+	 * but there is a minimal set. This minimal set will be
+	 * stored in a file and can be loaded by this method.
+	 * This set can be used to make sure that at least the
+	 * required properties are there.
+	 * 
+	 * The filename has to be relative to the tests plugin.
+	 */
+	protected Set getNames(String filename) throws IOException {
+		Set names = new HashSet(50);
+		URL url = JavaTestsPlugin.getPlugin().getBundle().getEntry(filename);
+		assertNotNull(url);
+		BufferedReader rdr = new BufferedReader(new InputStreamReader(url.openStream()));
+		try {
+			String line = null;
+			while ((line = rdr.readLine()) != null)
+				names.add(line);
+		} finally {
+			rdr.close();
+		}
+		return names;
+	}
+	
+	/*
+	 * Test the names against the set. Print those not found in the set, 
+	 * or those in the againstSet that weren't found. Throw assert error if
+	 * any from against set not found. 
+	 * 
+	 */
+	protected void testIncludesAllNames(String id, List testNames, Set againstSet, Set exclude) {
+		Set workingAgainst = new HashSet(againstSet.size());
+		workingAgainst.addAll(againstSet);	// There may be dup testNames (like for operations), so in that case we leave againstSet alone.
+		boolean wroteAny = false;
+		for (Iterator itr = testNames.iterator(); itr.hasNext();) {
+			ENamedElement testName = (ENamedElement) itr.next();
+			if (exclude.contains(testName))
+				continue;	// This is one we want to ignore
+			if (againstSet.contains(testName.getName()))
+				workingAgainst.remove(testName.getName());	// Get rid of it since found.
+			else {
+				if (!wroteAny) {
+					wroteAny = true;
+					System.out.println("Names in list that are new for " + id + ':');
+				}
+				System.out.print("  ");
+				System.out.println(testName.getName());
+			}
+		}
+		if (wroteAny)
+			System.out.println("End of new names.");
+		
+		if (!workingAgainst.isEmpty()) {
+			System.out.println("Names that should of been found, but weren't for " + id + ':');
+			for (Iterator itr = workingAgainst.iterator(); itr.hasNext();) {
+				String name = (String) itr.next();
+				System.out.print("  ");
+				System.out.println(name);
+			}
+			System.out.println("End of missing names");
+			fail("Missing some required names for "+id+'.');
+		}
+	}
+	
+	/*
+	 * Write the names out. Call only when want to update list. Filename must
+	 * be a local file.
+	 */
+	protected void writeNames(String filename, List props, Set excluding) throws FileNotFoundException {
+		PrintWriter pr = new PrintWriter(new FileOutputStream(filename));
+		try {
+			for (Iterator itr = props.iterator(); itr.hasNext();) {
+				ENamedElement element = (ENamedElement) itr.next();
+				if (excluding != null && excluding.contains(element))
+					continue;
+				pr.println(element.getName());
+			}
+		} finally {
+			pr.close();
+		}
+	}
+	
+	/**
+	 * Reflect the entire super type hierarchy of the class passed in, including the class itself.
+	 * @param jclass
+	 */
+	protected void reflectHierachy(JavaClass jclass) {
+		JavaClass loopClass = jclass;
+		while (loopClass != null) {
+			System.out.println("Reflecting for " + loopClass.getQualifiedName()); //$NON-NLS-1$
+			loopClass.isFinal(); // This causes reflection.
+			loopClass = loopClass.getSupertype();
+		}		
+	}
+	
+	/**
+	 * Use when the compares don't match to get a sorted list of operations so that
+	 * manually verify the count.
+	 * @param jclass
+	 */
+	protected void showSortedOperations(JavaClass jclass) {
+			 List allB = jclass.getEAllOperations();
+			 String[] names = new String[allB.size()];
+			 for (int i = 0; i < names.length; i++) {
+				 names[i] = ((MethodProxy) allB.get(i)).getMethod().getMethodElementSignature();
+			 }
+			 Arrays.sort(names);
+			 System.out.println("--- List of Operations for " + jclass.toString());
+			 for (int i = 0; i < names.length; i++) {
+				 System.out.println(names[i]);
+			 }		
+	}
+	
+	/**
+	 * Use when the compares don't match to get a sorted list of properties so that
+	 * manually verify the count.
+	 * @param jclass
+	 */
+	protected void showSortedProperties(JavaClass jclass) {
+		List allP = jclass.getAllProperties();
+		String[] names = new String[allP.size()];
+		for (int i = 0; i < names.length; i++) {
+			names[i] = ((EStructuralFeature) allP.get(i)).getName();
+		}
+		Arrays.sort(names);
+		System.out.println("--- List of properties for " + jclass.toString());
+		for (int i = 0; i < names.length; i++) {
+			System.out.println(names[i]);
+		}		
+	}
+	
+	protected JavaClass getButton() {
+		return (JavaClass) rset.getEObject(URI.createURI("java:/java.awt#Button"), true); //$NON-NLS-1$
+	}
+
+	protected JavaClass getJLabel() {
+		return (JavaClass) rset.getEObject(URI.createURI("java:/javax.swing#JLabel"), true); //$NON-NLS-1$
+	}
+	
+	public void testExternalJar() throws IOException {
+		objFeaturesSetup();
+		
+		// This tests getting beaninfo out of jar. The jar is within the project. It contains ButtonBeanInfo.
+		JavaClass button = getButton();
+		reflectHierachy(button);	// First reflect all parents (not introspect).
+		// Now cause introspection.
+		
+		// To write out the names if want new set.
+//		writeNames("d:/temp/extjarprops.txt", button.getAllProperties(), objFeaturesSet);		
+		
+		Set names = getNames("testdata/extjarprops.txt");
+		testIncludesAllNames("Button", button.getAllProperties(), names, objFeaturesSet);
+
+		// To write out the names if want new set.
+//		writeNames("d:/temp/extjarops.txt", button.getEOperations(), Collections.EMPTY_SET);		
+		
+		names = getNames("testdata/extjarops.txt");
+		testIncludesAllNames("Button", button.getEOperations(), names, Collections.EMPTY_SET);
+		
+//		showSortedProperties(button);
+	}
+	
+	public void testJLabel() throws IOException {
+		objFeaturesSetup();
+		
+		// This tests JLabel beaninfo out of current project, but through search path.
+		JavaClass jlabel = getJLabel();
+		reflectHierachy(jlabel);	// First reflect all parents (not introspect).
+		// Now cause introspection.
+	
+		// To write out the names if want new set.
+//		writeNames("d:/temp/jlabelprops.txt", jlabel.getAllProperties(), objFeaturesSet);
+		
+		Set names = getNames("testdata/jlabelprops.txt");
+		testIncludesAllNames("JLabel", jlabel.getAllProperties(), names, objFeaturesSet);
+		
+		// To write out the names if want new set.
+//		writeNames("d:/temp/jlabelops.txt", jlabel.getEAllOperations(), Collections.EMPTY_SET);		
+
+		names = getNames("testdata/jlabelops.txt");
+		testIncludesAllNames("JLabel", jlabel.getEAllOperations(), names, Collections.EMPTY_SET);
+		
+//		showSortedProperties(jlabel);
+//		showSortedOperations(jlabel);
+		
+		// Test that isPreferred works both for 1.3 JVM and 1.4 and later since there was a bug in 1.3.
+		EStructuralFeature enabledSF = jlabel.getEStructuralFeature("enabled"); //$NON-NLS-1$
+		PropertyDecorator pd = Utilities.getPropertyDecorator(enabledSF);
+		assertTrue(pd.isPreferred());
+	}
+	
+	/*
+	 * At time of this test creation, this is the sorted lists for comparison purposes.
+	 * 
+		--- List of properties for java.awt.Button
+		actionCommand
+		alignmentX
+		alignmentY
+		background
+		bounds
+		class
+		colorModel
+		componentOrientation
+		cursor
+		enabled
+		events
+		focusTraversable
+		font
+		foreground
+		graphics
+		implicit
+		initializationString
+		instantiateUsing
+		label
+		locale
+		location
+		locationOnScreen
+		maximumSize
+		minimumSize
+		name
+		parent
+		preferredSize
+		serializeData
+		showing
+		size
+		toolkit
+		treeLock
+		valid
+		visible
+		
+		--- List of properties for javax.swing.JLabel
+		alignmentX
+		alignmentY
+		autoscrolls
+		background
+		border
+		bounds
+		class
+		colorModel
+		componentCount
+		componentOrientation
+		components
+		cursor
+		debugGraphicsOptions
+		disabledIcon
+		displayedMnemonic
+		doubleBuffered
+		enabled
+		events
+		focusCycleRoot
+		focusTraversable
+		font
+		foreground
+		graphics
+		height
+		horizontalAlignment
+		horizontalTextPosition
+		icon
+		iconTextGap
+		implicit
+		initializationString
+		insets
+		instantiateUsing
+		labelFor
+		layout
+		locale
+		location
+		locationOnScreen
+		managingFocus
+		maximumSize
+		minimumSize
+		name
+		nextFocusableComponent
+		opaque
+		optimizedDrawingEnabled
+		paintingTile
+		parent
+		preferredSize
+		registeredKeyStrokes
+		requestFocusEnabled
+		rootPane
+		serializeData
+		showing
+		size
+		text
+		toolTipText
+		toolkit
+		topLevelAncestor
+		treeLock
+		valid
+		validateRoot
+		verticalAlignment
+		verticalTextPosition
+		visible
+		visibleRect
+		width
+		x
+		y
+	
+		--- List of Operations for javax.swing.JLabel
+		add(java.awt.Component)
+		add(java.awt.Component,int)
+		add(java.awt.Component,java.lang.Object)
+		add(java.awt.Component,java.lang.Object,int)
+		add(java.awt.PopupMenu)
+		add(java.lang.String,java.awt.Component)
+		addNotify()
+		checkImage(java.awt.Image,java.awt.image.ImageObserver)
+		computeVisibleRect(java.awt.Rectangle)
+		contains(int,int)
+		contains(java.awt.Point)
+		createImage(int,int)
+		createImage(java.awt.image.ImageProducer)
+		createToolTip()
+		dispatchEvent(java.awt.AWTEvent)
+		doLayout()
+		equals(java.lang.Object)
+		firePropertyChange(java.lang.String,boolean,boolean)
+		firePropertyChange(java.lang.String,char,char)
+		firePropertyChange(java.lang.String,double,double)
+		firePropertyChange(java.lang.String,float,float)
+		firePropertyChange(java.lang.String,int,int)
+		firePropertyChange(java.lang.String,long,long)
+		firePropertyChange(java.lang.String,short,short)
+		getAccessibleContext()
+		getActionForKeyStroke(javax.swing.KeyStroke)
+		getAlignmentX()
+		getAlignmentY()
+		getAutoscrolls()
+		getBackground()
+		getBorder()
+		getBounds()
+		getBounds(java.awt.Rectangle)
+		getClass()
+		getClientProperty(java.lang.Object)
+		getColorModel()
+		getComponent(int)
+		getComponentAt(int,int)
+		getComponentAt(java.awt.Point)
+		getComponentCount()
+		getComponents()
+		getConditionForKeyStroke(javax.swing.KeyStroke)
+		getCursor()
+		getDisabledIcon()
+		getDisplayedMnemonic()
+		getFont()
+		getFontMetrics(java.awt.Font)
+		getForeground()
+		getGraphics()
+		getHeight()
+		getHorizontalAlignment()
+		getHorizontalTextPosition()
+		getIcon()
+		getIconTextGap()
+		getInsets()
+		getLabelFor()
+		getLayout()
+		getLocale()
+		getLocation()
+		getLocation(java.awt.Point)
+		getLocationOnScreen()
+		getMaximumSize()
+		getMinimumSize()
+		getName()
+		getNextFocusableComponent()
+		getParent()
+		getPreferredSize()
+		getRegisteredKeyStrokes()
+		getRootPane()
+		getSize()
+		getSize(java.awt.Dimension)
+		getText()
+		getToolTipText()
+		getToolkit()
+		getTopLevelAncestor()
+		getTreeLock()
+		getUI()
+		getVerticalAlignment()
+		getVerticalTextPosition()
+		getVisibleRect()
+		getWidth()
+		getX()
+		getY()
+		grabFocus()
+		hasFocus()
+		hashCode()
+		invalidate()
+		isAncestorOf(java.awt.Component)
+		isDoubleBuffered()
+		isEnabled()
+		isFocusCycleRoot()
+		isFocusTraversable()
+		isManagingFocus()
+		isOpaque()
+		isOptimizedDrawingEnabled()
+		isRequestFocusEnabled()
+		isShowing()
+		isValid()
+		isValidateRoot()
+		isVisible()
+		list()
+		list(java.io.PrintStream)
+		list(java.io.PrintStream,int)
+		list(java.io.PrintWriter,int)
+		notify()
+		notifyAll()
+		paint(java.awt.Graphics)
+		paintAll(java.awt.Graphics)
+		paintImmediately(java.awt.Rectangle)
+		prepareImage(java.awt.Image,java.awt.image.ImageObserver)
+		print(java.awt.Graphics)
+		printAll(java.awt.Graphics)
+		putClientProperty(java.lang.Object,java.lang.Object)
+		remove(int)
+		remove(java.awt.Component)
+		remove(java.awt.MenuComponent)
+		removeAll()
+		removeNotify()
+		repaint()
+		repaint(java.awt.Rectangle)
+		requestDefaultFocus()
+		requestFocus()
+		resetKeyboardActions()
+		revalidate()
+		scrollRectToVisible(java.awt.Rectangle)
+		setAlignmentX(float)
+		setAlignmentY(float)
+		setAutoscrolls(boolean)
+		setBackground(java.awt.Color)
+		setBorder(javax.swing.border.Border)
+		setBounds(int,int,int,int)
+		setBounds(java.awt.Rectangle)
+		setCursor(java.awt.Cursor)
+		setDebugGraphicsOptions(int)
+		setDisabledIcon(javax.swing.Icon)
+		setDisplayedMnemonic(char)
+		setDoubleBuffered(boolean)
+		setEnabled(boolean)
+		setFont(java.awt.Font)
+		setForeground(java.awt.Color)
+		setHorizontalAlignment(int)
+		setHorizontalTextPosition(int)
+		setIcon(javax.swing.Icon)
+		setIconTextGap(int)
+		setLabelFor(java.awt.Component)
+		setLayout(java.awt.LayoutManager)
+		setLocale(java.util.Locale)
+		setLocation(int,int)
+		setLocation(java.awt.Point)
+		setMaximumSize(java.awt.Dimension)
+		setMinimumSize(java.awt.Dimension)
+		setName(java.lang.String)
+		setNextFocusableComponent(java.awt.Component)
+		setOpaque(boolean)
+		setPreferredSize(java.awt.Dimension)
+		setRequestFocusEnabled(boolean)
+		setSize(int,int)
+		setSize(java.awt.Dimension)
+		setText(java.lang.String)
+		setToolTipText(java.lang.String)
+		setUI(javax.swing.plaf.LabelUI)
+		setVerticalAlignment(int)
+		setVerticalTextPosition(int)
+		setVisible(boolean)
+		toString()
+		transferFocus()
+		unregisterKeyboardAction(javax.swing.KeyStroke)
+		update(java.awt.Graphics)
+		updateUI()
+		validate()
+		wait()
+		wait(long)
+		wait(long,int)
+			
+	 */
+
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/beaninfo/TestReflection.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/beaninfo/TestReflection.java
new file mode 100644
index 0000000..6f11183
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/beaninfo/TestReflection.java
@@ -0,0 +1,232 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jem.tests.beaninfo;
+/*
+ *  $RCSfile: TestReflection.java,v $
+ *  $Revision: 1.10 $  $Date: 2007/03/28 02:43:45 $ 
+ */
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EOperation;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.jem.internal.beaninfo.PropertyDecorator;
+import org.eclipse.jem.internal.beaninfo.core.Utilities;
+import org.eclipse.jem.java.JavaClass;
+import org.eclipse.jem.java.JavaEvent;
+import org.eclipse.jem.java.TypeKind;
+
+/**
+ * @author richkulp
+ * This one is for testing reflection. It is separate so that
+ * test suite can guarentee that it is first.
+ */
+public class TestReflection extends AbstractBeanInfoTestCase {
+
+	public TestReflection() {
+		super();
+	}
+
+	public TestReflection(String name) {
+		super(name);
+	}
+	
+	public void testReflection() {
+		// Test one without a beaninfo. This will do reflection.
+		JavaClass test1Class =
+			(JavaClass) rset.getEObject(URI.createURI("java:/org.eclipse.jem.tests.beaninfo#Test1Class"), true); //$NON-NLS-1$
+		
+		assertSame(TypeKind.CLASS_LITERAL, test1Class.getKind());
+		
+		// Test that the reflection key can find features that aren't yet loaded.
+		Object foo = rset.getEObject(URI.createURI("java:/org.eclipse.jem.tests.beaninfo#Test1Class/foo"), true); //$NON-NLS-1$
+		assertNotNull(foo);
+		
+		// Test that the reflection key can find operations that aren't yet loaded.
+		Object getFoo =
+			rset.getEObject(URI.createURI("java:/org.eclipse.jem.tests.beaninfo#Test1Class/operation/getFoo"), true); //$NON-NLS-1$
+		assertNotNull(getFoo);
+	}
+
+	public void testInnerReflectionInDefault() {
+		// Test that a property of class (through reflection) is an inner class, and the class is resolved correctly.
+		JavaClass testInnerClass =
+			(JavaClass) rset.getEObject(URI.createURI("java:/#TestDefaultInner"), true); //$NON-NLS-1$
+		
+		assertSame(TypeKind.CLASS_LITERAL, testInnerClass.getKind());
+		
+		EList properties = testInnerClass.getProperties();
+		assertEquals(1, properties.size());
+		
+		EStructuralFeature pf = (EStructuralFeature) properties.get(0);
+		assertEquals("propertyInner", pf.getName());
+		
+		PropertyDecorator pd = Utilities.getPropertyDecorator(pf);
+		assertNotNull(pd);
+		
+		JavaClass pdType = (JavaClass) pd.getPropertyType();
+		assertEquals("TestDefaultInner$Inner", pdType.getName()); 
+		assertSame(TypeKind.CLASS_LITERAL, pdType.getKind());
+	}
+	
+	public void testInnerReflectionInPackage() {
+		// Test that a property of class (through reflection) is an inner class, and the class is resolved correctly.
+		JavaClass testInnerClass =
+			(JavaClass) rset.getEObject(URI.createURI("java:/org.eclipse.jem.tests.beaninfo#TestInner"), true); //$NON-NLS-1$
+		
+		assertSame(TypeKind.CLASS_LITERAL, testInnerClass.getKind());
+		
+		EList properties = testInnerClass.getProperties();
+		assertEquals(1, properties.size());
+		
+		EStructuralFeature pf = (EStructuralFeature) properties.get(0);
+		assertEquals("propertyInner", pf.getName());
+		
+		PropertyDecorator pd = Utilities.getPropertyDecorator(pf);
+		assertNotNull(pd);
+		
+		JavaClass pdType = (JavaClass) pd.getPropertyType();
+		assertEquals("TestInner$Inner", pdType.getName()); 
+		assertSame(TypeKind.CLASS_LITERAL, pdType.getKind());
+	}
+	
+	private List getRealProps(List props) {
+		int size = props.size();
+		List newList = new ArrayList(size);
+		for (int i=0; i<size; i++) {
+			EStructuralFeature f = (EStructuralFeature) props.get(i);
+			if (Utilities.getPropertyDecorator(f) != null)
+				newList.add(f);
+		}
+		return newList;
+	}
+	
+	public void testInterfacePropertyReflection() {
+		// Test the reflection of interfaces with multiple extends on them so that properities are correct.
+		JavaClass testPropClass =
+			(JavaClass) rset.getEObject(URI.createURI("java:/org.eclipse.jem.tests.beaninfo.test#NotTopGuy"), true); //$NON-NLS-1$
+
+		assertTrue(testPropClass.isInterface());
+		
+		// Test that we don't pick up the extends stuff
+		List props = getRealProps(testPropClass.getProperties());
+		// Forgot there may be non-properties properties.
+		assertEquals(1, props.size());
+		assertEquals("number", ((EStructuralFeature) props.get(0)).getName());
+		
+		// Test that we pick up the extends stuff
+		props = getRealProps(testPropClass.getAllProperties());
+		assertEquals(3, props.size());
+		List validNames = Arrays.asList(new String[] {"number", "object", "integer"});
+		for (Iterator itr = props.iterator(); itr.hasNext();) {
+			EStructuralFeature feature = (EStructuralFeature) itr.next();
+			assertTrue("Extra feature:"+feature.getName(), validNames.contains(feature.getName()));
+		}
+	}
+	
+	public void testInterfaceEventReflection() {
+		// Test the reflection of interfaces with multiple extends on them so that events are correct.
+		JavaClass testEventClass =
+			(JavaClass) rset.getEObject(URI.createURI("java:/org.eclipse.jem.tests.beaninfo.test#NotTopGuy"), true); //$NON-NLS-1$
+
+		assertTrue(testEventClass.isInterface());
+		
+		// Test that we don't pick up the extends stuff
+		List events = testEventClass.getEvents();
+		assertTrue(events.isEmpty());
+		
+		// Test that we pick up the extends stuff
+		events = testEventClass.getAllEvents();
+		assertEquals(1, events.size());
+		assertEquals("test1ClassEvent", ((JavaEvent) events.get(0)).getName());
+	}
+	
+	public void testInterfaceOperationsReflection() {
+		// Test the reflection of interfaces with multiple extends on them so that properities are correct.
+		JavaClass testOpClass =
+			(JavaClass) rset.getEObject(URI.createURI("java:/org.eclipse.jem.tests.beaninfo.test#NotTopGuy"), true); //$NON-NLS-1$
+
+		assertTrue(testOpClass.isInterface());
+		
+		// Test that we don't pick up the extends stuff
+		List ops = testOpClass.getEOperations();
+		assertEquals(2, ops.size());
+		List validNames = Arrays.asList(new String[] {"getNumber", "setNumber"});
+		for (Iterator itr = ops.iterator(); itr.hasNext();) {
+			EOperation op = (EOperation) itr.next();
+			assertTrue("Extra operation:"+op.getName(), validNames.contains(op.getName()));
+		}
+		
+		
+		// Test that we pick up the extends stuff
+		ops = testOpClass.getEAllOperations();
+		assertEquals(8, ops.size());
+		validNames = Arrays.asList(new String[] {"getNumber", "setNumber", "getObject", "setObject", "getInteger", "setInteger", "addTest1ClassEventListener", "removeTest1ClassEventListener"});
+		for (Iterator itr = ops.iterator(); itr.hasNext();) {
+			EOperation op = (EOperation) itr.next();
+			assertTrue("Extra operation:"+op.getName(), validNames.contains(op.getName()));
+		}
+	}
+	
+	/**
+	 * Test for regression for this bug.
+	 * @throws CoreException
+	 * @see https://bugs.eclipse.org/bugs/show_bug.cgi?id=153150
+	 *
+	 */
+	/* see https://bugs.eclipse.org/bugs/show_bug.cgi?id=179023 - we need to run HEADLESS tests as HEADLESS, and this test requires UI
+	public void test153150() throws CoreException {
+		// This tests that within a platform runnable, that if a class is reflected as not found, then is created and source type tested that
+		// it will now reflect as found. The source type test forces a flush if the type is now found. However, if didn't do source type test
+		// but did just reflection we wouldn't see the new class until after notification. This bug doesn't address that problem.
+		
+		// Need to have a folder (package) already exist for this test to work. If the package was created at the same time
+		// as the class, then it won't be found until after the notification is done. But this fix was for a new class in an
+		// existing package.
+		IPackageFragment pkg1 = (IPackageFragment) JavaCore.create(nature.getProject()).findElement(new Path("org/eclipse/jem/tests/beaninfo"));
+		final IFolder folder = ((IFolder) pkg1.getCorrespondingResource()).getFolder("t153150");
+		if (!folder.exists())
+			folder.create(true, true, new NullProgressMonitor());
+
+		final ICompilationUnit[] testCU = new ICompilationUnit[1];
+		try {
+			JavaCore.run(new IWorkspaceRunnable() {
+				public void run(IProgressMonitor monitor) throws CoreException {
+					JavaClass test1Class =
+						(JavaClass) rset.getEObject(URI.createURI("java:/org.eclipse.jem.tests.beaninfo.t153150#Test153150Class"), true); //$NON-NLS-1$
+					assertEquals("Should not be defined.", TypeKind.UNDEFINED_LITERAL, test1Class.getKind());
+
+					// Now create the class.
+					IPackageFragment pkg = (IPackageFragment) JavaCore.create(folder);
+					testCU[0] = pkg.createCompilationUnit("Test153150Class.java", "public class Test153150Class {}", true, new NullProgressMonitor());
+
+					assertEquals("It should still reflect as not found.", TypeKind.UNDEFINED_LITERAL, test1Class.getKind());
+					
+					// Now do the get source type. This should reset our flags.
+					assertTrue("It should have a source type.", test1Class.isExistingType());
+					
+					// Now it should reflect.
+					assertEquals("It should now reflect as found.", TypeKind.CLASS_LITERAL, test1Class.getKind());
+				}
+			}, new NullProgressMonitor());
+		} finally {
+			if (testCU[0] != null) {
+				testCU[0].delete(true, new NullProgressMonitor());
+			}
+		}
+	}
+	*/
+	
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/beaninfo/TestStandard.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/beaninfo/TestStandard.java
new file mode 100644
index 0000000..43c92b2
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/beaninfo/TestStandard.java
@@ -0,0 +1,629 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jem.tests.beaninfo;
+/*
+ *  $RCSfile: TestStandard.java,v $
+ *  $Revision: 1.14 $  $Date: 2006/05/17 20:13:56 $ 
+ */
+
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.core.resources.*;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.jobs.ISchedulingRule;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.*;
+
+import org.eclipse.jem.internal.beaninfo.*;
+import org.eclipse.jem.internal.beaninfo.core.Utilities;
+
+import org.eclipse.jem.java.*;
+
+/**
+ * @author richkulp
+ *
+ * Standard BeanInfo tests.
+ */
+public class TestStandard extends AbstractBeanInfoTestCase {
+
+	public TestStandard() {
+		super();
+	}
+
+	public TestStandard(String name) {
+		super(name);
+	}
+		
+	public void testArrayClassType() {
+		// Test one dimension array type for a class as final component
+		JavaClass at = (JavaClass) JavaRefFactory.eINSTANCE.reflectType("org.eclipse.jem.tests.beaninfo.Test1Class[]", rset);
+		
+		assertTrue(at.isArray());
+		assertSame(TypeKind.CLASS_LITERAL, at.getKind());
+		assertEquals(1, ((ArrayType) at).getArrayDimensions());
+		assertTrue(at.isPublic());
+		assertTrue("java.lang.Object".equals(at.getSupertype().getQualifiedName()));
+		assertTrue(at.getImplementsInterfaces().size() == 2);
+		assertTrue(at.getMethods().isEmpty());
+		assertTrue(at.getFields().isEmpty());
+		assertTrue(at.getProperties().isEmpty());
+		assertTrue(at.getEvents().isEmpty());
+		assertTrue(at.getEOperations().isEmpty());
+	}
+
+	public void testArrayPrimitiveType() {
+		// Test one dimension array type for a class as final component
+		JavaClass at = (JavaClass) JavaRefFactory.eINSTANCE.reflectType("int[]", rset);
+		
+		assertTrue(at.isArray());
+		assertSame(TypeKind.CLASS_LITERAL, at.getKind());
+		assertEquals(1, ((ArrayType) at).getArrayDimensions());		
+		assertTrue(at.isPublic());
+		assertTrue("java.lang.Object".equals(at.getSupertype().getQualifiedName()));
+		assertTrue(at.getImplementsInterfaces().size() == 2);
+		assertTrue(at.getMethods().isEmpty());
+		assertTrue(at.getFields().isEmpty());
+		assertTrue(at.getProperties().isEmpty());
+		assertTrue(at.getEvents().isEmpty());
+		assertTrue(at.getEOperations().isEmpty());
+	}
+
+	public void testArrayUndefined() {
+		// Test one dimension array type for a class as final component that is undefined.
+		JavaClass at = (JavaClass) JavaRefFactory.eINSTANCE.reflectType("XYZ[]", rset);
+		
+		assertTrue(at.isArray());
+		assertSame(TypeKind.UNDEFINED_LITERAL, at.getKind());
+	}
+
+	public void testArrayClassType2Dim() {
+		// Test one dimension array type for a class as final component
+		JavaClass at = (JavaClass) JavaRefFactory.eINSTANCE.reflectType("org.eclipse.jem.tests.beaninfo.Test1Class[][]", rset);
+		
+		assertTrue(at.isArray());
+		assertSame(TypeKind.CLASS_LITERAL, at.getKind());
+		assertEquals(2, ((ArrayType) at).getArrayDimensions());
+		assertTrue(at.isPublic());
+		assertTrue("java.lang.Object".equals(at.getSupertype().getQualifiedName()));
+		assertTrue(at.getImplementsInterfaces().size() == 2);
+		assertTrue(at.getMethods().isEmpty());
+		assertTrue(at.getFields().isEmpty());
+		assertTrue(at.getProperties().isEmpty());
+		assertTrue(at.getEvents().isEmpty());
+		assertTrue(at.getEOperations().isEmpty());
+	}
+
+	public void testArrayPrimitiveType2Dim() {
+		// Test one dimension array type for a class as final component
+		JavaClass at = (JavaClass) JavaRefFactory.eINSTANCE.reflectType("int[][]", rset);
+		
+		assertTrue(at.isArray());
+		assertSame(TypeKind.CLASS_LITERAL, at.getKind());
+		assertEquals(2, ((ArrayType) at).getArrayDimensions());		
+		assertTrue(at.isPublic());
+		assertTrue("java.lang.Object".equals(at.getSupertype().getQualifiedName()));
+		assertTrue(at.getImplementsInterfaces().size() == 2);
+		assertTrue(at.getMethods().isEmpty());
+		assertTrue(at.getFields().isEmpty());
+		assertTrue(at.getProperties().isEmpty());
+		assertTrue(at.getEvents().isEmpty());
+		assertTrue(at.getEOperations().isEmpty());
+	}
+
+	public void testArrayUndefined2Dim() {
+		// Test one dimension array type for a class as final component that is undefined.
+		JavaClass at = (JavaClass) JavaRefFactory.eINSTANCE.reflectType("XYZ[][]", rset);
+		
+		assertTrue(at.isArray());
+		assertSame(TypeKind.UNDEFINED_LITERAL, at.getKind());
+	}
+
+	public void testArrayInnerClassType() {
+		// Test one dimension array type for a class as final component
+		JavaClass at = (JavaClass) JavaRefFactory.eINSTANCE.reflectType("org.eclipse.jem.tests.beaninfo.Customer$Account[]", rset);
+		
+		assertTrue(at.isArray());
+		assertSame(TypeKind.CLASS_LITERAL, at.getKind());
+		assertEquals(1, ((ArrayType) at).getArrayDimensions());
+		assertTrue(at.isPublic());
+		assertTrue("java.lang.Object".equals(at.getSupertype().getQualifiedName()));
+		assertTrue(at.getImplementsInterfaces().size() == 2);
+		assertTrue(at.getMethods().isEmpty());
+		assertTrue(at.getFields().isEmpty());
+		assertTrue(at.getProperties().isEmpty());
+		assertTrue(at.getEvents().isEmpty());
+		assertTrue(at.getEOperations().isEmpty());
+	}
+	
+	public void testBeanDecoratorReflected() {
+		JavaClass test1Class = getTest1Class();
+
+		// Test the bean decorator.
+		BeanDecorator bd = Utilities.getBeanDecorator(test1Class);
+		assertEquals("Test1Class", bd.getName()); //$NON-NLS-1$
+		assertNull(bd.getCustomizerClass());
+	}
+
+	protected JavaClass getTest1Class() {
+		JavaClass test1Class =
+			(JavaClass) rset.getEObject(URI.createURI("java:/org.eclipse.jem.tests.beaninfo#Test1Class"), true); //$NON-NLS-1$
+		return test1Class;
+	}
+	
+	public void testLocalReflectedProperties() {
+		EList allLocalFeatures = getTest1Class().getProperties();
+		assertEquals(2, allLocalFeatures.size());
+		
+		Iterator itr = Utilities.getPropertiesIterator(allLocalFeatures);
+		boolean found = false;
+		while (itr.hasNext()) {
+			PropertyDecorator pd = (PropertyDecorator) itr.next();
+			if (pd.getName().equals("foo")) { //$NON-NLS-1$
+				found = true;
+				assertTrue(pd instanceof IndexedPropertyDecorator);
+				IndexedPropertyDecorator ip = (IndexedPropertyDecorator) pd;
+				JavaHelpers type = (JavaHelpers) ip.getPropertyType();
+				assertEquals("java.lang.String[]", type.getQualifiedName());
+				if (!type.getQualifiedName().equals("java.lang.String[]")); //$NON-NLS-1$
+					
+				Method mthd = ip.getReadMethod();
+				assertSame(rset.getEObject(URI.createURI("java:/org.eclipse.jem.tests.beaninfo#Test1Class.getFoo("), true), mthd);
+				
+				mthd = ip.getWriteMethod();
+				assertSame(rset.getEObject(URI.createURI("java:/org.eclipse.jem.tests.beaninfo#Test1Class.setFoo(java.lang.String[]"), true), mthd);
+				
+				mthd = ip.getIndexedReadMethod();
+				assertSame(rset.getEObject(URI.createURI("java:/org.eclipse.jem.tests.beaninfo#Test1Class.getFoo(int"), true), mthd);
+				
+				mthd = ip.getIndexedWriteMethod();
+				assertSame(rset.getEObject(URI.createURI("java:/org.eclipse.jem.tests.beaninfo#Test1Class.setFoo(int,java.lang.String"), true), mthd);
+				
+				break;
+			}
+		}
+
+		assertTrue(found);		
+	}
+	
+	public void testLocalReflectedOperations() {
+		JavaClass test1Class = getTest1Class();
+		
+		// Test local operations.
+		EList allLocalOperations = test1Class.getEOperations();
+		assertEquals(10, allLocalOperations.size());
+		Iterator itr = allLocalOperations.iterator();
+		// This is the desired method that the operation of interest points to.
+		Method desired =
+			(Method) rset.getEObject(URI.createURI(
+				"java:/org.eclipse.jem.tests.beaninfo#Test1Class.setFoo(int,java.lang.String"), true); //$NON-NLS-1$
+		boolean found = false;
+		while (itr.hasNext()) {
+			MethodProxy bhav = (MethodProxy) itr.next();
+			if (bhav.getMethod() == desired) {
+				found = true;
+				List parms = Utilities.getMethodDecorator(bhav).getParameterDescriptors();
+				assertEquals(2, parms.size());
+				ParameterDecorator pmd = (ParameterDecorator) parms.get(0);
+				assertEquals("index", pmd.getName());
+				
+				break;
+			}
+		}
+		assertTrue(found);		
+	}
+	
+	public void testLocalReflectedEvents() {
+		JavaClass test1Class = getTest1Class();
+		
+		// Test event set reflected.
+		List events = test1Class.getEvents();
+		assertEquals(2, events.size());
+		Iterator itr = events.iterator();
+		boolean foundevt1 = false, foundevt2 = false;
+		while (itr.hasNext()) {
+			JavaEvent event = (JavaEvent) itr.next();
+			if ("test1ClassEvent".equals(event.getName())) { //$NON-NLS-1$
+				foundevt1 = true;
+				EventSetDecorator edec = Utilities.getEventSetDecorator(event);
+				List mlist = edec.getListenerMethods();
+				assertEquals(2, mlist.size());
+			} else if ("test1ClassUnicastEvent".equals(event.getName())) { //$NON-NLS-1$
+				foundevt2 = true;
+				EventSetDecorator edec = Utilities.getEventSetDecorator(event);
+				assertTrue(edec.isUnicast());
+			}
+		}
+		assertTrue(foundevt1);
+		assertTrue(foundevt2);
+	}
+	
+	protected JavaClass getTest2ClassB() {
+		return (JavaClass) rset.getEObject(URI.createURI("java:/org.eclipse.jem.tests.beaninfo#Test2ClassB"), true); //$NON-NLS-1$
+	}
+
+	public void testBeanDecoratorIntrospected() {
+		// Test one with a beaninfo.
+		JavaClass test2ClassB = getTest2ClassB();
+		BeanDecorator bd = Utilities.getBeanDecorator(test2ClassB);
+		assertEquals("Test2ClassB", bd.getName());
+		
+		// The following will test if search across beaninfo search path worked. It would fail if it didn't work.
+		assertEquals("A name for this class.", bd.getDisplayName()); //$NON-NLS-1$
+		assertFalse(bd.isExpert());
+		// Customizer class set in BeanInfo, but bogus for now to same class as being introspected.
+		assertSame(test2ClassB, bd.getCustomizerClass());
+	}
+	
+	public void testLocalIntrospectedProperties() {
+		JavaClass test2ClassB = getTest2ClassB();
+		EList allLocalFeatures = test2ClassB.getProperties();
+		assertEquals(2, allLocalFeatures.size());
+		
+		Iterator itr = Utilities.getPropertiesIterator(allLocalFeatures);
+		boolean gotSet = false, gotFoo = false;
+		while (itr.hasNext()) {
+			PropertyDecorator pd = (PropertyDecorator) itr.next();
+			Method mthd = null;
+			if (pd.getName().equals("setA")) { //$NON-NLS-1$
+				gotSet = true;
+				mthd = pd.getReadMethod();
+				assertSame(rset.getEObject(URI.createURI("java:/org.eclipse.jem.tests.beaninfo#Test2ClassB.isSetA("), true), mthd);
+			} else if (pd.getName().equals("foo")) { //$NON-NLS-1$
+				gotFoo = true;
+				IndexedPropertyDecorator ipd = (IndexedPropertyDecorator) pd;
+				mthd = ipd.getIndexedReadMethod();
+				assertSame(rset.getEObject(URI.createURI("java:/org.eclipse.jem.tests.beaninfo#Test2ClassB.getFoo(int"), true), mthd);
+			}
+		}
+		assertTrue(gotSet);
+		assertTrue(gotFoo);
+	}
+	
+	public void testLocalIntrospectedOperations() {
+		JavaClass test2ClassB = getTest2ClassB();
+		
+		EList allLocalOperations = test2ClassB.getEOperations();
+		assertEquals(2, allLocalOperations.size()); 
+
+		boolean found = false;
+		Iterator itr = test2ClassB.getEOperations().iterator();
+		while (itr.hasNext()) {
+			EOperation bhav = (EOperation) itr.next();
+			if (bhav.getName().equals("setSetA")) { //$NON-NLS-1$
+				List parms = Utilities.getMethodDecorator(bhav).getParameterDescriptors();
+				assertEquals(1, parms.size());
+				ParameterDecorator pmd = (ParameterDecorator) parms.get(0);
+				assertEquals("aBooleanSetting", pmd.getName());
+				found = true;
+				break;
+			}
+		}
+		assertTrue(found);
+	}
+	
+	public void testLocalIntrospectedEvents() {
+		JavaClass test2ClassB = getTest2ClassB();
+		
+		// Test event set introspected.
+		EList events = test2ClassB.getEvents();
+		assertEquals(1, events.size());
+		JavaEvent event = (JavaEvent) events.get(0);
+		assertEquals("overrideName", event.getName());  //$NON-NLS-1$
+		EventSetDecorator edec = Utilities.getEventSetDecorator(event);
+		assertEquals("ITest1ClassEventListener", edec.getListenerType().getName());
+		List mlist = edec.getListenerMethods();
+		assertEquals(1, mlist.size());
+		MethodProxy mproxy = (MethodProxy) mlist.get(0);
+		MethodDecorator mdec = Utilities.getMethodDecorator(mproxy);
+		assertEquals("event1", mdec.getName()); //$NON-NLS-1$
+		assertEquals("Event 1", mdec.getDisplayName()); //$NON-NLS-1$
+	}
+	
+	public void testSuperTypes() {
+		JavaClass testClass = getTest1Class();
+		objFeaturesSetup();	// Get number of features for Object. This can vary depending on extensions, so that is why we compute it.
+		
+		// Now do the testing of merging with super types.
+		assertEquals(2+objFeatures, testClass.getAllProperties().size());
+		JavaClass test1ClassA = getTest1ClassA(); //$NON-NLS-1$
+		assertNotNull(test1ClassA);
+		assertEquals(3+objFeatures, test1ClassA.getAllProperties().size());
+	}
+
+	protected JavaClass getTest1ClassA() {
+		return (JavaClass) rset.getEObject(URI.createURI("java:/org.eclipse.jem.tests.beaninfo#Test1ClassA"), true);
+	}
+	
+	public void testSuperTypesEvents() {
+		JavaClass test1ClassA = getTest1ClassA(); 
+			
+		// Test merging supertypes event set.
+		List events = test1ClassA.getAllEvents();
+		assertEquals(2, events.size());
+		Iterator itr = events.iterator();
+		boolean foundevt1 = false;
+		boolean foundevt2 = false;
+		while (itr.hasNext()) {
+			JavaEvent event = (JavaEvent) itr.next();
+			if ("test1ClassEvent".equals(event.getName())) { //$NON-NLS-1$
+				foundevt1 = true;
+				EventSetDecorator edec = Utilities.getEventSetDecorator(event);
+				List mlist = edec.getListenerMethods();
+				assertEquals(2, mlist.size());
+			} else if ("test1ClassUnicastEvent".equals(event.getName())) { //$NON-NLS-1$
+				foundevt2 = true;
+				EventSetDecorator edec = Utilities.getEventSetDecorator(event);
+				assertTrue(edec.isUnicast());
+			}
+		}
+		assertTrue(foundevt1);
+		assertTrue(foundevt2);
+	}
+	
+	protected JavaClass getTest2Class() {
+		return (JavaClass) rset.getEObject(URI.createURI("java:/org.eclipse.jem.tests.beaninfo#Test2Class"), true); //$NON-NLS-1$
+	}
+	
+	protected JavaClass getTest2ClassA() {
+		return (JavaClass) rset.getEObject(URI.createURI("java:/org.eclipse.jem.tests.beaninfo#Test2ClassA"), true); //$NON-NLS-1$
+	}	
+	
+	public void testSuperTypeHideProperty() {
+		JavaClass test2Class = getTest2Class();
+		objFeaturesSetup();
+		
+		// Test2ClassBeanInfo explicitly hides Object (super) from its BeanInfo, so only the non-BeanInfo properties will show.		
+		assertEquals(2+objNonProperties, test2Class.getAllProperties().size());
+		
+		// Try with subclasses. Make sure that Test2ClassBeanInfo is used with the subclasses.
+		JavaClass test2ClassA = getTest2ClassA();		
+		assertEquals(3+objNonProperties, test2ClassA.getAllProperties().size());
+		
+		JavaClass test2ClassB = getTest2ClassB();		
+		assertEquals(4+objNonProperties, test2ClassB.getAllProperties().size());
+	}
+	
+	public void testIndexedBeanInfo() {
+		JavaClass test2Class = getTest2Class();
+		
+		// Test that Indexed thru beaninfo works
+		Iterator itr = Utilities.getPropertiesIterator(test2Class.getProperties());
+		boolean found = false;
+		while (itr.hasNext()) {		
+			PropertyDecorator pd = (PropertyDecorator) itr.next();			
+			if (pd.getName().equals("fooBar")) { //$NON-NLS-1$
+				found = true;
+				assertTrue(pd instanceof IndexedPropertyDecorator);
+				IndexedPropertyDecorator ip = (IndexedPropertyDecorator) pd;
+				JavaHelpers type = (JavaHelpers) ip.getPropertyType();
+				assertEquals("java.lang.String[]", type.getQualifiedName()); //$NON-NLS-1$
+				Method mthd = ip.getReadMethod();
+				assertSame(rset.getEObject(URI.createURI("java:/org.eclipse.jem.tests.beaninfo#Test2Class.getFooBar("), true), mthd); //$NON-NLS-1$
+				mthd = ip.getWriteMethod();
+				assertSame(rset.getEObject(URI.createURI("java:/org.eclipse.jem.tests.beaninfo#Test2Class.setFooBar(java.lang.String[]"), true), mthd); //$NON-NLS-1$
+				mthd = ip.getIndexedReadMethod();
+				assertSame(rset.getEObject(URI.createURI("java:/org.eclipse.jem.tests.beaninfo#Test2Class.getFooBar(int"), true), mthd); //$NON-NLS-1$
+				mthd = ip.getIndexedWriteMethod();
+				assertSame(rset.getEObject(URI.createURI("java:/org.eclipse.jem.tests.beaninfo#Test2Class.setFooBar(int,java.lang.String"), true), mthd); //$NON-NLS-1$
+				break;
+			}
+		}
+
+		assertTrue(found);
+	}
+
+	protected JavaClass getTest2ClassC() {
+		return (JavaClass) rset.getEObject(URI.createURI("java:/org.eclipse.jem.tests.beaninfo#Test2ClassC"), true); //$NON-NLS-1$
+	}
+	
+	public void testBeanInfoProject() {
+		JavaClass test2ClassC = getTest2ClassC();
+		
+		// This will test that we could find Test2ClassC BeanInfo that is in another BeanInfo project (i.e. a project
+		// that is specifically for BeanInfo's for a specific code project).
+		BeanDecorator bd = Utilities.getBeanDecorator(test2ClassC);
+		assertNotNull(bd);
+		assertEquals("Test2ClassC from BeanInfo", bd.getDisplayName());
+		
+	}
+	
+	public void testOverride() {
+		
+		// Test that the local property is expert because it overrode from Test2ClassB and made it expert.
+		JavaClass test2ClassB = getTest2ClassB();
+		
+		// Test that the local property is not expert in Test2ClassB.
+		EStructuralFeature p = test2ClassB.getEStructuralFeature("setA");
+		assertNotNull(p);
+		PropertyDecorator pd = Utilities.getPropertyDecorator(p);
+		assertFalse(pd.isExpert());
+
+		// Now get subclass with override.
+		JavaClass test2ClassC = getTest2ClassC();
+		
+		// Test that the local property is now expert because it overrode from Test2ClassB and made it expert.
+		p = test2ClassC.getEStructuralFeature("setA");
+		assertNotNull(p);
+		pd = Utilities.getPropertyDecorator(p);
+		assertTrue(pd.isExpert());		
+	}
+	
+	protected JavaClass getTest2ClassPreq() {
+		return (JavaClass) rset.getEObject(URI.createURI("java:/org.eclipse.jem.tests.beaninfo.prereq#Test2ClassPreq"), true); //$NON-NLS-1$
+	}
+		
+	public void testPrereqedProjects() {
+		JavaClass test2ClassPrereq = getTest2ClassPreq();
+		objFeaturesSetup();
+		 
+		// Test finding beaninfos for classes in another project (pre-reqed project).		
+		assertEquals(1+objFeatures, test2ClassPrereq.getAllProperties().size());
+		// Verify BeanInfo and not jsut introspection.
+		EStructuralFeature f = test2ClassPrereq.getEStructuralFeature("aSet");
+		assertNotNull(f);
+		PropertyDecorator pd = Utilities.getPropertyDecorator(f);
+		assertTrue(pd.isExpert());
+	}
+	
+	public void testRemovePropRebuild() throws CoreException {
+		objFeaturesSetup();
+		
+		// Test removing a property directly from a super class causes the subclasses to re-build their properties.
+		JavaClass test1Class = getTest1Class();
+		JavaClass test1ClassA = getTest1ClassA();
+		// Get and test the properties first to cause introspection for both BEFORE the modification.
+		assertEquals(2+objFeatures, test1Class.getAllProperties().size());
+		assertEquals(3+objFeatures, test1ClassA.getAllProperties().size());
+		try {
+			test1Class.getEStructuralFeatures().remove(0); // Remove the first one. They should both now rebuild.
+			assertEquals(1+objFeatures, test1Class.getAllProperties().size());
+			assertEquals(2+objFeatures, test1ClassA.getAllProperties().size());
+		} finally {
+			// Need to close and reopen the project so that to restore the correct shape for test1Class for other tests.
+			IWorkspace workspace = ResourcesPlugin.getWorkspace();
+			final IProject project = nature.getProject();
+			ISchedulingRule projectRule = workspace.getRuleFactory().modifyRule(project);
+			workspace.run(new IWorkspaceRunnable () {
+				public void run(IProgressMonitor monitor) throws CoreException {
+					project.close(monitor);
+					project.open(monitor);
+				}
+			}, projectRule, 0, null);
+		}
+	}
+	
+	public void testRemoveEventRebuild() throws CoreException {
+		// Test removing an event directly from a super class causes the subclasses to re-build their allEvents.
+		JavaClass test1Class = getTest1Class();
+		JavaClass test1ClassA = getTest1ClassA();
+		// Get and test the events first to cause introspection for both BEFORE the modification.
+		assertEquals(2, test1Class.getAllEvents().size());
+		assertEquals(2, test1ClassA.getAllEvents().size());		
+		try {
+			test1Class.getEvents().remove(0); // Remove the first one. They should now both rebuild.
+			assertEquals(1, test1Class.getAllEvents().size());
+			assertEquals(1, test1ClassA.getAllEvents().size());			
+		} finally {
+			// Need to close and reopen the project so that to restore the correct shape for test1Class for other tests.
+			final IProject project = nature.getProject();
+			IWorkspace workspace = ResourcesPlugin.getWorkspace();
+			ISchedulingRule projectRule = workspace.getRuleFactory().modifyRule(project);
+			workspace.run(new IWorkspaceRunnable () {
+				public void run(IProgressMonitor monitor) throws CoreException {
+					project.close(monitor);
+					project.open(monitor);
+				}
+			}, projectRule, 0, null);
+		}
+	}
+	
+	protected JavaClass getCustomer() {
+		return (JavaClass) rset.getEObject(URI.createURI("java:/org.eclipse.jem.tests.beaninfo#Customer"), true); //$NON-NLS-1$
+	}
+	
+	public void testInnerClass() {
+		JavaClass customer = getCustomer();
+		
+		// Now test customer to make sure that it introspects correctly, plus the inner class of one of its properties does too.
+		List allLocalFeatures = customer.getProperties();
+		assertEquals(2, allLocalFeatures.size());
+		Iterator itr = allLocalFeatures.iterator();
+		boolean found = false;
+		while (itr.hasNext()) {
+			EStructuralFeature ea = (EStructuralFeature) itr.next();
+			if ("savings".equals(ea.getName())) { //$NON-NLS-1$
+				found = true;
+				JavaClass innerClass = (JavaClass) ea.getEType();	// This property type is an innerclass of Customer
+				assertEquals("Customer$Account", innerClass.getName());
+				allLocalFeatures = innerClass.getProperties();
+				assertEquals(2, allLocalFeatures.size());
+			}
+		}
+		
+		assertTrue(found);
+	}
+
+	protected JavaClass getTestBoundNotBound() {
+		return (JavaClass) rset.getEObject(URI.createURI("java:/org.eclipse.jem.tests.beaninfo#TestBoundNotBound"), true); //$NON-NLS-1$
+	}
+	
+	public void testNotBoundReflection() {
+		JavaClass testBoundNotBound = getTestBoundNotBound();
+		
+		// Now test that properties are bound correctly on reflection. First test reflect not bound correct.
+		// This is determined by no addPropertyChangeListener method on class.		
+		List allLocalFeatures = testBoundNotBound.getProperties();
+		assertEquals(1, allLocalFeatures.size());
+		EStructuralFeature ea = (EStructuralFeature) allLocalFeatures.get(0);
+		PropertyDecorator pd = Utilities.getPropertyDecorator(ea);
+		assertNotNull(pd);
+		assertFalse(pd.isBound());
+	}
+	
+	protected JavaClass getTestBoundSuper() {
+		return (JavaClass) rset.getEObject(URI.createURI("java:/org.eclipse.jem.tests.beaninfo#TestBoundSuper"), true); //$NON-NLS-1$
+	}
+	
+	public void testBoundReflection() {
+		JavaClass testBoundSuper = getTestBoundSuper();
+		
+		// Test that reflection can find bound property.
+		// This is determined by finding add/remove PropertyChangeListener method on class.		
+		List allLocalFeatures = testBoundSuper.getProperties();
+		assertEquals(1, allLocalFeatures.size());
+		EStructuralFeature ea = (EStructuralFeature) allLocalFeatures.get(0);
+		PropertyDecorator pd = Utilities.getPropertyDecorator(ea);
+		assertNotNull(pd);
+		assertTrue(pd.isBound());
+	}
+
+	protected JavaClass getTestBoundSub() {
+		return (JavaClass) rset.getEObject(URI.createURI("java:/org.eclipse.jem.tests.beaninfo#TestBoundSub"), true); //$NON-NLS-1$
+	}
+	
+	public void testBoundReflectionSubclass() {
+		JavaClass testBoundSub = getTestBoundSub();
+
+		// Test that reflection can find bound property due to inherit from a bound class.
+		// This is determined by finding add/remove PropertyChangeListener method on class (but from a super class).						
+		List allLocalFeatures = testBoundSub.getProperties();
+		assertEquals(1, allLocalFeatures.size());		
+		EStructuralFeature ea = (EStructuralFeature) allLocalFeatures.get(0);
+		PropertyDecorator pd = Utilities.getPropertyDecorator(ea);
+		assertNotNull(pd);
+		assertTrue(pd.isBound());
+	}
+	
+	public void testOverridesFile() {
+		// Test that override files get applied correctly.
+		JavaClass testOverride = (JavaClass) rset.getEObject(URI.createURI("java:/org.eclipse.jem.tests.beaninfo#TestOverrides"), true); //$NON-NLS-1$
+		assertNotNull(testOverride);
+		EStructuralFeature xyz = testOverride.getEStructuralFeature("xyz");
+		assertNotNull(xyz);
+		// Test that it has the correct type so that we know it was reflected correctly.
+		assertEquals(rset.getEObject(URI.createURI("java:/#int"), true), xyz.getEType());
+		
+		// Test that we have the annotation we added.
+		assertNotNull(xyz.getEAnnotation("Override Annotation"));
+	}
+	
+	public void test79083() {
+		// Test bug 79083: Null ETypes from overrides that didn't have a reflection to give it the type. BeanInfo should make it EObject type.
+		JavaClass testOverride = (JavaClass) rset.getEObject(URI.createURI("java:/org.eclipse.jem.tests.beaninfo#TestOverrides"), true); //$NON-NLS-1$
+		assertNotNull(testOverride);
+		EStructuralFeature test79083 = testOverride.getEStructuralFeature("test79083");
+		assertNotNull(test79083);
+		assertEquals(EcorePackage.eINSTANCE.getEObject(), test79083.getEType());
+	}
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/instantiation/InstantiationSuite.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/instantiation/InstantiationSuite.java
new file mode 100644
index 0000000..25c0b96
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/instantiation/InstantiationSuite.java
@@ -0,0 +1,98 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jem.tests.instantiation;
+/*
+ *  $RCSfile: InstantiationSuite.java,v $
+ *  $Revision: 1.12 $  $Date: 2006/05/17 20:13:56 $ 
+ */
+import java.net.URL;
+
+import junit.extensions.TestSetup;
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.core.resources.*;
+import org.eclipse.core.runtime.*;
+
+import org.eclipse.jem.internal.beaninfo.adapters.BeaninfoNature;
+import org.eclipse.jem.internal.instantiation.base.JavaInstantiation;
+import org.eclipse.jem.tests.JavaProjectUtil;
+import org.eclipse.jem.tests.JavaTestsPlugin;
+import org.eclipse.jem.tests.beaninfo.AbstractBeanInfoTestCase;
+
+/**
+ * @author richkulp
+ *
+ */
+public class InstantiationSuite extends TestSetup {
+
+	// Test cases to be include in the suite
+	private static final Class testsList[] = { TestStandard.class, };
+
+	/**
+	 * 
+	 */
+	public InstantiationSuite() {
+		this("Test Instantiation Suite");
+	}
+
+	/**
+	 * @param name
+	 */
+	public InstantiationSuite(String name) {
+		super(new TestSuite(name) {
+			{
+				for (int i = 0; i < testsList.length; i++) {
+					addTestSuite(testsList[i]);
+				}
+
+			}
+		});
+	}
+
+	public static Test suite() {
+		return new InstantiationSuite();
+	}
+
+	private boolean oldAutoBuildingState; // autoBuilding state before we started.	
+	protected void setUp() throws Exception {
+		System.out.println("-- Initializing the Instantiation test data --"); //$NON-NLS-1$
+		oldAutoBuildingState = JavaProjectUtil.setAutoBuild(true);
+		URL installURL = JavaTestsPlugin.getPlugin().getBundle().getEntry("/");
+		String[] zipPaths = new String[2];
+		zipPaths[0] = FileLocator.toFileURL(new URL(installURL, "testdata/testbeaninfo.zip")).getFile();
+		zipPaths[1] = FileLocator.toFileURL(new URL(installURL, "testdata/testbeaninfopreq.zip")).getFile();
+		IProject[] projects =
+			JavaProjectUtil.importProjects(
+				new String[] { AbstractBeanInfoTestCase.TEST_BEANINFO_PROJECT, AbstractBeanInfoTestCase.TEST_BEANINFO_PREREQ_PROJECT },
+				zipPaths);
+		assertNotNull(projects[0]);
+		assertNotNull(projects[1]);
+		JavaProjectUtil.waitForAutoBuild();
+		System.out.println("-- Data initialized --"); //$NON-NLS-1$
+
+		BeaninfoNature nature = BeaninfoNature.getRuntime(projects[0]);
+		assertNotNull(nature);
+		JavaInstantiation.initialize(nature.getResourceSet());
+	}
+
+	protected void tearDown() throws Exception {
+		ResourcesPlugin.getWorkspace().run(new IWorkspaceRunnable() {
+			public void run(IProgressMonitor monitor) throws CoreException {
+				JavaProjectUtil.deleteProject(JavaProjectUtil.getProject(AbstractBeanInfoTestCase.TEST_BEANINFO_PROJECT));
+				JavaProjectUtil.deleteProject(JavaProjectUtil.getProject(AbstractBeanInfoTestCase.TEST_BEANINFO_PREREQ_PROJECT));
+			}
+		}, ResourcesPlugin.getWorkspace().getRoot(), 0, null);
+
+		JavaProjectUtil.setAutoBuild(oldAutoBuildingState);
+	}
+
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/instantiation/TestStandard.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/instantiation/TestStandard.java
new file mode 100644
index 0000000..bf2a7b9
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/instantiation/TestStandard.java
@@ -0,0 +1,202 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ * Created on Sep 3, 2003
+ *
+ * To change the template for this generated file go to
+ * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
+ */
+package org.eclipse.jem.tests.instantiation;
+
+import java.io.*;
+import java.util.Collections;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+//import org.eclipse.emf.ecore.util.EcoreUtil;
+
+import org.eclipse.jem.internal.beaninfo.adapters.BeaninfoNature;
+import org.eclipse.jem.internal.instantiation.InitStringAllocation;
+import org.eclipse.jem.internal.instantiation.InstantiationFactory;
+import org.eclipse.jem.internal.instantiation.base.IJavaDataTypeInstance;
+import org.eclipse.jem.internal.instantiation.base.IJavaObjectInstance;
+import org.eclipse.jem.java.*;
+import org.eclipse.jem.tests.JavaProjectUtil;
+import org.eclipse.jem.tests.beaninfo.AbstractBeanInfoTestCase;
+
+/**
+ * @author richkulp
+ *
+ * To change the template for this generated type comment go to
+ * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
+ */
+public class TestStandard extends TestCase {
+
+	/**
+	 * 
+	 */
+	public TestStandard() {
+		super();
+	}
+
+	/**
+	 * @param name
+	 */
+	public TestStandard(String name) {
+		super(name);
+	}
+
+	protected BeaninfoNature nature;
+	protected ResourceSet rset;
+	protected JavaHelpers boolType;
+
+	/* (non-Javadoc)
+	 * @see junit.framework.TestCase#setUp()
+	 */
+	protected void setUp() throws Exception {
+		super.setUp();
+		IProject biProject = JavaProjectUtil.getProject(AbstractBeanInfoTestCase.TEST_BEANINFO_PROJECT);
+		assertNotNull(biProject);
+		nature = BeaninfoNature.getRuntime(biProject);
+		assertNotNull(nature);
+		rset = nature.getResourceSet();
+		assertNotNull(rset);
+		boolType = JavaRefFactory.eINSTANCE.reflectType("boolean", rset);
+		assertNotNull(boolType);
+	}
+
+	protected JavaClass getTest1Class() {
+		return (JavaClass) JavaRefFactory.eINSTANCE.reflectType("org.eclipse.jem.tests.beaninfo.Test1Class", rset); //$NON-NLS-1$
+	}
+
+	public void testInit() {
+		JavaClass test1Class = getTest1Class();
+
+		// Test instantiate an instance.
+		IJavaObjectInstance ji1 = (IJavaObjectInstance) test1Class.getEPackage().getEFactoryInstance().create(test1Class);
+		ji1.setAllocation(InstantiationFactory.eINSTANCE.createInitStringAllocation("new Test1Class()")); //$NON-NLS-1$
+		assertInit(ji1);
+	}
+
+	private void assertInit(IJavaObjectInstance ji1) {
+		// Here because two tests will do same test sequence.
+		assertTrue(ji1.isSetAllocation());
+		InitStringAllocation alloc = (InitStringAllocation) ji1.getAllocation();
+		assertEquals("new Test1Class()", alloc.getInitString()); //$NON-NLS-1$
+	}
+
+	public void testPropertyAccess() {
+		JavaClass test1Class = getTest1Class();
+		IJavaObjectInstance ji1 = (IJavaObjectInstance) test1Class.getEPackage().getEFactoryInstance().create(test1Class);
+		ji1.setAllocation(InstantiationFactory.eINSTANCE.createInitStringAllocation("new Test1Class()")); //$NON-NLS-1$
+
+		// Test property set/get of a dynamic property.
+		EStructuralFeature setSF = test1Class.getEStructuralFeature("set");
+		assertNotNull(setSF);
+		assertSame(boolType, setSF.getEType());
+		IJavaDataTypeInstance setting = (IJavaDataTypeInstance) setSF.getEType().getEPackage().getEFactoryInstance().create((EClass) setSF.getEType());
+		setting.setAllocation(InstantiationFactory.eINSTANCE.createInitStringAllocation("true")); //$NON-NLS-1$
+		ji1.eSet(
+			setSF,
+			setting);
+		assertProperty(ji1);
+	}
+
+	private void assertProperty(IJavaObjectInstance ji1) {
+		// Here because two tests will do same test sequence.
+		EStructuralFeature setSF = ji1.eClass().getEStructuralFeature("set");
+		Object v = ji1.eGet(setSF);
+		assertNotNull(v);
+		assertTrue(v instanceof IJavaDataTypeInstance);
+		IJavaDataTypeInstance dtv = (IJavaDataTypeInstance) v;
+		assertSame(boolType, dtv.getJavaType());
+		assertTrue(dtv.isSetAllocation());
+		InitStringAllocation alloc = (InitStringAllocation) dtv.getAllocation();
+		assertEquals("true", alloc.getInitString());
+	}
+
+	protected IJavaObjectInstance setupInstance() {
+		// Setup the standard test instance without the assertions. For use in other tests.
+		JavaClass test1Class = getTest1Class();
+		IJavaObjectInstance ji1 = (IJavaObjectInstance) test1Class.getEPackage().getEFactoryInstance().create(test1Class);
+		ji1.setAllocation(InstantiationFactory.eINSTANCE.createInitStringAllocation("new Test1Class()")); //$NON-NLS-1$
+
+		// Test property set/get of a dynamic property.
+		EStructuralFeature setSF = test1Class.getEStructuralFeature("set");
+		IJavaDataTypeInstance setting = (IJavaDataTypeInstance) setSF.getEType().getEPackage().getEFactoryInstance().create((EClass) setSF.getEType());
+		setting.setAllocation(InstantiationFactory.eINSTANCE.createInitStringAllocation("true")); //$NON-NLS-1$
+		ji1.eSet(
+			setSF,
+			setting);
+		return ji1;
+	}
+
+	protected String setupResource() throws IOException {
+		IJavaObjectInstance ji1 = setupInstance();
+
+		// Write it out, see if it is what it should be, then read it in and see if it loads correctly.
+		ResourceSet rswork1 = nature.newResourceSet(); // Rsource set to write from
+
+		Resource r = rswork1.createResource(URI.createURI("f.xmi")); //$NON-NLS-1$
+		r.getContents().add(ji1);
+		// Bit of a kludge, but all references in java model are shared, so to serialize we need to get the 
+		// "set" setting and add to the resource so that it is contained somewhere.
+		r.getContents().add(ji1.eGet(ji1.eClass().getEStructuralFeature("set")));
+
+		ByteArrayOutputStream bo = new ByteArrayOutputStream();
+		r.save(bo, Collections.EMPTY_MAP);
+		return bo.toString();
+	}
+
+/*
+	public void testSerialization() throws IOException {
+		// Test the serialization that it produces correct output string.
+		String out = setupResource();
+		// Need to create a print stream so that we get the correct local newline chars in to match from the resource.
+		StringWriter sw = new StringWriter(out.length() + 50);
+		PrintWriter pw = new PrintWriter(sw);
+		pw.println("<?xml version=\"1.0\" encoding=\"ASCII\"?>");
+		pw.println(
+			"<xmi:XMI xmi:version=\"2.0\" xmlns:xmi=\"http://www.omg.org/XMI\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:_-javaprim=\"java:/\" xmlns:org.eclipse.jem.internal.instantiation=\"http:///org/eclipse/jem/internal/instantiation.ecore\" xmlns:org.eclipse.jem.tests.beaninfo=\"java:/org.eclipse.jem.tests.beaninfo\">");
+		pw.println("  <org.eclipse.jem.tests.beaninfo:Test1Class set=\"/1\">");
+		pw.println("    <allocation xsi:type=\"org.eclipse.jem.internal.instantiation:InitStringAllocation\" initString=\"new Test1Class()\"/>");
+		pw.println("  </org.eclipse.jem.tests.beaninfo:Test1Class>");
+		pw.println("  <_-javaprim:boolean>");
+		pw.println("    <allocation xsi:type=\"org.eclipse.jem.internal.instantiation:InitStringAllocation\" initString=\"true\"/>");
+		pw.println("  </_-javaprim:boolean>");
+		pw.println("</xmi:XMI>");
+		pw.close();
+		assertEquals(sw.toString(), out);
+	}
+		
+	public void testReading() throws IOException {
+		// Test reading serialization back in produces correct objects.
+		// Rerun tests.
+		String out = setupResource();
+
+		ResourceSet rswork2 = nature.newResourceSet(); // Resource set to read into
+		Resource rIn = rswork2.createResource(URI.createURI("f1.xmi")); //$NON-NLS-1$
+		rIn.load(new ByteArrayInputStream(out.getBytes()), Collections.EMPTY_MAP);
+		JavaClass test1Class = getTest1Class();
+		IJavaObjectInstance ji1 = (IJavaObjectInstance) EcoreUtil.getObjectByType(rIn.getContents(), test1Class);
+		assertNotNull(ji1);
+		assertInit(ji1);
+		assertProperty(ji1);
+	}
+*/
+
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/modelListeners/IListenerTester.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/modelListeners/IListenerTester.java
new file mode 100644
index 0000000..93e5662
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/modelListeners/IListenerTester.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $RCSfile: IListenerTester.java,v $
+ *  $Revision: 1.3 $  $Date: 2005/08/24 20:58:55 $ 
+ */
+package org.eclipse.jem.tests.modelListeners;
+
+import junit.framework.AssertionFailedError;
+ 
+
+/**
+ * For many of the listener tests, the actual Assert is done on a safe runnable so that it can't be 
+ * normally sent. So we will have a listener tester that will retrieve the exception and will
+ * be called to get it from the main thread.
+ * @since 1.0.0
+ */
+public interface IListenerTester {
+
+	public void isException() throws AssertionFailedError;
+	public void isComplete() throws AssertionFailedError;
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/modelListeners/ListenersSuite.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/modelListeners/ListenersSuite.java
new file mode 100644
index 0000000..7254133
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/modelListeners/ListenersSuite.java
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jem.tests.modelListeners;
+/*
+ *  $RCSfile: ListenersSuite.java,v $
+ *  $Revision: 1.7 $  $Date: 2006/05/17 20:13:56 $ 
+ */
+import java.net.URL;
+
+import junit.extensions.TestSetup;
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.core.resources.*;
+import org.eclipse.core.runtime.*;
+
+import org.eclipse.jem.tests.JavaProjectUtil;
+import org.eclipse.jem.tests.JavaTestsPlugin;
+import org.eclipse.jem.tests.beaninfo.AbstractBeanInfoTestCase;
+
+/**
+ * @author richkulp
+ *
+ */
+public class ListenersSuite extends TestSetup {
+
+	// Test cases to be include in the suite
+	private static final Class testsList[] = { TestJEM.class, TestBeanInfo.class};
+
+	/**
+	 * 
+	 */
+	public ListenersSuite() {
+		this("Test Listeners Suite");
+	}
+
+	/**
+	 * @param name
+	 */
+	public ListenersSuite(String name) {
+		super(new TestSuite(name) {
+			{
+				for (int i = 0; i < testsList.length; i++) {
+					addTestSuite(testsList[i]);
+				}
+
+			}
+		});
+	}
+
+	public static Test suite() {
+		return new ListenersSuite();
+	}
+
+	private boolean oldAutoBuildingState; // autoBuilding state before we started.	
+	protected void setUp() throws Exception {
+		System.out.println("-- Initializing the Listeners test data --"); //$NON-NLS-1$
+		oldAutoBuildingState = JavaProjectUtil.setAutoBuild(true);
+		URL installURL = JavaTestsPlugin.getPlugin().getBundle().getEntry("/");
+		String[] zipPaths = new String[2];
+		zipPaths[0] = FileLocator.toFileURL(new URL(installURL, "testdata/testbeaninfo.zip")).getFile();
+		zipPaths[1] = FileLocator.toFileURL(new URL(installURL, "testdata/testbeaninfopreq.zip")).getFile();
+		IProject[] projects =
+			JavaProjectUtil.importProjects(
+				new String[] { AbstractBeanInfoTestCase.TEST_BEANINFO_PROJECT, AbstractBeanInfoTestCase.TEST_BEANINFO_PREREQ_PROJECT },
+				zipPaths);
+		assertNotNull(projects[0]);
+		assertNotNull(projects[1]);
+		JavaProjectUtil.waitForAutoBuild();
+		System.out.println("-- Data initialized --"); //$NON-NLS-1$
+
+	}
+
+	protected void tearDown() throws Exception {
+		ResourcesPlugin.getWorkspace().run(new IWorkspaceRunnable() {
+			public void run(IProgressMonitor monitor) throws CoreException {
+				JavaProjectUtil.deleteProject(JavaProjectUtil.getProject(AbstractBeanInfoTestCase.TEST_BEANINFO_PROJECT));
+				JavaProjectUtil.deleteProject(JavaProjectUtil.getProject(AbstractBeanInfoTestCase.TEST_BEANINFO_PREREQ_PROJECT));
+			}
+		}, ResourcesPlugin.getWorkspace().getRoot(), 0, null);
+
+		JavaProjectUtil.setAutoBuild(oldAutoBuildingState);
+	}
+
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/modelListeners/TestBeanInfo.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/modelListeners/TestBeanInfo.java
new file mode 100644
index 0000000..7e9d0d2
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/modelListeners/TestBeanInfo.java
@@ -0,0 +1,183 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $RCSfile: TestBeanInfo.java,v $
+ *  $Revision: 1.10 $  $Date: 2006/09/18 22:57:55 $ 
+ */
+package org.eclipse.jem.tests.modelListeners;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.jdt.core.JavaModelException;
+
+import org.eclipse.jem.internal.beaninfo.adapters.BeaninfoModelSynchronizer;
+import org.eclipse.jem.internal.beaninfo.core.IBeaninfoSupplier;
+import org.eclipse.jem.internal.proxy.core.ProxyFactoryRegistry;
+import org.eclipse.jem.util.emf.workbench.ProjectResourceSet;
+ 
+
+/**
+ * This is for testing the JEM Reflection listeners
+ * @since 1.0.0
+ */
+public class TestBeanInfo extends TestListeners {
+	
+	BeaninfoModelSynchronizer sync;
+	TestBeaninfoAdapterFactory factory;
+
+	/* (non-Javadoc)
+	 * @see junit.framework.TestCase#setUp()
+	 */
+	protected void setUp() throws Exception {
+		factory = new TestBeaninfoAdapterFactory(new IBeaninfoSupplier() {
+
+			/*
+			 * (non-Javadoc)
+			 * 
+			 * @see org.eclipse.jem.internal.beaninfo.core.IBeaninfoSupplier#getRegistry()
+			 */
+			public ProxyFactoryRegistry getRegistry() {
+				return null;
+			}
+
+			/*
+			 * (non-Javadoc)
+			 * 
+			 * @see org.eclipse.jem.internal.beaninfo.core.IBeaninfoSupplier#isRegistryCreated()
+			 */
+			public boolean isRegistryCreated() {
+				return false;
+			}
+
+			/*
+			 * (non-Javadoc)
+			 * 
+			 * @see org.eclipse.jem.internal.beaninfo.core.IBeaninfoSupplier#closeRegistry()
+			 */
+			public void closeRegistry() {
+			}
+
+			/*
+			 * (non-Javadoc)
+			 * 
+			 * @see org.eclipse.jem.internal.beaninfo.core.IBeaninfoSupplier#getProject()
+			 */
+			public IProject getProject() {
+				return jp.getProject();
+			}
+
+			public ProjectResourceSet getNewResourceSet() {
+				return null;
+			}
+
+			public ResourceSet getProjectResourceSet() {
+				return null;
+			}
+		});	// Needs to be set first so that super.setUP() calls to special setups will have a factory.
+		super.setUp();	// Called first so that any setup won't fire our synchronizer.
+		
+		// Basic for this is add our special listener. (Don't need full JEM model cluttering things up).		
+		sync = new BeaninfoModelSynchronizer(factory, jp);
+		setTester(factory);
+	}
+	
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jem.tests.modelListeners.TestListeners#setUpClose()
+	 */
+	protected void setUpClose() throws JavaModelException {
+		super.setUpClose();
+		factory.setTestCases(new int[0], new Object[0]);
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jem.tests.modelListeners.TestListeners#setUpOpen()
+	 */
+	protected void setUpOpen() {
+		super.setUpOpen();
+		factory.setTestCases(new int[0], new Object[0]);		
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jem.tests.modelListeners.TestListeners#setUpAddMethodInWorkingCopy()
+	 */
+	protected void setUpAddMethodInWorkingCopy() throws JavaModelException {
+		super.setUpAddMethodInWorkingCopy();
+		factory.setTestCases(new int[0], new Object[0]);		
+	}
+	
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jem.tests.modelListeners.TestListeners#setUpSaveFromWorkingCopy()
+	 */
+	protected void setUpSaveFromWorkingCopy() throws JavaModelException {
+		super.setUpSaveFromWorkingCopy();
+		factory.setTestCases(new int[] {TestBeaninfoAdapterFactory.MARK_STALE_INTROSPECTION_PLUS_INNER}, new Object[] {new Object[] {"org.eclipse.jem.tests.beaninfo.Test1Class", Boolean.FALSE}}); 		
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jem.tests.modelListeners.TestListeners#setUpRevert()
+	 */
+	protected void setUpRevert() throws JavaModelException {
+		super.setUpRevert();
+		factory.setTestCases(new int[0], new Object[0]);		
+	}
+	
+//	/* (non-Javadoc)
+//	 * @see org.eclipse.jem.tests.modelListeners.TestListeners#setupDeleteMethodNoWorkingCopy()
+//	 */
+//	protected void setupDeleteMethodNoWorkingCopy() throws JavaModelException {
+//		super.setupDeleteMethodNoWorkingCopy();
+//		factory.setTestCases(new int[] {TestBeaninfoAdapterFactory.MARK_STALE_INTROSPECTION_PLUS_INNER}, new Object[] {new Object[] {"org.eclipse.jem.tests.beaninfo.Test1Class", Boolean.FALSE}});		
+//	}
+	/* (non-Javadoc)
+	 * @see org.eclipse.jem.tests.modelListeners.TestListeners#setupAddClass()
+	 */
+	protected void setupAddClass() {
+		super.setupAddClass();
+		factory.setTestCases(new int[] {TestBeaninfoAdapterFactory.MARK_STALE_INTROSPECTION_PLUS_INNER}, new Object[] {new Object[] {"org.eclipse.jem.tests.beaninfo.NewClass", Boolean.TRUE}});				
+	}
+	/* (non-Javadoc)
+	 * @see org.eclipse.jem.tests.modelListeners.TestListeners#setupDeleteClassWithWorkingCopy()
+	 */
+	protected void setupDeleteClassWithWorkingCopy() throws JavaModelException {
+		super.setupDeleteClassWithWorkingCopy();
+		factory.setTestCases(new int[] {TestBeaninfoAdapterFactory.MARK_STALE_INTROSPECTION_PLUS_INNER, TestBeaninfoAdapterFactory.MARK_STALE_INTROSPECTION_PLUS_INNER}, new Object[] {new Object[] {"org.eclipse.jem.tests.beaninfo.NewClass", Boolean.FALSE}, new Object[] {"org.eclipse.jem.tests.beaninfo.NewClass", Boolean.TRUE}});		
+	}
+	/* (non-Javadoc)
+	 * @see org.eclipse.jem.tests.modelListeners.TestListeners#setUpDeleteClassNoWorkingCopy()
+	 */
+	protected void setUpDeleteClassNoWorkingCopy() throws JavaModelException {
+		super.setUpDeleteClassNoWorkingCopy();
+		factory.setTestCases(new int[] {TestBeaninfoAdapterFactory.MARK_STALE_INTROSPECTION_PLUS_INNER}, new Object[] {new Object[] {"org.eclipse.jem.tests.beaninfo.NewClass", Boolean.TRUE}});		
+	}
+	/* (non-Javadoc)
+	 * @see org.eclipse.jem.tests.modelListeners.TestListeners#setUpAddPackage()
+	 */
+	protected void setUpAddPackage() throws JavaModelException {
+		super.setUpAddPackage();
+		factory.setTestCases(new int[] {TestBeaninfoAdapterFactory.MARK_PACKAGE_STALE}, new Object[] {"test"});		
+	}
+	/* (non-Javadoc)
+	 * @see org.eclipse.jem.tests.modelListeners.TestListeners#setUpDeletePackage()
+	 */
+	protected void setUpDeletePackage() throws JavaModelException {
+		super.setUpDeletePackage();
+		factory.setTestCases(new int[] {TestBeaninfoAdapterFactory.MARK_PACKAGE_STALE}, new Object[] {"test"});
+	}
+	/* (non-Javadoc)
+	 * @see junit.framework.TestCase#tearDown()
+	 */
+	protected void tearDown() throws Exception {
+		sync.stopSynchronizer(true);
+		super.tearDown();
+	}
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/modelListeners/TestBeaninfoAdapterFactory.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/modelListeners/TestBeaninfoAdapterFactory.java
new file mode 100644
index 0000000..d7ed729
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/modelListeners/TestBeaninfoAdapterFactory.java
@@ -0,0 +1,138 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $RCSfile: TestBeaninfoAdapterFactory.java,v $
+ *  $Revision: 1.4 $  $Date: 2006/09/18 22:57:55 $ 
+ */
+package org.eclipse.jem.tests.modelListeners;
+
+import junit.framework.Assert;
+import junit.framework.AssertionFailedError;
+
+import org.eclipse.jem.internal.beaninfo.adapters.BeaninfoAdapterFactory;
+import org.eclipse.jem.internal.beaninfo.core.IBeaninfoSupplier;
+
+/**
+ * Test factory to handle the calls from the listener during our tests.
+ * 
+ * @since 1.0.0
+ */
+public class TestBeaninfoAdapterFactory extends BeaninfoAdapterFactory implements IListenerTester {
+
+	/**
+	 * @param supplier
+	 * 
+	 * @since 1.0.0
+	 */
+	public TestBeaninfoAdapterFactory(IBeaninfoSupplier supplier) {
+		super(supplier);
+	}
+	
+	int callIndex = -1; // Index of calls into control list.
+
+	AssertionFailedError exception; // Set if exception occured.
+
+	protected int[] callTypes; // Order of permitted calltypes. If any come out of order, then error.
+
+	protected Object[] callArgs; // Corresponding args for each call types. Each type specific.
+
+	public void setTestCases(int[] callTypes, Object[] callArgs) {
+		this.callTypes = callTypes;
+		this.callArgs = callArgs;
+	}
+
+	public void isException() throws AssertionFailedError {
+		if (exception != null)
+			throw exception;
+	}
+
+	public void isComplete() throws AssertionFailedError {
+		Assert.assertEquals("Did not complete all notifcations. ", callTypes.length, callIndex + 1);
+	}
+
+	public static final int MARK_ALL_STALE = 0, MARK_STALE_INTROSPECTION = 1, MARK_STALE_INTROSPECTION_PLUS_INNER = 2, MARK_PACKAGE_STALE = 3;
+
+	private static final String[] callTypeNames = new String[] { "MARK_ALL_STALE", "MARK_STALE_INTROSPECTION", "MARK_STALE_INTROSPECTION_PLUS_INNER",
+			"MARK_PACKAGE_STALE", 
+			"UNREGISTER_INTROSPECTION", "UNREGISTER_INTROSPECTION_PLUS_INNER"};
+
+	/*
+	 * Test the next call type, if not valid, return false.
+	 */
+	protected boolean testCallType(int callType) {
+		if (exception != null)
+			return false; // Already had an error
+		try {
+			if (++callIndex >= callTypes.length)
+				Assert.fail("An extra notification of type " + callTypeNames[callType] + " received.");
+			if (callTypes[callIndex] != callType)
+				Assert.assertEquals(callTypeNames[callTypes[callIndex]], callTypeNames[callType]);
+		} catch (AssertionFailedError e) {
+			exception = e;
+			return false;
+		}
+		return true;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jem.internal.beaninfo.adapters.BeaninfoAdapterFactory#markAllStale()
+	 */
+	public void markAllStale() {
+		testCallType(MARK_ALL_STALE);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jem.internal.beaninfo.adapters.BeaninfoAdapterFactory#markStaleIntrospection(java.lang.String, boolean)
+	 */
+	public void markStaleIntrospection(String sourceName, boolean clearResults) {
+		if (testCallType(MARK_STALE_INTROSPECTION)) {
+			try {
+				Assert.assertEquals((String) ((Object[]) callArgs[callIndex])[0], sourceName);
+				Assert.assertEquals(((Boolean) ((Object[]) callArgs[callIndex])[1]).booleanValue(), clearResults); 
+			} catch (AssertionFailedError e) {
+				exception = e;
+			}			
+		}		
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jem.internal.beaninfo.adapters.BeaninfoAdapterFactory#markStaleIntrospectionPlusInner(java.lang.String, boolean)
+	 */
+	public void markStaleIntrospectionPlusInner(String sourceName, boolean clearResults) {
+		if (testCallType(MARK_STALE_INTROSPECTION_PLUS_INNER)) {
+			try {
+				Assert.assertEquals((String) ((Object[]) callArgs[callIndex])[0], sourceName);
+				Assert.assertEquals(((Boolean) ((Object[]) callArgs[callIndex])[1]).booleanValue(), clearResults); 
+			} catch (AssertionFailedError e) {
+				exception = e;
+			}			
+		}		
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jem.internal.beaninfo.adapters.BeaninfoAdapterFactory#markPackageStale(java.lang.String)
+	 */
+	public void markPackageStale(String packageName) {
+		if (testCallType(MARK_PACKAGE_STALE)) {
+			try {
+				Assert.assertEquals((String) ((Object[]) callArgs[callIndex])[0], packageName);
+			} catch (AssertionFailedError e) {
+				exception = e;
+			}			
+		}		
+	}
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/modelListeners/TestJEM.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/modelListeners/TestJEM.java
new file mode 100644
index 0000000..fb25004
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/modelListeners/TestJEM.java
@@ -0,0 +1,135 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $RCSfile: TestJEM.java,v $
+ *  $Revision: 1.8 $  $Date: 2006/09/18 22:18:02 $ 
+ */
+package org.eclipse.jem.tests.modelListeners;
+
+import org.eclipse.jdt.core.JavaModelException;
+
+import org.eclipse.jem.internal.adapters.jdom.JavaReflectionSynchronizer;
+ 
+
+/**
+ * This is for testing the JEM Reflection listeners
+ * @since 1.0.0
+ */
+public class TestJEM extends TestListeners {
+	
+	JavaReflectionSynchronizer sync;
+	TestJavaJDOMAdapterFactory factory;
+
+	/* (non-Javadoc)
+	 * @see junit.framework.TestCase#setUp()
+	 */
+	protected void setUp() throws Exception {
+		factory = new TestJavaJDOMAdapterFactory();	// Needs to be set first so that super.setUP() calls to special setups will have a factory.
+		super.setUp();	// Called first so that any setup won't fire our synchronizer.
+		
+		// Basic for this is add our special listener. (Don't need full JEM model cluttering things up).		
+		factory.setJavaProject(jp);
+		sync = factory.getSynchronizer();
+		setTester(factory);
+	}
+	
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jem.tests.modelListeners.TestListeners#setUpClose()
+	 */
+	protected void setUpClose() throws JavaModelException {
+		super.setUpClose();
+		factory.setTestCases(new int[0], new Object[0]);
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jem.tests.modelListeners.TestListeners#setUpOpen()
+	 */
+	protected void setUpOpen() {
+		super.setUpOpen();
+		factory.setTestCases(new int[0], new Object[0]);		
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jem.tests.modelListeners.TestListeners#setUpAddMethodInWorkingCopy()
+	 */
+	protected void setUpAddMethodInWorkingCopy() throws JavaModelException {
+		super.setUpAddMethodInWorkingCopy();
+		factory.setTestCases(new int[0], new Object[0]);		
+	}
+	
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jem.tests.modelListeners.TestListeners#setUpSaveFromWorkingCopy()
+	 */
+	protected void setUpSaveFromWorkingCopy() throws JavaModelException {
+		super.setUpSaveFromWorkingCopy();
+		factory.setTestCases(new int[] {TestJavaJDOMAdapterFactory.FLUSH_REFLECTION_PLUS_INNER_NO_NOTIFICATION}, new Object[] {"org.eclipse.jem.tests.beaninfo.Test1Class"}); 		
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jem.tests.modelListeners.TestListeners#setUpRevert()
+	 */
+	protected void setUpRevert() throws JavaModelException {
+		super.setUpRevert();
+		factory.setTestCases(new int[0], new Object[0]);		
+	}
+	
+//	/* (non-Javadoc)
+//	 * @see org.eclipse.jem.tests.modelListeners.TestListeners#setupDeleteMethodNoWorkingCopy()
+//	 */
+//	protected void setupDeleteMethodNoWorkingCopy() throws JavaModelException {
+//		super.setupDeleteMethodNoWorkingCopy();
+//		factory.setTestCases(new int[] {TestJavaJDOMAdapterFactory.FLUSH_REFLECTION_NO_NOTIFICATION, TestJavaJDOMAdapterFactory.FLUSH_REFLECTION_PLUS_INNER_NO_NOTIFICATION}, new Object[] {"org.eclipse.jem.tests.beaninfo.Test1Class", "org.eclipse.jem.tests.beaninfo.Test1Class"});		
+//	}
+	/* (non-Javadoc)
+	 * @see org.eclipse.jem.tests.modelListeners.TestListeners#setupAddClass()
+	 */
+	protected void setupAddClass() {
+		super.setupAddClass();
+		factory.setTestCases(new int[] {TestJavaJDOMAdapterFactory.DISASSOCIATE_SOURCE_PLUS_INNER_NOTIFY}, new Object[] {new Object[] {"org.eclipse.jem.tests.beaninfo.NewClass", Boolean.FALSE}});				
+	}
+	/* (non-Javadoc)
+	 * @see org.eclipse.jem.tests.modelListeners.TestListeners#setupDeleteClassWithWorkingCopy()
+	 */
+	protected void setupDeleteClassWithWorkingCopy() throws JavaModelException {
+		super.setupDeleteClassWithWorkingCopy();
+		factory.setTestCases(new int[] {TestJavaJDOMAdapterFactory.FLUSH_REFLECTION_PLUS_INNER_NO_NOTIFICATION, TestJavaJDOMAdapterFactory.DISASSOCIATE_SOURCE_PLUS_INNER_NOTIFY}, new Object[] {"org.eclipse.jem.tests.beaninfo.NewClass", new Object[] {"org.eclipse.jem.tests.beaninfo.NewClass", Boolean.FALSE}});		
+	}
+	/* (non-Javadoc)
+	 * @see org.eclipse.jem.tests.modelListeners.TestListeners#setUpDeleteClassNoWorkingCopy()
+	 */
+	protected void setUpDeleteClassNoWorkingCopy() throws JavaModelException {
+		super.setUpDeleteClassNoWorkingCopy();
+		factory.setTestCases(new int[] {TestJavaJDOMAdapterFactory.DISASSOCIATE_SOURCE_PLUS_INNER_NOTIFY}, new Object[] {new Object[] {"org.eclipse.jem.tests.beaninfo.NewClass", Boolean.FALSE}});		
+	}
+	/* (non-Javadoc)
+	 * @see org.eclipse.jem.tests.modelListeners.TestListeners#setUpAddPackage()
+	 */
+	protected void setUpAddPackage() throws JavaModelException {
+		super.setUpAddPackage();
+		factory.setTestCases(new int[] {TestJavaJDOMAdapterFactory.FLUSH_PACKAGE_NO_NOTIFICATION}, new Object[] {new Object[] {"test", Boolean.FALSE}});		
+	}
+	/* (non-Javadoc)
+	 * @see org.eclipse.jem.tests.modelListeners.TestListeners#setUpDeletePackage()
+	 */
+	protected void setUpDeletePackage() throws JavaModelException {
+		super.setUpDeletePackage();
+		factory.setTestCases(new int[] {TestJavaJDOMAdapterFactory.FLUSH_PACKAGE}, new Object[] {new Object[] {"test", Boolean.FALSE}});
+	}
+	/* (non-Javadoc)
+	 * @see junit.framework.TestCase#tearDown()
+	 */
+	protected void tearDown() throws Exception {
+		sync.stopSynchronizer();
+		super.tearDown();
+	}
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/modelListeners/TestJavaJDOMAdapterFactory.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/modelListeners/TestJavaJDOMAdapterFactory.java
new file mode 100644
index 0000000..c822b7a
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/modelListeners/TestJavaJDOMAdapterFactory.java
@@ -0,0 +1,234 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $RCSfile: TestJavaJDOMAdapterFactory.java,v $
+ *  $Revision: 1.3 $  $Date: 2005/08/24 20:58:55 $ 
+ */
+package org.eclipse.jem.tests.modelListeners;
+
+import java.util.Collections;
+import java.util.List;
+
+import junit.framework.Assert;
+import junit.framework.AssertionFailedError;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.jdt.core.ICompilationUnit;
+
+import org.eclipse.jem.internal.adapters.jdom.JavaJDOMAdapterFactory;
+import org.eclipse.jem.internal.adapters.jdom.JavaReflectionSynchronizer;
+ 
+
+/**
+ * A test version of this so that it works with our test cases without having fullblown JEM model up and running.
+ * @since 1.0.0
+ */
+public class TestJavaJDOMAdapterFactory extends JavaJDOMAdapterFactory implements IListenerTester {
+	
+	int callIndex = -1;	// Index of calls into control list.
+	AssertionFailedError exception; // Set if exception occured.
+	
+	protected int[] callTypes;	// Order of permitted calltypes. If any come out of order, then error.
+	protected Object[] callArgs;	// Corresponding args for each call types. Each type specific.
+	
+	public void setTestCases(int[] callTypes, Object[] callArgs) {
+		this.callTypes = callTypes;
+		this.callArgs = callArgs;
+	}
+	
+	public void isException() throws AssertionFailedError {
+		if (exception != null)
+			throw exception;
+	}
+		
+	public void isComplete() throws AssertionFailedError {
+		Assert.assertEquals("Did not complete all notifcations. ", callTypes.length, callIndex+1);
+	}
+
+	public static final int FLUSH_ALL = 0, FLUSH_ALL_NO_NOTIFICATION = 1, FLUSH_PACKAGE = 2, FLUSH_PACKAGE_NO_NOTIFICATION = 3, 
+		FLUSH_REFLECTION = 4, FLUSH_REFLECTION_NO_NOTIFICATION = 5, FLUSH_REFLECTION_PLUS_INNER_NO_NOTIFICATION = 6, NOTIFY_CONTENT_CHANGED = 7,
+		DISASSOCIATE_SOURCE_NOTIFY = 8, DISASSOCIATE_SOURCE = 9, DISASSOCIATE_SOURCE_PLUS_INNER_NOTIFY = 10, DISASSOCIATE_SOURCE_PLUS_INNER = 11; 
+	
+	private static final String[] callTypeNames = new String[] {"FLUSH_ALL", "FLUSH_ALL_NO_NOTIFICATION", "FLUSH_PACKAGE", "FLUSH_PACKAGE_NO_NOTIFICATION", 
+			"FLUSH_REFLECTION", "FLUSH_REFLECTION_NO_NOTIFICATION", "FLUSH_REFLECTION_PLUS_INNER_NO_NOTIFICATION", "NOTIFY_CONTENT_CHANGED",
+			"DISASSOCIATE_SOURCE_NOTIFY", "DISASSOCIATE_SOURCE", "DISASSOCIATE_SOURCE_PLUS_INNER_NOTIFY", "DISASSOCIATE_SOURCE_PLUS_INNER"};	
+	/*
+	 * Test the next call type, if not valid, return false.
+	 */
+	protected boolean testCallType(int callType) {
+		if (exception != null)
+			return false;	// Already had an error
+		try {
+			if (++callIndex >= callTypes.length)
+				Assert.fail("An extra notification of type " + callTypeNames[callType] + " received.");
+			if (callTypes[callIndex] != callType)
+				Assert.assertEquals(callTypeNames[callTypes[callIndex]], callTypeNames[callType]);
+		} catch (AssertionFailedError e) {
+			exception = e;
+			return false;
+		}
+		return true;
+	}
+	/* (non-Javadoc)
+	 * @see org.eclipse.jem.internal.java.adapters.JavaReflectionAdapterFactory#flushAll()
+	 */
+	public void flushAll() {
+		testCallType(FLUSH_ALL);
+	}
+	/* (non-Javadoc)
+	 * @see org.eclipse.jem.internal.adapters.jdom.JavaJDOMAdapterFactory#flushAllNoNotification()
+	 */
+	public List flushAllNoNotification() {
+		testCallType(FLUSH_ALL_NO_NOTIFICATION);
+		return Collections.EMPTY_LIST;
+	}
+	/* (non-Javadoc)
+	 * @see org.eclipse.jem.internal.adapters.jdom.JavaJDOMAdapterFactory#flushPackage(java.lang.String, boolean)
+	 */
+	public void flushPackage(String packageName, boolean noFlushIfSourceFound) {
+		if (testCallType(FLUSH_PACKAGE)) {
+			try {
+				Assert.assertEquals((String) ((Object[]) callArgs[callIndex])[0], packageName);
+				Assert.assertEquals(((Boolean) ((Object[]) callArgs[callIndex])[1]).booleanValue(), noFlushIfSourceFound); 
+			} catch (AssertionFailedError e) {
+				exception = e;
+			}			
+		}
+	}
+	/* (non-Javadoc)
+	 * @see org.eclipse.jem.internal.adapters.jdom.JavaJDOMAdapterFactory#flushPackageNoNotification(java.lang.String, boolean)
+	 */
+	public List flushPackageNoNotification(String packageName, boolean noFlushIfSourceFound) {
+		if (testCallType(FLUSH_PACKAGE_NO_NOTIFICATION)) {
+			try {
+				Assert.assertEquals((String) ((Object[]) callArgs[callIndex])[0], packageName);
+				Assert.assertEquals(((Boolean) ((Object[]) callArgs[callIndex])[1]).booleanValue(), noFlushIfSourceFound); 
+			} catch (AssertionFailedError e) {
+				exception = e;
+			}			
+		}		
+		return Collections.EMPTY_LIST;
+	}
+	/* (non-Javadoc)
+	 * @see org.eclipse.jem.internal.java.adapters.JavaReflectionAdapterFactory#flushReflection(java.lang.String)
+	 */
+	public void flushReflection(String source) {
+		if (testCallType(FLUSH_REFLECTION)) {
+			try {
+				Assert.assertEquals((String) callArgs[callIndex], source); 
+			} catch (AssertionFailedError e) {
+				exception = e;
+			}			
+		}		
+	}
+	/* (non-Javadoc)
+	 * @see org.eclipse.jem.internal.adapters.jdom.JavaJDOMAdapterFactory#flushReflectionNoNotification(java.lang.String)
+	 */
+	public Notification flushReflectionNoNotification(String source) {
+		if (testCallType(FLUSH_REFLECTION_NO_NOTIFICATION)) {
+			try {
+				Assert.assertEquals((String) callArgs[callIndex], source); 
+			} catch (AssertionFailedError e) {
+				exception = e;
+			}			
+		}			
+		return null;
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jem.internal.adapters.jdom.JavaJDOMAdapterFactory#flushReflectionPlusInnerNoNotification(java.lang.String)
+	 */
+	public Notification flushReflectionPlusInnerNoNotification(String source) {
+		if (testCallType(FLUSH_REFLECTION_PLUS_INNER_NO_NOTIFICATION)) {
+			try {
+				Assert.assertEquals((String) callArgs[callIndex], source); 
+			} catch (AssertionFailedError e) {
+				exception = e;
+			}			
+		}
+		return null;
+	}
+	/* (non-Javadoc)
+	 * @see org.eclipse.jem.internal.adapters.jdom.JavaJDOMAdapterFactory#notifyContentChanged(org.eclipse.jdt.core.ICompilationUnit)
+	 */
+	public void notifyContentChanged(ICompilationUnit targetCU) {
+		if (testCallType(NOTIFY_CONTENT_CHANGED)) {
+			try {
+				Assert.assertEquals((String) callArgs[callIndex], targetCU.getElementName()); 
+			} catch (AssertionFailedError e) {
+				exception = e;
+			}			
+		}			
+	}
+	
+	
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jem.internal.java.adapters.JavaReflectionAdapterFactory#disAssociateSource(java.lang.String, boolean)
+	 */
+	public Notification disAssociateSource(String source, boolean doNotify) {
+		if (testCallType(DISASSOCIATE_SOURCE_NOTIFY)) {
+			try {
+				Assert.assertEquals((String) ((Object[]) callArgs[callIndex])[0], source);
+				Assert.assertEquals(((Boolean) ((Object[]) callArgs[callIndex])[1]).booleanValue(), doNotify); 
+			} catch (AssertionFailedError e) {
+				exception = e;
+			}			
+		}		
+		return null;
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jem.internal.java.adapters.JavaReflectionAdapterFactory#disAssociateSource(java.lang.String)
+	 */
+	public Notification disAssociateSource(String source) {
+		if (testCallType(DISASSOCIATE_SOURCE)) {
+			try {
+				Assert.assertEquals((String) callArgs[callIndex], source); 
+			} catch (AssertionFailedError e) {
+				exception = e;
+			}			
+		}
+		return null;
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jem.internal.java.adapters.JavaReflectionAdapterFactory#disAssociateSourcePlusInner(java.lang.String, boolean)
+	 */
+	public Notification disAssociateSourcePlusInner(String source, boolean doNotify) {
+		if (testCallType(DISASSOCIATE_SOURCE_PLUS_INNER_NOTIFY)) {
+			try {
+				Assert.assertEquals((String) ((Object[]) callArgs[callIndex])[0], source);
+				Assert.assertEquals(((Boolean) ((Object[]) callArgs[callIndex])[1]).booleanValue(), doNotify); 
+			} catch (AssertionFailedError e) {
+				exception = e;
+			}			
+		}		
+		return null;
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jem.internal.java.adapters.JavaReflectionAdapterFactory#disAssociateSourcePlusInner(java.lang.String)
+	 */
+	public void disAssociateSourcePlusInner(String source) {
+		if (testCallType(DISASSOCIATE_SOURCE_PLUS_INNER)) {
+			try {
+				Assert.assertEquals((String) callArgs[callIndex], source); 
+			} catch (AssertionFailedError e) {
+				exception = e;
+			}			
+		}		
+	}
+	
+	public JavaReflectionSynchronizer getSynchronizer() {
+		return synchronizer;
+	}
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/modelListeners/TestListeners.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/modelListeners/TestListeners.java
new file mode 100644
index 0000000..5493552
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/modelListeners/TestListeners.java
@@ -0,0 +1,353 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $RCSfile: TestListeners.java,v $
+ *  $Revision: 1.5 $  $Date: 2006/05/17 20:13:56 $ 
+ */
+package org.eclipse.jem.tests.modelListeners;
+
+import java.util.Arrays;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.resources.IWorkspaceRunnable;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.*;
+import org.eclipse.jdt.core.*;
+
+import org.eclipse.jem.tests.JavaProjectUtil;
+import org.eclipse.jem.tests.beaninfo.AbstractBeanInfoTestCase;
+ 
+
+/**
+ * 
+ * @since 1.0.0
+ */
+public abstract class TestListeners extends TestCase {
+	
+	protected IJavaProject jp;
+
+	// The indexes of these lookups are found in the setup and teardown methods. They must be kept in sync.
+	protected List setupSpecials = Arrays.asList(new String[] { "testOpen", "testClose", "testAddMethodInWorkcopy", "testSaveFromWorkingCopy",
+			"testRevert", "testDeleteMethodNoWorkingCopy-obsolete, removed", "testAddClass", "testDeleteClassWithWorkingCopy",
+			"testDeleteClassNoWorkingCopy", "testAddPackage", "testDeletePackage"});
+	
+	protected IListenerTester tester;
+		
+	/* (non-Javadoc)
+	 * @see junit.framework.TestCase#setUp()
+	 */
+	protected void setUp() throws Exception {
+		super.setUp();
+		jp = JavaCore.create(JavaProjectUtil.getProject(AbstractBeanInfoTestCase.TEST_BEANINFO_PROJECT));
+		String testname = getName();
+		int index = setupSpecials.indexOf(testname);
+		switch (index) {
+			case 0:
+				setUpOpen();
+				break;
+			case 1:
+				setUpClose();
+				break;
+			case 2:
+				setUpAddMethodInWorkingCopy();
+				break;
+			case 3:
+				setUpSaveFromWorkingCopy();
+				break;
+			case 4:
+				setUpRevert();
+				break;
+//			case 5:
+//				setupDeleteMethodNoWorkingCopy();
+//				break;
+			case 6:
+				setupAddClass();
+				break;
+			case 7:
+				setupDeleteClassWithWorkingCopy();
+				break;
+			case 8:
+				setUpDeleteClassNoWorkingCopy();
+				break;
+			case 9:
+				setUpAddPackage();
+				break;
+			case 10:
+				setUpDeletePackage();
+				break;
+			default:
+				break;
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see junit.framework.TestCase#tearDown()
+	 */
+	protected void tearDown() throws Exception {
+		String testname = getName();
+		int index = setupSpecials.indexOf(testname);
+		switch (index) {
+			case 0:
+				tearDownOpen();
+				break;
+			case 1:
+				tearDownClose();
+				break;
+			case 2:
+				tearDownAddMethodInWorkingCopy();
+				break;
+			case 3:
+				tearDownSaveFromWorkingCopy();
+				break;
+			case 4:
+				tearDownRevert();
+				break;
+//			case 5:
+//				tearDownDeleteMethodNoWorkingCopy();
+//				break;
+			case 6:
+				tearDownAddClass();
+				break;
+			case 7:
+				tearDownDeleteClassWithWorkingCopy();
+				break;
+			case 8:
+				tearDownDeleteClassNoWorkingCopy();
+				break;
+			case 9:
+				tearDownAddPackage();
+				break;
+			case 10:
+				tearDownDeletePackage();
+				break;
+			default:
+				break;
+		}		
+		super.tearDown();
+	}	
+
+
+	protected void setTester(IListenerTester tester) {
+		this.tester = tester;
+	}
+	
+	protected void setUpOpen() {	
+	}	
+	public void testOpen() throws JavaModelException {
+		// Test open a working copy.
+		testCU = (ICompilationUnit) jp.findElement(new Path("org/eclipse/jem/tests/beaninfo/Test1Class.java"));
+		testCU.becomeWorkingCopy(null, null);
+		tester.isException();
+		tester.isComplete();	// It should of been complete.
+	}
+	protected void tearDownOpen() throws JavaModelException {
+		if (testCU != null)
+			testCU.discardWorkingCopy();		
+	}
+	
+	
+	protected ICompilationUnit testCU;
+	protected void setUpClose() throws JavaModelException {
+		testCU = (ICompilationUnit) jp.findElement(new Path("org/eclipse/jem/tests/beaninfo/Test1Class.java"));
+		testCU.becomeWorkingCopy(null, null);		
+	}	
+	public void testClose() throws JavaModelException {
+		// Test close a working copy.
+		testCU.discardWorkingCopy();
+		tester.isException();
+		tester.isComplete();	// It should of been complete.
+	}
+	protected void tearDownClose() throws JavaModelException {
+		if (testCU != null)
+			testCU.discardWorkingCopy();
+	}
+	
+	
+	protected void setUpAddMethodInWorkingCopy() throws JavaModelException {
+		testCU = (ICompilationUnit) jp.findElement(new Path("org/eclipse/jem/tests/beaninfo/Test1Class.java"));
+		testCU.becomeWorkingCopy(null, null);		
+	}	
+	public void testAddMethodInWorkcopy() throws JavaModelException {
+		testCU.getTypes()[0].createMethod("private void getSomething() {}", null, true, new NullProgressMonitor());
+		tester.isException();
+		tester.isComplete();	// It should of been complete.
+	}
+	protected void tearDownAddMethodInWorkingCopy() throws JavaModelException {
+		if (testCU != null)
+			testCU.discardWorkingCopy();		
+	}	
+	
+	
+	protected void setUpSaveFromWorkingCopy() throws JavaModelException {
+		testCU = (ICompilationUnit) jp.findElement(new Path("org/eclipse/jem/tests/beaninfo/Test1Class.java"));
+		testCU.becomeWorkingCopy(null, null);		
+		testCU.getTypes()[0].createMethod("private void getSomething() {}", null, true, new NullProgressMonitor());		
+	}
+	public void testSaveFromWorkingCopy() throws JavaModelException {
+		testCU.commitWorkingCopy(true, new NullProgressMonitor());
+		tester.isException();
+		tester.isComplete();	// It should of been complete.		
+	}
+	protected void tearDownSaveFromWorkingCopy() throws JavaModelException {
+		if (testCU != null)
+			testCU.discardWorkingCopy();				
+	}
+	
+	protected void setUpRevert() throws JavaModelException {
+		testCU = (ICompilationUnit) jp.findElement(new Path("org/eclipse/jem/tests/beaninfo/Test1Class.java"));
+		testCU.becomeWorkingCopy(null, null);		
+		testCU.getTypes()[0].createMethod("private void getSomething() {}", null, true, new NullProgressMonitor());				
+	}	
+	public void testRevert() throws JavaModelException {
+		testCU.restore();
+		tester.isException();
+		tester.isComplete();	// It should of been complete.		
+	}
+	protected void tearDownRevert() throws JavaModelException {
+		if (testCU != null)
+			testCU.discardWorkingCopy();				
+	}
+	
+// With 3.2M6 delete with no working copy got way to complex. Doing this through refactoring and other stuff. Just too complicated
+// to even try to figure out. So just pulling it out.
+	
+//	protected void setupDeleteMethodNoWorkingCopy() throws JavaModelException {
+//		testCU = (ICompilationUnit) jp.findElement(new Path("org/eclipse/jem/tests/beaninfo/Test1Class.java"));
+//		IMethod m = testCU.getTypes()[0].getMethod("getSomething", new String[0]);
+//		if (m.exists())
+//			m.delete(true, new NullProgressMonitor());
+//		testCU.getTypes()[0].createMethod("private void getSomething() {}", null, true, new NullProgressMonitor());						
+//	}
+//	public void testDeleteMethodNoWorkingCopy() throws CoreException {
+//		JavaCore.run(new IWorkspaceRunnable() {
+//			public void run(IProgressMonitor monitor) throws CoreException {
+//				// Actually there will be a working copy. This is to simulate what delete method from member list
+//				// with no open editor. This is done by batching everything up, but there is a working copy created.
+//				// But it changes the file directly then. (Confusing, no? But that is the way it does it in JDT).
+//				testCU.becomeWorkingCopy(null, null);
+//				IMethod method = testCU.getTypes()[0].getMethod("getSomething", new String[] {});
+//				IBuffer cuBuffer = testCU.getBuffer();
+//				ISourceRange sr = method.getSourceRange();
+//				cuBuffer.replace(sr.getOffset(), sr.getLength(),"");
+//				cuBuffer.save(monitor, true);
+//				testCU.discardWorkingCopy();
+//			}
+//		}, new NullProgressMonitor());
+//		tester.isException();
+//		tester.isComplete();	// It should of been complete.				
+//	}
+//	protected void tearDownDeleteMethodNoWorkingCopy() throws JavaModelException {
+//		if (testCU != null)
+//			testCU.discardWorkingCopy();						
+//	}
+	
+	protected void setupAddClass() {
+		
+	}
+	public void testAddClass() throws JavaModelException {
+		IPackageFragment pkg = (IPackageFragment) jp.findElement(new Path("org/eclipse/jem/tests/beaninfo"));
+		testCU = pkg.createCompilationUnit("NewClass.java", "public class NewClass {}", true, new NullProgressMonitor());
+		tester.isException();
+		tester.isComplete();	// It should of been complete.				
+	}
+	protected void tearDownAddClass() throws JavaModelException {
+		if (testCU != null) {
+			testCU.delete(true, new NullProgressMonitor());
+		}
+	}
+	
+	protected void setupDeleteClassWithWorkingCopy() throws JavaModelException {
+		IPackageFragment pkg = (IPackageFragment) jp.findElement(new Path("org/eclipse/jem/tests/beaninfo"));
+		testCU = pkg.createCompilationUnit("NewClass.java", "public class NewClass {}", true, new NullProgressMonitor());
+		testCU.becomeWorkingCopy(null, null);
+	}
+	public void testDeleteClassWithWorkingCopy() throws CoreException {
+		ResourcesPlugin.getWorkspace().run(new IWorkspaceRunnable() {
+
+			public void run(IProgressMonitor monitor) throws CoreException {
+				// Need to run this way to simulate what happens for real.
+				testCU.delete(true, new NullProgressMonitor());
+				ResourcesPlugin.getWorkspace().checkpoint(true);
+				testCU.discardWorkingCopy();
+			}
+		}, new NullProgressMonitor());
+		tester.isException();
+		tester.isComplete();	// It should of been complete.	
+		testCU = null;
+	}
+	protected void tearDownDeleteClassWithWorkingCopy() throws JavaModelException {
+		if (testCU != null && testCU.exists()) {
+			testCU.delete(true, new NullProgressMonitor());
+		}		
+	}
+	
+	protected void setUpDeleteClassNoWorkingCopy() throws JavaModelException {
+		IPackageFragment pkg = (IPackageFragment) jp.findElement(new Path("org/eclipse/jem/tests/beaninfo"));
+		testCU = pkg.createCompilationUnit("NewClass.java", "public class NewClass {}", true, new NullProgressMonitor());		
+	}
+	public void testDeleteClassNoWorkingCopy() throws JavaModelException {
+		testCU.delete(true, new NullProgressMonitor());
+		tester.isException();
+		tester.isComplete();	// It should of been complete.	
+		testCU = null;		
+	}
+	protected void tearDownDeleteClassNoWorkingCopy() throws JavaModelException {
+		if (testCU != null && testCU.exists()) {
+			testCU.delete(true, new NullProgressMonitor());
+		}				
+	}
+	
+	protected void setUpAddPackage() throws JavaModelException {
+		IPackageFragment pkg = (IPackageFragment) jp.findElement(new Path("test"));
+		if (pkg != null)
+			pkg.delete(true, new NullProgressMonitor());
+	}
+	public void testAddPackage() throws JavaModelException {
+		IPackageFragmentRoot[] roots = jp.getPackageFragmentRoots();
+		for (int i = 0; i < roots.length; i++) {
+			if (roots[i].getKind() == IPackageFragmentRoot.K_SOURCE) {
+				roots[i].createPackageFragment("test", true, new NullProgressMonitor());
+				break;
+			}
+		}
+		tester.isException();
+		tester.isComplete();	// It should of been complete.			
+	}
+	protected void tearDownAddPackage() throws JavaModelException {
+		IPackageFragment pkg = (IPackageFragment) jp.findElement(new Path("test"));
+		if (pkg != null)
+			pkg.delete(true, new NullProgressMonitor());		
+	}
+	
+	protected IPackageFragment testPkg;
+	protected void setUpDeletePackage() throws JavaModelException {
+		IPackageFragmentRoot[] roots = jp.getPackageFragmentRoots();
+		for (int i = 0; i < roots.length; i++) {
+			if (roots[i].getKind() == IPackageFragmentRoot.K_SOURCE) {
+				testPkg = roots[i].createPackageFragment("test", true, new NullProgressMonitor());
+				break;
+			}
+		}		
+	}
+	public void testDeletePackage() throws JavaModelException {
+		testPkg.delete(true, new NullProgressMonitor());
+		tester.isException();
+		tester.isComplete();	// It should of been complete.			
+		testPkg = null;
+	}
+	protected void tearDownDeletePackage() throws JavaModelException {
+		if (testPkg != null && testPkg.exists())
+			testPkg.delete(true, new NullProgressMonitor());
+	}
+	
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/AbstractTestProxy.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/AbstractTestProxy.java
new file mode 100644
index 0000000..f444b22
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/AbstractTestProxy.java
@@ -0,0 +1,131 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jem.tests.proxy;
+/*
+ *  $RCSfile: AbstractTestProxy.java,v $
+ *  $Revision: 1.5 $  $Date: 2005/08/24 20:58:54 $ 
+ */
+import java.util.Enumeration;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jem.internal.proxy.core.*;
+import org.eclipse.jem.internal.proxy.core.IStandardBeanTypeProxyFactory;
+import org.eclipse.jem.internal.proxy.core.ProxyFactoryRegistry;
+
+import junit.framework.*;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+/**
+ * @author richkulp
+ *
+ * Standard type of Proxy Tests.
+ */
+public abstract class AbstractTestProxy extends TestCase {
+	
+	/**
+	 * @author richkulp
+	 *
+	 * Interface for registry handler. Actual implementations will place their
+	 * handler in the field REGISTRY_HANDLER to that the proxy tests can access it. 
+	 */
+	public interface RegistryHandler {
+		
+		/**
+		 * @return is the handler valid and setup correctly.
+		 */
+		public boolean isValid();
+		
+		/**
+		 * Return the current registry, creating it if necessary.
+		 * @return The registry. 
+		 */
+		public ProxyFactoryRegistry getRegistry() throws CoreException;
+		
+		/**
+		 * Destroy the current registry.
+		 */
+		public void destroyRegistry();
+	}
+
+	/**
+	 * Initialize the registry handler for all AbstractTestProxy tests in the 
+	 * given suite.
+	 * @param suite
+	 */
+	public static void initRegistryHandler(TestSuite suite, RegistryHandler registryHandler) {
+		Enumeration tests = suite.tests();
+		while (tests.hasMoreElements()) {
+			Test test = (Test) tests.nextElement();
+			if (test instanceof AbstractTestProxy)
+				((AbstractTestProxy) test).setRegistryHandler(registryHandler);
+			else if (test instanceof TestSuite)
+				initRegistryHandler((TestSuite) test, registryHandler);
+		}
+	}
+	
+	public AbstractTestProxy() {
+		super();
+	}
+
+	public AbstractTestProxy(String name) {
+		super(name);
+	}
+	
+	private RegistryHandler registryHandler;
+	
+	protected ProxyFactoryRegistry registry;
+	protected IStandardBeanTypeProxyFactory proxyTypeFactory;
+	protected IStandardBeanProxyFactory proxyFactory;
+
+	/* (non-Javadoc)
+	 * @see junit.framework.TestCase#setUp()
+	 */
+	protected void setUp() throws Exception {
+		super.setUp();
+		assertNotNull(getRegistryHandler());
+		assertTrue("Suite not setup correctly.", getRegistryHandler().isValid());
+		createRegistry();
+	}
+
+	/*
+	 * @throws CoreException
+	 * 
+	 * @since 1.1.0
+	 */
+	private void createRegistry() throws CoreException {
+		registry = getRegistryHandler().getRegistry();
+		assertNotNull(registry);
+		proxyFactory = registry.getBeanProxyFactory();
+		proxyTypeFactory = registry.getBeanTypeProxyFactory();
+	}
+
+	public void setRegistryHandler(RegistryHandler registryHandler) {
+		this.registryHandler = registryHandler;
+	}
+
+	public RegistryHandler getRegistryHandler() {
+		return registryHandler;
+	}
+	
+	/**
+	 * Recreate the registry. This is to make sure we have a clean one. Should be used with caution because expensive.
+	 * @throws CoreException
+	 * 
+	 * 
+	 * @since 1.1.0
+	 */
+	public void recreateRegistry() throws CoreException {
+		getRegistryHandler().destroyRegistry();
+		createRegistry();
+	}
+
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/ExpressionTest.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/ExpressionTest.java
new file mode 100644
index 0000000..37eaf1d
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/ExpressionTest.java
@@ -0,0 +1,3303 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $RCSfile: ExpressionTest.java,v $
+ *  $Revision: 1.13 $  $Date: 2005/08/24 20:58:54 $ 
+ */
+package org.eclipse.jem.tests.proxy;
+
+import org.eclipse.core.runtime.CoreException;
+
+import org.eclipse.jem.internal.proxy.common.AmbiguousMethodException;
+import org.eclipse.jem.internal.proxy.core.*;
+import org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent;
+import org.eclipse.jem.internal.proxy.ide.IDEStandardBeanProxyFactory;
+import org.eclipse.jem.internal.proxy.initParser.tree.*;
+ 
+/**
+ * 
+ * @since 1.0.0
+ */
+public class ExpressionTest extends AbstractTestProxy {
+
+	/**
+	 * 
+	 * 
+	 * @since 1.0.0
+	 */
+	public ExpressionTest() {
+		super();
+	}
+
+	/**
+	 * @param name
+	 * 
+	 * @since 1.0.0
+	 */
+	public ExpressionTest(String name) {
+		super(name);
+	}
+	
+	public void testIProxyBeanTypeProxy() throws CoreException, IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		// Test that proxy bean type is first an expression proxy and after expression evaluation does it become a real proxy. 
+		// Can't test that it doesn't become a real proxy before evaluation because it may become resolved under the covers. For
+		// example IDE expression immediately resolves it.
+		//
+		// First we must make sure we have a clean registry because it could of been resolved from a previous test.
+		recreateRegistry();
+		
+		// Now do an expression and get a proxy.
+		IExpression exp = proxyFactory.createExpression();
+		IProxyBeanType beanTypeProxy = proxyTypeFactory.getBeanTypeProxy(exp, "testPackage.TestAccess");
+		assertNotNull(beanTypeProxy);
+		assertTrue(beanTypeProxy.isExpressionProxy());
+		final IBeanTypeProxy[] resolution = new IBeanTypeProxy[1];
+		((ExpressionProxy) beanTypeProxy).addProxyListener(new ExpressionProxy.ProxyListener() {
+			public void proxyResolved(ProxyEvent event) {
+				resolution[0] = (IBeanTypeProxy) event.getProxy();
+			}
+			public void proxyVoid(ProxyEvent event) {
+				fail("Proxy should not be void.");
+			}
+			public void proxyNotResolved(ProxyEvent event) {
+				fail("Proxy should of resolved.");
+			}
+		});
+		
+		exp.invokeExpression();
+		assertNotNull(resolution[0]);
+		IBeanTypeProxy beanTypeProxy2 = proxyTypeFactory.getBeanTypeProxy("testPackage.TestAccess");
+		assertNotNull(beanTypeProxy2);
+		assertTrue(beanTypeProxy2.isBeanProxy());
+		assertTrue(beanTypeProxy2.isValid());
+		assertSame(beanTypeProxy2, resolution[0]);	// In case of beantypes we will get identical ones back (identity not just equals).
+	}
+
+	public void testIProxyMethodProxy() throws CoreException, IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		// Test that proxy methode is first an expression proxy and after expression evaluation does it become a real proxy. 
+		// Can't test that it doesn't become a real proxy before evaluation because it may become resolved under the covers. For
+		// example IDE expression immediately resolves it.
+		//
+		// First we must make sure we have a clean registry because it could of been resolved from a previous test.
+		recreateRegistry();
+		
+		// Now do an expression and get a proxy.
+		IExpression exp = proxyFactory.createExpression();
+		IProxyBeanType beanTypeProxy = proxyTypeFactory.getBeanTypeProxy(exp, "testPackage.TestAccess");
+		IProxyMethod methodProxy = beanTypeProxy.getMethodProxy(exp, "xyz");
+		assertNotNull(methodProxy);
+		assertTrue(methodProxy.isExpressionProxy());
+		final IMethodProxy[] resolution = new IMethodProxy[1];
+		final boolean[] wasVoid = new boolean[1];
+		((ExpressionProxy) methodProxy).addProxyListener(new ExpressionProxy.ProxyListener() {
+			public void proxyResolved(ProxyEvent event) {
+				resolution[0] = (IMethodProxy) event.getProxy();
+			}
+			public void proxyVoid(ProxyEvent event) {
+				wasVoid[0] = true;
+			}
+			public void proxyNotResolved(ProxyEvent event) {
+			}
+		});
+		IProxyMethod methodProxy2 = beanTypeProxy.getMethodProxy(exp, "xyz");
+		assertSame(methodProxy, methodProxy2);	// It should return same expression proxy each time.
+		
+		exp.createMethodInvocation(ForExpression.ROOTEXPRESSION, methodProxy, true, 0);
+		exp.createClassInstanceCreation(ForExpression.METHOD_RECEIVER, beanTypeProxy, 0);
+		exp.invokeExpression();
+		
+		assertFalse(wasVoid[0]);
+		assertNotNull(resolution[0]);
+		IMethodProxy methodProxy3 = proxyTypeFactory.getBeanTypeProxy("testPackage.TestAccess").getMethodProxy("xyz");
+		assertNotNull(methodProxy3);
+		assertTrue(methodProxy3.isBeanProxy());
+		assertTrue(methodProxy3.isValid());
+		// Can't test identity of methodproxies because some registries (IDE for example) create a new method proxy each time.
+	}
+
+	public void testIProxyFieldProxy() throws CoreException, IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		// Test that proxy field is first an expression proxy and after expression evaluation does it become a real proxy. 
+		// Can't test that it doesn't become a real proxy before evaluation because it may become resolved under the covers. For
+		// example IDE expression immediately resolves it.
+		//
+		// First we must make sure we have a clean registry because it could of been resolved from a previous test.
+		recreateRegistry();
+		
+		// Now do an expression and get a proxy.
+		IExpression exp = proxyFactory.createExpression();
+		IProxyBeanType beanTypeProxy = proxyTypeFactory.getBeanTypeProxy(exp, "testPackage.TestAccess");
+		IProxyField fieldProxy = beanTypeProxy.getFieldProxy(exp, "STATIC_FIELD");
+		assertNotNull(fieldProxy);
+		assertTrue(fieldProxy.isExpressionProxy());
+		final IFieldProxy[] resolution = new IFieldProxy[1];
+		final boolean[] wasVoid = new boolean[1];
+		((ExpressionProxy) fieldProxy).addProxyListener(new ExpressionProxy.ProxyListener() {
+			public void proxyResolved(ProxyEvent event) {
+				resolution[0] = (IFieldProxy) event.getProxy();
+			}
+			public void proxyVoid(ProxyEvent event) {
+				wasVoid[0] = true;
+			}
+			public void proxyNotResolved(ProxyEvent event) {
+			}
+		});
+		
+		IProxyField fieldProxy2 = beanTypeProxy.getFieldProxy(exp, "STATIC_FIELD");
+		assertSame(fieldProxy, fieldProxy2);	// It should return same expression proxy each time.
+		
+		exp.createFieldAccess(ForExpression.ROOTEXPRESSION, fieldProxy, true);
+		exp.createClassInstanceCreation(ForExpression.FIELD_RECEIVER, beanTypeProxy, 0);
+		IBeanProxy v = exp.getExpressionValue();
+		assertNotNull(v);
+		assertEquals(3, ((IIntegerBeanProxy) v).intValue());
+		
+		assertFalse(wasVoid[0]);
+		assertNotNull(resolution[0]);
+		IFieldProxy fieldProxy3 = proxyTypeFactory.getBeanTypeProxy("testPackage.TestAccess").getFieldProxy("STATIC_FIELD");
+		assertNotNull(fieldProxy3);
+		assertTrue(fieldProxy3.isBeanProxy());
+		assertTrue(fieldProxy3.isValid());
+		// Can't test identity of methodproxies because some registries (IDE for example) create a new method proxy each time.
+	}
+
+	public void testCastStringType() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createCastExpression(ForExpression.ROOTEXPRESSION, "short");
+		exp.createPrimitiveLiteral(ForExpression.CAST_EXPRESSION, 10l);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("short", result.getTypeProxy().getTypeName());
+		assertEquals((short) 10, ((INumberBeanProxy) result).shortValue());
+	}
+	
+	public void testCastProxyType() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createCastExpression(ForExpression.ROOTEXPRESSION, proxyTypeFactory.getBeanTypeProxy("short"));
+		exp.createPrimitiveLiteral(ForExpression.CAST_EXPRESSION, 'a');
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("short", result.getTypeProxy().getTypeName());
+		assertEquals((short) 'a', ((INumberBeanProxy) result).shortValue());	
+	}
+	
+	public void testCastError() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createCastExpression(ForExpression.ROOTEXPRESSION, proxyTypeFactory.getBeanTypeProxy("short"));
+		try {
+			exp.createProxyExpression(ForExpression.CAST_EXPRESSION, proxyFactory.createBeanProxyWith(Boolean.TRUE));
+			exp.getExpressionValue();
+			fail("Should of thrown ClassCastException");
+		} catch (ThrowableProxy e) {
+			if (!e.getTypeProxy().getFormalTypeName().equals("java.lang.ClassCastException"))
+				throw e;	// Some other exception, rethrow it.
+		}
+	}	
+	
+	public void testCastFailed() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createCastExpression(ForExpression.ROOTEXPRESSION, proxyTypeFactory.getBeanTypeProxy("short"));
+		try {
+			exp.getExpressionValue();
+			fail("Should of gotton IllegalStateException");
+		} catch (IllegalStateException e) {
+			System.out.println("From testCastFailed (This is successful): "+e.getLocalizedMessage());
+		}		
+	}
+
+	public void testInstanceofStringType() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createInstanceofExpression(ForExpression.ROOTEXPRESSION, "java.lang.String");
+		exp.createStringLiteral(ForExpression.INSTANCEOF_VALUE, "asdf");
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("boolean", result.getTypeProxy().getTypeName());
+		assertEquals(true, ((IBooleanBeanProxy) result).booleanValue());
+	}
+	
+	public void testInstanceofProxyType() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createInstanceofExpression(ForExpression.ROOTEXPRESSION, proxyTypeFactory.getBeanTypeProxy("java.lang.String"));
+		exp.createStringLiteral(ForExpression.INSTANCEOF_VALUE, "asdf");
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("boolean", result.getTypeProxy().getTypeName());
+		assertEquals(true, ((IBooleanBeanProxy) result).booleanValue());
+		
+	}
+	
+	public void testInstanceofFailed() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createInstanceofExpression(ForExpression.ROOTEXPRESSION, proxyTypeFactory.getBeanTypeProxy("java.lang.String"));
+		try {
+			exp.getExpressionValue();
+			fail("Should of gotton IllegalStateException");
+		} catch (IllegalStateException e) {
+			System.out.println("From testInstanceofFailed (This is successful): "+e.getLocalizedMessage());
+		}		
+	}
+	
+	public void testTypeLiteral() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createTypeLiteral(ForExpression.ROOTEXPRESSION, "java.lang.String");
+		IBeanProxy result = exp.getExpressionValue();
+		assertTrue("Not a bean type proxy.", result instanceof IBeanTypeProxy);
+		IBeanTypeProxy type = (IBeanTypeProxy) result;
+		assertTrue("Not valid.", type.isValid());
+		assertEquals("java.lang.String", type.getFormalTypeName());
+	}
+
+	public void testTypeFails() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		try {
+			exp.createTypeLiteral(ForExpression.ROOTEXPRESSION, "java.lang.Stng");
+			exp.getExpressionValue();
+			fail("Should not of gotton a result.");
+		} catch (ThrowableProxy e) {
+			assertEquals("java.lang.ClassNotFoundException", e.getTypeProxy().getFormalTypeName());
+		}
+	}
+	
+	public void testNesting() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createInstanceofExpression(ForExpression.ROOTEXPRESSION, "short");
+		exp.createCastExpression(ForExpression.INSTANCEOF_VALUE, "short");
+		exp.createPrimitiveLiteral(ForExpression.CAST_EXPRESSION, (short) 10);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("boolean", result.getTypeProxy().getTypeName());
+		assertEquals(true, ((IBooleanBeanProxy) result).booleanValue());
+	}
+	
+	public void testPrefixPlus() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createPrefixExpression(ForExpression.ROOTEXPRESSION, PrefixOperator.PRE_PLUS);
+		exp.createPrimitiveLiteral(ForExpression.PREFIX_OPERAND, 10);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("int", result.getTypeProxy().getTypeName());
+		assertEquals(10, ((INumberBeanProxy) result).intValue());
+		
+	}
+	
+	public void testPrefixMinus() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createPrefixExpression(ForExpression.ROOTEXPRESSION, PrefixOperator.PRE_MINUS);
+		exp.createPrimitiveLiteral(ForExpression.PREFIX_OPERAND, 10);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("int", result.getTypeProxy().getTypeName());
+		assertEquals(-10, ((INumberBeanProxy) result).intValue());
+		
+	}
+
+	public void testPrefixMinusChar() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createPrefixExpression(ForExpression.ROOTEXPRESSION, PrefixOperator.PRE_MINUS);
+		exp.createPrimitiveLiteral(ForExpression.PREFIX_OPERAND, 'a');
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("int", result.getTypeProxy().getTypeName());
+		assertEquals(-'a', ((INumberBeanProxy) result).intValue());
+		
+	}
+
+	public void testPrefixComplement() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createPrefixExpression(ForExpression.ROOTEXPRESSION, PrefixOperator.PRE_COMPLEMENT);
+		exp.createPrimitiveLiteral(ForExpression.PREFIX_OPERAND, (short) 10);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("int", result.getTypeProxy().getTypeName());
+		assertEquals(~10, ((INumberBeanProxy) result).intValue());
+		
+	}
+
+	public void testPrefixNot() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createPrefixExpression(ForExpression.ROOTEXPRESSION, PrefixOperator.PRE_NOT);
+		exp.createPrimitiveLiteral(ForExpression.PREFIX_OPERAND, true);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("boolean", result.getTypeProxy().getTypeName());
+		assertEquals(false, ((IBooleanBeanProxy) result).booleanValue());
+		
+	}
+
+	public void testPrefixFail() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createPrefixExpression(ForExpression.ROOTEXPRESSION, PrefixOperator.PRE_NOT);
+		try {
+			exp.createPrimitiveLiteral(ForExpression.PREFIX_OPERAND, 10);
+			exp.getExpressionValue();
+			fail("Should of failed.");
+		} catch (ThrowableProxy e) {
+			System.out.println("Test was successful: "+e.getProxyLocalizedMessage());
+		}
+		
+	}
+	
+	public void testTimes() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_TIMES, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 3);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 4);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("int", result.getTypeProxy().getTypeName());
+		assertEquals(3*4, ((INumberBeanProxy) result).intValue());
+		
+	}
+	
+	public void testTimesExtended() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_TIMES, 1);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 3);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 4);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_EXTENDED, 5d);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("double", result.getTypeProxy().getTypeName());
+		assertEquals((3*4*5d), ((INumberBeanProxy) result).doubleValue(), 0);
+		
+	}
+
+	public void testTimesExtendedNested() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_TIMES, 1);
+		exp.createInfixExpression(ForExpression.INFIX_LEFT, InfixOperator.IN_MINUS, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 10);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 5);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 4);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_EXTENDED, 5d);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("double", result.getTypeProxy().getTypeName());
+		assertEquals(((10-5)*4*5d), ((INumberBeanProxy) result).doubleValue(), 0);
+		
+	}
+
+	public void testDivide() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_DIVIDE, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 4);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 2);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("int", result.getTypeProxy().getTypeName());
+		assertEquals(4/2, ((INumberBeanProxy) result).intValue());
+		
+	}
+	
+	public void testDivideExtended() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_DIVIDE, 1);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 12);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 3);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_EXTENDED, 2d);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("double", result.getTypeProxy().getTypeName());
+		assertEquals((12/3/2d), ((INumberBeanProxy) result).doubleValue(), 0);
+		
+	}
+
+	public void testRemainder() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_REMAINDER, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 4);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 3);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("int", result.getTypeProxy().getTypeName());
+		assertEquals(4%3, ((INumberBeanProxy) result).intValue());
+		
+	}
+	
+	public void testRemainderExtended() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_REMAINDER, 1);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 12);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 9);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_EXTENDED, 2d);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("double", result.getTypeProxy().getTypeName());
+		assertEquals((12%9%2d), ((INumberBeanProxy) result).doubleValue(), 0);
+		
+	}
+
+	public void testMinus() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_MINUS, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 4);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 3);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("int", result.getTypeProxy().getTypeName());
+		assertEquals(4-3, ((INumberBeanProxy) result).intValue());
+		
+	}
+	
+	public void testMinusExtended() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_MINUS, 1);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 12);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 9);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_EXTENDED, 2d);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("double", result.getTypeProxy().getTypeName());
+		assertEquals((12-9-2d), ((INumberBeanProxy) result).doubleValue(), 0);
+		
+	}
+
+	public void testLeftShift() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_LEFT_SHIFT, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 4);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 3);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("int", result.getTypeProxy().getTypeName());
+		assertEquals(4<<3, ((INumberBeanProxy) result).intValue());
+		
+	}
+	
+	public void testLeftShiftExtended() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_LEFT_SHIFT, 1);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 12);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 9);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_EXTENDED, 2);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("int", result.getTypeProxy().getTypeName());
+		assertEquals((12<<9<<2), ((INumberBeanProxy) result).intValue(), 0);
+	}
+
+	public void testRightShiftSigned() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_RIGHT_SHIFT_SIGNED, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, -10000000);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 3);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("int", result.getTypeProxy().getTypeName());
+		assertEquals(-10000000>>3, ((INumberBeanProxy) result).intValue());
+	}
+	
+	public void testRightShiftSignedExtended() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_RIGHT_SHIFT_SIGNED, 1);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, -10000000);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 4);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_EXTENDED, 2);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("int", result.getTypeProxy().getTypeName());
+		assertEquals((-10000000>>4>>2), ((INumberBeanProxy) result).intValue(), 0);
+	}
+	public void testRightShiftUnSigned() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_RIGHT_SHIFT_UNSIGNED, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, -10000000);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 3);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("int", result.getTypeProxy().getTypeName());
+		assertEquals(-10000000>>>3, ((INumberBeanProxy) result).intValue());
+	}
+	
+	public void testRightShiftUnSignedExtended() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_RIGHT_SHIFT_UNSIGNED, 1);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, -10000000);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 4);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_EXTENDED, 2);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("int", result.getTypeProxy().getTypeName());
+		assertEquals((-10000000>>>4>>>2), ((INumberBeanProxy) result).intValue(), 0);
+	}
+
+	public void testLess() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_LESS, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, -10000000);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 3);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("boolean", result.getTypeProxy().getTypeName());
+		assertEquals(-10000000<3, ((IBooleanBeanProxy) result).booleanValue());
+	}
+
+	public void testLessEquals() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_LESS_EQUALS, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 3);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 3);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("boolean", result.getTypeProxy().getTypeName());
+		assertEquals(3<=3, ((IBooleanBeanProxy) result).booleanValue());
+	}
+
+	public void testGreater() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_GREATER, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, -10000000);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 3);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("boolean", result.getTypeProxy().getTypeName());
+		assertEquals(-10000000>3, ((IBooleanBeanProxy) result).booleanValue());
+	}
+
+	public void testGreaterEquals() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_GREATER_EQUALS, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 2);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 3);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("boolean", result.getTypeProxy().getTypeName());
+		assertEquals(2>=3, ((IBooleanBeanProxy) result).booleanValue());
+	}
+
+	public void testEqualsPrimitives() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_EQUALS, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 3d);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 3);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("boolean", result.getTypeProxy().getTypeName());
+		assertEquals(3d==3, ((IBooleanBeanProxy) result).booleanValue());
+	}
+	
+	public void testEqualsObjects() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_EQUALS, 0);
+		exp.createTypeLiteral(ForExpression.INFIX_LEFT, "java.lang.String");
+		exp.createTypeLiteral(ForExpression.INFIX_RIGHT, "java.lang.String");
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("boolean", result.getTypeProxy().getTypeName());
+		assertEquals(String.class == String.class, ((IBooleanBeanProxy) result).booleanValue());
+	}	
+
+	public void testNotEqualsPrimitives() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_NOT_EQUALS, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 3d);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 3);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("boolean", result.getTypeProxy().getTypeName());
+		assertEquals(3d!=3, ((IBooleanBeanProxy) result).booleanValue());
+	}
+	
+	public void testNotEqualsObjects() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_NOT_EQUALS, 0);
+		exp.createTypeLiteral(ForExpression.INFIX_LEFT, "java.lang.String");
+		exp.createTypeLiteral(ForExpression.INFIX_RIGHT, "java.lang.String");
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("boolean", result.getTypeProxy().getTypeName());
+		assertEquals(String.class != String.class, ((IBooleanBeanProxy) result).booleanValue());
+	}	
+
+	public void testXOR() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_XOR, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 5);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 3);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("int", result.getTypeProxy().getTypeName());
+		assertEquals(5^3, ((INumberBeanProxy) result).intValue());
+		
+	}
+	
+	public void testXORExtended() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_XOR, 1);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 23);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 9);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_EXTENDED, 2);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("int", result.getTypeProxy().getTypeName());
+		assertEquals((23^9^2), ((INumberBeanProxy) result).intValue(), 0);
+		
+	}
+
+	public void testAnd() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_AND, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 5);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 3);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("int", result.getTypeProxy().getTypeName());
+		assertEquals(5&3, ((INumberBeanProxy) result).intValue());
+	}
+	
+	public void testAndExtended() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_AND, 1);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 13);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 15);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_EXTENDED, 1);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("int", result.getTypeProxy().getTypeName());
+		assertEquals((13&5&1), ((INumberBeanProxy) result).intValue(), 0);
+	}
+
+	public void testOr() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_OR, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 5);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 2);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("int", result.getTypeProxy().getTypeName());
+		assertEquals(5|2, ((INumberBeanProxy) result).intValue());
+	}
+	
+	public void testOrExtended() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_OR, 1);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 13);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 6);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_EXTENDED, 2);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("int", result.getTypeProxy().getTypeName());
+		assertEquals((13|6|2), ((INumberBeanProxy) result).intValue(), 0);
+	}
+
+	public void testPlus() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_PLUS, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 5);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 2);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("int", result.getTypeProxy().getTypeName());
+		assertEquals(5+2, ((INumberBeanProxy) result).intValue());
+	}
+
+	public void testPlusExtended() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_PLUS, 1);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 5);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 2);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_EXTENDED, 2l);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("long", result.getTypeProxy().getTypeName());
+		assertEquals(5+2+2l, ((INumberBeanProxy) result).intValue());
+	}
+
+	public void testPlusStringLeft() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_PLUS, 0);
+		exp.createProxyExpression(ForExpression.INFIX_LEFT, proxyFactory.createBeanProxyWith("abc"));
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 2);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("java.lang.String", result.getTypeProxy().getTypeName());
+		assertEquals("abc"+2, ((IStringBeanProxy) result).stringValue());
+	}
+
+	public void testPlusStringRight() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_PLUS, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 2);
+		exp.createProxyExpression(ForExpression.INFIX_RIGHT, proxyFactory.createBeanProxyWith("abc"));		
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("java.lang.String", result.getTypeProxy().getTypeName());
+		assertEquals(2+"abc", ((IStringBeanProxy) result).stringValue());
+	}
+	
+	public void testPlusStringLeftNull() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_PLUS, 0);
+		exp.createProxyExpression(ForExpression.INFIX_LEFT, proxyFactory.createBeanProxyWith("abc"));
+		exp.createNull(ForExpression.INFIX_RIGHT);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("java.lang.String", result.getTypeProxy().getTypeName());
+		assertEquals("abc"+null, ((IStringBeanProxy) result).stringValue());
+	}
+	
+	public void testPlusStringRightNull() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_PLUS, 0);
+		exp.createNull(ForExpression.INFIX_LEFT);
+		exp.createProxyExpression(ForExpression.INFIX_RIGHT, proxyFactory.createBeanProxyWith("abc"));
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("java.lang.String", result.getTypeProxy().getTypeName());
+		assertEquals(null+"abc", ((IStringBeanProxy) result).stringValue());
+	}
+
+	public void testPlusStringLeftChar() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_PLUS, 0);
+		exp.createProxyExpression(ForExpression.INFIX_LEFT, proxyFactory.createBeanProxyWith("abc"));
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 'a');
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("java.lang.String", result.getTypeProxy().getTypeName());
+		assertEquals("abc"+'a', ((IStringBeanProxy) result).stringValue());
+	}
+
+	public void testPlusStringRightChar() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_PLUS, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 'a');
+		exp.createProxyExpression(ForExpression.INFIX_RIGHT, proxyFactory.createBeanProxyWith("abc"));
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("java.lang.String", result.getTypeProxy().getTypeName());
+		assertEquals('a'+"abc", ((IStringBeanProxy) result).stringValue());
+	}
+
+	public void testConditionalAnd() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_CONDITIONAL_AND, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, true);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, true);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("boolean", result.getTypeProxy().getTypeName());
+		assertEquals(true && true, ((IBooleanBeanProxy) result).booleanValue());
+	}
+
+	public void testConditionalAndExtended() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_CONDITIONAL_AND, 1);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, true);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, true);
+		exp.createInfixExpression(ForExpression.INFIX_EXTENDED, InfixOperator.IN_EQUALS, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 3);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 3);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("boolean", result.getTypeProxy().getTypeName());
+		assertEquals(true && true && (3 == 3), ((IBooleanBeanProxy) result).booleanValue());
+	}
+
+	public void testConditionalAndFalseLast() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_CONDITIONAL_AND, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, true);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, false);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("boolean", result.getTypeProxy().getTypeName());
+		assertEquals(true && false, ((IBooleanBeanProxy) result).booleanValue());
+	}
+
+	public void testConditionalAndFalseFirst() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_CONDITIONAL_AND, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, false);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, true);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("boolean", result.getTypeProxy().getTypeName());
+		assertEquals(false && true, ((IBooleanBeanProxy) result).booleanValue());
+	}
+
+	public void testConditionalAndExtendedAndFalseFirst() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_CONDITIONAL_AND, 1);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, false);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, true);
+		exp.createInfixExpression(ForExpression.INFIX_EXTENDED, InfixOperator.IN_EQUALS, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 3);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 3);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("boolean", result.getTypeProxy().getTypeName());
+		assertEquals(false && true && (3 == 3), ((IBooleanBeanProxy) result).booleanValue());
+	}
+
+	public void testConditionalOr() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_CONDITIONAL_OR, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, false);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, true);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("boolean", result.getTypeProxy().getTypeName());
+		assertEquals(false || true, ((IBooleanBeanProxy) result).booleanValue());
+	}
+
+	public void testConditionalOrExtended() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_CONDITIONAL_OR, 1);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, false);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, false);
+		exp.createInfixExpression(ForExpression.INFIX_EXTENDED, InfixOperator.IN_EQUALS, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 3);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 3);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("boolean", result.getTypeProxy().getTypeName());
+		assertEquals(false || false || (3 == 3), ((IBooleanBeanProxy) result).booleanValue());
+	}
+
+	public void testConditionalOrTrueFirst() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_CONDITIONAL_OR, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, true);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, false);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("boolean", result.getTypeProxy().getTypeName());
+		assertEquals(true || false, ((IBooleanBeanProxy) result).booleanValue());
+	}
+
+	public void testConditionalOrExtendedAndTrueMiddle() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_CONDITIONAL_OR, 1);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, false);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, true);
+		exp.createInfixExpression(ForExpression.INFIX_EXTENDED, InfixOperator.IN_EQUALS, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 3);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 3);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("boolean", result.getTypeProxy().getTypeName());
+		assertEquals(false || true || (3 == 3), ((IBooleanBeanProxy) result).booleanValue());
+	}
+
+	public void testArrayAccess() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IArrayBeanProxy array = proxyFactory.createBeanProxyWith(proxyTypeFactory.getBeanTypeProxy("short"), 1);
+		array.set(proxyFactory.createBeanProxyWith((short) 3), 0);
+		
+		IExpression exp = proxyFactory.createExpression();
+		exp.createArrayAccess(ForExpression.ROOTEXPRESSION, 1);
+		exp.createProxyExpression(ForExpression.ARRAYACCESS_ARRAY, array);
+		exp.createPrimitiveLiteral(ForExpression.ARRAYACCESS_INDEX, 0);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("short", result.getTypeProxy().getTypeName());
+		assertEquals(((INumberBeanProxy) result).shortValue(), (short) 3);
+	}
+	
+	public void testArrayAccessSet() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IArrayBeanProxy array = proxyFactory.createBeanProxyWith(proxyTypeFactory.getBeanTypeProxy("short"), 1);
+		array.set(proxyFactory.createBeanProxyWith((short) 3), 0);
+		
+		IExpression exp = proxyFactory.createExpression();
+		exp.createAssignmentExpression(ForExpression.ROOTEXPRESSION);
+		exp.createArrayAccess(ForExpression.ASSIGNMENT_LEFT, 1);
+		exp.createProxyExpression(ForExpression.ARRAYACCESS_ARRAY, array);
+		exp.createPrimitiveLiteral(ForExpression.ARRAYACCESS_INDEX, 0);
+		exp.createPrimitiveLiteral(ForExpression.ASSIGNMENT_RIGHT, (short) 33);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("short", result.getTypeProxy().getTypeName());
+		assertEquals(((INumberBeanProxy) result).shortValue(), (short) 33);
+	}
+	
+	
+	public void testMultiArrayAccess() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IArrayBeanProxy array = proxyFactory.createBeanProxyWith(proxyTypeFactory.getBeanTypeProxy("short"), new int[] {2,1});
+		array.set(proxyFactory.createBeanProxyWith((short) 3), new int[]{1,0});
+		
+		IExpression exp = proxyFactory.createExpression();
+		exp.createArrayAccess(ForExpression.ROOTEXPRESSION, 1);
+		exp.createProxyExpression(ForExpression.ARRAYACCESS_ARRAY, array);
+		exp.createPrimitiveLiteral(ForExpression.ARRAYACCESS_INDEX, 1);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("short[]", result.getTypeProxy().getFormalTypeName());
+	}
+
+	public void testMultiArrayAccessSet() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IArrayBeanProxy array = proxyFactory.createBeanProxyWith(proxyTypeFactory.getBeanTypeProxy("short"), new int[] {2,1});
+		array.set(proxyFactory.createBeanProxyWith((short) 3), new int[]{1,0});
+		
+		IExpression exp = proxyFactory.createExpression();
+		exp.createAssignmentExpression(ForExpression.ROOTEXPRESSION);
+		exp.createArrayAccess(ForExpression.ASSIGNMENT_LEFT, 1);
+		exp.createProxyExpression(ForExpression.ARRAYACCESS_ARRAY, array);
+		exp.createPrimitiveLiteral(ForExpression.ARRAYACCESS_INDEX, 1);
+		IArrayBeanProxy newArray = proxyFactory.createBeanProxyWith(proxyTypeFactory.getBeanTypeProxy("short"), new int[] {3});
+		exp.createProxyExpression(ForExpression.ASSIGNMENT_RIGHT, newArray);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("short[]", result.getTypeProxy().getFormalTypeName());
+		assertEquals(3, ((IArrayBeanProxy) result).getLength());
+	}
+
+	public void testMultiArrayAccess1() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IArrayBeanProxy array = proxyFactory.createBeanProxyWith(proxyTypeFactory.getBeanTypeProxy("short"), new int[] {2,1});
+		array.set(proxyFactory.createBeanProxyWith((short) 3), new int[]{1,0});
+		
+		IExpression exp = proxyFactory.createExpression();
+		exp.createArrayAccess(ForExpression.ROOTEXPRESSION, 2);
+		exp.createProxyExpression(ForExpression.ARRAYACCESS_ARRAY, array);
+		exp.createPrimitiveLiteral(ForExpression.ARRAYACCESS_INDEX, 1);
+		exp.createPrimitiveLiteral(ForExpression.ARRAYACCESS_INDEX, 0);		
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("short", result.getTypeProxy().getFormalTypeName());
+		assertEquals((short) 3, ((INumberBeanProxy) result).shortValue());
+	}
+	
+	public void testArrayCreation() throws IllegalStateException, IllegalArgumentException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createArrayCreation(ForExpression.ROOTEXPRESSION, "int[]", 1);
+		exp.createPrimitiveLiteral(ForExpression.ARRAYCREATION_DIMENSION, 2);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("int[]", result.getTypeProxy().getFormalTypeName());
+		assertEquals(2, ((IArrayBeanProxy) result).getLength());
+	}
+	
+	public void testMultiArrayCreation() throws IllegalStateException, IllegalArgumentException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createArrayCreation(ForExpression.ROOTEXPRESSION, "int[][]", 2);
+		exp.createPrimitiveLiteral(ForExpression.ARRAYCREATION_DIMENSION, 2);
+		exp.createPrimitiveLiteral(ForExpression.ARRAYCREATION_DIMENSION, 4);		
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("int[][]", result.getTypeProxy().getFormalTypeName());
+		assertEquals(2, ((IArrayBeanProxy) result).getLength());
+		assertEquals(4, ((IArrayBeanProxy)((IArrayBeanProxy) result).get(0)).getLength());
+	}	
+
+	public void testMultiPartialArrayCreation() throws IllegalStateException, IllegalArgumentException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createArrayCreation(ForExpression.ROOTEXPRESSION, "int[][][]", 2);
+		exp.createPrimitiveLiteral(ForExpression.ARRAYCREATION_DIMENSION, 2);
+		exp.createPrimitiveLiteral(ForExpression.ARRAYCREATION_DIMENSION, 4);		
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("int[][][]", result.getTypeProxy().getFormalTypeName());
+		assertEquals(2, ((IArrayBeanProxy) result).getLength());
+		assertEquals(4, ((IArrayBeanProxy)((IArrayBeanProxy) result).get(0)).getLength());
+		assertNull(((IArrayBeanProxy)((IArrayBeanProxy) result).get(0)).get(0));
+	}
+	
+	public void testArrayInitializerEmpty() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createArrayCreation(ForExpression.ROOTEXPRESSION, "int[]", 0);
+		exp.createArrayInitializer(0);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("int[]", result.getTypeProxy().getFormalTypeName());
+		assertEquals(0, ((IArrayBeanProxy) result).getLength());
+	}
+	
+	public void testArrayInitializerOneDim() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createArrayCreation(ForExpression.ROOTEXPRESSION, "int[]", 0);
+		exp.createArrayInitializer(1);
+		exp.createPrimitiveLiteral(ForExpression.ARRAYINITIALIZER_EXPRESSION, 3);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("int[]", result.getTypeProxy().getFormalTypeName());
+		assertEquals(1, ((IArrayBeanProxy) result).getLength());
+		assertEquals(3, ((INumberBeanProxy) ((IArrayBeanProxy) result).get(0)).intValue());
+	}
+	
+	public void testArrayInitializerTwoDimEmpty() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createArrayCreation(ForExpression.ROOTEXPRESSION, "int[][]", 0);
+		exp.createArrayInitializer(0);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("int[][]", result.getTypeProxy().getFormalTypeName());
+		assertEquals(0, ((IArrayBeanProxy) result).getLength());
+	}
+	
+	public void testArrayInitializerTwoDim() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createArrayCreation(ForExpression.ROOTEXPRESSION, "int[][]", 0);
+		exp.createArrayInitializer(1);
+		exp.createArrayInitializer(0);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("int[][]", result.getTypeProxy().getFormalTypeName());
+		assertEquals(1, ((IArrayBeanProxy) result).getLength());
+		assertEquals(0, ((IArrayBeanProxy) ((IArrayBeanProxy) result).get(0)).getLength());
+	}	
+
+	public void testArrayInitializerTwoDimNotEmpty() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createArrayCreation(ForExpression.ROOTEXPRESSION, "int[][]", 0);
+		exp.createArrayInitializer(2);
+		exp.createNull(ForExpression.ARRAYINITIALIZER_EXPRESSION);
+		exp.createArrayInitializer(2);
+		exp.createPrimitiveLiteral(ForExpression.ARRAYINITIALIZER_EXPRESSION, 3);
+		exp.createPrimitiveLiteral(ForExpression.ARRAYINITIALIZER_EXPRESSION, 4);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("int[][]", result.getTypeProxy().getFormalTypeName());
+		assertEquals(2, ((IArrayBeanProxy) result).getLength());
+		assertNull(((IArrayBeanProxy) result).get(0));
+		assertEquals(2, ((IArrayBeanProxy) ((IArrayBeanProxy) result).get(1)).getLength());
+		assertEquals(4, ((INumberBeanProxy)((IArrayBeanProxy) ((IArrayBeanProxy) result).get(1)).get(1)).intValue());		
+	}
+	
+	public void testArrayInitializerShortInt() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createArrayCreation(ForExpression.ROOTEXPRESSION, "short[]", 0);
+		exp.createArrayInitializer(1);
+		exp.createPrimitiveLiteral(ForExpression.ARRAYINITIALIZER_EXPRESSION, 3);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("short[]", result.getTypeProxy().getFormalTypeName());
+		assertEquals(1, ((IArrayBeanProxy) result).getLength());
+		assertEquals(3, ((INumberBeanProxy) ((IArrayBeanProxy) result).get(0)).intValue());
+	}
+	
+	public void testClassInstanceCreationDefault() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createClassInstanceCreation(ForExpression.ROOTEXPRESSION, "java.lang.Object", 0);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("java.lang.Object", result.getTypeProxy().getFormalTypeName());
+	}
+	
+	public void testClassInstanceCreationDefaultWithBeanTypeProxy() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createClassInstanceCreation(ForExpression.ROOTEXPRESSION, proxyTypeFactory.getBeanTypeProxy("java.lang.Object"), 0);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("java.lang.Object", result.getTypeProxy().getFormalTypeName());
+	}	
+	
+	public void testClassInstanceCreationOneArg() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createClassInstanceCreation(ForExpression.ROOTEXPRESSION, "java.lang.Integer", 1);
+		exp.createStringLiteral(ForExpression.CLASSINSTANCECREATION_ARGUMENT, "3");
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("java.lang.Integer", result.getTypeProxy().getFormalTypeName());
+		assertEquals(3, ((INumberBeanProxy) result).intValue());
+	}
+	
+	public void testClassInstanceCreationOneArgWithPrimWidening() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createClassInstanceCreation(ForExpression.ROOTEXPRESSION, "java.lang.Short", 1);
+		exp.createPrimitiveLiteral(ForExpression.CLASSINSTANCECREATION_ARGUMENT, (byte)3);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("java.lang.Short", result.getTypeProxy().getFormalTypeName());
+		assertEquals((short)3, ((INumberBeanProxy) result).shortValue());
+	}	
+	
+	public void testClassInstanceCreationNullArg() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createClassInstanceCreation(ForExpression.ROOTEXPRESSION, "testPackage.TestCtorWithNull", 1);
+		exp.createNull(ForExpression.CLASSINSTANCECREATION_ARGUMENT);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("testPackage.TestCtorWithNull", result.getTypeProxy().getFormalTypeName());
+	}	
+	
+	public void testClassInstanceCreationMismatchArg() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createClassInstanceCreation(ForExpression.ROOTEXPRESSION, "testPackage.TestCtorWithNull", 1);
+		try {
+			exp.createPrimitiveLiteral(ForExpression.CLASSINSTANCECREATION_ARGUMENT, 1);
+			exp.getExpressionValue();
+			fail("Exception should of been thrown.");
+		} catch (ThrowableProxy e) {
+			assertEquals("java.lang.NoSuchMethodException", e.getTypeProxy().getFormalTypeName());
+		}
+	}	
+	
+	public void testFieldAccessStatic() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createFieldAccess(ForExpression.ROOTEXPRESSION, "RED", true);
+		exp.createTypeReceiver("java.awt.Color");
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("java.awt.Color", result.getTypeProxy().getFormalTypeName());
+		IBeanTypeProxy colorType = result.getTypeProxy();
+		IMethodProxy red = colorType.getMethodProxy("getRed");
+		IMethodProxy green = colorType.getMethodProxy("getGreen");
+		IMethodProxy blue = colorType.getMethodProxy("getBlue");
+		assertEquals(255, ((INumberBeanProxy) red.invoke(result)).intValue());
+		assertEquals(0, ((INumberBeanProxy) green.invoke(result)).intValue());
+		assertEquals(0, ((INumberBeanProxy) blue.invoke(result)).intValue());
+	}
+	
+	public void testFieldAccessSetStatic() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createAssignmentExpression(ForExpression.ROOTEXPRESSION);
+		exp.createFieldAccess(ForExpression.ASSIGNMENT_LEFT, "STATIC_FIELD", true);
+		exp.createTypeReceiver("testPackage.TestAccess");
+		exp.createPrimitiveLiteral(ForExpression.ASSIGNMENT_RIGHT, 23);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("int", result.getTypeProxy().getFormalTypeName());
+		assertEquals(23, ((INumberBeanProxy) result).intValue());
+	}
+	
+	
+	public void testFieldAccessNonStatic() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createFieldAccess(ForExpression.ROOTEXPRESSION, "x", true);
+		exp.createClassInstanceCreation(ForExpression.FIELD_RECEIVER, "java.awt.Point", 2);
+		exp.createPrimitiveLiteral(ForExpression.CLASSINSTANCECREATION_ARGUMENT, 1);
+		exp.createPrimitiveLiteral(ForExpression.CLASSINSTANCECREATION_ARGUMENT, 2);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("int", result.getTypeProxy().getFormalTypeName());
+		assertEquals(1, ((INumberBeanProxy) result).intValue());
+	}
+	
+	public void testFieldAccessSetNonStatic() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createAssignmentExpression(ForExpression.ROOTEXPRESSION);
+		exp.createFieldAccess(ForExpression.ASSIGNMENT_LEFT, "x", true);
+		exp.createClassInstanceCreation(ForExpression.FIELD_RECEIVER, "java.awt.Point", 2);
+		exp.createPrimitiveLiteral(ForExpression.CLASSINSTANCECREATION_ARGUMENT, 1);
+		exp.createPrimitiveLiteral(ForExpression.CLASSINSTANCECREATION_ARGUMENT, 2);
+		exp.createPrimitiveLiteral(ForExpression.ASSIGNMENT_RIGHT, 23);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("int", result.getTypeProxy().getFormalTypeName());
+		assertEquals(23, ((INumberBeanProxy) result).intValue());
+	}	
+
+	public void testFieldAccessSetNonStaticSimple() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		// First create using normal proxy stuff, then test the expression processor.
+		IBeanTypeProxy pointType = proxyTypeFactory.getBeanTypeProxy("java.awt.Point");
+		IFieldProxy xFieldProxy = pointType.getFieldProxy("x");
+		IBeanProxy pointProxy = pointType.getConstructorProxy(new String[] {"int", "int"}).newInstance(new IBeanProxy[] {proxyFactory.createBeanProxyWith(1), proxyFactory.createBeanProxyWith(2)});
+		
+		IExpression exp = proxyFactory.createExpression();
+		ExpressionProxy ep = exp.createSimpleFieldSet(xFieldProxy, pointProxy, proxyFactory.createBeanProxyWith(23), true);
+		ep.addProxyListener(new ExpressionResolved() {
+
+			/* (non-Javadoc)
+			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
+			 */
+			public void proxyResolved(ProxyEvent event) {
+				IBeanProxy result = event.getProxy();
+				assertNotNull(result);
+				assertEquals("int", result.getTypeProxy().getFormalTypeName());
+				assertEquals(23, ((INumberBeanProxy) result).intValue());
+			}
+		});
+		exp.invokeExpression();
+	}
+
+	public void testFieldAccessNonStaticSimple() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		// First create using normal proxy stuff, then test the expression processor.
+		IBeanTypeProxy pointType = proxyTypeFactory.getBeanTypeProxy("java.awt.Point");
+		IFieldProxy xFieldProxy = pointType.getFieldProxy("x");
+		IBeanProxy pointProxy = pointType.getConstructorProxy(new String[] {"int", "int"}).newInstance(new IBeanProxy[] {proxyFactory.createBeanProxyWith(1), proxyFactory.createBeanProxyWith(2)});
+		
+		IExpression exp = proxyFactory.createExpression();
+		ExpressionProxy ep = exp.createSimpleFieldAccess(xFieldProxy, pointProxy);
+		ep.addProxyListener(new ExpressionResolved() {
+
+			/* (non-Javadoc)
+			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
+			 */
+			public void proxyResolved(ProxyEvent event) {
+				IBeanProxy result = event.getProxy();
+				assertNotNull(result);
+				assertEquals("int", result.getTypeProxy().getFormalTypeName());
+				assertEquals(1, ((INumberBeanProxy) result).intValue());
+			}
+		});
+		exp.invokeExpression();
+	}
+
+	public void testFieldAccessNonStaticWithProxy() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IBeanTypeProxy pointType = proxyTypeFactory.getBeanTypeProxy("java.awt.Point");
+		IExpression exp = proxyFactory.createExpression();
+		exp.createFieldAccess(ForExpression.ROOTEXPRESSION, pointType.getFieldProxy("x"), true);
+		exp.createClassInstanceCreation(ForExpression.FIELD_RECEIVER, "java.awt.Point", 2);
+		exp.createPrimitiveLiteral(ForExpression.CLASSINSTANCECREATION_ARGUMENT, 1);
+		exp.createPrimitiveLiteral(ForExpression.CLASSINSTANCECREATION_ARGUMENT, 2);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("int", result.getTypeProxy().getFormalTypeName());
+		assertEquals(1, ((INumberBeanProxy) result).intValue());
+	}	
+	
+	public void testFieldAccessFailWithExpressionProxy() throws IllegalStateException, NoExpressionValueException {
+		IBeanTypeProxy pointType = proxyTypeFactory.getBeanTypeProxy("java.awt.Point");
+		IExpression exp = proxyFactory.createExpression();
+		try {
+			exp.createFieldAccess(ForExpression.ROOTEXPRESSION, pointType.getFieldProxy(exp, "z"), true);
+			exp.createClassInstanceCreation(ForExpression.FIELD_RECEIVER, "java.awt.Point", 2);
+			exp.createPrimitiveLiteral(ForExpression.CLASSINSTANCECREATION_ARGUMENT, 1);
+			exp.createPrimitiveLiteral(ForExpression.CLASSINSTANCECREATION_ARGUMENT, 2);
+			exp.getExpressionValue();
+			fail("Should of had exception");
+		} catch (ThrowableProxy e) {
+			assertEquals("java.lang.NoSuchFieldException", e.getTypeProxy().getFormalTypeName());
+		}
+	}
+
+	public void testMethodInvokeStatic() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createMethodInvocation(ForExpression.ROOTEXPRESSION, "valueOf", true, 1);
+		exp.createTypeReceiver("java.lang.String");
+		exp.createPrimitiveLiteral(ForExpression.METHOD_ARGUMENT, true);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("java.lang.String", result.getTypeProxy().getFormalTypeName());
+		assertEquals("true", ((IStringBeanProxy) result).stringValue());
+	}
+	
+	public void testMethodInvokeProxyFail() throws IllegalStateException, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		IBeanTypeProxy intType = proxyTypeFactory.getBeanTypeProxy("java.lang.Integer");
+		try {
+			exp.createMethodInvocation(ForExpression.ROOTEXPRESSION, intType.getMethodProxy(exp, "goobldy-gook"), true, 1);
+			exp.createClassInstanceCreation(ForExpression.METHOD_RECEIVER, intType, 1);
+			exp.createPrimitiveLiteral(ForExpression.CLASSINSTANCECREATION_ARGUMENT, 3);
+			exp.createClassInstanceCreation(ForExpression.METHOD_ARGUMENT, "java.lang.Integer", 1);
+			exp.createPrimitiveLiteral(ForExpression.CLASSINSTANCECREATION_ARGUMENT, 4);
+			exp.getExpressionValue();
+			fail("Should of gotten exception");
+		} catch (ThrowableProxy e) {
+			assertEquals("java.lang.NoSuchMethodException", e.getTypeProxy().getFormalTypeName());
+		}
+	}
+
+	public void testMethodInvokeNonStatic() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createMethodInvocation(ForExpression.ROOTEXPRESSION, "compareTo", true, 1);
+		exp.createClassInstanceCreation(ForExpression.METHOD_RECEIVER, "java.lang.Integer", 1);
+		exp.createPrimitiveLiteral(ForExpression.CLASSINSTANCECREATION_ARGUMENT, 3);
+		exp.createClassInstanceCreation(ForExpression.METHOD_ARGUMENT, "java.lang.Integer", 1);
+		exp.createPrimitiveLiteral(ForExpression.CLASSINSTANCECREATION_ARGUMENT, 4);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("int", result.getTypeProxy().getFormalTypeName());
+		assertTrue("CompareTo wasn't less than 0.", ((INumberBeanProxy) result).intValue() < 0);
+	}
+	
+	public void testMethodInvokeNonStaticWithProxy() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IBeanTypeProxy integerType = proxyTypeFactory.getBeanTypeProxy("java.lang.Integer");
+		IExpression exp = proxyFactory.createExpression();
+		exp.createMethodInvocation(ForExpression.ROOTEXPRESSION, integerType.getMethodProxy("compareTo", new IBeanTypeProxy[] {integerType}), true, 1);
+		exp.createClassInstanceCreation(ForExpression.METHOD_RECEIVER, "java.lang.Integer", 1);
+		exp.createPrimitiveLiteral(ForExpression.CLASSINSTANCECREATION_ARGUMENT, 3);
+		exp.createClassInstanceCreation(ForExpression.METHOD_ARGUMENT, "java.lang.Integer", 1);
+		exp.createPrimitiveLiteral(ForExpression.CLASSINSTANCECREATION_ARGUMENT, 4);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("int", result.getTypeProxy().getFormalTypeName());
+		assertTrue("CompareTo wasn't less than 0.", ((INumberBeanProxy) result).intValue() < 0);
+	}
+	
+	public void testConditionalTrue() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createConditionalExpression(ForExpression.ROOTEXPRESSION);
+		exp.createInfixExpression(ForExpression.CONDITIONAL_CONDITION, InfixOperator.IN_EQUALS, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 3);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
+		exp.createInfixExpression(ForExpression.CONDITIONAL_TRUE, InfixOperator.IN_PLUS, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 3);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
+		exp.createInfixExpression(ForExpression.CONDITIONAL_FALSE, InfixOperator.IN_MINUS, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 3);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("int", result.getTypeProxy().getFormalTypeName());
+		assertEquals(6, ((INumberBeanProxy) result).intValue());
+	}
+	
+	public void testConditionalFalse() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createConditionalExpression(ForExpression.ROOTEXPRESSION);
+		exp.createInfixExpression(ForExpression.CONDITIONAL_CONDITION, InfixOperator.IN_EQUALS, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 4);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
+		exp.createInfixExpression(ForExpression.CONDITIONAL_TRUE, InfixOperator.IN_PLUS, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 3);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
+		exp.createInfixExpression(ForExpression.CONDITIONAL_FALSE, InfixOperator.IN_MINUS, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 3);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("int", result.getTypeProxy().getFormalTypeName());
+		assertEquals(0, ((INumberBeanProxy) result).intValue());
+	}
+	
+	public void testNestedConditionalTrueTrue() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createConditionalExpression(ForExpression.ROOTEXPRESSION);
+		exp.createInfixExpression(ForExpression.CONDITIONAL_CONDITION, InfixOperator.IN_EQUALS, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 3);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
+		exp.createConditionalExpression(ForExpression.CONDITIONAL_TRUE);
+		exp.createInfixExpression(ForExpression.CONDITIONAL_CONDITION, InfixOperator.IN_EQUALS, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 3);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
+		exp.createInfixExpression(ForExpression.CONDITIONAL_TRUE, InfixOperator.IN_PLUS, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 4);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 4);
+		exp.createInfixExpression(ForExpression.CONDITIONAL_FALSE, InfixOperator.IN_MINUS, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 4);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
+		exp.createInfixExpression(ForExpression.CONDITIONAL_FALSE, InfixOperator.IN_MINUS, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 5);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("int", result.getTypeProxy().getFormalTypeName());
+		assertEquals(8, ((INumberBeanProxy) result).intValue());
+	}
+	
+	public void testNestedConditionalFalseFalse() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createConditionalExpression(ForExpression.ROOTEXPRESSION);
+		exp.createInfixExpression(ForExpression.CONDITIONAL_CONDITION, InfixOperator.IN_EQUALS, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 3);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 2);
+		exp.createConditionalExpression(ForExpression.CONDITIONAL_TRUE);
+		exp.createInfixExpression(ForExpression.CONDITIONAL_CONDITION, InfixOperator.IN_EQUALS, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 2);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
+		exp.createInfixExpression(ForExpression.CONDITIONAL_TRUE, InfixOperator.IN_PLUS, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 4);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 4);
+		exp.createInfixExpression(ForExpression.CONDITIONAL_FALSE, InfixOperator.IN_MINUS, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 4);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
+		exp.createInfixExpression(ForExpression.CONDITIONAL_FALSE, InfixOperator.IN_MINUS, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 5);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("int", result.getTypeProxy().getFormalTypeName());
+		assertEquals(2, ((INumberBeanProxy) result).intValue());
+	}	
+	
+	public void testVoidReturnType() throws IllegalStateException, ThrowableProxy {
+		IExpression exp = proxyFactory.createExpression();
+		try {
+			exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_PLUS, 0);
+			exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 3);
+			exp.createMethodInvocation(ForExpression.INFIX_RIGHT, "gc", true, 0);
+			exp.createTypeReceiver("java.lang.System");
+			exp.getExpressionValue();
+			fail("Should of received no expression value exception.");
+		} catch (NoExpressionValueException e) {
+			if (e.getLocalizedMessage() != null)
+				System.out.println("Test was successful: "+e.getLocalizedMessage());
+		}
+	}
+	
+	public void testWrongReturnType() throws ThrowableProxy, IllegalStateException, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		try {
+			exp.createInfixExpression(ForExpression.ROOTEXPRESSION, InfixOperator.IN_PLUS, 0);
+			exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, 3);
+			exp.createMethodInvocation(ForExpression.INFIX_RIGHT, "getSecurityManager", true, 0);
+			exp.createTypeReceiver("java.lang.System");
+			exp.getExpressionValue();
+			fail("Should of received class cast proxy exception.");
+		} catch (ThrowableProxy e) {
+			if (!e.getTypeProxy().getFormalTypeName().equals("java.lang.IllegalArgumentException"))
+				throw e;	// Some other exception, rethrow it.
+		}
+	}
+	
+	public void testInvoke() throws ThrowableProxy, IllegalStateException, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createMethodInvocation(ForExpression.ROOTEXPRESSION, "getSecurityManager", true, 0);
+		exp.createTypeReceiver("java.lang.System");
+		exp.invokeExpression();
+	}
+	
+	public void testInvokeFail() throws ThrowableProxy, IllegalStateException, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		try {
+			exp.createMethodInvocation(ForExpression.ROOTEXPRESSION, "getenv", true, 1);
+			exp.createTypeReceiver("java.lang.System");
+			exp.createStringLiteral(ForExpression.METHOD_ARGUMENT, "xyz");
+			exp.invokeExpression();
+		} catch (ThrowableProxy e) {
+			if (!e.getTypeProxy().getFormalTypeName().equals("java.lang.Error"))
+				throw e;	// Some other exception, rethrow it.
+		}
+	}
+	
+	public void testAssignment() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		ExpressionProxy ep = exp.createProxyAssignmentExpression(ForExpression.ROOTEXPRESSION);
+		final long[] time = new long[1];
+		ep.addProxyListener(new ExpressionResolved() {
+			
+			/* (non-Javadoc)
+			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyAdapter#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
+			 */
+			public void proxyResolved(ProxyEvent event) {
+				time[0] = ((INumberBeanProxy) event.getProxy()).longValue();
+			}
+		});
+		exp.createMethodInvocation(ForExpression.ASSIGNMENT_RIGHT, "currentTimeMillis", true, 0);
+		exp.createTypeReceiver("java.lang.System");
+		exp.invokeExpression();
+		assertTrue(0L != time[0]);
+	}
+	
+	public void testReassignment() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		ExpressionProxy ep = exp.createProxyAssignmentExpression(ForExpression.ROOTEXPRESSION);
+		final long[] time = new long[1];
+		ep.addProxyListener(new ExpressionResolved() {
+			
+			/* (non-Javadoc)
+			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyAdapter#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
+			 */
+			public void proxyResolved(ProxyEvent event) {
+				time[0] = ((INumberBeanProxy) event.getProxy()).longValue();
+			}
+		});
+		exp.createMethodInvocation(ForExpression.ASSIGNMENT_RIGHT, "currentTimeMillis", true, 0);
+		exp.createTypeReceiver("java.lang.System");
+		exp.createProxyReassignmentExpression(ForExpression.ROOTEXPRESSION, ep);
+		exp.createPrimitiveLiteral(ForExpression.ASSIGNMENT_RIGHT, -23L);
+		exp.invokeExpression();
+		assertEquals(-23L, time[0]);
+	}
+	
+	public void testAssignmentVoid() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		ExpressionProxy ep = exp.createProxyAssignmentExpression(ForExpression.ROOTEXPRESSION);
+		ExpressionVoid epl = new ExpressionVoid();
+		ep.addProxyListener(epl);
+		exp.createMethodInvocation(ForExpression.ASSIGNMENT_RIGHT, "testVoid", true, 0);
+		exp.createTypeReceiver("testPackage.TestAccess");
+		exp.invokeExpression();
+		assertTrue(epl.voidCalled);
+	}
+	
+	public void testAssignmentNot() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createConditionalExpression(ForExpression.ROOTEXPRESSION);
+		exp.createPrimitiveLiteral(ForExpression.CONDITIONAL_CONDITION, true);
+		exp.createPrimitiveLiteral(ForExpression.CONDITIONAL_TRUE, true);
+		ExpressionProxy ep = exp.createProxyAssignmentExpression(ForExpression.CONDITIONAL_FALSE);
+		exp.createPrimitiveLiteral(ForExpression.ASSIGNMENT_RIGHT, false);
+		ExpressionNotResolved epl = new ExpressionNotResolved();
+		ep.addProxyListener(epl);
+		exp.invokeExpression();
+		assertTrue(epl.notResolvedCalled);
+	}
+
+	public void testAssignmentLaterUsage() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		// eparg = 3;
+		// epInteger = new Integer(eparg+1);
+		IExpression exp = proxyFactory.createExpression();
+		ExpressionProxy epArg = exp.createProxyAssignmentExpression(ForExpression.ROOTEXPRESSION); 
+		exp.createPrimitiveLiteral(ForExpression.ASSIGNMENT_RIGHT, 3);
+		ExpressionProxy epInteger = exp.createProxyAssignmentExpression(ForExpression.ROOTEXPRESSION);
+		exp.createClassInstanceCreation(ForExpression.ASSIGNMENT_RIGHT, proxyTypeFactory.getBeanTypeProxy("java.lang.Integer"), 1);
+		exp.createInfixExpression(ForExpression.CLASSINSTANCECREATION_ARGUMENT, InfixOperator.IN_PLUS, 0);
+		exp.createProxyExpression(ForExpression.INFIX_LEFT, epArg);	// Use literal 3+1 as the argument to this.
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 1); 
+		epInteger.addProxyListener(new ExpressionResolved() {
+			
+			
+			/* (non-Javadoc)
+			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyAdapter#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
+			 */
+			public void proxyResolved(ProxyEvent event) {
+				assertEquals(((INumberBeanProxy) event.getProxy()).intValue(), 4);
+			}			
+		});
+		exp.invokeExpression();
+	}
+	
+	// TODO - for some unknown reason this test continues to fail in the build on the jvelinux machine. It seems to have
+	// very very poor performance on jvelinux.
+	// If we can get it working, put "test" on the front of the method name again to get it running as a test.
+	public void ExpressionPerformanceSmall() throws IllegalStateException, NoExpressionValueException, ThrowableProxy, AmbiguousMethodException, NoSuchMethodException {
+		// Small performance test. We are testing a small batch of expressions on each run. We then avg. the runs. This tests many small
+		// expression processing performance.
+		 
+		// Prime the proxies so they don't become part of the timings.
+		IBeanTypeProxy pointType = proxyTypeFactory.getBeanTypeProxy("java.awt.Point");
+		IMethodProxy setLocation = pointType.getMethodProxy("setLocation", new String[] {"int", "int"});
+		IMethodProxy getLocation = pointType.getMethodProxy("getLocation");
+		//
+		// Now for just a simple one method invocation using method proxies (and not method lookup each time) the standard proxy calls
+		// will beat out expression processing for Remote. Note that is not true of IDE vm. In that case the standard proxy calls
+		// will ALWAYS out perform greatly the expression processer because there is no latency in the communications. It is basically
+		// straight direct calls. While expression processing is also direct calls, the call path is much larger because it needs to 
+		// build/maintain/execute the processing stack, rather than just execute the command. 
+		//
+		
+		// Try to prime the communication pump. This sends about 36,000 bytes of data.
+		// Doing it here means later when needed the communications costs are drastically reduced.
+		IExpression exp = proxyFactory.createExpression();
+		int i =1000;
+		while (i-->0) {
+			exp.createArrayCreation(ForExpression.ROOTEXPRESSION, registry.getBeanTypeProxyFactory()
+					.getBeanTypeProxy(exp, "java.lang.Object", 1), 0);
+			exp.createArrayInitializer(0);
+		}
+		exp.invokeExpression();
+		
+		int times = 100;	// Number of times to run the test.
+		int batchSize = 10;	// Size of batch for each test.		
+		// Now do the actual test.
+		long start = System.currentTimeMillis();
+		i = times;
+		while(i-->0) {
+			expressionSetting(pointType, setLocation, getLocation, batchSize);
+		}
+		
+		long expressionTime = System.currentTimeMillis()-start;
+		long startNormal = System.currentTimeMillis();
+		i = times;
+		while(i-->0) {
+			normalSetting(pointType, setLocation, getLocation, batchSize);
+		}
+		long normalTime = System.currentTimeMillis()-startNormal;
+		System.out.println("Small Batch results: Batch size="+batchSize+" Number of runs="+times);
+		System.out.println("Expression Time: " + expressionTime + " Avg: " + (expressionTime/((double) times)));
+		System.out.println("Normal Time: " + normalTime+ " Avg: " + (normalTime/((double) times)));
+		if (normalTime == 0)
+			normalTime = 1;	// So no divide by zero.
+		int improvement = (int) ((1-((double) expressionTime)/normalTime)*100);
+		System.out.println("Improvement of expression over normal time: "+improvement+'%');
+		// Note that this test is not valid for IDE because the IDE will always be other way around because
+		// there is no latency delay there.
+
+		if (!(proxyFactory instanceof IDEStandardBeanProxyFactory))
+			assertTrue("Less than 30% improvement: "+improvement+'%', improvement>=30);	// We like this %.
+	}
+
+	// TODO - for some unknown reason this test continues to fail in the build on the jvelinux machine. It seems to have
+	// very very poor performance on jvelinux.
+	// If we can get it working, put "test" on the front of the method name again to get it running as a test.
+	public void ExpressionPerformanceLarge() throws IllegalStateException, NoExpressionValueException, ThrowableProxy, AmbiguousMethodException, NoSuchMethodException {
+		// Small performance test. We are testing a large batch of expressions on each run. We then avg. the runs. This tests many large
+		// expression processing performance.
+		 
+		// Prime the proxies so they don't become part of the timings.
+		IBeanTypeProxy pointType = proxyTypeFactory.getBeanTypeProxy("java.awt.Point");
+		IMethodProxy setLocation = pointType.getMethodProxy("setLocation", new String[] {"int", "int"});
+		IMethodProxy getLocation = pointType.getMethodProxy("getLocation");
+		//
+		// Now for just a simple one method invocation using method proxies (and not method lookup each time) the standard proxy calls
+		// will beat out expression processing for Remote. Note that is not true of IDE vm. In that case the standard proxy calls
+		// will ALWAYS out perform greatly the expression processer because there is no latency in the communications. It is basically
+		// straight direct calls. While expression processing is also direct calls, the call path is much larger because it needs to 
+		// build/maintain/execute the processing stack, rather than just execute the command. 
+		//
+		
+		// Try to prime the communication pump. This sends about 36,000 bytes of data.
+		// Doing it here means later when needed the communications costs are drastically reduced.
+		IExpression exp = proxyFactory.createExpression();
+		int i =1000;
+		while (i-->0) {
+			exp.createArrayCreation(ForExpression.ROOTEXPRESSION, registry.getBeanTypeProxyFactory()
+					.getBeanTypeProxy(exp, "java.lang.Object", 1), 0);
+			exp.createArrayInitializer(0);
+		}
+		exp.invokeExpression();
+		
+		int times = 25;	// Number of times to run the test.
+		int batchSize = 100;	// Size of batch for each test.
+		
+		// Now do the actual test.
+		long start = System.currentTimeMillis();
+		i = times;
+		while(i-->0) {
+			expressionSetting(pointType, setLocation, getLocation, batchSize);
+		}
+		long expressionTime = System.currentTimeMillis()-start;
+		long startNormal = System.currentTimeMillis();
+		i = times;
+		while(i-->0) {
+			normalSetting(pointType, setLocation, getLocation, batchSize);
+		}
+		long normalTime = System.currentTimeMillis()-startNormal;
+		System.out.println("Large Batch results: Batch size="+batchSize+" Number of runs="+times);
+		System.out.println("Expression Time: " + expressionTime + " Avg: " + (expressionTime/((double) times)));
+		System.out.println("Normal Time: " + normalTime+ " Avg: " + (normalTime/((double) times)));
+		if (normalTime == 0)
+			normalTime = 1;	// So no divide by zero.
+		int improvement = (int) ((1-((double) expressionTime)/normalTime)*100);
+		System.out.println("Improvement of expression over normal time: "+improvement+'%');
+		// Note that this test is not valid for IDE because the IDE will always be other way around because
+		// there is no latency delay there.
+		if (!(proxyFactory instanceof IDEStandardBeanProxyFactory))
+			assertTrue("Less than 75% improvement: "+improvement+'%', improvement>=75);	// We like this %.
+	}
+	
+	private void expressionSetting(IBeanTypeProxy pointType, IMethodProxy setLocation, IMethodProxy getLocation, int times) throws ThrowableProxy, NoExpressionValueException {
+		// This is the same as expressionSetting except it uses regular proxy access instead of expressions. It should be
+		// slower because it requires a round trip for each access. For remote only.
+		// To factor out the overhead of the initialization of the expression processing, we will do the create/set/get 10 times.
+		// Point p = new Point();
+		// p.setLocation(3,4);
+		// p.getLocation();
+		IExpression exp = proxyFactory.createExpression();
+		for (int i = 0; i < times; i++) {
+			ExpressionProxy epPoint = exp.createProxyAssignmentExpression(ForExpression.ROOTEXPRESSION);
+			exp.createClassInstanceCreation(ForExpression.ASSIGNMENT_RIGHT, pointType, 0);
+			exp.createSimpleMethodInvoke(setLocation, epPoint, new IProxy[] {proxyFactory.createBeanProxyWith(3), proxyFactory.createBeanProxyWith(4)}, false);
+			ExpressionProxy epLoc = exp.createSimpleMethodInvoke(getLocation, epPoint, null, true);
+			epLoc.addProxyListener(new ExpressionProxy.ProxyAdapter()); // Just have a listener, we want the callback overhead added in.
+		}
+		exp.invokeExpression();
+	}
+
+	private void normalSetting(IBeanTypeProxy pointType, IMethodProxy setLocation, IMethodProxy getLocation, int times) throws ThrowableProxy, AmbiguousMethodException, NoSuchMethodException {
+		// This is the same as expressionSetting except it uses regular proxy access instead of expressions. It should be
+		// slower because it requires a round trip for each access.
+		// To factor out the overhead of the initialization of the expression processing, we will do the create/set/get 10 times. This here matches that.
+		// Point p = new Point();
+		// p.setLocation(3,4);
+		for (int i = 0; i < times; i++) {
+			IBeanProxy epPoint = pointType.newInstance();
+			setLocation.invokeCatchThrowableExceptions(epPoint,	new IBeanProxy[] {proxyFactory.createBeanProxyWith(3), proxyFactory.createBeanProxyWith(4)});
+			getLocation.invokeCatchThrowableExceptions(epPoint);
+		}
+	}
+	
+	public void testBlock() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		int blocknum = exp.createBlockBegin();
+		ExpressionProxy epArg = exp.createProxyAssignmentExpression(ForExpression.ROOTEXPRESSION); 
+		exp.createPrimitiveLiteral(ForExpression.ASSIGNMENT_RIGHT, true);
+		exp.createBlockBreak(blocknum);
+		ExpressionProxy epBoolean = exp.createProxyAssignmentExpression(ForExpression.ROOTEXPRESSION);
+		exp.createClassInstanceCreation(ForExpression.ASSIGNMENT_RIGHT, proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean"), 1);
+		exp.createInfixExpression(ForExpression.CLASSINSTANCECREATION_ARGUMENT, InfixOperator.IN_CONDITIONAL_AND, 0);
+		exp.createProxyExpression(ForExpression.INFIX_LEFT, epArg);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, true);
+		exp.createBlockEnd();
+		ExpressionNotResolved epBooleanl = new ExpressionNotResolved();
+		epBoolean.addProxyListener(epBooleanl);
+		exp.invokeExpression();
+		assertTrue(epBooleanl.notResolvedCalled);
+	}
+
+	/*
+	 * A proxy listener class for test purposes that requires resolved but
+	 * won't allow not resolved or void resolution. Impliment the resolved
+	 * method to test for valid values.
+	 * 
+	 * @since 1.1.0
+	 */
+	protected abstract class ExpressionResolved implements ExpressionProxy.ProxyListener {
+		
+		/* (non-Javadoc)
+		 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyNotResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
+		 */
+		public void proxyNotResolved(ProxyEvent event) {
+			fail("Proxy must not be unresolved.");
+		}
+		
+		
+		/* (non-Javadoc)
+		 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyVoid(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
+		 */
+		public void proxyVoid(ProxyEvent event) {
+			fail("Proxy must not be void assignment.");
+		}
+	}
+	
+	protected class ExpressionNotResolved implements ExpressionProxy.ProxyListener {
+		public boolean notResolvedCalled = false;
+		
+		
+		/* (non-Javadoc)
+		 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyNotResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
+		 */
+		public void proxyNotResolved(ProxyEvent event) {
+			notResolvedCalled = true;
+		}
+		
+		/* (non-Javadoc)
+		 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
+		 */
+		public void proxyResolved(ProxyEvent event) {
+			fail("Proxy should not of been resolved. It should be unresolved.");
+		}
+		
+		/* (non-Javadoc)
+		 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyVoid(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
+		 */
+		public void proxyVoid(ProxyEvent event) {
+			fail("Proxy must not be void assignment. It should be unresolved.");
+		}
+	};
+
+	protected class ExpressionVoid implements ExpressionProxy.ProxyListener {
+		public boolean voidCalled = false;
+		
+		
+		/* (non-Javadoc)
+		 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyNotResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
+		 */
+		public void proxyNotResolved(ProxyEvent event) {
+			fail("Proxy should of been void and not unresolved.");
+		}
+		
+		/* (non-Javadoc)
+		 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
+		 */
+		public void proxyResolved(ProxyEvent event) {
+			fail("Proxy should not of been resolved, it should of been void..");
+		}
+		
+		/* (non-Javadoc)
+		 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyVoid(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
+		 */
+		public void proxyVoid(ProxyEvent event) {
+			voidCalled = true;
+		}
+	};
+
+	public void testTryCatchNoThrow() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		/*
+		 * try {
+		 *   x = Boolean.valueOf(true);
+		 * } catch (RuntimeException e) {
+		 *   y = Boolean.valueOf(false);
+		 * }
+		 */
+		IExpression exp = proxyFactory.createExpression();
+		exp.createTry();
+		ExpressionProxy xProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(true)}, true);
+		ExpressionProxy runtimeCatchExceptionProxy = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.RuntimeException"), true);
+		ExpressionProxy yProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);
+		exp.createTryEnd();
+		xProxy.addProxyListener(new ExpressionResolved() {
+
+			/* (non-Javadoc)
+			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
+			 */
+			public void proxyResolved(ProxyEvent event) {
+				IBeanProxy proxy = event.getProxy();
+				assertEquals("Not a Boolean proxy:"+proxy.getTypeProxy().getTypeName(), proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean"), proxy.getTypeProxy());
+				assertTrue(((IBooleanBeanProxy) event.getProxy()).booleanValue());
+			}
+		});
+
+		ExpressionNotResolved yProxyResolver = new ExpressionNotResolved();
+		yProxy.addProxyListener(yProxyResolver);
+		ExpressionNotResolved runtimeCatchExceptionProxyResolver = new ExpressionNotResolved();
+		runtimeCatchExceptionProxy.addProxyListener(runtimeCatchExceptionProxyResolver);
+		exp.invokeExpression();
+		
+		assertTrue(yProxyResolver.notResolvedCalled);
+		assertTrue(runtimeCatchExceptionProxyResolver.notResolvedCalled);
+		
+	}
+
+	public void testTry2CatchNoThrow() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		/*
+		 * try {
+		 *   try {
+		 *     x = Boolean.valueOf(true);
+		 *   } catch (RuntimeException e) {
+		 *     y = Boolean.valueOf(false);
+		 *   }
+		 * } catch (RuntimeException e) {
+		 *   z = Boolean.valueOf(false);
+		 * }
+		 */
+		IExpression exp = proxyFactory.createExpression();
+		exp.createTry();
+		exp.createTry();
+		ExpressionProxy xProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(true)}, true);
+		ExpressionProxy runtimeCatchExceptionProxy = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.RuntimeException"), true);
+		ExpressionProxy yProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);
+		exp.createTryEnd();
+		ExpressionProxy runtimeCatchExceptionProxy2 = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.RuntimeException"), true);
+		ExpressionProxy zProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);
+		exp.createTryEnd();
+
+		xProxy.addProxyListener(new ExpressionResolved() {
+
+			/* (non-Javadoc)
+			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
+			 */
+			public void proxyResolved(ProxyEvent event) {
+				IBeanProxy proxy = event.getProxy();
+				assertEquals("Not a Boolean proxy:"+proxy.getTypeProxy().getTypeName(), proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean"), proxy.getTypeProxy());
+				assertTrue(((IBooleanBeanProxy) event.getProxy()).booleanValue());
+			}
+		});
+
+		ExpressionNotResolved yProxyResolver = new ExpressionNotResolved();
+		yProxy.addProxyListener(yProxyResolver);
+		ExpressionNotResolved runtimeCatchExceptionProxyResolver = new ExpressionNotResolved();
+		runtimeCatchExceptionProxy.addProxyListener(runtimeCatchExceptionProxyResolver);
+		ExpressionNotResolved zProxyResolver = new ExpressionNotResolved();
+		zProxy.addProxyListener(zProxyResolver);
+		ExpressionNotResolved runtimeCatchExceptionProxyResolver2 = new ExpressionNotResolved();
+		runtimeCatchExceptionProxy2.addProxyListener(runtimeCatchExceptionProxyResolver2);
+		
+		exp.invokeExpression();
+		
+		assertTrue(yProxyResolver.notResolvedCalled);
+		assertTrue(runtimeCatchExceptionProxyResolver.notResolvedCalled);
+		assertTrue(zProxyResolver.notResolvedCalled);
+		assertTrue(runtimeCatchExceptionProxyResolver2.notResolvedCalled);
+		
+	}
+
+	public void testTry2CatchThrowTry1() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		/*
+		 * try {
+		 *   w = (null).booleanValue();
+		 *   try {
+		 *     x = Boolean.valueOf(true);
+		 *   } catch (RuntimeException e) {
+		 *     y = Boolean.valueOf(false);
+		 *   }
+		 * } catch (RuntimeException e) {
+		 *   z = Boolean.valueOf(false);
+		 * }
+		 */
+		IExpression exp = proxyFactory.createExpression();
+		exp.createTry();
+		ExpressionProxy wProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("booleanValue"), null, null, true);		
+		exp.createTry();
+		ExpressionProxy xProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(true)}, true);
+		ExpressionProxy runtimeCatchExceptionProxy = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.RuntimeException"), true);
+		ExpressionProxy yProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);
+		exp.createTryEnd();
+		ExpressionProxy runtimeCatchExceptionProxy2 = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.RuntimeException"), true);
+		ExpressionProxy zProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);
+		exp.createTryEnd();
+
+		ExpressionNotResolved wProxyResolver = new ExpressionNotResolved();
+		wProxy.addProxyListener(wProxyResolver);
+
+		ExpressionNotResolved xProxyResolver = new ExpressionNotResolved();
+		xProxy.addProxyListener(xProxyResolver);
+
+		ExpressionNotResolved yProxyResolver = new ExpressionNotResolved();
+		yProxy.addProxyListener(yProxyResolver);
+		ExpressionNotResolved runtimeCatchExceptionProxyResolver = new ExpressionNotResolved();
+		runtimeCatchExceptionProxy.addProxyListener(runtimeCatchExceptionProxyResolver);
+		zProxy.addProxyListener(new ExpressionResolved() {
+
+			/* (non-Javadoc)
+			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
+			 */
+			public void proxyResolved(ProxyEvent event) {
+				IBeanProxy proxy = event.getProxy();
+				assertEquals("Not a Boolean proxy:"+proxy.getTypeProxy().getTypeName(), proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean"), proxy.getTypeProxy());
+				assertFalse(((IBooleanBeanProxy) event.getProxy()).booleanValue());
+			}
+		});
+		runtimeCatchExceptionProxy2.addProxyListener(new ExpressionResolved() {
+			/* (non-Javadoc)
+			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
+			 */
+			public void proxyResolved(ProxyEvent event) {
+				assertEquals("java.lang.NullPointerException", event.getProxy().getTypeProxy().getTypeName());
+			}
+		});
+		
+		exp.invokeExpression();
+		
+		assertTrue(wProxyResolver.notResolvedCalled);
+		assertTrue(xProxyResolver.notResolvedCalled);
+		assertTrue(yProxyResolver.notResolvedCalled);
+		assertTrue(runtimeCatchExceptionProxyResolver.notResolvedCalled);
+		
+	}
+
+	public void testTry2CatchThrowTry2Catch() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		/*
+		 * try {
+		 *   try {
+		 *     x = (null).booleanValue();
+		 *   } catch (RuntimeException e) {
+		 *     y = Boolean.valueOf(false);
+		 *   }
+		 *   w = Boolean.valueOf(true);
+		 * } catch (RuntimeException e) {
+		 *   z = Boolean.valueOf(false);
+		 * }
+		 */
+		IExpression exp = proxyFactory.createExpression();
+		exp.createTry();
+		exp.createTry();
+		ExpressionProxy xProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("booleanValue"), null, null, true);
+		ExpressionProxy runtimeCatchExceptionProxy = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.RuntimeException"), true);
+		ExpressionProxy yProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);
+		exp.createTryEnd();
+		ExpressionProxy wProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(true)}, true);		
+		ExpressionProxy runtimeCatchExceptionProxy2 = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.RuntimeException"), true);
+		ExpressionProxy zProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);
+		exp.createTryEnd();
+
+		ExpressionNotResolved xProxyResolver = new ExpressionNotResolved();
+		xProxy.addProxyListener(xProxyResolver);
+		runtimeCatchExceptionProxy.addProxyListener(new ExpressionResolved() {
+			/* (non-Javadoc)
+			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
+			 */
+			public void proxyResolved(ProxyEvent event) {
+				assertEquals("java.lang.NullPointerException", event.getProxy().getTypeProxy().getTypeName());
+			}
+		});
+
+		yProxy.addProxyListener(new ExpressionResolved() {
+
+			/* (non-Javadoc)
+			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
+			 */
+			public void proxyResolved(ProxyEvent event) {
+				IBeanProxy proxy = event.getProxy();
+				assertEquals("Not a Boolean proxy:"+proxy.getTypeProxy().getTypeName(), proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean"), proxy.getTypeProxy());
+				assertFalse(((IBooleanBeanProxy) event.getProxy()).booleanValue());
+			}
+		});		
+		wProxy.addProxyListener(new ExpressionResolved() {
+
+			/* (non-Javadoc)
+			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
+			 */
+			public void proxyResolved(ProxyEvent event) {
+				IBeanProxy proxy = event.getProxy();
+				assertEquals("Not a Boolean proxy:"+proxy.getTypeProxy().getTypeName(), proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean"), proxy.getTypeProxy());
+				assertTrue(((IBooleanBeanProxy) event.getProxy()).booleanValue());
+			}
+		});
+		
+		ExpressionNotResolved runtimeCatchExceptionProxyResolver2 = new ExpressionNotResolved();
+		runtimeCatchExceptionProxy2.addProxyListener(runtimeCatchExceptionProxyResolver2);
+		ExpressionNotResolved zProxyResolver = new ExpressionNotResolved();
+		zProxy.addProxyListener(zProxyResolver);
+		
+		exp.invokeExpression();
+		
+		assertTrue(xProxyResolver.notResolvedCalled);
+		assertTrue(runtimeCatchExceptionProxyResolver2.notResolvedCalled);
+		assertTrue(zProxyResolver.notResolvedCalled);
+		
+	}
+
+	public void testTry2CatchThrowTry2Catch1() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		/*
+		 * try {
+		 *   try {
+		 *     x = (null).booleanValue();
+		 *   } catch (IllegalArgumentException e) {
+		 *     y = Boolean.valueOf(false);
+		 *   }
+		 *   w = Boolean.valueOf(true);
+		 * } catch (RuntimeException e) {
+		 *   z = Boolean.valueOf(false);
+		 * }
+		 */
+		IExpression exp = proxyFactory.createExpression();
+		exp.createTry();
+		exp.createTry();
+		ExpressionProxy xProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("booleanValue"), null, null, true);
+		ExpressionProxy illegalArgumentCatchExceptionProxy = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.IllegalArgumentException"), true);
+		ExpressionProxy yProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);
+		exp.createTryEnd();
+		ExpressionProxy wProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(true)}, true);		
+		ExpressionProxy runtimeCatchExceptionProxy2 = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.RuntimeException"), true);
+		ExpressionProxy zProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);
+		exp.createTryEnd();
+
+		ExpressionNotResolved xProxyResolver = new ExpressionNotResolved();
+		xProxy.addProxyListener(xProxyResolver);
+		ExpressionNotResolved illegalArgumentCatchProxyResolver = new ExpressionNotResolved();
+		illegalArgumentCatchExceptionProxy.addProxyListener(illegalArgumentCatchProxyResolver);
+
+		ExpressionNotResolved yProxyResolver = new ExpressionNotResolved();
+		yProxy.addProxyListener(yProxyResolver);
+		ExpressionNotResolved wProxyResolver = new ExpressionNotResolved();
+		wProxy.addProxyListener(wProxyResolver);
+		
+		runtimeCatchExceptionProxy2.addProxyListener(new ExpressionResolved() {
+			/* (non-Javadoc)
+			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
+			 */
+			public void proxyResolved(ProxyEvent event) {
+				assertEquals("java.lang.NullPointerException", event.getProxy().getTypeProxy().getTypeName());
+			}
+		});
+		zProxy.addProxyListener(new ExpressionResolved() {
+
+			/* (non-Javadoc)
+			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
+			 */
+			public void proxyResolved(ProxyEvent event) {
+				IBeanProxy proxy = event.getProxy();
+				assertEquals("Not a Boolean proxy:"+proxy.getTypeProxy().getTypeName(), proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean"), proxy.getTypeProxy());
+				assertFalse(((IBooleanBeanProxy) event.getProxy()).booleanValue());
+			}
+		});
+		
+		exp.invokeExpression();
+		
+		assertTrue(xProxyResolver.notResolvedCalled);
+		assertTrue(illegalArgumentCatchProxyResolver.notResolvedCalled);
+		assertTrue(yProxyResolver.notResolvedCalled);
+		assertTrue(wProxyResolver.notResolvedCalled);
+		
+	}
+
+	public void testTry2CatchThrowTry2Finally2Catch1() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		/*
+		 * try {
+		 *   try {
+		 *     x = (null).booleanValue();
+		 *   } catch (IllegalArgumentException e) {
+		 *     y = Boolean.valueOf(false);
+		 *   } finally {
+		 *     v = Boolean.valueOf(false);
+		 *   }
+		 *   w = Boolean.valueOf(true);
+		 * } catch (RuntimeException e) {
+		 *   z = Boolean.valueOf(false);
+		 * }
+		 */
+		IExpression exp = proxyFactory.createExpression();
+		exp.createTry();
+		exp.createTry();
+		ExpressionProxy xProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("booleanValue"), null, null, true);
+		ExpressionProxy illegalArgumentCatchExceptionProxy = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.IllegalArgumentException"), true);
+		ExpressionProxy yProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);
+		exp.createTryFinallyClause();
+		ExpressionProxy vProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);
+		exp.createTryEnd();
+		ExpressionProxy wProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(true)}, true);		
+		ExpressionProxy runtimeCatchExceptionProxy2 = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.RuntimeException"), true);
+		ExpressionProxy zProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);
+		exp.createTryEnd();
+
+		ExpressionNotResolved xProxyResolver = new ExpressionNotResolved();
+		xProxy.addProxyListener(xProxyResolver);
+		ExpressionNotResolved illegalArgumentCatchProxyResolver = new ExpressionNotResolved();
+		illegalArgumentCatchExceptionProxy.addProxyListener(illegalArgumentCatchProxyResolver);
+
+		ExpressionNotResolved yProxyResolver = new ExpressionNotResolved();
+		yProxy.addProxyListener(yProxyResolver);
+		vProxy.addProxyListener(new ExpressionResolved() {
+
+			/* (non-Javadoc)
+			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
+			 */
+			public void proxyResolved(ProxyEvent event) {
+				IBeanProxy proxy = event.getProxy();
+				assertEquals("Not a Boolean proxy:"+proxy.getTypeProxy().getTypeName(), proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean"), proxy.getTypeProxy());
+				assertFalse(((IBooleanBeanProxy) event.getProxy()).booleanValue());
+			}
+		});
+
+		ExpressionNotResolved wProxyResolver = new ExpressionNotResolved();
+		wProxy.addProxyListener(wProxyResolver);
+		
+		runtimeCatchExceptionProxy2.addProxyListener(new ExpressionResolved() {
+			/* (non-Javadoc)
+			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
+			 */
+			public void proxyResolved(ProxyEvent event) {
+				assertEquals("java.lang.NullPointerException", event.getProxy().getTypeProxy().getTypeName());
+			}
+		});
+		zProxy.addProxyListener(new ExpressionResolved() {
+
+			/* (non-Javadoc)
+			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
+			 */
+			public void proxyResolved(ProxyEvent event) {
+				IBeanProxy proxy = event.getProxy();
+				assertEquals("Not a Boolean proxy:"+proxy.getTypeProxy().getTypeName(), proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean"), proxy.getTypeProxy());
+				assertFalse(((IBooleanBeanProxy) event.getProxy()).booleanValue());
+			}
+		});
+		
+		exp.invokeExpression();
+		
+		assertTrue(xProxyResolver.notResolvedCalled);
+		assertTrue(illegalArgumentCatchProxyResolver.notResolvedCalled);
+		assertTrue(yProxyResolver.notResolvedCalled);
+		assertTrue(wProxyResolver.notResolvedCalled);
+		
+	}
+
+	public void testTry2CatchThrowTry2Finally2NoCatch() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		/*
+		 * try {
+		 *   try {
+		 *     x = (null).booleanValue();
+		 *   } catch (IllegalArgumentException e) {
+		 *     y = Boolean.valueOf(false);
+		 *   } finally {
+		 *     v = Boolean.valueOf(false);
+		 *   }
+		 *   w = Boolean.valueOf(true);
+		 * } catch (IllegalArgumentException e) {
+		 *   z = Boolean.valueOf(false);
+		 * }
+		 */
+		IExpression exp = proxyFactory.createExpression();
+		exp.createTry();
+		exp.createTry();
+		ExpressionProxy xProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("booleanValue"), null, null, true);
+		ExpressionProxy illegalArgumentCatchExceptionProxy = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.IllegalArgumentException"), true);
+		ExpressionProxy yProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);
+		exp.createTryFinallyClause();
+		ExpressionProxy vProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);
+		exp.createTryEnd();
+		ExpressionProxy wProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(true)}, true);		
+		ExpressionProxy illegalArgumentCatchExceptionProxy2 = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.IllegalArgumentException"), true);
+		ExpressionProxy zProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);
+		exp.createTryEnd();
+
+		ExpressionNotResolved xProxyResolver = new ExpressionNotResolved();
+		xProxy.addProxyListener(xProxyResolver);
+		ExpressionNotResolved illegalArgumentCatchProxyResolver = new ExpressionNotResolved();
+		illegalArgumentCatchExceptionProxy.addProxyListener(illegalArgumentCatchProxyResolver);
+
+		ExpressionNotResolved yProxyResolver = new ExpressionNotResolved();
+		yProxy.addProxyListener(yProxyResolver);
+		vProxy.addProxyListener(new ExpressionResolved() {
+
+			/* (non-Javadoc)
+			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
+			 */
+			public void proxyResolved(ProxyEvent event) {
+				IBeanProxy proxy = event.getProxy();
+				assertEquals("Not a Boolean proxy:"+proxy.getTypeProxy().getTypeName(), proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean"), proxy.getTypeProxy());
+				assertFalse(((IBooleanBeanProxy) event.getProxy()).booleanValue());
+			}
+		});
+
+		ExpressionNotResolved wProxyResolver = new ExpressionNotResolved();
+		wProxy.addProxyListener(wProxyResolver);
+		
+		ExpressionNotResolved illegalArgumentCatchExceptionProxyResolver2 = new ExpressionNotResolved();
+		illegalArgumentCatchExceptionProxy2.addProxyListener(illegalArgumentCatchExceptionProxyResolver2);
+		ExpressionNotResolved zProxyResolver = new ExpressionNotResolved();
+		zProxy.addProxyListener(zProxyResolver);
+		
+		boolean didit = false;
+		try {
+			exp.invokeExpression();
+		} catch (ThrowableProxy e) {
+			assertEquals(proxyTypeFactory.getBeanTypeProxy("java.lang.NullPointerException"), e.getTypeProxy());
+			didit = true;
+		}
+		
+		assertTrue(didit);
+		assertTrue(xProxyResolver.notResolvedCalled);
+		assertTrue(illegalArgumentCatchProxyResolver.notResolvedCalled);
+		assertTrue(yProxyResolver.notResolvedCalled);
+		assertTrue(wProxyResolver.notResolvedCalled);
+		assertTrue(illegalArgumentCatchExceptionProxyResolver2.notResolvedCalled);
+		assertTrue(zProxyResolver.notResolvedCalled);
+		
+	}
+	
+	public void testTryCatchThrow() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		/*
+		 * try {
+		 *   x = (null).booleanValue();
+		 * } catch (NullPointerException e) {
+		 *   y = Boolean.valueOf(false);
+		 * }
+		 */
+		IExpression exp = proxyFactory.createExpression();
+		exp.createTry();
+		ExpressionProxy xProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("booleanValue"), null, null, true);
+		ExpressionProxy nullCatchExceptionProxy = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.RuntimeException"), true);
+		ExpressionProxy yProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);
+		exp.createTryEnd();
+		ExpressionNotResolved xProxyResolver = new ExpressionNotResolved();
+		xProxy.addProxyListener(xProxyResolver);		
+		yProxy.addProxyListener(new ExpressionResolved() {
+
+			/* (non-Javadoc)
+			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
+			 */
+			public void proxyResolved(ProxyEvent event) {
+				IBeanProxy proxy = event.getProxy();
+				assertEquals("Not a Boolean proxy:"+proxy.getTypeProxy().getTypeName(), proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean"), proxy.getTypeProxy());
+				assertFalse(((IBooleanBeanProxy) event.getProxy()).booleanValue());
+			}
+		});
+
+		nullCatchExceptionProxy.addProxyListener(new ExpressionResolved() {
+			/* (non-Javadoc)
+			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
+			 */
+			public void proxyResolved(ProxyEvent event) {
+				assertEquals("java.lang.NullPointerException", event.getProxy().getTypeProxy().getTypeName());
+			}
+		});
+		exp.invokeExpression();
+		assertTrue(xProxyResolver.notResolvedCalled);
+	}
+
+	public void testTryCatchRethrow() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		/*
+		 * try {
+		 *   x = (null).booleanValue();
+		 * } catch (NullPointerException e) {
+		 *   y = Boolean.valueOf(false);
+		 *   throw e; // As a rethrow.
+		 * }
+		 */
+		IExpression exp = proxyFactory.createExpression();
+		exp.createTry();
+		ExpressionProxy xProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("booleanValue"), null, null, true);
+		ExpressionProxy nullCatchExceptionProxy = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.RuntimeException"), true);
+		ExpressionProxy yProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);
+		exp.createRethrow();
+		exp.createTryEnd();
+		ExpressionNotResolved xProxyResolver = new ExpressionNotResolved();
+		xProxy.addProxyListener(xProxyResolver);		
+		yProxy.addProxyListener(new ExpressionResolved() {
+
+			/* (non-Javadoc)
+			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
+			 */
+			public void proxyResolved(ProxyEvent event) {
+				IBeanProxy proxy = event.getProxy();
+				assertEquals("Not a Boolean proxy:"+proxy.getTypeProxy().getTypeName(), proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean"), proxy.getTypeProxy());
+				assertFalse(((IBooleanBeanProxy) event.getProxy()).booleanValue());
+			}
+		});
+
+		nullCatchExceptionProxy.addProxyListener(new ExpressionResolved() {
+			/* (non-Javadoc)
+			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
+			 */
+			public void proxyResolved(ProxyEvent event) {
+				assertEquals("java.lang.NullPointerException", event.getProxy().getTypeProxy().getTypeName());
+			}
+		});
+		try {
+			exp.invokeExpression();
+			fail("Should of thrown NPE.");
+		} catch (ThrowableProxy e) {
+			assertEquals("java.lang.NullPointerException", e.getTypeProxy().getTypeName());
+		}
+		assertTrue(xProxyResolver.notResolvedCalled);
+	}
+
+	
+	public void testTryCatchExplicitThrow() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		/*
+		 * try {
+		 *   x = Boolean.valueOf(true);
+		 *   throw new NullPointerException();
+		 *   y = Boolean.valueOf(false);
+		 * } catch (NullPointerException e) {
+		 *   z = Boolean.valueOf(false);
+		 * }
+		 */
+		IExpression exp = proxyFactory.createExpression();
+		exp.createTry();
+		ExpressionProxy xProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(true)}, true);
+		exp.createThrow();
+		exp.createClassInstanceCreation(ForExpression.THROW_OPERAND, proxyTypeFactory.getBeanTypeProxy("java.lang.NullPointerException"), 0);
+		ExpressionProxy yProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);
+		ExpressionProxy nullCatchExceptionProxy = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.NullPointerException"), true);
+		ExpressionProxy zProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);
+		exp.createTryEnd();
+		xProxy.addProxyListener(new ExpressionResolved() {
+
+			/* (non-Javadoc)
+			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
+			 */
+			public void proxyResolved(ProxyEvent event) {
+				IBeanProxy proxy = event.getProxy();
+				assertEquals("Not a Boolean proxy:"+proxy.getTypeProxy().getTypeName(), proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean"), proxy.getTypeProxy());
+				assertTrue(((IBooleanBeanProxy) event.getProxy()).booleanValue());
+			}
+		});
+		ExpressionNotResolved yProxyResolver = new ExpressionNotResolved();
+		yProxy.addProxyListener(yProxyResolver);
+
+		zProxy.addProxyListener(new ExpressionResolved() {
+
+			/* (non-Javadoc)
+			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
+			 */
+			public void proxyResolved(ProxyEvent event) {
+				IBeanProxy proxy = event.getProxy();
+				assertEquals("Not a Boolean proxy:"+proxy.getTypeProxy().getTypeName(), proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean"), proxy.getTypeProxy());
+				assertFalse(((IBooleanBeanProxy) event.getProxy()).booleanValue());
+			}
+		});
+
+		nullCatchExceptionProxy.addProxyListener(new ExpressionResolved() {
+			/* (non-Javadoc)
+			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
+			 */
+			public void proxyResolved(ProxyEvent event) {
+				assertEquals("java.lang.NullPointerException", event.getProxy().getTypeProxy().getTypeName());
+			}
+		});
+		exp.invokeExpression();
+		assertTrue(yProxyResolver.notResolvedCalled);
+	}
+
+	public void testTryCatch2NoThrow() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		/*
+		 * try {
+		 *   x = Boolean.valueOf(true);
+		 * } catch (IllegalArgumentException e) {
+		 *   y = Boolean.valueOf(false);
+		 * } catch (RuntimeException e) {
+		 *   z = Boolean.valueOf(false);
+		 * }
+		 */
+		IExpression exp = proxyFactory.createExpression();
+		exp.createTry();
+		ExpressionProxy xProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(true)}, true);
+		ExpressionProxy illegalCatchExceptionProxy = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.IllegalArgumentException"), true);
+		ExpressionProxy yProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);
+		ExpressionProxy runtimeCatchExceptionProxy = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.RuntimeException"), true);
+		ExpressionProxy zProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);		
+		exp.createTryEnd();
+		xProxy.addProxyListener(new ExpressionResolved() {
+
+			/* (non-Javadoc)
+			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
+			 */
+			public void proxyResolved(ProxyEvent event) {
+				IBeanProxy proxy = event.getProxy();
+				assertEquals("Not a Boolean proxy:"+proxy.getTypeProxy().getTypeName(), proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean"), proxy.getTypeProxy());
+				assertTrue(((IBooleanBeanProxy) event.getProxy()).booleanValue());
+			}
+		});
+
+		ExpressionNotResolved yProxyResolver = new ExpressionNotResolved();
+		yProxy.addProxyListener(yProxyResolver);
+		ExpressionNotResolved illegalCatchExceptionProxyResolver = new ExpressionNotResolved();
+		illegalCatchExceptionProxy.addProxyListener(illegalCatchExceptionProxyResolver);
+		ExpressionNotResolved runtimeCatchExceptionProxyResolver = new ExpressionNotResolved();
+		runtimeCatchExceptionProxy.addProxyListener(runtimeCatchExceptionProxyResolver);
+		ExpressionNotResolved zProxyResolver = new ExpressionNotResolved();
+		zProxy.addProxyListener(zProxyResolver);
+		
+		exp.invokeExpression();
+		
+		assertTrue(yProxyResolver.notResolvedCalled);
+		assertTrue(illegalCatchExceptionProxyResolver.notResolvedCalled);
+		assertTrue(zProxyResolver.notResolvedCalled);
+		assertTrue(runtimeCatchExceptionProxyResolver.notResolvedCalled);
+		
+	}
+
+	public void testTryCatch2Throw1() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		/*
+		 * try {
+		 *   x = (null).booleanValue();
+		 * } catch (NullPointerException e) {
+		 *   y = Boolean.valueOf(false);
+		 * } catch (RuntimeException e) {
+		 *   z = Boolean.valueOf(false);
+		 * }
+		 */
+		IExpression exp = proxyFactory.createExpression();
+		exp.createTry();
+		ExpressionProxy xProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("booleanValue"), null, null, true);
+		ExpressionProxy nullCatchExceptionProxy = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.NullPointerException"), true);
+		ExpressionProxy yProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);
+		ExpressionProxy runtimeCatchExceptionProxy = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.RuntimeException"), true);
+		ExpressionProxy zProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);		
+		exp.createTryEnd();
+		ExpressionNotResolved xProxyResolver = new ExpressionNotResolved();
+		xProxy.addProxyListener(xProxyResolver);		
+
+		yProxy.addProxyListener(new ExpressionResolved() {
+
+			/* (non-Javadoc)
+			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
+			 */
+			public void proxyResolved(ProxyEvent event) {
+				IBeanProxy proxy = event.getProxy();
+				assertEquals("Not a Boolean proxy:"+proxy.getTypeProxy().getTypeName(), proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean"), proxy.getTypeProxy());
+				assertFalse(((IBooleanBeanProxy) event.getProxy()).booleanValue());
+			}
+		});
+		nullCatchExceptionProxy.addProxyListener(new ExpressionResolved() {
+			/* (non-Javadoc)
+			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
+			 */
+			public void proxyResolved(ProxyEvent event) {
+				assertEquals("java.lang.NullPointerException", event.getProxy().getTypeProxy().getTypeName());
+			}
+		});
+		ExpressionNotResolved runtimeCatchExceptionProxyResolver = new ExpressionNotResolved();
+		runtimeCatchExceptionProxy.addProxyListener(runtimeCatchExceptionProxyResolver);
+		ExpressionNotResolved zProxyResolver = new ExpressionNotResolved();
+		zProxy.addProxyListener(zProxyResolver);
+		
+		exp.invokeExpression();
+		
+		assertTrue(xProxyResolver.notResolvedCalled);
+		assertTrue(zProxyResolver.notResolvedCalled);
+		assertTrue(runtimeCatchExceptionProxyResolver.notResolvedCalled);
+		
+	}
+
+	public void testTryCatch2Throw2() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		/*
+		 * try {
+		 *   x = (null).booleanValue();
+		 * } catch (IllegalArgumentException e) {
+		 *   y = Boolean.valueOf(false);
+		 * } catch (NullPointerException e) {
+		 *   z = Boolean.valueOf(false);
+		 * }
+		 */
+		IExpression exp = proxyFactory.createExpression();
+		exp.createTry();
+		ExpressionProxy xProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("booleanValue"), null, null, true);
+		ExpressionProxy illegalCatchExceptionProxy = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.IllegalArgumentException"), true);
+		ExpressionProxy yProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);
+		ExpressionProxy nullCatchExceptionProxy = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.NullPointerException"), true);
+		ExpressionProxy zProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);		
+		exp.createTryEnd();
+		ExpressionNotResolved xProxyResolver = new ExpressionNotResolved();
+		xProxy.addProxyListener(xProxyResolver);		
+		ExpressionNotResolved illegalCatchExceptionProxyResolver = new ExpressionNotResolved();
+		illegalCatchExceptionProxy.addProxyListener(illegalCatchExceptionProxyResolver);
+		ExpressionNotResolved yProxyResolver = new ExpressionNotResolved();
+		yProxy.addProxyListener(yProxyResolver);
+
+		zProxy.addProxyListener(new ExpressionResolved() { 
+
+			/* (non-Javadoc)
+			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
+			 */
+			public void proxyResolved(ProxyEvent event) {
+				IBeanProxy proxy = event.getProxy();
+				assertEquals("Not a Boolean proxy:"+proxy.getTypeProxy().getTypeName(), proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean"), proxy.getTypeProxy());
+				assertFalse(((IBooleanBeanProxy) event.getProxy()).booleanValue());
+			}
+		});
+		nullCatchExceptionProxy.addProxyListener(new ExpressionResolved() {
+			/* (non-Javadoc)
+			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
+			 */
+			public void proxyResolved(ProxyEvent event) {
+				assertEquals("java.lang.NullPointerException", event.getProxy().getTypeProxy().getTypeName());
+			}
+		});		
+		exp.invokeExpression();
+		
+		assertTrue(xProxyResolver.notResolvedCalled);
+		assertTrue(yProxyResolver.notResolvedCalled);
+		assertTrue(illegalCatchExceptionProxyResolver.notResolvedCalled);
+		
+	}
+
+	public void testTryCatchThrowFinally() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		/*
+		 * try {
+		 *   x = (null).booleanValue();
+		 * } catch (NullPointerException e) {
+		 *   y = Boolean.valueOf(false);
+		 * } finally {
+		 *   f = Boolean.valueOf(false);
+		 * }
+		 */
+		IExpression exp = proxyFactory.createExpression();
+		exp.createTry();
+		ExpressionProxy xProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("booleanValue"), null, null, true);
+		ExpressionProxy nullCatchExceptionProxy = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.RuntimeException"), true);
+		ExpressionProxy yProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);
+		exp.createTryFinallyClause();
+		ExpressionProxy fProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);		
+		
+		exp.createTryEnd();
+		ExpressionNotResolved xProxyResolver = new ExpressionNotResolved();
+		xProxy.addProxyListener(xProxyResolver);		
+		yProxy.addProxyListener(new ExpressionResolved() {
+
+			/* (non-Javadoc)
+			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
+			 */
+			public void proxyResolved(ProxyEvent event) {
+				IBeanProxy proxy = event.getProxy();
+				assertEquals("Not a Boolean proxy:"+proxy.getTypeProxy().getTypeName(), proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean"), proxy.getTypeProxy());
+				assertFalse(((IBooleanBeanProxy) event.getProxy()).booleanValue());
+			}
+		});
+
+		nullCatchExceptionProxy.addProxyListener(new ExpressionResolved() {
+			/* (non-Javadoc)
+			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
+			 */
+			public void proxyResolved(ProxyEvent event) {
+				assertEquals("java.lang.NullPointerException", event.getProxy().getTypeProxy().getTypeName());
+			}
+		});
+		
+		fProxy.addProxyListener(new ExpressionResolved() {
+
+			/* (non-Javadoc)
+			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
+			 */
+			public void proxyResolved(ProxyEvent event) {
+				IBeanProxy proxy = event.getProxy();
+				assertEquals("Not a Boolean proxy:"+proxy.getTypeProxy().getTypeName(), proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean"), proxy.getTypeProxy());
+				assertFalse(((IBooleanBeanProxy) event.getProxy()).booleanValue());
+			}
+		});
+		
+		exp.invokeExpression();
+		assertTrue(xProxyResolver.notResolvedCalled);
+	}
+	
+	public void testTryCatch2Throw1Finally() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		/*
+		 * try {
+		 *   x = (null).booleanValue();
+		 * } catch (NullPointerException e) {
+		 *   y = Boolean.valueOf(false);
+		 * } catch (RuntimeException e) {
+		 *   z = Boolean.valueOf(false);
+		 * } finally {
+		 *   f = Boolean.valueOf(false);
+		 * }
+		 */
+		IExpression exp = proxyFactory.createExpression();
+		exp.createTry();
+		ExpressionProxy xProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("booleanValue"), null, null, true);
+		ExpressionProxy nullCatchExceptionProxy = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.NullPointerException"), true);
+		ExpressionProxy yProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);
+		ExpressionProxy runtimeCatchExceptionProxy = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.RuntimeException"), true);
+		ExpressionProxy zProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);		
+		exp.createTryFinallyClause();
+		ExpressionProxy fProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);		
+		exp.createTryEnd();
+		ExpressionNotResolved xProxyResolver = new ExpressionNotResolved();
+		xProxy.addProxyListener(xProxyResolver);		
+
+		yProxy.addProxyListener(new ExpressionResolved() {
+
+			/* (non-Javadoc)
+			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
+			 */
+			public void proxyResolved(ProxyEvent event) {
+				IBeanProxy proxy = event.getProxy();
+				assertEquals("Not a Boolean proxy:"+proxy.getTypeProxy().getTypeName(), proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean"), proxy.getTypeProxy());
+				assertFalse(((IBooleanBeanProxy) event.getProxy()).booleanValue());
+			}
+		});
+		nullCatchExceptionProxy.addProxyListener(new ExpressionResolved() {
+			/* (non-Javadoc)
+			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
+			 */
+			public void proxyResolved(ProxyEvent event) {
+				assertEquals("java.lang.NullPointerException", event.getProxy().getTypeProxy().getTypeName());
+			}
+		});
+		ExpressionNotResolved runtimeCatchExceptionProxyResolver = new ExpressionNotResolved();
+		runtimeCatchExceptionProxy.addProxyListener(runtimeCatchExceptionProxyResolver);
+		ExpressionNotResolved zProxyResolver = new ExpressionNotResolved();
+		zProxy.addProxyListener(zProxyResolver);
+		fProxy.addProxyListener(new ExpressionResolved() {
+
+			/* (non-Javadoc)
+			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
+			 */
+			public void proxyResolved(ProxyEvent event) {
+				IBeanProxy proxy = event.getProxy();
+				assertEquals("Not a Boolean proxy:"+proxy.getTypeProxy().getTypeName(), proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean"), proxy.getTypeProxy());
+				assertFalse(((IBooleanBeanProxy) event.getProxy()).booleanValue());
+			}
+		});
+
+		exp.invokeExpression();
+		
+		
+		assertTrue(xProxyResolver.notResolvedCalled);
+		assertTrue(zProxyResolver.notResolvedCalled);
+		assertTrue(runtimeCatchExceptionProxyResolver.notResolvedCalled);
+		
+	}
+	
+	public void testTryCatch2Throw2Finally() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		/*
+		 * try {
+		 *   x = (null).booleanValue();
+		 * } catch (IllegalArgumentException e) {
+		 *   y = Boolean.valueOf(false);
+		 * } catch (NullPointerException e) {
+		 *   z = Boolean.valueOf(false);
+		 * }  finally {
+		 *   f = Boolean.valueOf(false);
+		 * }
+		 */
+		IExpression exp = proxyFactory.createExpression();
+		exp.createTry();
+		ExpressionProxy xProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("booleanValue"), null, null, true);
+		ExpressionProxy illegalCatchExceptionProxy = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.IllegalArgumentException"), true);
+		ExpressionProxy yProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);
+		ExpressionProxy nullCatchExceptionProxy = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.NullPointerException"), true);
+		ExpressionProxy zProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);		
+		exp.createTryFinallyClause();
+		ExpressionProxy fProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);		
+		exp.createTryEnd();
+		ExpressionNotResolved xProxyResolver = new ExpressionNotResolved();
+		xProxy.addProxyListener(xProxyResolver);		
+		ExpressionNotResolved illegalCatchExceptionProxyResolver = new ExpressionNotResolved();
+		illegalCatchExceptionProxy.addProxyListener(illegalCatchExceptionProxyResolver);
+		ExpressionNotResolved yProxyResolver = new ExpressionNotResolved();
+		yProxy.addProxyListener(yProxyResolver);
+
+		zProxy.addProxyListener(new ExpressionResolved() { 
+
+			/* (non-Javadoc)
+			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
+			 */
+			public void proxyResolved(ProxyEvent event) {
+				IBeanProxy proxy = event.getProxy();
+				assertEquals("Not a Boolean proxy:"+proxy.getTypeProxy().getTypeName(), proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean"), proxy.getTypeProxy());
+				assertFalse(((IBooleanBeanProxy) event.getProxy()).booleanValue());
+			}
+		});
+		nullCatchExceptionProxy.addProxyListener(new ExpressionResolved() {
+			/* (non-Javadoc)
+			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
+			 */
+			public void proxyResolved(ProxyEvent event) {
+				assertEquals("java.lang.NullPointerException", event.getProxy().getTypeProxy().getTypeName());
+			}
+		});	
+		
+		fProxy.addProxyListener(new ExpressionResolved() {
+
+			/* (non-Javadoc)
+			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
+			 */
+			public void proxyResolved(ProxyEvent event) {
+				IBeanProxy proxy = event.getProxy();
+				assertEquals("Not a Boolean proxy:"+proxy.getTypeProxy().getTypeName(), proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean"), proxy.getTypeProxy());
+				assertFalse(((IBooleanBeanProxy) event.getProxy()).booleanValue());
+			}
+		});		
+		exp.invokeExpression();
+		
+		assertTrue(xProxyResolver.notResolvedCalled);
+		assertTrue(yProxyResolver.notResolvedCalled);
+		assertTrue(illegalCatchExceptionProxyResolver.notResolvedCalled);
+		
+	}
+	
+
+	public void testTryCatchNoThrowFinally() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		/*
+		 * try {
+		 *   x = Boolean.valueOf(true);
+		 * } catch (RuntimeException e) {
+		 *   y = Boolean.valueOf(false);
+		 * } finally {
+		 *   f = Boolean.valueOf(false);
+		 * }
+		 */
+		IExpression exp = proxyFactory.createExpression();
+		exp.createTry();
+		ExpressionProxy xProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(true)}, true);
+		ExpressionProxy runtimeCatchExceptionProxy = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.RuntimeException"), true);
+		ExpressionProxy yProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);
+		exp.createTryFinallyClause();
+		ExpressionProxy fProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);
+		exp.createTryEnd();
+		xProxy.addProxyListener(new ExpressionResolved() {
+
+			/* (non-Javadoc)
+			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
+			 */
+			public void proxyResolved(ProxyEvent event) {
+				IBeanProxy proxy = event.getProxy();
+				assertEquals("Not a Boolean proxy:"+proxy.getTypeProxy().getTypeName(), proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean"), proxy.getTypeProxy());
+				assertTrue(((IBooleanBeanProxy) event.getProxy()).booleanValue());
+			}
+		});
+
+		ExpressionNotResolved yProxyResolver = new ExpressionNotResolved();
+		yProxy.addProxyListener(yProxyResolver);
+		ExpressionNotResolved runtimeCatchExceptionProxyResolver = new ExpressionNotResolved();
+		runtimeCatchExceptionProxy.addProxyListener(runtimeCatchExceptionProxyResolver);
+		fProxy.addProxyListener(new ExpressionResolved() {
+
+			/* (non-Javadoc)
+			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
+			 */
+			public void proxyResolved(ProxyEvent event) {
+				IBeanProxy proxy = event.getProxy();
+				assertEquals("Not a Boolean proxy:"+proxy.getTypeProxy().getTypeName(), proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean"), proxy.getTypeProxy());
+				assertFalse(((IBooleanBeanProxy) event.getProxy()).booleanValue());
+			}
+		});
+		
+		exp.invokeExpression();
+		
+		assertTrue(yProxyResolver.notResolvedCalled);
+		assertTrue(runtimeCatchExceptionProxyResolver.notResolvedCalled);
+		
+	}
+
+	public void testTryCatch2NoThrowFinally() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		/*
+		 * try {
+		 *   x = Boolean.valueOf(true);
+		 * } catch (IllegalArgumentException e) {
+		 *   y = Boolean.valueOf(false);
+		 * } catch (RuntimeException e) {
+		 *   z = Boolean.valueOf(false);
+		 * } finally {
+		 *   f = Boolean.valueOf(false);
+		 * }
+		 */
+		IExpression exp = proxyFactory.createExpression();
+		exp.createTry();
+		ExpressionProxy xProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(true)}, true);
+		ExpressionProxy illegalCatchExceptionProxy = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.IllegalArgumentException"), true);
+		ExpressionProxy yProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);
+		ExpressionProxy runtimeCatchExceptionProxy = exp.createTryCatchClause(proxyTypeFactory.getBeanTypeProxy("java.lang.RuntimeException"), true);
+		ExpressionProxy zProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);		
+		exp.createTryFinallyClause();
+		ExpressionProxy fProxy = exp.createSimpleMethodInvoke(proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean").getMethodProxy("valueOf", new String[] {"boolean"}), null, new IProxy[] {proxyFactory.createBeanProxyWith(false)}, true);		
+		exp.createTryEnd();
+		xProxy.addProxyListener(new ExpressionResolved() {
+
+			/* (non-Javadoc)
+			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
+			 */
+			public void proxyResolved(ProxyEvent event) {
+				IBeanProxy proxy = event.getProxy();
+				assertEquals("Not a Boolean proxy:"+proxy.getTypeProxy().getTypeName(), proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean"), proxy.getTypeProxy());
+				assertTrue(((IBooleanBeanProxy) event.getProxy()).booleanValue());
+			}
+		});
+
+		ExpressionNotResolved yProxyResolver = new ExpressionNotResolved();
+		yProxy.addProxyListener(yProxyResolver);
+		ExpressionNotResolved illegalCatchExceptionProxyResolver = new ExpressionNotResolved();
+		illegalCatchExceptionProxy.addProxyListener(illegalCatchExceptionProxyResolver);
+		ExpressionNotResolved runtimeCatchExceptionProxyResolver = new ExpressionNotResolved();
+		runtimeCatchExceptionProxy.addProxyListener(runtimeCatchExceptionProxyResolver);
+		ExpressionNotResolved zProxyResolver = new ExpressionNotResolved();
+		zProxy.addProxyListener(zProxyResolver);
+		fProxy.addProxyListener(new ExpressionResolved() {
+
+			/* (non-Javadoc)
+			 * @see org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyListener#proxyResolved(org.eclipse.jem.internal.proxy.core.ExpressionProxy.ProxyEvent)
+			 */
+			public void proxyResolved(ProxyEvent event) {
+				IBeanProxy proxy = event.getProxy();
+				assertEquals("Not a Boolean proxy:"+proxy.getTypeProxy().getTypeName(), proxyTypeFactory.getBeanTypeProxy("java.lang.Boolean"), proxy.getTypeProxy());
+				assertFalse(((IBooleanBeanProxy) event.getProxy()).booleanValue());
+			}
+		});
+
+		exp.invokeExpression();
+		
+		assertTrue(yProxyResolver.notResolvedCalled);
+		assertTrue(illegalCatchExceptionProxyResolver.notResolvedCalled);
+		assertTrue(zProxyResolver.notResolvedCalled);
+		assertTrue(runtimeCatchExceptionProxyResolver.notResolvedCalled);
+		
+	}
+	
+
+	public void testIfElseTrueWithElse() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createIfElse(true);
+		exp.createInfixExpression(ForExpression.IF_CONDITION, InfixOperator.IN_EQUALS, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 3);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
+		ExpressionProxy trueProxy = exp.createProxyAssignmentExpression(ForExpression.IF_TRUE);
+		exp.createInfixExpression(ForExpression.ASSIGNMENT_RIGHT, InfixOperator.IN_PLUS, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 3);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
+		ExpressionProxy falseProxy = exp.createProxyAssignmentExpression(ForExpression.IF_ELSE);		
+		exp.createInfixExpression(ForExpression.ASSIGNMENT_RIGHT, InfixOperator.IN_MINUS, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 3);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
+		
+		trueProxy.addProxyListener(new ExpressionResolved() {
+			public void proxyResolved(ProxyEvent event) {
+				IBeanProxy value = event.getProxy();
+				assertNotNull(value);
+				assertEquals("int", value.getTypeProxy().getFormalTypeName());
+				assertEquals(6, ((INumberBeanProxy) value).intValue());
+			}
+		});
+
+		falseProxy.addProxyListener(new ExpressionNotResolved());
+		exp.invokeExpression();
+	}
+
+	public void testIfElseFalseWithElse() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createIfElse(true);
+		exp.createInfixExpression(ForExpression.IF_CONDITION, InfixOperator.IN_EQUALS, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 4);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
+		ExpressionProxy trueProxy = exp.createProxyAssignmentExpression(ForExpression.IF_TRUE);
+		exp.createInfixExpression(ForExpression.ASSIGNMENT_RIGHT, InfixOperator.IN_PLUS, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 3);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
+		ExpressionProxy falseProxy = exp.createProxyAssignmentExpression(ForExpression.IF_ELSE);		
+		exp.createInfixExpression(ForExpression.ASSIGNMENT_RIGHT, InfixOperator.IN_MINUS, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 3);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
+
+		trueProxy.addProxyListener(new ExpressionNotResolved());
+		
+		falseProxy.addProxyListener(new ExpressionResolved() {
+			public void proxyResolved(ProxyEvent event) {
+				IBeanProxy value = event.getProxy();
+				assertNotNull(value);
+				assertEquals("int", value.getTypeProxy().getFormalTypeName());
+				assertEquals(0, ((INumberBeanProxy) value).intValue());
+			}
+		});
+
+		exp.invokeExpression();
+	}
+
+	public void testIfElseTrueWithoutElse() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createIfElse(false);
+		exp.createInfixExpression(ForExpression.IF_CONDITION, InfixOperator.IN_EQUALS, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 3);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
+		ExpressionProxy trueProxy = exp.createProxyAssignmentExpression(ForExpression.IF_TRUE);
+		exp.createInfixExpression(ForExpression.ASSIGNMENT_RIGHT, InfixOperator.IN_PLUS, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 3);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
+		
+		trueProxy.addProxyListener(new ExpressionResolved() {
+			public void proxyResolved(ProxyEvent event) {
+				IBeanProxy value = event.getProxy();
+				assertNotNull(value);
+				assertEquals("int", value.getTypeProxy().getFormalTypeName());
+				assertEquals(6, ((INumberBeanProxy) value).intValue());
+			}
+		});
+
+		exp.invokeExpression();
+	}
+	
+	public void testIfElseFalseWithoutElse() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createIfElse(false);
+		exp.createInfixExpression(ForExpression.IF_CONDITION, InfixOperator.IN_EQUALS, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 4);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
+		ExpressionProxy trueProxy = exp.createProxyAssignmentExpression(ForExpression.IF_TRUE);
+		exp.createInfixExpression(ForExpression.ASSIGNMENT_RIGHT, InfixOperator.IN_PLUS, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 3);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
+		
+		trueProxy.addProxyListener(new ExpressionNotResolved());
+
+		exp.invokeExpression();
+	}
+
+	public void testIfElseBlocksTrueWithElse() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createIfElse(true);
+		exp.createInfixExpression(ForExpression.IF_CONDITION, InfixOperator.IN_EQUALS, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 3);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
+		exp.createBlockBegin();
+			ExpressionProxy trueProxy = exp.createProxyAssignmentExpression(ForExpression.ROOTEXPRESSION);
+			exp.createInfixExpression(ForExpression.ASSIGNMENT_RIGHT, InfixOperator.IN_PLUS, 0);
+			exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 3);
+			exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
+		exp.createBlockEnd();
+		exp.createBlockBegin();
+			ExpressionProxy falseProxy = exp.createProxyAssignmentExpression(ForExpression.ROOTEXPRESSION);		
+			exp.createInfixExpression(ForExpression.ASSIGNMENT_RIGHT, InfixOperator.IN_MINUS, 0);
+			exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 3);
+			exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
+		exp.createBlockEnd();
+		
+		trueProxy.addProxyListener(new ExpressionResolved() {
+			public void proxyResolved(ProxyEvent event) {
+				IBeanProxy value = event.getProxy();
+				assertNotNull(value);
+				assertEquals("int", value.getTypeProxy().getFormalTypeName());
+				assertEquals(6, ((INumberBeanProxy) value).intValue());
+			}
+		});
+
+		falseProxy.addProxyListener(new ExpressionNotResolved());
+		exp.invokeExpression();
+	}
+
+	public void testIfElseBlocksFalseWithElse() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createIfElse(true);
+		exp.createInfixExpression(ForExpression.IF_CONDITION, InfixOperator.IN_EQUALS, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 4);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
+		exp.createBlockBegin();
+			ExpressionProxy trueProxy = exp.createProxyAssignmentExpression(ForExpression.ROOTEXPRESSION);
+			exp.createInfixExpression(ForExpression.ASSIGNMENT_RIGHT, InfixOperator.IN_PLUS, 0);
+			exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 3);
+			exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
+		exp.createBlockEnd();
+		exp.createBlockBegin();
+			ExpressionProxy falseProxy = exp.createProxyAssignmentExpression(ForExpression.ROOTEXPRESSION);		
+			exp.createInfixExpression(ForExpression.ASSIGNMENT_RIGHT, InfixOperator.IN_MINUS, 0);
+			exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 3);
+			exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
+		exp.createBlockEnd();
+
+		trueProxy.addProxyListener(new ExpressionNotResolved());
+		
+		falseProxy.addProxyListener(new ExpressionResolved() {
+			public void proxyResolved(ProxyEvent event) {
+				IBeanProxy value = event.getProxy();
+				assertNotNull(value);
+				assertEquals("int", value.getTypeProxy().getFormalTypeName());
+				assertEquals(0, ((INumberBeanProxy) value).intValue());
+			}
+		});
+
+		exp.invokeExpression();
+	}
+
+	public void testIfElseBlockTrueWithoutElse() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createIfElse(false);
+		exp.createInfixExpression(ForExpression.IF_CONDITION, InfixOperator.IN_EQUALS, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 3);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
+		exp.createBlockBegin();
+			ExpressionProxy trueProxy = exp.createProxyAssignmentExpression(ForExpression.ROOTEXPRESSION);
+			exp.createInfixExpression(ForExpression.ASSIGNMENT_RIGHT, InfixOperator.IN_PLUS, 0);
+			exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 3);
+			exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
+		exp.createBlockEnd();
+		
+		trueProxy.addProxyListener(new ExpressionResolved() {
+			public void proxyResolved(ProxyEvent event) {
+				IBeanProxy value = event.getProxy();
+				assertNotNull(value);
+				assertEquals("int", value.getTypeProxy().getFormalTypeName());
+				assertEquals(6, ((INumberBeanProxy) value).intValue());
+			}
+		});
+
+		exp.invokeExpression();
+	}
+	
+	public void testIfElseBlockFalseWithoutElse() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createIfElse(false);
+		exp.createInfixExpression(ForExpression.IF_CONDITION, InfixOperator.IN_EQUALS, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 4);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
+		exp.createBlockBegin();
+			ExpressionProxy trueProxy = exp.createProxyAssignmentExpression(ForExpression.ROOTEXPRESSION);
+			exp.createInfixExpression(ForExpression.ASSIGNMENT_RIGHT, InfixOperator.IN_PLUS, 0);
+			exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, (byte) 3);
+			exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, (short) 3);
+		exp.createBlockEnd();
+		
+		trueProxy.addProxyListener(new ExpressionNotResolved());
+
+		exp.invokeExpression();
+	}	
+
+	public void testNewInitStringPrimitive() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		// Use internal expression class so we can test the special method.
+		Expression exp = (Expression) proxyFactory.createExpression();
+		ExpressionProxy result = exp.createProxyAssignmentExpression(ForExpression.ROOTEXPRESSION);
+		exp.createNewInstance(ForExpression.ASSIGNMENT_RIGHT, "false", proxyTypeFactory.getBeanTypeProxy("boolean"));
+		result.addProxyListener(new ExpressionResolved(){
+			public void proxyResolved(ProxyEvent event) {
+				IBeanProxy value = event.getProxy();
+				assertNotNull(value);
+				assertEquals("boolean", value.getTypeProxy().getFormalTypeName());
+				assertEquals(false, ((IBooleanBeanProxy) value).booleanValue());
+			}
+			
+		});
+		
+		exp.invokeExpression();
+	}
+	
+	public void testMark() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		// Just test having a mark and no errors.
+		Expression exp = (Expression) proxyFactory.createExpression();
+		int mark = exp.mark();
+		try {
+			ExpressionProxy result = exp.createProxyAssignmentExpression(ForExpression.ROOTEXPRESSION);
+			exp.createNewInstance(ForExpression.ASSIGNMENT_RIGHT, "false", proxyTypeFactory.getBeanTypeProxy("boolean"));
+			result.addProxyListener(new ExpressionResolved(){
+				public void proxyResolved(ProxyEvent event) {
+					IBeanProxy value = event.getProxy();
+					assertNotNull(value);
+					assertEquals("boolean", value.getTypeProxy().getFormalTypeName());
+					assertEquals(false, ((IBooleanBeanProxy) value).booleanValue());
+				}
+				
+			});			
+		} finally {
+			exp.endMark(mark);
+		}
+		exp.invokeExpression();
+		
+	}
+	
+	public void testMark2() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		// Just test having a mark errors, but expressions before the mark and after the mark are successful.
+		Expression exp = (Expression) proxyFactory.createExpression();
+		int mark0 = exp.mark();
+		final boolean[] resultResolved = new boolean[1];
+		ExpressionNotResolved ep1 = null;
+		final boolean[] resultResolved2 = new boolean[1];
+		try {
+			ExpressionProxy result = exp.createProxyAssignmentExpression(ForExpression.ROOTEXPRESSION);
+			result.addProxyListener(new ExpressionResolved() {
+
+				public void proxyResolved(ProxyEvent event) {
+					IBeanProxy value = event.getProxy();
+					assertNotNull(value);
+					assertEquals("boolean", value.getTypeProxy().getFormalTypeName());
+					assertEquals(false, ((IBooleanBeanProxy) value).booleanValue());
+					resultResolved[0] = true;
+				}
+
+			});
+			exp.createNewInstance(ForExpression.ASSIGNMENT_RIGHT, "false", proxyTypeFactory.getBeanTypeProxy("boolean"));
+			exp.createTry();
+			int mark = exp.mark();
+			try {
+				ExpressionProxy result1 = exp.createProxyAssignmentExpression(ForExpression.ROOTEXPRESSION);
+				result1.addProxyListener(ep1 = new ExpressionNotResolved());
+				exp.createNewInstance(ForExpression.ASSIGNMENT_LEFT, "false", proxyTypeFactory.getBeanTypeProxy("boolean"));
+			} catch (IllegalStateException e) {
+				// This is ok, should of got this.
+			} finally {
+				exp.endMark(mark);
+			}
+			exp.createTryEnd();
+			ExpressionProxy result2 = exp.createProxyAssignmentExpression(ForExpression.ROOTEXPRESSION);
+			result2.addProxyListener(new ExpressionResolved() {
+
+				public void proxyResolved(ProxyEvent event) {
+					IBeanProxy value = event.getProxy();
+					assertNotNull(value);
+					assertEquals("boolean", value.getTypeProxy().getFormalTypeName());
+					assertEquals(false, ((IBooleanBeanProxy) value).booleanValue());
+					resultResolved2[0] = true;
+				}
+
+			});
+			exp.createNewInstance(ForExpression.ASSIGNMENT_RIGHT, "false", proxyTypeFactory.getBeanTypeProxy("boolean"));
+		} finally {
+			exp.endMark(mark0);
+		}
+		
+		exp.invokeExpression();
+		
+		assertNotNull(ep1);
+		assertTrue(ep1.notResolvedCalled);
+		assertTrue(resultResolved[0]);
+		assertTrue(resultResolved2[0]);
+		
+	}
+	
+	
+	public void testMarkError() throws IllegalStateException, ThrowableProxy, NoExpressionValueException {
+		// Test with one error and see if it restores correctly.
+		Expression exp = (Expression) proxyFactory.createExpression();
+		int mark = exp.mark();
+		ExpressionNotResolved epl = null;
+		try {
+			ExpressionProxy result = exp.createProxyAssignmentExpression(ForExpression.ROOTEXPRESSION);
+			result.addProxyListener(epl = new ExpressionNotResolved());
+			exp.createNewInstance(ForExpression.ASSIGNMENT_LEFT, "false", proxyTypeFactory.getBeanTypeProxy("boolean"));
+		} catch (IllegalStateException e) {
+			// This is good. We should get here.
+		} finally {
+			exp.endMark(mark);
+		}
+		
+		// Now we should be able to continue and get good answer.
+		ExpressionProxy result = exp.createProxyAssignmentExpression(ForExpression.ROOTEXPRESSION);
+		exp.createNewInstance(ForExpression.ASSIGNMENT_RIGHT, "false", proxyTypeFactory.getBeanTypeProxy("boolean"));
+		result.addProxyListener(new ExpressionResolved(){
+			public void proxyResolved(ProxyEvent event) {
+				IBeanProxy value = event.getProxy();
+				assertNotNull(value);
+				assertEquals("boolean", value.getTypeProxy().getFormalTypeName());
+				assertEquals(false, ((IBooleanBeanProxy) value).booleanValue());
+			}
+			
+		});
+		
+		exp.invokeExpression();
+		assertNotNull(epl);
+		assertTrue(epl.notResolvedCalled);
+	}
+	
+	public void testMarkNestError() {
+		// Test mark nest error.
+		// mark
+		// try {
+		//   endmark
+		// } finally <-- this should cause an exception.
+		Expression exp = (Expression) proxyFactory.createExpression();
+		int mark = exp.mark();
+		ExpressionNotResolved epl = null;
+		try {
+			exp.createTry();
+			ExpressionProxy result = exp.createProxyAssignmentExpression(ForExpression.ROOTEXPRESSION);
+			result.addProxyListener(epl = new ExpressionNotResolved());
+			exp.createNewInstance(ForExpression.ASSIGNMENT_RIGHT, "false", proxyTypeFactory.getBeanTypeProxy("boolean"));
+			exp.endMark(mark);
+			exp.createTryFinallyClause();
+			exp.createTryEnd();
+		} catch (IllegalStateException e) {
+			// This is good. We should get here.
+			exp.close();
+			assertNotNull(epl);
+			assertTrue(epl.notResolvedCalled);			
+			return;
+		}
+		
+		exp.close();
+		fail("Should not of gotten here.");
+	}
+	
+	public void testMarkNestError2() {
+		// Test mark nest error.
+		// try {
+		//   mark
+		// } finally <-- this should cause an exception.
+		// endmark
+		Expression exp = (Expression) proxyFactory.createExpression();
+		ExpressionNotResolved epl = null;
+		try {
+			exp.createTry();
+			int mark = exp.mark();
+			ExpressionProxy result = exp.createProxyAssignmentExpression(ForExpression.ROOTEXPRESSION);
+			result.addProxyListener(epl = new ExpressionNotResolved());
+			exp.createNewInstance(ForExpression.ASSIGNMENT_RIGHT, "false", proxyTypeFactory.getBeanTypeProxy("boolean"));
+			exp.createTryFinallyClause();
+			exp.createTryEnd();
+			exp.endMark(mark);
+		} catch (IllegalStateException e) {
+			// This is good. We should get here.
+			exp.close();
+			assertNotNull(epl);
+			assertTrue(epl.notResolvedCalled);			
+			return;
+		}
+		
+		exp.close();
+		fail("Should not of gotten here.");
+	}
+
+	public void testExpressionTransfer() throws Throwable {
+		// Test that thread transfer works. We will do part of the expression in one thread, more in the next, and
+		// then come back and complete it.
+		IExpression exp = proxyFactory.createExpression();
+		ExpressionProxy epInfix = exp.createProxyAssignmentExpression(ForExpression.ROOTEXPRESSION);
+		exp.createInfixExpression(ForExpression.ASSIGNMENT_RIGHT, InfixOperator.IN_LESS, 0);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_LEFT, -10000000);
+		exp.createPrimitiveLiteral(ForExpression.INFIX_RIGHT, 3);
+		
+		// Now transfer to another thread.
+		Expression expression = (Expression) exp;
+		expression.beginTransferThread();	// Begin the transfer.
+		
+		IBeanTypeProxy callbackType = proxyTypeFactory.getBeanTypeProxy("org.eclipse.jem.tests.proxy.vm.TestExpressionThreadTransfer"); //$NON-NLS-1$
+		assertNotNull(callbackType);
+		IBeanProxy callbackProxy = callbackType.newInstance();
+		
+		ExpressionThreadTransferCallBack cb = new ExpressionThreadTransferCallBack(expression);
+		registry.getCallbackRegistry().registerCallback(callbackProxy, cb);
+		IInvokable start = callbackType.getInvokable("start");	//$NON-NLS-1$
+		start.invokeCatchThrowableExceptions(callbackProxy);	// Start the thread on the remote vm and wait for it to finish.
+		
+		epInfix.addProxyListener(new ExpressionResolved() {
+			public void proxyResolved(ExpressionProxy.ProxyEvent event) {
+				IBeanProxy result = event.getProxy();
+				assertNotNull(result);
+				assertEquals("boolean", result.getTypeProxy().getTypeName());
+				assertEquals(-10000000<3, ((IBooleanBeanProxy) result).booleanValue());		
+			}
+		});
+		
+		if (cb.error != null) {
+			throw cb.error;
+		}
+		
+		cb.ep.addProxyListener(new ExpressionResolved(){
+			public void proxyResolved(ExpressionProxy.ProxyEvent event) {
+				IBeanProxy result = event.getProxy();
+				assertNotNull(result);
+				assertEquals("boolean", result.getTypeProxy().getTypeName());
+				assertEquals(String.class == String.class, ((IBooleanBeanProxy) result).booleanValue());
+			}
+		});
+
+		expression.transferThread();
+		exp.invokeExpression();
+	}
+	
+	public void testSubexpression() throws IllegalStateException, IllegalArgumentException, ThrowableProxy, NoExpressionValueException {
+		IExpression exp = proxyFactory.createExpression();
+		exp.createArrayCreation(ForExpression.ROOTEXPRESSION, "int[][][]", 2);
+		exp.createPrimitiveLiteral(ForExpression.ARRAYCREATION_DIMENSION, 2);
+		ExpressionProxy secondDimensionProxy = null;
+		// This tests that we can put an expression right in the middle of another expression and 
+		// pick it where it left off.
+		exp.createSubexpression();
+		exp.createTry();
+		secondDimensionProxy = exp.createProxyAssignmentExpression(ForExpression.ROOTEXPRESSION);
+		exp.createPrimitiveLiteral(ForExpression.ASSIGNMENT_RIGHT, 4);
+		exp.createTryEnd();
+		exp.createSubexpressionEnd();
+		exp.createProxyExpression(ForExpression.ARRAYCREATION_DIMENSION, secondDimensionProxy);		
+		IBeanProxy result = exp.getExpressionValue();
+		assertNotNull(result);
+		assertEquals("int[][][]", result.getTypeProxy().getFormalTypeName());
+		assertEquals(2, ((IArrayBeanProxy) result).getLength());
+		assertEquals(4, ((IArrayBeanProxy)((IArrayBeanProxy) result).get(0)).getLength());
+		assertNull(((IArrayBeanProxy)((IArrayBeanProxy) result).get(0)).get(0));
+	}
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/ExpressionThreadTransferCallBack.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/ExpressionThreadTransferCallBack.java
new file mode 100644
index 0000000..661048b
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/ExpressionThreadTransferCallBack.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jem.tests.proxy;
+/*
+ *  $RCSfile: ExpressionThreadTransferCallBack.java,v $
+ *  $Revision: 1.2 $  $Date: 2005/08/24 20:58:54 $ 
+ */
+
+import java.io.InputStream;
+
+import org.eclipse.jem.internal.proxy.core.*;
+import org.eclipse.jem.internal.proxy.initParser.tree.ForExpression;
+import org.eclipse.jem.internal.proxy.initParser.tree.InfixOperator;
+/**
+ * This is the callback for the expression test thread transfer. This runs on the IDE side.
+ */
+public class ExpressionThreadTransferCallBack implements ICallback {
+	
+	Expression expression;
+	public Throwable error;
+	public ExpressionProxy ep;
+		
+	public ExpressionThreadTransferCallBack(Expression expression) {
+		this.expression = expression;
+	}
+	
+	public Object calledBack(int msgID, IBeanProxy parm){
+		return null;
+	}
+	
+	public Object calledBack(int msgID, Object parm) {
+		try {
+			expression.transferThread();
+			// The test here is for equality.
+			
+			ep = expression.createProxyAssignmentExpression(ForExpression.ROOTEXPRESSION);
+			expression.createInfixExpression(ForExpression.ASSIGNMENT_RIGHT, InfixOperator.IN_EQUALS, 0);
+			expression.createTypeLiteral(ForExpression.INFIX_LEFT, "java.lang.String");
+			expression.createTypeLiteral(ForExpression.INFIX_RIGHT, "java.lang.String");
+			
+			
+		} catch (RuntimeException e) {
+			error = e;
+		} finally {
+			if (expression.isValid())
+				try {
+					expression.beginTransferThread();	// Set to return expression to other thread.
+				} catch (IllegalStateException e) {
+					error = e;
+				} catch (ThrowableProxy e) {
+					error = e;
+				}	
+		}		
+		return null;
+	}
+	
+	public Object calledBack(int msgID, Object[] parms){
+		return null;
+	}
+	
+	public void calledBackStream(int msgID, InputStream in){
+	}	
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/ProxySuite.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/ProxySuite.java
new file mode 100644
index 0000000..1c13dd2
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/ProxySuite.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jem.tests.proxy;
+/*
+ *  $RCSfile: ProxySuite.java,v $
+ *  $Revision: 1.9 $  $Date: 2005/08/24 20:58:54 $ 
+ */
+import junit.framework.TestSuite;
+
+import org.eclipse.core.runtime.CoreException;
+
+import org.eclipse.jem.internal.proxy.core.*;
+import org.eclipse.jem.tests.JavaTestsPlugin;
+
+/**
+ * @author richkulp
+ * 
+ * This suite is for testing straight Proxy independent of the type of proxy (e.g. Remote or IDE).
+ * It can't run by itself. It needs to have the registry creater object stored in it so that
+ * the appropriate registry can be created and recreated as necessary by the test.
+ * 
+ * If the tests inherit from AbstractTestProxy the setRegistryHandler will be called on it.
+ */
+public class ProxySuite extends TestSuite {
+
+
+	// Test cases to be include in the suite
+	private static Class testsList[] = {
+		TestStandard.class,
+		TestAWTProxy.class,
+		ExpressionTest.class,
+									   } ;
+									   
+	public static String pkgName = "org.eclipse.jem.tests.proxy" ;
+	    
+	/**
+	 * Constructor for PackageSuite.
+	 */
+	public ProxySuite() {
+		super();
+		populateSuite();
+	}
+
+	/**
+	 * Constructor for PackageSuite.
+	 * @param theClass
+	 */
+	public ProxySuite(Class theClass) {
+		super(theClass);		
+		populateSuite();
+	}
+
+	/**
+	 * Constructor for PackageSuite.
+	 * @param name
+	 */
+	public ProxySuite(String name) {
+		super(name);		
+		populateSuite() ;
+	}
+
+	private void populateSuite () {
+		for (int i=0; i<testsList.length; i++)
+		  addTestSuite(testsList[i]) ;
+	}
+	
+	/**
+	 * Return a contributor to be used when starting tests so that ProxySuite can contribute to it.
+	 * @return A contributor for Proxy Suite tests
+	 */
+	public static IConfigurationContributor getProxySuiteContributor() {
+		return new ConfigurationContributorAdapter() {
+			public void contributeClasspaths(IConfigurationContributionController controller) throws CoreException {
+				controller.contributeClasspath(JavaTestsPlugin.getPlugin().getBundle(), "vm/tests.jar", IConfigurationContributionController.APPEND_USER_CLASSPATH, false);
+			}
+		};
+	}
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/TestAWTProxy.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/TestAWTProxy.java
new file mode 100644
index 0000000..e0c18b8
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/TestAWTProxy.java
@@ -0,0 +1,116 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jem.tests.proxy;
+/*
+ *  $RCSfile: TestAWTProxy.java,v $
+ *  $Revision: 1.5 $  $Date: 2005/08/24 20:58:54 $ 
+ */
+import org.eclipse.jem.internal.proxy.awt.IStandardAwtBeanProxyFactory;
+import org.eclipse.jem.internal.proxy.awt.JavaStandardAwtBeanConstants;
+import org.eclipse.jem.internal.proxy.core.*;
+
+/**
+ * @author richkulp
+ *
+ * To change the template for this generated type comment go to
+ * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
+ */
+public class TestAWTProxy extends AbstractTestProxy {
+
+	public TestAWTProxy() {
+		super();
+	}
+
+	public TestAWTProxy(String name) {
+		super(name);
+	}
+	
+	private JavaStandardAwtBeanConstants constants;	// If this is null then don't do tests.
+	
+	/* (non-Javadoc)
+	 * @see junit.framework.TestCase#setUp()
+	 */
+	protected void setUp() throws Exception {
+		super.setUp();
+		
+		constants = JavaStandardAwtBeanConstants.getConstants(registry);
+		assertNotNull(constants);
+		if (!constants.isAWTAvailable()) {
+			// this is not an error. It just means we don't anything. This is signified by constants being null.
+			constants = null;
+		}
+	}
+	
+	public void testAWTColor() throws ClassCastException, ThrowableProxy, InstantiationException {
+		if (constants == null)
+			return;	// No AWT, so test isn't done, but still considered good.
+			
+		// AWT Color tests
+		IBeanTypeProxy colorType = proxyTypeFactory.getBeanTypeProxy("java.awt.Color"); //$NON-NLS-1$
+		assertNotNull(colorType);
+		IBeanProxy colorProxy = colorType.newInstance("java.awt.Color.cyan"); //$NON-NLS-1$
+		assertNotNull(colorProxy);
+		assertEquals("java.awt.Color[r=0,g=255,b=255]", colorProxy.toBeanString());
+	}
+	
+	public void testAWTProxyFactory() {
+		if (constants == null)
+			return;	// No AWT, so test isn't done, but still considered good.
+			
+		IStandardAwtBeanProxyFactory awtProxyFactory = (IStandardAwtBeanProxyFactory) registry.getBeanProxyFactoryExtension(IStandardAwtBeanProxyFactory.REGISTRY_KEY);
+		assertNotNull(awtProxyFactory);
+		
+		// Test the creation through the helpers, plus test special methods 
+		IDimensionBeanProxy dimBean = awtProxyFactory.createDimensionBeanProxyWith(5,6);
+		assertNotNull(dimBean);
+		assertEquals("java.awt.Dimension[width=5,height=6]", dimBean.toBeanString()); //$NON-NLS-1$
+		assertEquals(5, dimBean.getWidth());
+		assertEquals(6, dimBean.getHeight());		
+		
+		IPointBeanProxy pointBean = awtProxyFactory.createPointBeanProxyWith(5,6);
+		assertNotNull(pointBean);
+		assertEquals("java.awt.Point[x=5,y=6]", pointBean.toBeanString()); //$NON-NLS-1$
+		assertEquals(5, pointBean.getX());
+		assertEquals(6, pointBean.getY());		
+		
+		IRectangleBeanProxy rectBean = awtProxyFactory.createBeanProxyWith(5,6,7,8);
+		assertNotNull(rectBean);
+		assertEquals("java.awt.Rectangle[x=5,y=6,width=7,height=8]", rectBean.toBeanString()); //$NON-NLS-1$
+		assertEquals(5, rectBean.getX());
+		assertEquals(6, rectBean.getY());		
+		assertEquals(7, rectBean.getWidth());
+		assertEquals(8, rectBean.getHeight());				
+	}
+	
+	public void testAWTSpecialsInitString() throws ClassCastException, ThrowableProxy, InstantiationException {
+		if (constants == null)
+			return;	// No AWT, so test isn't done, but still considered good.
+			
+		
+		// Test the creation through init strings
+		IBeanTypeProxy dimType = proxyTypeFactory.getBeanTypeProxy("java.awt.Dimension"); //$NON-NLS-1$
+		assertNotNull(dimType);		
+		IDimensionBeanProxy dimBean = (IDimensionBeanProxy) dimType.newInstance("new java.awt.Dimension(7,8)"); //$NON-NLS-1$
+		assertNotNull(dimBean);
+		assertEquals("java.awt.Dimension[width=7,height=8]", dimBean.toBeanString()); //$NON-NLS-1$
+		
+		IBeanTypeProxy pointType = proxyTypeFactory.getBeanTypeProxy("java.awt.Point"); //$NON-NLS-1$
+		IPointBeanProxy pointBean = (IPointBeanProxy) pointType.newInstance("new java.awt.Point(5,6)"); //$NON-NLS-1$
+		assertNotNull(pointBean);
+		assertEquals("java.awt.Point[x=5,y=6]", pointBean.toBeanString()); //$NON-NLS-1$
+		
+		IBeanTypeProxy rectType = proxyTypeFactory.getBeanTypeProxy("java.awt.Rectangle"); //$NON-NLS-1$
+		IRectangleBeanProxy rectBean = (IRectangleBeanProxy) rectType.newInstance("new java.awt.Rectangle(5,6,7,8)"); //$NON-NLS-1$
+		assertNotNull(rectBean);
+		assertEquals("java.awt.Rectangle[x=5,y=6,width=7,height=8]", rectBean.toBeanString()); //$NON-NLS-1$
+	}
+
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/TestCallback.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/TestCallback.java
new file mode 100644
index 0000000..d79334a
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/TestCallback.java
@@ -0,0 +1,128 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jem.tests.proxy;
+/*
+ *  $RCSfile: TestCallback.java,v $
+ *  $Revision: 1.5 $  $Date: 2005/08/24 20:58:54 $ 
+ */
+
+import org.eclipse.jem.internal.proxy.core.*;
+import java.io.InputStream;
+
+import junit.framework.TestCase;
+/**
+ * This is the callback for the test case. This runs on the IDE side.
+ */
+public class TestCallback implements ICallback {
+	
+	Object tester;
+	ProxyFactoryRegistry registry;
+	
+	int counter = 0;
+	
+	/**
+	 * This will do assert tests to make sure test completed correctly.
+	 */
+	public void testCompleted() {
+		if (badParmType != null)
+			TestCase.assertEquals(IIntegerBeanProxy.class, badParmType);
+		if (badParmValue != 0)
+			TestCase.assertEquals(goodParmValue, badParmValue);
+		if (badMsg != null)
+			TestCase.fail(badMsg);
+		TestCase.assertEquals(2, counter);
+	}
+	
+	private boolean stoppedTest;
+	private Class badParmType = null;
+	private int badParmValue, goodParmValue;
+	private String badMsg;
+	
+	// Normally the callback doesn't determine when to stop 
+	// the callback proxy. But for this test it does.
+	public TestCallback(Object t, ProxyFactoryRegistry registry) {
+		tester = t;
+		this.registry = registry;
+	}
+	
+	public Object calledBack(int msgID, IBeanProxy parm){
+		synchronized(tester) {
+			if (stoppedTest)
+				return null;	// We've already stopped, don't do anymore.
+		}
+		
+		if (msgID != 0) {
+			badMsg = "Msgid " + msgID + " is incorrect. It should be zero.";
+			stopTest();
+		} else if (parm instanceof IIntegerBeanProxy) {
+			int pv = ((IIntegerBeanProxy) parm).intValue();
+			if (++counter != pv) {
+				badParmValue = pv;
+				goodParmValue = counter;
+				stopTest();
+				return null;
+			}
+			if (counter == 2) {
+				stopTest();
+			}
+		} else {
+			// Bad parm type.
+			badParmType = parm.getClass();
+			stopTest();
+		}
+		return null;
+	}
+	
+	public Object calledBack(int msgID, Object parm) {
+		if (msgID != 1) {
+			badMsg = "Msgid " + msgID + " is incorrect. It should be one.";
+			stopTest();
+		} else if (parm instanceof Integer){
+			// We are going to use the registry to see what thread id is running when we call into it.
+			IMethodProxy currentThreadMethod = registry.getMethodProxyFactory().getMethodProxy("java.lang.Thread", "currentThread", null);
+			IBeanProxy thread = currentThreadMethod.invokeCatchThrowableExceptions(null);
+			IMethodProxy hashcodeMethod = registry.getMethodProxyFactory().getMethodProxy("java.lang.Object", "hashCode", null);
+			IBeanProxy threadID = hashcodeMethod.invokeCatchThrowableExceptions(thread);
+			if (threadID instanceof INumberBeanProxy) {
+				if (!parm.equals(((INumberBeanProxy) threadID).numberValue())) {
+					badMsg = "ThreadID returned from call not match parm sent it. Means callback not on same thread.";
+					stopTest();
+				}
+			} else {
+				badMsg = "ThreadID returned from call is not valid.";
+				stopTest();
+			}
+		} else {
+			badMsg = "Parm is invalid for calledBack with Object";
+			stopTest();
+		}
+		return null;
+	}
+	
+	public Object calledBack(int msgID, Object[] parms){
+		badMsg = "Failed Callback Test. Shouldn't have gotton to multi-parms"; //$NON-NLS-1$
+		stopTest();
+		return null;
+	}
+	
+	public void calledBackStream(int msgID, InputStream in){
+		badMsg = "Failed Callback Test. Shouldn't have gotton to input stream"; //$NON-NLS-1$
+		stopTest();
+	}	
+	
+	void stopTest() {
+		synchronized(tester) {
+			stoppedTest = true;
+			tester.notify();
+		}
+	}
+
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/TestCallbackStream.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/TestCallbackStream.java
new file mode 100644
index 0000000..0cdc274
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/TestCallbackStream.java
@@ -0,0 +1,112 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jem.tests.proxy;
+/*
+ *  $RCSfile: TestCallbackStream.java,v $
+ *  $Revision: 1.5 $  $Date: 2005/08/24 20:58:54 $ 
+ */
+
+import org.eclipse.jem.internal.proxy.core.*;
+import java.io.InputStream;
+import java.io.IOException;
+
+import junit.framework.TestCase;
+/**
+ * This is the callback for the test case of the stream. This runs on the IDE side.
+ */
+public class TestCallbackStream implements ICallback {
+
+	Object tester;	// Notified when the test is finished.
+	
+	private boolean testStopped;
+	private String badMsg;
+	private IOException exp;
+	private boolean testSuccesful;
+	
+	public TestCallbackStream(Object o) {
+		tester = o;
+	}
+	
+	public void testComplete() throws IOException {
+		if (badMsg != null)
+			TestCase.fail(badMsg);
+		if (exp != null)
+			throw exp;
+		TestCase.assertTrue(testSuccesful);
+	}
+
+	public Object calledBack(int msgID, Object  parm){
+		badMsg = "Failed Callback Test. Shouldn't have gotton to object parm"; //$NON-NLS-1$
+		stopTest();
+		return null;
+	}
+	public Object calledBack(int msgID, IBeanProxy parm){
+		badMsg = "Failed Callback Test. Shouldn't have gotton to parm"; //$NON-NLS-1$
+		stopTest();
+		return null;
+	}
+	public Object calledBack(int msgID, Object[] parms){
+		badMsg = "Failed Callback Test. Shouldn't have gotton to multi-parms"; //$NON-NLS-1$
+		stopTest();		
+		return null;
+	}
+	public void calledBackStream(int msgID, InputStream in){
+		// Read from the stream for 30000 bytes. Verify that
+		// we get an incrementing stream, i.e. 0, 1, ..., 127, -127, ...
+		
+		synchronized (tester) {
+			if (testStopped)
+				return;
+		}
+		for (int i=0; i<30000; i++) {
+			try {
+				int next = in.read();
+				if (next == -1) {
+					badMsg = "Failed Callback Stream test. Stream ended too soon. On counter="+String.valueOf(i); //$NON-NLS-1$
+					stopTest();
+					return;
+				}
+				
+				if (((byte) next) != ((byte) i)) {
+					badMsg = "Failed Callback Stream test. Did not get correct next byte at:" + i; //$NON-NLS-1$
+					stopTest();
+					return;
+				}
+			} catch (IOException e) {
+				exp = e;
+				stopTest();				
+				return;
+			}
+		}
+		
+		try {
+			if (in.read() != -1) {
+				badMsg = "Failed Callback Stream test. Too much data sent."; //$NON-NLS-1$
+				stopTest();				
+				return;
+			}
+		} catch (IOException e) {
+			exp = e;
+		}
+		
+		testSuccesful = true;
+		stopTest();
+	}
+	
+	void stopTest() {
+		synchronized(tester) {
+			testStopped = true;
+			tester.notify();
+		}
+	}
+		
+
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/TestStandard.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/TestStandard.java
new file mode 100644
index 0000000..6287025
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/TestStandard.java
@@ -0,0 +1,796 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jem.tests.proxy;
+import java.io.IOException;
+
+import org.eclipse.jem.internal.proxy.common.AmbiguousMethodException;
+import org.eclipse.jem.internal.proxy.core.*;
+
+/**
+ * @author richkulp
+ *
+ * To change the template for this generated type comment go to
+ * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
+ */
+public class TestStandard extends AbstractTestProxy {
+
+	/**
+	 * 
+	 */
+	public TestStandard() {
+		super();
+	}
+
+	/**
+	 * @param name
+	 */
+	public TestStandard(String name) {
+		super(name);
+	}
+
+	public void testObject() {
+		IBeanTypeProxy objectType = proxyTypeFactory.getBeanTypeProxy("java.lang.Object"); //$NON-NLS-1$
+		assertNotNull(objectType);
+		assertFalse(objectType.isArray());
+		assertEquals("java.lang.Object", objectType.getTypeName());
+	}
+	
+	public void testTypeOf() {
+		IBeanTypeProxy objectType = proxyTypeFactory.getBeanTypeProxy("java.lang.Object"); //$NON-NLS-1$		
+		IBeanTypeProxy integerType = proxyTypeFactory.getBeanTypeProxy("java.lang.Integer"); //$NON-NLS-1$
+		assertNotNull(integerType);
+		assertEquals("java.lang.Integer", integerType.getTypeName());
+		assertTrue(integerType.isKindOf(objectType));		
+	}
+	
+	public void testMethodInvoke() throws ThrowableProxy {		
+		IBeanTypeProxy integerType = proxyTypeFactory.getBeanTypeProxy("java.lang.Integer"); //$NON-NLS-1$		
+		IMethodProxy mthd = integerType.getMethodProxy("valueOf", "java.lang.String"); //$NON-NLS-1$ //$NON-NLS-2$
+		assertNotNull(mthd);
+		// See if we can invoke methods.
+		IIntegerBeanProxy anInt = (IIntegerBeanProxy) mthd.invoke(null, proxyFactory.createBeanProxyWith("5")); //$NON-NLS-1$
+		assertNotNull(anInt);
+		assertEquals(5, anInt.intValue());
+		// See if invoke with bad type throws the ExceptionProxy.
+		try {
+			mthd.invoke(null, proxyFactory.createBeanProxyWith(5));
+			fail("Exception not thrown like it should of been.");
+		} catch (ThrowableProxy e) {
+			// We should of gotton the exception. See if it is of the correct type.
+			assertEquals("java.lang.IllegalArgumentException", e.getTypeProxy().getTypeName()); //$NON-NLS-1$
+		}						
+	}
+
+	public void testInvoke() throws ThrowableProxy {
+		// Technically invokables should be used for one-shot usage, but here to test the invoke correctly
+		// it will be used twice. This is not an error, just overhead.
+		IBeanTypeProxy integerType = proxyTypeFactory.getBeanTypeProxy("java.lang.Integer"); //$NON-NLS-1$		
+		IInvokable invokable = integerType.getInvokable("valueOf", "java.lang.String"); //$NON-NLS-1$ //$NON-NLS-2$
+		assertNotNull(invokable);
+		// See if we can invoke methods.
+		IIntegerBeanProxy anInt = (IIntegerBeanProxy) invokable.invoke(null, proxyFactory.createBeanProxyWith("5")); //$NON-NLS-1$
+		assertNotNull(anInt);
+		assertEquals(5, anInt.intValue());
+		// See if invoke with bad type throws the ExceptionProxy.
+		try {
+			invokable.invoke(null, proxyFactory.createBeanProxyWith(5));
+			fail("Exception not thrown like it should of been.");
+		} catch (ThrowableProxy e) {
+			// We should of gotton the exception. See if it is of the correct type.
+			assertEquals("java.lang.IllegalArgumentException", e.getTypeProxy().getTypeName()); //$NON-NLS-1$
+		}						
+	}
+
+	public void testSimpleInitString() throws ThrowableProxy, InstantiationException {
+		IBeanTypeProxy integerType = proxyTypeFactory.getBeanTypeProxy("java.lang.Integer"); //$NON-NLS-1$				
+		// See if we can create it from an initialization string.
+		IIntegerBeanProxy anInt = (IIntegerBeanProxy) integerType.newInstance("new java.lang.Integer(6)"); //$NON-NLS-1$
+		assertNotNull(anInt);
+		assertEquals(6, anInt.intValue());
+
+		// See if string initialization works.
+		IStringBeanProxy aString = (IStringBeanProxy) proxyTypeFactory.getBeanTypeProxy("java.lang.String").newInstance("\"abcd\""); //$NON-NLS-1$ //$NON-NLS-2$
+		assertNotNull(aString);
+		assertEquals("abcd", aString.stringValue()); //$NON-NLS-1$
+	}
+	
+	public void testGetConstructors() {
+		IBeanTypeProxy stringType = proxyTypeFactory.getBeanTypeProxy("java.lang.String"); //$NON-NLS-1$				
+		
+		// Get all constructors.
+		IConstructorProxy[] ctors = stringType.getConstructors();
+		assertNotNull(ctors);
+		int expectedCtors = 11;
+		if (System.getProperty("java.version","").startsWith("1.5")) {
+			expectedCtors = 13;
+		} else if (System.getProperty("java.version","").startsWith("1.6")) {
+			expectedCtors = 15;
+		}
+		assertEquals(expectedCtors, ctors.length);		
+	}
+
+	public void testGetDeclaredConstructors() {
+		IBeanTypeProxy testAccessType = proxyTypeFactory.getBeanTypeProxy("testPackage.TestAccess"); //$NON-NLS-1$				
+		
+		// Get all constructors.
+		IConstructorProxy[] ctors = testAccessType.getDeclaredConstructors();
+		assertNotNull(ctors);
+		assertEquals(4, ctors.length);		
+	}
+
+	public void testSimpleConstructor() throws ThrowableProxy {
+		IBeanTypeProxy integerType = proxyTypeFactory.getBeanTypeProxy("java.lang.Integer"); //$NON-NLS-1$				
+		
+		// See if we can create it from a constructor.
+		IConstructorProxy ctor = integerType.getConstructorProxy(new String[] {"java.lang.String"}); //$NON-NLS-1$
+		assertNotNull(ctor);
+		IIntegerBeanProxy anInt = (IIntegerBeanProxy) ctor.newInstance(new IBeanProxy[] {proxyFactory.createBeanProxyWith("0")}); //$NON-NLS-1$
+		assertEquals(0, anInt.intValue());
+						
+		// Zero is cached, let's see if that is what we got above.
+		IIntegerBeanProxy aZero = proxyFactory.createBeanProxyWith(new Integer(0));
+		assertSame(anInt, aZero);
+	}
+
+	public void testSimpleDeclaredConstructor() throws ThrowableProxy {
+		IBeanTypeProxy testAccessType = proxyTypeFactory.getBeanTypeProxy("testPackage.TestAccess"); //$NON-NLS-1$				
+		
+		// See if we can get a private constructor.
+		IConstructorProxy ctor = testAccessType.getDeclaredConstructorProxy(new String[] {"java.lang.RuntimeException"}); //$NON-NLS-1$
+		assertNotNull(ctor);
+	}
+
+	public void testPrimitiveReturn() throws ThrowableProxy {
+		IBeanTypeProxy integerType = proxyTypeFactory.getBeanTypeProxy("java.lang.Integer"); //$NON-NLS-1$				
+		
+		// See that we get a primitive back when the method return type is a primitive.
+		IMethodProxy mthdPrim = integerType.getMethodProxy("intValue"); //$NON-NLS-1$
+		IIntegerBeanProxy anInt = (IIntegerBeanProxy) mthdPrim.invoke(proxyFactory.createBeanProxyWith(5));
+		assertEquals("int", anInt.getTypeProxy().getTypeName()); //$NON-NLS-1$
+		assertEquals(5, anInt.intValue());
+		
+		// See that we get a primitive back when the field is a primitive.
+		IFieldProxy fieldPrim = integerType.getFieldProxy("MIN_VALUE"); //$NON-NLS-1$
+		anInt = (IIntegerBeanProxy) fieldPrim.get(null);
+		assertEquals("int", anInt.getTypeProxy().getTypeName()); //$NON-NLS-1$
+		assertEquals(Integer.MIN_VALUE, anInt.intValue());	
+	}
+	
+	public void testPrimitiveArrayType() {
+		// Test Primitive arrays.
+		IArrayBeanTypeProxy arrayType = (IArrayBeanTypeProxy) proxyTypeFactory.getBeanTypeProxy("[I"); //$NON-NLS-1$
+		assertNotNull(arrayType);
+		assertTrue(arrayType.isArray());
+		assertEquals("[I", arrayType.getTypeName()); //$NON-NLS-1$
+		assertEquals(proxyTypeFactory.getBeanTypeProxy("int"), arrayType.getComponentType()); //$NON-NLS-1$
+	}
+	
+	public void testObjectArrayType() {
+		// Test simple object type array
+		IArrayBeanTypeProxy arrayType = (IArrayBeanTypeProxy) proxyTypeFactory.getBeanTypeProxy("[Ljava.lang.Integer;"); //$NON-NLS-1$
+		assertNotNull(arrayType);
+		assertTrue(arrayType.isArray());
+		assertEquals("[Ljava.lang.Integer;", arrayType.getTypeName()); //$NON-NLS-1$
+		assertEquals(proxyTypeFactory.getBeanTypeProxy("java.lang.Integer"), arrayType.getComponentType()); //$NON-NLS-1$		
+	}
+	
+	public void testPrimitive2DArrayType() {
+		// Test two dimension primitive array
+		IArrayBeanTypeProxy arrayType = (IArrayBeanTypeProxy) proxyTypeFactory.getBeanTypeProxy("[[I"); //$NON-NLS-1$
+		assertNotNull(arrayType);
+		assertTrue(arrayType.isArray());
+		assertEquals("[[I", arrayType.getTypeName()); //$NON-NLS-1$
+		assertEquals(proxyTypeFactory.getBeanTypeProxy("[I"), arrayType.getComponentType()); //$NON-NLS-1$
+		
+		// Test construction using accessor.
+		arrayType = (IArrayBeanTypeProxy) proxyTypeFactory.getBeanTypeProxy("int", 2); //$NON-NLS-1$
+		assertNotNull(arrayType);
+		assertTrue(arrayType.isArray());
+		assertEquals("[[I", arrayType.getTypeName()); //$NON-NLS-1$
+	}
+	
+	public void testObject2DArrayType() {
+		// Test two dimension object type array
+		IArrayBeanTypeProxy arrayType = (IArrayBeanTypeProxy) proxyTypeFactory.getBeanTypeProxy("[[Ljava.lang.Integer;"); //$NON-NLS-1$
+		assertNotNull(arrayType);
+		assertTrue(arrayType.isArray());
+		assertEquals("[[Ljava.lang.Integer;", arrayType.getTypeName()); //$NON-NLS-1$
+		assertEquals(proxyTypeFactory.getBeanTypeProxy("[Ljava.lang.Integer;"), arrayType.getComponentType()); //$NON-NLS-1$
+		
+		// Test get type using accessor.
+		arrayType = (IArrayBeanTypeProxy) proxyTypeFactory.getBeanTypeProxy("java.lang.Integer", 2); //$NON-NLS-1$
+		assertNotNull(arrayType);
+		assertTrue(arrayType.isArray());
+		assertEquals("[[Ljava.lang.Integer;", arrayType.getTypeName()); //$NON-NLS-1$		
+	}
+	
+	public void testArrayTypeFromArrayType() {
+		// Test creating an array type from an array type, i.e. adding dimensions.
+		IArrayBeanTypeProxy arrayType = (IArrayBeanTypeProxy) proxyTypeFactory.getBeanTypeProxy("[Ljava.lang.Integer;", 2); //$NON-NLS-1$
+		assertNotNull(arrayType);
+		assertTrue(arrayType.isArray());
+		assertEquals("[[[Ljava.lang.Integer;", arrayType.getTypeName()); //$NON-NLS-1$
+	}
+	
+	public void testArrayFromAccessorSimpleType() throws ThrowableProxy {
+		IBeanTypeProxy integerType = proxyTypeFactory.getBeanTypeProxy("java.lang.Integer"); //$NON-NLS-1$				
+		
+		// Test creating an array with accessor of more than one dimension with component type not an array.
+		IArrayBeanProxy arrayProxy = proxyFactory.createBeanProxyWith(integerType, new int[] {3, 4});
+		assertNotNull(arrayProxy);
+		assertEquals("[[Ljava.lang.Integer;", arrayProxy.getTypeProxy().getTypeName()); //$NON-NLS-1$
+		assertEquals(3, arrayProxy.getLength());
+		
+		// get(0) should be an Integer[4].
+		arrayProxy = (IArrayBeanProxy) arrayProxy.get(0);
+		assertNotNull(arrayProxy);
+		assertEquals(4, arrayProxy.getLength());				
+	}
+	
+	public void testArrayFromAccessorArrayType() throws ThrowableProxy {
+		IArrayBeanTypeProxy arrayType = (IArrayBeanTypeProxy) proxyTypeFactory.getBeanTypeProxy("java.lang.Integer", 1); //$NON-NLS-1$
+		
+		// Test creating an array with accessor but component type is an array.		
+		IArrayBeanProxy arrayProxy = proxyFactory.createBeanProxyWith(arrayType, new int[] {1});
+		assertNotNull(arrayProxy);
+		assertEquals("[Ljava.lang.Integer;", arrayProxy.getTypeProxy().getTypeName()); //$NON-NLS-1$
+		assertEquals(1, arrayProxy.getLength());
+	}
+	
+	public void testArrayFromAccessorArrayTypeMultiDim() throws ThrowableProxy {
+		IArrayBeanTypeProxy arrayType = (IArrayBeanTypeProxy) proxyTypeFactory.getBeanTypeProxy("java.lang.Integer", 1); //$NON-NLS-1$
+
+		// Test creating an array with accessor but component type is an array, but extend and add a dimension.		
+		IArrayBeanProxy arrayProxy = proxyFactory.createBeanProxyWith(arrayType, new int[] {2 ,3});
+		assertNotNull(arrayProxy);
+		assertEquals("[[Ljava.lang.Integer;", arrayProxy.getTypeProxy().getTypeName()); //$NON-NLS-1$
+		assertEquals(2, arrayProxy.getLength());
+
+		// Test first entry is an Integer[3]		
+		IArrayBeanProxy idx1 = (IArrayBeanProxy) arrayProxy.get(0);
+		assertNotNull(idx1);
+		assertEquals(3, idx1.getLength());
+		
+		// Test [1][2] is null.
+		IBeanProxy idx2 = arrayProxy.get(new int [] {1,2});
+		assertNull(idx2);
+	}
+	
+	public void testArraySet() throws ThrowableProxy {
+		IBeanProxy anInt = proxyFactory.createBeanProxyWith(new java.lang.Integer(23));
+		IArrayBeanTypeProxy arrayType = (IArrayBeanTypeProxy) proxyTypeFactory.getBeanTypeProxy("java.lang.Integer", 1); //$NON-NLS-1$
+		
+		IArrayBeanProxy arrayProxy = proxyFactory.createBeanProxyWith(arrayType, new int[] {2 ,3});
+		assertNotNull(arrayProxy);
+		assertEquals("[[Ljava.lang.Integer;", arrayProxy.getTypeProxy().getTypeName()); //$NON-NLS-1$
+		assertEquals(2, arrayProxy.getLength());
+
+		// Test first entry is an Integer[3]		
+		IArrayBeanProxy idx1 = (IArrayBeanProxy) arrayProxy.get(0);
+		
+		// Test set into array idx1, but retrieve from arrayProxy. Tests
+		//   1) Set with one index into array from outer array[0]
+		//   2) Get with multi index from outer array
+		//   3) And that the same array is set that exists within the first array.
+		idx1.set(anInt, 2);
+		IBeanProxy idx3 = arrayProxy.get(new int[] {0, 2});
+		assertNotNull(idx3);
+		assertEquals("java.lang.Integer", idx3.getTypeProxy().getTypeName()); //$NON-NLS-1$
+		assertEquals(anInt, idx3);
+		
+		// Inverse test of above, multi set, single get of same array.
+		arrayProxy.set(anInt, new int[] {0,1});
+		assertEquals(anInt, idx1.get(1));
+	}
+
+	public void testArraySnapshot2DimArray() throws ThrowableProxy {
+		IArrayBeanTypeProxy arrayType = (IArrayBeanTypeProxy) proxyTypeFactory.getBeanTypeProxy("java.lang.Integer", 2); //$NON-NLS-1$
+		
+		IArrayBeanProxy arrayProxy = proxyFactory.createBeanProxyWith(arrayType, new int[] {2, 3});
+		assertNotNull(arrayProxy);
+
+		// Get the two entries which are Integer[3]		
+		IArrayBeanProxy idx0 = (IArrayBeanProxy) arrayProxy.get(0);
+		IArrayBeanProxy idx1 = (IArrayBeanProxy) arrayProxy.get(1);
+		
+		// Now get the snapshot and see if the entries are idx0 and idx1.
+		IBeanProxy[] snapshot = arrayProxy.getSnapshot();
+		assertEquals(idx0, snapshot[0]);
+		assertEquals(idx1, snapshot[1]);
+	}
+
+	public void testArraySnapshotPrimitiveArray() throws ThrowableProxy {
+		IArrayBeanTypeProxy arrayType = (IArrayBeanTypeProxy) proxyTypeFactory.getBeanTypeProxy("int", 1); //$NON-NLS-1$
+		
+		IArrayBeanProxy arrayProxy = proxyFactory.createBeanProxyWith(arrayType, new int[] {2});
+		assertNotNull(arrayProxy);
+
+		// Set the two entries to int values.
+		arrayProxy.set(proxyFactory.createBeanProxyWith(2), 0);
+		arrayProxy.set(proxyFactory.createBeanProxyWith(3), 1);
+		IIntegerBeanProxy idx0 = (IIntegerBeanProxy) arrayProxy.get(0);
+		IIntegerBeanProxy idx1 = (IIntegerBeanProxy) arrayProxy.get(1);
+		assertEquals(2, idx0.intValue());
+		assertEquals(3, idx1.intValue());
+		
+		// Now get the snapshot and see if the entries are idx0 and idx1.
+		IBeanProxy[] snapshot = arrayProxy.getSnapshot();
+		assertEquals(idx0, snapshot[0]);
+		assertEquals(idx1, snapshot[1]);
+	}
+
+	public void testEmptyArray() throws ThrowableProxy {
+		IArrayBeanTypeProxy arrayType = (IArrayBeanTypeProxy) proxyTypeFactory.getBeanTypeProxy("java.lang.Integer", 1); //$NON-NLS-1$
+
+		// Create an empty one dimensional array		
+		IArrayBeanProxy arrayProxy = proxyFactory.createBeanProxyWith(arrayType, null);
+		assertNotNull(arrayProxy);
+		assertEquals("[Ljava.lang.Integer;", arrayProxy.getTypeProxy().getTypeName()); //$NON-NLS-1$
+		assertEquals(0, arrayProxy.getLength());
+	}
+	
+	public void testEmpty2DArray() throws ThrowableProxy {
+		// Create an emtpy two dimensional array		
+		IArrayBeanProxy arrayProxy = proxyFactory.createBeanProxyWith(proxyTypeFactory.getBeanTypeProxy("java.lang.Integer", 2), null); //$NON-NLS-1$
+		assertNotNull(arrayProxy);
+		assertEquals("[[Ljava.lang.Integer;", arrayProxy.getTypeProxy().getTypeName()); //$NON-NLS-1$
+		assertEquals(0, arrayProxy.getLength());		
+	}
+	
+	public void test2DArray() throws ThrowableProxy {
+		// Create a 2D array with three empty entries in dim 0. 
+		IArrayBeanProxy arrayProxy = proxyFactory.createBeanProxyWith(proxyTypeFactory.getBeanTypeProxy("java.lang.Integer", 2), 3); //$NON-NLS-1$
+		assertNotNull(arrayProxy);
+		assertEquals("[[Ljava.lang.Integer;", arrayProxy.getTypeProxy().getTypeName()); //$NON-NLS-1$
+		assertEquals(3, arrayProxy.getLength());
+		// Array entry should be empty.
+		IArrayBeanProxy idx1 = (IArrayBeanProxy) arrayProxy.get(0);
+		assertNull(idx1);		
+	}
+	
+	public void testPrimitiveArray() throws ThrowableProxy {
+		// Make sure that if the final component type is an
+		// int (primitive) that we get a primitive proxy back and not an Integer object.		
+		IArrayBeanTypeProxy arrayType = (IArrayBeanTypeProxy) proxyTypeFactory.getBeanTypeProxy("int", 1); //$NON-NLS-1$
+		IArrayBeanProxy arrayProxy = proxyFactory.createBeanProxyWith(arrayType, 3);
+		arrayProxy.set(proxyFactory.createBeanProxyWith(44), 1);
+		IBeanProxy idx1 = arrayProxy.get(1);
+		assertNotNull(idx1);
+		assertEquals("int", idx1.getTypeProxy().getTypeName()); //$NON-NLS-1$
+		assertEquals(44, ((IIntegerBeanProxy) idx1).intValue());
+	}
+	
+	public void testArrayEquals() throws ThrowableProxy {
+		// Test that array equals works (does semantic equals and not identity equals).
+		primIntEquals();
+		primBoolEquals();
+		primByteEquals();
+		primShortEquals();
+		primCharEquals();
+		primDoubleEquals();
+		primFloatEquals();
+		primLongEquals();
+		objectEquals();
+	}
+	
+	private void primIntEquals() throws ThrowableProxy {
+		IArrayBeanTypeProxy arrayType = (IArrayBeanTypeProxy) proxyTypeFactory.getBeanTypeProxy("int", 1); //$NON-NLS-1$
+		IArrayBeanProxy arrayProxy = proxyFactory.createBeanProxyWith(arrayType, 3);
+		arrayProxy.set(proxyFactory.createBeanProxyWith(44), 1);
+
+		IArrayBeanProxy array2Proxy = proxyFactory.createBeanProxyWith(arrayType, 3);
+		array2Proxy.set(proxyFactory.createBeanProxyWith(44), 1);
+
+		assertTrue(arrayProxy.equals(array2Proxy));
+		
+		// change the value of one so now different.
+		array2Proxy.set(proxyFactory.createBeanProxyWith(55), 1);
+		assertFalse(arrayProxy.equals(array2Proxy));
+		
+		// One side test that if not compatible it should be false.
+		IArrayBeanTypeProxy array3Type = (IArrayBeanTypeProxy) proxyTypeFactory.getBeanTypeProxy("long", 1); //$NON-NLS-1$
+		IArrayBeanProxy array3Proxy = proxyFactory.createBeanProxyWith(array3Type, 3);
+		array3Proxy.set(proxyFactory.createBeanProxyWith(44l), 1);
+		assertFalse(arrayProxy.equals(array3Proxy));
+	}
+	
+	private void primBoolEquals() throws ThrowableProxy {
+		IArrayBeanTypeProxy arrayType = (IArrayBeanTypeProxy) proxyTypeFactory.getBeanTypeProxy("boolean", 1); //$NON-NLS-1$
+		IArrayBeanProxy arrayProxy = proxyFactory.createBeanProxyWith(arrayType, 3);
+		arrayProxy.set(proxyFactory.createBeanProxyWith(true), 1);
+
+		IArrayBeanProxy array2Proxy = proxyFactory.createBeanProxyWith(arrayType, 3);
+		array2Proxy.set(proxyFactory.createBeanProxyWith(true), 1);
+
+		assertTrue(arrayProxy.equals(array2Proxy));
+		
+		// change the value of one so now different.
+		array2Proxy.set(proxyFactory.createBeanProxyWith(false), 1);
+		assertFalse(arrayProxy.equals(array2Proxy));		
+	}
+
+	private void primByteEquals() throws ThrowableProxy {
+		IArrayBeanTypeProxy arrayType = (IArrayBeanTypeProxy) proxyTypeFactory.getBeanTypeProxy("byte", 1); //$NON-NLS-1$
+		IArrayBeanProxy arrayProxy = proxyFactory.createBeanProxyWith(arrayType, 3);
+		arrayProxy.set(proxyFactory.createBeanProxyWith((byte) 3), 1);
+
+		IArrayBeanProxy array2Proxy = proxyFactory.createBeanProxyWith(arrayType, 3);
+		array2Proxy.set(proxyFactory.createBeanProxyWith((byte) 3), 1);
+
+		assertTrue(arrayProxy.equals(array2Proxy));
+		
+		// change the value of one so now different.
+		array2Proxy.set(proxyFactory.createBeanProxyWith((byte) 4), 1);
+		assertFalse(arrayProxy.equals(array2Proxy));		
+	}
+
+	private void primShortEquals() throws ThrowableProxy {
+		IArrayBeanTypeProxy arrayType = (IArrayBeanTypeProxy) proxyTypeFactory.getBeanTypeProxy("short", 1); //$NON-NLS-1$
+		IArrayBeanProxy arrayProxy = proxyFactory.createBeanProxyWith(arrayType, 3);
+		arrayProxy.set(proxyFactory.createBeanProxyWith((short) 3), 1);
+
+		IArrayBeanProxy array2Proxy = proxyFactory.createBeanProxyWith(arrayType, 3);
+		array2Proxy.set(proxyFactory.createBeanProxyWith((short) 3), 1);
+
+		assertTrue(arrayProxy.equals(array2Proxy));
+		
+		// change the value of one so now different.
+		array2Proxy.set(proxyFactory.createBeanProxyWith((short) 4), 1);
+		assertFalse(arrayProxy.equals(array2Proxy));		
+	}
+
+	private void primCharEquals() throws ThrowableProxy {
+		IArrayBeanTypeProxy arrayType = (IArrayBeanTypeProxy) proxyTypeFactory.getBeanTypeProxy("char", 1); //$NON-NLS-1$
+		IArrayBeanProxy arrayProxy = proxyFactory.createBeanProxyWith(arrayType, 3);
+		arrayProxy.set(proxyFactory.createBeanProxyWith('a'), 1);
+
+		IArrayBeanProxy array2Proxy = proxyFactory.createBeanProxyWith(arrayType, 3);
+		array2Proxy.set(proxyFactory.createBeanProxyWith('a'), 1);
+
+		assertTrue(arrayProxy.equals(array2Proxy));
+		
+		// change the value of one so now different.
+		array2Proxy.set(proxyFactory.createBeanProxyWith('b'), 1);
+		assertFalse(arrayProxy.equals(array2Proxy));		
+	}
+	
+	private void primDoubleEquals() throws ThrowableProxy {
+		IArrayBeanTypeProxy arrayType = (IArrayBeanTypeProxy) proxyTypeFactory.getBeanTypeProxy("double", 1); //$NON-NLS-1$
+		IArrayBeanProxy arrayProxy = proxyFactory.createBeanProxyWith(arrayType, 3);
+		arrayProxy.set(proxyFactory.createBeanProxyWith(4.3d), 1);
+
+		IArrayBeanProxy array2Proxy = proxyFactory.createBeanProxyWith(arrayType, 3);
+		array2Proxy.set(proxyFactory.createBeanProxyWith(4.3d), 1);
+
+		assertTrue(arrayProxy.equals(array2Proxy));
+		
+		// change the value of one so now different.
+		array2Proxy.set(proxyFactory.createBeanProxyWith(10d), 1);
+		assertFalse(arrayProxy.equals(array2Proxy));		
+	}
+
+	private void primFloatEquals() throws ThrowableProxy {
+		IArrayBeanTypeProxy arrayType = (IArrayBeanTypeProxy) proxyTypeFactory.getBeanTypeProxy("float", 1); //$NON-NLS-1$
+		IArrayBeanProxy arrayProxy = proxyFactory.createBeanProxyWith(arrayType, 3);
+		arrayProxy.set(proxyFactory.createBeanProxyWith(4.3f), 1);
+
+		IArrayBeanProxy array2Proxy = proxyFactory.createBeanProxyWith(arrayType, 3);
+		array2Proxy.set(proxyFactory.createBeanProxyWith(4.3f), 1);
+
+		assertTrue(arrayProxy.equals(array2Proxy));
+		
+		// change the value of one so now different.
+		array2Proxy.set(proxyFactory.createBeanProxyWith(10f), 1);
+		assertFalse(arrayProxy.equals(array2Proxy));		
+	}
+
+	private void primLongEquals() throws ThrowableProxy {
+		IArrayBeanTypeProxy arrayType = (IArrayBeanTypeProxy) proxyTypeFactory.getBeanTypeProxy("long", 1); //$NON-NLS-1$
+		IArrayBeanProxy arrayProxy = proxyFactory.createBeanProxyWith(arrayType, 3);
+		arrayProxy.set(proxyFactory.createBeanProxyWith(1l), 1);
+
+		IArrayBeanProxy array2Proxy = proxyFactory.createBeanProxyWith(arrayType, 3);
+		array2Proxy.set(proxyFactory.createBeanProxyWith(1l), 1);
+
+		assertTrue(arrayProxy.equals(array2Proxy));
+		
+		// change the value of one so now different.
+		array2Proxy.set(proxyFactory.createBeanProxyWith(2l), 1);
+		assertFalse(arrayProxy.equals(array2Proxy));		
+	}
+
+	private void objectEquals() throws ThrowableProxy {
+		IArrayBeanTypeProxy arrayType = (IArrayBeanTypeProxy) proxyTypeFactory.getBeanTypeProxy("java.lang.Integer", 1); //$NON-NLS-1$
+		IArrayBeanProxy arrayProxy = proxyFactory.createBeanProxyWith(arrayType, 3);
+		arrayProxy.set(proxyFactory.createBeanProxyWith(new Integer(1)), 1);
+
+		IArrayBeanProxy array2Proxy = proxyFactory.createBeanProxyWith(arrayType, 3);
+		array2Proxy.set(proxyFactory.createBeanProxyWith(new Integer(1)), 1);
+
+		assertTrue(arrayProxy.equals(array2Proxy));
+		
+		// change the value of one so now different.
+		array2Proxy.set(proxyFactory.createBeanProxyWith(new Integer(2)), 1);
+		assertFalse(arrayProxy.equals(array2Proxy));		
+	}
+
+
+	public void testCollections() throws ThrowableProxy {
+		IBeanTypeProxy vectorType = proxyTypeFactory.getBeanTypeProxy("java.util.Vector"); //$NON-NLS-1$
+		IBeanProxy vectorProxy = vectorType.newInstance();
+		CollectionBeanProxyWrapper col = new CollectionBeanProxyWrapper(vectorProxy);
+		
+		// Test adding
+		assertTrue(col.add(proxyFactory.createBeanProxyWith(33)));
+		assertEquals(1, col.size());
+			
+		// Test toArray, first entry should be 33 and length should be 1.
+		IArrayBeanProxy arrayOut = col.toArray();
+		assertEquals(1, arrayOut.getLength());
+		assertEquals(33, ((IIntegerBeanProxy) arrayOut.get(0)).intValue());
+		
+		// Test toArray(array).
+		IArrayBeanProxy arrayInto = proxyFactory.createBeanProxyWith(arrayOut.getTypeProxy(), arrayOut.getLength()); //$NON-NLS-1$
+		IArrayBeanProxy arrayOut2 = col.toArray(arrayInto);
+		// It should of been the exact same array (arrayInto == arrayOut2 under the proxies).
+		assertTrue(arrayInto.sameAs(arrayOut2));
+		assertEquals(33, ((IIntegerBeanProxy) arrayOut.get(0)).intValue());
+		
+		// Test setting with wrong type throws exception.
+		try {
+			// Test the setting with wrong type throws an exception
+			col = new CollectionBeanProxyWrapper(arrayOut);
+			fail("ClassCastException should of been thrown.");
+		} catch (ClassCastException e) {
+			// If here, then the test was passed
+		}
+	}
+	
+	public void testIterator() throws ThrowableProxy {
+		IBeanTypeProxy vectorType = proxyTypeFactory.getBeanTypeProxy("java.util.Vector"); //$NON-NLS-1$
+		IBeanProxy vectorProxy = vectorType.newInstance();
+		CollectionBeanProxyWrapper col = new CollectionBeanProxyWrapper(vectorProxy);
+		col.add(proxyFactory.createBeanProxyWith(33));		
+		
+		// See if the iterator interface works.
+		IteratorBeanProxyWrapper itrProxy = col.iterator();
+		assertNotNull(itrProxy);
+		int iterations = 0;
+		while (itrProxy.hasNext()) {
+			iterations++;
+			assertTrue(iterations < 2);
+			IBeanProxy itrValue = itrProxy.next();
+			assertEquals(33, ((IIntegerBeanProxy) itrValue).intValue());
+		}
+	}
+	
+	public void testListInterface() throws ThrowableProxy {
+		IBeanTypeProxy vectorType = proxyTypeFactory.getBeanTypeProxy("java.util.Vector"); //$NON-NLS-1$
+		IBeanProxy vectorProxy = vectorType.newInstance();
+		
+		// See if the list inteface works.
+		ListBeanProxyWrapper list = new ListBeanProxyWrapper(vectorProxy);
+		assertTrue(list.add(proxyFactory.createBeanProxyWith(33)));	// First entry.
+		list.add(0, proxyFactory.createBeanProxyWith(true));	// Now becomes first entry.
+		assertEquals(2, list.size());
+		assertEquals(true, ((IBooleanBeanProxy) list.get(0)).booleanValue());
+		assertEquals(33, ((IIntegerBeanProxy) list.get(1)).intValue());	// Swapped to second entry due to add(0,...)		
+	}
+	
+	public void testListIterator() throws ThrowableProxy {
+		IBeanTypeProxy vectorType = proxyTypeFactory.getBeanTypeProxy("java.util.Vector"); //$NON-NLS-1$
+		IBeanProxy vectorProxy = vectorType.newInstance();
+		ListBeanProxyWrapper list = new ListBeanProxyWrapper(vectorProxy);
+		list.add(proxyFactory.createBeanProxyWith(33));	// First entry.
+		list.add(0, proxyFactory.createBeanProxyWith(true));	// Now becomes first entry.
+
+		// See if the ListIterator interface works
+		ListIteratorBeanProxyWrapper lItrProxy = list.listIterator();
+		assertNotNull(lItrProxy);
+		assertTrue(lItrProxy.hasNext());
+		IBooleanBeanProxy bool1 = (IBooleanBeanProxy) lItrProxy.next();
+		assertEquals(true, bool1.booleanValue());
+		IIntegerBeanProxy int1 = (IIntegerBeanProxy) lItrProxy.next();
+		assertEquals(33, int1.intValue());	// Old first entry moved to second entry by add(0,...) above.
+		assertFalse(lItrProxy.hasNext());
+		assertEquals(1, lItrProxy.previousIndex());
+	}
+	
+	public void testMethodAccessors() throws ThrowableProxy {
+		IBeanTypeProxy integerType = proxyTypeFactory.getBeanTypeProxy("java.lang.Integer"); //$NON-NLS-1$				
+		
+		// Test able to access beantype proxy and invoke methods on it. This isn't
+		// the approved way of getting methods, but it tests that method proxies
+		// are created correctly if returned from an invoke method.
+		IBeanTypeProxy classTypeProxy = proxyTypeFactory.getBeanTypeProxy("java.lang.Class"); //$NON-NLS-1$
+		IMethodProxy getMethodMethod = classTypeProxy.getMethodProxy("getMethod", new String[] {"java.lang.String", "[Ljava.lang.Class;"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		// Get the Integer.byteValue() method through an invoke instead of a method factory or bean type.
+		IBeanProxy method = getMethodMethod.invoke(integerType, new IBeanProxy[] {
+			proxyFactory.createBeanProxyWith("byteValue"), null}); //$NON-NLS-1$
+		assertNotNull(method);
+		assertTrue(method instanceof IMethodProxy);
+		
+		// Now invoke it to see if correct answer comes back.
+		IBeanProxy byteValue = ((IMethodProxy) method).invoke(proxyFactory.createBeanProxyWith(new Integer(254)));
+		assertNotNull(byteValue);
+		assertEquals("byte", byteValue.getTypeProxy().getTypeName()); //$NON-NLS-1$
+		assertEquals((byte)254, ((INumberBeanProxy) byteValue).byteValue());
+	}
+	
+	public void testInvokableAccessors() throws ThrowableProxy {
+		IBeanTypeProxy integerType = proxyTypeFactory.getBeanTypeProxy("java.lang.Integer"); //$NON-NLS-1$				
+		
+		// Test able to access beantype proxy and invoke methods on it. This isn't
+		// the approved way of getting methods, but it tests that method proxies
+		// are created correctly if returned from an invoke method.
+		IBeanTypeProxy classTypeProxy = proxyTypeFactory.getBeanTypeProxy("java.lang.Class"); //$NON-NLS-1$
+		IInvokable getMethodInvokable = classTypeProxy.getInvokable("getMethod", new String[] {"java.lang.String", "[Ljava.lang.Class;"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		// Get the Integer.byteValue() method through an invoke instead of a method factory or bean type.
+		IBeanProxy method = getMethodInvokable.invoke(integerType, new IBeanProxy[] {
+			proxyFactory.createBeanProxyWith("byteValue"), null}); //$NON-NLS-1$
+		assertNotNull(method);
+		assertTrue(method instanceof IMethodProxy);
+		
+		// Now invoke it to see if correct answer comes back.
+		IBeanProxy byteValue = ((IMethodProxy) method).invoke(proxyFactory.createBeanProxyWith(new Integer(254)));
+		assertNotNull(byteValue);
+		assertEquals("byte", byteValue.getTypeProxy().getTypeName()); //$NON-NLS-1$
+		assertEquals((byte)254, ((INumberBeanProxy) byteValue).byteValue());
+	}	
+	
+	public void testCallback() throws ThrowableProxy {
+		System.out.println("--- Starting the callback test ---"); //$NON-NLS-1$
+		IBeanTypeProxy callbackType = proxyTypeFactory.getBeanTypeProxy("org.eclipse.jem.tests.proxy.vm.TestCallback"); //$NON-NLS-1$
+		assertNotNull(callbackType);
+		Object testObject = new Object();
+		IBeanProxy callbackProxy = callbackType.newInstance();
+		TestCallback cb = new TestCallback(testObject, registry);
+		registry.getCallbackRegistry().registerCallback(callbackProxy, cb);
+		IInvokable start = callbackType.getInvokable("start");	//$NON-NLS-1$
+		IInvokable stop = callbackType.getInvokable("stop");	//$NON-NLS-1$
+		synchronized(testObject) {
+			start.invokeCatchThrowableExceptions(callbackProxy);
+			try {
+				testObject.wait(30000);	// Should be done by 30 seconds.
+			} catch (InterruptedException e) {
+			}
+		}				
+		stop.invokeCatchThrowableExceptions(callbackProxy);
+		registry.getCallbackRegistry().deregisterCallback(callbackProxy);				
+		cb.testCompleted();
+		System.out.println("If there is anything in the .log file, then the test failed.");			 //$NON-NLS-1$		
+	}
+	
+	public void testCallbackStream() throws ThrowableProxy, IOException {
+		System.out.println("--- Starting the callback stream test ---"); //$NON-NLS-1$
+		IBeanTypeProxy callbackType = proxyTypeFactory.getBeanTypeProxy("org.eclipse.jem.tests.proxy.vm.TestCallbackStream"); //$NON-NLS-1$
+		assertNotNull(callbackType);
+		Object testObject = new Object();
+		IBeanProxy callbackProxy = callbackType.newInstance();
+		TestCallbackStream cb = new TestCallbackStream(testObject);
+		registry.getCallbackRegistry().registerCallback(callbackProxy, cb);
+		IMethodProxy start = callbackType.getMethodProxy("start");							 //$NON-NLS-1$
+		synchronized(testObject) {			
+			start.invokeCatchThrowableExceptions(callbackProxy);
+		try {
+				testObject.wait(30000);	// Should be done by 30 seconds.
+			} catch (InterruptedException e) {
+			}	
+		}		
+		registry.getCallbackRegistry().deregisterCallback(callbackProxy);				
+		cb.testComplete();
+		System.out.println("If there is anything in the .log file, then the test failed.");			 //$NON-NLS-1$		
+	}
+	
+	public void testSimpleGetField() throws ThrowableProxy {
+		IBeanTypeProxy integerType = proxyTypeFactory.getBeanTypeProxy("java.lang.Integer"); //$NON-NLS-1$				
+		
+		// Get the public field.
+		IFieldProxy field = integerType.getFieldProxy("MAX_VALUE"); //$NON-NLS-1$
+		assertNotNull(field);
+	}
+
+	public void testSimpleGetDeclaredField() throws ThrowableProxy {
+		IBeanTypeProxy integerType = proxyTypeFactory.getBeanTypeProxy("java.lang.Integer"); //$NON-NLS-1$				
+		
+		// Get the public field.
+		IFieldProxy field = integerType.getDeclaredFieldProxy("value"); //$NON-NLS-1$
+		assertNotNull(field);
+	}
+
+	public void testGetFields() {
+		IBeanTypeProxy testAccessType = proxyTypeFactory.getBeanTypeProxy("testPackage.TestAccess"); //$NON-NLS-1$				
+		
+		// Get all fields.
+		IFieldProxy[] fields = testAccessType.getFields();
+		assertNotNull(fields);
+		assertEquals(2, fields.length);		
+	}
+
+	public void testGetDeclaredFields() {
+		IBeanTypeProxy testAccessType = proxyTypeFactory.getBeanTypeProxy("testPackage.TestAccess"); //$NON-NLS-1$				
+		
+		// Get all fields.
+		IFieldProxy[] fields = testAccessType.getDeclaredFields();
+		assertNotNull(fields);
+		assertEquals(3, fields.length);		
+	}
+	
+	public void testSimpleGetMethod() throws ThrowableProxy {
+		IBeanTypeProxy testAccessType = proxyTypeFactory.getBeanTypeProxy("testPackage.TestAccess"); //$NON-NLS-1$	
+		
+		// Get the public field.
+		IMethodProxy method = testAccessType.getMethodProxy("xyz"); //$NON-NLS-1$
+		assertNotNull(method);
+	}
+
+	public void testSimpleGetDeclaredMethod() throws ThrowableProxy {
+		IBeanTypeProxy testAccessType = proxyTypeFactory.getBeanTypeProxy("testPackage.TestAccess"); //$NON-NLS-1$	
+		
+		// Get the public field.
+		IMethodProxy method = testAccessType.getDeclaredMethodProxy("qxr", (String[]) null); //$NON-NLS-1$
+		assertNotNull(method);
+	}
+
+	public void testGetMethods() {
+		IBeanTypeProxy testAccessType = proxyTypeFactory.getBeanTypeProxy("testPackage.TestAccess"); //$NON-NLS-1$
+		IBeanTypeProxy testObjectType = proxyTypeFactory.getBeanTypeProxy("java.lang.Object"); //$NON-NLS-1$
+		
+		// Get all methods. Need to get all of Object too since getMethods() gets them all including inherited. We will
+		// then take the diff to show what's only at the local level.
+		IMethodProxy[] methods = testAccessType.getMethods();
+		IMethodProxy[] objectMethods = testObjectType.getMethods();
+		assertNotNull(methods);
+		assertNotNull(objectMethods);
+		assertEquals(7, methods.length-objectMethods.length);		
+	}
+
+	public void testGetDeclaredMethods() {
+		IBeanTypeProxy testAccessType = proxyTypeFactory.getBeanTypeProxy("testPackage.TestAccess"); //$NON-NLS-1$				
+		
+		// Get all fields.
+		IMethodProxy[] methods = testAccessType.getDeclaredMethods();
+		assertNotNull(methods);
+		assertEquals(8, methods.length);		
+	}
+
+	public void testFindCompatibleConstructor() throws AmbiguousMethodException, NoSuchMethodException, IllegalAccessException {
+		IBeanTypeProxy testAccessType = proxyTypeFactory.getBeanTypeProxy("testPackage.TestAccess"); //$NON-NLS-1$				
+
+		IConstructorProxy ctor = testAccessType.getCompatibleConstructor(new IBeanTypeProxy[] {proxyTypeFactory.getBeanTypeProxy("java.lang.ArrayStoreException")});
+		IConstructorProxy comp = testAccessType.getDeclaredConstructorProxy(new IBeanTypeProxy[] {proxyTypeFactory.getBeanTypeProxy("java.lang.RuntimeException")});
+		
+		assertNotNull(ctor);
+		assertNotNull(comp);
+		assertEquals(ctor, comp);
+	}
+	
+	public void testFindCompatibleMethod() throws AmbiguousMethodException, NoSuchMethodException {
+		IBeanTypeProxy testAccessType = proxyTypeFactory.getBeanTypeProxy("testPackage.TestAccess"); //$NON-NLS-1$				
+
+		IMethodProxy method = testAccessType.getCompatibleMethod("xyz", new IBeanTypeProxy[] {proxyTypeFactory.getBeanTypeProxy("java.lang.Integer")});
+		IMethodProxy comp = testAccessType.getDeclaredMethodProxy("xyz", new IBeanTypeProxy[] {proxyTypeFactory.getBeanTypeProxy("java.lang.Number")});
+		
+		assertNotNull(method);
+		assertNotNull(comp);
+		assertEquals(method, comp);
+	}
+	
+	public void testFindAmbiguousMethod() throws NoSuchMethodException {
+		IBeanTypeProxy testAccessType = proxyTypeFactory.getBeanTypeProxy("testPackage.TestAccess"); //$NON-NLS-1$				
+
+		try {
+			testAccessType.getCompatibleMethod("ddd", new IBeanTypeProxy[] {proxyTypeFactory.getBeanTypeProxy("java.lang.Integer"), proxyTypeFactory.getBeanTypeProxy("java.lang.Integer")});
+			fail("Should of been ambiguous");
+		} catch (AmbiguousMethodException e) {
+		} 
+	}
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/ide/IDEProxySuite.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/ide/IDEProxySuite.java
new file mode 100644
index 0000000..14e33e4
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/ide/IDEProxySuite.java
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jem.tests.proxy.ide;
+/*
+ *  $RCSfile: IDEProxySuite.java,v $
+ *  $Revision: 1.4 $  $Date: 2005/08/24 20:58:55 $ 
+ */
+import junit.extensions.TestSetup;
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.core.runtime.CoreException;
+
+import org.eclipse.jem.internal.proxy.core.IConfigurationContributor;
+import org.eclipse.jem.internal.proxy.core.ProxyFactoryRegistry;
+import org.eclipse.jem.internal.proxy.ide.IDERegistration;
+import org.eclipse.jem.tests.proxy.AbstractTestProxy;
+import org.eclipse.jem.tests.proxy.ProxySuite;
+
+/**
+ * @author richkulp
+ *
+ * This is the true test suite for Remote Proxy Testing. The RemoteProxyTest will use this.
+ */
+public class IDEProxySuite extends TestSetup {
+
+	// Test cases to be include in the suite
+	private static Class testsList[] = { ProxySuite.class, };
+
+	private AbstractTestProxy.RegistryHandler registryHandler = new AbstractTestProxy.RegistryHandler() {
+		private ProxyFactoryRegistry registry;
+
+		public boolean isValid() {
+			return true;
+		}
+		public ProxyFactoryRegistry getRegistry() throws CoreException {
+			if (registry == null) {
+				registry = IDERegistration.startAnImplementation(new IConfigurationContributor[] { ProxySuite.getProxySuiteContributor()}, true, null, "JUnit Tests for IDE Proxy", "org.eclipse.jem.tests", null); //$NON-NLS-1$ //$NON-NLS-2$
+			}
+			return registry;
+		}
+
+		public void destroyRegistry() {
+			if (registry != null) {
+				registry.terminateRegistry();
+				registry = null;
+			}
+		}
+	};
+
+	public IDEProxySuite() {
+		this("Test IDE Proxy Suite");
+	}
+
+	public IDEProxySuite(String name) {
+		super(new TestSuite(name) {
+			{
+				for (int i = 0; i < testsList.length; i++) {
+					// We may get some tests and suites.
+					if (TestSuite.class.isAssignableFrom(testsList[i]) || TestSetup.class.isAssignableFrom(testsList[i])) {
+						try {
+							Test ts = (Test) testsList[i].newInstance();
+							addTest(ts);
+						} catch (Exception e) {
+							e.printStackTrace();
+						}
+					} else
+						addTestSuite(testsList[i]);
+				}
+
+			}
+		});
+
+		AbstractTestProxy.initRegistryHandler((TestSuite) getTest(), registryHandler);
+	}
+
+	public static Test suite() {
+		return new IDEProxySuite();
+	}
+
+	protected void tearDown() throws Exception {
+		registryHandler.destroyRegistry();
+	}
+
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/AbstractInitParserTestCase.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/AbstractInitParserTestCase.java
new file mode 100644
index 0000000..884ae0b
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/AbstractInitParserTestCase.java
@@ -0,0 +1,70 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jem.tests.proxy.initParser;
+/*
+ *  $RCSfile: AbstractInitParserTestCase.java,v $
+ *  $Revision: 1.6 $  $Date: 2005/08/24 20:58:54 $ 
+ */
+import java.util.Enumeration;
+
+import junit.framework.*;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+/**
+ * @author richkulp
+ *
+ * To change the template for this generated type comment go to
+ * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
+ */
+public abstract class AbstractInitParserTestCase extends TestCase {
+
+	/**
+	 * Initialize the test helper for all of the tests within the given suite.
+	 * 
+	 * @param suite
+	 * @param testHelper
+	 * 
+	 * @since 1.0.0
+	 */
+	public static void initSuite(TestSuite suite, AbstractInitStringParserTestHelper testHelper) {
+		Enumeration tests = suite.tests();
+		while (tests.hasMoreElements()) {
+			Test test = (Test) tests.nextElement();
+			if (test instanceof AbstractInitParserTestCase)
+				((AbstractInitParserTestCase) test).setTestHelper(testHelper);
+			else if (test instanceof TestSuite)
+				initSuite((TestSuite) test, testHelper);
+		}
+	}
+	
+	public AbstractInitParserTestCase() {
+		super();
+	}
+
+	public AbstractInitParserTestCase(String name) {
+		super(name);
+	}
+
+	protected AbstractInitStringParserTestHelper testHelper;
+	
+	/**
+	 * Set the test helper to use.
+	 * 
+	 * @param testHelper
+	 * 
+	 * @since 1.0.0
+	 */
+	public void setTestHelper(AbstractInitStringParserTestHelper testHelper) {
+		this.testHelper = testHelper;
+	}
+	
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/AbstractInitStringParserTestHelper.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/AbstractInitStringParserTestHelper.java
new file mode 100644
index 0000000..1869a23
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/AbstractInitStringParserTestHelper.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $RCSfile: AbstractInitStringParserTestHelper.java,v $
+ *  $Revision: 1.3 $  $Date: 2005/08/24 20:58:54 $ 
+ */
+package org.eclipse.jem.tests.proxy.initParser;
+
+/**
+ * Interface for init string parser helper. Allows "InitString Parser" or "AST Parser" or some other kind of testing.
+ * 
+ * @since 1.0.0
+ */
+public abstract class AbstractInitStringParserTestHelper {
+	/**
+	 * Test the given string against the given result. equalsOnly determines how exactly it matches.
+	 * If allowed to throw exceptions, then the exception as the result of evaluation will be squashed.
+	 * 
+	 * @param aString
+	 * @param expectedResult
+	 * @param throwsException <code>true</code> if this is expected to throw an exception and such exception will not be passed on out and will return normal.
+	 * @param equalsOnly <code>true</code> means if must match either ==, equals(), or toString()'s match.
+	 * @throws Throwable
+	 * 
+	 * @since 1.0.0
+	 */
+	public abstract void testInitString(String aString, Object expectedResult, boolean throwsException, boolean equalsOnly)
+		throws Throwable;
+
+	/**
+	 * Test the given string against the given result. It must match either ==, equals(), or toString()'s match.
+	 * It should not throw exceptions. If it does, the exception will be passed out.
+	 * 
+	 * @param aString
+	 * @param expectedResult
+	 * @throws Throwable 
+	 * 
+	 * @since 1.0.0
+	 */
+	public void testInitString(String aString, Object expectedResult) throws Throwable {
+		testInitString(aString, expectedResult, false, true);
+	}
+
+	/**
+	 * Test the given string against the given result. equalsOnly determines how exactly it matches
+	 * It should not throw exceptions. If it does, the exception will be passed out.
+	 * 
+	 * @param aString
+	 * @param equalsOnly <code>true</code> means if must match either ==, equals(), or toString()'s match.
+	 * @param expectedResult
+	 * @throws Throwable
+	 * 
+	 * @since 1.0.0
+	 */
+	public void testInitString(String aString, boolean equalsOnly, Object expectedResult) throws Throwable {
+		testInitString(aString, expectedResult, false, equalsOnly);
+	}
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/ArrayConstructorTest.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/ArrayConstructorTest.java
new file mode 100644
index 0000000..1dc2e0b
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/ArrayConstructorTest.java
@@ -0,0 +1,130 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jem.tests.proxy.initParser;
+/*
+ *  $RCSfile: ArrayConstructorTest.java,v $
+ *  $Revision: 1.4 $  $Date: 2005/08/24 20:58:54 $ 
+ */
+
+/**
+ * @author jmyers
+ *
+ * To change the template for this generated type comment go to
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+public class ArrayConstructorTest extends AbstractInitParserTestCase {
+
+	/**
+	 * Constructor for ArrayContructorTest.
+	 * @param name
+	 */
+	public ArrayConstructorTest(String name) {
+		super(name);
+	}
+		
+    public void testEmptyString1D() throws Throwable {
+		testHelper.testInitString("new String[2]",new String[2]);	
+    }
+	public void testEmptyString2D() throws Throwable {
+		testHelper.testInitString("new String[2][2]",new String[2][2]);	
+	}
+	public void testEmptyColor1D() throws Throwable {
+		testHelper.testInitString("new java.awt.Color[3]",new java.awt.Color[3]);	
+	}
+	public void testEmptyColor2D() throws Throwable {
+		testHelper.testInitString("new java.awt.Color[3][4]",new java.awt.Color[3][4]);	
+	}
+	public void testEmptyInt() throws Throwable {
+		testHelper.testInitString("new int[3]", new int[3]);	
+	}
+	
+	// TODO: enable this test when this works
+	/*
+	public void testCalculatedSize() {
+		testHelper.testInitString("new String[new Integer(3).intValue()]",new String[new Integer(3).intValue()]);    	
+	}
+	*/
+	
+	public void testInitializedInts() throws Throwable {
+		testHelper.testInitString("new int[] {-2,3}",new int[]{-2,3});	
+	}
+	public void testInitializedIntsTrailingComma() throws Throwable {
+		testHelper.testInitString("new int[] {-2,3,}",new int[]{-2,3,});
+	}
+	public void testInitializedDoubleParens() throws Throwable {
+		testHelper.testInitString("new double[] {(-2), 3.0 }",new double[] {(-2), 3.0 });	
+	}
+	public void testInitializedStringsTwo() throws Throwable {
+		testHelper.testInitString("new String[] {\"1\",\"2\"}",new String[] {"1","2"});	
+	}
+	public void testInitializedStringsThree() throws Throwable {
+		testHelper.testInitString("new String[] {\"Frog\",\"Dog\",\"Cow\"}",new String[] {"Frog","Dog","Cow"});	
+	}
+	public void testInitializedColors() throws Throwable {
+		testHelper.testInitString("new java.awt.Color[] { java.awt.Color.red , new java.awt.Color(0,0,0) }",new java.awt.Color[] { java.awt.Color.red , new java.awt.Color(0,0,0) });	
+	}
+	public void testInitalizedInts2D1() throws Throwable {
+		testHelper.testInitString("new int[][] { { 2 , -3 } , { 4 , 5 } }",new int[][] { { 2 , -3 } , { 4 , 5 } });	
+	}
+	public void testInitalizedInts2D2() throws Throwable {
+		testHelper.testInitString("new int[][] {{1,2,3},{4,5,6}}",new int[][]{{1,2,3},{4,5,6}});	
+	}
+	public void testInitalizedInts2DParensCommas() throws Throwable {
+		// Much to my surprise, extra commands are valid syntax at the end of the arguments even without any following argument
+		// the resolve that occurs by the Visual Editor actually inserts these, so we need tests to make sure we can deal with them correctly
+		testHelper.testInitString("new int[][] { {2 ,(-3),} , { 4 , 5,}}",new int[][] { { 2 , (-3),} , { 4 , 5,}});	
+	}
+	public void testInitalizedInts2DParensCommas2() throws Throwable {
+		testHelper.testInitString("new int[][] { {2 ,(-3),} , { 4 , 5,},}",new int[][] { { 2 , (-3),} , { 4 , 5,},});	
+	}
+	public void testInitalizedDoubles2D() throws Throwable {
+		testHelper.testInitString("new double[][] { { 2 , 3 } , { 4 , 5 } }",new double[][] { { 2 , 3 } , { 4 , 5 } });	
+	}
+	public void testInitalizedDoubles2DMany() throws Throwable {
+		testHelper.testInitString("new double[][]{{ 5.0, -2.0, 5.0, -1.0, -1.0, 5.0, -2.0, 5.0 }, { 5.0, -2.0, 5.0, -2.0, 5.0, -1.0, 5.0, -2.0, 5.0 }}",new double[][]{{ 5.0, -2.0, 5.0, -1.0, -1.0, 5.0, -2.0, 5.0 }, { 5.0, -2.0, 5.0, -2.0, 5.0, -1.0, 5.0, -2.0, 5.0 }});	
+	}
+	public void testInt2DParam() throws Throwable {
+		testHelper.testInitString("new org.eclipse.jem.tests.proxy.initParser.NavigationParameters(new int[][] {{1,2,3},{3,4,5}})",new org.eclipse.jem.tests.proxy.initParser.NavigationParameters(new int[][] {{1,2,3},{3,4,5}}));	
+	}
+	public void testInt2DParamCommas() throws Throwable {
+		testHelper.testInitString("new org.eclipse.jem.tests.proxy.initParser.NavigationParameters(new int[][] {{1,2,3,},{3,4,5,}})",new org.eclipse.jem.tests.proxy.initParser.NavigationParameters(new int[][] {{1,2,3,},{3,4,5,}}));	
+	}
+	public void testInt2DParamCommas2() throws Throwable {
+		testHelper.testInitString("new org.eclipse.jem.tests.proxy.initParser.NavigationParameters(new int[][] {{1,2,3,},{3,4,5,},})",new org.eclipse.jem.tests.proxy.initParser.NavigationParameters(new int[][] {{1,2,3,},{3,4,5,},}));	
+	}
+	public void testDoubleParam() throws Throwable {
+		testHelper.testInitString("new org.eclipse.jem.tests.proxy.initParser.NavigationParameters(new double[]{1,2,3})",new org.eclipse.jem.tests.proxy.initParser.NavigationParameters(new double[]{1,2,3}));	
+	}
+	public void testDoubleParam2() throws Throwable {
+		testHelper.testInitString("new org.eclipse.jem.tests.proxy.initParser.NavigationParameters(new double[]{1.0,2,-3.5})",new org.eclipse.jem.tests.proxy.initParser.NavigationParameters(new double[]{1.0,2,-3.5}));	
+	}
+	public void testDoubleParam3() throws Throwable {
+		testHelper.testInitString("new org.eclipse.jem.tests.proxy.initParser.NavigationParameters(new double[]{-1,2,-0.5})",new org.eclipse.jem.tests.proxy.initParser.NavigationParameters(new double[]{-1,2,-0.5}));	
+	}
+	public void testDouble2DParam() throws Throwable {
+		// This test is one that is similar to the type of constructor used by TableLayout for SWA
+		testHelper.testInitString("new org.eclipse.jem.tests.proxy.initParser.NavigationParameters(new double[][]{{ 5.0, -2.0, 5.0, -1.0, -1.0, 5.0, -2.0, 5.0 }, { 5.0, -2.0, 5.0, -2.0, 5.0, -1.0, 5.0, -2.0, 5.0 }})",
+						new org.eclipse.jem.tests.proxy.initParser.NavigationParameters(new double[][]{{ 5.0, -2.0, 5.0, -1.0, -1.0, 5.0, -2.0, 5.0 }, { 5.0, -2.0, 5.0, -2.0, 5.0, -1.0, 5.0, -2.0, 5.0 }}));    	
+	}
+	public void testDouble2DParamCommas() throws Throwable {
+		testHelper.testInitString("new org.eclipse.jem.tests.proxy.initParser.NavigationParameters(new double[][]{{ 5.0, -2.0, 5.0, -1.0, -1.0, 5.0, -2.0, 5.0 , }, { 5.0, -2.0, 5.0, -2.0, 5.0, -1.0, 5.0, -2.0, 5.0 , } , })",
+							new org.eclipse.jem.tests.proxy.initParser.NavigationParameters(new double[][]{{ 5.0, -2.0, 5.0, -1.0, -1.0, 5.0, -2.0, 5.0 , }, { 5.0, -2.0, 5.0, -2.0, 5.0, -1.0, 5.0, -2.0, 5.0 , } , }));	
+	}
+	
+	
+	// TODO: enable this test when the case is handled properly
+	/*
+	public void testInt3D() {
+		// Needs fixing - We don't have dimensions greater than 2 working yet
+		testHelper.testInitString("new int[][][] { { { 1 , 2 } , { 3 , 4 } }, { { 5 , 6 } , { 7 , 8 } } }",new int[][][] { { { 1 , 2 } , { 3 , 4 } }, { { 5 , 6 } , { 7 , 8 } } });    	
+	}
+    */
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/BlockTest.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/BlockTest.java
new file mode 100644
index 0000000..57e7d79
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/BlockTest.java
@@ -0,0 +1,108 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jem.tests.proxy.initParser;
+/*
+ *  $RCSfile: BlockTest.java,v $
+ *  $Revision: 1.5 $  $Date: 2005/08/24 20:58:54 $ 
+ */
+
+/**
+ * @author jmyers
+ *
+ * To change the template for this generated type comment go to
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+public class BlockTest extends AbstractInitParserTestCase {
+
+	/**
+	 * Constructor for BlockTest.
+	 * @param name
+	 */
+	public BlockTest(String name) {
+		super(name);
+	}
+
+/*
+ * TODO These three don't work for now. Later they may be fixed if it shows up as a general problem for customers. So far they haven't.
+        public void testSetElements1() throws Throwable {
+		testHelper.testInitString(
+			"(((new org.eclipse.jem.tests.proxy.initParser.NavigationParameters(3)).setElemAt(\"accountStatementDetails\",0)).setElemAt(new org.eclipse.jem.tests.proxy.initParser.NavigationParameters(\"OpnBalance\",\"OpnBalance\",null,false,false,true,50),1)).setElemAt(new org.eclipse.jem.tests.proxy.initParser.NavigationParameters(\"OpnDate\",\"OpnDate\",null,false,false,true,50),2);",
+			(((new org.eclipse.jem.tests.proxy.initParser.NavigationParameters(3)).setElemAt("accountStatementDetails",0)).setElemAt(new NavigationParameters("OpnBalance","OpnBalance",null,false,false,true,50),1)).setElemAt(new org.eclipse.jem.tests.proxy.initParser.NavigationParameters("OpnDate","OpnDate",null,false,false,true,50),2));    	
+    }
+	public void testSetElements2() throws Throwable {
+		testHelper.testInitString(
+				"(((new org.eclipse.jem.tests.proxy.initParser.NavigationParameters(3)).setElemAt(\"accountStatementDetails\",0)).setElemAt(new org.eclipse.jem.tests.proxy.initParser.NavigationParameters(\"OpnBalance\",\"OpnBalance\",null,false,false,true,50),1))",
+				(((new org.eclipse.jem.tests.proxy.initParser.NavigationParameters(3)).setElemAt("accountStatementDetails",0)).setElemAt(new NavigationParameters("OpnBalance","OpnBalance",null,false,false,true,50),1)));	
+	}
+	public void testSetElements3() throws Throwable {
+		testHelper.testInitString(
+			"((new org.eclipse.jem.tests.proxy.initParser.NavigationParameters(3)).setElemAt(new org.eclipse.jem.tests.proxy.initParser.NavigationParameters(\"OpnBalance\",\"OpnBalance\",null,false,false,true,50),1))",
+			((new org.eclipse.jem.tests.proxy.initParser.NavigationParameters(3)).setElemAt(new org.eclipse.jem.tests.proxy.initParser.NavigationParameters("OpnBalance","OpnBalance",null,false,false,true,50),1)));    	
+	}
+*/
+	public void testSetElement4() throws Throwable {
+		testHelper.testInitString(
+				"((new org.eclipse.jem.tests.proxy.initParser.NavigationParameters(3)).setElemAt(\"accountStatementDetails\",0))",
+				((new org.eclipse.jem.tests.proxy.initParser.NavigationParameters(3)).setElemAt("accountStatementDetails",0)));	
+	}
+	public void testStringReplacement1() throws Throwable {
+		testHelper.testInitString(
+				"(((new String(\"Frog\")).replace('o','i')).replace('i','a')).replace('a','o')",
+				(((new String("Frog")).replace('o','i')).replace('i','a')).replace('a','o'));	
+	}
+	public void testStringReplacement2() throws Throwable {
+		testHelper.testInitString(
+				"((((new String(\"Frog\")).replace('o','i')).replace('i','a')).replace('a','o')).replace('o','e')",
+				((((new String("Frog")).replace('o','i')).replace('i','a')).replace('a','o')).replace('o','e'));	
+	}
+	public void testStringCases1() throws Throwable {
+		testHelper.testInitString(
+				"(new String(\"Frog\").toLowerCase()).toUpperCase()",
+				(new String("Frog").toLowerCase()).toUpperCase()
+				);	
+	}
+	public void testStringCases2() throws Throwable {
+		testHelper.testInitString(
+				"((new String(\"Frog\").toLowerCase()).toUpperCase()).toLowerCase()",
+				((new String("Frog").toLowerCase()).toUpperCase()).toLowerCase()
+				);	
+	}
+	public void testStringCases3() throws Throwable {
+		testHelper.testInitString(
+				"(((new String(\"Frog\").toLowerCase()).toUpperCase()).toLowerCase()).toUpperCase()",
+				(((new String("Frog").toLowerCase()).toUpperCase()).toLowerCase()).toUpperCase()
+				);	
+	}
+	public void testStringConcat1() throws Throwable {
+		testHelper.testInitString(
+				"(new String(\"Frogs\").concat(\"are\")).concat(\"cool\")",
+				(new String("Frogs").concat("are")).concat("cool")
+				);	
+	}
+	public void testStringConcat2() throws Throwable {
+		testHelper.testInitString(
+				"((new String(\"Frogs\").concat(\"are\")).concat(\"very\")).concat(\"cool\")",
+				((new String("Frogs").concat("are")).concat("very")).concat("cool")
+				);	
+	}
+	public void testStringConcat3() throws Throwable {
+		testHelper.testInitString(
+				"(((new String(\"Frogs\").concat(\"just\")).concat(\"rule\")).concat(\"cool\")).concat(\"kingdom\")",
+				(((new String("Frogs").concat("just")).concat("rule")).concat("cool")).concat("kingdom")
+				);	
+	}
+	public void testStringConcat4() throws Throwable {
+		testHelper.testInitString(
+				"((new String(\"Frogs\").concat(\"just\")).concat(new String(\"totally\")).concat(new String(\"Rock\")))",
+				((new String("Frogs").concat("just")).concat(new String("totally")).concat(new String("Rock")))
+				);	
+	}
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/BorderTest.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/BorderTest.java
new file mode 100644
index 0000000..e688b66
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/BorderTest.java
@@ -0,0 +1,114 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jem.tests.proxy.initParser;
+/*
+ *  $RCSfile: BorderTest.java,v $
+ *  $Revision: 1.5 $  $Date: 2005/08/24 20:58:54 $ 
+ */
+
+/**
+ * @author jmyers
+ *
+ * To change the template for this generated type comment go to
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+public class BorderTest extends AbstractInitParserTestCase {
+
+	/**
+	 * Constructor for BorderTest.
+	 * @param name
+	 */
+	public BorderTest(String name) {
+		super(name);
+	}
+	
+	public void testEtchedRaised() throws Throwable {
+		testHelper.testInitString(
+			"javax.swing.BorderFactory.createEtchedBorder(javax.swing.border.EtchedBorder.RAISED)" ,
+			 javax.swing.BorderFactory.createEtchedBorder(javax.swing.border.EtchedBorder.RAISED));	
+	}
+	
+	public void testBevelRaised() throws Throwable {
+		testHelper.testInitString(
+			"javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED)",
+			javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED));
+	}
+
+	public void testEmpty() throws Throwable {
+		testHelper.testInitString(
+			"javax.swing.BorderFactory.createEmptyBorder()",
+			javax.swing.BorderFactory.createEmptyBorder());
+	}
+
+	public void testMatte() throws Throwable {
+		testHelper.testInitString(
+			"javax.swing.BorderFactory.createMatteBorder(2, 2, 2, 2, java.awt.Color.black)",
+			false,
+			javax.swing.BorderFactory.createMatteBorder(2, 2, 2, 2, java.awt.Color.black));
+	}
+
+	public void testSoftBevel() throws Throwable {
+		testHelper.testInitString(
+			"new javax.swing.border.SoftBevelBorder(0)",
+			false,
+			new javax.swing.border.SoftBevelBorder(0));
+	}
+
+	public void testEmptySize() throws Throwable {
+		testHelper.testInitString(
+			"javax.swing.BorderFactory.createEmptyBorder(2, 2, 2, 2)",
+			false,
+			javax.swing.BorderFactory.createEmptyBorder(2, 2, 2, 2));
+	}
+
+	public void testLine() throws Throwable {
+		testHelper.testInitString(
+			"javax.swing.BorderFactory.createLineBorder(java.awt.Color.black, 2)",
+			false,
+			javax.swing.BorderFactory.createLineBorder(java.awt.Color.black, 2));
+	}
+
+	public void testSoftBevelRaised() throws Throwable {
+		testHelper.testInitString(
+			"new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED)",
+			false,
+			new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));
+	}
+
+	public void testTitledBasic() throws Throwable {
+		testHelper.testInitString(
+			"javax.swing.BorderFactory.createTitledBorder(null,\"frog\",2,0)",
+			false,
+			javax.swing.BorderFactory.createTitledBorder(null, "frog", 2, 0));
+	}
+
+	public void testCompoundBasic() throws Throwable {
+		testHelper.testInitString(
+			"new javax.swing.border.CompoundBorder(javax.swing.BorderFactory.createEmptyBorder(),javax.swing.BorderFactory.createEmptyBorder())",
+			false,
+			new javax.swing.border.CompoundBorder(javax.swing.BorderFactory.createEmptyBorder(),javax.swing.BorderFactory.createEmptyBorder()));
+	}
+
+	public void testCompoundMedium() throws Throwable {
+		testHelper.testInitString(
+			"javax.swing.BorderFactory.createCompoundBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED), javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.LOWERED))",
+			false,
+			javax.swing.BorderFactory.createCompoundBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED), javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.LOWERED)));
+	}
+	
+	
+	public void testTitledAdvanced() throws Throwable {
+		testHelper.testInitString(
+			"javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createLineBorder(java.awt.SystemColor.activeCaption,30), \"Hello\", javax.swing.border.TitledBorder.CENTER, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font(\"Dialog\", java.awt.Font.BOLD, 18), java.awt.Color.lightGray)",
+			false,
+			javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createLineBorder(java.awt.SystemColor.activeCaption,30), "Hello", javax.swing.border.TitledBorder.CENTER, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Dialog", java.awt.Font.BOLD, 18), java.awt.Color.lightGray));
+	}
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/CastTest.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/CastTest.java
new file mode 100644
index 0000000..c4182dc
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/CastTest.java
@@ -0,0 +1,79 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jem.tests.proxy.initParser;
+/*
+ *  $RCSfile: CastTest.java,v $
+ *  $Revision: 1.5 $  $Date: 2005/08/24 20:58:54 $ 
+ */
+
+/**
+ * @author jmyers
+ *
+ * To change the template for this generated type comment go to
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+public class CastTest extends AbstractInitParserTestCase {
+
+	/**
+	 * Constructor for CastTest.
+	 * @param name
+	 */
+	public CastTest(String name) {
+		super(name);
+	}
+
+	public void testIntToFloat() throws Throwable {
+		testHelper.testInitString("new Float((float)10)", new Float(10));	
+	}
+	public void testIntToFloatSpace() throws Throwable {
+		testHelper.testInitString("new Float( (float) 10 )", new Float(10));	
+	}
+	public void testFloatToFloat() throws Throwable {
+		testHelper.testInitString("new Float((float)10.3)", new Float((float) 10.3));	
+	}
+	public void testFloatToFloat2() throws Throwable {
+		testHelper.testInitString("new Float((float)5.3)", new Float((float) 5.3));	
+	}
+	public void testFloatToFloatSpace() throws Throwable {
+		testHelper.testInitString("new Float( (float) 10.3 )", new Float((float) 10.3));	
+	}
+	public void testNullToString() throws Throwable {
+		testHelper.testInitString("(String)null", (String) null);	
+	}
+	public void testStringLiteralToString() throws Throwable {
+		testHelper.testInitString("(String)\"hi\"", "hi");	
+	}
+	public void testNullToStringParam() throws Throwable {
+		testHelper.testInitString("new javax.swing.JLabel( (String) null)", new javax.swing.JLabel((String) null));	
+	}
+	public void testIntToShort() throws Throwable {
+		testHelper.testInitString("(short)10", new Short((short) 10));		
+	}
+	public void testFloatToFloatPrim() throws Throwable {
+		testHelper.testInitString("(float)10.3", new Float((float)10.3));	
+	}
+	
+    //	Casts statements with qualified expression used to fail
+	public void testQualifiedStringReturn() throws Throwable {
+		testHelper.testInitString("(java.lang.String)org.eclipse.jem.tests.proxy.initParser.NavigationParameters.getReversed(\"Frog\")",org.eclipse.jem.tests.proxy.initParser.NavigationParameters.getReversed("Frog"));	
+	}
+	public void testStringReturn() throws Throwable {
+		testHelper.testInitString("(String)org.eclipse.jem.tests.proxy.initParser.NavigationParameters.getReversed(\"Frog\")",org.eclipse.jem.tests.proxy.initParser.NavigationParameters.getReversed("Frog"));	
+	}
+	public void testQualifiedColorReturn() throws Throwable {
+		testHelper.testInitString("(java.awt.Color)org.eclipse.jem.tests.proxy.initParser.NavigationParameters.getColor(\"red\")",org.eclipse.jem.tests.proxy.initParser.NavigationParameters.getColor("red"));	
+	}
+	
+	public void testCastUpColor() throws Throwable {
+         //		Test where the method is typed to return Color and we cast to the more generailized subclass of SystemColor
+		 testHelper.testInitString("(java.awt.SystemColor)org.eclipse.jem.tests.proxy.initParser.NavigationParameters.getColor(\"window\")",org.eclipse.jem.tests.proxy.initParser.NavigationParameters.getColor("window"));	
+	}
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/CharTest.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/CharTest.java
new file mode 100644
index 0000000..f192be9
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/CharTest.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jem.tests.proxy.initParser;
+/*
+ *  $RCSfile: CharTest.java,v $
+ *  $Revision: 1.4 $  $Date: 2005/08/24 20:58:54 $ 
+ */
+
+/**
+ * @author jmyers
+ *
+ * To change the template for this generated type comment go to
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+public class CharTest extends AbstractInitParserTestCase {
+
+	/**
+	 * Constructor for CharTest.
+	 * @param name
+	 */
+	public CharTest(String name) {
+		super(name);
+	}
+	
+	public void testChar() throws Throwable {
+		testHelper.testInitString("'a'", new Character('a'));	
+	}
+	public void testCharacter() throws Throwable {
+		testHelper.testInitString("new Character('a')", new Character('a'));	
+	}
+	public void testDoubleQuote() throws Throwable {
+		testHelper.testInitString("'\"'", new Character('\"'));	
+	}
+	public void testSingleQuote() throws Throwable {
+		testHelper.testInitString("'\\''", new Character('\''));	
+	}
+	public void testBackslash() throws Throwable {
+		testHelper.testInitString("'\\\\'", new Character('\\'));		
+	}
+	public void testCharException() throws Throwable {
+		testHelper.testInitString("'asdf'", null, true, true);	
+	}
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/ExceptionTest.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/ExceptionTest.java
new file mode 100644
index 0000000..6c1233d
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/ExceptionTest.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jem.tests.proxy.initParser;
+/*
+ *  $RCSfile: ExceptionTest.java,v $
+ *  $Revision: 1.4 $  $Date: 2005/08/24 20:58:54 $ 
+ */
+
+/**
+ * @author jmyers
+ *
+ * To change the template for this generated type comment go to
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+public class ExceptionTest extends AbstractInitParserTestCase {
+
+	/**
+	 * Constructor for ExceptionTest.
+	 * @param name
+	 */
+	public ExceptionTest(String name) {
+		super(name);
+	}
+
+	public void testTooManyParams() throws Throwable {
+		testHelper.testInitString("new Integer(\"3,3\")", null, true, true);	
+	}
+	public void testUnresolvedClass() throws Throwable {
+		testHelper.testInitString("new ABCD(4)", null, true, true);	
+	}
+	public void testUnresolvedMethod() throws Throwable {
+		testHelper.testInitString("getMethod()",null,true, true);	
+	}
+	public void testUnresolvedLiteral() throws Throwable {
+		testHelper.testInitString("unresolvedLiteral",null,true, true);	
+	}
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/InitParserSuite.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/InitParserSuite.java
new file mode 100644
index 0000000..cdf4d66
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/InitParserSuite.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jem.tests.proxy.initParser;
+/*
+ *  $RCSfile: InitParserSuite.java,v $
+ *  $Revision: 1.7 $  $Date: 2005/08/24 20:58:54 $ 
+ */
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * @author jmyers
+ *
+ * To change the template for this generated type comment go to
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+public class InitParserSuite extends TestSuite {
+
+	// Test cases to be include in the suite
+	private static Class testsList[] = {
+		NeedsCodingTest.class,
+		BlockTest.class,
+		ArrayConstructorTest.class,
+		MultiArgStaticMethodTest.class,
+		MultiArgConstructorTest.class,
+		MultiArgInstanceTest.class,
+		NumberTest.class,
+		CastTest.class,
+		ExceptionTest.class,
+		LiteralTest.class,
+		StringTest.class,
+		CharTest.class,
+		JFCTest.class,
+		BorderTest.class,
+		OverloadingTest.class,
+		SameName46376Test.class
+		                               } ;
+	public static String pkgName = "org.eclipse.jem.tests.proxy.initParser" ;
+	    
+	/**
+	 * Constructor for PackageSuite.
+	 */
+	public InitParserSuite() {
+		super();
+		populateSuite() ;
+	}
+
+	/**
+	 * Constructor for PackageSuite.
+	 * @param theClass
+	 */
+	public InitParserSuite(Class theClass) {
+		super(theClass);
+		populateSuite() ;
+	}
+
+	/**
+	 * Constructor for PackageSuite.
+	 * @param name
+	 */
+	public InitParserSuite(String name) {
+		super(name);
+		populateSuite() ;
+	}
+
+	private void populateSuite () {
+		for (int i=0; i<testsList.length; i++)
+		  addTestSuite(testsList[i]) ;
+		
+		AbstractInitParserTestCase.initSuite(this, new InitStringParserTestHelper(this.getClass().getClassLoader()));
+	}
+    
+	public static Test suite() {
+		return new InitParserSuite("Test for: "+pkgName);
+	}
+
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/InitStringParserTestHelper.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/InitStringParserTestHelper.java
new file mode 100644
index 0000000..a7c447d
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/InitStringParserTestHelper.java
@@ -0,0 +1,134 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jem.tests.proxy.initParser;
+/*
+ *  $RCSfile: InitStringParserTestHelper.java,v $
+ *  $Revision: 1.6 $  $Date: 2005/08/24 20:58:54 $ 
+ */
+import java.lang.reflect.Array;
+
+import junit.framework.Assert;
+import org.eclipse.jem.internal.proxy.initParser.InitializationStringEvaluationException;
+import org.eclipse.jem.internal.proxy.initParser.InitializationStringParser;
+
+/**
+ * @author jmyers
+ *
+ * To change the template for this generated type comment go to
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+public class InitStringParserTestHelper extends AbstractInitStringParserTestHelper {
+
+	private final ClassLoader classLoader;
+	
+	public InitStringParserTestHelper() {
+		this.classLoader = null;	
+	}
+	
+	public InitStringParserTestHelper(ClassLoader classLoader) {
+		this.classLoader = classLoader;	
+	}
+	
+	/**
+	 * TestInitializationStringParser constructor comment.
+	 */
+	public void testInitString(String aString, Object expectedResult, boolean throwsException, boolean equalsOnly) throws Throwable {
+		// Equals only means accept if == or equals(), don't try to go on and say maybe equal.
+
+		try {
+			InitializationStringParser parser = InitializationStringParser.createParser(aString, classLoader);
+			Object result = parser.evaluate();
+			if (throwsException) {
+				Assert.fail("It should of thrown an exception. Instead result=" + (result != null ? result.toString() : "null"));
+			} else {
+				if (result == expectedResult) {
+					return;
+				} else if (
+					(result == null && expectedResult != null) || (expectedResult == null && result != null)) {
+						Assert.fail("ExpectedResult=" + expectedResult + " result=" + result);
+				} else if (result.equals(expectedResult)) {
+					return;
+				} else {
+					// It may be that the equals expression is bad.  If so use the toString() to do a partial comparison
+					if (result.getClass() == expectedResult.getClass()) {
+						if (result.toString().equals(expectedResult.toString())) {
+							return;
+						} else {
+							// The toStrings do not match perfectly but the classes do.
+							// Try and see how close the two strings are
+							if ( expectedResult.getClass().isArray() && result.getClass().isArray()){
+								Class expectedResultClass = expectedResult.getClass().getComponentType();
+								Class resultClass = result.getClass().getComponentType();
+								int resultLength = Array.getLength(result);
+								int expectedLength = Array.getLength(expectedResult);
+								if ( expectedLength == resultLength ){
+									if ( resultClass == expectedResultClass ) {
+										// TODO Should actually step in and check each element too.
+										return;																		
+									} else {
+										Assert.fail( aString
+												+ " ExpectedResult="
+												+ expectedResult
+												+ " ActualResult="
+												+ result
+												+ " ExpectedClass="
+												+ expectedResult.getClass()
+												+ " ActualClass="
+												+ result.getClass());
+									}
+								} else {
+									Assert.fail( aString
+											+ " ExpectedResult="
+											+ expectedResult
+											+ " ActualResult="
+											+ result
+											+ " ExpectedClass="
+											+ expectedResult.getClass()
+											+ " ActualClass="
+											+ result.getClass());		
+								}								
+							} else {
+								if (equalsOnly)
+									Assert.fail( aString
+										+ " ExpectedResult="
+										+ expectedResult
+										+ " ActualResult="
+										+ result
+										+ " ExpectedClass="
+										+ expectedResult.getClass()
+										+ " ActualClass="
+										+ result.getClass());
+								return;
+							}
+						}
+					} else {
+						Assert.fail( aString
+								+ " ExpectedResult="
+								+ expectedResult
+								+ " ActualResult="
+								+ result
+								+ " ExpectedClass="
+								+ expectedResult.getClass()
+								+ " ActualClass="
+								+ result.getClass());
+					}
+				}
+			}
+		} catch (InitializationStringEvaluationException e) {
+			if (throwsException) {
+				return;
+			} else {
+				throw e.getOriginalException();
+			}
+		}
+	}
+
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/JFCTest.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/JFCTest.java
new file mode 100644
index 0000000..3983a46
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/JFCTest.java
@@ -0,0 +1,136 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jem.tests.proxy.initParser;
+/*
+ *  $RCSfile: JFCTest.java,v $
+ *  $Revision: 1.4 $  $Date: 2005/08/24 20:58:54 $ 
+ */
+
+/**
+ * @author jmyers
+ *
+ * To change the template for this generated type comment go to
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+public class JFCTest extends AbstractInitParserTestCase {
+
+	/**
+	 * Constructor for JFCTest.
+	 * @param name
+	 */
+	public JFCTest(String name) {
+		super(name);
+	}
+
+    public void testDimension() throws Throwable {
+		testHelper.testInitString("new java.awt.Dimension(1,1)", new java.awt.Dimension(1, 1));	
+    }
+	public void testDimensionNeg() throws Throwable {
+		testHelper.testInitString("new java.awt.Dimension(-1,-1)", new java.awt.Dimension(-1, -1));	
+	}
+	public void testColorConstant() throws Throwable {
+		testHelper.testInitString("java.awt.Color.cyan", java.awt.Color.cyan);	
+	}
+	public void testColorString() throws Throwable {
+		testHelper.testInitString("java.awt.Color.cyan.toString()", java.awt.Color.cyan.toString());    	
+	}
+	public void testColorRGB() throws Throwable {
+		testHelper.testInitString("new java.awt.Color(10,20,30)", new java.awt.Color(10, 20, 30));	
+	}
+	public void testInteger() throws Throwable {
+		testHelper.testInitString("new Integer(50)", new Integer(50));    	
+	}
+	public void testIntegerNegative() throws Throwable {
+		testHelper.testInitString("new java.lang.Integer(-50)", new Integer(-50));    	
+	}	
+	public void testShort() throws Throwable {
+		testHelper.testInitString("new Short((short)50)", new Short((short)50));    	
+	}
+	public void testShortNegative() throws Throwable {
+		testHelper.testInitString("new Short((short)-50)", new Short((short)-50));    	
+	}	
+	public void testLong() throws Throwable {
+		testHelper.testInitString("new Long(50L)", new Long(50L));    	
+	}
+	public void testLongNegative() throws Throwable {
+		testHelper.testInitString("new java.lang.Long(-50L)", new Long(-50L));    	
+	}	
+	public void testByte() throws Throwable {
+		testHelper.testInitString("new Byte((byte)10)", new Byte((byte)10));    	
+	}
+	public void testByteNegative() throws Throwable {
+		testHelper.testInitString("new Byte((byte)-10)", new Byte((byte)-10));    	
+	}	
+	public void testFloat() throws Throwable {
+//		TODO Need to fix this
+//			It just doesn't work w/o java.lang on front. There is a problem with Contructor going closed too early because of the'.' in 3.5,
+//			but if you fix that, then (new String("Frog").concat("xyz")).concat(... gets all messed up because it
+//			tries to process String().concat() together, and how that should work doesn't work the way it does. 		
+		testHelper.testInitString("new java.lang.Float(10.3F)", new Float(10.3F));    	
+	}
+	public void testDouble() throws Throwable {
+//		TODO same problem as testFloat. Need java.lang for now.		
+		testHelper.testInitString("new java.lang.Double(10.3D)", new Double(10.3D));    	
+	}	
+	public void testIntegerString() throws NumberFormatException, Throwable {
+		testHelper.testInitString("new Integer(\"50\")", new Integer("50"));    	
+	}
+	public void testFlowLayout() throws Throwable {
+		testHelper.testInitString("new java.awt.FlowLayout()", new java.awt.FlowLayout());	
+	}
+	public void testImageIcon() throws Throwable {
+		testHelper.testInitString("new javax.swing.ImageIcon( \"C:/WINNT/Zapotec.bmp\")",new javax.swing.ImageIcon( "C:/WINNT/Zapotec.bmp" ));  	
+	}
+	public void testRectangle() throws Throwable {
+		testHelper.testInitString(
+				"new java.awt.Rectangle( 10 , 20 , 30 , 40 )",
+				new java.awt.Rectangle(10, 20, 30, 40));
+    	
+	}
+	public void testLocale() throws Throwable {
+		testHelper.testInitString("new java.util.Locale(\"fr\",\"FR\")", new java.util.Locale("fr", "FR"));	
+	}
+	public void testLocaleVariant() throws Throwable {
+		testHelper.testInitString("new java.util.Locale(\"fr\",\"FR\",\"\")", new java.util.Locale("fr", "FR", ""));	
+	}
+	public void testLocaleException() throws Throwable {
+          //Locale constructor cannot take null as argument like this: new Java.util.Locale("fr", "FR", null)
+		  //so this is expected to fail
+		  testHelper.testInitString("new java.util.Locale(\"fr\",\"FR\",null)", null, true, true);	
+	}
+	public void testDialog() throws Throwable {
+		testHelper.testInitString("new java.awt.Dialog(new java.awt.Frame())", false, new java.awt.Dialog(new java.awt.Frame()));	
+	}
+	public void testLength() throws Throwable {
+		testHelper.testInitString("new Integer( 50 ).toString().length()", new Integer(new Integer( 50 ).toString().length()));	
+	}
+	public void testSize() throws Throwable {
+		testHelper.testInitString("new java.util.ArrayList().size()", new Integer(new java.util.ArrayList().size()));		
+	}
+	public void testCursor() throws Throwable {
+		testHelper.testInitString("new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)",new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));	
+	}
+	public void testPanel() throws Throwable {
+		testHelper.testInitString("new java.awt.Panel(null)", false, new java.awt.Panel(null));	
+	}
+	
+	public void testComplexFont() throws Throwable {
+		testHelper.testInitString(
+			"new java.awt.Font(\"Dialog\", java.awt.Font.BOLD | java.awt.Font.ITALIC, 12)",
+			new java.awt.Font("Dialog", java.awt.Font.BOLD | java.awt.Font.ITALIC, 12));		
+	}
+	
+	public void testKeyStroke() throws Throwable {
+		testHelper.testInitString(
+			"javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_H, java.awt.Event.ALT_MASK | java.awt.Event.CTRL_MASK | java.awt.Event.SHIFT_MASK, true)",
+			javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_H, java.awt.Event.ALT_MASK | java.awt.Event.CTRL_MASK | java.awt.Event.SHIFT_MASK, true));
+	}
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/LiteralTest.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/LiteralTest.java
new file mode 100644
index 0000000..e28a739
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/LiteralTest.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jem.tests.proxy.initParser;
+/*
+ *  $RCSfile: LiteralTest.java,v $
+ *  $Revision: 1.4 $  $Date: 2005/08/24 20:58:54 $ 
+ */
+
+/**
+ * @author jmyers
+ *
+ * To change the template for this generated type comment go to
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+public class LiteralTest extends AbstractInitParserTestCase {
+
+	/**
+	 * Constructor for LiteralTest.
+	 * @param name
+	 */
+	public LiteralTest(String name) {
+		super(name);
+	}
+	
+	public void testString() throws Throwable {
+		testHelper.testInitString("\"Frog\"", "Frog");	
+	}
+	public void testNull() throws Throwable {
+		testHelper.testInitString("null", null);	
+	}
+	public void testFalse() throws Throwable {
+		testHelper.testInitString("false", Boolean.FALSE);	
+	}
+	public void testTrue() throws Throwable {
+		testHelper.testInitString("true", Boolean.TRUE);	
+	}
+	public void testBooleanTrue() throws Throwable {
+		testHelper.testInitString("Boolean.TRUE", Boolean.TRUE);	
+	}
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/MultiArgConstructorTest.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/MultiArgConstructorTest.java
new file mode 100644
index 0000000..7557ffa
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/MultiArgConstructorTest.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jem.tests.proxy.initParser;
+/*
+ *  $RCSfile: MultiArgConstructorTest.java,v $
+ *  $Revision: 1.7 $  $Date: 2005/08/24 20:58:54 $ 
+ */
+
+/**
+ * @author jmyers
+ *
+ * To change the template for this generated type comment go to
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+public class MultiArgConstructorTest extends AbstractInitParserTestCase {
+
+	/**
+	 * Constructor for MultiArgConstructorTest.
+	 * @param name
+	 */
+	public MultiArgConstructorTest(String name) {
+		super(name);
+	}
+
+	public void testTwoBooleans() throws Throwable {
+		testHelper.testInitString("new org.eclipse.jem.tests.proxy.initParser.NavigationParameters(false, false)",new org.eclipse.jem.tests.proxy.initParser.NavigationParameters(false,false));	
+	}
+	public void testTwoInts() throws Throwable {
+		testHelper.testInitString("new org.eclipse.jem.tests.proxy.initParser.NavigationParameters(12, 24)",new org.eclipse.jem.tests.proxy.initParser.NavigationParameters(12,24));		
+	}
+	public void testThreeFloats() throws Throwable {
+		testHelper.testInitString("new org.eclipse.jem.tests.proxy.initParser.NavigationParameters((float)12,(float)24,(float)50)",new org.eclipse.jem.tests.proxy.initParser.NavigationParameters(12,24,50));		
+	}
+	public void testTwoDoubles() throws Throwable {
+		testHelper.testInitString("new org.eclipse.jem.tests.proxy.initParser.NavigationParameters(12.5d, 24.5d)",new org.eclipse.jem.tests.proxy.initParser.NavigationParameters(12.5d,24.5d));	
+	}
+	public void testTwoStrings() throws Throwable {
+		testHelper.testInitString("new org.eclipse.jem.tests.proxy.initParser.NavigationParameters(\"a\", \"b\")",new org.eclipse.jem.tests.proxy.initParser.NavigationParameters("a","b"));	
+	}
+	public void testTwoColors() throws Throwable {
+		testHelper.testInitString("new org.eclipse.jem.tests.proxy.initParser.NavigationParameters(java.awt.Color.red, java.awt.Color.red)",new org.eclipse.jem.tests.proxy.initParser.NavigationParameters(java.awt.Color.red,java.awt.Color.red));		
+	}
+	public void testTwoNewColors() throws Throwable {
+		testHelper.testInitString("new org.eclipse.jem.tests.proxy.initParser.NavigationParameters(new java.awt.Color(255,0,0), new java.awt.Color(255,0,0))",new org.eclipse.jem.tests.proxy.initParser.NavigationParameters(new java.awt.Color(255,0,0),new java.awt.Color(255,0,0)));	
+	}
+	public void testLots() throws Throwable {
+		testHelper.testInitString("new org.eclipse.jem.tests.proxy.initParser.NavigationParameters(\"processor\", 0, \"customerSearchClientOp\", 0, \"2343434\", \"3443234234\", \"depositRepFmt\", \"depositRepFmt\", \"\", \"\", 0, 0, 0, 0, false, false)",new org.eclipse.jem.tests.proxy.initParser.NavigationParameters("processor", 0, "customerSearchClientOp", 0, "2343434", "3443234234", "depositRepFmt", "depositRepFmt", "", "", 0, 0, 0, 0, false, false));	
+	}
+
+// Testcase for Bugzilla bug #58854 - not yet fixed.
+//	public void testNestedNested() throws Throwable {
+//		testHelper.testInitString("new org.eclipse.jem.tests.proxy.initParser.NavigationParameters(new java.lang.String(new String(\"s\")), \"a\")",new org.eclipse.jem.tests.proxy.initParser.NavigationParameters(new java.lang.String(new String("s")), "a"));	
+//	}
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/MultiArgInstanceTest.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/MultiArgInstanceTest.java
new file mode 100644
index 0000000..1f0384c
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/MultiArgInstanceTest.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jem.tests.proxy.initParser;
+/*
+ *  $RCSfile: MultiArgInstanceTest.java,v $
+ *  $Revision: 1.5 $  $Date: 2005/08/24 20:58:54 $ 
+ */
+
+/**
+ * @author jmyers
+ *
+ * To change the template for this generated type comment go to
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+public class MultiArgInstanceTest extends AbstractInitParserTestCase {
+
+	/**
+	 * Constructor for MultiArgInstanceTest.
+	 * @param name
+	 */
+	public MultiArgInstanceTest(String name) {
+		super(name);
+	}
+	
+	public void testTwoBooleans() throws Throwable {
+		testHelper.testInitString("new org.eclipse.jem.tests.proxy.initParser.NavigationParameters().set(false, false)",new org.eclipse.jem.tests.proxy.initParser.NavigationParameters().set(false,false));		
+	}
+	public void testTwoInts() throws Throwable {
+		testHelper.testInitString("new org.eclipse.jem.tests.proxy.initParser.NavigationParameters().set(12, 24)",new org.eclipse.jem.tests.proxy.initParser.NavigationParameters().set(12,24));		
+	}
+	public void testThreeFloats() throws Throwable {
+		testHelper.testInitString("new org.eclipse.jem.tests.proxy.initParser.NavigationParameters().set((float)12,(float)24,(float)50)",new org.eclipse.jem.tests.proxy.initParser.NavigationParameters().set(12,24,50));	
+	}
+	public void testTwoDoubles() throws Throwable {
+		testHelper.testInitString("new org.eclipse.jem.tests.proxy.initParser.NavigationParameters().set(12.5d, 24.5d)",new org.eclipse.jem.tests.proxy.initParser.NavigationParameters().set(12.5d,24.5d));	
+	}
+	public void testTwoStrings() throws Throwable {
+		testHelper.testInitString("new org.eclipse.jem.tests.proxy.initParser.NavigationParameters().set(\"a\", \"b\")",new org.eclipse.jem.tests.proxy.initParser.NavigationParameters().set("a","b"));	
+	}
+	public void testTwoColors() throws Throwable {
+		testHelper.testInitString("new org.eclipse.jem.tests.proxy.initParser.NavigationParameters().set(java.awt.Color.red, java.awt.Color.red)",new org.eclipse.jem.tests.proxy.initParser.NavigationParameters().set(java.awt.Color.red,java.awt.Color.red));	
+	}
+	public void testTwoNewColors() throws Throwable {
+		testHelper.testInitString("new org.eclipse.jem.tests.proxy.initParser.NavigationParameters().set(new java.awt.Color(255,0,0), new java.awt.Color(255,0,0))",new org.eclipse.jem.tests.proxy.initParser.NavigationParameters().set(new java.awt.Color(255,0,0),new java.awt.Color(255,0,0)));	
+	}
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/MultiArgStaticMethodTest.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/MultiArgStaticMethodTest.java
new file mode 100644
index 0000000..1bd2f90
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/MultiArgStaticMethodTest.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jem.tests.proxy.initParser;
+/*
+ *  $RCSfile: MultiArgStaticMethodTest.java,v $
+ *  $Revision: 1.5 $  $Date: 2005/08/24 20:58:54 $ 
+ */
+
+/**
+ * @author jmyers
+ *
+ * To change the template for this generated type comment go to
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+public class MultiArgStaticMethodTest extends AbstractInitParserTestCase {
+
+	/**
+	 * Constructor for MultiArgStaticMethodTest.
+	 * @param name
+	 */
+	public MultiArgStaticMethodTest(String name) {
+		super(name);
+	}
+
+	public void testTwoBooleans() throws Throwable {
+		testHelper.testInitString("org.eclipse.jem.tests.proxy.initParser.NavigationParameters.get(false, false)",org.eclipse.jem.tests.proxy.initParser.NavigationParameters.get(false,false));	
+	}
+	public void testTwoInts() throws Throwable {
+		testHelper.testInitString("org.eclipse.jem.tests.proxy.initParser.NavigationParameters.get(12, 24)",org.eclipse.jem.tests.proxy.initParser.NavigationParameters.get(12,24));	
+	}
+	public void testThreeFloats() throws Throwable {
+		testHelper.testInitString("org.eclipse.jem.tests.proxy.initParser.NavigationParameters.get((float)12,(float)24,(float)50)",org.eclipse.jem.tests.proxy.initParser.NavigationParameters.get(12,24,50));		
+	}
+	public void testTwoDoubles() throws Throwable {
+		testHelper.testInitString("org.eclipse.jem.tests.proxy.initParser.NavigationParameters.get(12.5d, 24.5d)",org.eclipse.jem.tests.proxy.initParser.NavigationParameters.get(12.5d,24.5d));	
+	}
+	public void testTwoStrings() throws Throwable {
+		testHelper.testInitString("org.eclipse.jem.tests.proxy.initParser.NavigationParameters.get(\"a\", \"b\")",org.eclipse.jem.tests.proxy.initParser.NavigationParameters.get("a","b"));	
+	}
+	public void testTwoColors() throws Throwable {
+		testHelper.testInitString("org.eclipse.jem.tests.proxy.initParser.NavigationParameters.get(java.awt.Color.red, java.awt.Color.red)",org.eclipse.jem.tests.proxy.initParser.NavigationParameters.get(java.awt.Color.red,java.awt.Color.red));		
+	}
+	public void testTwoNewColors() throws Throwable {
+		testHelper.testInitString("org.eclipse.jem.tests.proxy.initParser.NavigationParameters.get(new java.awt.Color(255,0,0), new java.awt.Color(255,0,0))",org.eclipse.jem.tests.proxy.initParser.NavigationParameters.get(new java.awt.Color(255,0,0),new java.awt.Color(255,0,0)));		
+	}
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/NavigationParameters.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/NavigationParameters.java
new file mode 100644
index 0000000..fe1e6fd
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/NavigationParameters.java
@@ -0,0 +1,244 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jem.tests.proxy.initParser;
+/*
+ *  $RCSfile: NavigationParameters.java,v $
+ *  $Revision: 1.4 $  $Date: 2005/08/24 20:58:54 $ 
+ */
+
+import java.io.*;
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.Map;
+import java.awt.*;
+
+/**
+ * Test class for the initStrimg parser - This is there after the Spanish folks found some errors with initStrings
+ * that showed up deficiencies where we had methods with multiple arguments and some of the expressions inside the
+ * arguments were not being closed correctly.  This class is designed to have lots of methods ( constructors and statics
+ * and instance methods ) with multiple argument types to test these scenarios, and nice toString() methods so that we can
+ * get good hit results on the test succeeding by a perfect toString() match
+ */
+public class NavigationParameters implements java.io.Serializable {
+	/**
+	 * Comment for <code>serialVersionUID</code>
+	 * 
+	 * @since 1.1.0
+	 */
+	private static final long serialVersionUID = 5289530492833484640L;
+	protected int x = Integer.MIN_VALUE;
+	protected int y = Integer.MIN_VALUE;
+	protected boolean boolA, boolB, boolC;
+	protected Color colorA, colorB;
+	protected String stringA, stringB, stringC;
+	protected double d1 = Double.MIN_VALUE;
+	protected double d2 = Double.MIN_VALUE;
+	protected float f1 = Float.MIN_VALUE;
+	protected float f2 = Float.MIN_VALUE;	
+	protected float f3 = Float.MIN_VALUE;	
+	protected int[][] fIntArray;	
+	protected double[][] fDoubleDoubleArray;
+	protected double[] fDoubleArray;	
+	protected Map fElements;	
+
+// The original constructor we broke on - left there for posterity
+public NavigationParameters(String newContextUsed, int newNavigation, String newOperationName, int newChainContext, String newViewName, String newViewSource, String newOutputMapFormat, String newInputMapFormat, String a, String b, int x, int y, int w, int h, boolean useP, boolean useS) {
+}
+public NavigationParameters(){
+}
+public NavigationParameters(int x){
+	this.x = x;
+	y = 100;
+}
+public NavigationParameters setElemAt(Object aKey, int aValue){
+	if ( fElements == null ) {
+		fElements = new HashMap(1);
+	};
+	fElements.put(aKey,new Integer(aValue));
+	return this;
+}
+public NavigationParameters(String string1, String string2, String string3, boolean bool1, boolean bool2, boolean bool3, int x){
+	stringA = string1;
+	stringB = string2;
+	stringC = string3;
+	boolA = bool1;
+	boolB = bool2;
+	boolC = bool3;	
+	this.x = x;
+}
+public NavigationParameters(int[][] intArray){
+	fIntArray = intArray;
+}
+public NavigationParameters(double[] doubleArray){
+	fDoubleArray = doubleArray;
+}
+// Constructors with different combinations of arguments
+public NavigationParameters(boolean a, boolean b){
+	boolA = a;
+	boolB = b;
+}
+public NavigationParameters(int x, int y){
+	this.x = x;
+	this.y = y;
+}
+public NavigationParameters(float f1, float f2, float f3){
+	this.f1 = f1;
+	this.f2 = f2;
+	this.f3 = f3;	
+}
+public NavigationParameters(double[][] aDoubleDoubleArray){
+	fDoubleDoubleArray = aDoubleDoubleArray;
+}
+public NavigationParameters(double d1, double d2){
+	this.d1 = d1;
+	this.d2 = d2;
+}
+public NavigationParameters(Color colorA, Color colorB){
+	this.colorA = colorA;
+	this.colorB = colorB;
+}
+public NavigationParameters(String stringA, String stringB){
+	this.stringA = stringA;
+	this.stringB = stringB;
+}
+// Static method calls with different combinations of arguments
+public static NavigationParameters get(boolean a, boolean b){
+	return new NavigationParameters(a,b);
+}
+public static NavigationParameters get(int x, int y){
+	return new NavigationParameters(x,y);
+}
+public static NavigationParameters get(float f1, float f2, float f3){
+	return new NavigationParameters(f1,f2,f3);
+}
+public static NavigationParameters get(double d1, double d2){
+	return new NavigationParameters(d1,d2);
+}
+public static NavigationParameters get(Color colorA, Color colorB){
+	return new NavigationParameters(colorA,colorB);
+}
+public static NavigationParameters get(String stringA, String stringB){
+	return new NavigationParameters(stringA,stringB);
+}
+public static Object getReversed(String arg){
+	// Return the argument reversed
+	StringBuffer buffer = new StringBuffer(arg.length());
+	for (int i = arg.length()-1; i >= 0; i--) {
+		buffer.append(arg.charAt(i));
+	}
+	return buffer.toString();
+}
+public static Color getColor(String colorName){
+	// Return the colorName to test cast statements
+	try {
+		Field field = Color.class.getField(colorName);
+		return (Color) field.get(Color.class);
+	} catch ( NoSuchFieldException exc ) {
+		try {
+			// It is possible that the field is on SystemColor and not color
+			Field field = SystemColor.class.getField(colorName);
+			return (Color) field.get(Color.class);		
+		} catch ( Exception e ) {
+		}
+	} catch ( Exception exc ) {
+	}
+	return null;
+}
+// Instance method calls with different combinations of arguments
+public NavigationParameters set(boolean a, boolean b){
+	boolA = a;
+	boolB = b;
+	return this;	
+}
+public NavigationParameters set(int x, int y){
+	this.x = x;
+	this.y = y;
+	return this;	
+}
+public NavigationParameters set(float f1, float f2, float f3){
+	this.f1 = f1;
+	this.f2 = f2;
+	this.f3 = f3;
+	return this;	
+}
+public NavigationParameters set(double d1, double d2){
+	this.d1 = d1;
+	this.d2 = d2;
+	return this;	
+}
+public NavigationParameters set(Color colorA, Color colorB){
+	this.colorA = colorA;
+	this.colorB = colorB;
+	return this;
+}
+public NavigationParameters set(String stringA, String stringB){
+	this.stringA = stringA;
+	this.stringB = stringB;
+	return this;	
+}
+// To string method to help the tests be OK? with matching toString() results
+public String toString(){
+	StringWriter writer = new StringWriter();
+	writer.write("NavigationParameters(");
+	if ( x != Integer.MIN_VALUE ) writer.write(new Integer(x).toString());
+	if ( y != Integer.MIN_VALUE ) writer.write(new Integer(y).toString());	
+	writer.write("boolA=" + boolA);
+	writer.write("boolA=" + boolB);	
+	writer.write("boolA=" + boolA);
+	writer.write("boolC=" + boolC);		
+	if ( colorA != null ) writer.write("colorA=" + colorA);
+	if ( colorB != null ) writer.write("colorB=" + colorB);	
+	if ( stringA != null ) writer.write("stringA=" + stringA);
+	if ( stringB != null ) writer.write("stringB=" + stringB);		
+	if ( stringC != null ) writer.write("stringB=" + stringC);
+	if ( d1 != Double.MIN_VALUE ) writer.write("d1=" + d1);
+	if ( d2 != Double.MIN_VALUE ) writer.write("d1=" + d2);
+	if ( f1 != Float.MIN_VALUE ) writer.write("f1=" + f1);
+	if ( f2 != Float.MIN_VALUE ) writer.write("f2=" + f2);
+	if ( f2 != Float.MIN_VALUE ) writer.write("f3=" + f3);	
+	if ( fIntArray != null ) {
+		writer.write("int array=");
+		for (int i = 0; i < fIntArray.length; i++) {
+			writer.write("[");
+			// The elements in the array are themselves arrays - it is two dimensional
+			int[] elements = fIntArray[i];
+			for (int j = 0; j < elements.length; j++) {
+				writer.write(new Integer(elements[j]).toString());	
+			}
+			writer.write("]");
+		}
+	}
+	if ( fDoubleDoubleArray != null ) {
+		writer.write("doubledouble array=");
+		for (int i = 0; i < fDoubleDoubleArray.length; i++) {
+			writer.write("[");
+			// The elements in the array are themselves arrays - it is two dimensional
+			double[] elements = fDoubleDoubleArray[i];
+			for (int j = 0; j < elements.length; j++) {
+				writer.write(new Double(elements[j]).toString());	
+			}
+			writer.write("]");
+		}
+	}
+	
+	if ( fDoubleArray != null ) {	
+		writer.write("double array=");		
+		for (int i = 0; i < fDoubleArray.length; i++) {
+			writer.write("(");			
+			writer.write(new Double(fDoubleArray[i]).toString());
+			writer.write(")");			
+		}
+	}
+	writer.write(")");
+	return writer.toString();
+}
+
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/NeedsCodingTest.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/NeedsCodingTest.java
new file mode 100644
index 0000000..02ec453
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/NeedsCodingTest.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jem.tests.proxy.initParser;
+/*
+ *  $RCSfile: NeedsCodingTest.java,v $
+ *  $Revision: 1.6 $  $Date: 2005/08/24 20:58:54 $ 
+ */
+
+/**
+ * @author jmyers
+ *
+ * To change the template for this generated type comment go to
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+public class NeedsCodingTest extends AbstractInitParserTestCase {
+
+	/**
+	 * Constructor for NeedsCodingTest.
+	 * @param name
+	 */
+	public NeedsCodingTest(String name) {
+		super(name);
+	}	
+	
+	// TODO: enable this test when math works
+	/*
+	public void testMath() {
+		// Doing math is not coded yet.  We don't expect to encounter any strings like this as part of GA
+		testHelper.testInitString("10 + 20", new Integer(10 + 20));	
+	}
+	*/
+	
+	public void testInnerClasses() throws Throwable {
+         //	Inner classes need coding but we have a test to make sure we throw an explicit exception
+		 testHelper.testInitString("new javax.swing.table.DefaultTableModel(){}",new javax.swing.table.DefaultTableModel(){
+
+			/**
+			 * Comment for <code>serialVersionUID</code>
+			 * 
+			 * @since 1.1.0
+			 */
+			private static final long serialVersionUID = 1L;},true, true);	
+	}
+	public void testParamsThreeFloats() throws Throwable {
+		testHelper.testInitString("org.eclipse.jem.tests.proxy.initParser.NavigationParameters.get((float)12,(float)24,(float)50)",org.eclipse.jem.tests.proxy.initParser.NavigationParameters.get(12,24,50));		
+	}
+	public void testConstructThreeFloats() throws Throwable {
+		testHelper.testInitString("new org.eclipse.jem.tests.proxy.initParser.NavigationParameters((float)12,(float)24,(float)50)",new org.eclipse.jem.tests.proxy.initParser.NavigationParameters(12,24,50));	
+	}
+	public void testNewParamsThreeFloats() throws Throwable {
+		testHelper.testInitString("new org.eclipse.jem.tests.proxy.initParser.NavigationParameters().set((float)12,(float)24,(float)50)",new org.eclipse.jem.tests.proxy.initParser.NavigationParameters().set(12,24,50));	
+	}
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/NumberTest.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/NumberTest.java
new file mode 100644
index 0000000..5863b66
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/NumberTest.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jem.tests.proxy.initParser;
+/*
+ *  $RCSfile: NumberTest.java,v $
+ *  $Revision: 1.4 $  $Date: 2005/08/24 20:58:54 $ 
+ */
+
+/**
+ * @author jmyers
+ *
+ * To change the template for this generated type comment go to
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+public class NumberTest extends AbstractInitParserTestCase {
+
+	/**
+	 * Constructor for NumberTest.
+	 * @param name
+	 */
+	public NumberTest(String name) {
+		super(name);
+	}
+
+	public void testIntPrim() throws Throwable {
+		testHelper.testInitString("10", new Integer(10));	
+	}
+	public void testShortPrim() throws Throwable {
+		testHelper.testInitString("(short)10", new Short((short)10));	
+	}
+	public void testNegativeShortPrim() throws Throwable {
+		testHelper.testInitString("(short)-10", new Short((short)-10));	
+	}	
+	public void testBytePrim() throws Throwable {
+		testHelper.testInitString("(byte)10", new Byte((byte)10));	
+	}
+	public void testDoublePrimExplicit() throws Throwable {
+		testHelper.testInitString("10d", new Double(10d));	
+	}
+	public void testNegativeDoublePrimExplicit() throws Throwable {
+		testHelper.testInitString("-10d", new Double(-10d));	
+	}
+	public void testFloatPrimExplicit() throws Throwable {
+		testHelper.testInitString("10f", new Float(10f));	
+	}
+	public void testLongPrimExplicit() throws Throwable {
+		testHelper.testInitString("10l", new Long(10l));	
+	}
+	public void testDoublePrimImplicit() throws Throwable {
+		testHelper.testInitString("10.75", new Double(10.75));	
+	}
+	public void testNegativeDoublePrimImplicit() throws Throwable {
+		testHelper.testInitString("-10.75", new Double(-10.75));	
+	}
+	public void testSpacedDoublePrimImplicit() throws Throwable {
+		testHelper.testInitString(" 10.75 ", new Double(10.75));	
+	}
+	public void testNegativeDoublePrimExplicit2() throws Throwable {
+		testHelper.testInitString("-10.75d", new Double(-10.75d));	
+	}
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/OverloadingTest.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/OverloadingTest.java
new file mode 100644
index 0000000..983ae44
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/OverloadingTest.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jem.tests.proxy.initParser;
+/*
+ *  $RCSfile: OverloadingTest.java,v $
+ *  $Revision: 1.7 $  $Date: 2005/08/24 20:58:54 $ 
+ */
+
+/**
+ * Test that correct overloaded method is called.
+ * @author jmyers
+ *
+ * To change the template for this generated type comment go to
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+public class OverloadingTest extends AbstractInitParserTestCase {
+
+	/**
+	 * Constructor for OverloadingTest.
+	 * @param name
+	 */
+	public OverloadingTest(String name) {
+		super(name);
+	}
+
+	public void testOverloadString() throws Throwable {
+		testHelper.testInitString("new Integer(\"3\")", new Integer(3));
+	}
+	public void testOverloadShort() throws Throwable {
+		testHelper.testInitString("new Integer(5)", new Integer(5));
+	}
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/SameName46376Test.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/SameName46376Test.java
new file mode 100644
index 0000000..4ce5a75
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/SameName46376Test.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jem.tests.proxy.initParser;
+/*
+ *  $RCSfile: SameName46376Test.java,v $
+ *  $Revision: 1.3 $  $Date: 2005/08/24 20:58:54 $ 
+ */
+ 
+/**
+ * This is to test for defect [46376].
+ * 
+ * SameName test. This is test where you have this:
+ * 	InitParserTest46376.SameNameTestClass.java
+ * 	InitParserTest46376.java
+ * 
+ * and
+ * 
+ * 	new org.eclipse.jem.tests.proxy.initParser.SameNameTestClass.RealClass()
+ * 
+ * Before [46376] the Static parser would find SameNameTestClass.java instead of the RealClass and would of failed.
+ * To compile in Eclipse we need to have one of the classes be in the default package. Eclipse complains if we didn't.
+ * But there is nothing to stop this from happening with packages too if they are spread across compile groups.  
+ */
+public class SameName46376Test extends AbstractInitParserTestCase {
+	
+	public SameName46376Test(String name) {
+		super(name);
+	}	
+
+	public void test46376() throws Throwable {
+		testHelper.testInitString("new initParserTest46376.SameNameTestClass()", new initParserTest46376.SameNameTestClass());
+	}
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/StringTest.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/StringTest.java
new file mode 100644
index 0000000..77b4465
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/StringTest.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jem.tests.proxy.initParser;
+/*
+ *  $RCSfile: StringTest.java,v $
+ *  $Revision: 1.6 $  $Date: 2005/08/24 20:58:54 $ 
+ */
+
+/**
+ * @author jmyers
+ *
+ * To change the template for this generated type comment go to
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+public class StringTest extends AbstractInitParserTestCase {
+
+	/**
+	 * Constructor for StringTest.
+	 * @param name
+	 */
+	public StringTest(String name) {
+		super(name);
+	}
+
+	public void testBasic() throws Throwable {
+		testHelper.testInitString("\"Frog/123\"", "Frog/123");
+	}
+	public void testIntValue() throws Throwable {
+		testHelper.testInitString("String.valueOf(10)", "10");	
+	}
+	public void testParens() throws Throwable {
+		testHelper.testInitString("\"Frog(123)prince\"", "Frog(123)prince");	
+	}
+	public void testDoubleQuotes() throws Throwable {
+		testHelper.testInitString("\"Frog\\\"prince\\\"123\"", "Frog\"prince\"123");	
+	}
+	public void testBackSlashes() throws Throwable {
+		testHelper.testInitString("\"Frog\\\\prince\\\\123\"", "Frog\\prince\\123");	
+	}
+	public void testBackSlash() throws Throwable {
+		testHelper.testInitString("\"\\\\Frog\"", "\\Frog");	
+	}
+	public void testStringFunction() throws Throwable {
+		testHelper.testInitString("\"Frog\".length()", new Integer(4));	
+	}
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/tree/ASTArraysTest.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/tree/ASTArraysTest.java
new file mode 100644
index 0000000..c25d492
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/tree/ASTArraysTest.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $RCSfile: ASTArraysTest.java,v $
+ *  $Revision: 1.5 $  $Date: 2005/08/24 20:58:54 $ 
+ */
+package org.eclipse.jem.tests.proxy.initParser.tree;
+
+import org.eclipse.jem.internal.proxy.core.IExpression;
+import org.eclipse.jem.internal.proxy.initParser.tree.ForExpression;
+import org.eclipse.jem.tests.proxy.initParser.ArrayConstructorTest;
+ 
+/**
+ * Test Arrays for AST.
+ * 
+ * @since 1.0.0
+ */
+public class ASTArraysTest extends ArrayConstructorTest {
+
+	public ASTArraysTest(String name) {
+		super(name);
+	}
+	
+	protected ASTTreeInitStringParserTestHelper getTreeParser() {
+		return (ASTTreeInitStringParserTestHelper) testHelper;
+	}
+	
+	public void testUndefinedSecondDim() throws Throwable {
+		IExpression exp = getTreeParser().getRegistry().getBeanProxyFactory().createExpression();
+		exp.createArrayCreation(ForExpression.ROOTEXPRESSION, "int[][]", 1);
+		exp.createPrimitiveLiteral(ForExpression.ARRAYCREATION_DIMENSION, 3);
+		testHelper.testInitString("new int[3][]", exp.getExpressionValue());
+	}
+	
+	public void testArrayAccess() throws Throwable {
+		IExpression exp = getTreeParser().getRegistry().getBeanProxyFactory().createExpression();
+		exp.createArrayAccess(ForExpression.ROOTEXPRESSION, 1);
+		exp.createArrayCreation(ForExpression.ARRAYACCESS_ARRAY, "java.lang.Integer[]", 1);
+		exp.createPrimitiveLiteral(ForExpression.ARRAYCREATION_DIMENSION, 3);
+		exp.createPrimitiveLiteral(ForExpression.ARRAYACCESS_INDEX, 0);
+		testHelper.testInitString("(new Integer[3])[0]", exp.getExpressionValue()); 
+	}
+	
+	public void testMutltiArrayAccess() throws Throwable {
+		IExpression exp = getTreeParser().getRegistry().getBeanProxyFactory().createExpression();
+		exp.createArrayAccess(ForExpression.ROOTEXPRESSION, 2);
+		exp.createArrayCreation(ForExpression.ARRAYACCESS_ARRAY, "int[][]", 0);
+		exp.createArrayInitializer(2);
+		exp.createArrayInitializer(1);
+		exp.createPrimitiveLiteral(ForExpression.ARRAYINITIALIZER_EXPRESSION, 2);
+		exp.createArrayInitializer(1);
+		exp.createPrimitiveLiteral(ForExpression.ARRAYINITIALIZER_EXPRESSION, 4);
+		exp.createPrimitiveLiteral(ForExpression.ARRAYACCESS_INDEX, 0);
+		exp.createPrimitiveLiteral(ForExpression.ARRAYACCESS_INDEX, 0);		
+		testHelper.testInitString("(new int[][] {{2}, {4}})[0][0]", exp.getExpressionValue()); 
+	}	
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/tree/ASTFieldAccessTest.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/tree/ASTFieldAccessTest.java
new file mode 100644
index 0000000..284eadb
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/tree/ASTFieldAccessTest.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $RCSfile: ASTFieldAccessTest.java,v $
+ *  $Revision: 1.5 $  $Date: 2005/08/24 20:58:54 $ 
+ */
+package org.eclipse.jem.tests.proxy.initParser.tree;
+
+import org.eclipse.jem.internal.proxy.core.IExpression;
+import org.eclipse.jem.internal.proxy.initParser.tree.ForExpression;
+import org.eclipse.jem.tests.proxy.initParser.AbstractInitParserTestCase;
+ 
+/**
+ * 
+ * @since 1.0.0
+ */
+public class ASTFieldAccessTest extends AbstractInitParserTestCase {
+
+	/**
+	 * Create with name.
+	 * @param name
+	 * 
+	 * @since 1.0.0
+	 */
+	public ASTFieldAccessTest(String name) {
+		super(name);
+	}
+	
+	protected ASTTreeInitStringParserTestHelper getTreeParser() {
+		return (ASTTreeInitStringParserTestHelper) testHelper;
+	}
+	
+	public void testNonQualifiedFieldAccess() throws Throwable {
+		getTreeParser().testInitString("Color.red", new String[] {"java.awt.*"}, getTreeParser().getRegistry().getBeanTypeProxyFactory().getBeanTypeProxy("java.awt.Color").newInstance("java.awt.Color.red") );
+	}
+	
+	public void testExpressionFieldAccess() throws Throwable {
+		getTreeParser().testInitString("(Color.red).red", new String[] {"java.awt.*"}, getTreeParser().getRegistry().getBeanTypeProxyFactory().getBeanTypeProxy("java.awt.Color").newInstance("java.awt.Color.red") );	// Should not use this form, but it is valid, use valid form for expected results so no warnings.
+	}
+	
+	public void testNestedFieldAccess() throws Throwable {
+		getTreeParser().testInitString("ASTNestFieldAccessTestData.acolor.red", new String[] {"org.eclipse.jem.tests.proxy.initParser.tree.ASTNestFieldAccessTestData"},  getTreeParser().getRegistry().getBeanTypeProxyFactory().getBeanTypeProxy("java.awt.Color").newInstance("java.awt.Color.red"));	// Should not use this form, but it is valid, use valid form for expected results so no warnings.
+	}
+
+	public void testNestedFieldExpressionAccess() throws Throwable {
+		getTreeParser().testInitString("new ASTNestFieldAccessTestData().acolor.red", new String[] {"org.eclipse.jem.tests.proxy.initParser.tree.ASTNestFieldAccessTestData"},  getTreeParser().getRegistry().getBeanTypeProxyFactory().getBeanTypeProxy("java.awt.Color").newInstance("java.awt.Color.red"));	// Should not use this form, but it is valid, use valid form for expected results so no warnings.
+	}
+	
+	public void testNonstaticFieldAccess() throws Throwable {
+		IExpression exp = getTreeParser().getRegistry().getBeanProxyFactory().createExpression();
+		exp.createFieldAccess(ForExpression.ROOTEXPRESSION, "arect", true);
+		exp.createClassInstanceCreation(ForExpression.FIELD_RECEIVER, "org.eclipse.jem.tests.proxy.initParser.tree.ASTNestFieldAccessTestData", 0);
+		getTreeParser().testInitString("new ASTNestFieldAccessTestData().arect", new String[] {"org.eclipse.jem.tests.proxy.initParser.tree.ASTNestFieldAccessTestData"},  exp.getExpressionValue());
+	}
+	
+	public void testNonstaticNestedFieldAccess() throws Throwable {
+		IExpression exp = getTreeParser().getRegistry().getBeanProxyFactory().createExpression();
+		exp.createFieldAccess(ForExpression.ROOTEXPRESSION, "x", true);
+		exp.createFieldAccess(ForExpression.FIELD_RECEIVER, "arect", true);
+		exp.createClassInstanceCreation(ForExpression.FIELD_RECEIVER, "org.eclipse.jem.tests.proxy.initParser.tree.ASTNestFieldAccessTestData", 0);
+		getTreeParser().testInitString("new ASTNestFieldAccessTestData().arect.x", new String[] {"org.eclipse.jem.tests.proxy.initParser.tree.ASTNestFieldAccessTestData"},  exp.getExpressionValue());
+	}
+	
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/tree/ASTInnerClassAccessTest.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/tree/ASTInnerClassAccessTest.java
new file mode 100644
index 0000000..34593d2
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/tree/ASTInnerClassAccessTest.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $RCSfile: ASTInnerClassAccessTest.java,v $
+ *  $Revision: 1.5 $  $Date: 2005/08/24 20:58:54 $ 
+ */
+package org.eclipse.jem.tests.proxy.initParser.tree;
+
+import org.eclipse.jem.internal.proxy.core.IExpression;
+import org.eclipse.jem.internal.proxy.initParser.tree.ForExpression;
+import org.eclipse.jem.tests.proxy.initParser.AbstractInitParserTestCase;
+ 
+/**
+ * This is for testing inner class access.
+ * @since 1.0.0
+ */
+public class ASTInnerClassAccessTest extends AbstractInitParserTestCase {
+
+	/**
+	 * Construct with name.
+	 * @param name
+	 * 
+	 * @since 1.0.0
+	 */
+	public ASTInnerClassAccessTest(String name) {
+		super(name);
+	}
+
+	protected ASTTreeInitStringParserTestHelper getTreeParser() {
+		return (ASTTreeInitStringParserTestHelper) testHelper;
+	}
+	
+	public void testInnerFieldAccess() throws Throwable {
+		IExpression exp = getTreeParser().getRegistry().getBeanProxyFactory().createExpression();
+		exp.createFieldAccess(ForExpression.ROOTEXPRESSION, "GREEN", true);
+		exp.createTypeReceiver("org.eclipse.jem.tests.proxy.initParser.tree.InnerClassTestData$InnerInnerClass");
+		getTreeParser().testInitString("InnerClassTestData.InnerInnerClass.GREEN", new String[] {"org.eclipse.jem.tests.proxy.initParser.tree.*"}, exp.getExpressionValue());
+	}
+	
+	public void testInnerFieldAccess2() throws Throwable {
+		IExpression exp = getTreeParser().getRegistry().getBeanProxyFactory().createExpression();
+		exp.createFieldAccess(ForExpression.ROOTEXPRESSION, "GREEN", true);
+		exp.createTypeReceiver("org.eclipse.jem.tests.proxy.initParser.tree.InnerClassTestData$InnerInnerClass");
+		
+		// Test where the inner class is the top level listed.
+		getTreeParser().testInitString("InnerInnerClass.GREEN", new String[] {"org.eclipse.jem.tests.proxy.initParser.tree.InnerClassTestData.InnerInnerClass"}, exp.getExpressionValue());
+	}	
+	
+	public void testInnerInnerFieldAccess() throws Throwable {
+		IExpression exp = getTreeParser().getRegistry().getBeanProxyFactory().createExpression();
+		exp.createFieldAccess(ForExpression.ROOTEXPRESSION, "RED", true);
+		exp.createTypeReceiver("org.eclipse.jem.tests.proxy.initParser.tree.InnerClassTestData$InnerInnerClass$InnerInnerInnerClass");
+		
+		getTreeParser().testInitString("InnerClassTestData.InnerInnerClass.InnerInnerInnerClass.RED", new String[] {"org.eclipse.jem.tests.proxy.initParser.tree.*"}, exp.getExpressionValue());
+	}
+
+	public void testInnerClassCreation() throws Throwable {
+		IExpression exp = getTreeParser().getRegistry().getBeanProxyFactory().createExpression();
+		exp.createClassInstanceCreation(ForExpression.ROOTEXPRESSION, "org.eclipse.jem.tests.proxy.initParser.tree.InnerClassTestData$InnerInnerClass", 0);
+		// Create static inner class
+		getTreeParser().testInitString("new InnerClassTestData.InnerInnerClass()", new String[] {"org.eclipse.jem.tests.proxy.initParser.tree.*"}, exp.getExpressionValue());
+	}
+	
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/tree/ASTMiscTest.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/tree/ASTMiscTest.java
new file mode 100644
index 0000000..7381043
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/tree/ASTMiscTest.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $RCSfile: ASTMiscTest.java,v $
+ *  $Revision: 1.5 $  $Date: 2009/01/29 14:58:45 $ 
+ */
+package org.eclipse.jem.tests.proxy.initParser.tree;
+
+import org.eclipse.jem.internal.instantiation.*;
+import org.eclipse.jem.internal.instantiation.InstantiationFactory;
+import org.eclipse.jem.internal.instantiation.PTCharacterLiteral;
+import org.eclipse.jem.tests.proxy.initParser.AbstractInitParserTestCase;
+ 
+/**
+ * Some misc. tests.
+ * @since 1.0.0
+ */
+public class ASTMiscTest extends AbstractInitParserTestCase {
+
+	/**
+	 * Construct with name.
+	 * @param name
+	 * 
+	 * @since 1.0.0
+	 */
+	public ASTMiscTest(String name) {
+		super(name);
+	}
+	
+	public void testCharLiteral() {
+		PTCharacterLiteral cl = InstantiationFactory.eINSTANCE.createPTCharacterLiteral();
+		cl.setEscapedValue("\'a\'");
+		assertEquals('a', cl.getCharValue());
+		cl.setCharValue('b');
+		assertEquals("\'b\'", cl.getEscapedValue());
+		cl.setEscapedValue("\'\\n\'");
+		assertEquals('\n', cl.getCharValue());
+		cl.setCharValue('\b');
+		assertEquals("\'\\b\'", cl.getEscapedValue());
+		cl.setEscapedValue("\'\\u0300\'");
+		assertEquals('\u0300', cl.getCharValue());
+		cl.setCharValue('\u0400');
+		// https://bugs.eclipse.org/bugs/show_bug.cgi?id=249019
+		assertEquals("\'\u0400\'", cl.getEscapedValue());
+	}
+
+	public void testStringLiteral() {
+		PTStringLiteral sl = InstantiationFactory.eINSTANCE.createPTStringLiteral();
+		sl.setEscapedValue("\"a\"");
+		assertEquals("a", sl.getLiteralValue());
+		sl.setLiteralValue("\b");
+		assertEquals("\"\\b\"", sl.getEscapedValue());
+		sl.setEscapedValue("\"\\n\"");
+		assertEquals("\n", sl.getLiteralValue());
+		sl.setLiteralValue("\b");
+		assertEquals("\"\\b\"", sl.getEscapedValue());
+		sl.setEscapedValue("\"\\u0300\"");
+		assertEquals("\u0300", sl.getLiteralValue());
+		sl.setLiteralValue("\u0400");
+		// https://bugs.eclipse.org/bugs/show_bug.cgi?id=249019
+		assertEquals("\"\u0400\"", sl.getEscapedValue());
+	}
+	
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/tree/ASTNestFieldAccessTestData.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/tree/ASTNestFieldAccessTestData.java
new file mode 100644
index 0000000..ff48e73
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/tree/ASTNestFieldAccessTestData.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jem.tests.proxy.initParser.tree;
+/*
+ *  $RCSfile: ASTNestFieldAccessTestData.java,v $
+ *  $Revision: 1.3 $  $Date: 2005/08/24 20:58:54 $ 
+ */
+
+import java.awt.Color;
+import java.awt.Rectangle;
+
+/**
+ * This class is used in the testing of nested field access for Parse testing.
+ * This is when you access a field, and then access a field of that.
+ * In this case  <code>ASTNestFieldAccessTestData.acolor.red</code>
+ * @since 1.0.0
+ */
+public class ASTNestFieldAccessTestData {
+	public static Color acolor = Color.green;
+	public Rectangle arect = new Rectangle(10,20,30,40); 
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/tree/ASTOperationsTest.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/tree/ASTOperationsTest.java
new file mode 100644
index 0000000..f001d4a
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/tree/ASTOperationsTest.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $RCSfile: ASTOperationsTest.java,v $
+ *  $Revision: 1.5 $  $Date: 2005/08/24 20:58:54 $ 
+ */
+package org.eclipse.jem.tests.proxy.initParser.tree;
+
+import org.eclipse.jem.tests.proxy.initParser.AbstractInitParserTestCase;
+ 
+/**
+ * 
+ * @since 1.0.0
+ */
+public class ASTOperationsTest extends AbstractInitParserTestCase {
+
+	/**
+	 * Create with name.
+	 * @param name
+	 * 
+	 * @since 1.0.0
+	 */
+	public ASTOperationsTest(String name) {
+		super(name);
+	}
+	
+	protected ASTTreeInitStringParserTestHelper getTreeParser() {
+		return (ASTTreeInitStringParserTestHelper) testHelper;
+	}
+	
+	public void testTwoOpers() throws Throwable {
+		testHelper.testInitString("3+4", getTreeParser().getRegistry().getBeanProxyFactory().createBeanProxyWith(3+4));
+	}
+	
+	public void testFourOpersExtended() throws Throwable {
+		testHelper.testInitString("3+4+5+6", getTreeParser().getRegistry().getBeanProxyFactory().createBeanProxyWith(3+4+5+6));
+	}	
+
+	public void testMixedOpers() throws Throwable {
+		testHelper.testInitString("3+4-5", getTreeParser().getRegistry().getBeanProxyFactory().createBeanProxyWith(3+4-5));
+	}
+	
+	public void testMixedOpersPrecedence() throws Throwable {
+		testHelper.testInitString("6 | 3+4 | 8", getTreeParser().getRegistry().getBeanProxyFactory().createBeanProxyWith(6 | 3+4 | 8));
+	}
+	
+	public void testConditional() throws Throwable {
+		testHelper.testInitString("java.awt.Color.red != null ? 3 : 5", getTreeParser().getRegistry().getBeanProxyFactory().createBeanProxyWith(java.awt.Color.red != null ? 3 : 5));
+	}
+
+	public void testInstanceof() throws Throwable {
+		testHelper.testInitString("java.awt.Color.red instanceof java.awt.Color", getTreeParser().getRegistry().getBeanProxyFactory().createBeanProxyWith(true));
+	}
+
+	public void testTypeLiteral() throws Throwable {
+		testHelper.testInitString("Object.class", getTreeParser().getRegistry().getBeanTypeProxyFactory().getBeanTypeProxy("java.lang.Object"));
+	}
+	
+	public void testStringPlusOperations() throws Throwable {
+		testHelper.testInitString("3+\"a\"", getTreeParser().getRegistry().getBeanProxyFactory().createBeanProxyWith(3+"a"));
+	}
+	
+	public void testStringPlusOperations1() throws Throwable {
+		testHelper.testInitString("\"a\"+3", getTreeParser().getRegistry().getBeanProxyFactory().createBeanProxyWith("a"+3));
+	}
+	
+	public void testStringPlusExtendedOperations() throws Throwable {
+		testHelper.testInitString("3+4+\"a\"", getTreeParser().getRegistry().getBeanProxyFactory().createBeanProxyWith(3+4+"a"));
+	}
+	
+	public void testStringPlusExtendedOperations1() throws Throwable {
+		testHelper.testInitString("3+\"a\"+4", getTreeParser().getRegistry().getBeanProxyFactory().createBeanProxyWith(3+"a"+4));
+	}
+	
+	
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/tree/ASTParserSuite.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/tree/ASTParserSuite.java
new file mode 100644
index 0000000..533904e
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/tree/ASTParserSuite.java
@@ -0,0 +1,133 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jem.tests.proxy.initParser.tree;
+/*
+ *  $RCSfile: ASTParserSuite.java,v $
+ *  $Revision: 1.12 $  $Date: 2006/05/17 20:13:56 $ 
+ */
+import junit.extensions.TestSetup;
+import junit.framework.*;
+import junit.framework.Assert;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.*;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+
+import org.eclipse.jem.internal.proxy.core.*;
+import org.eclipse.jem.tests.JavaProjectUtil;
+import org.eclipse.jem.tests.JavaTestsPlugin;
+import org.eclipse.jem.tests.proxy.ProxySuite;
+import org.eclipse.jem.tests.proxy.initParser.*;
+
+/**
+ * @author jmyers
+ *
+ * To change the template for this generated type comment go to
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+public class ASTParserSuite extends TestSetup {
+
+	// Test cases to be include in the suite
+	private static Class testsList[] = {
+		NeedsCodingTest.class,
+		BlockTest.class,
+		ASTFieldAccessTest.class,
+		ASTArraysTest.class,
+		MultiArgStaticMethodTest.class,
+		MultiArgConstructorTest.class,
+		MultiArgInstanceTest.class,
+		NumberTest.class,
+		CastTest.class,
+//		ExceptionTest.class,	// mixes parse error w/execution errors. Can't test parse errors. Need specific test for exec errors like method not found.
+		LiteralTest.class,
+		StringTest.class,
+		CharTest.class,
+		JFCTest.class,
+		BorderTest.class,
+		OverloadingTest.class,
+		SameName46376Test.class,
+		ASTOperationsTest.class,
+		ASTInnerClassAccessTest.class,
+		ASTMiscTest.class,
+		TestCompatibleMethods.class,
+		                               } ;
+	
+	public static String pkgName = "org.eclipse.jem.tests.proxy.initParser.tree" ;
+	    
+	/**
+	 * Constructor for PackageSuite.
+	 */
+	public ASTParserSuite() {
+		this("AST Parser Suite");
+	}
+
+	/**
+	 * Constructor for PackageSuite.
+	 * @param name
+	 */
+	public ASTParserSuite(String name) {
+		super(new TestSuite(name));
+		populateSuite() ;
+	}
+
+	ProxyFactoryRegistry registry;
+	
+	private void populateSuite () {
+		TestSuite suite = (TestSuite) getTest();
+		for (int i=0; i<testsList.length; i++)
+		  suite.addTestSuite(testsList[i]) ;
+		
+		try {
+			IProject project = JavaProjectUtil.createEmptyJavaProject(ResourcesPlugin.getWorkspace(), new Path(AST_PROJECT), null);
+			IJavaProject jproject = JavaCore.create(project);
+			// Add javatests.jar (i.e. this plugins jar) so that the classes within the tests jar are available
+			// to the jdt parser for referencing.
+			JavaProjectUtil.addBundleJarToPath(JavaTestsPlugin.getPlugin().getBundle(), "javatests.jar", jproject, null);
+			
+			// We're going to use the remote proxy, because it is easier to start up, but we aren't really testing
+			// the remote proxy expression evaluation. We are really testing AST->ParseTree->BeanProxy. If any expression
+			// type errors show up (i.e. the proxy expression itself is not working correctly). Then that should be fixed
+			// and a junit test in the proxy suite should be created instead.
+			registry = ProxyLaunchSupport.startImplementation(
+					project,
+					"JUnit Parse Tree Test",
+					new IConfigurationContributor[] { ProxySuite.getProxySuiteContributor()},
+					new NullProgressMonitor());
+			
+			AbstractInitParserTestCase.initSuite(suite, new ASTTreeInitStringParserTestHelper(project, registry));
+		} catch (CoreException e) {
+			Assert.assertNotNull(e);
+		}
+	}
+    
+	public static Test suite() {
+		return new ASTParserSuite("Test for: "+pkgName);
+	}
+
+	private static final String AST_PROJECT = "/AST tests/";
+
+	/* (non-Javadoc)
+	 * @see junit.extensions.TestSetup#tearDown()
+	 */
+	protected void tearDown() throws Exception {
+		if (registry != null) {
+			registry.terminateRegistry();
+			Thread.sleep(5000);	// Give it five seconds to REALLY go away. There is a small window between 
+			// terminate request and true shutdown of the remote vm. We return immediately and let a
+			// job wait for the actual true termination.
+		}
+		
+		JavaProjectUtil.deleteProject(JavaProjectUtil.getProject(AST_PROJECT));
+	}
+
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/tree/ASTTreeInitStringParserTestHelper.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/tree/ASTTreeInitStringParserTestHelper.java
new file mode 100644
index 0000000..1b29b21
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/tree/ASTTreeInitStringParserTestHelper.java
@@ -0,0 +1,238 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $RCSfile: ASTTreeInitStringParserTestHelper.java,v $
+ *  $Revision: 1.12 $  $Date: 2005/08/24 20:58:54 $ 
+ */
+package org.eclipse.jem.tests.proxy.initParser.tree;
+
+import java.text.MessageFormat;
+
+import junit.framework.Assert;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jdt.core.*;
+import org.eclipse.jdt.core.compiler.IProblem;
+import org.eclipse.jdt.core.dom.*;
+
+import org.eclipse.jem.internal.instantiation.PTExpression;
+import org.eclipse.jem.internal.instantiation.base.*;
+import org.eclipse.jem.internal.proxy.core.*;
+import org.eclipse.jem.tests.proxy.initParser.AbstractInitStringParserTestHelper;
+import org.eclipse.jem.workbench.utility.*;
+ 
+/**
+ * Init String parser helper for working with AST trees.
+ *  
+ * @since 1.0.0
+ */
+public class ASTTreeInitStringParserTestHelper extends AbstractInitStringParserTestHelper {
+
+	private static final String TEMPLATE_CLASS = "public class TEMPLATE '{'\n  public void test() '{'\n    String.valueOf({0});\t// a line comment\n  }\n}";
+	private static final String TEMPLATE_CLASS_IMPORTS = "{0}\npublic class TEMPLATE '{'\n  public void test() '{'\n    String.valueOf({1});\n  }\n}";
+	
+	private IJavaProject project;
+	private ParseTreeCreationFromAST parser = new ParseTreeCreationFromAST(new ASTBoundResolver());
+	private ProxyFactoryRegistry registry;
+	
+	public ASTTreeInitStringParserTestHelper() {
+	}
+	
+	public ASTTreeInitStringParserTestHelper(IProject project, ProxyFactoryRegistry registry) {
+		this.project = JavaCore.create(project);
+		this.registry = registry;
+	}
+	
+	public ASTTreeInitStringParserTestHelper(IProject project) {
+		this(project, null);
+	}	
+	
+	public ProxyFactoryRegistry getRegistry() {
+		return registry;
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jem.tests.proxy.initParser.AbstractInitStringParserTestHelper#testInitString(java.lang.String, java.lang.Object, boolean, boolean)
+	 */
+	public void testInitString(String aString, Object expectedResult, boolean throwsException, boolean equalsOnly) throws Throwable {
+		String testClass = MessageFormat.format(TEMPLATE_CLASS, new Object[] {aString});
+		ASTParser parser = ASTParser.newParser(AST.JLS3);
+		parser.setSource(testClass.toCharArray());
+		parser.setUnitName("TEMPLATE.java");
+		if (project != null) {
+			parser.setProject(project);
+			parser.setResolveBindings(true);
+		}
+		CompilationUnit cu  = (CompilationUnit) parser.createAST(new NullProgressMonitor());
+
+		// This is the only method that is called from both init string and parse allocation. So we can be assume that
+		// it is a straight init string. In that case we can go ahead and do regular proxy init string parsing to
+		// get a proxy to pass into the parse testing.
+		IBeanProxy expectedProxy = null;
+		if (expectedResult instanceof IBeanProxy)
+			expectedProxy = (IBeanProxy) expectedResult;
+		else if (expectedResult != null && !throwsException && registry != null) {
+			expectedProxy = registry.getBeanProxyFactory().createBeanProxyFrom(aString);
+		}
+		testInitString(aString, cu, expectedProxy, throwsException, equalsOnly);
+	}
+
+	public void testInitString(String aString, String[] imports, IBeanProxy expectedResult) throws Throwable {
+		testInitString(aString, imports,expectedResult, false, true);
+	}
+	
+	public void testInitString(String aString, String[] imports, IBeanProxy expectedResult, boolean throwsException, boolean equalsOnly) throws Throwable {
+		StringBuffer importLines = new StringBuffer(100);
+		for (int i = 0; i < imports.length; i++) {
+			importLines.append("import ");
+			importLines.append(imports[i]);
+			importLines.append(";\n");
+		}
+		String testClass = MessageFormat.format(TEMPLATE_CLASS_IMPORTS, new Object[] {importLines, aString});
+		ASTParser parser = ASTParser.newParser(AST.JLS3);
+		parser.setSource(testClass.toCharArray());
+		parser.setUnitName("TEMPLATE.java");
+		if (project != null) {
+			parser.setProject(project);
+			parser.setResolveBindings(true);
+		}
+		CompilationUnit cu  = (CompilationUnit) parser.createAST(null);
+		testInitString(aString, cu, expectedResult, throwsException, equalsOnly);
+	}
+	
+	protected void testInitString(
+		String aString,
+		CompilationUnit cu,
+		IBeanProxy expectedResult,
+		boolean throwsException,
+		boolean equalsOnly)
+		throws Throwable {
+		IProblem[] problems = cu.getProblems();
+		if (problems.length > 0) {
+			boolean errors = false;
+			StringBuffer buf = new StringBuffer(100);
+			for (int i = 0; i < problems.length; i++) {
+				errors = errors | problems[i].isError();
+				buf.append(" " + problems[i].getMessage());
+			}
+			// If only warnings, try going on. Only errors should cause a failure.
+			if (errors)
+				if (!throwsException)
+					Assert.fail("Problems with \"" + aString + "\": " + buf);
+				else
+					return; // Treat this as an exception.
+			else {
+				// Else just log the warnings.
+				System.err.println("Warnings ocurred for \"" + aString + "\":" + buf);
+			}
+		}
+
+		TypeDeclaration td = (TypeDeclaration) cu.types().get(0);
+		ExpressionStatement es = (ExpressionStatement) td.getMethods()[0].getBody().statements().get(0);
+		MethodInvocation mi = (MethodInvocation) es.getExpression();
+		org.eclipse.jdt.core.dom.Expression exp = (org.eclipse.jdt.core.dom.Expression) mi.arguments().get(0);
+		PTExpression parseExp = parser.createExpression(exp);
+
+		if (registry != null) {
+			ParseTreeAllocationInstantiationVisitor v = new ParseTreeAllocationInstantiationVisitor();
+			try {
+				IBeanProxy bean = v.getBeanProxy(parseExp, registry);
+				if (throwsException)
+					Assert.fail("Should of thrown exception. Instead result was \"" + (bean != null ? bean.toBeanString() : null) + "\"");
+				if (bean == expectedResult)
+					return;
+				if ((bean == null && expectedResult != null) || (expectedResult == null && bean != null))
+					Assert.fail(
+						"ExpectedResult="
+							+ (expectedResult != null ? expectedResult.toBeanString() : null)
+							+ " result="
+							+ (bean != null ? bean.toBeanString() : null));
+				if (bean.equals(expectedResult))
+					return;
+				// It may be that the equals expression is bad. If so use the toString() to do
+				// a partial comparison
+				if (bean.getTypeProxy() == expectedResult.getTypeProxy()) {
+					if (bean.toBeanString().equals(expectedResult.toBeanString())) {
+						return;
+					} else {
+						// The toStrings do not match perfectly but the classes do.
+						// Try and see how close the two strings are
+						if (expectedResult.getTypeProxy().isArray() && bean.getTypeProxy().isArray()) {
+							IBeanTypeProxy expectedResultClass = ((IArrayBeanTypeProxy) expectedResult.getTypeProxy()).getComponentType();
+							IBeanTypeProxy resultClass = ((IArrayBeanTypeProxy) bean.getTypeProxy()).getComponentType();
+							int resultLength = ((IArrayBeanProxy) bean).getLength();
+							int expectedLength = ((IArrayBeanProxy) expectedResult).getLength();
+							if (expectedLength == resultLength) {
+								if (resultClass == expectedResultClass) {
+									// TODO Should actually step in and check each element too.
+									return;
+								} else {
+									Assert.fail(
+										aString
+											+ " ExpectedResult="
+											+ expectedResult.toBeanString()
+											+ " ActualResult="
+											+ bean.toBeanString()
+											+ " ExpectedClass="
+											+ expectedResult.getTypeProxy().getFormalTypeName()
+											+ " ActualClass="
+											+ bean.getTypeProxy().getFormalTypeName());
+								}
+							} else {
+								Assert.fail(
+									aString
+										+ " ExpectedResult="
+										+ expectedResult.toBeanString()
+										+ " ActualResult="
+										+ bean.toBeanString()
+										+ " ExpectedClass="
+										+ expectedResult.getTypeProxy().getFormalTypeName()
+										+ " ActualClass="
+										+ bean.getTypeProxy().getFormalTypeName());
+							}
+						} else {
+							if (equalsOnly)
+								Assert.fail(
+									aString
+										+ " ExpectedResult="
+										+ expectedResult.toBeanString()
+										+ " ActualResult="
+										+ bean.toBeanString()
+										+ " ExpectedClass="
+										+ expectedResult.getTypeProxy().getFormalTypeName()
+										+ " ActualClass="
+										+ bean.getTypeProxy().getFormalTypeName());
+							return;
+						}
+					}
+				} else {
+					Assert.fail(
+						aString
+							+ " ExpectedResult="
+							+ expectedResult.toBeanString()
+							+ " ActualResult="
+							+ bean.toBeanString()
+							+ " ExpectedClass="
+							+ expectedResult.getTypeProxy().getFormalTypeName()
+							+ " ActualClass="
+							+ bean.getTypeProxy().getFormalTypeName());
+				}
+			} catch (Exception e) {
+				if (throwsException)
+					return; // This is ok, it should of thrown exception.
+				else
+					throw e;
+			}
+		}
+	}
+
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/tree/InnerClassTestData.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/tree/InnerClassTestData.java
new file mode 100644
index 0000000..3013f2a
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/tree/InnerClassTestData.java
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $RCSfile: InnerClassTestData.java,v $
+ *  $Revision: 1.4 $  $Date: 2005/08/24 20:58:54 $ 
+ */
+package org.eclipse.jem.tests.proxy.initParser.tree;
+
+import java.awt.Color;
+ 
+/**
+ * This is for testing inner class access.
+ * @since 1.0.0
+ */
+public class InnerClassTestData {
+
+	/**
+	 * 
+	 * @since 1.0.0
+	 */
+	public static class InnerInnerClass extends Object {
+		public final static Color GREEN = Color.green;
+
+		/**
+		 * 
+		 * @since 1.0.0
+		 */
+		public static class InnerInnerInnerClass extends Object {
+			public final static Color RED = Color.red; 
+
+			/**
+			 * 
+			 * @since 1.0.0
+			 */
+			public class InnerInnerInnerInnerClass {
+
+				/* (non-Javadoc)
+				 * @see java.lang.Object#equals(java.lang.Object)
+				 */
+				public boolean equals(Object obj) {
+					return super.equals(obj) || obj instanceof InnerInnerInnerInnerClass;
+				}
+			}
+			
+			/* (non-Javadoc)
+			 * @see java.lang.Object#equals(java.lang.Object)
+			 */
+			public boolean equals(Object obj) {
+				return super.equals(obj) || obj instanceof InnerInnerInnerClass;
+			}
+		}
+		
+		/* (non-Javadoc)
+		 * @see java.lang.Object#equals(java.lang.Object)
+		 */
+		public boolean equals(Object obj) {
+			return super.equals(obj) || obj instanceof InnerInnerClass;
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see java.lang.Object#equals(java.lang.Object)
+	 */
+	public boolean equals(Object obj) {
+		return super.equals(obj) || obj instanceof InnerClassTestData;
+	}
+	
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/tree/TestCompatibleMethods.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/tree/TestCompatibleMethods.java
new file mode 100644
index 0000000..ed2e5c8
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/tree/TestCompatibleMethods.java
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * Copyright (c) 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $RCSfile: TestCompatibleMethods.java,v $
+ *  $Revision: 1.1 $  $Date: 2006/03/19 18:27:12 $ 
+ */
+package org.eclipse.jem.tests.proxy.initParser.tree;
+
+import org.eclipse.jem.internal.proxy.core.*;
+import org.eclipse.jem.internal.proxy.initParser.tree.ForExpression;
+import org.eclipse.jem.internal.proxy.initParser.tree.NoExpressionValueException;
+import org.eclipse.jem.tests.proxy.initParser.AbstractInitParserTestCase;
+ 
+
+/**
+ * 
+ * @since 1.2.0
+ */
+public class TestCompatibleMethods extends AbstractInitParserTestCase {
+
+	/**
+	 * @param name
+	 * 
+	 * @since 1.2.0
+	 */
+	public TestCompatibleMethods(String name) {
+		super(name);
+	}
+
+	protected ASTTreeInitStringParserTestHelper getTreeParser() {
+		return (ASTTreeInitStringParserTestHelper) testHelper;
+	}
+	
+	protected IBeanProxy executeQQQ(IBeanProxy a1, IBeanProxy a2) throws ThrowableProxy, IllegalStateException, NoExpressionValueException {
+		ProxyFactoryRegistry registry = getTreeParser().getRegistry();
+		IExpression exp = registry.getBeanProxyFactory().createExpression();
+		exp.createMethodInvocation(ForExpression.ROOTEXPRESSION, "qqq", true, 2);
+		exp.createClassInstanceCreation(ForExpression.METHOD_RECEIVER, "org.eclipse.jem.tests.proxy.initParser.tree.TestCompatibleMethodsData1", 0);
+		exp.createProxyExpression(ForExpression.METHOD_ARGUMENT, a1);
+		exp.createProxyExpression(ForExpression.METHOD_ARGUMENT, a2);
+		return exp.getExpressionValue();
+	}
+	
+	public void testAmbiguous() throws Throwable {
+		ProxyFactoryRegistry registry = getTreeParser().getRegistry();
+		try {
+			executeQQQ(registry.getBeanProxyFactory().createBeanProxyWith(new Integer(1)), registry.getBeanProxyFactory().createBeanProxyWith(
+					new Integer(1)));
+		} catch (ThrowableProxy e) {
+			if (e.getTypeProxy().getTypeName().equals("org.eclipse.jem.internal.proxy.common.AmbiguousMethodException"))
+				return;	// This is good.
+			throw e;
+		}		
+		fail("Should of thrown ambiquous.");
+	}
+	
+	public void testExactMatch() throws Throwable {
+		ProxyFactoryRegistry registry = getTreeParser().getRegistry();
+		IIntegerBeanProxy result = (IIntegerBeanProxy) executeQQQ(registry.getBeanProxyFactory().createBeanProxyWith(new Integer(1)), registry.getBeanProxyFactory().createBeanProxyFrom("new Object()"));
+		assertEquals(2, result.intValue());
+		
+		result = (IIntegerBeanProxy) executeQQQ(registry.getBeanProxyFactory().createBeanProxyFrom("new Object()"), registry.getBeanProxyFactory().createBeanProxyFrom("new Object()"));
+		assertEquals(0, result.intValue());
+	}
+	
+	public void testCompatibleMatch() throws Throwable {
+		ProxyFactoryRegistry registry = getTreeParser().getRegistry();
+		IIntegerBeanProxy result = (IIntegerBeanProxy) executeQQQ(registry.getBeanProxyFactory().createBeanProxyWith(new Float(1)), registry.getBeanProxyFactory().createBeanProxyWith(new Integer(1)));
+		assertEquals(1, result.intValue());
+
+		result = (IIntegerBeanProxy) executeQQQ(registry.getBeanProxyFactory().createBeanProxyWith(new Float(1)), registry.getBeanProxyFactory().createBeanProxyFrom("new Object()"));
+		assertEquals(0, result.intValue());
+	}
+	
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/tree/TestCompatibleMethodsData.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/tree/TestCompatibleMethodsData.java
new file mode 100644
index 0000000..9ca52fe
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/tree/TestCompatibleMethodsData.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $RCSfile: TestCompatibleMethodsData.java,v $
+ *  $Revision: 1.1 $  $Date: 2006/03/19 18:27:12 $ 
+ */
+package org.eclipse.jem.tests.proxy.initParser.tree;
+ 
+
+/**
+ * Used to test compatible methods searching.
+ * @since 1.2.0
+ */
+public class TestCompatibleMethodsData {
+
+	protected void t() {
+		qqq(new Integer(1), new Object());
+	}
+	
+	protected int qqq(Object o, Object o1) {
+		return 0;
+	}
+	
+	private int qqq(Integer i, Object o) {
+		return -1;
+	}
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/tree/TestCompatibleMethodsData1.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/tree/TestCompatibleMethodsData1.java
new file mode 100644
index 0000000..a08e489
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/tree/TestCompatibleMethodsData1.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $RCSfile: TestCompatibleMethodsData1.java,v $
+ *  $Revision: 1.1 $  $Date: 2006/03/19 18:27:12 $ 
+ */
+package org.eclipse.jem.tests.proxy.initParser.tree;
+
+ 
+
+/**
+ * Used for testing most compatible protected methods
+ * @since 1.2.0
+ */
+public class TestCompatibleMethodsData1 extends TestCompatibleMethodsData {
+
+	protected int qqq(Number n, Integer i1) {
+		return 1;
+	}
+	
+	protected int qqq(Integer i, Object o1) {
+		return 2;
+	}
+
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/remote/RemoteProxySuite.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/remote/RemoteProxySuite.java
new file mode 100644
index 0000000..591edfa
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/remote/RemoteProxySuite.java
@@ -0,0 +1,126 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jem.tests.proxy.remote;
+/*
+ *  $RCSfile: RemoteProxySuite.java,v $
+ *  $Revision: 1.11 $  $Date: 2006/09/14 18:31:06 $ 
+ */
+import java.net.URL;
+
+import junit.extensions.TestSetup;
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.*;
+
+import org.eclipse.jem.internal.proxy.core.*;
+import org.eclipse.jem.tests.JavaProjectUtil;
+import org.eclipse.jem.tests.JavaTestsPlugin;
+import org.eclipse.jem.tests.proxy.AbstractTestProxy;
+import org.eclipse.jem.tests.proxy.ProxySuite;
+
+/**
+ * @author richkulp
+ *
+ * This is the true test suite for Remote Proxy Testing. The RemoteProxyTest will use this.
+ */
+public class RemoteProxySuite extends TestSetup {
+
+	// Test cases to be include in the suite
+	private static final Class testsList[] = { ProxySuite.class, TestProjectAccess.class, };
+
+	private IProject project; // The project to start the proxy factory on.		                               
+	private AbstractTestProxy.RegistryHandler registryHandler = new AbstractTestProxy.RegistryHandler() {
+		private ProxyFactoryRegistry registry;
+
+		public boolean isValid() {
+			return project != null;
+		}
+		public ProxyFactoryRegistry getRegistry() throws CoreException {
+			if (registry == null) {
+				registry =
+					ProxyLaunchSupport.startImplementation(
+						project,
+						"JUnit Remote Proxy Test",
+						new IConfigurationContributor[] { ProxySuite.getProxySuiteContributor()},
+						new NullProgressMonitor());
+			}
+			return registry;
+		}
+
+		public void destroyRegistry() {
+			if (registry != null) {
+				registry.terminateRegistry();
+				registry = null;
+			}
+		}
+	};
+
+	public RemoteProxySuite() {
+		this("Test Remote Proxy Suite");
+	}
+
+	public RemoteProxySuite(String name) {
+		super(new TestSuite(name) {
+			{
+				for (int i = 0; i < testsList.length; i++) {
+					// We may get some tests and suites.
+					if (TestSuite.class.isAssignableFrom(testsList[i]) || TestSetup.class.isAssignableFrom(testsList[i])) {
+						try {
+							Test ts = (Test) testsList[i].newInstance();
+							addTest(ts);
+						} catch (Exception e) {
+							e.printStackTrace();
+						}
+					} else
+						addTestSuite(testsList[i]);
+				}
+			}
+		});
+
+		AbstractTestProxy.initRegistryHandler((TestSuite) this.getTest(), registryHandler);
+	}
+
+	public static Test suite() {
+		return new RemoteProxySuite();
+	}
+
+	private final static String TEST_PROJECT_NAME = "Test Remote Proxy";
+	private boolean oldAutoBuildingState; // autoBuilding state before we started.
+	protected void setUp() throws Exception {
+		System.out.println("-- Initializing the Proxy Remote test data --"); //$NON-NLS-1$
+		oldAutoBuildingState = JavaProjectUtil.setAutoBuild(true);
+		String zipPath =
+			FileLocator.toFileURL(new URL(JavaTestsPlugin.getPlugin().getBundle().getEntry("/"), "testdata/testremoteproject.zip"))
+				.getFile();
+		IProject[] projects = JavaProjectUtil.importProjects(new String[] { TEST_PROJECT_NAME }, new String[] { zipPath });
+		assertNotNull(projects[0]);
+		JavaProjectUtil.waitForAutoBuild();		
+		project = projects[0];
+		System.out.println("-- Data initialized --"); //$NON-NLS-1$
+
+	}
+
+	protected void tearDown() throws Exception {
+		registryHandler.destroyRegistry();
+		if (project != null) {
+			try {
+				Thread.sleep(500);	// Wait because some times the other vm isn't quite down so a file stays locked.
+			} catch (InterruptedException e) {
+			}
+			project.delete(true, false, null); // Get rid of the project and the files themselves.
+			project = null;
+		}
+		JavaProjectUtil.setAutoBuild(oldAutoBuildingState);
+	}
+
+}
diff --git a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/remote/TestProjectAccess.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/remote/TestProjectAccess.java
new file mode 100644
index 0000000..013c1fa
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/remote/TestProjectAccess.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jem.tests.proxy.remote;
+/*
+ *  $RCSfile: TestProjectAccess.java,v $
+ *  $Revision: 1.4 $  $Date: 2005/08/24 20:58:55 $ 
+ */
+import org.eclipse.jem.internal.proxy.core.*;
+import org.eclipse.jem.internal.proxy.core.IBeanProxy;
+import org.eclipse.jem.internal.proxy.core.IBeanTypeProxy;
+import org.eclipse.jem.tests.proxy.AbstractTestProxy;
+
+/**
+ * @author richkulp
+ *
+ * Test Project Access.
+ */
+public class TestProjectAccess extends AbstractTestProxy {
+
+	public TestProjectAccess() {
+		super();
+	}
+
+	public TestProjectAccess(String name) {
+		super(name);
+	}
+	
+	public void testClassFromProject() {
+		IBeanTypeProxy testClassType = proxyTypeFactory.getBeanTypeProxy("org.eclipse.jem.testing.proxy.remote.TestClass"); //$NON-NLS-1$
+		assertNotNull(testClassType);		
+	}
+	
+	public void testProjectClassInstantiation() throws ThrowableProxy {
+		IBeanTypeProxy testClassType = proxyTypeFactory.getBeanTypeProxy("org.eclipse.jem.testing.proxy.remote.TestClass"); //$NON-NLS-1$
+		IBeanProxy testClass = testClassType.newInstance();
+		assertNotNull(testClass);		
+	}
+
+	public void testProjectClassMethod() throws ThrowableProxy {
+		IBeanTypeProxy testClassType = proxyTypeFactory.getBeanTypeProxy("org.eclipse.jem.testing.proxy.remote.TestClass"); //$NON-NLS-1$
+		IMethodProxy testMethod = testClassType.getMethodProxy("getTestString"); //$NON-NLS-1$
+		assertNotNull(testMethod);		
+	}
+	
+	public void testProjectClassMethodInvoke() throws ThrowableProxy {
+		IBeanTypeProxy testClassType = proxyTypeFactory.getBeanTypeProxy("org.eclipse.jem.testing.proxy.remote.TestClass"); //$NON-NLS-1$
+		IMethodProxy testMethod = testClassType.getMethodProxy("getTestString"); //$NON-NLS-1$
+		IBeanProxy testClass = testClassType.newInstance();
+		IStringBeanProxy aString = (IStringBeanProxy) testMethod.invoke(testClass);
+		assertNotNull(aString);
+		assertEquals("TESTSTRING", aString.stringValue());		
+	}	
+
+}
diff --git a/tests/org.eclipse.jem.tests/plugin.properties b/tests/org.eclipse.jem.tests/plugin.properties
new file mode 100644
index 0000000..70ee8b9
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/plugin.properties
@@ -0,0 +1,18 @@
+###############################################################################
+# Copyright (c) 2003, 2005 IBM 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:
+#     IBM Corporation - initial API and implementation
+###############################################################################
+#
+# $Source: /cvsroot/webtools/jeetools.move/webtools.javaee.tests.git/tests/org.eclipse.jem.tests/plugin.properties,v $
+# $Revision: 1.3 $  $Date: 2005/08/24 20:58:55 $
+#
+
+
+pluginName=Java EMF Model JUnit Test Cases
+providerName = Eclipse.org
diff --git a/tests/org.eclipse.jem.tests/plugin.xml b/tests/org.eclipse.jem.tests/plugin.xml
new file mode 100644
index 0000000..b5ee425
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/plugin.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+
+     <extension
+         point="org.eclipse.jem.beaninfo.registrations">
+      <registration
+            container="org.eclipse.jdt.launching.JRE_CONTAINER">
+         <override
+               package="org.eclipse.jem.tests.beaninfo"
+               path="testdata/overrides/beaninfo">
+         </override>
+      </registration>
+	</extension>
+<!--
+     <extension
+           point="org.eclipse.jem.util.uiTester">
+        <uiTester className="org.eclipse.jem.tests.UITester"/>
+     </extension>
+-->
+</plugin>
diff --git a/tests/org.eclipse.jem.tests/pom.xml b/tests/org.eclipse.jem.tests/pom.xml
new file mode 100644
index 0000000..eec778a
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/pom.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Copyright (c) 2012, 2013 Eclipse Foundation and others.
+  All rights reserved. This program and the accompanying materials
+  are made available under the terms of the Eclipse Distribution License v1.0
+  which accompanies this distribution, and is available at
+  http://www.eclipse.org/org/documents/edl-v10.php
+ 
+  Contributors:
+    Thanh Ha (Eclipse Foundation) - initial implementation
+-->
+
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.eclipse.webtools.javaee</groupId>
+    <artifactId>javaee.tests</artifactId>
+    <version>3.6.0-SNAPSHOT</version>
+  </parent>
+
+  <groupId>org.eclipse.webtools.javaee</groupId>
+  <artifactId>org.eclipse.jem.tests</artifactId>
+  <version>1.2.300-SNAPSHOT</version>
+  <packaging>eclipse-plugin</packaging>
+</project>
diff --git a/tests/org.eclipse.jem.tests/proxy.jars b/tests/org.eclipse.jem.tests/proxy.jars
new file mode 100644
index 0000000..7a7029a
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/proxy.jars
@@ -0,0 +1,2 @@
+vm/tests.jar=/org.eclipse.jem.tests/bin/
+javatests.jar=/org.eclipse.jem.tests/bin/
\ No newline at end of file
diff --git a/tests/org.eclipse.jem.tests/test.xml.off b/tests/org.eclipse.jem.tests/test.xml.off
new file mode 100644
index 0000000..a37f160
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/test.xml.off
@@ -0,0 +1,51 @@
+<?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}\..\.."/>
+
+  <!-- sets the properties plugin-name, and library-file -->
+  <property name="plugin-name" value="org.eclipse.jem.tests"/>
+  <property name="library-file" value="${eclipse-home}/plugins/org.eclipse.test/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*.xml"/>
+    </delete>
+  </target>
+
+  <!-- This target defines the tests that need to be run. -->
+  <target name="suite">
+    <property name="jem-folder" value="${eclipse-home}/jem_folder"/>
+    <delete dir="${jem-folder}" quiet="true"/>
+  	<!-- Note: Doesn't really need to be UI test but launching remote VM's with
+  	     DebugUI plugin present but not launching UI causes severe errrors
+  	     because it tries to start DebugUI in headless env. Big Pain! -->
+    <ant target="ui-test" antfile="${library-file}" dir="${eclipse-home}">
+      <property name="data-dir" value="${jem-folder}"/>
+      <property name="plugin-name" value="${plugin-name}"/>
+      <property name="classname" value="org.eclipse.jem.tests.AllSuites"/>
+    </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*.xml"/>
+      <property name="output-file" value="${plugin-name}.xml"/>
+    </ant>
+  </target>
+
+</project>
diff --git a/tests/org.eclipse.jem.tests/testdata/JDK5BinTests.jar b/tests/org.eclipse.jem.tests/testdata/JDK5BinTests.jar
new file mode 100644
index 0000000..19862e5
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/testdata/JDK5BinTests.jar
Binary files differ
diff --git a/tests/org.eclipse.jem.tests/testdata/JDK5Tests.zip b/tests/org.eclipse.jem.tests/testdata/JDK5Tests.zip
new file mode 100644
index 0000000..5488bd0
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/testdata/JDK5Tests.zip
Binary files differ
diff --git a/tests/org.eclipse.jem.tests/testdata/extjarops.txt b/tests/org.eclipse.jem.tests/testdata/extjarops.txt
new file mode 100644
index 0000000..a5cfb7d
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/testdata/extjarops.txt
@@ -0,0 +1,4 @@
+getActionCommand
+getLabel
+setActionCommand
+setLabel
diff --git a/tests/org.eclipse.jem.tests/testdata/extjarprops.txt b/tests/org.eclipse.jem.tests/testdata/extjarprops.txt
new file mode 100644
index 0000000..737ed62
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/testdata/extjarprops.txt
@@ -0,0 +1,28 @@
+alignmentX
+alignmentY
+background
+bounds
+colorModel
+cursor
+enabled
+focusTraversable
+componentOrientation
+font
+foreground
+graphics
+locale
+location
+locationOnScreen
+maximumSize
+minimumSize
+name
+parent
+preferredSize
+showing
+size
+toolkit
+treeLock
+valid
+visible
+actionCommand
+label
diff --git a/tests/org.eclipse.jem.tests/testdata/jlabelops.txt b/tests/org.eclipse.jem.tests/testdata/jlabelops.txt
new file mode 100644
index 0000000..0dad8d6
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/testdata/jlabelops.txt
@@ -0,0 +1,173 @@
+hashCode
+notify
+notifyAll
+wait
+wait
+wait
+getClass
+equals
+toString
+add
+addNotify
+checkImage
+contains
+createImage
+createImage
+dispatchEvent
+doLayout
+getBackground
+getBounds
+getColorModel
+getCursor
+getFont
+getFontMetrics
+getForeground
+getGraphics
+getLocale
+getLocation
+getLocationOnScreen
+getMaximumSize
+getMinimumSize
+getName
+getParent
+getPreferredSize
+getSize
+getToolkit
+getTreeLock
+invalidate
+isEnabled
+isShowing
+isValid
+isVisible
+list
+list
+paintAll
+prepareImage
+printAll
+remove
+removeNotify
+repaint
+requestFocus
+setBackground
+setBounds
+setCursor
+setEnabled
+setForeground
+setLocale
+setLocation
+setLocation
+setName
+setSize
+setSize
+transferFocus
+validate
+add
+add
+add
+add
+add
+getAlignmentX
+getAlignmentY
+getComponent
+getComponentAt
+getComponentAt
+getComponentCount
+getComponents
+getInsets
+getLayout
+isAncestorOf
+list
+list
+print
+remove
+remove
+removeAll
+setLayout
+computeVisibleRect
+contains
+createToolTip
+firePropertyChange
+firePropertyChange
+firePropertyChange
+firePropertyChange
+firePropertyChange
+firePropertyChange
+firePropertyChange
+getAccessibleContext
+getActionForKeyStroke
+getAutoscrolls
+getBorder
+getBounds
+getClientProperty
+getConditionForKeyStroke
+getHeight
+getLocation
+getNextFocusableComponent
+getRegisteredKeyStrokes
+getRootPane
+getSize
+getToolTipText
+getTopLevelAncestor
+getVisibleRect
+getWidth
+getX
+getY
+grabFocus
+hasFocus
+isDoubleBuffered
+isFocusCycleRoot
+isFocusTraversable
+isManagingFocus
+isOpaque
+isOptimizedDrawingEnabled
+isRequestFocusEnabled
+isValidateRoot
+paint
+paintImmediately
+putClientProperty
+repaint
+requestDefaultFocus
+resetKeyboardActions
+revalidate
+scrollRectToVisible
+setAlignmentX
+setAlignmentY
+setAutoscrolls
+setBorder
+setBounds
+setDebugGraphicsOptions
+setDoubleBuffered
+setMaximumSize
+setMinimumSize
+setNextFocusableComponent
+setOpaque
+setPreferredSize
+setRequestFocusEnabled
+setToolTipText
+setVisible
+unregisterKeyboardAction
+update
+getDisabledIcon
+getDisplayedMnemonic
+getHorizontalAlignment
+getHorizontalTextPosition
+getIcon
+getIconTextGap
+getLabelFor
+getText
+getUI
+getVerticalAlignment
+getVerticalTextPosition
+setDisabledIcon
+setDisplayedMnemonic
+setFont
+setHorizontalAlignment
+setHorizontalTextPosition
+setIcon
+setIconTextGap
+setLabelFor
+setText
+setUI
+setVerticalAlignment
+setVerticalTextPosition
+updateUI
diff --git a/tests/org.eclipse.jem.tests/testdata/jlabelprops.txt b/tests/org.eclipse.jem.tests/testdata/jlabelprops.txt
new file mode 100644
index 0000000..24bc707
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/testdata/jlabelprops.txt
@@ -0,0 +1,61 @@
+background
+bounds
+colorModel
+cursor
+enabled
+focusTraversable
+foreground
+locale
+location
+locationOnScreen
+componentOrientation
+name
+parent
+showing
+size
+toolkit
+treeLock
+valid
+visible
+componentCount
+components
+layout
+alignmentX
+alignmentY
+autoscrolls
+border
+debugGraphicsOptions
+doubleBuffered
+focusCycleRoot
+graphics
+height
+insets
+managingFocus
+maximumSize
+minimumSize
+nextFocusableComponent
+opaque
+optimizedDrawingEnabled
+paintingTile
+preferredSize
+registeredKeyStrokes
+requestFocusEnabled
+rootPane
+toolTipText
+topLevelAncestor
+validateRoot
+visibleRect
+width
+x
+y
+disabledIcon
+displayedMnemonic
+font
+horizontalAlignment
+horizontalTextPosition
+icon
+iconTextGap
+labelFor
+text
+verticalAlignment
+verticalTextPosition
diff --git a/tests/org.eclipse.jem.tests/testdata/overrides/beaninfo/TestOverrides.override b/tests/org.eclipse.jem.tests/testdata/overrides/beaninfo/TestOverrides.override
new file mode 100644
index 0000000..c09ebe5
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/testdata/overrides/beaninfo/TestOverrides.override
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<change:ChangeDescription xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:org.eclipse.jem.java="java.xmi" xmlns:org.eclipse.ve.internal.cde.decorators="http:///org/eclipse/ve/internal/cde/decorators.ecore" xmlns:org.eclipse.ve.internal.cde.utility="http:///org/eclipse/ve/internal/cde/utility.ecore" xmlns:org.eclipse.ve.internal.jcm="http:///org/eclipse/ve/internal/jcm.ecore" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:change="http://www.eclipse.org/emf/2003/Change" xmi:version="2.0">
+   <objectChanges key="X:ROOT#//@root">
+      <value featureName="eStructuralFeatures">
+         <listChanges referenceValues="_eStructuralFeatures _eStructuralFeatures1"/>
+      </value>
+   </objectChanges>
+   <objectsToAttach xmi:id="_eStructuralFeatures" xsi:type="ecore:EReference" name="xyz">
+      <eAnnotations source="Override Annotation"/>
+    </objectsToAttach>
+   <objectsToAttach xmi:id="_eStructuralFeatures1" xsi:type="ecore:EReference" name="test79083"/>    
+</change:ChangeDescription>
\ No newline at end of file
diff --git a/tests/org.eclipse.jem.tests/testdata/testbasic.zip b/tests/org.eclipse.jem.tests/testdata/testbasic.zip
new file mode 100644
index 0000000..e7e7602
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/testdata/testbasic.zip
Binary files differ
diff --git a/tests/org.eclipse.jem.tests/testdata/testbeaninfo.zip b/tests/org.eclipse.jem.tests/testdata/testbeaninfo.zip
new file mode 100644
index 0000000..bf70abf
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/testdata/testbeaninfo.zip
Binary files differ
diff --git a/tests/org.eclipse.jem.tests/testdata/testbeaninfobeaninfos.zip b/tests/org.eclipse.jem.tests/testdata/testbeaninfobeaninfos.zip
new file mode 100644
index 0000000..aa69c1a
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/testdata/testbeaninfobeaninfos.zip
Binary files differ
diff --git a/tests/org.eclipse.jem.tests/testdata/testbeaninfopreq.zip b/tests/org.eclipse.jem.tests/testdata/testbeaninfopreq.zip
new file mode 100644
index 0000000..913e8af
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/testdata/testbeaninfopreq.zip
Binary files differ
diff --git a/tests/org.eclipse.jem.tests/testdata/testbuttonbeaninfoui1projectjar.zip b/tests/org.eclipse.jem.tests/testdata/testbuttonbeaninfoui1projectjar.zip
new file mode 100644
index 0000000..ac2b587
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/testdata/testbuttonbeaninfoui1projectjar.zip
Binary files differ
diff --git a/tests/org.eclipse.jem.tests/testdata/testremoteproject.zip b/tests/org.eclipse.jem.tests/testdata/testremoteproject.zip
new file mode 100644
index 0000000..4a23022
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/testdata/testremoteproject.zip
Binary files differ
diff --git a/tests/org.eclipse.jem.tests/testdata/unzip.xml b/tests/org.eclipse.jem.tests/testdata/unzip.xml
new file mode 100644
index 0000000..0097a75
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/testdata/unzip.xml
@@ -0,0 +1,5 @@
+<project name="zip" default="zip" basedir=".">
+  <target name="zip">
+    <unzip src="${zipfrom}" dest="${zipto}" />  
+  </target>
+</project>
\ No newline at end of file
diff --git a/tests/org.eclipse.jem.tests/vm_tests/org/eclipse/jem/tests/proxy/vm/TestCallback.java b/tests/org.eclipse.jem.tests/vm_tests/org/eclipse/jem/tests/proxy/vm/TestCallback.java
new file mode 100644
index 0000000..0f218db
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/vm_tests/org/eclipse/jem/tests/proxy/vm/TestCallback.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jem.tests.proxy.vm;
+/*
+ *  $RCSfile: TestCallback.java,v $
+ *  $Revision: 1.6 $  $Date: 2005/08/24 20:58:54 $ 
+ */
+
+import org.eclipse.jem.internal.proxy.common.*;
+/**
+ * This is a test for testing callbacks.
+ */
+public class TestCallback implements ICallback {
+	
+	IVMCallbackServer vmServer;
+	int callbackID;
+	boolean stop = false;
+
+	/**
+	 * When told to start, it will send a callback
+	 * once every half second until told to stop.
+	 */
+	public void start() {
+		new Thread(new Runnable() {
+			public void run() {
+				// First send back test for IDE calling back on same thread. We do this by sending the thread id
+				// as a constant and the other side will then call back to remote, ask for the thread id, and
+				// see if it matches.
+				try {
+					vmServer.doCallback(new ICallbackRunnable() {
+						public Object run(ICallbackHandler handler) throws CommandException {
+							return handler.callbackAsConstants(callbackID, 1, new Integer(Thread.currentThread().hashCode()));
+						}
+					});
+					
+				} catch (CommandException e) {
+				}
+				
+				// Now do the regular testing.
+				final Integer[] p = new Integer[] {new Integer(0)};
+				while(!stop) {
+					try {
+						Thread.sleep(500);
+					} catch (InterruptedException e) {
+						continue;
+					}
+					if (stop)
+						break;
+					// Now signal the callback.
+					p[0] = new Integer(p[0].intValue()+1);
+					try {
+						vmServer.doCallback(new ICallbackRunnable() {
+							public Object run(ICallbackHandler handler) throws CommandException {
+								return handler.callbackWithParms(callbackID, 0, p);								
+							}
+						});
+					} catch (CommandException e) {
+					}						
+				}
+			}
+		}).start();
+	}
+	
+	/**
+	 * Tell it stop.
+	 */
+	public void stop() {
+		stop = true;
+	}
+	
+	/**
+	 * It is being initialized.
+	 */
+	public void initializeCallback(IVMCallbackServer server, int id) {
+		vmServer = server;
+		callbackID = id;
+	}
+
+}
diff --git a/tests/org.eclipse.jem.tests/vm_tests/org/eclipse/jem/tests/proxy/vm/TestCallbackStream.java b/tests/org.eclipse.jem.tests/vm_tests/org/eclipse/jem/tests/proxy/vm/TestCallbackStream.java
new file mode 100644
index 0000000..dd83eb5
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/vm_tests/org/eclipse/jem/tests/proxy/vm/TestCallbackStream.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jem.tests.proxy.vm;
+/*
+ *  $RCSfile: TestCallbackStream.java,v $
+ *  $Revision: 1.4 $  $Date: 2005/08/24 20:58:54 $ 
+ */
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+import org.eclipse.jem.internal.proxy.common.ICallback;
+import org.eclipse.jem.internal.proxy.common.IVMCallbackServer;
+/**
+ * This is a test for testing callback streams.
+ */
+public class TestCallbackStream implements ICallback {
+	
+	IVMCallbackServer vmServer;
+	int callbackID;
+	boolean stop = false;
+
+	/**
+	 * When told to start, it will send a stream of 30000 bytes of incrementing
+	 * value (i.e. 0, 1, 2, ..., 127, -127, ...)
+	 */
+	public void start() {
+		new Thread(new Runnable() {
+			public void run() {
+				OutputStream os = null;
+				try {
+					os = vmServer.requestStream(callbackID, 0);
+					if (os != null)
+						for (int i=0; i<30000; i++)
+							os.write(i);
+				} catch (Exception e) {
+					e.printStackTrace();
+				}
+				try {
+					if (os != null)
+						os.close();
+				} catch (IOException e) {
+				}
+		}}).start();
+	}
+	
+	/**
+	 * It is being initialized.
+	 */
+	public void initializeCallback(IVMCallbackServer server, int id) {
+		vmServer = server;
+		callbackID = id;
+	}
+
+}
diff --git a/tests/org.eclipse.jem.tests/vm_tests/org/eclipse/jem/tests/proxy/vm/TestExpressionThreadTransfer.java b/tests/org.eclipse.jem.tests/vm_tests/org/eclipse/jem/tests/proxy/vm/TestExpressionThreadTransfer.java
new file mode 100644
index 0000000..575b5ad
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/vm_tests/org/eclipse/jem/tests/proxy/vm/TestExpressionThreadTransfer.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jem.tests.proxy.vm;
+/*
+ *  $RCSfile: TestExpressionThreadTransfer.java,v $
+ *  $Revision: 1.3 $  $Date: 2005/08/24 20:58:54 $ 
+ */
+
+import org.eclipse.jem.internal.proxy.common.*;
+/**
+ * This is a test for testing callbacks.
+ */
+public class TestExpressionThreadTransfer implements ICallback {
+	
+	IVMCallbackServer vmServer;
+	int callbackID;
+	boolean stop = false;
+
+	/**
+	 * When told to start, it will send a callback
+	 * once every half second until told to stop.
+	 */
+	public void start() {
+		// Need to put it into a new thread.
+		// Then we'll just wait until the thread is done.
+		// This will cause callback onto a different thread in IDE.
+		Thread t = new Thread(new Runnable() {
+			public void run() {
+				// Calback to IDE on this thread. It won't return until complete on the other side.
+				try {
+					vmServer.doCallback(new ICallbackRunnable() {
+						public Object run(ICallbackHandler handler) throws CommandException {
+							return handler.callbackAsConstants(callbackID, 0, null);
+						}
+					});
+					
+				} catch (CommandException e) {
+				}
+			}
+		});
+		t.start();
+		while (true) {
+			try {
+				t.join();
+				break;
+			} catch (InterruptedException e) {
+			}
+		}
+		// Now we return and original thread on IDE resumes processing.
+	}
+		
+	/**
+	 * It is being initialized.
+	 */
+	public void initializeCallback(IVMCallbackServer server, int id) {
+		vmServer = server;
+		callbackID = id;
+	}
+
+}
diff --git a/tests/org.eclipse.jem.tests/vm_tests/testPackage/TestAccess.java b/tests/org.eclipse.jem.tests/vm_tests/testPackage/TestAccess.java
new file mode 100644
index 0000000..cf0bd61
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/vm_tests/testPackage/TestAccess.java
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $RCSfile: TestAccess.java,v $
+ *  $Revision: 1.3 $  $Date: 2005/05/11 19:01:32 $ 
+ */
+package testPackage;
+ 
+
+/**
+ * Used for testing fields.
+ * @since 1.1.0
+ */
+public class TestAccess {
+
+	public static void testVoid() {
+		
+	}
+	
+	public int field1;
+	protected int field2;
+	
+	public static int STATIC_FIELD = 3;
+
+	TestAccess(RuntimeException i) {
+		
+	}
+	
+	TestAccess(Throwable n) {
+		
+	}
+	
+	public TestAccess() {
+		
+	}
+	
+	public TestAccess(Exception o) {
+		
+	}
+	
+	public void ddd(Integer o, Number n) {
+		
+	}
+	
+	public void ddd(Number o, Integer n) {
+		
+	}
+	
+	public void ddd(Number n, Number n1) {
+		
+	}
+
+	
+	public void xyz() {
+	}
+	
+	public void xyz(Number n) {
+	}
+	
+	public void xyz(Object n) {
+	}
+	
+	protected void qxr() {
+		
+	}
+}
diff --git a/tests/org.eclipse.jem.tests/vm_tests/testPackage/TestCtorWithNull.java b/tests/org.eclipse.jem.tests/vm_tests/testPackage/TestCtorWithNull.java
new file mode 100644
index 0000000..7edf5c2
--- /dev/null
+++ b/tests/org.eclipse.jem.tests/vm_tests/testPackage/TestCtorWithNull.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package testPackage;
+/*
+ *  $RCSfile: TestCtorWithNull.java,v $
+ *  $Revision: 1.3 $  $Date: 2005/08/24 20:58:55 $ 
+ */
+
+/**
+ * 
+ * @since 1.0.0
+ */
+public class TestCtorWithNull {
+
+	public TestCtorWithNull(String x) {
+		// This is just a test to see that ctor will be selected if it has a null passed in for Tree Expression Processing.
+	}
+
+}
diff --git a/tests/org.eclipse.jst.ejb.ui.tests/.classpath b/tests/org.eclipse.jst.ejb.ui.tests/.classpath
new file mode 100644
index 0000000..64c5e31
--- /dev/null
+++ b/tests/org.eclipse.jst.ejb.ui.tests/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<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"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/tests/org.eclipse.jst.ejb.ui.tests/.project b/tests/org.eclipse.jst.ejb.ui.tests/.project
new file mode 100644
index 0000000..9164bb6
--- /dev/null
+++ b/tests/org.eclipse.jst.ejb.ui.tests/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.jst.ejb.ui.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>
+		<buildCommand>
+			<name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+	</natures>
+</projectDescription>
diff --git a/tests/org.eclipse.jst.ejb.ui.tests/.settings/org.eclipse.jdt.core.prefs b/tests/org.eclipse.jst.ejb.ui.tests/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..19c7dd3
--- /dev/null
+++ b/tests/org.eclipse.jst.ejb.ui.tests/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,74 @@
+#Wed May 26 14:42:09 EEST 2010
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=warning
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
diff --git a/tests/org.eclipse.jst.ejb.ui.tests/META-INF/MANIFEST.MF b/tests/org.eclipse.jst.ejb.ui.tests/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..33b4666
--- /dev/null
+++ b/tests/org.eclipse.jst.ejb.ui.tests/META-INF/MANIFEST.MF
@@ -0,0 +1,13 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name.0
+Bundle-SymbolicName: org.eclipse.jst.ejb.ui.tests
+Bundle-Version: 1.0.0.qualifier
+Bundle-Activator: org.eclipse.jst.ejb.ui.tests.Activator
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.jst.ejb.ui;bundle-version="[1.1.201,1.2.0)",
+ org.junit,
+ org.eclipse.jdt.ui;bundle-version="[3.2.0,4.0.0)"
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Bundle-Vendor: %Bundle-Vendor.0
diff --git a/docs/org.eclipse.wst.web.ui.infopop/about.html b/tests/org.eclipse.jst.ejb.ui.tests/about.html
similarity index 100%
copy from docs/org.eclipse.wst.web.ui.infopop/about.html
copy to tests/org.eclipse.jst.ejb.ui.tests/about.html
diff --git a/tests/org.eclipse.jst.ejb.ui.tests/build.properties b/tests/org.eclipse.jst.ejb.ui.tests/build.properties
new file mode 100644
index 0000000..2437e12
--- /dev/null
+++ b/tests/org.eclipse.jst.ejb.ui.tests/build.properties
@@ -0,0 +1,7 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               test.xml,\
+               plugin.properties,\
+               about.html
diff --git a/tests/org.eclipse.jst.ejb.ui.tests/plugin.properties b/tests/org.eclipse.jst.ejb.ui.tests/plugin.properties
new file mode 100644
index 0000000..9b34ede
--- /dev/null
+++ b/tests/org.eclipse.jst.ejb.ui.tests/plugin.properties
@@ -0,0 +1,13 @@
+###############################################################################
+# Copyright (c) 2005, 2006 IBM 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:
+#     IBM Corporation - initial API and implementation
+###############################################################################
+# properties file for org.eclipse.wst.sse.core.tests
+Bundle-Vendor.0 = Eclipse Web Tools Platform
+Bundle-Name.0 = JST EJB UI tests plugin
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.ejb.ui.tests/pom.xml b/tests/org.eclipse.jst.ejb.ui.tests/pom.xml
new file mode 100644
index 0000000..f83201f
--- /dev/null
+++ b/tests/org.eclipse.jst.ejb.ui.tests/pom.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Copyright (c) 2012, 2014 Eclipse Foundation and others.
+  All rights reserved. This program and the accompanying materials
+  are made available under the terms of the Eclipse Distribution License v1.0
+  which accompanies this distribution, and is available at
+  http://www.eclipse.org/org/documents/edl-v10.php
+ 
+  Contributors:
+    Thanh Ha (Eclipse Foundation) - initial implementation
+-->
+
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.eclipse.webtools.javaee</groupId>
+    <artifactId>javaee.tests</artifactId>
+    <version>3.6.0-SNAPSHOT</version>
+  </parent>
+
+  <groupId>org.eclipse.webtools.ejb</groupId>
+  <artifactId>org.eclipse.jst.ejb.ui.tests</artifactId>
+  <version>1.0.0-SNAPSHOT</version>
+  <packaging>eclipse-test-plugin</packaging>
+
+  <properties>
+    <testSuite>${project.artifactId}</testSuite>
+    <testClass>org.eclipse.jst.ejb.ui.tests.AllTests</testClass>
+  </properties>
+</project>
diff --git a/tests/org.eclipse.jst.ejb.ui.tests/src/org/eclipse/jst/ejb/ui/BusinessInterfaceSelectionExtensionTest.java b/tests/org.eclipse.jst.ejb.ui.tests/src/org/eclipse/jst/ejb/ui/BusinessInterfaceSelectionExtensionTest.java
new file mode 100644
index 0000000..0faa248
--- /dev/null
+++ b/tests/org.eclipse.jst.ejb.ui.tests/src/org/eclipse/jst/ejb/ui/BusinessInterfaceSelectionExtensionTest.java
@@ -0,0 +1,84 @@
+/***********************************************************************
+ * Copyright (c) 2008 by SAP AG, Walldorf. 
+ * 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:
+ *     SAP AG - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jst.ejb.ui;
+
+import org.eclipse.jdt.ui.dialogs.ITypeInfoFilterExtension;
+import org.eclipse.jdt.ui.dialogs.ITypeInfoRequestor;
+import org.eclipse.jst.ejb.ui.internal.wizard.BusinessInterfaceSelectionExtension;
+
+import junit.framework.TestCase;
+
+/**
+ * @author Kiril Mitov k.mitov@sap.com
+ * 
+ */
+public class BusinessInterfaceSelectionExtensionTest extends TestCase {
+
+	private BusinessInterfaceSelectionExtension fixture;
+
+	private final class MockTypeInfoRequestor implements ITypeInfoRequestor {
+		private String packageName;
+		private String typeName;
+
+		public String getEnclosingName() {
+			return null;
+		}
+
+		public int getModifiers() {
+			return 0;
+		}
+
+		public String getPackageName() {
+			return packageName;
+		}
+
+		public String getTypeName() {
+			return typeName;
+		}
+
+		public void setPackageName(String packageName) {
+			this.packageName = packageName;
+		}
+
+		public void setTypeName(String typeName) {
+			this.typeName = typeName;
+		}
+	}
+
+	@Override
+	protected void setUp() throws Exception {
+		super.setUp();
+		fixture = new BusinessInterfaceSelectionExtension();
+	}
+
+	public void testSelectJavaxEjbPackage() {
+		MockTypeInfoRequestor requestor = new MockTypeInfoRequestor();
+		requestor.setPackageName("javax.ejb"); //$NON-NLS-1$
+		ITypeInfoFilterExtension filter = fixture.getFilterExtension();
+		assertFalse(filter.select(requestor));
+	}
+
+	public void testSelectJavaIOSerizlizablePackage() {
+		MockTypeInfoRequestor requestor = new MockTypeInfoRequestor();
+		requestor.setPackageName("java.io"); //$NON-NLS-1$
+		requestor.setTypeName("Serializable"); //$NON-NLS-1$
+		ITypeInfoFilterExtension filter = fixture.getFilterExtension();
+		assertFalse(filter.select(requestor));
+	}
+
+	public void testSelectJavaIOExternalizablePackage() {
+		MockTypeInfoRequestor requestor = new MockTypeInfoRequestor();
+		requestor.setPackageName("java.io"); //$NON-NLS-1$
+		requestor.setTypeName("Externalizable"); //$NON-NLS-1$
+		ITypeInfoFilterExtension filter = fixture.getFilterExtension();
+		assertFalse(filter.select(requestor));
+	}
+}
diff --git a/tests/org.eclipse.jst.ejb.ui.tests/src/org/eclipse/jst/ejb/ui/tests/Activator.java b/tests/org.eclipse.jst.ejb.ui.tests/src/org/eclipse/jst/ejb/ui/tests/Activator.java
new file mode 100644
index 0000000..5aed577
--- /dev/null
+++ b/tests/org.eclipse.jst.ejb.ui.tests/src/org/eclipse/jst/ejb/ui/tests/Activator.java
@@ -0,0 +1,60 @@
+/***********************************************************************
+ * Copyright (c) 2008 by SAP AG, Walldorf. 
+ * 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:
+ *     SAP AG - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jst.ejb.ui.tests;
+
+import org.eclipse.core.runtime.Plugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class Activator extends Plugin {
+
+	// The plug-in ID
+	public static final String PLUGIN_ID = "org.eclipse.jst.ejb.ui.tests"; //$NON-NLS-1$
+
+	// The shared instance
+	private static Activator plugin;
+	
+	/**
+	 * The constructor
+	 */
+	public Activator() {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.core.runtime.Plugins#start(org.osgi.framework.BundleContext)
+	 */
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+		plugin = this;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.core.runtime.Plugin#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 Activator getDefault() {
+		return plugin;
+	}
+
+}
diff --git a/tests/org.eclipse.jst.ejb.ui.tests/src/org/eclipse/jst/ejb/ui/tests/AllTests.java b/tests/org.eclipse.jst.ejb.ui.tests/src/org/eclipse/jst/ejb/ui/tests/AllTests.java
new file mode 100644
index 0000000..50fc2e6
--- /dev/null
+++ b/tests/org.eclipse.jst.ejb.ui.tests/src/org/eclipse/jst/ejb/ui/tests/AllTests.java
@@ -0,0 +1,32 @@
+/***********************************************************************
+ * Copyright (c) 2008 by SAP AG, Walldorf. 
+ * 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:
+ *     SAP AG - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jst.ejb.ui.tests;
+
+import org.eclipse.osgi.util.NLS;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * @author Kiril Mitov k.mitov@sap.com
+ * 
+ */
+public class AllTests {
+
+	public static Test suite() {
+		TestSuite suite = new TestSuite(NLS.bind(Messages.TestSuiteTitle, Activator.PLUGIN_ID));
+		//$JUnit-BEGIN$
+		suite.addTestSuite(org.eclipse.jst.ejb.ui.BusinessInterfaceSelectionExtensionTest.class);
+		//$JUnit-END$
+		return suite;
+	}
+
+}
diff --git a/tests/org.eclipse.jst.ejb.ui.tests/src/org/eclipse/jst/ejb/ui/tests/Messages.java b/tests/org.eclipse.jst.ejb.ui.tests/src/org/eclipse/jst/ejb/ui/tests/Messages.java
new file mode 100644
index 0000000..d9179a6
--- /dev/null
+++ b/tests/org.eclipse.jst.ejb.ui.tests/src/org/eclipse/jst/ejb/ui/tests/Messages.java
@@ -0,0 +1,16 @@
+package org.eclipse.jst.ejb.ui.tests;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+	private static final String BUNDLE_NAME = "org.eclipse.jst.ejb.ui.tests.messages"; //$NON-NLS-1$
+	static {
+		// initialize resource bundle
+		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+	}
+
+	private Messages() {
+	}
+
+	public static String TestSuiteTitle;
+}
diff --git a/tests/org.eclipse.jst.ejb.ui.tests/src/org/eclipse/jst/ejb/ui/tests/messages.properties b/tests/org.eclipse.jst.ejb.ui.tests/src/org/eclipse/jst/ejb/ui/tests/messages.properties
new file mode 100644
index 0000000..a35bcae
--- /dev/null
+++ b/tests/org.eclipse.jst.ejb.ui.tests/src/org/eclipse/jst/ejb/ui/tests/messages.properties
@@ -0,0 +1 @@
+TestSuiteTitle=Test for {0}
diff --git a/tests/org.eclipse.jst.ejb.ui.tests/test.xml b/tests/org.eclipse.jst.ejb.ui.tests/test.xml
new file mode 100644
index 0000000..f11aec0
--- /dev/null
+++ b/tests/org.eclipse.jst.ejb.ui.tests/test.xml
@@ -0,0 +1,167 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project
+    name="testsuite"
+    default="run"
+    basedir=".">
+
+    <!-- 
+         ===================================================== 
+         There should be no need to change what's above.
+         (if there is, let us know if the script can be improved.)
+         ===================================================== 
+    -->
+    
+    <!-- 
+         Every suite needs to specify three thing: 
+             plugin-name, 
+             classname - that provides the suite to test, and 
+             testType - either core-test, or ui-test. 
+         There is an optional extraVMargs property that some tests need to use in order to specify  
+         extra, non-standard properties to the VM when it runs. If not need, no need to specify it. 
+    -->
+    <property
+        name="plugin-name"
+        value="org.eclipse.jst.ejb.ui.tests" />
+    <property
+        name="classname"
+        value="org.eclipse.jst.ejb.ui.tests.AllTests" />
+    <property
+        name="testType"
+        value="ui-test" />
+    
+    <!-- some test suites need to add special vm arguments when they run. This is just an example.
+    <property
+        name="extraVMargs"
+        value="-DjsfRuntimeJarsDirectoryV1.1=${testDir}/${jsf1.1Dir}" />
+    <echo
+        message="extraVMargs ${extraVMargs}" />
+    -->
+
+    <!-- 
+         ===================================================== 
+         There should be no need to change what's below.
+         (if there is, let us know if the script can be improved.)
+         ===================================================== 
+    -->
+    
+    <!-- 
+         There are some properties that must be provided by caller. 
+    -->
+    <fail
+        message="Error: missing property. eclipse-home must be provided"
+        unless="eclipse-home" />
+    <fail
+        message="Error: missing property. buildDirectory must be provided"
+        unless="buildDirectory" />
+    <fail
+        message="Error: missing property. buildLabel must be provided"
+        unless="buildLabel" />
+    <echo
+        message="basedir: ${basedir}" />
+    <echo
+        message="eclipse-home: ${eclipse-home}" />
+    <echo
+        message="buildDirectory: ${buildDirectory}" />
+    <echo
+        message="plugin-name: ${plugin-name}" />
+    <echo
+        message="classname: ${classname}" />
+    <echo
+        message="testType ${testType}" />
+    <property
+        name="library-file"
+        value="${eclipse-home}/plugins/org.eclipse.test_3.1.0/library.xml" />
+    <property
+        name="workspace"
+        value="${eclipse-home}/junitworkspaces/${plugin-name}" />
+
+      <!-- 
+    This init 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. Here it's a good idea 
+    to delete things that might have been created if the test has already been 
+    ran, just in case the test is being re-ran. 
+    -->
+    <target
+        name="init">
+        <tstamp />
+        <delete>
+            <fileset
+                dir="${eclipse-home}"
+                includes="${plugin-name}.*xml" />
+        </delete>
+        
+            <!-- 
+         make the workspace directory, in case path doesn't exist yet
+         but delete to make sure fresh contents, if it does exist
+        -->
+        <delete
+            dir="${workspace}"
+            quiet="true" />
+        <mkdir
+            dir="${workspace}" />
+    </target>
+
+    <!-- 
+      This suite target defines the tests that need to be run.
+    -->
+    <target
+        name="suite">
+        <ant
+            target="${testType}"
+            antfile="${library-file}"
+            dir="${eclipse-home}">
+            <property
+                name="data-dir"
+                value="${workspace}" />
+            <property
+                name="plugin-name"
+                value="${plugin-name}" />
+            <property
+                name="classname"
+                value="${classname}" />
+            <property
+                name="plugin-path"
+                value="${eclipse-home}/plugins/${plugin-name}" />
+        </ant>
+        <copy
+            failonerror="false"
+            file="${workspace}/.metadata/.log"
+            tofile="${buildDirectory}/${buildLabel}/testResults/consolelogs/${plugin-name}.consolelog.txt" />
+    </target>
+
+     <!-- 
+     This clean 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, if required. But, 
+     it's usually best to leave it all, in case you'd like to inspect it 
+     after a failed run. It will be deleted eventually by the next clean build. 
+    -->
+    <target
+        name="cleanup">
+
+    </target>
+
+    <!-- 
+       This run target is the master target that get's all the work done. 
+       Most activity is actually done in the 'depends' tasks, but any 
+       actions that need to happen after all the tests have been run 
+       should go here, such as copying the results to a common 'save' 
+       directory. 
+    -->
+    <target
+        name="run"
+        depends="init,suite,cleanup">
+        <ant
+            target="collect"
+            antfile="${library-file}"
+            dir="${eclipse-home}">
+            <property
+                name="includes"
+                value="${plugin-name}.*xml" />
+            <property
+                name="output-file"
+                value="${plugin-name}.xml" />
+        </ant>
+    </target>
+</project>
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.j2ee.core.tests.performance/.classpath b/tests/org.eclipse.jst.j2ee.core.tests.performance/.classpath
new file mode 100644
index 0000000..751c8f2
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests.performance/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/tests/org.eclipse.jst.j2ee.core.tests.performance/.cvsignore b/tests/org.eclipse.jst.j2ee.core.tests.performance/.cvsignore
new file mode 100644
index 0000000..d586ee1
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests.performance/.cvsignore
@@ -0,0 +1,4 @@
+bin
+temp.folder
+build.xml
+core-performance.jar
diff --git a/tests/org.eclipse.jst.j2ee.core.tests.performance/.project b/tests/org.eclipse.jst.j2ee.core.tests.performance/.project
new file mode 100644
index 0000000..a3e12fb
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests.performance/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.jst.j2ee.core.tests.performance</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/docs/org.eclipse.wst.web.ui.infopop/about.html b/tests/org.eclipse.jst.j2ee.core.tests.performance/about.html
similarity index 100%
copy from docs/org.eclipse.wst.web.ui.infopop/about.html
copy to tests/org.eclipse.jst.j2ee.core.tests.performance/about.html
diff --git a/tests/org.eclipse.jst.j2ee.core.tests.performance/build.properties b/tests/org.eclipse.jst.j2ee.core.tests.performance/build.properties
new file mode 100644
index 0000000..80a90d3
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests.performance/build.properties
@@ -0,0 +1,7 @@
+source.core-performance.jar = src/
+output.core-performance.jar = bin/
+bin.includes = plugin.xml,\
+               core-performance.jar,\
+               test.xml,\
+               testcase.xml,\
+               about.html
diff --git a/tests/org.eclipse.jst.j2ee.core.tests.performance/plugin.xml b/tests/org.eclipse.jst.j2ee.core.tests.performance/plugin.xml
new file mode 100644
index 0000000..adb5902
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests.performance/plugin.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin
+   id="org.eclipse.jst.j2ee.core.tests.performance"
+   name="Core Performance Plug-in"
+   version="1.1.0.qualifier"
+   provider-name=""
+   class="org.eclipse.jst.j2ee.core.tests.performance.CorePerformanceTestPlugin">
+
+   <runtime>
+      <library name="core-performance.jar">
+         <export name="*"/>
+      </library>
+   </runtime>
+
+   <requires>
+      <import plugin="org.eclipse.ui"/>
+      <import plugin="org.eclipse.core.runtime"/>
+       <import plugin="org.junit"/>
+      <import plugin="org.eclipse.jst.j2ee.tests.performance"/>
+      <import plugin="org.eclipse.wst.common.tests"/>
+      <import plugin="org.eclipse.jst.j2ee.core.tests"/>
+      <import plugin="org.eclipse.jst.j2ee.tests"/>
+   </requires>
+
+</plugin>
diff --git a/tests/org.eclipse.jst.j2ee.core.tests.performance/pom.xml b/tests/org.eclipse.jst.j2ee.core.tests.performance/pom.xml
new file mode 100644
index 0000000..204854c
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests.performance/pom.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Copyright (c) 2012, 2013 Eclipse Foundation and others.
+  All rights reserved. This program and the accompanying materials
+  are made available under the terms of the Eclipse Distribution License v1.0
+  which accompanies this distribution, and is available at
+  http://www.eclipse.org/org/documents/edl-v10.php
+ 
+  Contributors:
+    Thanh Ha (Eclipse Foundation) - initial implementation
+-->
+
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.eclipse.webtools.javaee</groupId>
+    <artifactId>javaee.tests</artifactId>
+    <version>3.6.0-SNAPSHOT</version>
+  </parent>
+
+  <groupId>org.eclipse.webtools.javaee</groupId>
+  <artifactId>org.eclipse.jst.j2ee.core.tests.performance</artifactId>
+  <version>1.1.0-SNAPSHOT</version>
+  <packaging>eclipse-plugin</packaging>
+</project>
diff --git a/tests/org.eclipse.jst.j2ee.core.tests.performance/src/org/eclipse/jst/j2ee/core/tests/performance/AllCorePerformanceTests.java b/tests/org.eclipse.jst.j2ee.core.tests.performance/src/org/eclipse/jst/j2ee/core/tests/performance/AllCorePerformanceTests.java
new file mode 100644
index 0000000..26d4233
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests.performance/src/org/eclipse/jst/j2ee/core/tests/performance/AllCorePerformanceTests.java
@@ -0,0 +1,79 @@
+/*
+ * Created on Nov 28, 2004
+ *
+ * TODO To change the template for this generated file go to
+ * Window - Preferences - Java - Code Style - Code Templates
+ */
+package org.eclipse.jst.j2ee.core.tests.performance;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.jst.j2ee.archive.emftests.AppClientEMFEditTest;
+import org.eclipse.jst.j2ee.archive.emftests.AppClientEMFTest;
+import org.eclipse.jst.j2ee.archive.emftests.EarEMFEditTest;
+import org.eclipse.jst.j2ee.archive.emftests.EarEMFTest;
+import org.eclipse.jst.j2ee.archive.emftests.EjbEMFEditTest;
+import org.eclipse.jst.j2ee.archive.emftests.RarEMFEditTest;
+import org.eclipse.jst.j2ee.archive.emftests.RarEMFTest;
+import org.eclipse.jst.j2ee.archive.emftests.WarEMFEditTest;
+import org.eclipse.jst.j2ee.archive.emftests.WarEMFTest;
+import org.eclipse.jst.j2ee.archive.emftests.WebServicesEMFTest;
+import org.eclipse.jst.j2ee.tests.performance.BasePerformanceTestCase;
+import org.eclipse.jst.j2ee.tests.performance.PerformanceTestCaseWrapper;
+import org.eclipse.wtp.j2ee.headless.tests.appclient.operations.AppClientProjectCreationOperationTest;
+import org.eclipse.wtp.j2ee.headless.tests.ejb.operations.EJBImportOperationTest;
+import org.eclipse.wtp.j2ee.headless.tests.ejb.operations.EJBProjectCreationOperationTest;
+import org.eclipse.wtp.j2ee.headless.tests.jca.operations.JCAProjectCreationOperationTest;
+import org.eclipse.wtp.j2ee.headless.tests.web.operations.WebProjectCreationOperationTest;
+
+/**
+ *
+ * TODO To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Style - Code Templates
+ */
+public class AllCorePerformanceTests extends BasePerformanceTestCase{
+	
+	public static Test suite() {
+	
+		TestSuite suite = new TestSuite("Performance Test for com.ibm.etools.archive.emftest");
+		addPerformanceTest(suite, new AppClientEMFEditTest("testApplicationClientEdit"), PerformanceTestCaseWrapper.GLOBAL, "Application Client emf edit test" );
+		addPerformanceTest(suite, new AppClientEMFTest("testApplicationClientPopulation"), PerformanceTestCaseWrapper.LOCAL, "Application Client emf test" );
+		addPerformanceTest(suite, new AppClientEMFTest("test14ApplicationClientPopulation"), PerformanceTestCaseWrapper.GLOBAL, "Application Client 14 emf test" );
+		
+		addPerformanceTest(suite, new EarEMFEditTest("testEAREdit"), PerformanceTestCaseWrapper.GLOBAL, "EAR emf edit test" );
+		//addPerformanceTest(suite, new EarEMFTest("testEARPopulation"), PerformanceTestCaseWrapper.LOCAL, "EAR  emf test" );
+		addPerformanceTest(suite, new EarEMFTest("test14EARPopulation"), PerformanceTestCaseWrapper.GLOBAL, "EAR 14 emf test" );
+		
+		//addPerformanceTest(suite, new EjbEMFEditTest("testEJBJarEdit"), PerformanceTestCaseWrapper.GLOBAL, "EJB emf edit test -testEJBJarEdit" );
+		addPerformanceTest(suite, new EjbEMFEditTest("testWCCMJar"), PerformanceTestCaseWrapper.LOCAL, "EJB emf edit test - testWCCMJar" );
+		//addPerformanceTest(suite, new EjbEMFTest("testEJBJarPopulation"), PerformanceTestCaseWrapper.LOCAL, "EJB  emf test" );
+		//addPerformanceTest(suite, new EjbEMFTest("test14EJBJarPopulation"), PerformanceTestCaseWrapper.GLOBAL, "EJB 14 emf test" );
+	
+		addPerformanceTest(suite, new RarEMFEditTest("testRAREdit"), PerformanceTestCaseWrapper.GLOBAL, "RAR emf edit test" );
+		addPerformanceTest(suite, new RarEMFTest("testRARPopulation"), PerformanceTestCaseWrapper.LOCAL, "RAR  emf test" );
+		addPerformanceTest(suite, new RarEMFTest("test14RARPopulation"), PerformanceTestCaseWrapper.GLOBAL, "RAR 14 emf test" );
+	
+		addPerformanceTest(suite, new WarEMFEditTest("testWAREdit"), PerformanceTestCaseWrapper.GLOBAL, "WAR emf edit test" );
+		//addPerformanceTest(suite, new WarEMFTest("testWARPopulation"), PerformanceTestCaseWrapper.LOCAL, "WAR  emf test" );
+		addPerformanceTest(suite, new WarEMFTest("test14WARPopulation"), PerformanceTestCaseWrapper.GLOBAL, "WAR 14 emf test" );
+		
+		addPerformanceTest(suite, new WebServicesEMFTest("test13WebServicesClientPopulation"), PerformanceTestCaseWrapper.NONE, "Web Service Client 13 emf test" );
+		addPerformanceTest(suite, new WebServicesEMFTest("test13WebServicesDDPopulation"), PerformanceTestCaseWrapper.LOCAL, "Web services 13 emf test" );
+		addPerformanceTest(suite, new WebServicesEMFTest("test14WebServicesDDPopulation"), PerformanceTestCaseWrapper.GLOBAL, "Web services 14 emf test" );
+		addPerformanceTest(suite, new WebServicesEMFTest("testJaxRPCMapPopulation"), PerformanceTestCaseWrapper.GLOBAL, "JaxRPCMapping emf test" );
+		
+		
+		//Creation tests
+		addPerformanceTest(suite, new EJBProjectCreationOperationTest("testEJB21_Defaults"), PerformanceTestCaseWrapper.NONE, "EJB Component creation test" );
+		addPerformanceTest(suite, new AppClientProjectCreationOperationTest("testAC50_Defaults"), PerformanceTestCaseWrapper.LOCAL, "App Client Component creation test" );
+		addPerformanceTest(suite, new JCAProjectCreationOperationTest("testConnector15_Defaults"), PerformanceTestCaseWrapper.GLOBAL, "Connector Component creation test" );
+		addPerformanceTest(suite, new WebProjectCreationOperationTest("testWeb24_Defaults"), PerformanceTestCaseWrapper.GLOBAL, "Web Component creation test" );
+		
+		addPerformanceTest(suite, new EJBImportOperationTest("testEJBImport21_Defaults"), PerformanceTestCaseWrapper.NONE, "EJB Component import test" );
+		return suite;
+	}
+
+	
+	
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests.performance/src/org/eclipse/jst/j2ee/core/tests/performance/CorePerformanceTestPlugin.java b/tests/org.eclipse.jst.j2ee.core.tests.performance/src/org/eclipse/jst/j2ee/core/tests/performance/CorePerformanceTestPlugin.java
new file mode 100644
index 0000000..08769eb
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests.performance/src/org/eclipse/jst/j2ee/core/tests/performance/CorePerformanceTestPlugin.java
@@ -0,0 +1,72 @@
+package org.eclipse.jst.j2ee.core.tests.performance;
+
+import org.eclipse.ui.plugin.*;
+import org.osgi.framework.BundleContext;
+import java.util.*;
+
+/**
+ * The main plugin class to be used in the desktop.
+ */
+public class CorePerformanceTestPlugin extends AbstractUIPlugin {
+	//The shared instance.
+	private static CorePerformanceTestPlugin plugin;
+	//Resource bundle.
+	private ResourceBundle resourceBundle;
+	
+	/**
+	 * The constructor.
+	 */
+	public CorePerformanceTestPlugin() {
+		super();
+		plugin = this;
+	}
+
+	/**
+	 * This method is called upon plug-in activation
+	 */
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+	}
+
+	/**
+	 * This method is called when the plug-in is stopped
+	 */
+	public void stop(BundleContext context) throws Exception {
+		super.stop(context);
+		plugin = null;
+		resourceBundle = null;
+	}
+
+	/**
+	 * Returns the shared instance.
+	 */
+	public static CorePerformanceTestPlugin getDefault() {
+		return plugin;
+	}
+
+	/**
+	 * Returns the string from the plugin's resource bundle,
+	 * or 'key' if not found.
+	 */
+	public static String getResourceString(String key) {
+		ResourceBundle bundle = CorePerformanceTestPlugin.getDefault().getResourceBundle();
+		try {
+			return (bundle != null) ? bundle.getString(key) : key;
+		} catch (MissingResourceException e) {
+			return key;
+		}
+	}
+
+	/**
+	 * Returns the plugin's resource bundle,
+	 */
+	public ResourceBundle getResourceBundle() {
+		try {
+			if (resourceBundle == null)
+				resourceBundle = ResourceBundle.getBundle("org.eclipse.jst.j2ee.core.tests.performance.PerformancePluginResources");
+		} catch (MissingResourceException x) {
+			resourceBundle = null;
+		}
+		return resourceBundle;
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests.performance/test.xml b/tests/org.eclipse.jst.j2ee.core.tests.performance/test.xml
new file mode 100644
index 0000000..ab3cfd5
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests.performance/test.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0"?>
+
+<project name="J2EE Performance test" default="performance" 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}/../.."/>
+
+  <!-- sets the properties eclipse-home, and library-file -->
+  <property name="plugin-name" value="org.eclipse.jst.j2ee.core.tests.performance"/>
+  <property name="library-file"
+            value="${eclipse-home}/plugins/org.eclipse.test_3.1.0/library.xml"/>
+  <property name="perf-tests-file"
+            value="${testDir}/performance-tests.xml"/>
+  <property name="extraVMargs" value="-Xmx512M"/>
+
+  <!-- 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*.xml"/>
+    </delete>
+  </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 defines the performance tests that need to be run. -->
+<target name="performance-suite">
+  <property name="performance-folder" value="${eclipse-home}/performance_folder"/>
+  <delete dir="${performance-folder}" quiet="true"/>
+  <ant target="core-test" antfile="${perf-tests-file}" dir="${eclipse-home}">
+     <property name="data-dir" value="${performance-folder}"/>
+     <property name="plugin-name" value="${plugin-name}"/>
+     <property name="classname" value="org.eclipse.jst.j2ee.core.tests.performance.AllCorePerformanceTests"/>
+     <property name="extraVMargs" value="${extraVMargs}"/>
+  </ant>
+</target>
+                    
+<!-- This target runs the performance test suite. Any actions that need to happen -->
+<!-- after all the tests have been run should go here. -->
+<target name="performance" depends="init,performance-suite,cleanup">
+  <ant target="collect" antfile="${library-file}" dir="${eclipse-home}">
+    <property name="includes" value="org*.xml"/>
+    <property name="output-file" value="${plugin-name}.xml"/>
+  </ant>
+</target>
+</project>
diff --git a/tests/org.eclipse.jst.j2ee.core.tests.performance/testcase.xml b/tests/org.eclipse.jst.j2ee.core.tests.performance/testcase.xml
new file mode 100644
index 0000000..4171864
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests.performance/testcase.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0"?>
+<testCases>
+	<testCase class="org.eclipse.jst.j2ee.archive.emftests.EarEMFEditTest">
+		<method name="testEAREdit" tagging="GLOBAL" shortName="EAR emf edit" />
+	</testCase>
+	<testCase class="org.eclipse.jst.j2ee.archive.emftests.EarEMFTest">
+		<method name="test14EARPopulation" tagging="GLOBAL" shortName="EAR 14 emf test" />
+ 	</testCase>
+ 	<testCase class="org.eclipse.jst.j2ee.archive.emftests.EjbEMFEditTest">
+		<method name="testEJBJarEdit" tagging="GLOBAL" shortName="EJB emf edit" />
+ 	</testCase>
+ 	<testCase class="org.eclipse.jst.j2ee.archive.emftests.EjbEMFEditTest">
+		<method name="testWCCMJar" tagging="GLOBAL" shortName="EJB emf edit" />
+ 	</testCase>
+ 	<testCase class="org.eclipse.jst.j2ee.archive.emftests.EjbEMFTest">
+		<method name="testEJBJarPopulation" tagging="GLOBAL" shortName="EJB emf test" />
+ 	</testCase>
+ 	<testCase class="org.eclipse.jst.j2ee.archive.emftests.EjbEMFTest">
+		<method name="test14EJBJarPopulation" tagging="GLOBAL" shortName="EJB 14 emf test" />
+ 	</testCase>
+ 	<testCase class="org.eclipse.jst.j2ee.archive.emftests.AppClientEMFEditTest">
+		<method name="testApplicationClientEdit" tagging="GLOBAL" shortName="Application Client emf edit" />
+ 	</testCase>
+ 	<testCase class="org.eclipse.jst.j2ee.archive.emftests.AppClientEMFTest">
+		<method name="test14ApplicationClientPopulation" tagging="GLOBAL" shortName="Application Client 14 emf test" />
+ 	</testCase>
+ 	
+ 	<testCase class="org.eclipse.jst.j2ee.archive.emftests.RarEMFEditTest">
+		<method name="testRAREdit" tagging="GLOBAL" shortName="Connector emf edit" />
+ 	</testCase>
+ 	
+ 	<testCase class="org.eclipse.jst.j2ee.archive.emftests.RarEMFTest">
+		<method name="test14RARPopulation" tagging="GLOBAL" shortName="Connector 14 emf test" />
+ 	</testCase>
+ 	<testCase class="org.eclipse.jst.j2ee.archive.emftests.WarEMFEditTest">
+		<method name="testWAREdit" tagging="GLOBAL" shortName="Web emf edit" />
+ 	</testCase>
+ 	<testCase class="org.eclipse.jst.j2ee.archive.emftests.WarEMFTest">
+		<method name="test14WARPopulation" tagging="GLOBAL" shortName="Web 14 emf test" />
+ 	</testCase>
+ 	
+ 	<testCase class="org.eclipse.jst.j2ee.archive.emftests.WebServicesEMFTest">
+		<method name="test14WebServicesDDPopulation" tagging="GLOBAL" shortName="Web services 14 emf test" />
+ 	</testCase> 
+ 	
+</testCases>
+	
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/.classpath b/tests/org.eclipse.jst.j2ee.core.tests/.classpath
new file mode 100644
index 0000000..8d90055
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/.classpath
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="commonArchiveTests"/>
+	<classpathentry kind="src" path="mofj2eeTests"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/.cvsignore b/tests/org.eclipse.jst.j2ee.core.tests/.cvsignore
new file mode 100644
index 0000000..5c69969
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/.cvsignore
@@ -0,0 +1,5 @@
+bin
+testOutput
+build.xml
+temp.folder
+tests.jar
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/.project b/tests/org.eclipse.jst.j2ee.core.tests/.project
new file mode 100644
index 0000000..ecd7aaa
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/.project
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.jst.j2ee.core.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/tests/org.eclipse.jst.j2ee.core.tests/.settings/org.eclipse.jdt.core.prefs b/tests/org.eclipse.jst.j2ee.core.tests/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..ffaa166
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,58 @@
+#Thu Apr 26 13:28:24 EDT 2007
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=disabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
+org.eclipse.jdt.core.compiler.compliance=1.4
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nullReference=ignore
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=error
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.3
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/.settings/org.eclipse.jdt.ui.prefs b/tests/org.eclipse.jst.j2ee.core.tests/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..37116e2
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,3 @@
+#Thu Apr 26 13:28:24 EDT 2007
+eclipse.preferences.version=1
+internal.default.compliance=default
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/META-INF/MANIFEST.MF b/tests/org.eclipse.jst.j2ee.core.tests/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..26b34ea
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/META-INF/MANIFEST.MF
@@ -0,0 +1,35 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name.0
+Bundle-SymbolicName: org.eclipse.jst.j2ee.core.tests
+Bundle-Version: 1.1.500.qualifier
+Bundle-ClassPath: tests.jar
+Bundle-Vendor: %Bundle-Vendor.0
+Bundle-Localization: plugin
+Export-Package: org.eclipse.jst.j2ee.application.test,
+ org.eclipse.jst.j2ee.archive.emftests,
+ org.eclipse.jst.j2ee.archive.test,
+ org.eclipse.jst.j2ee.archive.testutilities,
+ org.eclipse.jst.j2ee.client.test,
+ org.eclipse.jst.j2ee.common.test,
+ org.eclipse.jst.j2ee.common.tests,
+ org.eclipse.jst.j2ee.core.api.test,
+ org.eclipse.jst.j2ee.core.tests.api,
+ org.eclipse.jst.j2ee.core.tests.bvt,
+ org.eclipse.jst.j2ee.ejb.test,
+ org.eclipse.jst.j2ee.emfload,
+ org.eclipse.jst.j2ee.jca.test,
+ org.eclipse.jst.j2ee.jsp.test,
+ org.eclipse.jst.j2ee.webapplication.test,
+ org.eclipse.jst.j2ee.webservice.wscommon.test,
+ org.eclipse.jst.j2ee.webservice.wsdd.test
+Require-Bundle: org.junit,
+ org.eclipse.jem.util,
+ org.eclipse.jst.j2ee.core,
+ org.eclipse.wst.common.emf,
+ org.eclipse.emf.ecore.xmi,
+ org.eclipse.jem,
+ org.eclipse.core.runtime,
+ org.eclipse.wst.common.tests,
+ org.eclipse.wst.validation;bundle-version="1.2.1"
+Bundle-RequiredExecutionEnvironment: J2SE-1.4
diff --git a/docs/org.eclipse.wst.web.ui.infopop/about.html b/tests/org.eclipse.jst.j2ee.core.tests/about.html
similarity index 100%
copy from docs/org.eclipse.wst.web.ui.infopop/about.html
copy to tests/org.eclipse.jst.j2ee.core.tests/about.html
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/build.properties b/tests/org.eclipse.jst.j2ee.core.tests/build.properties
new file mode 100644
index 0000000..0343e02
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/build.properties
@@ -0,0 +1,27 @@
+###############################################################################
+# Copyright (c) 2005, 2007 IBM 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:
+#     IBM Corporation - initial API and implementation
+###############################################################################
+bin.includes = tests.jar,\
+               test.xml,\
+               commonArchiveResources/,\
+               testData/,\
+               about.html,\
+               META-INF/,\
+               plugin.properties
+output.tests.jar = bin/
+jars.compile.order = tests.jar
+source.tests.jar = commonArchiveTests/,\
+                   mofj2eeTests/
+bin.excludes = commonArchiveResources/.cvsignore
+src.includes = out.xmi,\
+               about.html,\
+               build/,\
+               testData/,\
+               test.xml
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/build/buildcontrol.properties b/tests/org.eclipse.jst.j2ee.core.tests/build/buildcontrol.properties
new file mode 100644
index 0000000..082a993
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/build/buildcontrol.properties
@@ -0,0 +1,6 @@
+CONTACT=danberg@us.ibm.com
+ComponentShortName=com.ibm.etools.j2ee.core.test
+ComponentFullName=com.ibm.etools.j2ee.core.test
+ComponentCompetency=TESTS
+JavaCompile.1=srcjar
+BuildVerification.1=dir
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/build/package.xml b/tests/org.eclipse.jst.j2ee.core.tests/build/package.xml
new file mode 100644
index 0000000..191f326
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/build/package.xml
@@ -0,0 +1,20 @@
+<project name="com.ibm.etools.j2ee.core.test" default="packagingPlugin" basedir="./..">
+    <target name="init">
+        <property name="packageDir" value=""/>
+        <property name="plugin.directory"  value="${basedir}"/>
+        <property name="plugin.id" value="com.ibm.etools.j2ee.core.test"/>
+        <property name="plugin.version"  value=""/>
+    </target>
+    <target name="packagingPlugin" depends="init">
+        <echo message="${plugin.id}"/>
+        <copy todir="${packageDir}/plugins/${plugin.id}_${plugin.version}">
+            <fileset dir="${plugin.directory}">
+                <include name="plugin.xml"/>
+                <include name="test.xml"/>
+                <include name="runtime/commonArchiveTests.jar"/>
+                <include name="runtime/modelTests.jar"/>
+                <include name="runtime/javaTests.jar"/>
+            </fileset>
+        </copy>
+    </target>
+</project>
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/build/wsBuild.xml b/tests/org.eclipse.jst.j2ee.core.tests/build/wsBuild.xml
new file mode 100644
index 0000000..bb53885
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/build/wsBuild.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0"?>
+<!DOCTYPE project [
+	<!ENTITY baseBuild SYSTEM "file:../../wsBuildDef.xml">
+]>
+
+<project name="buildPlugin" default="build" basedir="./..">
+
+<!-- include the common xml build file -->
+&baseBuild;
+
+<target name="build" depends="prepare" if="plugin.id">
+
+    <antcall target="unzipsrcjar"> <param name="jarname" value="commonArchiveTests"/> </antcall>
+    <antcall target="unzipsrcjar"> <param name="jarname" value="modelTests"/> </antcall>
+    <antcall target="unzipsrcjar"> <param name="jarname" value="javaTests"/> </antcall>
+
+    <mkdir dir= "${plugin.build.directory}/commonbld"/>
+    <javac failonerror="false" destdir="${plugin.build.directory}/commonbld" includeAntRuntime="false">
+        <src path="${plugin.src.directory}/commonArchiveTests"/>
+        <src path="${plugin.src.directory}/modelTests"/>
+        <src path="${plugin.src.directory}/javaTests"/>
+        <bootclasspath path="${bootclasspath}"/>
+        <classpath path="${plugin.classpath}"/>
+    </javac>
+
+	<antcall target="buildjar">
+		<param name="jarname" value="commonArchiveTests"/>
+		<param name="jarclasspath" value="${plugin.classpath};${plugin.build.directory}/commonbld"/>
+	</antcall>
+	<antcall target="buildjar">
+		<param name="jarname" value="modelTests"/>
+		<param name="jarclasspath" value="${plugin.classpath};${plugin.build.directory}/commonbld"/>
+	</antcall>
+	<antcall target="buildjar">
+		<param name="jarname" value="javaTests"/>
+		<param name="jarclasspath" value="${plugin.classpath};${plugin.build.directory}/commonbld"/>
+	</antcall>
+
+</target>
+</project>
+
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/.cvsignore b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/.cvsignore
new file mode 100644
index 0000000..09178ee
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/.cvsignore
@@ -0,0 +1,2 @@
+bin
+testOutput
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/EMFTestNoID/application-client.xml b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/EMFTestNoID/application-client.xml
new file mode 100644
index 0000000..8796e23
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/EMFTestNoID/application-client.xml
@@ -0,0 +1,142 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE application-client PUBLIC "-//Sun Microsystems, Inc.//DTD J2EE Application Client 1.3//EN" "http://java.sun.com/dtd/application-client_1_3.dtd">
+
+   <application-client id="Application-client_ID">
+      <icon>
+         <small-icon>smallIcon_0</small-icon>
+         <large-icon>largeIcon_0</large-icon>
+      </icon>
+      <display-name>displayName_0</display-name>
+      <description>description_0</description>
+      <env-entry>
+         <description>description_0</description>
+         <env-entry-name>name_0</env-entry-name>
+         <env-entry-type>java.lang.String</env-entry-type>
+         <env-entry-value>value_0</env-entry-value>
+      </env-entry>
+      <env-entry>
+         <description>description_1</description>
+         <env-entry-name>name_1</env-entry-name>
+         <env-entry-type>java.lang.Integer</env-entry-type>
+         <env-entry-value>value_1</env-entry-value>
+      </env-entry>
+      <env-entry>
+         <description>description_2</description>
+         <env-entry-name>name_2</env-entry-name>
+         <env-entry-type>java.lang.Boolean</env-entry-type>
+         <env-entry-value>value_2</env-entry-value>
+      </env-entry>
+      <env-entry>
+         <description>description_3</description>
+         <env-entry-name>name_3</env-entry-name>
+         <env-entry-type>java.lang.Double</env-entry-type>
+         <env-entry-value>value_3</env-entry-value>
+      </env-entry>
+      <env-entry>
+         <description>description_4</description>
+         <env-entry-name>name_4</env-entry-name>
+         <env-entry-type>java.lang.Byte</env-entry-type>
+         <env-entry-value>value_4</env-entry-value>
+      </env-entry>
+      <ejb-ref>
+         <description>description_0</description>
+         <ejb-ref-name>name_0</ejb-ref-name>
+         <ejb-ref-type>Session</ejb-ref-type>
+         <home>home_0</home>
+         <remote>remote_0</remote>
+         <ejb-link>link_0</ejb-link>
+      </ejb-ref>
+      <ejb-ref>
+         <description>description_1</description>
+         <ejb-ref-name>name_1</ejb-ref-name>
+         <ejb-ref-type>Entity</ejb-ref-type>
+         <home>home_1</home>
+         <remote>remote_1</remote>
+         <ejb-link>link_1</ejb-link>
+      </ejb-ref>
+      <ejb-ref>
+         <description>description_2</description>
+         <ejb-ref-name>name_2</ejb-ref-name>
+         <ejb-ref-type>Session</ejb-ref-type>
+         <home>home_2</home>
+         <remote>remote_2</remote>
+         <ejb-link>link_2</ejb-link>
+      </ejb-ref>
+      <ejb-ref>
+         <description>description_3</description>
+         <ejb-ref-name>name_3</ejb-ref-name>
+         <ejb-ref-type>Entity</ejb-ref-type>
+         <home>home_3</home>
+         <remote>remote_3</remote>
+         <ejb-link>link_3</ejb-link>
+      </ejb-ref>
+      <ejb-ref>
+         <description>description_4</description>
+         <ejb-ref-name>name_4</ejb-ref-name>
+         <ejb-ref-type>Session</ejb-ref-type>
+         <home>home_4</home>
+         <remote>remote_4</remote>
+         <ejb-link>link_4</ejb-link>
+      </ejb-ref>
+      <resource-ref>
+         <description>description_0</description>
+         <res-ref-name>name_0</res-ref-name>
+         <res-type>type_0</res-type>
+         <res-auth>Container</res-auth>
+         <res-sharing-scope>Shareable</res-sharing-scope>
+      </resource-ref>
+      <resource-ref>
+         <description>description_1</description>
+         <res-ref-name>name_1</res-ref-name>
+         <res-type>type_1</res-type>
+         <res-auth>Application</res-auth>
+         <res-sharing-scope>Unshareable</res-sharing-scope>
+      </resource-ref>
+      <resource-ref>
+         <description>description_2</description>
+         <res-ref-name>name_2</res-ref-name>
+         <res-type>type_2</res-type>
+         <res-auth>Container</res-auth>
+         <res-sharing-scope>Shareable</res-sharing-scope>
+      </resource-ref>
+      <resource-ref>
+         <description>description_3</description>
+         <res-ref-name>name_3</res-ref-name>
+         <res-type>type_3</res-type>
+         <res-auth>Application</res-auth>
+         <res-sharing-scope>Unshareable</res-sharing-scope>
+      </resource-ref>
+      <resource-ref>
+         <description>description_4</description>
+         <res-ref-name>name_4</res-ref-name>
+         <res-type>type_4</res-type>
+         <res-auth>Container</res-auth>
+         <res-sharing-scope>Shareable</res-sharing-scope>
+      </resource-ref>
+      <resource-env-ref>
+         <description>description_0</description>
+         <resource-env-ref-name>name_0</resource-env-ref-name>
+         <resource-env-ref-type>java.util.HashTable</resource-env-ref-type>
+      </resource-env-ref>
+      <resource-env-ref>
+         <description>description_1</description>
+         <resource-env-ref-name>name_1</resource-env-ref-name>
+         <resource-env-ref-type>java.util.List</resource-env-ref-type>
+      </resource-env-ref>
+      <resource-env-ref>
+         <description>description_2</description>
+         <resource-env-ref-name>name_2</resource-env-ref-name>
+         <resource-env-ref-type>java.sql.Data</resource-env-ref-type>
+      </resource-env-ref>
+      <resource-env-ref>
+         <description>description_3</description>
+         <resource-env-ref-name>name_3</resource-env-ref-name>
+         <resource-env-ref-type>java.lang.Integer</resource-env-ref-type>
+      </resource-env-ref>
+      <resource-env-ref>
+         <description>description_4</description>
+         <resource-env-ref-name>name_4</resource-env-ref-name>
+         <resource-env-ref-type>java.lang.String</resource-env-ref-type>
+      </resource-env-ref>
+      <callback-handler>java.util.HashTable</callback-handler>
+   </application-client>
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/EMFTestNoID/application.xml b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/EMFTestNoID/application.xml
new file mode 100644
index 0000000..dbe7745
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/EMFTestNoID/application.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE application PUBLIC "-//Sun Microsystems, Inc.//DTD J2EE Application 1.3//EN" "http://java.sun.com/dtd/application_1_3.dtd">
+
+   <application id="Application_ID">
+      <icon>
+         <small-icon>smallIcon_0</small-icon>
+         <large-icon>largeIcon_0</large-icon>
+      </icon>
+      <display-name>displayName_0</display-name>
+      <description>description_0</description>
+      <module>
+         <java>uri_0</java>
+         <alt-dd>altDD_0</alt-dd>
+      </module>
+      <module>
+         <ejb>uri_0</ejb>
+         <alt-dd>altDD_0</alt-dd>
+      </module>
+      <module>
+         <web>
+            <web-uri>uri_0</web-uri>
+            <context-root>contextRoot_0</context-root>
+         </web>
+         <alt-dd>altDD_0</alt-dd>
+      </module>
+      <module>
+         <connector>uri_0</connector>
+         <alt-dd>altDD_0</alt-dd>
+      </module>
+      <module>
+         <java>uri_1</java>
+         <alt-dd>altDD_1</alt-dd>
+      </module>
+      <security-role>
+         <description>description_0</description>
+         <role-name>roleName_0</role-name>
+      </security-role>
+      <security-role>
+         <description>description_1</description>
+         <role-name>roleName_1</role-name>
+      </security-role>
+      <security-role>
+         <description>description_2</description>
+         <role-name>roleName_2</role-name>
+      </security-role>
+      <security-role>
+         <description>description_3</description>
+         <role-name>roleName_3</role-name>
+      </security-role>
+      <security-role>
+         <description>description_4</description>
+         <role-name>roleName_4</role-name>
+      </security-role>
+   </application>
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/EMFTestNoID/ejb-jar.xml b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/EMFTestNoID/ejb-jar.xml
new file mode 100644
index 0000000..739d68d
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/EMFTestNoID/ejb-jar.xml
@@ -0,0 +1,2869 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd">
+
+   <ejb-jar id="ejb-jar_ID">
+      <description>description_0</description>
+      <display-name>displayName_0</display-name>
+      <small-icon>smallIcon_0</small-icon>
+      <large-icon>largeIcon_0</large-icon>
+      <enterprise-beans>
+         <entity>
+            <description>description_0</description>
+            <display-name>displayName_0</display-name>
+            <small-icon>smallIcon_0</small-icon>
+            <large-icon>largeIcon_0</large-icon>
+            <ejb-name>name_0</ejb-name>
+            <home>java.util.HashTable</home>
+            <remote>java.util.HashTable</remote>
+            <local-home>java.util.HashTable</local-home>
+            <local>java.util.HashTable</local>
+            <ejb-class>java.util.HashTable</ejb-class>
+            <persistence-type>Bean</persistence-type>
+            <prim-key-class>java.util.HashTable</prim-key-class>
+            <reentrant>True</reentrant>
+            <env-entry>
+               <description>description_0</description>
+               <env-entry-name>name_0</env-entry-name>
+               <env-entry-type>java.lang.String</env-entry-type>
+               <env-entry-value>value_0</env-entry-value>
+            </env-entry>
+            <env-entry>
+               <description>description_1</description>
+               <env-entry-name>name_1</env-entry-name>
+               <env-entry-type>java.lang.Integer</env-entry-type>
+               <env-entry-value>value_1</env-entry-value>
+            </env-entry>
+            <env-entry>
+               <description>description_2</description>
+               <env-entry-name>name_2</env-entry-name>
+               <env-entry-type>java.lang.Boolean</env-entry-type>
+               <env-entry-value>value_2</env-entry-value>
+            </env-entry>
+            <env-entry>
+               <description>description_3</description>
+               <env-entry-name>name_3</env-entry-name>
+               <env-entry-type>java.lang.Double</env-entry-type>
+               <env-entry-value>value_3</env-entry-value>
+            </env-entry>
+            <env-entry>
+               <description>description_4</description>
+               <env-entry-name>name_4</env-entry-name>
+               <env-entry-type>java.lang.Byte</env-entry-type>
+               <env-entry-value>value_4</env-entry-value>
+            </env-entry>
+            <ejb-ref>
+               <description>description_0</description>
+               <ejb-ref-name>name_0</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <home>home_0</home>
+               <remote>remote_0</remote>
+               <ejb-link>link_0</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+               <description>description_1</description>
+               <ejb-ref-name>name_1</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <home>home_1</home>
+               <remote>remote_1</remote>
+               <ejb-link>link_1</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+               <description>description_2</description>
+               <ejb-ref-name>name_2</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <home>home_2</home>
+               <remote>remote_2</remote>
+               <ejb-link>link_2</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+               <description>description_3</description>
+               <ejb-ref-name>name_3</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <home>home_3</home>
+               <remote>remote_3</remote>
+               <ejb-link>link_3</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+               <description>description_4</description>
+               <ejb-ref-name>name_4</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <home>home_4</home>
+               <remote>remote_4</remote>
+               <ejb-link>link_4</ejb-link>
+            </ejb-ref>
+            <ejb-local-ref>
+               <description>description_0</description>
+               <ejb-ref-name>name_0</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <local-home>home_0</local-home>
+               <local>remote_0</local>
+               <ejb-link>link_0</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+               <description>description_1</description>
+               <ejb-ref-name>name_1</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <local-home>home_1</local-home>
+               <local>remote_1</local>
+               <ejb-link>link_1</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+               <description>description_2</description>
+               <ejb-ref-name>name_2</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <local-home>home_2</local-home>
+               <local>remote_2</local>
+               <ejb-link>link_2</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+               <description>description_3</description>
+               <ejb-ref-name>name_3</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <local-home>home_3</local-home>
+               <local>remote_3</local>
+               <ejb-link>link_3</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+               <description>description_4</description>
+               <ejb-ref-name>name_4</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <local-home>home_4</local-home>
+               <local>remote_4</local>
+               <ejb-link>link_4</ejb-link>
+            </ejb-local-ref>
+            <security-role-ref>
+               <description>description_0</description>
+               <role-name>name_0</role-name>
+               <role-link>link_0</role-link>
+            </security-role-ref>
+            <security-role-ref>
+               <description>description_1</description>
+               <role-name>name_1</role-name>
+               <role-link>link_1</role-link>
+            </security-role-ref>
+            <security-role-ref>
+               <description>description_2</description>
+               <role-name>name_2</role-name>
+               <role-link>link_2</role-link>
+            </security-role-ref>
+            <security-role-ref>
+               <description>description_3</description>
+               <role-name>name_3</role-name>
+               <role-link>link_3</role-link>
+            </security-role-ref>
+            <security-role-ref>
+               <description>description_4</description>
+               <role-name>name_4</role-name>
+               <role-link>link_4</role-link>
+            </security-role-ref>
+            <security-identity>
+               <description>description_0</description>
+               <run-as>
+                  <description>description_0</description>
+                  <role-name>roleName_0</role-name>
+               </run-as>
+            </security-identity>
+            <resource-ref>
+               <description>description_0</description>
+               <res-ref-name>name_0</res-ref-name>
+               <res-type>type_0</res-type>
+               <res-auth>Container</res-auth>
+               <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+               <description>description_1</description>
+               <res-ref-name>name_1</res-ref-name>
+               <res-type>type_1</res-type>
+               <res-auth>Application</res-auth>
+               <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+               <description>description_2</description>
+               <res-ref-name>name_2</res-ref-name>
+               <res-type>type_2</res-type>
+               <res-auth>Container</res-auth>
+               <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+               <description>description_3</description>
+               <res-ref-name>name_3</res-ref-name>
+               <res-type>type_3</res-type>
+               <res-auth>Application</res-auth>
+               <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+               <description>description_4</description>
+               <res-ref-name>name_4</res-ref-name>
+               <res-type>type_4</res-type>
+               <res-auth>Container</res-auth>
+               <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-env-ref>
+               <description>description_0</description>
+               <resource-env-ref-name>name_0</resource-env-ref-name>
+               <resource-env-ref-type>java.util.HashTable</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+               <description>description_1</description>
+               <resource-env-ref-name>name_1</resource-env-ref-name>
+               <resource-env-ref-type>java.util.List</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+               <description>description_2</description>
+               <resource-env-ref-name>name_2</resource-env-ref-name>
+               <resource-env-ref-type>java.sql.Data</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+               <description>description_3</description>
+               <resource-env-ref-name>name_3</resource-env-ref-name>
+               <resource-env-ref-type>java.lang.Integer</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+               <description>description_4</description>
+               <resource-env-ref-name>name_4</resource-env-ref-name>
+               <resource-env-ref-type>java.lang.String</resource-env-ref-type>
+            </resource-env-ref>
+         </entity>
+         <entity>
+            <description>description_1</description>
+            <display-name>displayName_1</display-name>
+            <small-icon>smallIcon_1</small-icon>
+            <large-icon>largeIcon_1</large-icon>
+            <ejb-name>name_1</ejb-name>
+            <home>java.util.List</home>
+            <remote>java.util.List</remote>
+            <local-home>java.util.List</local-home>
+            <local>java.util.List</local>
+            <ejb-class>java.util.List</ejb-class>
+            <persistence-type>Bean</persistence-type>
+            <prim-key-class>java.util.List</prim-key-class>
+            <reentrant>False</reentrant>
+            <env-entry>
+               <description>description_5</description>
+               <env-entry-name>name_5</env-entry-name>
+               <env-entry-type>java.lang.Short</env-entry-type>
+               <env-entry-value>value_5</env-entry-value>
+            </env-entry>
+            <env-entry>
+               <description>description_6</description>
+               <env-entry-name>name_6</env-entry-name>
+               <env-entry-type>java.lang.Long</env-entry-type>
+               <env-entry-value>value_6</env-entry-value>
+            </env-entry>
+            <env-entry>
+               <description>description_7</description>
+               <env-entry-name>name_7</env-entry-name>
+               <env-entry-type>java.lang.Float</env-entry-type>
+               <env-entry-value>value_7</env-entry-value>
+            </env-entry>
+            <env-entry>
+               <description>description_8</description>
+               <env-entry-name>name_8</env-entry-name>
+               <env-entry-type>java.lang.Character</env-entry-type>
+               <env-entry-value>value_8</env-entry-value>
+            </env-entry>
+            <env-entry>
+               <description>description_9</description>
+               <env-entry-name>name_9</env-entry-name>
+               <env-entry-type>java.lang.String</env-entry-type>
+               <env-entry-value>value_9</env-entry-value>
+            </env-entry>
+            <ejb-ref>
+               <description>description_5</description>
+               <ejb-ref-name>name_5</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <home>home_5</home>
+               <remote>remote_5</remote>
+               <ejb-link>link_5</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+               <description>description_6</description>
+               <ejb-ref-name>name_6</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <home>home_6</home>
+               <remote>remote_6</remote>
+               <ejb-link>link_6</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+               <description>description_7</description>
+               <ejb-ref-name>name_7</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <home>home_7</home>
+               <remote>remote_7</remote>
+               <ejb-link>link_7</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+               <description>description_8</description>
+               <ejb-ref-name>name_8</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <home>home_8</home>
+               <remote>remote_8</remote>
+               <ejb-link>link_8</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+               <description>description_9</description>
+               <ejb-ref-name>name_9</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <home>home_9</home>
+               <remote>remote_9</remote>
+               <ejb-link>link_9</ejb-link>
+            </ejb-ref>
+            <ejb-local-ref>
+               <description>description_5</description>
+               <ejb-ref-name>name_5</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <local-home>home_5</local-home>
+               <local>remote_5</local>
+               <ejb-link>link_5</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+               <description>description_6</description>
+               <ejb-ref-name>name_6</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <local-home>home_6</local-home>
+               <local>remote_6</local>
+               <ejb-link>link_6</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+               <description>description_7</description>
+               <ejb-ref-name>name_7</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <local-home>home_7</local-home>
+               <local>remote_7</local>
+               <ejb-link>link_7</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+               <description>description_8</description>
+               <ejb-ref-name>name_8</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <local-home>home_8</local-home>
+               <local>remote_8</local>
+               <ejb-link>link_8</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+               <description>description_9</description>
+               <ejb-ref-name>name_9</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <local-home>home_9</local-home>
+               <local>remote_9</local>
+               <ejb-link>link_9</ejb-link>
+            </ejb-local-ref>
+            <security-role-ref>
+               <description>description_5</description>
+               <role-name>name_5</role-name>
+               <role-link>link_5</role-link>
+            </security-role-ref>
+            <security-role-ref>
+               <description>description_6</description>
+               <role-name>name_6</role-name>
+               <role-link>link_6</role-link>
+            </security-role-ref>
+            <security-role-ref>
+               <description>description_7</description>
+               <role-name>name_7</role-name>
+               <role-link>link_7</role-link>
+            </security-role-ref>
+            <security-role-ref>
+               <description>description_8</description>
+               <role-name>name_8</role-name>
+               <role-link>link_8</role-link>
+            </security-role-ref>
+            <security-role-ref>
+               <description>description_9</description>
+               <role-name>name_9</role-name>
+               <role-link>link_9</role-link>
+            </security-role-ref>
+            <security-identity>
+               <description>description_0</description>
+               <use-caller-identity></use-caller-identity>
+            </security-identity>
+            <resource-ref>
+               <description>description_5</description>
+               <res-ref-name>name_5</res-ref-name>
+               <res-type>type_5</res-type>
+               <res-auth>Application</res-auth>
+               <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+               <description>description_6</description>
+               <res-ref-name>name_6</res-ref-name>
+               <res-type>type_6</res-type>
+               <res-auth>Container</res-auth>
+               <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+               <description>description_7</description>
+               <res-ref-name>name_7</res-ref-name>
+               <res-type>type_7</res-type>
+               <res-auth>Application</res-auth>
+               <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+               <description>description_8</description>
+               <res-ref-name>name_8</res-ref-name>
+               <res-type>type_8</res-type>
+               <res-auth>Container</res-auth>
+               <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+               <description>description_9</description>
+               <res-ref-name>name_9</res-ref-name>
+               <res-type>type_9</res-type>
+               <res-auth>Application</res-auth>
+               <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-env-ref>
+               <description>description_5</description>
+               <resource-env-ref-name>name_5</resource-env-ref-name>
+               <resource-env-ref-type>java.util.HashTable</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+               <description>description_6</description>
+               <resource-env-ref-name>name_6</resource-env-ref-name>
+               <resource-env-ref-type>java.util.List</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+               <description>description_7</description>
+               <resource-env-ref-name>name_7</resource-env-ref-name>
+               <resource-env-ref-type>java.sql.Data</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+               <description>description_8</description>
+               <resource-env-ref-name>name_8</resource-env-ref-name>
+               <resource-env-ref-type>java.lang.Integer</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+               <description>description_9</description>
+               <resource-env-ref-name>name_9</resource-env-ref-name>
+               <resource-env-ref-type>java.lang.String</resource-env-ref-type>
+            </resource-env-ref>
+         </entity>
+         <entity>
+            <description>description_0</description>
+            <display-name>displayName_0</display-name>
+            <small-icon>smallIcon_0</small-icon>
+            <large-icon>largeIcon_0</large-icon>
+            <ejb-name>name_2</ejb-name>
+            <home>java.util.HashTable</home>
+            <remote>java.util.HashTable</remote>
+            <local-home>java.util.HashTable</local-home>
+            <local>java.util.HashTable</local>
+            <ejb-class>java.util.HashTable</ejb-class>
+            <persistence-type>Container</persistence-type>
+            <prim-key-class>java.util.HashTable</prim-key-class>
+            <reentrant>True</reentrant>
+            <cmp-version>2.x</cmp-version>
+            <abstract-schema-name>abstractSchemaName_0</abstract-schema-name>
+            <cmp-field>
+               <field-name>name_0</field-name>
+            </cmp-field>
+            <cmp-field>
+               <field-name>name_1</field-name>
+            </cmp-field>
+            <cmp-field>
+               <field-name>name_2</field-name>
+            </cmp-field>
+            <cmp-field>
+               <field-name>name_3</field-name>
+            </cmp-field>
+            <cmp-field>
+               <field-name>name_4</field-name>
+            </cmp-field>
+            <primkey-field>name_0</primkey-field>
+            <env-entry>
+               <description>description_10</description>
+               <env-entry-name>name_10</env-entry-name>
+               <env-entry-type>java.lang.Integer</env-entry-type>
+               <env-entry-value>value_10</env-entry-value>
+            </env-entry>
+            <env-entry>
+               <description>description_11</description>
+               <env-entry-name>name_11</env-entry-name>
+               <env-entry-type>java.lang.Boolean</env-entry-type>
+               <env-entry-value>value_11</env-entry-value>
+            </env-entry>
+            <env-entry>
+               <description>description_12</description>
+               <env-entry-name>name_12</env-entry-name>
+               <env-entry-type>java.lang.Double</env-entry-type>
+               <env-entry-value>value_12</env-entry-value>
+            </env-entry>
+            <env-entry>
+               <description>description_13</description>
+               <env-entry-name>name_13</env-entry-name>
+               <env-entry-type>java.lang.Byte</env-entry-type>
+               <env-entry-value>value_13</env-entry-value>
+            </env-entry>
+            <env-entry>
+               <description>description_14</description>
+               <env-entry-name>name_14</env-entry-name>
+               <env-entry-type>java.lang.Short</env-entry-type>
+               <env-entry-value>value_14</env-entry-value>
+            </env-entry>
+            <ejb-ref>
+               <description>description_10</description>
+               <ejb-ref-name>name_10</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <home>home_10</home>
+               <remote>remote_10</remote>
+               <ejb-link>link_10</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+               <description>description_11</description>
+               <ejb-ref-name>name_11</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <home>home_11</home>
+               <remote>remote_11</remote>
+               <ejb-link>link_11</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+               <description>description_12</description>
+               <ejb-ref-name>name_12</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <home>home_12</home>
+               <remote>remote_12</remote>
+               <ejb-link>link_12</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+               <description>description_13</description>
+               <ejb-ref-name>name_13</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <home>home_13</home>
+               <remote>remote_13</remote>
+               <ejb-link>link_13</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+               <description>description_14</description>
+               <ejb-ref-name>name_14</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <home>home_14</home>
+               <remote>remote_14</remote>
+               <ejb-link>link_14</ejb-link>
+            </ejb-ref>
+            <ejb-local-ref>
+               <description>description_10</description>
+               <ejb-ref-name>name_10</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <local-home>home_10</local-home>
+               <local>remote_10</local>
+               <ejb-link>link_10</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+               <description>description_11</description>
+               <ejb-ref-name>name_11</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <local-home>home_11</local-home>
+               <local>remote_11</local>
+               <ejb-link>link_11</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+               <description>description_12</description>
+               <ejb-ref-name>name_12</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <local-home>home_12</local-home>
+               <local>remote_12</local>
+               <ejb-link>link_12</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+               <description>description_13</description>
+               <ejb-ref-name>name_13</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <local-home>home_13</local-home>
+               <local>remote_13</local>
+               <ejb-link>link_13</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+               <description>description_14</description>
+               <ejb-ref-name>name_14</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <local-home>home_14</local-home>
+               <local>remote_14</local>
+               <ejb-link>link_14</ejb-link>
+            </ejb-local-ref>
+            <security-role-ref>
+               <description>description_10</description>
+               <role-name>name_10</role-name>
+               <role-link>link_10</role-link>
+            </security-role-ref>
+            <security-role-ref>
+               <description>description_11</description>
+               <role-name>name_11</role-name>
+               <role-link>link_11</role-link>
+            </security-role-ref>
+            <security-role-ref>
+               <description>description_12</description>
+               <role-name>name_12</role-name>
+               <role-link>link_12</role-link>
+            </security-role-ref>
+            <security-role-ref>
+               <description>description_13</description>
+               <role-name>name_13</role-name>
+               <role-link>link_13</role-link>
+            </security-role-ref>
+            <security-role-ref>
+               <description>description_14</description>
+               <role-name>name_14</role-name>
+               <role-link>link_14</role-link>
+            </security-role-ref>
+            <security-identity>
+               <description>description_1</description>
+               <run-as>
+                  <description>description_1</description>
+                  <role-name>roleName_1</role-name>
+               </run-as>
+            </security-identity>
+            <resource-ref>
+               <description>description_10</description>
+               <res-ref-name>name_10</res-ref-name>
+               <res-type>type_10</res-type>
+               <res-auth>Container</res-auth>
+               <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+               <description>description_11</description>
+               <res-ref-name>name_11</res-ref-name>
+               <res-type>type_11</res-type>
+               <res-auth>Application</res-auth>
+               <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+               <description>description_12</description>
+               <res-ref-name>name_12</res-ref-name>
+               <res-type>type_12</res-type>
+               <res-auth>Container</res-auth>
+               <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+               <description>description_13</description>
+               <res-ref-name>name_13</res-ref-name>
+               <res-type>type_13</res-type>
+               <res-auth>Application</res-auth>
+               <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+               <description>description_14</description>
+               <res-ref-name>name_14</res-ref-name>
+               <res-type>type_14</res-type>
+               <res-auth>Container</res-auth>
+               <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-env-ref>
+               <description>description_10</description>
+               <resource-env-ref-name>name_10</resource-env-ref-name>
+               <resource-env-ref-type>java.util.HashTable</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+               <description>description_11</description>
+               <resource-env-ref-name>name_11</resource-env-ref-name>
+               <resource-env-ref-type>java.util.List</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+               <description>description_12</description>
+               <resource-env-ref-name>name_12</resource-env-ref-name>
+               <resource-env-ref-type>java.sql.Data</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+               <description>description_13</description>
+               <resource-env-ref-name>name_13</resource-env-ref-name>
+               <resource-env-ref-type>java.lang.Integer</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+               <description>description_14</description>
+               <resource-env-ref-name>name_14</resource-env-ref-name>
+               <resource-env-ref-type>java.lang.String</resource-env-ref-type>
+            </resource-env-ref>
+            <query>
+               <description>description_0</description>
+               <query-method>
+                  <method-name>name_0</method-name>
+                  <method-params></method-params>
+               </query-method>
+               <result-type-mapping>Remote</result-type-mapping>
+               <ejb-ql>ejbQL_0</ejb-ql>
+            </query>
+            <query>
+               <description>description_1</description>
+               <query-method>
+                  <method-name>name_1</method-name>
+                  <method-params>
+                     <method-param>parms_0</method-param>
+                  </method-params>
+               </query-method>
+               <result-type-mapping>Local</result-type-mapping>
+               <ejb-ql>ejbQL_1</ejb-ql>
+            </query>
+            <query>
+               <description>description_2</description>
+               <query-method>
+                  <method-name>name_2</method-name>
+                  <method-params>
+                     <method-param>parms_1</method-param>
+                     <method-param>parms_2</method-param>
+                  </method-params>
+               </query-method>
+               <result-type-mapping>Remote</result-type-mapping>
+               <ejb-ql>ejbQL_2</ejb-ql>
+            </query>
+            <query>
+               <description>description_3</description>
+               <query-method>
+                  <method-name>name_3</method-name>
+                  <method-params>
+                     <method-param>parms_3</method-param>
+                     <method-param>parms_4</method-param>
+                     <method-param>parms_5</method-param>
+                  </method-params>
+               </query-method>
+               <result-type-mapping>Local</result-type-mapping>
+               <ejb-ql>ejbQL_3</ejb-ql>
+            </query>
+            <query>
+               <description>description_4</description>
+               <query-method>
+                  <method-name>name_4</method-name>
+                  <method-params></method-params>
+               </query-method>
+               <result-type-mapping>Remote</result-type-mapping>
+               <ejb-ql>ejbQL_4</ejb-ql>
+            </query>
+         </entity>
+         <session>
+            <description>description_0</description>
+            <display-name>displayName_0</display-name>
+            <small-icon>smallIcon_0</small-icon>
+            <large-icon>largeIcon_0</large-icon>
+            <ejb-name>name_3</ejb-name>
+            <home>java.util.HashTable</home>
+            <remote>java.util.HashTable</remote>
+            <local-home>java.util.HashTable</local-home>
+            <local>java.util.HashTable</local>
+            <ejb-class>java.util.HashTable</ejb-class>
+            <session-type>Stateful</session-type>
+            <transaction-type>Bean</transaction-type>
+            <env-entry>
+               <description>description_15</description>
+               <env-entry-name>name_15</env-entry-name>
+               <env-entry-type>java.lang.Long</env-entry-type>
+               <env-entry-value>value_15</env-entry-value>
+            </env-entry>
+            <env-entry>
+               <description>description_16</description>
+               <env-entry-name>name_16</env-entry-name>
+               <env-entry-type>java.lang.Float</env-entry-type>
+               <env-entry-value>value_16</env-entry-value>
+            </env-entry>
+            <env-entry>
+               <description>description_17</description>
+               <env-entry-name>name_17</env-entry-name>
+               <env-entry-type>java.lang.Character</env-entry-type>
+               <env-entry-value>value_17</env-entry-value>
+            </env-entry>
+            <env-entry>
+               <description>description_18</description>
+               <env-entry-name>name_18</env-entry-name>
+               <env-entry-type>java.lang.String</env-entry-type>
+               <env-entry-value>value_18</env-entry-value>
+            </env-entry>
+            <env-entry>
+               <description>description_19</description>
+               <env-entry-name>name_19</env-entry-name>
+               <env-entry-type>java.lang.Integer</env-entry-type>
+               <env-entry-value>value_19</env-entry-value>
+            </env-entry>
+            <ejb-ref>
+               <description>description_15</description>
+               <ejb-ref-name>name_15</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <home>home_15</home>
+               <remote>remote_15</remote>
+               <ejb-link>link_15</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+               <description>description_16</description>
+               <ejb-ref-name>name_16</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <home>home_16</home>
+               <remote>remote_16</remote>
+               <ejb-link>link_16</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+               <description>description_17</description>
+               <ejb-ref-name>name_17</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <home>home_17</home>
+               <remote>remote_17</remote>
+               <ejb-link>link_17</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+               <description>description_18</description>
+               <ejb-ref-name>name_18</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <home>home_18</home>
+               <remote>remote_18</remote>
+               <ejb-link>link_18</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+               <description>description_19</description>
+               <ejb-ref-name>name_19</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <home>home_19</home>
+               <remote>remote_19</remote>
+               <ejb-link>link_19</ejb-link>
+            </ejb-ref>
+            <ejb-local-ref>
+               <description>description_15</description>
+               <ejb-ref-name>name_15</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <local-home>home_15</local-home>
+               <local>remote_15</local>
+               <ejb-link>link_15</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+               <description>description_16</description>
+               <ejb-ref-name>name_16</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <local-home>home_16</local-home>
+               <local>remote_16</local>
+               <ejb-link>link_16</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+               <description>description_17</description>
+               <ejb-ref-name>name_17</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <local-home>home_17</local-home>
+               <local>remote_17</local>
+               <ejb-link>link_17</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+               <description>description_18</description>
+               <ejb-ref-name>name_18</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <local-home>home_18</local-home>
+               <local>remote_18</local>
+               <ejb-link>link_18</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+               <description>description_19</description>
+               <ejb-ref-name>name_19</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <local-home>home_19</local-home>
+               <local>remote_19</local>
+               <ejb-link>link_19</ejb-link>
+            </ejb-local-ref>
+            <security-role-ref>
+               <description>description_15</description>
+               <role-name>name_15</role-name>
+               <role-link>link_15</role-link>
+            </security-role-ref>
+            <security-role-ref>
+               <description>description_16</description>
+               <role-name>name_16</role-name>
+               <role-link>link_16</role-link>
+            </security-role-ref>
+            <security-role-ref>
+               <description>description_17</description>
+               <role-name>name_17</role-name>
+               <role-link>link_17</role-link>
+            </security-role-ref>
+            <security-role-ref>
+               <description>description_18</description>
+               <role-name>name_18</role-name>
+               <role-link>link_18</role-link>
+            </security-role-ref>
+            <security-role-ref>
+               <description>description_19</description>
+               <role-name>name_19</role-name>
+               <role-link>link_19</role-link>
+            </security-role-ref>
+            <security-identity>
+               <description>description_1</description>
+               <use-caller-identity></use-caller-identity>
+            </security-identity>
+            <resource-ref>
+               <description>description_15</description>
+               <res-ref-name>name_15</res-ref-name>
+               <res-type>type_15</res-type>
+               <res-auth>Application</res-auth>
+               <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+               <description>description_16</description>
+               <res-ref-name>name_16</res-ref-name>
+               <res-type>type_16</res-type>
+               <res-auth>Container</res-auth>
+               <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+               <description>description_17</description>
+               <res-ref-name>name_17</res-ref-name>
+               <res-type>type_17</res-type>
+               <res-auth>Application</res-auth>
+               <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+               <description>description_18</description>
+               <res-ref-name>name_18</res-ref-name>
+               <res-type>type_18</res-type>
+               <res-auth>Container</res-auth>
+               <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+               <description>description_19</description>
+               <res-ref-name>name_19</res-ref-name>
+               <res-type>type_19</res-type>
+               <res-auth>Application</res-auth>
+               <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-env-ref>
+               <description>description_15</description>
+               <resource-env-ref-name>name_15</resource-env-ref-name>
+               <resource-env-ref-type>java.util.HashTable</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+               <description>description_16</description>
+               <resource-env-ref-name>name_16</resource-env-ref-name>
+               <resource-env-ref-type>java.util.List</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+               <description>description_17</description>
+               <resource-env-ref-name>name_17</resource-env-ref-name>
+               <resource-env-ref-type>java.sql.Data</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+               <description>description_18</description>
+               <resource-env-ref-name>name_18</resource-env-ref-name>
+               <resource-env-ref-type>java.lang.Integer</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+               <description>description_19</description>
+               <resource-env-ref-name>name_19</resource-env-ref-name>
+               <resource-env-ref-type>java.lang.String</resource-env-ref-type>
+            </resource-env-ref>
+         </session>
+         <entity>
+            <description>description_2</description>
+            <display-name>displayName_2</display-name>
+            <small-icon>smallIcon_2</small-icon>
+            <large-icon>largeIcon_2</large-icon>
+            <ejb-name>name_4</ejb-name>
+            <home>java.sql.Data</home>
+            <remote>java.sql.Data</remote>
+            <local-home>java.sql.Data</local-home>
+            <local>java.sql.Data</local>
+            <ejb-class>java.sql.Data</ejb-class>
+            <persistence-type>Bean</persistence-type>
+            <prim-key-class>java.sql.Data</prim-key-class>
+            <reentrant>True</reentrant>
+            <env-entry>
+               <description>description_20</description>
+               <env-entry-name>name_20</env-entry-name>
+               <env-entry-type>java.lang.Boolean</env-entry-type>
+               <env-entry-value>value_20</env-entry-value>
+            </env-entry>
+            <env-entry>
+               <description>description_21</description>
+               <env-entry-name>name_21</env-entry-name>
+               <env-entry-type>java.lang.Double</env-entry-type>
+               <env-entry-value>value_21</env-entry-value>
+            </env-entry>
+            <env-entry>
+               <description>description_22</description>
+               <env-entry-name>name_22</env-entry-name>
+               <env-entry-type>java.lang.Byte</env-entry-type>
+               <env-entry-value>value_22</env-entry-value>
+            </env-entry>
+            <env-entry>
+               <description>description_23</description>
+               <env-entry-name>name_23</env-entry-name>
+               <env-entry-type>java.lang.Short</env-entry-type>
+               <env-entry-value>value_23</env-entry-value>
+            </env-entry>
+            <env-entry>
+               <description>description_24</description>
+               <env-entry-name>name_24</env-entry-name>
+               <env-entry-type>java.lang.Long</env-entry-type>
+               <env-entry-value>value_24</env-entry-value>
+            </env-entry>
+            <ejb-ref>
+               <description>description_20</description>
+               <ejb-ref-name>name_20</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <home>home_20</home>
+               <remote>remote_20</remote>
+               <ejb-link>link_20</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+               <description>description_21</description>
+               <ejb-ref-name>name_21</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <home>home_21</home>
+               <remote>remote_21</remote>
+               <ejb-link>link_21</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+               <description>description_22</description>
+               <ejb-ref-name>name_22</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <home>home_22</home>
+               <remote>remote_22</remote>
+               <ejb-link>link_22</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+               <description>description_23</description>
+               <ejb-ref-name>name_23</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <home>home_23</home>
+               <remote>remote_23</remote>
+               <ejb-link>link_23</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+               <description>description_24</description>
+               <ejb-ref-name>name_24</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <home>home_24</home>
+               <remote>remote_24</remote>
+               <ejb-link>link_24</ejb-link>
+            </ejb-ref>
+            <ejb-local-ref>
+               <description>description_20</description>
+               <ejb-ref-name>name_20</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <local-home>home_20</local-home>
+               <local>remote_20</local>
+               <ejb-link>link_20</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+               <description>description_21</description>
+               <ejb-ref-name>name_21</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <local-home>home_21</local-home>
+               <local>remote_21</local>
+               <ejb-link>link_21</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+               <description>description_22</description>
+               <ejb-ref-name>name_22</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <local-home>home_22</local-home>
+               <local>remote_22</local>
+               <ejb-link>link_22</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+               <description>description_23</description>
+               <ejb-ref-name>name_23</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <local-home>home_23</local-home>
+               <local>remote_23</local>
+               <ejb-link>link_23</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+               <description>description_24</description>
+               <ejb-ref-name>name_24</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <local-home>home_24</local-home>
+               <local>remote_24</local>
+               <ejb-link>link_24</ejb-link>
+            </ejb-local-ref>
+            <security-role-ref>
+               <description>description_20</description>
+               <role-name>name_20</role-name>
+               <role-link>link_20</role-link>
+            </security-role-ref>
+            <security-role-ref>
+               <description>description_21</description>
+               <role-name>name_21</role-name>
+               <role-link>link_21</role-link>
+            </security-role-ref>
+            <security-role-ref>
+               <description>description_22</description>
+               <role-name>name_22</role-name>
+               <role-link>link_22</role-link>
+            </security-role-ref>
+            <security-role-ref>
+               <description>description_23</description>
+               <role-name>name_23</role-name>
+               <role-link>link_23</role-link>
+            </security-role-ref>
+            <security-role-ref>
+               <description>description_24</description>
+               <role-name>name_24</role-name>
+               <role-link>link_24</role-link>
+            </security-role-ref>
+            <security-identity>
+               <description>description_2</description>
+               <run-as>
+                  <description>description_2</description>
+                  <role-name>roleName_2</role-name>
+               </run-as>
+            </security-identity>
+            <resource-ref>
+               <description>description_20</description>
+               <res-ref-name>name_20</res-ref-name>
+               <res-type>type_20</res-type>
+               <res-auth>Container</res-auth>
+               <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+               <description>description_21</description>
+               <res-ref-name>name_21</res-ref-name>
+               <res-type>type_21</res-type>
+               <res-auth>Application</res-auth>
+               <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+               <description>description_22</description>
+               <res-ref-name>name_22</res-ref-name>
+               <res-type>type_22</res-type>
+               <res-auth>Container</res-auth>
+               <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+               <description>description_23</description>
+               <res-ref-name>name_23</res-ref-name>
+               <res-type>type_23</res-type>
+               <res-auth>Application</res-auth>
+               <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+               <description>description_24</description>
+               <res-ref-name>name_24</res-ref-name>
+               <res-type>type_24</res-type>
+               <res-auth>Container</res-auth>
+               <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-env-ref>
+               <description>description_20</description>
+               <resource-env-ref-name>name_20</resource-env-ref-name>
+               <resource-env-ref-type>java.util.HashTable</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+               <description>description_21</description>
+               <resource-env-ref-name>name_21</resource-env-ref-name>
+               <resource-env-ref-type>java.util.List</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+               <description>description_22</description>
+               <resource-env-ref-name>name_22</resource-env-ref-name>
+               <resource-env-ref-type>java.sql.Data</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+               <description>description_23</description>
+               <resource-env-ref-name>name_23</resource-env-ref-name>
+               <resource-env-ref-type>java.lang.Integer</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+               <description>description_24</description>
+               <resource-env-ref-name>name_24</resource-env-ref-name>
+               <resource-env-ref-type>java.lang.String</resource-env-ref-type>
+            </resource-env-ref>
+         </entity>
+         <entity>
+            <description>description_3</description>
+            <display-name>displayName_3</display-name>
+            <small-icon>smallIcon_3</small-icon>
+            <large-icon>largeIcon_3</large-icon>
+            <ejb-name>name_5</ejb-name>
+            <home>java.lang.Integer</home>
+            <remote>java.lang.Integer</remote>
+            <local-home>java.lang.Integer</local-home>
+            <local>java.lang.Integer</local>
+            <ejb-class>java.lang.Integer</ejb-class>
+            <persistence-type>Bean</persistence-type>
+            <prim-key-class>java.lang.Integer</prim-key-class>
+            <reentrant>False</reentrant>
+            <env-entry>
+               <description>description_25</description>
+               <env-entry-name>name_25</env-entry-name>
+               <env-entry-type>java.lang.Float</env-entry-type>
+               <env-entry-value>value_25</env-entry-value>
+            </env-entry>
+            <env-entry>
+               <description>description_26</description>
+               <env-entry-name>name_26</env-entry-name>
+               <env-entry-type>java.lang.Character</env-entry-type>
+               <env-entry-value>value_26</env-entry-value>
+            </env-entry>
+            <env-entry>
+               <description>description_27</description>
+               <env-entry-name>name_27</env-entry-name>
+               <env-entry-type>java.lang.String</env-entry-type>
+               <env-entry-value>value_27</env-entry-value>
+            </env-entry>
+            <env-entry>
+               <description>description_28</description>
+               <env-entry-name>name_28</env-entry-name>
+               <env-entry-type>java.lang.Integer</env-entry-type>
+               <env-entry-value>value_28</env-entry-value>
+            </env-entry>
+            <env-entry>
+               <description>description_29</description>
+               <env-entry-name>name_29</env-entry-name>
+               <env-entry-type>java.lang.Boolean</env-entry-type>
+               <env-entry-value>value_29</env-entry-value>
+            </env-entry>
+            <ejb-ref>
+               <description>description_25</description>
+               <ejb-ref-name>name_25</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <home>home_25</home>
+               <remote>remote_25</remote>
+               <ejb-link>link_25</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+               <description>description_26</description>
+               <ejb-ref-name>name_26</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <home>home_26</home>
+               <remote>remote_26</remote>
+               <ejb-link>link_26</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+               <description>description_27</description>
+               <ejb-ref-name>name_27</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <home>home_27</home>
+               <remote>remote_27</remote>
+               <ejb-link>link_27</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+               <description>description_28</description>
+               <ejb-ref-name>name_28</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <home>home_28</home>
+               <remote>remote_28</remote>
+               <ejb-link>link_28</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+               <description>description_29</description>
+               <ejb-ref-name>name_29</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <home>home_29</home>
+               <remote>remote_29</remote>
+               <ejb-link>link_29</ejb-link>
+            </ejb-ref>
+            <ejb-local-ref>
+               <description>description_25</description>
+               <ejb-ref-name>name_25</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <local-home>home_25</local-home>
+               <local>remote_25</local>
+               <ejb-link>link_25</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+               <description>description_26</description>
+               <ejb-ref-name>name_26</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <local-home>home_26</local-home>
+               <local>remote_26</local>
+               <ejb-link>link_26</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+               <description>description_27</description>
+               <ejb-ref-name>name_27</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <local-home>home_27</local-home>
+               <local>remote_27</local>
+               <ejb-link>link_27</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+               <description>description_28</description>
+               <ejb-ref-name>name_28</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <local-home>home_28</local-home>
+               <local>remote_28</local>
+               <ejb-link>link_28</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+               <description>description_29</description>
+               <ejb-ref-name>name_29</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <local-home>home_29</local-home>
+               <local>remote_29</local>
+               <ejb-link>link_29</ejb-link>
+            </ejb-local-ref>
+            <security-role-ref>
+               <description>description_25</description>
+               <role-name>name_25</role-name>
+               <role-link>link_25</role-link>
+            </security-role-ref>
+            <security-role-ref>
+               <description>description_26</description>
+               <role-name>name_26</role-name>
+               <role-link>link_26</role-link>
+            </security-role-ref>
+            <security-role-ref>
+               <description>description_27</description>
+               <role-name>name_27</role-name>
+               <role-link>link_27</role-link>
+            </security-role-ref>
+            <security-role-ref>
+               <description>description_28</description>
+               <role-name>name_28</role-name>
+               <role-link>link_28</role-link>
+            </security-role-ref>
+            <security-role-ref>
+               <description>description_29</description>
+               <role-name>name_29</role-name>
+               <role-link>link_29</role-link>
+            </security-role-ref>
+            <security-identity>
+               <description>description_2</description>
+               <use-caller-identity></use-caller-identity>
+            </security-identity>
+            <resource-ref>
+               <description>description_25</description>
+               <res-ref-name>name_25</res-ref-name>
+               <res-type>type_25</res-type>
+               <res-auth>Application</res-auth>
+               <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+               <description>description_26</description>
+               <res-ref-name>name_26</res-ref-name>
+               <res-type>type_26</res-type>
+               <res-auth>Container</res-auth>
+               <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+               <description>description_27</description>
+               <res-ref-name>name_27</res-ref-name>
+               <res-type>type_27</res-type>
+               <res-auth>Application</res-auth>
+               <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+               <description>description_28</description>
+               <res-ref-name>name_28</res-ref-name>
+               <res-type>type_28</res-type>
+               <res-auth>Container</res-auth>
+               <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+               <description>description_29</description>
+               <res-ref-name>name_29</res-ref-name>
+               <res-type>type_29</res-type>
+               <res-auth>Application</res-auth>
+               <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-env-ref>
+               <description>description_25</description>
+               <resource-env-ref-name>name_25</resource-env-ref-name>
+               <resource-env-ref-type>java.util.HashTable</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+               <description>description_26</description>
+               <resource-env-ref-name>name_26</resource-env-ref-name>
+               <resource-env-ref-type>java.util.List</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+               <description>description_27</description>
+               <resource-env-ref-name>name_27</resource-env-ref-name>
+               <resource-env-ref-type>java.sql.Data</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+               <description>description_28</description>
+               <resource-env-ref-name>name_28</resource-env-ref-name>
+               <resource-env-ref-type>java.lang.Integer</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+               <description>description_29</description>
+               <resource-env-ref-name>name_29</resource-env-ref-name>
+               <resource-env-ref-type>java.lang.String</resource-env-ref-type>
+            </resource-env-ref>
+         </entity>
+         <message-driven>
+            <description>description_0</description>
+            <display-name>displayName_0</display-name>
+            <small-icon>smallIcon_0</small-icon>
+            <large-icon>largeIcon_0</large-icon>
+            <ejb-name>name_6</ejb-name>
+            <ejb-class>java.util.HashTable</ejb-class>
+            <transaction-type>Bean</transaction-type>
+            <message-selector>messageSelector_0</message-selector>
+            <acknowledge-mode>Auto-acknowledge</acknowledge-mode>
+            <message-driven-destination>
+               <destination-type>javax.jms.Queue</destination-type>
+               <subscription-durability>Durable</subscription-durability>
+            </message-driven-destination>
+            <env-entry>
+               <description>description_30</description>
+               <env-entry-name>name_30</env-entry-name>
+               <env-entry-type>java.lang.Double</env-entry-type>
+               <env-entry-value>value_30</env-entry-value>
+            </env-entry>
+            <env-entry>
+               <description>description_31</description>
+               <env-entry-name>name_31</env-entry-name>
+               <env-entry-type>java.lang.Byte</env-entry-type>
+               <env-entry-value>value_31</env-entry-value>
+            </env-entry>
+            <env-entry>
+               <description>description_32</description>
+               <env-entry-name>name_32</env-entry-name>
+               <env-entry-type>java.lang.Short</env-entry-type>
+               <env-entry-value>value_32</env-entry-value>
+            </env-entry>
+            <env-entry>
+               <description>description_33</description>
+               <env-entry-name>name_33</env-entry-name>
+               <env-entry-type>java.lang.Long</env-entry-type>
+               <env-entry-value>value_33</env-entry-value>
+            </env-entry>
+            <env-entry>
+               <description>description_34</description>
+               <env-entry-name>name_34</env-entry-name>
+               <env-entry-type>java.lang.Float</env-entry-type>
+               <env-entry-value>value_34</env-entry-value>
+            </env-entry>
+            <ejb-ref>
+               <description>description_30</description>
+               <ejb-ref-name>name_30</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <home>home_30</home>
+               <remote>remote_30</remote>
+               <ejb-link>link_30</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+               <description>description_31</description>
+               <ejb-ref-name>name_31</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <home>home_31</home>
+               <remote>remote_31</remote>
+               <ejb-link>link_31</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+               <description>description_32</description>
+               <ejb-ref-name>name_32</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <home>home_32</home>
+               <remote>remote_32</remote>
+               <ejb-link>link_32</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+               <description>description_33</description>
+               <ejb-ref-name>name_33</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <home>home_33</home>
+               <remote>remote_33</remote>
+               <ejb-link>link_33</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+               <description>description_34</description>
+               <ejb-ref-name>name_34</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <home>home_34</home>
+               <remote>remote_34</remote>
+               <ejb-link>link_34</ejb-link>
+            </ejb-ref>
+            <ejb-local-ref>
+               <description>description_30</description>
+               <ejb-ref-name>name_30</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <local-home>home_30</local-home>
+               <local>remote_30</local>
+               <ejb-link>link_30</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+               <description>description_31</description>
+               <ejb-ref-name>name_31</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <local-home>home_31</local-home>
+               <local>remote_31</local>
+               <ejb-link>link_31</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+               <description>description_32</description>
+               <ejb-ref-name>name_32</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <local-home>home_32</local-home>
+               <local>remote_32</local>
+               <ejb-link>link_32</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+               <description>description_33</description>
+               <ejb-ref-name>name_33</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <local-home>home_33</local-home>
+               <local>remote_33</local>
+               <ejb-link>link_33</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+               <description>description_34</description>
+               <ejb-ref-name>name_34</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <local-home>home_34</local-home>
+               <local>remote_34</local>
+               <ejb-link>link_34</ejb-link>
+            </ejb-local-ref>
+            <security-identity>
+               <description>description_3</description>
+               <run-as>
+                  <description>description_3</description>
+                  <role-name>roleName_3</role-name>
+               </run-as>
+            </security-identity>
+            <resource-ref>
+               <description>description_30</description>
+               <res-ref-name>name_30</res-ref-name>
+               <res-type>type_30</res-type>
+               <res-auth>Container</res-auth>
+               <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+               <description>description_31</description>
+               <res-ref-name>name_31</res-ref-name>
+               <res-type>type_31</res-type>
+               <res-auth>Application</res-auth>
+               <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+               <description>description_32</description>
+               <res-ref-name>name_32</res-ref-name>
+               <res-type>type_32</res-type>
+               <res-auth>Container</res-auth>
+               <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+               <description>description_33</description>
+               <res-ref-name>name_33</res-ref-name>
+               <res-type>type_33</res-type>
+               <res-auth>Application</res-auth>
+               <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+               <description>description_34</description>
+               <res-ref-name>name_34</res-ref-name>
+               <res-type>type_34</res-type>
+               <res-auth>Container</res-auth>
+               <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-env-ref>
+               <description>description_30</description>
+               <resource-env-ref-name>name_30</resource-env-ref-name>
+               <resource-env-ref-type>java.util.HashTable</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+               <description>description_31</description>
+               <resource-env-ref-name>name_31</resource-env-ref-name>
+               <resource-env-ref-type>java.util.List</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+               <description>description_32</description>
+               <resource-env-ref-name>name_32</resource-env-ref-name>
+               <resource-env-ref-type>java.sql.Data</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+               <description>description_33</description>
+               <resource-env-ref-name>name_33</resource-env-ref-name>
+               <resource-env-ref-type>java.lang.Integer</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+               <description>description_34</description>
+               <resource-env-ref-name>name_34</resource-env-ref-name>
+               <resource-env-ref-type>java.lang.String</resource-env-ref-type>
+            </resource-env-ref>
+         </message-driven>
+         <session>
+            <description>description_1</description>
+            <display-name>displayName_1</display-name>
+            <small-icon>smallIcon_1</small-icon>
+            <large-icon>largeIcon_1</large-icon>
+            <ejb-name>name_7</ejb-name>
+            <home>java.util.List</home>
+            <remote>java.util.List</remote>
+            <local-home>java.util.List</local-home>
+            <local>java.util.List</local>
+            <ejb-class>java.util.List</ejb-class>
+            <session-type>Stateless</session-type>
+            <transaction-type>Container</transaction-type>
+            <env-entry>
+               <description>description_35</description>
+               <env-entry-name>name_35</env-entry-name>
+               <env-entry-type>java.lang.Character</env-entry-type>
+               <env-entry-value>value_35</env-entry-value>
+            </env-entry>
+            <env-entry>
+               <description>description_36</description>
+               <env-entry-name>name_36</env-entry-name>
+               <env-entry-type>java.lang.String</env-entry-type>
+               <env-entry-value>value_36</env-entry-value>
+            </env-entry>
+            <env-entry>
+               <description>description_37</description>
+               <env-entry-name>name_37</env-entry-name>
+               <env-entry-type>java.lang.Integer</env-entry-type>
+               <env-entry-value>value_37</env-entry-value>
+            </env-entry>
+            <env-entry>
+               <description>description_38</description>
+               <env-entry-name>name_38</env-entry-name>
+               <env-entry-type>java.lang.Boolean</env-entry-type>
+               <env-entry-value>value_38</env-entry-value>
+            </env-entry>
+            <env-entry>
+               <description>description_39</description>
+               <env-entry-name>name_39</env-entry-name>
+               <env-entry-type>java.lang.Double</env-entry-type>
+               <env-entry-value>value_39</env-entry-value>
+            </env-entry>
+            <ejb-ref>
+               <description>description_35</description>
+               <ejb-ref-name>name_35</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <home>home_35</home>
+               <remote>remote_35</remote>
+               <ejb-link>link_35</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+               <description>description_36</description>
+               <ejb-ref-name>name_36</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <home>home_36</home>
+               <remote>remote_36</remote>
+               <ejb-link>link_36</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+               <description>description_37</description>
+               <ejb-ref-name>name_37</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <home>home_37</home>
+               <remote>remote_37</remote>
+               <ejb-link>link_37</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+               <description>description_38</description>
+               <ejb-ref-name>name_38</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <home>home_38</home>
+               <remote>remote_38</remote>
+               <ejb-link>link_38</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+               <description>description_39</description>
+               <ejb-ref-name>name_39</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <home>home_39</home>
+               <remote>remote_39</remote>
+               <ejb-link>link_39</ejb-link>
+            </ejb-ref>
+            <ejb-local-ref>
+               <description>description_35</description>
+               <ejb-ref-name>name_35</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <local-home>home_35</local-home>
+               <local>remote_35</local>
+               <ejb-link>link_35</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+               <description>description_36</description>
+               <ejb-ref-name>name_36</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <local-home>home_36</local-home>
+               <local>remote_36</local>
+               <ejb-link>link_36</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+               <description>description_37</description>
+               <ejb-ref-name>name_37</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <local-home>home_37</local-home>
+               <local>remote_37</local>
+               <ejb-link>link_37</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+               <description>description_38</description>
+               <ejb-ref-name>name_38</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <local-home>home_38</local-home>
+               <local>remote_38</local>
+               <ejb-link>link_38</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+               <description>description_39</description>
+               <ejb-ref-name>name_39</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <local-home>home_39</local-home>
+               <local>remote_39</local>
+               <ejb-link>link_39</ejb-link>
+            </ejb-local-ref>
+            <security-role-ref>
+               <description>description_30</description>
+               <role-name>name_30</role-name>
+               <role-link>link_30</role-link>
+            </security-role-ref>
+            <security-role-ref>
+               <description>description_31</description>
+               <role-name>name_31</role-name>
+               <role-link>link_31</role-link>
+            </security-role-ref>
+            <security-role-ref>
+               <description>description_32</description>
+               <role-name>name_32</role-name>
+               <role-link>link_32</role-link>
+            </security-role-ref>
+            <security-role-ref>
+               <description>description_33</description>
+               <role-name>name_33</role-name>
+               <role-link>link_33</role-link>
+            </security-role-ref>
+            <security-role-ref>
+               <description>description_34</description>
+               <role-name>name_34</role-name>
+               <role-link>link_34</role-link>
+            </security-role-ref>
+            <security-identity>
+               <description>description_3</description>
+               <use-caller-identity></use-caller-identity>
+            </security-identity>
+            <resource-ref>
+               <description>description_35</description>
+               <res-ref-name>name_35</res-ref-name>
+               <res-type>type_35</res-type>
+               <res-auth>Application</res-auth>
+               <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+               <description>description_36</description>
+               <res-ref-name>name_36</res-ref-name>
+               <res-type>type_36</res-type>
+               <res-auth>Container</res-auth>
+               <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+               <description>description_37</description>
+               <res-ref-name>name_37</res-ref-name>
+               <res-type>type_37</res-type>
+               <res-auth>Application</res-auth>
+               <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+               <description>description_38</description>
+               <res-ref-name>name_38</res-ref-name>
+               <res-type>type_38</res-type>
+               <res-auth>Container</res-auth>
+               <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+               <description>description_39</description>
+               <res-ref-name>name_39</res-ref-name>
+               <res-type>type_39</res-type>
+               <res-auth>Application</res-auth>
+               <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-env-ref>
+               <description>description_35</description>
+               <resource-env-ref-name>name_35</resource-env-ref-name>
+               <resource-env-ref-type>java.util.HashTable</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+               <description>description_36</description>
+               <resource-env-ref-name>name_36</resource-env-ref-name>
+               <resource-env-ref-type>java.util.List</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+               <description>description_37</description>
+               <resource-env-ref-name>name_37</resource-env-ref-name>
+               <resource-env-ref-type>java.sql.Data</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+               <description>description_38</description>
+               <resource-env-ref-name>name_38</resource-env-ref-name>
+               <resource-env-ref-type>java.lang.Integer</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+               <description>description_39</description>
+               <resource-env-ref-name>name_39</resource-env-ref-name>
+               <resource-env-ref-type>java.lang.String</resource-env-ref-type>
+            </resource-env-ref>
+         </session>
+         <entity>
+            <description>description_4</description>
+            <display-name>displayName_4</display-name>
+            <small-icon>smallIcon_4</small-icon>
+            <large-icon>largeIcon_4</large-icon>
+            <ejb-name>name_8</ejb-name>
+            <home>java.lang.String</home>
+            <remote>java.lang.String</remote>
+            <local-home>java.lang.String</local-home>
+            <local>java.lang.String</local>
+            <ejb-class>java.lang.String</ejb-class>
+            <persistence-type>Bean</persistence-type>
+            <prim-key-class>java.lang.String</prim-key-class>
+            <reentrant>True</reentrant>
+            <env-entry>
+               <description>description_40</description>
+               <env-entry-name>name_40</env-entry-name>
+               <env-entry-type>java.lang.Byte</env-entry-type>
+               <env-entry-value>value_40</env-entry-value>
+            </env-entry>
+            <env-entry>
+               <description>description_41</description>
+               <env-entry-name>name_41</env-entry-name>
+               <env-entry-type>java.lang.Short</env-entry-type>
+               <env-entry-value>value_41</env-entry-value>
+            </env-entry>
+            <env-entry>
+               <description>description_42</description>
+               <env-entry-name>name_42</env-entry-name>
+               <env-entry-type>java.lang.Long</env-entry-type>
+               <env-entry-value>value_42</env-entry-value>
+            </env-entry>
+            <env-entry>
+               <description>description_43</description>
+               <env-entry-name>name_43</env-entry-name>
+               <env-entry-type>java.lang.Float</env-entry-type>
+               <env-entry-value>value_43</env-entry-value>
+            </env-entry>
+            <env-entry>
+               <description>description_44</description>
+               <env-entry-name>name_44</env-entry-name>
+               <env-entry-type>java.lang.Character</env-entry-type>
+               <env-entry-value>value_44</env-entry-value>
+            </env-entry>
+            <ejb-ref>
+               <description>description_40</description>
+               <ejb-ref-name>name_40</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <home>home_40</home>
+               <remote>remote_40</remote>
+               <ejb-link>link_40</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+               <description>description_41</description>
+               <ejb-ref-name>name_41</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <home>home_41</home>
+               <remote>remote_41</remote>
+               <ejb-link>link_41</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+               <description>description_42</description>
+               <ejb-ref-name>name_42</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <home>home_42</home>
+               <remote>remote_42</remote>
+               <ejb-link>link_42</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+               <description>description_43</description>
+               <ejb-ref-name>name_43</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <home>home_43</home>
+               <remote>remote_43</remote>
+               <ejb-link>link_43</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+               <description>description_44</description>
+               <ejb-ref-name>name_44</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <home>home_44</home>
+               <remote>remote_44</remote>
+               <ejb-link>link_44</ejb-link>
+            </ejb-ref>
+            <ejb-local-ref>
+               <description>description_40</description>
+               <ejb-ref-name>name_40</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <local-home>home_40</local-home>
+               <local>remote_40</local>
+               <ejb-link>link_40</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+               <description>description_41</description>
+               <ejb-ref-name>name_41</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <local-home>home_41</local-home>
+               <local>remote_41</local>
+               <ejb-link>link_41</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+               <description>description_42</description>
+               <ejb-ref-name>name_42</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <local-home>home_42</local-home>
+               <local>remote_42</local>
+               <ejb-link>link_42</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+               <description>description_43</description>
+               <ejb-ref-name>name_43</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <local-home>home_43</local-home>
+               <local>remote_43</local>
+               <ejb-link>link_43</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+               <description>description_44</description>
+               <ejb-ref-name>name_44</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <local-home>home_44</local-home>
+               <local>remote_44</local>
+               <ejb-link>link_44</ejb-link>
+            </ejb-local-ref>
+            <security-role-ref>
+               <description>description_35</description>
+               <role-name>name_35</role-name>
+               <role-link>link_35</role-link>
+            </security-role-ref>
+            <security-role-ref>
+               <description>description_36</description>
+               <role-name>name_36</role-name>
+               <role-link>link_36</role-link>
+            </security-role-ref>
+            <security-role-ref>
+               <description>description_37</description>
+               <role-name>name_37</role-name>
+               <role-link>link_37</role-link>
+            </security-role-ref>
+            <security-role-ref>
+               <description>description_38</description>
+               <role-name>name_38</role-name>
+               <role-link>link_38</role-link>
+            </security-role-ref>
+            <security-role-ref>
+               <description>description_39</description>
+               <role-name>name_39</role-name>
+               <role-link>link_39</role-link>
+            </security-role-ref>
+            <security-identity>
+               <description>description_4</description>
+               <run-as>
+                  <description>description_4</description>
+                  <role-name>roleName_4</role-name>
+               </run-as>
+            </security-identity>
+            <resource-ref>
+               <description>description_40</description>
+               <res-ref-name>name_40</res-ref-name>
+               <res-type>type_40</res-type>
+               <res-auth>Container</res-auth>
+               <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+               <description>description_41</description>
+               <res-ref-name>name_41</res-ref-name>
+               <res-type>type_41</res-type>
+               <res-auth>Application</res-auth>
+               <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+               <description>description_42</description>
+               <res-ref-name>name_42</res-ref-name>
+               <res-type>type_42</res-type>
+               <res-auth>Container</res-auth>
+               <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+               <description>description_43</description>
+               <res-ref-name>name_43</res-ref-name>
+               <res-type>type_43</res-type>
+               <res-auth>Application</res-auth>
+               <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+               <description>description_44</description>
+               <res-ref-name>name_44</res-ref-name>
+               <res-type>type_44</res-type>
+               <res-auth>Container</res-auth>
+               <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-env-ref>
+               <description>description_40</description>
+               <resource-env-ref-name>name_40</resource-env-ref-name>
+               <resource-env-ref-type>java.util.HashTable</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+               <description>description_41</description>
+               <resource-env-ref-name>name_41</resource-env-ref-name>
+               <resource-env-ref-type>java.util.List</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+               <description>description_42</description>
+               <resource-env-ref-name>name_42</resource-env-ref-name>
+               <resource-env-ref-type>java.sql.Data</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+               <description>description_43</description>
+               <resource-env-ref-name>name_43</resource-env-ref-name>
+               <resource-env-ref-type>java.lang.Integer</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+               <description>description_44</description>
+               <resource-env-ref-name>name_44</resource-env-ref-name>
+               <resource-env-ref-type>java.lang.String</resource-env-ref-type>
+            </resource-env-ref>
+         </entity>
+         <entity>
+            <description>description_5</description>
+            <display-name>displayName_5</display-name>
+            <small-icon>smallIcon_5</small-icon>
+            <large-icon>largeIcon_5</large-icon>
+            <ejb-name>name_9</ejb-name>
+            <home>java.util.HashTable</home>
+            <remote>java.util.HashTable</remote>
+            <local-home>java.util.HashTable</local-home>
+            <local>java.util.HashTable</local>
+            <ejb-class>java.util.HashTable</ejb-class>
+            <persistence-type>Bean</persistence-type>
+            <prim-key-class>java.util.HashTable</prim-key-class>
+            <reentrant>False</reentrant>
+            <env-entry>
+               <description>description_45</description>
+               <env-entry-name>name_45</env-entry-name>
+               <env-entry-type>java.lang.String</env-entry-type>
+               <env-entry-value>value_45</env-entry-value>
+            </env-entry>
+            <env-entry>
+               <description>description_46</description>
+               <env-entry-name>name_46</env-entry-name>
+               <env-entry-type>java.lang.Integer</env-entry-type>
+               <env-entry-value>value_46</env-entry-value>
+            </env-entry>
+            <env-entry>
+               <description>description_47</description>
+               <env-entry-name>name_47</env-entry-name>
+               <env-entry-type>java.lang.Boolean</env-entry-type>
+               <env-entry-value>value_47</env-entry-value>
+            </env-entry>
+            <env-entry>
+               <description>description_48</description>
+               <env-entry-name>name_48</env-entry-name>
+               <env-entry-type>java.lang.Double</env-entry-type>
+               <env-entry-value>value_48</env-entry-value>
+            </env-entry>
+            <env-entry>
+               <description>description_49</description>
+               <env-entry-name>name_49</env-entry-name>
+               <env-entry-type>java.lang.Byte</env-entry-type>
+               <env-entry-value>value_49</env-entry-value>
+            </env-entry>
+            <ejb-ref>
+               <description>description_45</description>
+               <ejb-ref-name>name_45</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <home>home_45</home>
+               <remote>remote_45</remote>
+               <ejb-link>link_45</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+               <description>description_46</description>
+               <ejb-ref-name>name_46</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <home>home_46</home>
+               <remote>remote_46</remote>
+               <ejb-link>link_46</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+               <description>description_47</description>
+               <ejb-ref-name>name_47</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <home>home_47</home>
+               <remote>remote_47</remote>
+               <ejb-link>link_47</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+               <description>description_48</description>
+               <ejb-ref-name>name_48</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <home>home_48</home>
+               <remote>remote_48</remote>
+               <ejb-link>link_48</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+               <description>description_49</description>
+               <ejb-ref-name>name_49</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <home>home_49</home>
+               <remote>remote_49</remote>
+               <ejb-link>link_49</ejb-link>
+            </ejb-ref>
+            <ejb-local-ref>
+               <description>description_45</description>
+               <ejb-ref-name>name_45</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <local-home>home_45</local-home>
+               <local>remote_45</local>
+               <ejb-link>link_45</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+               <description>description_46</description>
+               <ejb-ref-name>name_46</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <local-home>home_46</local-home>
+               <local>remote_46</local>
+               <ejb-link>link_46</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+               <description>description_47</description>
+               <ejb-ref-name>name_47</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <local-home>home_47</local-home>
+               <local>remote_47</local>
+               <ejb-link>link_47</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+               <description>description_48</description>
+               <ejb-ref-name>name_48</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <local-home>home_48</local-home>
+               <local>remote_48</local>
+               <ejb-link>link_48</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+               <description>description_49</description>
+               <ejb-ref-name>name_49</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <local-home>home_49</local-home>
+               <local>remote_49</local>
+               <ejb-link>link_49</ejb-link>
+            </ejb-local-ref>
+            <security-role-ref>
+               <description>description_40</description>
+               <role-name>name_40</role-name>
+               <role-link>link_40</role-link>
+            </security-role-ref>
+            <security-role-ref>
+               <description>description_41</description>
+               <role-name>name_41</role-name>
+               <role-link>link_41</role-link>
+            </security-role-ref>
+            <security-role-ref>
+               <description>description_42</description>
+               <role-name>name_42</role-name>
+               <role-link>link_42</role-link>
+            </security-role-ref>
+            <security-role-ref>
+               <description>description_43</description>
+               <role-name>name_43</role-name>
+               <role-link>link_43</role-link>
+            </security-role-ref>
+            <security-role-ref>
+               <description>description_44</description>
+               <role-name>name_44</role-name>
+               <role-link>link_44</role-link>
+            </security-role-ref>
+            <security-identity>
+               <description>description_4</description>
+               <use-caller-identity></use-caller-identity>
+            </security-identity>
+            <resource-ref>
+               <description>description_45</description>
+               <res-ref-name>name_45</res-ref-name>
+               <res-type>type_45</res-type>
+               <res-auth>Application</res-auth>
+               <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+               <description>description_46</description>
+               <res-ref-name>name_46</res-ref-name>
+               <res-type>type_46</res-type>
+               <res-auth>Container</res-auth>
+               <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+               <description>description_47</description>
+               <res-ref-name>name_47</res-ref-name>
+               <res-type>type_47</res-type>
+               <res-auth>Application</res-auth>
+               <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+               <description>description_48</description>
+               <res-ref-name>name_48</res-ref-name>
+               <res-type>type_48</res-type>
+               <res-auth>Container</res-auth>
+               <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+               <description>description_49</description>
+               <res-ref-name>name_49</res-ref-name>
+               <res-type>type_49</res-type>
+               <res-auth>Application</res-auth>
+               <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-env-ref>
+               <description>description_45</description>
+               <resource-env-ref-name>name_45</resource-env-ref-name>
+               <resource-env-ref-type>java.util.HashTable</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+               <description>description_46</description>
+               <resource-env-ref-name>name_46</resource-env-ref-name>
+               <resource-env-ref-type>java.util.List</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+               <description>description_47</description>
+               <resource-env-ref-name>name_47</resource-env-ref-name>
+               <resource-env-ref-type>java.sql.Data</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+               <description>description_48</description>
+               <resource-env-ref-name>name_48</resource-env-ref-name>
+               <resource-env-ref-type>java.lang.Integer</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+               <description>description_49</description>
+               <resource-env-ref-name>name_49</resource-env-ref-name>
+               <resource-env-ref-type>java.lang.String</resource-env-ref-type>
+            </resource-env-ref>
+         </entity>
+      </enterprise-beans>
+      <relationships>
+         <description>description_0</description>
+         <ejb-relation>
+            <description>description_0</description>
+            <ejb-relation-name>name_0</ejb-relation-name>
+            <ejb-relationship-role>
+               <description>description_0</description>
+               <ejb-relationship-role-name>roleName_0</ejb-relationship-role-name>
+               <multiplicity>One</multiplicity>
+               <relationship-role-source>
+                  <description>description_0</description>
+                  <ejb-name>name_2</ejb-name>
+               </relationship-role-source>
+               <cmr-field>
+                  <cmr-field-name>name_8</cmr-field-name>
+                  <cmr-field-type>java.util.Collection</cmr-field-type>
+               </cmr-field>
+            </ejb-relationship-role>
+            <ejb-relationship-role>
+               <description>description_1</description>
+               <ejb-relationship-role-name>roleName_1</ejb-relationship-role-name>
+               <multiplicity>Many</multiplicity>
+			   <cascade-delete/>
+               <relationship-role-source>
+                  <description>description_1</description>
+                  <ejb-name>name_2</ejb-name>
+               </relationship-role-source>
+               <cmr-field>
+                  <cmr-field-name>name_9</cmr-field-name>
+                  <cmr-field-type>java.util.Collection</cmr-field-type>
+               </cmr-field>
+            </ejb-relationship-role>
+         </ejb-relation>
+         <ejb-relation>
+            <description>description_1</description>
+            <ejb-relation-name>name_1</ejb-relation-name>
+            <ejb-relationship-role>
+               <description>description_2</description>
+               <ejb-relationship-role-name>roleName_2</ejb-relationship-role-name>
+               <multiplicity>One</multiplicity>
+               <relationship-role-source>
+                  <description>description_2</description>
+                  <ejb-name>name_2</ejb-name>
+               </relationship-role-source>
+            </ejb-relationship-role>
+            <ejb-relationship-role>
+               <description>description_3</description>
+               <ejb-relationship-role-name>roleName_3</ejb-relationship-role-name>
+               <multiplicity>Many</multiplicity>
+               <relationship-role-source>
+                  <description>description_3</description>
+                  <ejb-name>name_2</ejb-name>
+               </relationship-role-source>
+            </ejb-relationship-role>
+         </ejb-relation>
+         <ejb-relation>
+            <description>description_2</description>
+            <ejb-relation-name>name_2</ejb-relation-name>
+            <ejb-relationship-role>
+               <description>description_4</description>
+               <ejb-relationship-role-name>roleName_4</ejb-relationship-role-name>
+               <multiplicity>One</multiplicity>
+               <relationship-role-source>
+                  <description>description_4</description>
+                  <ejb-name>name_2</ejb-name>
+               </relationship-role-source>
+            </ejb-relationship-role>
+            <ejb-relationship-role>
+               <description>description_5</description>
+               <ejb-relationship-role-name>roleName_5</ejb-relationship-role-name>
+               <multiplicity>Many</multiplicity>
+			   <cascade-delete/>
+               <relationship-role-source>
+                  <description>description_5</description>
+                  <ejb-name>name_2</ejb-name>
+               </relationship-role-source>
+            </ejb-relationship-role>
+         </ejb-relation>
+         <ejb-relation>
+            <description>description_3</description>
+            <ejb-relation-name>name_3</ejb-relation-name>
+            <ejb-relationship-role>
+               <description>description_6</description>
+               <ejb-relationship-role-name>roleName_6</ejb-relationship-role-name>
+               <multiplicity>One</multiplicity>
+               <relationship-role-source>
+                  <description>description_6</description>
+                  <ejb-name>name_2</ejb-name>
+               </relationship-role-source>
+            </ejb-relationship-role>
+            <ejb-relationship-role>
+               <description>description_7</description>
+               <ejb-relationship-role-name>roleName_7</ejb-relationship-role-name>
+               <multiplicity>Many</multiplicity>
+               <relationship-role-source>
+                  <description>description_7</description>
+                  <ejb-name>name_2</ejb-name>
+               </relationship-role-source>
+            </ejb-relationship-role>
+         </ejb-relation>
+         <ejb-relation>
+            <description>description_4</description>
+            <ejb-relation-name>name_4</ejb-relation-name>
+            <ejb-relationship-role>
+               <description>description_8</description>
+               <ejb-relationship-role-name>roleName_8</ejb-relationship-role-name>
+               <multiplicity>One</multiplicity>
+               <relationship-role-source>
+                  <description>description_8</description>
+                  <ejb-name>name_2</ejb-name>
+               </relationship-role-source>
+            </ejb-relationship-role>
+            <ejb-relationship-role>
+               <description>description_9</description>
+               <ejb-relationship-role-name>roleName_9</ejb-relationship-role-name>
+               <multiplicity>Many</multiplicity>
+			   <cascade-delete/>
+               <relationship-role-source>
+                  <description>description_9</description>
+                  <ejb-name>name_2</ejb-name>
+               </relationship-role-source>
+            </ejb-relationship-role>
+         </ejb-relation>
+      </relationships>
+      <assembly-descriptor>
+         <security-role>
+            <description>description_0</description>
+            <role-name>roleName_0</role-name>
+         </security-role>
+         <security-role>
+            <description>description_1</description>
+            <role-name>roleName_1</role-name>
+         </security-role>
+         <security-role>
+            <description>description_2</description>
+            <role-name>roleName_2</role-name>
+         </security-role>
+         <security-role>
+            <description>description_3</description>
+            <role-name>roleName_3</role-name>
+         </security-role>
+         <security-role>
+            <description>description_4</description>
+            <role-name>roleName_4</role-name>
+         </security-role>
+         <method-permission>
+            <description>description_0</description>
+            <unchecked/>
+            <method>
+               <description>description_0</description>
+               <ejb-name>name_0</ejb-name>
+               <method-name>name_0</method-name>
+            </method>
+            <method>
+               <description>description_1</description>
+               <ejb-name>name_1</ejb-name>
+               <method-intf>Remote</method-intf>
+               <method-name>name_1</method-name>
+               <method-params></method-params>
+            </method>
+            <method>
+               <description>description_2</description>
+               <ejb-name>name_2</ejb-name>
+               <method-intf>Home</method-intf>
+               <method-name>name_2</method-name>
+               <method-params>
+                  <method-param>parms_0</method-param>
+               </method-params>
+            </method>
+            <method>
+               <description>description_3</description>
+               <ejb-name>name_3</ejb-name>
+               <method-intf>Local</method-intf>
+               <method-name>name_3</method-name>
+               <method-params>
+                  <method-param>parms_1</method-param>
+                  <method-param>parms_2</method-param>
+               </method-params>
+            </method>
+            <method>
+               <description>description_4</description>
+               <ejb-name>name_4</ejb-name>
+               <method-intf>LocalHome</method-intf>
+               <method-name>name_4</method-name>
+               <method-params>
+                  <method-param>parms_3</method-param>
+                  <method-param>parms_4</method-param>
+                  <method-param>parms_5</method-param>
+               </method-params>
+            </method>
+         </method-permission>
+         <method-permission>
+            <description>description_1</description>
+            <role-name>roleName_0</role-name>
+            <method>
+               <description>description_5</description>
+               <ejb-name>name_5</ejb-name>
+               <method-name>name_5</method-name>
+            </method>
+            <method>
+               <description>description_6</description>
+               <ejb-name>name_6</ejb-name>
+               <method-intf>Remote</method-intf>
+               <method-name>name_6</method-name>
+               <method-params></method-params>
+            </method>
+            <method>
+               <description>description_7</description>
+               <ejb-name>name_7</ejb-name>
+               <method-intf>Home</method-intf>
+               <method-name>name_7</method-name>
+               <method-params>
+                  <method-param>parms_6</method-param>
+               </method-params>
+            </method>
+            <method>
+               <description>description_8</description>
+               <ejb-name>name_8</ejb-name>
+               <method-intf>Local</method-intf>
+               <method-name>name_8</method-name>
+               <method-params>
+                  <method-param>parms_7</method-param>
+                  <method-param>parms_8</method-param>
+               </method-params>
+            </method>
+            <method>
+               <description>description_9</description>
+               <ejb-name>name_9</ejb-name>
+               <method-intf>LocalHome</method-intf>
+               <method-name>name_9</method-name>
+               <method-params>
+                  <method-param>parms_9</method-param>
+                  <method-param>parms_10</method-param>
+                  <method-param>parms_11</method-param>
+               </method-params>
+            </method>
+         </method-permission>
+         <method-permission>
+            <description>description_2</description>
+            <role-name>roleName_0</role-name>
+            <role-name>roleName_1</role-name>
+            <method>
+               <description>description_10</description>
+               <ejb-name>name_0</ejb-name>
+               <method-name>name_10</method-name>
+            </method>
+            <method>
+               <description>description_11</description>
+               <ejb-name>name_1</ejb-name>
+               <method-intf>Remote</method-intf>
+               <method-name>name_11</method-name>
+               <method-params></method-params>
+            </method>
+            <method>
+               <description>description_12</description>
+               <ejb-name>name_2</ejb-name>
+               <method-intf>Home</method-intf>
+               <method-name>name_12</method-name>
+               <method-params>
+                  <method-param>parms_12</method-param>
+               </method-params>
+            </method>
+            <method>
+               <description>description_13</description>
+               <ejb-name>name_3</ejb-name>
+               <method-intf>Local</method-intf>
+               <method-name>name_13</method-name>
+               <method-params>
+                  <method-param>parms_13</method-param>
+                  <method-param>parms_14</method-param>
+               </method-params>
+            </method>
+            <method>
+               <description>description_14</description>
+               <ejb-name>name_4</ejb-name>
+               <method-intf>LocalHome</method-intf>
+               <method-name>name_14</method-name>
+               <method-params>
+                  <method-param>parms_15</method-param>
+                  <method-param>parms_16</method-param>
+                  <method-param>parms_17</method-param>
+               </method-params>
+            </method>
+         </method-permission>
+         <method-permission>
+            <description>description_3</description>
+            <role-name>roleName_0</role-name>
+            <role-name>roleName_1</role-name>
+            <role-name>roleName_2</role-name>
+            <method>
+               <description>description_15</description>
+               <ejb-name>name_5</ejb-name>
+               <method-name>name_15</method-name>
+            </method>
+            <method>
+               <description>description_16</description>
+               <ejb-name>name_6</ejb-name>
+               <method-intf>Remote</method-intf>
+               <method-name>name_16</method-name>
+               <method-params></method-params>
+            </method>
+            <method>
+               <description>description_17</description>
+               <ejb-name>name_7</ejb-name>
+               <method-intf>Home</method-intf>
+               <method-name>name_17</method-name>
+               <method-params>
+                  <method-param>parms_18</method-param>
+               </method-params>
+            </method>
+            <method>
+               <description>description_18</description>
+               <ejb-name>name_8</ejb-name>
+               <method-intf>Local</method-intf>
+               <method-name>name_18</method-name>
+               <method-params>
+                  <method-param>parms_19</method-param>
+                  <method-param>parms_20</method-param>
+               </method-params>
+            </method>
+            <method>
+               <description>description_19</description>
+               <ejb-name>name_9</ejb-name>
+               <method-intf>LocalHome</method-intf>
+               <method-name>name_19</method-name>
+               <method-params>
+                  <method-param>parms_21</method-param>
+                  <method-param>parms_22</method-param>
+                  <method-param>parms_23</method-param>
+               </method-params>
+            </method>
+         </method-permission>
+         <method-permission>
+            <description>description_4</description>
+            <role-name>roleName_0</role-name>
+            <role-name>roleName_1</role-name>
+            <role-name>roleName_2</role-name>
+            <role-name>roleName_3</role-name>
+            <method>
+               <description>description_20</description>
+               <ejb-name>name_0</ejb-name>
+               <method-name>name_20</method-name>
+            </method>
+            <method>
+               <description>description_21</description>
+               <ejb-name>name_1</ejb-name>
+               <method-intf>Remote</method-intf>
+               <method-name>name_21</method-name>
+               <method-params></method-params>
+            </method>
+            <method>
+               <description>description_22</description>
+               <ejb-name>name_2</ejb-name>
+               <method-intf>Home</method-intf>
+               <method-name>name_22</method-name>
+               <method-params>
+                  <method-param>parms_24</method-param>
+               </method-params>
+            </method>
+            <method>
+               <description>description_23</description>
+               <ejb-name>name_3</ejb-name>
+               <method-intf>Local</method-intf>
+               <method-name>name_23</method-name>
+               <method-params>
+                  <method-param>parms_25</method-param>
+                  <method-param>parms_26</method-param>
+               </method-params>
+            </method>
+            <method>
+               <description>description_24</description>
+               <ejb-name>name_4</ejb-name>
+               <method-intf>LocalHome</method-intf>
+               <method-name>name_24</method-name>
+               <method-params>
+                  <method-param>parms_27</method-param>
+                  <method-param>parms_28</method-param>
+                  <method-param>parms_29</method-param>
+               </method-params>
+            </method>
+         </method-permission>
+         <container-transaction>
+            <description>description_0</description>
+            <method>
+               <description>description_25</description>
+               <ejb-name>name_5</ejb-name>
+               <method-name>name_25</method-name>
+            </method>
+            <method>
+               <description>description_26</description>
+               <ejb-name>name_6</ejb-name>
+               <method-intf>Remote</method-intf>
+               <method-name>name_26</method-name>
+               <method-params></method-params>
+            </method>
+            <method>
+               <description>description_27</description>
+               <ejb-name>name_7</ejb-name>
+               <method-intf>Home</method-intf>
+               <method-name>name_27</method-name>
+               <method-params>
+                  <method-param>parms_30</method-param>
+               </method-params>
+            </method>
+            <method>
+               <description>description_28</description>
+               <ejb-name>name_8</ejb-name>
+               <method-intf>Local</method-intf>
+               <method-name>name_28</method-name>
+               <method-params>
+                  <method-param>parms_31</method-param>
+                  <method-param>parms_32</method-param>
+               </method-params>
+            </method>
+            <method>
+               <description>description_29</description>
+               <ejb-name>name_9</ejb-name>
+               <method-intf>LocalHome</method-intf>
+               <method-name>name_29</method-name>
+               <method-params>
+                  <method-param>parms_33</method-param>
+                  <method-param>parms_34</method-param>
+                  <method-param>parms_35</method-param>
+               </method-params>
+            </method>
+            <trans-attribute>NotSupported</trans-attribute>
+         </container-transaction>
+         <container-transaction>
+            <description>description_1</description>
+            <method>
+               <description>description_30</description>
+               <ejb-name>name_0</ejb-name>
+               <method-name>name_30</method-name>
+            </method>
+            <method>
+               <description>description_31</description>
+               <ejb-name>name_1</ejb-name>
+               <method-intf>Remote</method-intf>
+               <method-name>name_31</method-name>
+               <method-params></method-params>
+            </method>
+            <method>
+               <description>description_32</description>
+               <ejb-name>name_2</ejb-name>
+               <method-intf>Home</method-intf>
+               <method-name>name_32</method-name>
+               <method-params>
+                  <method-param>parms_36</method-param>
+               </method-params>
+            </method>
+            <method>
+               <description>description_33</description>
+               <ejb-name>name_3</ejb-name>
+               <method-intf>Local</method-intf>
+               <method-name>name_33</method-name>
+               <method-params>
+                  <method-param>parms_37</method-param>
+                  <method-param>parms_38</method-param>
+               </method-params>
+            </method>
+            <method>
+               <description>description_34</description>
+               <ejb-name>name_4</ejb-name>
+               <method-intf>LocalHome</method-intf>
+               <method-name>name_34</method-name>
+               <method-params>
+                  <method-param>parms_39</method-param>
+                  <method-param>parms_40</method-param>
+                  <method-param>parms_41</method-param>
+               </method-params>
+            </method>
+            <trans-attribute>Supports</trans-attribute>
+         </container-transaction>
+         <container-transaction>
+            <description>description_2</description>
+            <method>
+               <description>description_35</description>
+               <ejb-name>name_5</ejb-name>
+               <method-name>name_35</method-name>
+            </method>
+            <method>
+               <description>description_36</description>
+               <ejb-name>name_6</ejb-name>
+               <method-intf>Remote</method-intf>
+               <method-name>name_36</method-name>
+               <method-params></method-params>
+            </method>
+            <method>
+               <description>description_37</description>
+               <ejb-name>name_7</ejb-name>
+               <method-intf>Home</method-intf>
+               <method-name>name_37</method-name>
+               <method-params>
+                  <method-param>parms_42</method-param>
+               </method-params>
+            </method>
+            <method>
+               <description>description_38</description>
+               <ejb-name>name_8</ejb-name>
+               <method-intf>Local</method-intf>
+               <method-name>name_38</method-name>
+               <method-params>
+                  <method-param>parms_43</method-param>
+                  <method-param>parms_44</method-param>
+               </method-params>
+            </method>
+            <method>
+               <description>description_39</description>
+               <ejb-name>name_9</ejb-name>
+               <method-intf>LocalHome</method-intf>
+               <method-name>name_39</method-name>
+               <method-params>
+                  <method-param>parms_45</method-param>
+                  <method-param>parms_46</method-param>
+                  <method-param>parms_47</method-param>
+               </method-params>
+            </method>
+            <trans-attribute>Required</trans-attribute>
+         </container-transaction>
+         <container-transaction>
+            <description>description_3</description>
+            <method>
+               <description>description_40</description>
+               <ejb-name>name_0</ejb-name>
+               <method-name>name_40</method-name>
+            </method>
+            <method>
+               <description>description_41</description>
+               <ejb-name>name_1</ejb-name>
+               <method-intf>Remote</method-intf>
+               <method-name>name_41</method-name>
+               <method-params></method-params>
+            </method>
+            <method>
+               <description>description_42</description>
+               <ejb-name>name_2</ejb-name>
+               <method-intf>Home</method-intf>
+               <method-name>name_42</method-name>
+               <method-params>
+                  <method-param>parms_48</method-param>
+               </method-params>
+            </method>
+            <method>
+               <description>description_43</description>
+               <ejb-name>name_3</ejb-name>
+               <method-intf>Local</method-intf>
+               <method-name>name_43</method-name>
+               <method-params>
+                  <method-param>parms_49</method-param>
+                  <method-param>parms_50</method-param>
+               </method-params>
+            </method>
+            <method>
+               <description>description_44</description>
+               <ejb-name>name_4</ejb-name>
+               <method-intf>LocalHome</method-intf>
+               <method-name>name_44</method-name>
+               <method-params>
+                  <method-param>parms_51</method-param>
+                  <method-param>parms_52</method-param>
+                  <method-param>parms_53</method-param>
+               </method-params>
+            </method>
+            <trans-attribute>RequiresNew</trans-attribute>
+         </container-transaction>
+         <container-transaction>
+            <description>description_4</description>
+            <method>
+               <description>description_45</description>
+               <ejb-name>name_5</ejb-name>
+               <method-name>name_45</method-name>
+            </method>
+            <method>
+               <description>description_46</description>
+               <ejb-name>name_6</ejb-name>
+               <method-intf>Remote</method-intf>
+               <method-name>name_46</method-name>
+               <method-params></method-params>
+            </method>
+            <method>
+               <description>description_47</description>
+               <ejb-name>name_7</ejb-name>
+               <method-intf>Home</method-intf>
+               <method-name>name_47</method-name>
+               <method-params>
+                  <method-param>parms_54</method-param>
+               </method-params>
+            </method>
+            <method>
+               <description>description_48</description>
+               <ejb-name>name_8</ejb-name>
+               <method-intf>Local</method-intf>
+               <method-name>name_48</method-name>
+               <method-params>
+                  <method-param>parms_55</method-param>
+                  <method-param>parms_56</method-param>
+               </method-params>
+            </method>
+            <method>
+               <description>description_49</description>
+               <ejb-name>name_9</ejb-name>
+               <method-intf>LocalHome</method-intf>
+               <method-name>name_49</method-name>
+               <method-params>
+                  <method-param>parms_57</method-param>
+                  <method-param>parms_58</method-param>
+                  <method-param>parms_59</method-param>
+               </method-params>
+            </method>
+            <trans-attribute>Mandatory</trans-attribute>
+         </container-transaction>
+         <exclude-list>
+            <description>description_0</description>
+            <method>
+               <description>description_50</description>
+               <ejb-name>name_0</ejb-name>
+               <method-name>name_50</method-name>
+            </method>
+            <method>
+               <description>description_51</description>
+               <ejb-name>name_1</ejb-name>
+               <method-intf>Remote</method-intf>
+               <method-name>name_51</method-name>
+               <method-params></method-params>
+            </method>
+            <method>
+               <description>description_52</description>
+               <ejb-name>name_2</ejb-name>
+               <method-intf>Home</method-intf>
+               <method-name>name_52</method-name>
+               <method-params>
+                  <method-param>parms_60</method-param>
+               </method-params>
+            </method>
+            <method>
+               <description>description_53</description>
+               <ejb-name>name_3</ejb-name>
+               <method-intf>Local</method-intf>
+               <method-name>name_53</method-name>
+               <method-params>
+                  <method-param>parms_61</method-param>
+                  <method-param>parms_62</method-param>
+               </method-params>
+            </method>
+            <method>
+               <description>description_54</description>
+               <ejb-name>name_4</ejb-name>
+               <method-intf>LocalHome</method-intf>
+               <method-name>name_54</method-name>
+               <method-params>
+                  <method-param>parms_63</method-param>
+                  <method-param>parms_64</method-param>
+                  <method-param>parms_65</method-param>
+               </method-params>
+            </method>
+         </exclude-list>
+      </assembly-descriptor>
+      <ejb-client-jar>ejbClientJar_0</ejb-client-jar>
+   </ejb-jar>
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/EMFTestNoID/ra.xml b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/EMFTestNoID/ra.xml
new file mode 100644
index 0000000..2e2a262
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/EMFTestNoID/ra.xml
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE connector PUBLIC "-//Sun Microsystems, Inc.//DTD Connector 1.0//EN" "http://java.sun.com/dtd/connector_1_0.dtd">
+<connector>
+    <display-name>displayName_0</display-name>
+    <description>description_0</description>
+    <icon>
+        <small-icon>smallIcon_0</small-icon>
+        <large-icon>largeIcon_0</large-icon>
+    </icon>
+    <vendor-name>vendorName_0</vendor-name>
+    <spec-version>1.0</spec-version>
+    <eis-type>eisType_0</eis-type>
+    <version>1.0</version>
+    <license>
+        <description>description_0</description>
+        <license-required>true</license-required>
+    </license>
+    <resourceadapter>
+        <managedconnectionfactory-class>managedConnectionFactoryClass_0</managedconnectionfactory-class>
+        <connectionfactory-interface>connectionFactoryInterface_0</connectionfactory-interface>
+        <connectionfactory-impl-class>connectionFactoryImplClass_0</connectionfactory-impl-class>
+        <connection-interface>connectionInterface_0</connection-interface>
+        <connection-impl-class>connectionImplClass_0</connection-impl-class>
+        <transaction-support>NoTransaction</transaction-support>
+        <config-property>
+            <description>description_0</description>
+            <config-property-name>name_0</config-property-name>
+            <config-property-type>java.lang.String</config-property-type>
+            <config-property-value>value_0</config-property-value>
+        </config-property>
+        <config-property>
+            <description>description_1</description>
+            <config-property-name>name_1</config-property-name>
+            <config-property-type>java.lang.String</config-property-type>
+            <config-property-value>value_1</config-property-value>
+        </config-property>
+        <config-property>
+            <description>description_2</description>
+            <config-property-name>name_2</config-property-name>
+            <config-property-type>java.lang.String</config-property-type>
+            <config-property-value>value_2</config-property-value>
+        </config-property>
+        <config-property>
+            <description>description_3</description>
+            <config-property-name>name_3</config-property-name>
+            <config-property-type>java.lang.String</config-property-type>
+            <config-property-value>value_3</config-property-value>
+        </config-property>
+        <config-property>
+            <description>description_4</description>
+            <config-property-name>name_4</config-property-name>
+            <config-property-type>java.lang.String</config-property-type>
+            <config-property-value>value_4</config-property-value>
+        </config-property>
+        <authentication-mechanism>
+            <description>description_0</description>
+            <authentication-mechanism-type>BasicPassword</authentication-mechanism-type>
+            <credential-interface>javax.resource.spi.security.PasswordCredential</credential-interface>
+        </authentication-mechanism>
+        <authentication-mechanism>
+            <description>description_1</description>
+            <authentication-mechanism-type>Kerbv5</authentication-mechanism-type>
+            <credential-interface>javax.resource.spi.security.PasswordCredential</credential-interface>
+        </authentication-mechanism>
+        <authentication-mechanism>
+            <description>description_2</description>
+            <authentication-mechanism-type>BasicPassword</authentication-mechanism-type>
+            <credential-interface>javax.resource.spi.security.PasswordCredential</credential-interface>
+        </authentication-mechanism>
+        <authentication-mechanism>
+            <description>description_3</description>
+            <authentication-mechanism-type>Kerbv5</authentication-mechanism-type>
+            <credential-interface>javax.resource.spi.security.PasswordCredential</credential-interface>
+        </authentication-mechanism>
+        <authentication-mechanism>
+            <description>description_4</description>
+            <authentication-mechanism-type>BasicPassword</authentication-mechanism-type>
+            <credential-interface>javax.resource.spi.security.PasswordCredential</credential-interface>
+        </authentication-mechanism>
+        <reauthentication-support>true</reauthentication-support>
+        <security-permission>
+            <description>description_0</description>
+            <security-permission-spec>specification_0</security-permission-spec>
+        </security-permission>
+        <security-permission>
+            <description>description_1</description>
+            <security-permission-spec>specification_1</security-permission-spec>
+        </security-permission>
+        <security-permission>
+            <description>description_2</description>
+            <security-permission-spec>specification_2</security-permission-spec>
+        </security-permission>
+        <security-permission>
+            <description>description_3</description>
+            <security-permission-spec>specification_3</security-permission-spec>
+        </security-permission>
+        <security-permission>
+            <description>description_4</description>
+            <security-permission-spec>specification_4</security-permission-spec>
+        </security-permission>
+    </resourceadapter>
+</connector>
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/EMFTestNoID/web.xml b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/EMFTestNoID/web.xml
new file mode 100644
index 0000000..409f958
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/EMFTestNoID/web.xml
@@ -0,0 +1,1284 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
+<web-app id="WebApp_ID">
+    <icon>
+        <small-icon>smallIcon_0</small-icon>
+        <large-icon>largeIcon_0</large-icon>
+    </icon>
+    <display-name>displayName_0</display-name>
+    <description>description_0</description>
+    <distributable/>
+    <context-param>
+        <param-name>paramName_0</param-name>
+        <param-value>paramValue_0</param-value>
+        <description>description_0</description>
+    </context-param>
+    <context-param>
+        <param-name>paramName_1</param-name>
+        <param-value>paramValue_1</param-value>
+        <description>description_1</description>
+    </context-param>
+    <context-param>
+        <param-name>paramName_2</param-name>
+        <param-value>paramValue_2</param-value>
+        <description>description_2</description>
+    </context-param>
+    <context-param>
+        <param-name>paramName_3</param-name>
+        <param-value>paramValue_3</param-value>
+        <description>description_3</description>
+    </context-param>
+    <context-param>
+        <param-name>paramName_4</param-name>
+        <param-value>paramValue_4</param-value>
+        <description>description_4</description>
+    </context-param>
+    <filter>
+        <icon>
+            <small-icon>smallIcon_0</small-icon>
+            <large-icon>largeIcon_0</large-icon>
+        </icon>
+        <filter-name>name_0</filter-name>
+        <display-name>displayName_0</display-name>
+        <description>description_0</description>
+        <filter-class>java.util.HashTable</filter-class>
+        <init-param>
+            <param-name>paramName_25</param-name>
+            <param-value>paramValue_25</param-value>
+            <description>description_25</description>
+        </init-param>
+        <init-param>
+            <param-name>paramName_26</param-name>
+            <param-value>paramValue_26</param-value>
+            <description>description_26</description>
+        </init-param>
+        <init-param>
+            <param-name>paramName_27</param-name>
+            <param-value>paramValue_27</param-value>
+            <description>description_27</description>
+        </init-param>
+        <init-param>
+            <param-name>paramName_28</param-name>
+            <param-value>paramValue_28</param-value>
+            <description>description_28</description>
+        </init-param>
+        <init-param>
+            <param-name>paramName_29</param-name>
+            <param-value>paramValue_29</param-value>
+            <description>description_29</description>
+        </init-param>
+    </filter>
+    <filter>
+        <icon>
+            <small-icon>smallIcon_1</small-icon>
+            <large-icon>largeIcon_1</large-icon>
+        </icon>
+        <filter-name>name_1</filter-name>
+        <display-name>displayName_1</display-name>
+        <description>description_1</description>
+        <filter-class>java.util.List</filter-class>
+        <init-param>
+            <param-name>paramName_30</param-name>
+            <param-value>paramValue_30</param-value>
+            <description>description_30</description>
+        </init-param>
+        <init-param>
+            <param-name>paramName_31</param-name>
+            <param-value>paramValue_31</param-value>
+            <description>description_31</description>
+        </init-param>
+        <init-param>
+            <param-name>paramName_32</param-name>
+            <param-value>paramValue_32</param-value>
+            <description>description_32</description>
+        </init-param>
+        <init-param>
+            <param-name>paramName_33</param-name>
+            <param-value>paramValue_33</param-value>
+            <description>description_33</description>
+        </init-param>
+        <init-param>
+            <param-name>paramName_34</param-name>
+            <param-value>paramValue_34</param-value>
+            <description>description_34</description>
+        </init-param>
+    </filter>
+    <filter>
+        <icon>
+            <small-icon>smallIcon_2</small-icon>
+            <large-icon>largeIcon_2</large-icon>
+        </icon>
+        <filter-name>name_2</filter-name>
+        <display-name>displayName_2</display-name>
+        <description>description_2</description>
+        <filter-class>java.sql.Data</filter-class>
+        <init-param>
+            <param-name>paramName_35</param-name>
+            <param-value>paramValue_35</param-value>
+            <description>description_35</description>
+        </init-param>
+        <init-param>
+            <param-name>paramName_36</param-name>
+            <param-value>paramValue_36</param-value>
+            <description>description_36</description>
+        </init-param>
+        <init-param>
+            <param-name>paramName_37</param-name>
+            <param-value>paramValue_37</param-value>
+            <description>description_37</description>
+        </init-param>
+        <init-param>
+            <param-name>paramName_38</param-name>
+            <param-value>paramValue_38</param-value>
+            <description>description_38</description>
+        </init-param>
+        <init-param>
+            <param-name>paramName_39</param-name>
+            <param-value>paramValue_39</param-value>
+            <description>description_39</description>
+        </init-param>
+    </filter>
+    <filter>
+        <icon>
+            <small-icon>smallIcon_3</small-icon>
+            <large-icon>largeIcon_3</large-icon>
+        </icon>
+        <filter-name>name_3</filter-name>
+        <display-name>displayName_3</display-name>
+        <description>description_3</description>
+        <filter-class>java.lang.Integer</filter-class>
+        <init-param>
+            <param-name>paramName_40</param-name>
+            <param-value>paramValue_40</param-value>
+            <description>description_40</description>
+        </init-param>
+        <init-param>
+            <param-name>paramName_41</param-name>
+            <param-value>paramValue_41</param-value>
+            <description>description_41</description>
+        </init-param>
+        <init-param>
+            <param-name>paramName_42</param-name>
+            <param-value>paramValue_42</param-value>
+            <description>description_42</description>
+        </init-param>
+        <init-param>
+            <param-name>paramName_43</param-name>
+            <param-value>paramValue_43</param-value>
+            <description>description_43</description>
+        </init-param>
+        <init-param>
+            <param-name>paramName_44</param-name>
+            <param-value>paramValue_44</param-value>
+            <description>description_44</description>
+        </init-param>
+    </filter>
+    <filter>
+        <icon>
+            <small-icon>smallIcon_4</small-icon>
+            <large-icon>largeIcon_4</large-icon>
+        </icon>
+        <filter-name>name_4</filter-name>
+        <display-name>displayName_4</display-name>
+        <description>description_4</description>
+        <filter-class>java.lang.String</filter-class>
+        <init-param>
+            <param-name>paramName_45</param-name>
+            <param-value>paramValue_45</param-value>
+            <description>description_45</description>
+        </init-param>
+        <init-param>
+            <param-name>paramName_46</param-name>
+            <param-value>paramValue_46</param-value>
+            <description>description_46</description>
+        </init-param>
+        <init-param>
+            <param-name>paramName_47</param-name>
+            <param-value>paramValue_47</param-value>
+            <description>description_47</description>
+        </init-param>
+        <init-param>
+            <param-name>paramName_48</param-name>
+            <param-value>paramValue_48</param-value>
+            <description>description_48</description>
+        </init-param>
+        <init-param>
+            <param-name>paramName_49</param-name>
+            <param-value>paramValue_49</param-value>
+            <description>description_49</description>
+        </init-param>
+    </filter>
+    <filter-mapping>
+        <filter-name>name_0</filter-name>
+        <url-pattern>urlPattern_0</url-pattern>
+    </filter-mapping>
+    <filter-mapping>
+        <filter-name>name_1</filter-name>
+        <url-pattern>urlPattern_1</url-pattern>
+    </filter-mapping>
+    <filter-mapping>
+        <filter-name>name_2</filter-name>
+        <url-pattern>urlPattern_2</url-pattern>
+    </filter-mapping>
+    <filter-mapping>
+        <filter-name>name_3</filter-name>
+        <url-pattern>urlPattern_3</url-pattern>
+    </filter-mapping>
+    <filter-mapping>
+        <filter-name>name_4</filter-name>
+        <url-pattern>urlPattern_4</url-pattern>
+    </filter-mapping>
+    <listener>
+        <listener-class>java.util.HashTable</listener-class>
+    </listener>
+    <listener>
+        <listener-class>java.util.List</listener-class>
+    </listener>
+    <listener>
+        <listener-class>java.sql.Data</listener-class>
+    </listener>
+    <listener>
+        <listener-class>java.lang.Integer</listener-class>
+    </listener>
+    <listener>
+        <listener-class>java.lang.String</listener-class>
+    </listener>
+    <servlet>
+        <icon>
+            <small-icon>smallIcon_0</small-icon>
+            <large-icon>largeIcon_0</large-icon>
+        </icon>
+        <servlet-name>servletName_0</servlet-name>
+        <display-name>displayName_0</display-name>
+        <description>description_0</description>
+        <jsp-file>jspFile_0</jsp-file>
+        <init-param>
+            <param-name>paramName_0</param-name>
+            <param-value>paramValue_0</param-value>
+            <description>description_0</description>
+        </init-param>
+        <init-param>
+            <param-name>paramName_1</param-name>
+            <param-value>paramValue_1</param-value>
+            <description>description_1</description>
+        </init-param>
+        <init-param>
+            <param-name>paramName_2</param-name>
+            <param-value>paramValue_2</param-value>
+            <description>description_2</description>
+        </init-param>
+        <init-param>
+            <param-name>paramName_3</param-name>
+            <param-value>paramValue_3</param-value>
+            <description>description_3</description>
+        </init-param>
+        <init-param>
+            <param-name>paramName_4</param-name>
+            <param-value>paramValue_4</param-value>
+            <description>description_4</description>
+        </init-param>
+        <load-on-startup>0</load-on-startup>
+        <run-as>
+            <description>description_0</description>
+            <role-name>roleName_0</role-name>
+        </run-as>
+        <security-role-ref>
+            <description>description_0</description>
+            <role-name>name_0</role-name>
+            <role-link>link_0</role-link>
+        </security-role-ref>
+        <security-role-ref>
+            <description>description_1</description>
+            <role-name>name_1</role-name>
+            <role-link>link_1</role-link>
+        </security-role-ref>
+        <security-role-ref>
+            <description>description_2</description>
+            <role-name>name_2</role-name>
+            <role-link>link_2</role-link>
+        </security-role-ref>
+        <security-role-ref>
+            <description>description_3</description>
+            <role-name>name_3</role-name>
+            <role-link>link_3</role-link>
+        </security-role-ref>
+        <security-role-ref>
+            <description>description_4</description>
+            <role-name>name_4</role-name>
+            <role-link>link_4</role-link>
+        </security-role-ref>
+    </servlet>
+    <servlet>
+        <icon>
+            <small-icon>smallIcon_1</small-icon>
+            <large-icon>largeIcon_1</large-icon>
+        </icon>
+        <servlet-name>servletName_1</servlet-name>
+        <display-name>displayName_1</display-name>
+        <description>description_1</description>
+        <servlet-class>className_0</servlet-class>
+        <init-param>
+            <param-name>paramName_5</param-name>
+            <param-value>paramValue_5</param-value>
+            <description>description_5</description>
+        </init-param>
+        <init-param>
+            <param-name>paramName_6</param-name>
+            <param-value>paramValue_6</param-value>
+            <description>description_6</description>
+        </init-param>
+        <init-param>
+            <param-name>paramName_7</param-name>
+            <param-value>paramValue_7</param-value>
+            <description>description_7</description>
+        </init-param>
+        <init-param>
+            <param-name>paramName_8</param-name>
+            <param-value>paramValue_8</param-value>
+            <description>description_8</description>
+        </init-param>
+        <init-param>
+            <param-name>paramName_9</param-name>
+            <param-value>paramValue_9</param-value>
+            <description>description_9</description>
+        </init-param>
+        <load-on-startup>1</load-on-startup>
+        <run-as>
+            <description>description_1</description>
+            <role-name>roleName_1</role-name>
+        </run-as>
+        <security-role-ref>
+            <description>description_5</description>
+            <role-name>name_5</role-name>
+            <role-link>link_5</role-link>
+        </security-role-ref>
+        <security-role-ref>
+            <description>description_6</description>
+            <role-name>name_6</role-name>
+            <role-link>link_6</role-link>
+        </security-role-ref>
+        <security-role-ref>
+            <description>description_7</description>
+            <role-name>name_7</role-name>
+            <role-link>link_7</role-link>
+        </security-role-ref>
+        <security-role-ref>
+            <description>description_8</description>
+            <role-name>name_8</role-name>
+            <role-link>link_8</role-link>
+        </security-role-ref>
+        <security-role-ref>
+            <description>description_9</description>
+            <role-name>name_9</role-name>
+            <role-link>link_9</role-link>
+        </security-role-ref>
+    </servlet>
+    <servlet>
+        <icon>
+            <small-icon>smallIcon_2</small-icon>
+            <large-icon>largeIcon_2</large-icon>
+        </icon>
+        <servlet-name>servletName_2</servlet-name>
+        <display-name>displayName_2</display-name>
+        <description>description_2</description>
+        <jsp-file>jspFile_1</jsp-file>
+        <init-param>
+            <param-name>paramName_10</param-name>
+            <param-value>paramValue_10</param-value>
+            <description>description_10</description>
+        </init-param>
+        <init-param>
+            <param-name>paramName_11</param-name>
+            <param-value>paramValue_11</param-value>
+            <description>description_11</description>
+        </init-param>
+        <init-param>
+            <param-name>paramName_12</param-name>
+            <param-value>paramValue_12</param-value>
+            <description>description_12</description>
+        </init-param>
+        <init-param>
+            <param-name>paramName_13</param-name>
+            <param-value>paramValue_13</param-value>
+            <description>description_13</description>
+        </init-param>
+        <init-param>
+            <param-name>paramName_14</param-name>
+            <param-value>paramValue_14</param-value>
+            <description>description_14</description>
+        </init-param>
+        <load-on-startup>2</load-on-startup>
+        <run-as>
+            <description>description_2</description>
+            <role-name>roleName_2</role-name>
+        </run-as>
+        <security-role-ref>
+            <description>description_10</description>
+            <role-name>name_10</role-name>
+            <role-link>link_10</role-link>
+        </security-role-ref>
+        <security-role-ref>
+            <description>description_11</description>
+            <role-name>name_11</role-name>
+            <role-link>link_11</role-link>
+        </security-role-ref>
+        <security-role-ref>
+            <description>description_12</description>
+            <role-name>name_12</role-name>
+            <role-link>link_12</role-link>
+        </security-role-ref>
+        <security-role-ref>
+            <description>description_13</description>
+            <role-name>name_13</role-name>
+            <role-link>link_13</role-link>
+        </security-role-ref>
+        <security-role-ref>
+            <description>description_14</description>
+            <role-name>name_14</role-name>
+            <role-link>link_14</role-link>
+        </security-role-ref>
+    </servlet>
+    <servlet>
+        <icon>
+            <small-icon>smallIcon_3</small-icon>
+            <large-icon>largeIcon_3</large-icon>
+        </icon>
+        <servlet-name>servletName_3</servlet-name>
+        <display-name>displayName_3</display-name>
+        <description>description_3</description>
+        <servlet-class>className_1</servlet-class>
+        <init-param>
+            <param-name>paramName_15</param-name>
+            <param-value>paramValue_15</param-value>
+            <description>description_15</description>
+        </init-param>
+        <init-param>
+            <param-name>paramName_16</param-name>
+            <param-value>paramValue_16</param-value>
+            <description>description_16</description>
+        </init-param>
+        <init-param>
+            <param-name>paramName_17</param-name>
+            <param-value>paramValue_17</param-value>
+            <description>description_17</description>
+        </init-param>
+        <init-param>
+            <param-name>paramName_18</param-name>
+            <param-value>paramValue_18</param-value>
+            <description>description_18</description>
+        </init-param>
+        <init-param>
+            <param-name>paramName_19</param-name>
+            <param-value>paramValue_19</param-value>
+            <description>description_19</description>
+        </init-param>
+        <load-on-startup>3</load-on-startup>
+        <run-as>
+            <description>description_3</description>
+            <role-name>roleName_3</role-name>
+        </run-as>
+        <security-role-ref>
+            <description>description_15</description>
+            <role-name>name_15</role-name>
+            <role-link>link_15</role-link>
+        </security-role-ref>
+        <security-role-ref>
+            <description>description_16</description>
+            <role-name>name_16</role-name>
+            <role-link>link_16</role-link>
+        </security-role-ref>
+        <security-role-ref>
+            <description>description_17</description>
+            <role-name>name_17</role-name>
+            <role-link>link_17</role-link>
+        </security-role-ref>
+        <security-role-ref>
+            <description>description_18</description>
+            <role-name>name_18</role-name>
+            <role-link>link_18</role-link>
+        </security-role-ref>
+        <security-role-ref>
+            <description>description_19</description>
+            <role-name>name_19</role-name>
+            <role-link>link_19</role-link>
+        </security-role-ref>
+    </servlet>
+    <servlet>
+        <icon>
+            <small-icon>smallIcon_4</small-icon>
+            <large-icon>largeIcon_4</large-icon>
+        </icon>
+        <servlet-name>servletName_4</servlet-name>
+        <display-name>displayName_4</display-name>
+        <description>description_4</description>
+        <jsp-file>jspFile_2</jsp-file>
+        <init-param>
+            <param-name>paramName_20</param-name>
+            <param-value>paramValue_20</param-value>
+            <description>description_20</description>
+        </init-param>
+        <init-param>
+            <param-name>paramName_21</param-name>
+            <param-value>paramValue_21</param-value>
+            <description>description_21</description>
+        </init-param>
+        <init-param>
+            <param-name>paramName_22</param-name>
+            <param-value>paramValue_22</param-value>
+            <description>description_22</description>
+        </init-param>
+        <init-param>
+            <param-name>paramName_23</param-name>
+            <param-value>paramValue_23</param-value>
+            <description>description_23</description>
+        </init-param>
+        <init-param>
+            <param-name>paramName_24</param-name>
+            <param-value>paramValue_24</param-value>
+            <description>description_24</description>
+        </init-param>
+        <load-on-startup>4</load-on-startup>
+        <run-as>
+            <description>description_4</description>
+            <role-name>roleName_4</role-name>
+        </run-as>
+        <security-role-ref>
+            <description>description_20</description>
+            <role-name>name_20</role-name>
+            <role-link>link_20</role-link>
+        </security-role-ref>
+        <security-role-ref>
+            <description>description_21</description>
+            <role-name>name_21</role-name>
+            <role-link>link_21</role-link>
+        </security-role-ref>
+        <security-role-ref>
+            <description>description_22</description>
+            <role-name>name_22</role-name>
+            <role-link>link_22</role-link>
+        </security-role-ref>
+        <security-role-ref>
+            <description>description_23</description>
+            <role-name>name_23</role-name>
+            <role-link>link_23</role-link>
+        </security-role-ref>
+        <security-role-ref>
+            <description>description_24</description>
+            <role-name>name_24</role-name>
+            <role-link>link_24</role-link>
+        </security-role-ref>
+    </servlet>
+    <servlet-mapping>
+        <servlet-name>servletName_0</servlet-name>
+        <url-pattern>urlPattern_0</url-pattern>
+    </servlet-mapping>
+    <servlet-mapping>
+        <servlet-name>servletName_1</servlet-name>
+        <url-pattern>urlPattern_1</url-pattern>
+    </servlet-mapping>
+    <servlet-mapping>
+        <servlet-name>servletName_2</servlet-name>
+        <url-pattern>urlPattern_2</url-pattern>
+    </servlet-mapping>
+    <servlet-mapping>
+        <servlet-name>servletName_3</servlet-name>
+        <url-pattern>urlPattern_3</url-pattern>
+    </servlet-mapping>
+    <servlet-mapping>
+        <servlet-name>servletName_4</servlet-name>
+        <url-pattern>urlPattern_4</url-pattern>
+    </servlet-mapping>
+    <session-config>
+        <session-timeout>0</session-timeout>
+    </session-config>
+    <mime-mapping>
+        <extension>extension_0</extension>
+        <mime-type>mimeType_0</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>extension_1</extension>
+        <mime-type>mimeType_1</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>extension_2</extension>
+        <mime-type>mimeType_2</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>extension_3</extension>
+        <mime-type>mimeType_3</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>extension_4</extension>
+        <mime-type>mimeType_4</mime-type>
+    </mime-mapping>
+    <welcome-file-list>
+        <welcome-file>welcomeFile_0</welcome-file>
+        <welcome-file>welcomeFile_1</welcome-file>
+        <welcome-file>welcomeFile_2</welcome-file>
+        <welcome-file>welcomeFile_3</welcome-file>
+        <welcome-file>welcomeFile_4</welcome-file>
+    </welcome-file-list>
+    <error-page>
+        <exception-type>java.util.HashTable</exception-type>
+        <location>location_0</location>
+    </error-page>
+    <error-page>
+        <error-code>errorCode_0</error-code>
+        <location>location_0</location>
+    </error-page>
+    <error-page>
+        <exception-type>java.util.List</exception-type>
+        <location>location_1</location>
+    </error-page>
+    <error-page>
+        <error-code>errorCode_1</error-code>
+        <location>location_1</location>
+    </error-page>
+    <error-page>
+        <exception-type>java.sql.Data</exception-type>
+        <location>location_2</location>
+    </error-page>
+    <taglib>
+        <taglib-uri>taglibURI_0</taglib-uri>
+        <taglib-location>taglibLocation_0</taglib-location>
+    </taglib>
+    <taglib>
+        <taglib-uri>taglibURI_1</taglib-uri>
+        <taglib-location>taglibLocation_1</taglib-location>
+    </taglib>
+    <taglib>
+        <taglib-uri>taglibURI_2</taglib-uri>
+        <taglib-location>taglibLocation_2</taglib-location>
+    </taglib>
+    <taglib>
+        <taglib-uri>taglibURI_3</taglib-uri>
+        <taglib-location>taglibLocation_3</taglib-location>
+    </taglib>
+    <taglib>
+        <taglib-uri>taglibURI_4</taglib-uri>
+        <taglib-location>taglibLocation_4</taglib-location>
+    </taglib>
+    <resource-env-ref>
+        <description>description_0</description>
+        <resource-env-ref-name>name_0</resource-env-ref-name>
+        <resource-env-ref-type>java.util.HashTable</resource-env-ref-type>
+    </resource-env-ref>
+    <resource-env-ref>
+        <description>description_1</description>
+        <resource-env-ref-name>name_1</resource-env-ref-name>
+        <resource-env-ref-type>java.util.List</resource-env-ref-type>
+    </resource-env-ref>
+    <resource-env-ref>
+        <description>description_2</description>
+        <resource-env-ref-name>name_2</resource-env-ref-name>
+        <resource-env-ref-type>java.sql.Data</resource-env-ref-type>
+    </resource-env-ref>
+    <resource-env-ref>
+        <description>description_3</description>
+        <resource-env-ref-name>name_3</resource-env-ref-name>
+        <resource-env-ref-type>java.lang.Integer</resource-env-ref-type>
+    </resource-env-ref>
+    <resource-env-ref>
+        <description>description_4</description>
+        <resource-env-ref-name>name_4</resource-env-ref-name>
+        <resource-env-ref-type>java.lang.String</resource-env-ref-type>
+    </resource-env-ref>
+    <resource-ref>
+        <description>description_0</description>
+        <res-ref-name>name_0</res-ref-name>
+        <res-type>type_0</res-type>
+        <res-auth>Container</res-auth>
+        <res-sharing-scope>Shareable</res-sharing-scope>
+    </resource-ref>
+    <resource-ref>
+        <description>description_1</description>
+        <res-ref-name>name_1</res-ref-name>
+        <res-type>type_1</res-type>
+        <res-auth>Application</res-auth>
+        <res-sharing-scope>Unshareable</res-sharing-scope>
+    </resource-ref>
+    <resource-ref>
+        <description>description_2</description>
+        <res-ref-name>name_2</res-ref-name>
+        <res-type>type_2</res-type>
+        <res-auth>Container</res-auth>
+        <res-sharing-scope>Shareable</res-sharing-scope>
+    </resource-ref>
+    <resource-ref>
+        <description>description_3</description>
+        <res-ref-name>name_3</res-ref-name>
+        <res-type>type_3</res-type>
+        <res-auth>Application</res-auth>
+        <res-sharing-scope>Unshareable</res-sharing-scope>
+    </resource-ref>
+    <resource-ref>
+        <description>description_4</description>
+        <res-ref-name>name_4</res-ref-name>
+        <res-type>type_4</res-type>
+        <res-auth>Container</res-auth>
+        <res-sharing-scope>Shareable</res-sharing-scope>
+    </resource-ref>
+    <security-constraint>
+        <display-name>displayName_0</display-name>
+        <web-resource-collection>
+            <web-resource-name>webResourceName_0</web-resource-name>
+            <description>description_0</description>
+            <url-pattern>urlPattern_0</url-pattern>
+            <url-pattern>urlPattern_1</url-pattern>
+            <url-pattern>urlPattern_2</url-pattern>
+            <url-pattern>urlPattern_3</url-pattern>
+            <url-pattern>urlPattern_4</url-pattern>
+            <http-method>GET</http-method>
+            <http-method>POST</http-method>
+            <http-method>PUT</http-method>
+            <http-method>DELETE</http-method>
+            <http-method>HEAD</http-method>
+        </web-resource-collection>
+        <web-resource-collection>
+            <web-resource-name>webResourceName_1</web-resource-name>
+            <description>description_1</description>
+            <url-pattern>urlPattern_5</url-pattern>
+            <url-pattern>urlPattern_6</url-pattern>
+            <url-pattern>urlPattern_7</url-pattern>
+            <url-pattern>urlPattern_8</url-pattern>
+            <url-pattern>urlPattern_9</url-pattern>
+            <http-method>OPTIONS</http-method>
+            <http-method>TRACE</http-method>
+            <http-method>ACL</http-method>
+            <http-method>BASELINE-CONTROL</http-method>
+            <http-method>BIND</http-method>
+        </web-resource-collection>
+        <web-resource-collection>
+            <web-resource-name>webResourceName_2</web-resource-name>
+            <description>description_2</description>
+            <url-pattern>urlPattern_10</url-pattern>
+            <url-pattern>urlPattern_11</url-pattern>
+            <url-pattern>urlPattern_12</url-pattern>
+            <url-pattern>urlPattern_13</url-pattern>
+            <url-pattern>urlPattern_14</url-pattern>
+            <http-method>CHECKIN</http-method>
+            <http-method>CHECKOUT</http-method>
+            <http-method>LABEL</http-method>
+            <http-method>MERGE</http-method>
+            <http-method>MKACTIVITY</http-method>
+        </web-resource-collection>
+        <web-resource-collection>
+            <web-resource-name>webResourceName_3</web-resource-name>
+            <description>description_3</description>
+            <url-pattern>urlPattern_15</url-pattern>
+            <url-pattern>urlPattern_16</url-pattern>
+            <url-pattern>urlPattern_17</url-pattern>
+            <url-pattern>urlPattern_18</url-pattern>
+            <url-pattern>urlPattern_19</url-pattern>
+            <http-method>MKWORKSPACE</http-method>
+            <http-method>REBIND</http-method>
+            <http-method>REPORT</http-method>
+            <http-method>SEARCH</http-method>
+            <http-method>UNBIND</http-method>
+        </web-resource-collection>
+        <web-resource-collection>
+            <web-resource-name>webResourceName_4</web-resource-name>
+            <description>description_4</description>
+            <url-pattern>urlPattern_20</url-pattern>
+            <url-pattern>urlPattern_21</url-pattern>
+            <url-pattern>urlPattern_22</url-pattern>
+            <url-pattern>urlPattern_23</url-pattern>
+            <url-pattern>urlPattern_24</url-pattern>
+            <http-method>UNCHECKOUT</http-method>
+            <http-method>UPDATE</http-method>
+            <http-method>VERSION-CONTROL</http-method>
+            <http-method>ACK</http-method>
+            <http-method>BYE</http-method>
+        </web-resource-collection>
+        <auth-constraint>
+            <description>description_0</description>
+            <role-name>roles_0</role-name>
+            <role-name>roles_1</role-name>
+            <role-name>roles_2</role-name>
+            <role-name>roles_3</role-name>
+            <role-name>roles_4</role-name>
+        </auth-constraint>
+        <user-data-constraint>
+            <description>description_0</description>
+            <transport-guarantee>NONE</transport-guarantee>
+        </user-data-constraint>
+    </security-constraint>
+    <security-constraint>
+        <display-name>displayName_1</display-name>
+        <web-resource-collection>
+            <web-resource-name>webResourceName_5</web-resource-name>
+            <description>description_5</description>
+            <url-pattern>urlPattern_25</url-pattern>
+            <url-pattern>urlPattern_26</url-pattern>
+            <url-pattern>urlPattern_27</url-pattern>
+            <url-pattern>urlPattern_28</url-pattern>
+            <url-pattern>urlPattern_29</url-pattern>
+            <http-method>CANCEL</http-method>
+            <http-method>COPY</http-method>
+            <http-method>ERRORRESPONSE</http-method>
+            <http-method>INFO</http-method>
+            <http-method>INVITE</http-method>
+        </web-resource-collection>
+        <web-resource-collection>
+            <web-resource-name>webResourceName_6</web-resource-name>
+            <description>description_6</description>
+            <url-pattern>urlPattern_30</url-pattern>
+            <url-pattern>urlPattern_31</url-pattern>
+            <url-pattern>urlPattern_32</url-pattern>
+            <url-pattern>urlPattern_33</url-pattern>
+            <url-pattern>urlPattern_34</url-pattern>
+            <http-method>LOCK</http-method>
+            <http-method>MESSAGE</http-method>
+            <http-method>MKCOL</http-method>
+            <http-method>MOVE</http-method>
+            <http-method>NOTIFY</http-method>
+        </web-resource-collection>
+        <web-resource-collection>
+            <web-resource-name>webResourceName_7</web-resource-name>
+            <description>description_7</description>
+            <url-pattern>urlPattern_35</url-pattern>
+            <url-pattern>urlPattern_36</url-pattern>
+            <url-pattern>urlPattern_37</url-pattern>
+            <url-pattern>urlPattern_38</url-pattern>
+            <url-pattern>urlPattern_39</url-pattern>
+            <http-method>PRACK</http-method>
+            <http-method>PROPFIND</http-method>
+            <http-method>PROPPATCH</http-method>
+            <http-method>PROVISIONALRESPONSE</http-method>
+            <http-method>PUBLISH</http-method>
+        </web-resource-collection>
+        <web-resource-collection>
+            <web-resource-name>webResourceName_8</web-resource-name>
+            <description>description_8</description>
+            <url-pattern>urlPattern_40</url-pattern>
+            <url-pattern>urlPattern_41</url-pattern>
+            <url-pattern>urlPattern_42</url-pattern>
+            <url-pattern>urlPattern_43</url-pattern>
+            <url-pattern>urlPattern_44</url-pattern>
+            <http-method>REDIRECTRESPONSE</http-method>
+            <http-method>REGISTER</http-method>
+            <http-method>REQUEST</http-method>
+            <http-method>RESPONSE</http-method>
+            <http-method>SUCCESSRESPONSE</http-method>
+        </web-resource-collection>
+        <web-resource-collection>
+            <web-resource-name>webResourceName_9</web-resource-name>
+            <description>description_9</description>
+            <url-pattern>urlPattern_45</url-pattern>
+            <url-pattern>urlPattern_46</url-pattern>
+            <url-pattern>urlPattern_47</url-pattern>
+            <url-pattern>urlPattern_48</url-pattern>
+            <url-pattern>urlPattern_49</url-pattern>
+            <http-method>UNLOCK</http-method>
+            <http-method>GET</http-method>
+            <http-method>POST</http-method>
+            <http-method>PUT</http-method>
+            <http-method>DELETE</http-method>
+        </web-resource-collection>
+        <auth-constraint>
+            <description>description_1</description>
+            <role-name>roles_5</role-name>
+            <role-name>roles_6</role-name>
+            <role-name>roles_7</role-name>
+            <role-name>roles_8</role-name>
+            <role-name>roles_9</role-name>
+        </auth-constraint>
+        <user-data-constraint>
+            <description>description_1</description>
+            <transport-guarantee>INTEGRAL</transport-guarantee>
+        </user-data-constraint>
+    </security-constraint>
+    <security-constraint>
+        <display-name>displayName_2</display-name>
+        <web-resource-collection>
+            <web-resource-name>webResourceName_10</web-resource-name>
+            <description>description_10</description>
+            <url-pattern>urlPattern_50</url-pattern>
+            <url-pattern>urlPattern_51</url-pattern>
+            <url-pattern>urlPattern_52</url-pattern>
+            <url-pattern>urlPattern_53</url-pattern>
+            <url-pattern>urlPattern_54</url-pattern>
+            <http-method>HEAD</http-method>
+            <http-method>OPTIONS</http-method>
+            <http-method>TRACE</http-method>
+            <http-method>ACL</http-method>
+            <http-method>BASELINE-CONTROL</http-method>
+        </web-resource-collection>
+        <web-resource-collection>
+            <web-resource-name>webResourceName_11</web-resource-name>
+            <description>description_11</description>
+            <url-pattern>urlPattern_55</url-pattern>
+            <url-pattern>urlPattern_56</url-pattern>
+            <url-pattern>urlPattern_57</url-pattern>
+            <url-pattern>urlPattern_58</url-pattern>
+            <url-pattern>urlPattern_59</url-pattern>
+            <http-method>BIND</http-method>
+            <http-method>CHECKIN</http-method>
+            <http-method>CHECKOUT</http-method>
+            <http-method>LABEL</http-method>
+            <http-method>MERGE</http-method>
+        </web-resource-collection>
+        <web-resource-collection>
+            <web-resource-name>webResourceName_12</web-resource-name>
+            <description>description_12</description>
+            <url-pattern>urlPattern_60</url-pattern>
+            <url-pattern>urlPattern_61</url-pattern>
+            <url-pattern>urlPattern_62</url-pattern>
+            <url-pattern>urlPattern_63</url-pattern>
+            <url-pattern>urlPattern_64</url-pattern>
+            <http-method>MKACTIVITY</http-method>
+            <http-method>MKWORKSPACE</http-method>
+            <http-method>REBIND</http-method>
+            <http-method>REPORT</http-method>
+            <http-method>SEARCH</http-method>
+        </web-resource-collection>
+        <web-resource-collection>
+            <web-resource-name>webResourceName_13</web-resource-name>
+            <description>description_13</description>
+            <url-pattern>urlPattern_65</url-pattern>
+            <url-pattern>urlPattern_66</url-pattern>
+            <url-pattern>urlPattern_67</url-pattern>
+            <url-pattern>urlPattern_68</url-pattern>
+            <url-pattern>urlPattern_69</url-pattern>
+            <http-method>UNBIND</http-method>
+            <http-method>UNCHECKOUT</http-method>
+            <http-method>UPDATE</http-method>
+            <http-method>VERSION-CONTROL</http-method>
+            <http-method>ACK</http-method>
+        </web-resource-collection>
+        <web-resource-collection>
+            <web-resource-name>webResourceName_14</web-resource-name>
+            <description>description_14</description>
+            <url-pattern>urlPattern_70</url-pattern>
+            <url-pattern>urlPattern_71</url-pattern>
+            <url-pattern>urlPattern_72</url-pattern>
+            <url-pattern>urlPattern_73</url-pattern>
+            <url-pattern>urlPattern_74</url-pattern>
+            <http-method>BYE</http-method>
+            <http-method>CANCEL</http-method>
+            <http-method>COPY</http-method>
+            <http-method>ERRORRESPONSE</http-method>
+            <http-method>INFO</http-method>
+        </web-resource-collection>
+        <auth-constraint>
+            <description>description_2</description>
+            <role-name>roles_10</role-name>
+            <role-name>roles_11</role-name>
+            <role-name>roles_12</role-name>
+            <role-name>roles_13</role-name>
+            <role-name>roles_14</role-name>
+        </auth-constraint>
+        <user-data-constraint>
+            <description>description_2</description>
+            <transport-guarantee>CONFIDENTIAL</transport-guarantee>
+        </user-data-constraint>
+    </security-constraint>
+    <security-constraint>
+        <display-name>displayName_3</display-name>
+        <web-resource-collection>
+            <web-resource-name>webResourceName_15</web-resource-name>
+            <description>description_15</description>
+            <url-pattern>urlPattern_75</url-pattern>
+            <url-pattern>urlPattern_76</url-pattern>
+            <url-pattern>urlPattern_77</url-pattern>
+            <url-pattern>urlPattern_78</url-pattern>
+            <url-pattern>urlPattern_79</url-pattern>
+            <http-method>INVITE</http-method>
+            <http-method>LOCK</http-method>
+            <http-method>MESSAGE</http-method>
+            <http-method>MKCOL</http-method>
+            <http-method>MOVE</http-method>
+        </web-resource-collection>
+        <web-resource-collection>
+            <web-resource-name>webResourceName_16</web-resource-name>
+            <description>description_16</description>
+            <url-pattern>urlPattern_80</url-pattern>
+            <url-pattern>urlPattern_81</url-pattern>
+            <url-pattern>urlPattern_82</url-pattern>
+            <url-pattern>urlPattern_83</url-pattern>
+            <url-pattern>urlPattern_84</url-pattern>
+            <http-method>NOTIFY</http-method>
+            <http-method>PRACK</http-method>
+            <http-method>PROPFIND</http-method>
+            <http-method>PROPPATCH</http-method>
+            <http-method>PROVISIONALRESPONSE</http-method>
+        </web-resource-collection>
+        <web-resource-collection>
+            <web-resource-name>webResourceName_17</web-resource-name>
+            <description>description_17</description>
+            <url-pattern>urlPattern_85</url-pattern>
+            <url-pattern>urlPattern_86</url-pattern>
+            <url-pattern>urlPattern_87</url-pattern>
+            <url-pattern>urlPattern_88</url-pattern>
+            <url-pattern>urlPattern_89</url-pattern>
+            <http-method>PUBLISH</http-method>
+            <http-method>REDIRECTRESPONSE</http-method>
+            <http-method>REGISTER</http-method>
+            <http-method>REQUEST</http-method>
+            <http-method>RESPONSE</http-method>
+        </web-resource-collection>
+        <web-resource-collection>
+            <web-resource-name>webResourceName_18</web-resource-name>
+            <description>description_18</description>
+            <url-pattern>urlPattern_90</url-pattern>
+            <url-pattern>urlPattern_91</url-pattern>
+            <url-pattern>urlPattern_92</url-pattern>
+            <url-pattern>urlPattern_93</url-pattern>
+            <url-pattern>urlPattern_94</url-pattern>
+            <http-method>SUCCESSRESPONSE</http-method>
+            <http-method>UNLOCK</http-method>
+            <http-method>GET</http-method>
+            <http-method>POST</http-method>
+            <http-method>PUT</http-method>
+        </web-resource-collection>
+        <web-resource-collection>
+            <web-resource-name>webResourceName_19</web-resource-name>
+            <description>description_19</description>
+            <url-pattern>urlPattern_95</url-pattern>
+            <url-pattern>urlPattern_96</url-pattern>
+            <url-pattern>urlPattern_97</url-pattern>
+            <url-pattern>urlPattern_98</url-pattern>
+            <url-pattern>urlPattern_99</url-pattern>
+            <http-method>DELETE</http-method>
+            <http-method>HEAD</http-method>
+            <http-method>OPTIONS</http-method>
+            <http-method>TRACE</http-method>
+            <http-method>ACL</http-method>
+        </web-resource-collection>
+        <auth-constraint>
+            <description>description_3</description>
+            <role-name>roles_15</role-name>
+            <role-name>roles_16</role-name>
+            <role-name>roles_17</role-name>
+            <role-name>roles_18</role-name>
+            <role-name>roles_19</role-name>
+        </auth-constraint>
+        <user-data-constraint>
+            <description>description_3</description>
+            <transport-guarantee>NONE</transport-guarantee>
+        </user-data-constraint>
+    </security-constraint>
+    <security-constraint>
+        <display-name>displayName_4</display-name>
+        <web-resource-collection>
+            <web-resource-name>webResourceName_20</web-resource-name>
+            <description>description_20</description>
+            <url-pattern>urlPattern_100</url-pattern>
+            <url-pattern>urlPattern_101</url-pattern>
+            <url-pattern>urlPattern_102</url-pattern>
+            <url-pattern>urlPattern_103</url-pattern>
+            <url-pattern>urlPattern_104</url-pattern>
+            <http-method>BASELINE-CONTROL</http-method>
+            <http-method>BIND</http-method>
+            <http-method>CHECKIN</http-method>
+            <http-method>CHECKOUT</http-method>
+            <http-method>LABEL</http-method>
+        </web-resource-collection>
+        <web-resource-collection>
+            <web-resource-name>webResourceName_21</web-resource-name>
+            <description>description_21</description>
+            <url-pattern>urlPattern_105</url-pattern>
+            <url-pattern>urlPattern_106</url-pattern>
+            <url-pattern>urlPattern_107</url-pattern>
+            <url-pattern>urlPattern_108</url-pattern>
+            <url-pattern>urlPattern_109</url-pattern>
+            <http-method>MERGE</http-method>
+            <http-method>MKACTIVITY</http-method>
+            <http-method>MKWORKSPACE</http-method>
+            <http-method>REBIND</http-method>
+            <http-method>REPORT</http-method>
+        </web-resource-collection>
+        <web-resource-collection>
+            <web-resource-name>webResourceName_22</web-resource-name>
+            <description>description_22</description>
+            <url-pattern>urlPattern_110</url-pattern>
+            <url-pattern>urlPattern_111</url-pattern>
+            <url-pattern>urlPattern_112</url-pattern>
+            <url-pattern>urlPattern_113</url-pattern>
+            <url-pattern>urlPattern_114</url-pattern>
+            <http-method>SEARCH</http-method>
+            <http-method>UNBIND</http-method>
+            <http-method>UNCHECKOUT</http-method>
+            <http-method>UPDATE</http-method>
+            <http-method>VERSION-CONTROL</http-method>
+        </web-resource-collection>
+        <web-resource-collection>
+            <web-resource-name>webResourceName_23</web-resource-name>
+            <description>description_23</description>
+            <url-pattern>urlPattern_115</url-pattern>
+            <url-pattern>urlPattern_116</url-pattern>
+            <url-pattern>urlPattern_117</url-pattern>
+            <url-pattern>urlPattern_118</url-pattern>
+            <url-pattern>urlPattern_119</url-pattern>
+            <http-method>ACK</http-method>
+            <http-method>BYE</http-method>
+            <http-method>CANCEL</http-method>
+            <http-method>COPY</http-method>
+            <http-method>ERRORRESPONSE</http-method>
+        </web-resource-collection>
+        <web-resource-collection>
+            <web-resource-name>webResourceName_24</web-resource-name>
+            <description>description_24</description>
+            <url-pattern>urlPattern_120</url-pattern>
+            <url-pattern>urlPattern_121</url-pattern>
+            <url-pattern>urlPattern_122</url-pattern>
+            <url-pattern>urlPattern_123</url-pattern>
+            <url-pattern>urlPattern_124</url-pattern>
+            <http-method>INFO</http-method>
+            <http-method>INVITE</http-method>
+            <http-method>LOCK</http-method>
+            <http-method>MESSAGE</http-method>
+            <http-method>MKCOL</http-method>
+        </web-resource-collection>
+        <auth-constraint>
+            <description>description_4</description>
+            <role-name>roles_20</role-name>
+            <role-name>roles_21</role-name>
+            <role-name>roles_22</role-name>
+            <role-name>roles_23</role-name>
+            <role-name>roles_24</role-name>
+        </auth-constraint>
+        <user-data-constraint>
+            <description>description_4</description>
+            <transport-guarantee>INTEGRAL</transport-guarantee>
+        </user-data-constraint>
+    </security-constraint>
+    <login-config>
+        <auth-method>BASIC</auth-method>
+        <realm-name>realmName_0</realm-name>
+        <form-login-config>
+            <form-login-page>formLoginPage_0</form-login-page>
+            <form-error-page>formErrorPage_0</form-error-page>
+        </form-login-config>
+    </login-config>
+    <security-role>
+        <description>description_0</description>
+        <role-name>roleName_0</role-name>
+    </security-role>
+    <security-role>
+        <description>description_1</description>
+        <role-name>roleName_1</role-name>
+    </security-role>
+    <security-role>
+        <description>description_2</description>
+        <role-name>roleName_2</role-name>
+    </security-role>
+    <security-role>
+        <description>description_3</description>
+        <role-name>roleName_3</role-name>
+    </security-role>
+    <security-role>
+        <description>description_4</description>
+        <role-name>roleName_4</role-name>
+    </security-role>
+    <env-entry>
+        <description>description_0</description>
+        <env-entry-name>name_0</env-entry-name>
+        <env-entry-value>value_0</env-entry-value>
+        <env-entry-type>java.lang.String</env-entry-type>
+    </env-entry>
+    <env-entry>
+        <description>description_1</description>
+        <env-entry-name>name_1</env-entry-name>
+        <env-entry-value>value_1</env-entry-value>
+        <env-entry-type>java.lang.Integer</env-entry-type>
+    </env-entry>
+    <env-entry>
+        <description>description_2</description>
+        <env-entry-name>name_2</env-entry-name>
+        <env-entry-value>value_2</env-entry-value>
+        <env-entry-type>java.lang.Boolean</env-entry-type>
+    </env-entry>
+    <env-entry>
+        <description>description_3</description>
+        <env-entry-name>name_3</env-entry-name>
+        <env-entry-value>value_3</env-entry-value>
+        <env-entry-type>java.lang.Double</env-entry-type>
+    </env-entry>
+    <env-entry>
+        <description>description_4</description>
+        <env-entry-name>name_4</env-entry-name>
+        <env-entry-value>value_4</env-entry-value>
+        <env-entry-type>java.lang.Byte</env-entry-type>
+    </env-entry>
+    <ejb-ref>
+        <description>description_0</description>
+        <ejb-ref-name>name_0</ejb-ref-name>
+        <ejb-ref-type>Session</ejb-ref-type>
+        <home>home_0</home>
+        <remote>remote_0</remote>
+        <ejb-link>link_0</ejb-link>
+    </ejb-ref>
+    <ejb-ref>
+        <description>description_1</description>
+        <ejb-ref-name>name_1</ejb-ref-name>
+        <ejb-ref-type>Entity</ejb-ref-type>
+        <home>home_1</home>
+        <remote>remote_1</remote>
+        <ejb-link>link_1</ejb-link>
+    </ejb-ref>
+    <ejb-ref>
+        <description>description_2</description>
+        <ejb-ref-name>name_2</ejb-ref-name>
+        <ejb-ref-type>Session</ejb-ref-type>
+        <home>home_2</home>
+        <remote>remote_2</remote>
+        <ejb-link>link_2</ejb-link>
+    </ejb-ref>
+    <ejb-ref>
+        <description>description_3</description>
+        <ejb-ref-name>name_3</ejb-ref-name>
+        <ejb-ref-type>Entity</ejb-ref-type>
+        <home>home_3</home>
+        <remote>remote_3</remote>
+        <ejb-link>link_3</ejb-link>
+    </ejb-ref>
+    <ejb-ref>
+        <description>description_4</description>
+        <ejb-ref-name>name_4</ejb-ref-name>
+        <ejb-ref-type>Session</ejb-ref-type>
+        <home>home_4</home>
+        <remote>remote_4</remote>
+        <ejb-link>link_4</ejb-link>
+    </ejb-ref>
+    <ejb-local-ref>
+        <description>description_0</description>
+        <ejb-ref-name>name_0</ejb-ref-name>
+        <ejb-ref-type>Session</ejb-ref-type>
+        <local-home>home_0</local-home>
+        <local>remote_0</local>
+        <ejb-link>link_0</ejb-link>
+    </ejb-local-ref>
+    <ejb-local-ref>
+        <description>description_1</description>
+        <ejb-ref-name>name_1</ejb-ref-name>
+        <ejb-ref-type>Entity</ejb-ref-type>
+        <local-home>home_1</local-home>
+        <local>remote_1</local>
+        <ejb-link>link_1</ejb-link>
+    </ejb-local-ref>
+    <ejb-local-ref>
+        <description>description_2</description>
+        <ejb-ref-name>name_2</ejb-ref-name>
+        <ejb-ref-type>Session</ejb-ref-type>
+        <local-home>home_2</local-home>
+        <local>remote_2</local>
+        <ejb-link>link_2</ejb-link>
+    </ejb-local-ref>
+    <ejb-local-ref>
+        <description>description_3</description>
+        <ejb-ref-name>name_3</ejb-ref-name>
+        <ejb-ref-type>Entity</ejb-ref-type>
+        <local-home>home_3</local-home>
+        <local>remote_3</local>
+        <ejb-link>link_3</ejb-link>
+    </ejb-local-ref>
+    <ejb-local-ref>
+        <description>description_4</description>
+        <ejb-ref-name>name_4</ejb-ref-name>
+        <ejb-ref-type>Session</ejb-ref-type>
+        <local-home>home_4</local-home>
+        <local>remote_4</local>
+        <ejb-link>link_4</ejb-link>
+    </ejb-local-ref>
+</web-app>
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/EMFTests/application-client.xml b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/EMFTests/application-client.xml
new file mode 100644
index 0000000..325960c
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/EMFTests/application-client.xml
@@ -0,0 +1,142 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE application-client PUBLIC "-//Sun Microsystems, Inc.//DTD J2EE Application Client 1.3//EN" "http://java.sun.com/dtd/application-client_1_3.dtd">
+
+   <application-client id="Application-client_ID">
+      <icon>
+         <small-icon>smallIcon_0</small-icon>
+         <large-icon>largeIcon_0</large-icon>
+      </icon>
+      <display-name>displayName_0</display-name>
+      <description>description_0</description>
+      <env-entry id="EnvEntry_1051639763239">
+         <description>description_0</description>
+         <env-entry-name>name_0</env-entry-name>
+         <env-entry-type>java.lang.String</env-entry-type>
+         <env-entry-value>value_0</env-entry-value>
+      </env-entry>
+      <env-entry id="EnvEntry_1051639763240">
+         <description>description_1</description>
+         <env-entry-name>name_1</env-entry-name>
+         <env-entry-type>java.lang.Integer</env-entry-type>
+         <env-entry-value>value_1</env-entry-value>
+      </env-entry>
+      <env-entry id="EnvEntry_1051639763241">
+         <description>description_2</description>
+         <env-entry-name>name_2</env-entry-name>
+         <env-entry-type>java.lang.Boolean</env-entry-type>
+         <env-entry-value>value_2</env-entry-value>
+      </env-entry>
+      <env-entry id="EnvEntry_1051639763259">
+         <description>description_3</description>
+         <env-entry-name>name_3</env-entry-name>
+         <env-entry-type>java.lang.Double</env-entry-type>
+         <env-entry-value>value_3</env-entry-value>
+      </env-entry>
+      <env-entry id="EnvEntry_1051639763260">
+         <description>description_4</description>
+         <env-entry-name>name_4</env-entry-name>
+         <env-entry-type>java.lang.Byte</env-entry-type>
+         <env-entry-value>value_4</env-entry-value>
+      </env-entry>
+      <ejb-ref id="EjbRef_1051639763279">
+         <description>description_0</description>
+         <ejb-ref-name>name_0</ejb-ref-name>
+         <ejb-ref-type>Session</ejb-ref-type>
+         <home>home_0</home>
+         <remote>remote_0</remote>
+         <ejb-link>link_0</ejb-link>
+      </ejb-ref>
+      <ejb-ref id="EjbRef_1051639763280">
+         <description>description_1</description>
+         <ejb-ref-name>name_1</ejb-ref-name>
+         <ejb-ref-type>Entity</ejb-ref-type>
+         <home>home_1</home>
+         <remote>remote_1</remote>
+         <ejb-link>link_1</ejb-link>
+      </ejb-ref>
+      <ejb-ref id="EjbRef_1051639763281">
+         <description>description_2</description>
+         <ejb-ref-name>name_2</ejb-ref-name>
+         <ejb-ref-type>Session</ejb-ref-type>
+         <home>home_2</home>
+         <remote>remote_2</remote>
+         <ejb-link>link_2</ejb-link>
+      </ejb-ref>
+      <ejb-ref id="EjbRef_1051639763282">
+         <description>description_3</description>
+         <ejb-ref-name>name_3</ejb-ref-name>
+         <ejb-ref-type>Entity</ejb-ref-type>
+         <home>home_3</home>
+         <remote>remote_3</remote>
+         <ejb-link>link_3</ejb-link>
+      </ejb-ref>
+      <ejb-ref id="EjbRef_1051639763283">
+         <description>description_4</description>
+         <ejb-ref-name>name_4</ejb-ref-name>
+         <ejb-ref-type>Session</ejb-ref-type>
+         <home>home_4</home>
+         <remote>remote_4</remote>
+         <ejb-link>link_4</ejb-link>
+      </ejb-ref>
+      <resource-ref id="ResourceRef_1051639763299">
+         <description>description_0</description>
+         <res-ref-name>name_0</res-ref-name>
+         <res-type>type_0</res-type>
+         <res-auth>Container</res-auth>
+         <res-sharing-scope>Shareable</res-sharing-scope>
+      </resource-ref>
+      <resource-ref id="ResourceRef_1051639763300">
+         <description>description_1</description>
+         <res-ref-name>name_1</res-ref-name>
+         <res-type>type_1</res-type>
+         <res-auth>Application</res-auth>
+         <res-sharing-scope>Unshareable</res-sharing-scope>
+      </resource-ref>
+      <resource-ref id="ResourceRef_1051639763301">
+         <description>description_2</description>
+         <res-ref-name>name_2</res-ref-name>
+         <res-type>type_2</res-type>
+         <res-auth>Container</res-auth>
+         <res-sharing-scope>Shareable</res-sharing-scope>
+      </resource-ref>
+      <resource-ref id="ResourceRef_1051639763302">
+         <description>description_3</description>
+         <res-ref-name>name_3</res-ref-name>
+         <res-type>type_3</res-type>
+         <res-auth>Application</res-auth>
+         <res-sharing-scope>Unshareable</res-sharing-scope>
+      </resource-ref>
+      <resource-ref id="ResourceRef_1051639763303">
+         <description>description_4</description>
+         <res-ref-name>name_4</res-ref-name>
+         <res-type>type_4</res-type>
+         <res-auth>Container</res-auth>
+         <res-sharing-scope>Shareable</res-sharing-scope>
+      </resource-ref>
+      <resource-env-ref id="ResourceEnvRef_1051639763319">
+         <description>description_0</description>
+         <resource-env-ref-name>name_0</resource-env-ref-name>
+         <resource-env-ref-type>java.util.HashTable</resource-env-ref-type>
+      </resource-env-ref>
+      <resource-env-ref id="ResourceEnvRef_1051639763349">
+         <description>description_1</description>
+         <resource-env-ref-name>name_1</resource-env-ref-name>
+         <resource-env-ref-type>java.util.List</resource-env-ref-type>
+      </resource-env-ref>
+      <resource-env-ref id="ResourceEnvRef_1051639763350">
+         <description>description_2</description>
+         <resource-env-ref-name>name_2</resource-env-ref-name>
+         <resource-env-ref-type>java.sql.Data</resource-env-ref-type>
+      </resource-env-ref>
+      <resource-env-ref id="ResourceEnvRef_1051639763351">
+         <description>description_3</description>
+         <resource-env-ref-name>name_3</resource-env-ref-name>
+         <resource-env-ref-type>java.lang.Integer</resource-env-ref-type>
+      </resource-env-ref>
+      <resource-env-ref id="ResourceEnvRef_1051639763352">
+         <description>description_4</description>
+         <resource-env-ref-name>name_4</resource-env-ref-name>
+         <resource-env-ref-type>java.lang.String</resource-env-ref-type>
+      </resource-env-ref>
+      <callback-handler>java.util.HashTable</callback-handler>
+   </application-client>
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/EMFTests/application.xml b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/EMFTests/application.xml
new file mode 100644
index 0000000..faf46bd
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/EMFTests/application.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE application PUBLIC "-//Sun Microsystems, Inc.//DTD J2EE Application 1.3//EN" "http://java.sun.com/dtd/application_1_3.dtd">
+
+   <application id="Application_ID">
+      <icon>
+         <small-icon>smallIcon_0</small-icon>
+         <large-icon>largeIcon_0</large-icon>
+      </icon>
+      <display-name>displayName_0</display-name>
+      <description>description_0</description>
+      <module id="JavaClientModule_1051639778160">
+         <java>uri_0</java>
+         <alt-dd>altDD_0</alt-dd>
+      </module>
+      <module id="EjbModule_1051639778160">
+         <ejb>uri_1</ejb>
+         <alt-dd>altDD_1</alt-dd>
+      </module>
+      <module id="WebModule_1051639778160">
+         <web>
+            <web-uri>uri_2</web-uri>
+            <context-root>contextRoot_0</context-root>
+         </web>
+         <alt-dd>altDD_2</alt-dd>
+      </module>
+      <module id="ConnectorModule_1051639778160">
+         <connector>uri_3</connector>
+         <alt-dd>altDD_3</alt-dd>
+      </module>
+      <module id="JavaClientModule_1051639778161">
+         <java>uri_4</java>
+         <alt-dd>altDD_4</alt-dd>
+      </module>
+      <security-role id="SecurityRole_1051639778170">
+         <description>description_0</description>
+         <role-name>roleName_0</role-name>
+      </security-role>
+      <security-role id="SecurityRole_1051639778190">
+         <description>description_1</description>
+         <role-name>roleName_1</role-name>
+      </security-role>
+      <security-role id="SecurityRole_1051639778191">
+         <description>description_2</description>
+         <role-name>roleName_2</role-name>
+      </security-role>
+      <security-role id="SecurityRole_1051639778192">
+         <description>description_3</description>
+         <role-name>roleName_3</role-name>
+      </security-role>
+      <security-role id="SecurityRole_1051639778193">
+         <description>description_4</description>
+         <role-name>roleName_4</role-name>
+      </security-role>
+   </application>
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/EMFTests/ejb-jar.xml b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/EMFTests/ejb-jar.xml
new file mode 100644
index 0000000..e875eae
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/EMFTests/ejb-jar.xml
@@ -0,0 +1,1864 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd">
+
+   <ejb-jar id="ejb-jar_ID">
+      <description>description_0</description>
+      <display-name>displayName_0</display-name>
+      <small-icon>smallIcon_0</small-icon>
+      <large-icon>largeIcon_0</large-icon>
+      <enterprise-beans>
+         <entity id="Entity_1051639788645">
+            <description>description_0</description>
+            <display-name>displayName_0</display-name>
+            <small-icon>smallIcon_0</small-icon>
+            <large-icon>largeIcon_0</large-icon>
+            <ejb-name>name_0</ejb-name>
+            <home>java.util.List</home>
+            <remote>java.sql.Data</remote>
+            <local-home>java.lang.Integer</local-home>
+            <local>java.lang.String</local>
+            <ejb-class>java.util.HashTable</ejb-class>
+            <persistence-type>Bean</persistence-type>
+            <prim-key-class>java.util.HashTable</prim-key-class>
+            <reentrant>True</reentrant>
+            <env-entry id="EnvEntry_1051639788695">
+               <description>description_0</description>
+               <env-entry-name>name_0</env-entry-name>
+               <env-entry-type>java.lang.String</env-entry-type>
+               <env-entry-value>value_0</env-entry-value>
+            </env-entry>
+            <env-entry id="EnvEntry_1051639788705">
+               <description>description_1</description>
+               <env-entry-name>name_1</env-entry-name>
+               <env-entry-type>java.lang.Integer</env-entry-type>
+               <env-entry-value>value_1</env-entry-value>
+            </env-entry>
+            <env-entry id="EnvEntry_1051639788706">
+               <description>description_2</description>
+               <env-entry-name>name_2</env-entry-name>
+               <env-entry-type>java.lang.Boolean</env-entry-type>
+               <env-entry-value>value_2</env-entry-value>
+            </env-entry>
+            <env-entry id="EnvEntry_1051639788707">
+               <description>description_3</description>
+               <env-entry-name>name_3</env-entry-name>
+               <env-entry-type>java.lang.Double</env-entry-type>
+               <env-entry-value>value_3</env-entry-value>
+            </env-entry>
+            <env-entry id="EnvEntry_1051639788715">
+               <description>description_4</description>
+               <env-entry-name>name_4</env-entry-name>
+               <env-entry-type>java.lang.Byte</env-entry-type>
+               <env-entry-value>value_4</env-entry-value>
+            </env-entry>
+            <ejb-ref id="EjbRef_1051639788725">
+               <description>description_0</description>
+               <ejb-ref-name>name_0</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <home>home_0</home>
+               <remote>remote_0</remote>
+               <ejb-link>link_0</ejb-link>
+            </ejb-ref>
+            <ejb-ref id="EjbRef_1051639788726">
+               <description>description_1</description>
+               <ejb-ref-name>name_1</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <home>home_1</home>
+               <remote>remote_1</remote>
+               <ejb-link>link_1</ejb-link>
+            </ejb-ref>
+            <ejb-ref id="EjbRef_1051639788727">
+               <description>description_2</description>
+               <ejb-ref-name>name_2</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <home>home_2</home>
+               <remote>remote_2</remote>
+               <ejb-link>link_2</ejb-link>
+            </ejb-ref>
+            <ejb-ref id="EjbRef_1051639788728">
+               <description>description_3</description>
+               <ejb-ref-name>name_3</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <home>home_3</home>
+               <remote>remote_3</remote>
+               <ejb-link>link_3</ejb-link>
+            </ejb-ref>
+            <ejb-ref id="EjbRef_1051639788729">
+               <description>description_4</description>
+               <ejb-ref-name>name_4</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <home>home_4</home>
+               <remote>remote_4</remote>
+               <ejb-link>link_4</ejb-link>
+            </ejb-ref>
+            <ejb-local-ref id="EJBLocalRef_1051639788745">
+               <description>description_5</description>
+               <ejb-ref-name>name_5</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <local-home>home_5</local-home>
+               <local>remote_5</local>
+               <ejb-link>link_5</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref id="EJBLocalRef_1051639788746">
+               <description>description_6</description>
+               <ejb-ref-name>name_6</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <local-home>home_6</local-home>
+               <local>remote_6</local>
+               <ejb-link>link_6</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref id="EJBLocalRef_1051639788747">
+               <description>description_7</description>
+               <ejb-ref-name>name_7</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <local-home>home_7</local-home>
+               <local>remote_7</local>
+               <ejb-link>link_7</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref id="EJBLocalRef_1051639788748">
+               <description>description_8</description>
+               <ejb-ref-name>name_8</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <local-home>home_8</local-home>
+               <local>remote_8</local>
+               <ejb-link>link_8</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref id="EJBLocalRef_1051639788749">
+               <description>description_9</description>
+               <ejb-ref-name>name_9</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <local-home>home_9</local-home>
+               <local>remote_9</local>
+               <ejb-link>link_9</ejb-link>
+            </ejb-local-ref>
+            <security-role-ref id="SecurityRoleRef_1051639788775">
+               <description>description_0</description>
+               <role-name>name_0</role-name>
+               <role-link>link_0</role-link>
+            </security-role-ref>
+            <security-role-ref id="SecurityRoleRef_1051639788776">
+               <description>description_1</description>
+               <role-name>name_1</role-name>
+               <role-link>link_1</role-link>
+            </security-role-ref>
+            <security-role-ref id="SecurityRoleRef_1051639788777">
+               <description>description_2</description>
+               <role-name>name_2</role-name>
+               <role-link>link_2</role-link>
+            </security-role-ref>
+            <security-role-ref id="SecurityRoleRef_1051639788778">
+               <description>description_3</description>
+               <role-name>name_3</role-name>
+               <role-link>link_3</role-link>
+            </security-role-ref>
+            <security-role-ref id="SecurityRoleRef_1051639788779">
+               <description>description_4</description>
+               <role-name>name_4</role-name>
+               <role-link>link_4</role-link>
+            </security-role-ref>
+            <security-identity>
+               <description>description_0</description>
+               <run-as id="RunAsSpecifiedIdentity_1051639788775">
+                  <description>description_0</description>
+                  <role-name>roleName_0</role-name>
+               </run-as>
+            </security-identity>
+            <resource-ref id="ResourceRef_1051639788785">
+               <description>description_0</description>
+               <res-ref-name>name_0</res-ref-name>
+               <res-type>type_0</res-type>
+               <res-auth>Container</res-auth>
+               <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref id="ResourceRef_1051639788786">
+               <description>description_1</description>
+               <res-ref-name>name_1</res-ref-name>
+               <res-type>type_1</res-type>
+               <res-auth>Application</res-auth>
+               <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref id="ResourceRef_1051639788787">
+               <description>description_2</description>
+               <res-ref-name>name_2</res-ref-name>
+               <res-type>type_2</res-type>
+               <res-auth>Container</res-auth>
+               <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref id="ResourceRef_1051639788788">
+               <description>description_3</description>
+               <res-ref-name>name_3</res-ref-name>
+               <res-type>type_3</res-type>
+               <res-auth>Application</res-auth>
+               <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref id="ResourceRef_1051639788795">
+               <description>description_4</description>
+               <res-ref-name>name_4</res-ref-name>
+               <res-type>type_4</res-type>
+               <res-auth>Container</res-auth>
+               <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-env-ref id="ResourceEnvRef_1051639788805">
+               <description>description_0</description>
+               <resource-env-ref-name>name_0</resource-env-ref-name>
+               <resource-env-ref-type>java.lang.Integer</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref id="ResourceEnvRef_1051639788806">
+               <description>description_1</description>
+               <resource-env-ref-name>name_1</resource-env-ref-name>
+               <resource-env-ref-type>java.lang.String</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref id="ResourceEnvRef_1051639788807">
+               <description>description_2</description>
+               <resource-env-ref-name>name_2</resource-env-ref-name>
+               <resource-env-ref-type>java.util.HashTable</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref id="ResourceEnvRef_1051639788808">
+               <description>description_3</description>
+               <resource-env-ref-name>name_3</resource-env-ref-name>
+               <resource-env-ref-type>java.util.List</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref id="ResourceEnvRef_1051639788809">
+               <description>description_4</description>
+               <resource-env-ref-name>name_4</resource-env-ref-name>
+               <resource-env-ref-type>java.sql.Data</resource-env-ref-type>
+            </resource-env-ref>
+         </entity>
+         <entity id="Entity_1051639788805">
+            <description>description_1</description>
+            <display-name>displayName_1</display-name>
+            <small-icon>smallIcon_1</small-icon>
+            <large-icon>largeIcon_1</large-icon>
+            <ejb-name>name_1</ejb-name>
+            <home>java.sql.Data</home>
+            <remote>java.lang.Integer</remote>
+            <local-home>java.lang.String</local-home>
+            <local>java.util.HashTable</local>
+            <ejb-class>java.util.List</ejb-class>
+            <persistence-type>Bean</persistence-type>
+            <prim-key-class>java.util.List</prim-key-class>
+            <reentrant>False</reentrant>
+            <env-entry id="EnvEntry_1051639788805">
+               <description>description_5</description>
+               <env-entry-name>name_5</env-entry-name>
+               <env-entry-type>java.lang.Short</env-entry-type>
+               <env-entry-value>value_5</env-entry-value>
+            </env-entry>
+            <env-entry id="EnvEntry_1051639788815">
+               <description>description_6</description>
+               <env-entry-name>name_6</env-entry-name>
+               <env-entry-type>java.lang.Long</env-entry-type>
+               <env-entry-value>value_6</env-entry-value>
+            </env-entry>
+            <env-entry id="EnvEntry_1051639788816">
+               <description>description_7</description>
+               <env-entry-name>name_7</env-entry-name>
+               <env-entry-type>java.lang.Float</env-entry-type>
+               <env-entry-value>value_7</env-entry-value>
+            </env-entry>
+            <env-entry id="EnvEntry_1051639788817">
+               <description>description_8</description>
+               <env-entry-name>name_8</env-entry-name>
+               <env-entry-type>java.lang.Character</env-entry-type>
+               <env-entry-value>value_8</env-entry-value>
+            </env-entry>
+            <env-entry id="EnvEntry_1051639788818">
+               <description>description_9</description>
+               <env-entry-name>name_9</env-entry-name>
+               <env-entry-type>java.lang.String</env-entry-type>
+               <env-entry-value>value_9</env-entry-value>
+            </env-entry>
+            <ejb-ref id="EjbRef_1051639788815">
+               <description>description_10</description>
+               <ejb-ref-name>name_10</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <home>home_10</home>
+               <remote>remote_10</remote>
+               <ejb-link>link_10</ejb-link>
+            </ejb-ref>
+            <ejb-ref id="EjbRef_1051639788816">
+               <description>description_11</description>
+               <ejb-ref-name>name_11</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <home>home_11</home>
+               <remote>remote_11</remote>
+               <ejb-link>link_11</ejb-link>
+            </ejb-ref>
+            <ejb-ref id="EjbRef_1051639788817">
+               <description>description_12</description>
+               <ejb-ref-name>name_12</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <home>home_12</home>
+               <remote>remote_12</remote>
+               <ejb-link>link_12</ejb-link>
+            </ejb-ref>
+            <ejb-ref id="EjbRef_1051639788818">
+               <description>description_13</description>
+               <ejb-ref-name>name_13</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <home>home_13</home>
+               <remote>remote_13</remote>
+               <ejb-link>link_13</ejb-link>
+            </ejb-ref>
+            <ejb-ref id="EjbRef_1051639788819">
+               <description>description_14</description>
+               <ejb-ref-name>name_14</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <home>home_14</home>
+               <remote>remote_14</remote>
+               <ejb-link>link_14</ejb-link>
+            </ejb-ref>
+            <ejb-local-ref id="EJBLocalRef_1051639788815">
+               <description>description_15</description>
+               <ejb-ref-name>name_15</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <local-home>home_15</local-home>
+               <local>remote_15</local>
+               <ejb-link>link_15</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref id="EJBLocalRef_1051639788816">
+               <description>description_16</description>
+               <ejb-ref-name>name_16</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <local-home>home_16</local-home>
+               <local>remote_16</local>
+               <ejb-link>link_16</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref id="EJBLocalRef_1051639788817">
+               <description>description_17</description>
+               <ejb-ref-name>name_17</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <local-home>home_17</local-home>
+               <local>remote_17</local>
+               <ejb-link>link_17</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref id="EJBLocalRef_1051639788818">
+               <description>description_18</description>
+               <ejb-ref-name>name_18</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <local-home>home_18</local-home>
+               <local>remote_18</local>
+               <ejb-link>link_18</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref id="EJBLocalRef_1051639788819">
+               <description>description_19</description>
+               <ejb-ref-name>name_19</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <local-home>home_19</local-home>
+               <local>remote_19</local>
+               <ejb-link>link_19</ejb-link>
+            </ejb-local-ref>
+            <security-role-ref id="SecurityRoleRef_1051639788825">
+               <description>description_5</description>
+               <role-name>name_5</role-name>
+               <role-link>link_5</role-link>
+            </security-role-ref>
+            <security-role-ref id="SecurityRoleRef_1051639788826">
+               <description>description_6</description>
+               <role-name>name_6</role-name>
+               <role-link>link_6</role-link>
+            </security-role-ref>
+            <security-role-ref id="SecurityRoleRef_1051639788827">
+               <description>description_7</description>
+               <role-name>name_7</role-name>
+               <role-link>link_7</role-link>
+            </security-role-ref>
+            <security-role-ref id="SecurityRoleRef_1051639788828">
+               <description>description_8</description>
+               <role-name>name_8</role-name>
+               <role-link>link_8</role-link>
+            </security-role-ref>
+            <security-role-ref id="SecurityRoleRef_1051639788829">
+               <description>description_9</description>
+               <role-name>name_9</role-name>
+               <role-link>link_9</role-link>
+            </security-role-ref>
+            <security-identity>
+               <description>description_1</description>
+               <use-caller-identity id="UseCallerIdentity_1051639788825"></use-caller-identity>
+            </security-identity>
+            <resource-ref id="ResourceRef_1051639788825">
+               <description>description_5</description>
+               <res-ref-name>name_5</res-ref-name>
+               <res-type>type_5</res-type>
+               <res-auth>Application</res-auth>
+               <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref id="ResourceRef_1051639788826">
+               <description>description_6</description>
+               <res-ref-name>name_6</res-ref-name>
+               <res-type>type_6</res-type>
+               <res-auth>Container</res-auth>
+               <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref id="ResourceRef_1051639788827">
+               <description>description_7</description>
+               <res-ref-name>name_7</res-ref-name>
+               <res-type>type_7</res-type>
+               <res-auth>Application</res-auth>
+               <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref id="ResourceRef_1051639788828">
+               <description>description_8</description>
+               <res-ref-name>name_8</res-ref-name>
+               <res-type>type_8</res-type>
+               <res-auth>Container</res-auth>
+               <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref id="ResourceRef_1051639788829">
+               <description>description_9</description>
+               <res-ref-name>name_9</res-ref-name>
+               <res-type>type_9</res-type>
+               <res-auth>Application</res-auth>
+               <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-env-ref id="ResourceEnvRef_1051639788825">
+               <description>description_5</description>
+               <resource-env-ref-name>name_5</resource-env-ref-name>
+               <resource-env-ref-type>java.lang.String</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref id="ResourceEnvRef_1051639788826">
+               <description>description_6</description>
+               <resource-env-ref-name>name_6</resource-env-ref-name>
+               <resource-env-ref-type>java.util.HashTable</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref id="ResourceEnvRef_1051639788827">
+               <description>description_7</description>
+               <resource-env-ref-name>name_7</resource-env-ref-name>
+               <resource-env-ref-type>java.util.List</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref id="ResourceEnvRef_1051639788828">
+               <description>description_8</description>
+               <resource-env-ref-name>name_8</resource-env-ref-name>
+               <resource-env-ref-type>java.sql.Data</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref id="ResourceEnvRef_1051639788829">
+               <description>description_9</description>
+               <resource-env-ref-name>name_9</resource-env-ref-name>
+               <resource-env-ref-type>java.lang.Integer</resource-env-ref-type>
+            </resource-env-ref>
+         </entity>
+         <entity id="ContainerManagedEntity_1051639788825">
+            <description>description_2</description>
+            <display-name>displayName_2</display-name>
+            <small-icon>smallIcon_2</small-icon>
+            <large-icon>largeIcon_2</large-icon>
+            <ejb-name>name_2</ejb-name>
+            <home>java.lang.Integer</home>
+            <remote>java.lang.String</remote>
+            <local-home>java.util.HashTable</local-home>
+            <local>java.util.List</local>
+            <ejb-class>java.sql.Data</ejb-class>
+            <persistence-type>Container</persistence-type>
+            <prim-key-class>java.sql.Data</prim-key-class>
+            <reentrant>True</reentrant>
+            <cmp-version>2.0</cmp-version>
+            <abstract-schema-name>abstractSchemaName_0</abstract-schema-name>
+            <cmp-field id="CMPAttribute_1051639788845">
+               <field-name>name_3</field-name>
+            </cmp-field>
+            <cmp-field id="CMPAttribute_1051639788846">
+               <field-name>name_4</field-name>
+            </cmp-field>
+            <cmp-field id="CMPAttribute_1051639788847">
+               <field-name>name_5</field-name>
+            </cmp-field>
+            <cmp-field id="CMPAttribute_1051639788848">
+               <field-name>name_6</field-name>
+            </cmp-field>
+            <cmp-field id="CMPAttribute_1051639788849">
+               <field-name>name_7</field-name>
+            </cmp-field>
+            <env-entry id="EnvEntry_1051639788885">
+               <description>description_10</description>
+               <env-entry-name>name_10</env-entry-name>
+               <env-entry-type>java.lang.Integer</env-entry-type>
+               <env-entry-value>value_10</env-entry-value>
+            </env-entry>
+            <env-entry id="EnvEntry_1051639788886">
+               <description>description_11</description>
+               <env-entry-name>name_11</env-entry-name>
+               <env-entry-type>java.lang.Boolean</env-entry-type>
+               <env-entry-value>value_11</env-entry-value>
+            </env-entry>
+            <env-entry id="EnvEntry_1051639788887">
+               <description>description_12</description>
+               <env-entry-name>name_12</env-entry-name>
+               <env-entry-type>java.lang.Double</env-entry-type>
+               <env-entry-value>value_12</env-entry-value>
+            </env-entry>
+            <env-entry id="EnvEntry_1051639788888">
+               <description>description_13</description>
+               <env-entry-name>name_13</env-entry-name>
+               <env-entry-type>java.lang.Byte</env-entry-type>
+               <env-entry-value>value_13</env-entry-value>
+            </env-entry>
+            <env-entry id="EnvEntry_1051639788889">
+               <description>description_14</description>
+               <env-entry-name>name_14</env-entry-name>
+               <env-entry-type>java.lang.Short</env-entry-type>
+               <env-entry-value>value_14</env-entry-value>
+            </env-entry>
+            <ejb-ref id="EjbRef_1051639788885">
+               <description>description_20</description>
+               <ejb-ref-name>name_20</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <home>home_20</home>
+               <remote>remote_20</remote>
+               <ejb-link>link_20</ejb-link>
+            </ejb-ref>
+            <ejb-ref id="EjbRef_1051639788886">
+               <description>description_21</description>
+               <ejb-ref-name>name_21</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <home>home_21</home>
+               <remote>remote_21</remote>
+               <ejb-link>link_21</ejb-link>
+            </ejb-ref>
+            <ejb-ref id="EjbRef_1051639788887">
+               <description>description_22</description>
+               <ejb-ref-name>name_22</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <home>home_22</home>
+               <remote>remote_22</remote>
+               <ejb-link>link_22</ejb-link>
+            </ejb-ref>
+            <ejb-ref id="EjbRef_1051639788888">
+               <description>description_23</description>
+               <ejb-ref-name>name_23</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <home>home_23</home>
+               <remote>remote_23</remote>
+               <ejb-link>link_23</ejb-link>
+            </ejb-ref>
+            <ejb-ref id="EjbRef_1051639788889">
+               <description>description_24</description>
+               <ejb-ref-name>name_24</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <home>home_24</home>
+               <remote>remote_24</remote>
+               <ejb-link>link_24</ejb-link>
+            </ejb-ref>
+            <ejb-local-ref id="EJBLocalRef_1051639788895">
+               <description>description_25</description>
+               <ejb-ref-name>name_25</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <local-home>home_25</local-home>
+               <local>remote_25</local>
+               <ejb-link>link_25</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref id="EJBLocalRef_1051639788896">
+               <description>description_26</description>
+               <ejb-ref-name>name_26</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <local-home>home_26</local-home>
+               <local>remote_26</local>
+               <ejb-link>link_26</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref id="EJBLocalRef_1051639788897">
+               <description>description_27</description>
+               <ejb-ref-name>name_27</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <local-home>home_27</local-home>
+               <local>remote_27</local>
+               <ejb-link>link_27</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref id="EJBLocalRef_1051639788898">
+               <description>description_28</description>
+               <ejb-ref-name>name_28</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <local-home>home_28</local-home>
+               <local>remote_28</local>
+               <ejb-link>link_28</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref id="EJBLocalRef_1051639788899">
+               <description>description_29</description>
+               <ejb-ref-name>name_29</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <local-home>home_29</local-home>
+               <local>remote_29</local>
+               <ejb-link>link_29</ejb-link>
+            </ejb-local-ref>
+            <security-role-ref id="SecurityRoleRef_1051639788895">
+               <description>description_10</description>
+               <role-name>name_10</role-name>
+               <role-link>link_10</role-link>
+            </security-role-ref>
+            <security-role-ref id="SecurityRoleRef_1051639788896">
+               <description>description_11</description>
+               <role-name>name_11</role-name>
+               <role-link>link_11</role-link>
+            </security-role-ref>
+            <security-role-ref id="SecurityRoleRef_1051639788897">
+               <description>description_12</description>
+               <role-name>name_12</role-name>
+               <role-link>link_12</role-link>
+            </security-role-ref>
+            <security-role-ref id="SecurityRoleRef_1051639788898">
+               <description>description_13</description>
+               <role-name>name_13</role-name>
+               <role-link>link_13</role-link>
+            </security-role-ref>
+            <security-role-ref id="SecurityRoleRef_1051639788899">
+               <description>description_14</description>
+               <role-name>name_14</role-name>
+               <role-link>link_14</role-link>
+            </security-role-ref>
+            <security-identity>
+               <description>description_2</description>
+               <run-as id="RunAsSpecifiedIdentity_1051639788895">
+                  <description>description_1</description>
+                  <role-name>roleName_1</role-name>
+               </run-as>
+            </security-identity>
+            <resource-ref id="ResourceRef_1051639788895">
+               <description>description_10</description>
+               <res-ref-name>name_10</res-ref-name>
+               <res-type>type_10</res-type>
+               <res-auth>Container</res-auth>
+               <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref id="ResourceRef_1051639788896">
+               <description>description_11</description>
+               <res-ref-name>name_11</res-ref-name>
+               <res-type>type_11</res-type>
+               <res-auth>Application</res-auth>
+               <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref id="ResourceRef_1051639788897">
+               <description>description_12</description>
+               <res-ref-name>name_12</res-ref-name>
+               <res-type>type_12</res-type>
+               <res-auth>Container</res-auth>
+               <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref id="ResourceRef_1051639788898">
+               <description>description_13</description>
+               <res-ref-name>name_13</res-ref-name>
+               <res-type>type_13</res-type>
+               <res-auth>Application</res-auth>
+               <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref id="ResourceRef_1051639788905">
+               <description>description_14</description>
+               <res-ref-name>name_14</res-ref-name>
+               <res-type>type_14</res-type>
+               <res-auth>Container</res-auth>
+               <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-env-ref id="ResourceEnvRef_1051639788905">
+               <description>description_10</description>
+               <resource-env-ref-name>name_10</resource-env-ref-name>
+               <resource-env-ref-type>java.util.HashTable</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref id="ResourceEnvRef_1051639788906">
+               <description>description_11</description>
+               <resource-env-ref-name>name_11</resource-env-ref-name>
+               <resource-env-ref-type>java.util.List</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref id="ResourceEnvRef_1051639788907">
+               <description>description_12</description>
+               <resource-env-ref-name>name_12</resource-env-ref-name>
+               <resource-env-ref-type>java.sql.Data</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref id="ResourceEnvRef_1051639788908">
+               <description>description_13</description>
+               <resource-env-ref-name>name_13</resource-env-ref-name>
+               <resource-env-ref-type>java.lang.Integer</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref id="ResourceEnvRef_1051639788909">
+               <description>description_14</description>
+               <resource-env-ref-name>name_14</resource-env-ref-name>
+               <resource-env-ref-type>java.lang.String</resource-env-ref-type>
+            </resource-env-ref>
+            <query id="Query_1051639788936">
+               <description>description_0</description>
+               <query-method id="QueryMethod_1051639788936">
+                  <method-name>name_55</method-name>
+                  <method-params>
+                  </method-params>
+               </query-method>
+               <result-type-mapping>Remote</result-type-mapping>
+               <ejb-ql>ejbQL_0</ejb-ql>
+            </query>
+            <query id="Query_1051639788937">
+               <description>description_1</description>
+               <query-method id="QueryMethod_1051639788937">
+                  <method-name>name_56</method-name>
+                  <method-params>
+                     <method-param>parms_66</method-param>
+                  </method-params>
+               </query-method>
+               <result-type-mapping>Local</result-type-mapping>
+               <ejb-ql>ejbQL_1</ejb-ql>
+            </query>
+            <query id="Query_1051639788938">
+               <description>description_2</description>
+               <query-method id="QueryMethod_1051639788938">
+                  <method-name>name_57</method-name>
+                  <method-params>
+                     <method-param>parms_67</method-param>
+                     <method-param>parms_68</method-param>
+                  </method-params>
+               </query-method>
+               <result-type-mapping>Remote</result-type-mapping>
+               <ejb-ql>ejbQL_2</ejb-ql>
+            </query>
+            <query id="Query_1051639788939">
+               <description>description_3</description>
+               <query-method id="QueryMethod_1051639788939">
+                  <method-name>name_58</method-name>
+                  <method-params>
+                     <method-param>parms_69</method-param>
+                     <method-param>parms_70</method-param>
+                     <method-param>parms_71</method-param>
+                  </method-params>
+               </query-method>
+               <result-type-mapping>Local</result-type-mapping>
+               <ejb-ql>ejbQL_3</ejb-ql>
+            </query>
+            <query id="Query_1051639788940">
+               <description>description_4</description>
+               <query-method id="QueryMethod_1051639788940">
+                  <method-name>name_59</method-name>
+                  <method-params>
+                  </method-params>
+               </query-method>
+               <result-type-mapping>Remote</result-type-mapping>
+               <ejb-ql>ejbQL_4</ejb-ql>
+            </query>
+         </entity>
+         <session id="Session_1051639788946">
+            <description>description_3</description>
+            <display-name>displayName_3</display-name>
+            <small-icon>smallIcon_3</small-icon>
+            <large-icon>largeIcon_3</large-icon>
+            <ejb-name>name_8</ejb-name>
+            <home>java.lang.String</home>
+            <remote>java.util.HashTable</remote>
+            <local-home>java.util.List</local-home>
+            <local>java.sql.Data</local>
+            <ejb-class>java.lang.Integer</ejb-class>
+            <session-type>Stateful</session-type>
+            <transaction-type>Bean</transaction-type>
+            <env-entry id="EnvEntry_1051639788946">
+               <description>description_15</description>
+               <env-entry-name>name_15</env-entry-name>
+               <env-entry-type>java.lang.Long</env-entry-type>
+               <env-entry-value>value_15</env-entry-value>
+            </env-entry>
+            <env-entry id="EnvEntry_1051639788947">
+               <description>description_16</description>
+               <env-entry-name>name_16</env-entry-name>
+               <env-entry-type>java.lang.Float</env-entry-type>
+               <env-entry-value>value_16</env-entry-value>
+            </env-entry>
+            <env-entry id="EnvEntry_1051639788948">
+               <description>description_17</description>
+               <env-entry-name>name_17</env-entry-name>
+               <env-entry-type>java.lang.Character</env-entry-type>
+               <env-entry-value>value_17</env-entry-value>
+            </env-entry>
+            <env-entry id="EnvEntry_1051639788949">
+               <description>description_18</description>
+               <env-entry-name>name_18</env-entry-name>
+               <env-entry-type>java.lang.String</env-entry-type>
+               <env-entry-value>value_18</env-entry-value>
+            </env-entry>
+            <env-entry id="EnvEntry_1051639788950">
+               <description>description_19</description>
+               <env-entry-name>name_19</env-entry-name>
+               <env-entry-type>java.lang.Integer</env-entry-type>
+               <env-entry-value>value_19</env-entry-value>
+            </env-entry>
+            <ejb-ref id="EjbRef_1051639788946">
+               <description>description_30</description>
+               <ejb-ref-name>name_30</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <home>home_30</home>
+               <remote>remote_30</remote>
+               <ejb-link>link_30</ejb-link>
+            </ejb-ref>
+            <ejb-ref id="EjbRef_1051639788947">
+               <description>description_31</description>
+               <ejb-ref-name>name_31</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <home>home_31</home>
+               <remote>remote_31</remote>
+               <ejb-link>link_31</ejb-link>
+            </ejb-ref>
+            <ejb-ref id="EjbRef_1051639788948">
+               <description>description_32</description>
+               <ejb-ref-name>name_32</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <home>home_32</home>
+               <remote>remote_32</remote>
+               <ejb-link>link_32</ejb-link>
+            </ejb-ref>
+            <ejb-ref id="EjbRef_1051639788949">
+               <description>description_33</description>
+               <ejb-ref-name>name_33</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <home>home_33</home>
+               <remote>remote_33</remote>
+               <ejb-link>link_33</ejb-link>
+            </ejb-ref>
+            <ejb-ref id="EjbRef_1051639788950">
+               <description>description_34</description>
+               <ejb-ref-name>name_34</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <home>home_34</home>
+               <remote>remote_34</remote>
+               <ejb-link>link_34</ejb-link>
+            </ejb-ref>
+            <ejb-local-ref id="EJBLocalRef_1051639788946">
+               <description>description_35</description>
+               <ejb-ref-name>name_35</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <local-home>home_35</local-home>
+               <local>remote_35</local>
+               <ejb-link>link_35</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref id="EJBLocalRef_1051639788947">
+               <description>description_36</description>
+               <ejb-ref-name>name_36</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <local-home>home_36</local-home>
+               <local>remote_36</local>
+               <ejb-link>link_36</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref id="EJBLocalRef_1051639788948">
+               <description>description_37</description>
+               <ejb-ref-name>name_37</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <local-home>home_37</local-home>
+               <local>remote_37</local>
+               <ejb-link>link_37</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref id="EJBLocalRef_1051639788949">
+               <description>description_38</description>
+               <ejb-ref-name>name_38</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <local-home>home_38</local-home>
+               <local>remote_38</local>
+               <ejb-link>link_38</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref id="EJBLocalRef_1051639788950">
+               <description>description_39</description>
+               <ejb-ref-name>name_39</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <local-home>home_39</local-home>
+               <local>remote_39</local>
+               <ejb-link>link_39</ejb-link>
+            </ejb-local-ref>
+            <security-role-ref id="SecurityRoleRef_1051639788946">
+               <description>description_15</description>
+               <role-name>name_15</role-name>
+               <role-link>link_15</role-link>
+            </security-role-ref>
+            <security-role-ref id="SecurityRoleRef_1051639788947">
+               <description>description_16</description>
+               <role-name>name_16</role-name>
+               <role-link>link_16</role-link>
+            </security-role-ref>
+            <security-role-ref id="SecurityRoleRef_1051639788948">
+               <description>description_17</description>
+               <role-name>name_17</role-name>
+               <role-link>link_17</role-link>
+            </security-role-ref>
+            <security-role-ref id="SecurityRoleRef_1051639788949">
+               <description>description_18</description>
+               <role-name>name_18</role-name>
+               <role-link>link_18</role-link>
+            </security-role-ref>
+            <security-role-ref id="SecurityRoleRef_1051639788950">
+               <description>description_19</description>
+               <role-name>name_19</role-name>
+               <role-link>link_19</role-link>
+            </security-role-ref>
+            <security-identity>
+               <description>description_3</description>
+               <use-caller-identity id="UseCallerIdentity_1051639788946"></use-caller-identity>
+            </security-identity>
+            <resource-ref id="ResourceRef_1051639788946">
+               <description>description_15</description>
+               <res-ref-name>name_15</res-ref-name>
+               <res-type>type_15</res-type>
+               <res-auth>Application</res-auth>
+               <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref id="ResourceRef_1051639788947">
+               <description>description_16</description>
+               <res-ref-name>name_16</res-ref-name>
+               <res-type>type_16</res-type>
+               <res-auth>Container</res-auth>
+               <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref id="ResourceRef_1051639788948">
+               <description>description_17</description>
+               <res-ref-name>name_17</res-ref-name>
+               <res-type>type_17</res-type>
+               <res-auth>Application</res-auth>
+               <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref id="ResourceRef_1051639788949">
+               <description>description_18</description>
+               <res-ref-name>name_18</res-ref-name>
+               <res-type>type_18</res-type>
+               <res-auth>Container</res-auth>
+               <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref id="ResourceRef_1051639788956">
+               <description>description_19</description>
+               <res-ref-name>name_19</res-ref-name>
+               <res-type>type_19</res-type>
+               <res-auth>Application</res-auth>
+               <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-env-ref id="ResourceEnvRef_1051639788956">
+               <description>description_15</description>
+               <resource-env-ref-name>name_15</resource-env-ref-name>
+               <resource-env-ref-type>java.util.List</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref id="ResourceEnvRef_1051639788957">
+               <description>description_16</description>
+               <resource-env-ref-name>name_16</resource-env-ref-name>
+               <resource-env-ref-type>java.sql.Data</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref id="ResourceEnvRef_1051639788958">
+               <description>description_17</description>
+               <resource-env-ref-name>name_17</resource-env-ref-name>
+               <resource-env-ref-type>java.lang.Integer</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref id="ResourceEnvRef_1051639788959">
+               <description>description_18</description>
+               <resource-env-ref-name>name_18</resource-env-ref-name>
+               <resource-env-ref-type>java.lang.String</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref id="ResourceEnvRef_1051639788960">
+               <description>description_19</description>
+               <resource-env-ref-name>name_19</resource-env-ref-name>
+               <resource-env-ref-type>java.util.HashTable</resource-env-ref-type>
+            </resource-env-ref>
+         </session>
+         <entity id="Entity_1051639788956">
+            <description>description_4</description>
+            <display-name>displayName_4</display-name>
+            <small-icon>smallIcon_4</small-icon>
+            <large-icon>largeIcon_4</large-icon>
+            <ejb-name>name_9</ejb-name>
+            <home>java.lang.String</home>
+            <remote>java.util.HashTable</remote>
+            <local-home>java.util.List</local-home>
+            <local>java.sql.Data</local>
+            <ejb-class>java.lang.Integer</ejb-class>
+            <persistence-type>Bean</persistence-type>
+            <prim-key-class>java.lang.Integer</prim-key-class>
+            <reentrant>False</reentrant>
+            <env-entry id="EnvEntry_1051639788956">
+               <description>description_20</description>
+               <env-entry-name>name_20</env-entry-name>
+               <env-entry-type>java.lang.Boolean</env-entry-type>
+               <env-entry-value>value_20</env-entry-value>
+            </env-entry>
+            <env-entry id="EnvEntry_1051639788957">
+               <description>description_21</description>
+               <env-entry-name>name_21</env-entry-name>
+               <env-entry-type>java.lang.Double</env-entry-type>
+               <env-entry-value>value_21</env-entry-value>
+            </env-entry>
+            <env-entry id="EnvEntry_1051639788958">
+               <description>description_22</description>
+               <env-entry-name>name_22</env-entry-name>
+               <env-entry-type>java.lang.Byte</env-entry-type>
+               <env-entry-value>value_22</env-entry-value>
+            </env-entry>
+            <env-entry id="EnvEntry_1051639788959">
+               <description>description_23</description>
+               <env-entry-name>name_23</env-entry-name>
+               <env-entry-type>java.lang.Short</env-entry-type>
+               <env-entry-value>value_23</env-entry-value>
+            </env-entry>
+            <env-entry id="EnvEntry_1051639788960">
+               <description>description_24</description>
+               <env-entry-name>name_24</env-entry-name>
+               <env-entry-type>java.lang.Long</env-entry-type>
+               <env-entry-value>value_24</env-entry-value>
+            </env-entry>
+            <ejb-ref id="EjbRef_1051639788956">
+               <description>description_40</description>
+               <ejb-ref-name>name_40</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <home>home_40</home>
+               <remote>remote_40</remote>
+               <ejb-link>link_40</ejb-link>
+            </ejb-ref>
+            <ejb-ref id="EjbRef_1051639788957">
+               <description>description_41</description>
+               <ejb-ref-name>name_41</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <home>home_41</home>
+               <remote>remote_41</remote>
+               <ejb-link>link_41</ejb-link>
+            </ejb-ref>
+            <ejb-ref id="EjbRef_1051639788958">
+               <description>description_42</description>
+               <ejb-ref-name>name_42</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <home>home_42</home>
+               <remote>remote_42</remote>
+               <ejb-link>link_42</ejb-link>
+            </ejb-ref>
+            <ejb-ref id="EjbRef_1051639788959">
+               <description>description_43</description>
+               <ejb-ref-name>name_43</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <home>home_43</home>
+               <remote>remote_43</remote>
+               <ejb-link>link_43</ejb-link>
+            </ejb-ref>
+            <ejb-ref id="EjbRef_1051639788960">
+               <description>description_44</description>
+               <ejb-ref-name>name_44</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <home>home_44</home>
+               <remote>remote_44</remote>
+               <ejb-link>link_44</ejb-link>
+            </ejb-ref>
+            <ejb-local-ref id="EJBLocalRef_1051639788956">
+               <description>description_45</description>
+               <ejb-ref-name>name_45</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <local-home>home_45</local-home>
+               <local>remote_45</local>
+               <ejb-link>link_45</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref id="EJBLocalRef_1051639788957">
+               <description>description_46</description>
+               <ejb-ref-name>name_46</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <local-home>home_46</local-home>
+               <local>remote_46</local>
+               <ejb-link>link_46</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref id="EJBLocalRef_1051639788958">
+               <description>description_47</description>
+               <ejb-ref-name>name_47</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <local-home>home_47</local-home>
+               <local>remote_47</local>
+               <ejb-link>link_47</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref id="EJBLocalRef_1051639788959">
+               <description>description_48</description>
+               <ejb-ref-name>name_48</ejb-ref-name>
+               <ejb-ref-type>Session</ejb-ref-type>
+               <local-home>home_48</local-home>
+               <local>remote_48</local>
+               <ejb-link>link_48</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref id="EJBLocalRef_1051639788960">
+               <description>description_49</description>
+               <ejb-ref-name>name_49</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <local-home>home_49</local-home>
+               <local>remote_49</local>
+               <ejb-link>link_49</ejb-link>
+            </ejb-local-ref>
+            <security-role-ref id="SecurityRoleRef_1051639788956">
+               <description>description_20</description>
+               <role-name>name_20</role-name>
+               <role-link>link_20</role-link>
+            </security-role-ref>
+            <security-role-ref id="SecurityRoleRef_1051639788957">
+               <description>description_21</description>
+               <role-name>name_21</role-name>
+               <role-link>link_21</role-link>
+            </security-role-ref>
+            <security-role-ref id="SecurityRoleRef_1051639788958">
+               <description>description_22</description>
+               <role-name>name_22</role-name>
+               <role-link>link_22</role-link>
+            </security-role-ref>
+            <security-role-ref id="SecurityRoleRef_1051639788959">
+               <description>description_23</description>
+               <role-name>name_23</role-name>
+               <role-link>link_23</role-link>
+            </security-role-ref>
+            <security-role-ref id="SecurityRoleRef_1051639788960">
+               <description>description_24</description>
+               <role-name>name_24</role-name>
+               <role-link>link_24</role-link>
+            </security-role-ref>
+            <security-identity>
+               <description>description_4</description>
+               <run-as id="RunAsSpecifiedIdentity_1051639788956">
+                  <description>description_2</description>
+                  <role-name>roleName_2</role-name>
+               </run-as>
+            </security-identity>
+            <resource-ref id="ResourceRef_1051639788957">
+               <description>description_20</description>
+               <res-ref-name>name_20</res-ref-name>
+               <res-type>type_20</res-type>
+               <res-auth>Container</res-auth>
+               <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref id="ResourceRef_1051639788958">
+               <description>description_21</description>
+               <res-ref-name>name_21</res-ref-name>
+               <res-type>type_21</res-type>
+               <res-auth>Application</res-auth>
+               <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref id="ResourceRef_1051639788959">
+               <description>description_22</description>
+               <res-ref-name>name_22</res-ref-name>
+               <res-type>type_22</res-type>
+               <res-auth>Container</res-auth>
+               <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref id="ResourceRef_1051639788960">
+               <description>description_23</description>
+               <res-ref-name>name_23</res-ref-name>
+               <res-type>type_23</res-type>
+               <res-auth>Application</res-auth>
+               <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref id="ResourceRef_1051639788961">
+               <description>description_24</description>
+               <res-ref-name>name_24</res-ref-name>
+               <res-type>type_24</res-type>
+               <res-auth>Container</res-auth>
+               <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-env-ref id="ResourceEnvRef_1051639788961">
+               <description>description_20</description>
+               <resource-env-ref-name>name_20</resource-env-ref-name>
+               <resource-env-ref-type>java.util.List</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref id="ResourceEnvRef_1051639788962">
+               <description>description_21</description>
+               <resource-env-ref-name>name_21</resource-env-ref-name>
+               <resource-env-ref-type>java.sql.Data</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref id="ResourceEnvRef_1051639788963">
+               <description>description_22</description>
+               <resource-env-ref-name>name_22</resource-env-ref-name>
+               <resource-env-ref-type>java.lang.Integer</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref id="ResourceEnvRef_1051639788964">
+               <description>description_23</description>
+               <resource-env-ref-name>name_23</resource-env-ref-name>
+               <resource-env-ref-type>java.lang.String</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref id="ResourceEnvRef_1051639788965">
+               <description>description_24</description>
+               <resource-env-ref-name>name_24</resource-env-ref-name>
+               <resource-env-ref-type>java.util.HashTable</resource-env-ref-type>
+            </resource-env-ref>
+         </entity>
+      </enterprise-beans>
+      <relationships id="Relationships_1051639788956">
+         <description>description_0</description>
+         <ejb-relation id="EJBRelation_1051639788996">
+            <description>description_0</description>
+            <ejb-relation-name>name_0</ejb-relation-name>
+            <ejb-relationship-role id="EJBRelationshipRole_1051639788996">
+               <description>description_0</description>
+               <ejb-relationship-role-name>roleName_0</ejb-relationship-role-name>
+               <multiplicity>One</multiplicity>
+               <cascade-delete></cascade-delete>
+               <relationship-role-source id="RoleSource_1051639788996">
+                  <description>description_0</description>
+                  <ejb-name>name_0</ejb-name>
+               </relationship-role-source>
+               <cmr-field id="CMRField_1051639788996">
+                  <description>description_0</description>
+                  <cmr-field-name>name_10</cmr-field-name>
+                  <cmr-field-type>java.lang.String</cmr-field-type>
+               </cmr-field>
+            </ejb-relationship-role>
+            <ejb-relationship-role id="EJBRelationshipRole_1051639788997">
+               <description>description_1</description>
+               <ejb-relationship-role-name>roleName_1</ejb-relationship-role-name>
+               <multiplicity>Many</multiplicity>
+               <relationship-role-source id="RoleSource_1051639788997">
+                  <description>description_1</description>
+                  <ejb-name>name_1</ejb-name>
+               </relationship-role-source>
+               <cmr-field id="CMRField_1051639788997">
+                  <description>description_1</description>
+                  <cmr-field-name>name_11</cmr-field-name>
+                  <cmr-field-type>java.util.HashTable</cmr-field-type>
+               </cmr-field>
+            </ejb-relationship-role>
+         </ejb-relation>
+         <ejb-relation id="EJBRelation_1051639788997">
+            <description>description_1</description>
+            <ejb-relation-name>name_1</ejb-relation-name>
+            <ejb-relationship-role id="EJBRelationshipRole_1051639788998">
+               <description>description_5</description>
+               <ejb-relationship-role-name>roleName_5</ejb-relationship-role-name>
+               <multiplicity>Many</multiplicity>
+               <relationship-role-source id="RoleSource_1051639788998">
+                  <description>description_5</description>
+                  <ejb-name>name_1</ejb-name>
+               </relationship-role-source>
+               <cmr-field id="CMRField_1051639788998">
+                  <description>description_5</description>
+                  <cmr-field-name>name_15</cmr-field-name>
+                  <cmr-field-type>java.lang.String</cmr-field-type>
+               </cmr-field>
+            </ejb-relationship-role>
+            <ejb-relationship-role id="EJBRelationshipRole_1051639788999">
+               <description>description_6</description>
+               <ejb-relationship-role-name>roleName_6</ejb-relationship-role-name>
+               <multiplicity>One</multiplicity>
+               <cascade-delete></cascade-delete>
+               <relationship-role-source id="RoleSource_1051639788999">
+                  <description>description_6</description>
+                  <ejb-name>name_2</ejb-name>
+               </relationship-role-source>
+               <cmr-field id="CMRField_1051639788999">
+                  <description>description_6</description>
+                  <cmr-field-name>name_16</cmr-field-name>
+                  <cmr-field-type>java.util.HashTable</cmr-field-type>
+               </cmr-field>
+            </ejb-relationship-role>
+         </ejb-relation>
+         <ejb-relation id="EJBRelation_1051639789006">
+            <description>description_2</description>
+            <ejb-relation-name>name_2</ejb-relation-name>
+            <ejb-relationship-role id="EJBRelationshipRole_1051639789006">
+               <description>description_10</description>
+               <ejb-relationship-role-name>roleName_10</ejb-relationship-role-name>
+               <multiplicity>One</multiplicity>
+               <cascade-delete></cascade-delete>
+               <relationship-role-source id="RoleSource_1051639789006">
+                  <description>description_10</description>
+                  <ejb-name>name_2</ejb-name>
+               </relationship-role-source>
+               <cmr-field id="CMRField_1051639789006">
+                  <description>description_10</description>
+                  <cmr-field-name>name_20</cmr-field-name>
+                  <cmr-field-type>java.lang.String</cmr-field-type>
+               </cmr-field>
+            </ejb-relationship-role>
+            <ejb-relationship-role id="EJBRelationshipRole_1051639789007">
+               <description>description_11</description>
+               <ejb-relationship-role-name>roleName_11</ejb-relationship-role-name>
+               <multiplicity>Many</multiplicity>
+               <relationship-role-source id="RoleSource_1051639789007">
+                  <description>description_11</description>
+                  <ejb-name>name_9</ejb-name>
+               </relationship-role-source>
+               <cmr-field id="CMRField_1051639789007">
+                  <description>description_11</description>
+                  <cmr-field-name>name_21</cmr-field-name>
+                  <cmr-field-type>java.util.HashTable</cmr-field-type>
+               </cmr-field>
+            </ejb-relationship-role>
+         </ejb-relation>
+         <ejb-relation id="EJBRelation_1051639789007">
+            <description>description_3</description>
+            <ejb-relation-name>name_3</ejb-relation-name>
+            <ejb-relationship-role id="EJBRelationshipRole_1051639789008">
+               <description>description_15</description>
+               <ejb-relationship-role-name>roleName_15</ejb-relationship-role-name>
+               <multiplicity>Many</multiplicity>
+               <relationship-role-source id="RoleSource_1051639789008">
+                  <description>description_15</description>
+                  <ejb-name>name_9</ejb-name>
+               </relationship-role-source>
+               <cmr-field id="CMRField_1051639789008">
+                  <description>description_15</description>
+                  <cmr-field-name>name_25</cmr-field-name>
+                  <cmr-field-type>java.lang.String</cmr-field-type>
+               </cmr-field>
+            </ejb-relationship-role>
+            <ejb-relationship-role id="EJBRelationshipRole_1051639789009">
+               <description>description_16</description>
+               <ejb-relationship-role-name>roleName_16</ejb-relationship-role-name>
+               <multiplicity>One</multiplicity>
+               <cascade-delete></cascade-delete>
+               <relationship-role-source id="RoleSource_1051639789009">
+                  <description>description_16</description>
+                  <ejb-name>name_0</ejb-name>
+               </relationship-role-source>
+               <cmr-field id="CMRField_1051639789009">
+                  <description>description_16</description>
+                  <cmr-field-name>name_26</cmr-field-name>
+                  <cmr-field-type>java.util.HashTable</cmr-field-type>
+               </cmr-field>
+            </ejb-relationship-role>
+         </ejb-relation>
+         <ejb-relation id="EJBRelation_1051639789008">
+            <description>description_4</description>
+            <ejb-relation-name>name_4</ejb-relation-name>
+            <ejb-relationship-role id="EJBRelationshipRole_1051639789010">
+               <description>description_20</description>
+               <ejb-relationship-role-name>roleName_20</ejb-relationship-role-name>
+               <multiplicity>One</multiplicity>
+               <cascade-delete></cascade-delete>
+               <relationship-role-source id="RoleSource_1051639789010">
+                  <description>description_20</description>
+                  <ejb-name>name_0</ejb-name>
+               </relationship-role-source>
+               <cmr-field id="CMRField_1051639789010">
+                  <description>description_20</description>
+                  <cmr-field-name>name_30</cmr-field-name>
+                  <cmr-field-type>java.lang.String</cmr-field-type>
+               </cmr-field>
+            </ejb-relationship-role>
+            <ejb-relationship-role id="EJBRelationshipRole_1051639789011">
+               <description>description_21</description>
+               <ejb-relationship-role-name>roleName_21</ejb-relationship-role-name>
+               <multiplicity>Many</multiplicity>
+               <relationship-role-source id="RoleSource_1051639789011">
+                  <description>description_21</description>
+                  <ejb-name>name_1</ejb-name>
+               </relationship-role-source>
+               <cmr-field id="CMRField_1051639789011">
+                  <description>description_21</description>
+                  <cmr-field-name>name_31</cmr-field-name>
+                  <cmr-field-type>java.util.HashTable</cmr-field-type>
+               </cmr-field>
+            </ejb-relationship-role>
+         </ejb-relation>
+      </relationships>
+      <assembly-descriptor id="AssemblyDescriptor_1051639789016">
+         <security-role id="SecurityRole_1051639789036">
+            <description>description_0</description>
+            <role-name>roleName_0</role-name>
+         </security-role>
+         <security-role id="SecurityRole_1051639789037">
+            <description>description_1</description>
+            <role-name>roleName_1</role-name>
+         </security-role>
+         <security-role id="SecurityRole_1051639789046">
+            <description>description_2</description>
+            <role-name>roleName_2</role-name>
+         </security-role>
+         <security-role id="SecurityRole_1051639789047">
+            <description>description_3</description>
+            <role-name>roleName_3</role-name>
+         </security-role>
+         <security-role id="SecurityRole_1051639789048">
+            <description>description_4</description>
+            <role-name>roleName_4</role-name>
+         </security-role>
+         <method-permission id="MethodPermission_1051639789056">
+            <description>description_0</description>
+            <method id="MethodElement_1051639789106">
+               <description>description_0</description>
+               <ejb-name>name_0</ejb-name>
+               <method-name>name_0</method-name>
+            </method>
+            <method id="MethodElement_1051639789107">
+               <description>description_1</description>
+               <ejb-name>name_1</ejb-name>
+               <method-intf>Remote</method-intf>
+               <method-name>name_1</method-name>
+               <method-params>
+               </method-params>
+            </method>
+            <method id="MethodElement_1051639789108">
+               <description>description_2</description>
+               <ejb-name>name_2</ejb-name>
+               <method-intf>Home</method-intf>
+               <method-name>name_2</method-name>
+               <method-params>
+                  <method-param>parms_0</method-param>
+               </method-params>
+            </method>
+            <method id="MethodElement_1051639789109">
+               <description>description_3</description>
+               <ejb-name>name_8</ejb-name>
+               <method-intf>Local</method-intf>
+               <method-name>name_3</method-name>
+               <method-params>
+                  <method-param>parms_1</method-param>
+                  <method-param>parms_2</method-param>
+               </method-params>
+            </method>
+            <method id="MethodElement_1051639789110">
+               <description>description_4</description>
+               <ejb-name>name_9</ejb-name>
+               <method-intf>LocalHome</method-intf>
+               <method-name>name_4</method-name>
+               <method-params>
+                  <method-param>parms_3</method-param>
+                  <method-param>parms_4</method-param>
+                  <method-param>parms_5</method-param>
+               </method-params>
+            </method>
+         </method-permission>
+         <method-permission id="MethodPermission_1051639789116">
+            <description>description_1</description>
+            <method id="MethodElement_1051639789116">
+               <description>description_5</description>
+               <ejb-name>name_0</ejb-name>
+               <method-name>name_5</method-name>
+            </method>
+            <method id="MethodElement_1051639789117">
+               <description>description_6</description>
+               <ejb-name>name_1</ejb-name>
+               <method-intf>Remote</method-intf>
+               <method-name>name_6</method-name>
+               <method-params>
+               </method-params>
+            </method>
+            <method id="MethodElement_1051639789118">
+               <description>description_7</description>
+               <ejb-name>name_2</ejb-name>
+               <method-intf>Home</method-intf>
+               <method-name>name_7</method-name>
+               <method-params>
+                  <method-param>parms_6</method-param>
+               </method-params>
+            </method>
+            <method id="MethodElement_1051639789119">
+               <description>description_8</description>
+               <ejb-name>name_8</ejb-name>
+               <method-intf>Local</method-intf>
+               <method-name>name_8</method-name>
+               <method-params>
+                  <method-param>parms_7</method-param>
+                  <method-param>parms_8</method-param>
+               </method-params>
+            </method>
+            <method id="MethodElement_1051639789120">
+               <description>description_9</description>
+               <ejb-name>name_9</ejb-name>
+               <method-intf>LocalHome</method-intf>
+               <method-name>name_9</method-name>
+               <method-params>
+                  <method-param>parms_9</method-param>
+                  <method-param>parms_10</method-param>
+                  <method-param>parms_11</method-param>
+               </method-params>
+            </method>
+         </method-permission>
+         <method-permission id="MethodPermission_1051639789117">
+            <description>description_2</description>
+            <method id="MethodElement_1051639789121">
+               <description>description_10</description>
+               <ejb-name>name_0</ejb-name>
+               <method-name>name_10</method-name>
+            </method>
+            <method id="MethodElement_1051639789122">
+               <description>description_11</description>
+               <ejb-name>name_1</ejb-name>
+               <method-intf>Remote</method-intf>
+               <method-name>name_11</method-name>
+               <method-params>
+               </method-params>
+            </method>
+            <method id="MethodElement_1051639789123">
+               <description>description_12</description>
+               <ejb-name>name_2</ejb-name>
+               <method-intf>Home</method-intf>
+               <method-name>name_12</method-name>
+               <method-params>
+                  <method-param>parms_12</method-param>
+               </method-params>
+            </method>
+            <method id="MethodElement_1051639789124">
+               <description>description_13</description>
+               <ejb-name>name_8</ejb-name>
+               <method-intf>Local</method-intf>
+               <method-name>name_13</method-name>
+               <method-params>
+                  <method-param>parms_13</method-param>
+                  <method-param>parms_14</method-param>
+               </method-params>
+            </method>
+            <method id="MethodElement_1051639789125">
+               <description>description_14</description>
+               <ejb-name>name_9</ejb-name>
+               <method-intf>LocalHome</method-intf>
+               <method-name>name_14</method-name>
+               <method-params>
+                  <method-param>parms_15</method-param>
+                  <method-param>parms_16</method-param>
+                  <method-param>parms_17</method-param>
+               </method-params>
+            </method>
+         </method-permission>
+         <method-permission id="MethodPermission_1051639789126">
+            <description>description_3</description>
+            <method id="MethodElement_1051639789126">
+               <description>description_15</description>
+               <ejb-name>name_0</ejb-name>
+               <method-name>name_15</method-name>
+            </method>
+            <method id="MethodElement_1051639789127">
+               <description>description_16</description>
+               <ejb-name>name_1</ejb-name>
+               <method-intf>Remote</method-intf>
+               <method-name>name_16</method-name>
+               <method-params>
+               </method-params>
+            </method>
+            <method id="MethodElement_1051639789128">
+               <description>description_17</description>
+               <ejb-name>name_2</ejb-name>
+               <method-intf>Home</method-intf>
+               <method-name>name_17</method-name>
+               <method-params>
+                  <method-param>parms_18</method-param>
+               </method-params>
+            </method>
+            <method id="MethodElement_1051639789129">
+               <description>description_18</description>
+               <ejb-name>name_8</ejb-name>
+               <method-intf>Local</method-intf>
+               <method-name>name_18</method-name>
+               <method-params>
+                  <method-param>parms_19</method-param>
+                  <method-param>parms_20</method-param>
+               </method-params>
+            </method>
+            <method id="MethodElement_1051639789130">
+               <description>description_19</description>
+               <ejb-name>name_9</ejb-name>
+               <method-intf>LocalHome</method-intf>
+               <method-name>name_19</method-name>
+               <method-params>
+                  <method-param>parms_21</method-param>
+                  <method-param>parms_22</method-param>
+                  <method-param>parms_23</method-param>
+               </method-params>
+            </method>
+         </method-permission>
+         <method-permission id="MethodPermission_1051639789127">
+            <description>description_4</description>
+            <method id="MethodElement_1051639789131">
+               <description>description_20</description>
+               <ejb-name>name_0</ejb-name>
+               <method-name>name_20</method-name>
+            </method>
+            <method id="MethodElement_1051639789132">
+               <description>description_21</description>
+               <ejb-name>name_1</ejb-name>
+               <method-intf>Remote</method-intf>
+               <method-name>name_21</method-name>
+               <method-params>
+               </method-params>
+            </method>
+            <method id="MethodElement_1051639789133">
+               <description>description_22</description>
+               <ejb-name>name_2</ejb-name>
+               <method-intf>Home</method-intf>
+               <method-name>name_22</method-name>
+               <method-params>
+                  <method-param>parms_24</method-param>
+               </method-params>
+            </method>
+            <method id="MethodElement_1051639789134">
+               <description>description_23</description>
+               <ejb-name>name_8</ejb-name>
+               <method-intf>Local</method-intf>
+               <method-name>name_23</method-name>
+               <method-params>
+                  <method-param>parms_25</method-param>
+                  <method-param>parms_26</method-param>
+               </method-params>
+            </method>
+            <method id="MethodElement_1051639789135">
+               <description>description_24</description>
+               <ejb-name>name_9</ejb-name>
+               <method-intf>LocalHome</method-intf>
+               <method-name>name_24</method-name>
+               <method-params>
+                  <method-param>parms_27</method-param>
+                  <method-param>parms_28</method-param>
+                  <method-param>parms_29</method-param>
+               </method-params>
+            </method>
+         </method-permission>
+         <container-transaction id="MethodTransaction_1051639789146">
+            <description>description_0</description>
+            <method id="MethodElement_1051639789146">
+               <description>description_25</description>
+               <ejb-name>name_0</ejb-name>
+               <method-name>name_25</method-name>
+            </method>
+            <method id="MethodElement_1051639789147">
+               <description>description_26</description>
+               <ejb-name>name_1</ejb-name>
+               <method-intf>Remote</method-intf>
+               <method-name>name_26</method-name>
+               <method-params>
+               </method-params>
+            </method>
+            <method id="MethodElement_1051639789148">
+               <description>description_27</description>
+               <ejb-name>name_2</ejb-name>
+               <method-intf>Home</method-intf>
+               <method-name>name_27</method-name>
+               <method-params>
+                  <method-param>parms_30</method-param>
+               </method-params>
+            </method>
+            <method id="MethodElement_1051639789149">
+               <description>description_28</description>
+               <ejb-name>name_8</ejb-name>
+               <method-intf>Local</method-intf>
+               <method-name>name_28</method-name>
+               <method-params>
+                  <method-param>parms_31</method-param>
+                  <method-param>parms_32</method-param>
+               </method-params>
+            </method>
+            <method id="MethodElement_1051639789150">
+               <description>description_29</description>
+               <ejb-name>name_9</ejb-name>
+               <method-intf>LocalHome</method-intf>
+               <method-name>name_29</method-name>
+               <method-params>
+                  <method-param>parms_33</method-param>
+                  <method-param>parms_34</method-param>
+                  <method-param>parms_35</method-param>
+               </method-params>
+            </method>
+            <trans-attribute>NotSupported</trans-attribute>
+         </container-transaction>
+         <container-transaction id="MethodTransaction_1051639789147">
+            <description>description_1</description>
+            <method id="MethodElement_1051639789151">
+               <description>description_30</description>
+               <ejb-name>name_0</ejb-name>
+               <method-name>name_30</method-name>
+            </method>
+            <method id="MethodElement_1051639789152">
+               <description>description_31</description>
+               <ejb-name>name_1</ejb-name>
+               <method-intf>Remote</method-intf>
+               <method-name>name_31</method-name>
+               <method-params>
+               </method-params>
+            </method>
+            <method id="MethodElement_1051639789153">
+               <description>description_32</description>
+               <ejb-name>name_2</ejb-name>
+               <method-intf>Home</method-intf>
+               <method-name>name_32</method-name>
+               <method-params>
+                  <method-param>parms_36</method-param>
+               </method-params>
+            </method>
+            <method id="MethodElement_1051639789154">
+               <description>description_33</description>
+               <ejb-name>name_8</ejb-name>
+               <method-intf>Local</method-intf>
+               <method-name>name_33</method-name>
+               <method-params>
+                  <method-param>parms_37</method-param>
+                  <method-param>parms_38</method-param>
+               </method-params>
+            </method>
+            <method id="MethodElement_1051639789156">
+               <description>description_34</description>
+               <ejb-name>name_9</ejb-name>
+               <method-intf>LocalHome</method-intf>
+               <method-name>name_34</method-name>
+               <method-params>
+                  <method-param>parms_39</method-param>
+                  <method-param>parms_40</method-param>
+                  <method-param>parms_41</method-param>
+               </method-params>
+            </method>
+            <trans-attribute>Supports</trans-attribute>
+         </container-transaction>
+         <container-transaction id="MethodTransaction_1051639789156">
+            <description>description_2</description>
+            <method id="MethodElement_1051639789157">
+               <description>description_35</description>
+               <ejb-name>name_0</ejb-name>
+               <method-name>name_35</method-name>
+            </method>
+            <method id="MethodElement_1051639789158">
+               <description>description_36</description>
+               <ejb-name>name_1</ejb-name>
+               <method-intf>Remote</method-intf>
+               <method-name>name_36</method-name>
+               <method-params>
+               </method-params>
+            </method>
+            <method id="MethodElement_1051639789159">
+               <description>description_37</description>
+               <ejb-name>name_2</ejb-name>
+               <method-intf>Home</method-intf>
+               <method-name>name_37</method-name>
+               <method-params>
+                  <method-param>parms_42</method-param>
+               </method-params>
+            </method>
+            <method id="MethodElement_1051639789160">
+               <description>description_38</description>
+               <ejb-name>name_8</ejb-name>
+               <method-intf>Local</method-intf>
+               <method-name>name_38</method-name>
+               <method-params>
+                  <method-param>parms_43</method-param>
+                  <method-param>parms_44</method-param>
+               </method-params>
+            </method>
+            <method id="MethodElement_1051639789161">
+               <description>description_39</description>
+               <ejb-name>name_9</ejb-name>
+               <method-intf>LocalHome</method-intf>
+               <method-name>name_39</method-name>
+               <method-params>
+                  <method-param>parms_45</method-param>
+                  <method-param>parms_46</method-param>
+                  <method-param>parms_47</method-param>
+               </method-params>
+            </method>
+            <trans-attribute>Required</trans-attribute>
+         </container-transaction>
+         <container-transaction id="MethodTransaction_1051639789157">
+            <description>description_3</description>
+            <method id="MethodElement_1051639789162">
+               <description>description_40</description>
+               <ejb-name>name_0</ejb-name>
+               <method-name>name_40</method-name>
+            </method>
+            <method id="MethodElement_1051639789163">
+               <description>description_41</description>
+               <ejb-name>name_1</ejb-name>
+               <method-intf>Remote</method-intf>
+               <method-name>name_41</method-name>
+               <method-params>
+               </method-params>
+            </method>
+            <method id="MethodElement_1051639789164">
+               <description>description_42</description>
+               <ejb-name>name_2</ejb-name>
+               <method-intf>Home</method-intf>
+               <method-name>name_42</method-name>
+               <method-params>
+                  <method-param>parms_48</method-param>
+               </method-params>
+            </method>
+            <method id="MethodElement_1051639789165">
+               <description>description_43</description>
+               <ejb-name>name_8</ejb-name>
+               <method-intf>Local</method-intf>
+               <method-name>name_43</method-name>
+               <method-params>
+                  <method-param>parms_49</method-param>
+                  <method-param>parms_50</method-param>
+               </method-params>
+            </method>
+            <method id="MethodElement_1051639789166">
+               <description>description_44</description>
+               <ejb-name>name_9</ejb-name>
+               <method-intf>LocalHome</method-intf>
+               <method-name>name_44</method-name>
+               <method-params>
+                  <method-param>parms_51</method-param>
+                  <method-param>parms_52</method-param>
+                  <method-param>parms_53</method-param>
+               </method-params>
+            </method>
+            <trans-attribute>RequiresNew</trans-attribute>
+         </container-transaction>
+         <container-transaction id="MethodTransaction_1051639789158">
+            <description>description_4</description>
+            <method id="MethodElement_1051639789167">
+               <description>description_45</description>
+               <ejb-name>name_0</ejb-name>
+               <method-name>name_45</method-name>
+            </method>
+            <method id="MethodElement_1051639789168">
+               <description>description_46</description>
+               <ejb-name>name_1</ejb-name>
+               <method-intf>Remote</method-intf>
+               <method-name>name_46</method-name>
+               <method-params>
+               </method-params>
+            </method>
+            <method id="MethodElement_1051639789169">
+               <description>description_47</description>
+               <ejb-name>name_2</ejb-name>
+               <method-intf>Home</method-intf>
+               <method-name>name_47</method-name>
+               <method-params>
+                  <method-param>parms_54</method-param>
+               </method-params>
+            </method>
+            <method id="MethodElement_1051639789170">
+               <description>description_48</description>
+               <ejb-name>name_8</ejb-name>
+               <method-intf>Local</method-intf>
+               <method-name>name_48</method-name>
+               <method-params>
+                  <method-param>parms_55</method-param>
+                  <method-param>parms_56</method-param>
+               </method-params>
+            </method>
+            <method id="MethodElement_1051639789171">
+               <description>description_49</description>
+               <ejb-name>name_9</ejb-name>
+               <method-intf>LocalHome</method-intf>
+               <method-name>name_49</method-name>
+               <method-params>
+                  <method-param>parms_57</method-param>
+                  <method-param>parms_58</method-param>
+                  <method-param>parms_59</method-param>
+               </method-params>
+            </method>
+            <trans-attribute>Mandatory</trans-attribute>
+         </container-transaction>
+         <exclude-list id="ExcludeList_1051639789166">
+            <description>description_0</description>
+            <method id="MethodElement_1051639789172">
+               <description>description_50</description>
+               <ejb-name>name_0</ejb-name>
+               <method-name>name_50</method-name>
+            </method>
+            <method id="MethodElement_1051639789176">
+               <description>description_51</description>
+               <ejb-name>name_1</ejb-name>
+               <method-intf>Remote</method-intf>
+               <method-name>name_51</method-name>
+               <method-params>
+               </method-params>
+            </method>
+            <method id="MethodElement_1051639789177">
+               <description>description_52</description>
+               <ejb-name>name_2</ejb-name>
+               <method-intf>Home</method-intf>
+               <method-name>name_52</method-name>
+               <method-params>
+                  <method-param>parms_60</method-param>
+               </method-params>
+            </method>
+            <method id="MethodElement_1051639789178">
+               <description>description_53</description>
+               <ejb-name>name_8</ejb-name>
+               <method-intf>Local</method-intf>
+               <method-name>name_53</method-name>
+               <method-params>
+                  <method-param>parms_61</method-param>
+                  <method-param>parms_62</method-param>
+               </method-params>
+            </method>
+            <method id="MethodElement_1051639789179">
+               <description>description_54</description>
+               <ejb-name>name_9</ejb-name>
+               <method-intf>LocalHome</method-intf>
+               <method-name>name_54</method-name>
+               <method-params>
+                  <method-param>parms_63</method-param>
+                  <method-param>parms_64</method-param>
+                  <method-param>parms_65</method-param>
+               </method-params>
+            </method>
+         </exclude-list>
+      </assembly-descriptor>
+      <ejb-client-jar>ejbClientJar_0</ejb-client-jar>
+   </ejb-jar>
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/EMFTests/ejb-jar1-1.xml b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/EMFTests/ejb-jar1-1.xml
new file mode 100644
index 0000000..d70d2d4
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/EMFTests/ejb-jar1-1.xml
@@ -0,0 +1,2831 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 1.1//EN" "http://java.sun.com/j2ee/dtds/ejb-jar_1_1.dtd">
+<ejb-jar id="ejb-jar_ID">
+    <description>description_0</description>
+    <display-name>displayName_0</display-name>
+    <small-icon>smallIcon_0</small-icon>
+    <large-icon>largeIcon_0</large-icon>
+    <enterprise-beans>
+        <entity id="MyCMP">
+            <ejb-name>MyCMP</ejb-name>
+            <home>com.ibm.test.ejb.MyCMPHome</home>
+            <remote>com.ibm.test.ejb.MyCMP</remote>
+            <ejb-class>com.ibm.test.ejb.MyCMPBean</ejb-class>
+            <persistence-type>Container</persistence-type>
+            <prim-key-class>com.ibm.test.ejb.MyCMPKey</prim-key-class>
+            <reentrant>False</reentrant>
+            <cmp-field>
+                <field-name>k1</field-name>
+            </cmp-field>
+        </entity>
+        <entity id="MyCMP1">
+            <ejb-name>MyCMP1</ejb-name>
+            <home>com.ibm.test.ejb.MyCMP1Home</home>
+            <remote>com.ibm.test.ejb.MyCMP1</remote>
+            <ejb-class>com.ibm.test.ejb.MyCMP1Bean</ejb-class>
+            <persistence-type>Container</persistence-type>
+            <prim-key-class>com.ibm.test.ejb.MyCMP1Key</prim-key-class>
+            <reentrant>False</reentrant>
+            <cmp-field>
+                <field-name>k1</field-name>
+            </cmp-field>
+        </entity>
+        <entity id="MyCMP2">
+            <ejb-name>MyCMP2</ejb-name>
+            <home>com.ibm.test.ejb.MyCMP2Home</home>
+            <remote>com.ibm.test.ejb.MyCMP2</remote>
+            <ejb-class>com.ibm.test.ejb.MyCMP2Bean</ejb-class>
+            <persistence-type>Container</persistence-type>
+            <prim-key-class>com.ibm.test.ejb.MyCMP2Key</prim-key-class>
+            <reentrant>False</reentrant>
+            <cmp-field>
+                <field-name>k1</field-name>
+            </cmp-field>
+        </entity>
+        <entity>
+            <description>description_0</description>
+            <display-name>displayName_0</display-name>
+            <small-icon>smallIcon_0</small-icon>
+            <large-icon>largeIcon_0</large-icon>
+            <ejb-name>name_0</ejb-name>
+            <home>java.util.List</home>
+            <remote>java.sql.Data</remote>
+            <local-home>java.lang.Integer</local-home>
+            <local>java.lang.String</local>
+            <ejb-class>java.util.HashTable</ejb-class>
+            <persistence-type>Bean</persistence-type>
+            <prim-key-class>java.util.HashTable</prim-key-class>
+            <reentrant>True</reentrant>
+            <env-entry>
+                <description>description_0</description>
+                <env-entry-name>name_0</env-entry-name>
+                <env-entry-type>java.lang.String</env-entry-type>
+                <env-entry-value>value_0</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_1</description>
+                <env-entry-name>name_1</env-entry-name>
+                <env-entry-type>java.lang.Integer</env-entry-type>
+                <env-entry-value>value_1</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_2</description>
+                <env-entry-name>name_2</env-entry-name>
+                <env-entry-type>java.lang.Boolean</env-entry-type>
+                <env-entry-value>value_2</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_3</description>
+                <env-entry-name>name_3</env-entry-name>
+                <env-entry-type>java.lang.Double</env-entry-type>
+                <env-entry-value>value_3</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_4</description>
+                <env-entry-name>name_4</env-entry-name>
+                <env-entry-type>java.lang.Byte</env-entry-type>
+                <env-entry-value>value_4</env-entry-value>
+            </env-entry>
+            <ejb-ref>
+                <description>description_0</description>
+                <ejb-ref-name>name_0</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_0</home>
+                <remote>remote_0</remote>
+                <ejb-link>link_0</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_1</description>
+                <ejb-ref-name>name_1</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_1</home>
+                <remote>remote_1</remote>
+                <ejb-link>link_1</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_2</description>
+                <ejb-ref-name>name_2</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_2</home>
+                <remote>remote_2</remote>
+                <ejb-link>link_2</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_3</description>
+                <ejb-ref-name>name_3</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_3</home>
+                <remote>remote_3</remote>
+                <ejb-link>link_3</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_4</description>
+                <ejb-ref-name>name_4</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_4</home>
+                <remote>remote_4</remote>
+                <ejb-link>link_4</ejb-link>
+            </ejb-ref>
+            <ejb-local-ref>
+                <description>description_0</description>
+                <ejb-ref-name>name_0</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>localHome_0</local-home>
+                <local>local_0</local>
+                <ejb-link>link_0</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_1</description>
+                <ejb-ref-name>name_1</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>localHome_1</local-home>
+                <local>local_1</local>
+                <ejb-link>link_1</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_2</description>
+                <ejb-ref-name>name_2</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>localHome_2</local-home>
+                <local>local_2</local>
+                <ejb-link>link_2</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_3</description>
+                <ejb-ref-name>name_3</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>localHome_3</local-home>
+                <local>local_3</local>
+                <ejb-link>link_3</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_4</description>
+                <ejb-ref-name>name_4</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>localHome_4</local-home>
+                <local>local_4</local>
+                <ejb-link>link_4</ejb-link>
+            </ejb-local-ref>
+            <security-role-ref>
+                <description>description_0</description>
+                <role-name>name_0</role-name>
+                <role-link>link_0</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_1</description>
+                <role-name>name_1</role-name>
+                <role-link>link_1</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_2</description>
+                <role-name>name_2</role-name>
+                <role-link>link_2</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_3</description>
+                <role-name>name_3</role-name>
+                <role-link>link_3</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_4</description>
+                <role-name>name_4</role-name>
+                <role-link>link_4</role-link>
+            </security-role-ref>
+            <security-identity>
+                <description>description_0</description>
+                <run-as>
+                    <description>description_0</description>
+                    <role-name>roleName_0</role-name>
+                </run-as>
+            </security-identity>
+            <resource-ref>
+                <description>description_0</description>
+                <res-ref-name>name_0</res-ref-name>
+                <res-type>type_0</res-type>
+                <res-auth>Container</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_1</description>
+                <res-ref-name>name_1</res-ref-name>
+                <res-type>type_1</res-type>
+                <res-auth>Application</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_2</description>
+                <res-ref-name>name_2</res-ref-name>
+                <res-type>type_2</res-type>
+                <res-auth>SERVLET</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_3</description>
+                <res-ref-name>name_3</res-ref-name>
+                <res-type>type_3</res-type>
+                <res-auth>Container</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_4</description>
+                <res-ref-name>name_4</res-ref-name>
+                <res-type>type_4</res-type>
+                <res-auth>Application</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-env-ref>
+                <description>description_0</description>
+                <resource-env-ref-name>name_0</resource-env-ref-name>
+                <resource-env-ref-type>java.util.HashTable</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_1</description>
+                <resource-env-ref-name>name_1</resource-env-ref-name>
+                <resource-env-ref-type>java.util.List</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_2</description>
+                <resource-env-ref-name>name_2</resource-env-ref-name>
+                <resource-env-ref-type>java.sql.Data</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_3</description>
+                <resource-env-ref-name>name_3</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.Integer</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_4</description>
+                <resource-env-ref-name>name_4</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.String</resource-env-ref-type>
+            </resource-env-ref>
+        </entity>
+        <entity>
+            <description>description_1</description>
+            <display-name>displayName_1</display-name>
+            <small-icon>smallIcon_1</small-icon>
+            <large-icon>largeIcon_1</large-icon>
+            <ejb-name>name_1</ejb-name>
+            <home>java.sql.Data</home>
+            <remote>java.lang.Integer</remote>
+            <local-home>java.lang.String</local-home>
+            <local>java.util.HashTable</local>
+            <ejb-class>java.util.List</ejb-class>
+            <persistence-type>Bean</persistence-type>
+            <prim-key-class>java.util.List</prim-key-class>
+            <reentrant>False</reentrant>
+            <env-entry>
+                <description>description_5</description>
+                <env-entry-name>name_5</env-entry-name>
+                <env-entry-type>java.lang.Short</env-entry-type>
+                <env-entry-value>value_5</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_6</description>
+                <env-entry-name>name_6</env-entry-name>
+                <env-entry-type>java.lang.Long</env-entry-type>
+                <env-entry-value>value_6</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_7</description>
+                <env-entry-name>name_7</env-entry-name>
+                <env-entry-type>java.lang.Float</env-entry-type>
+                <env-entry-value>value_7</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_8</description>
+                <env-entry-name>name_8</env-entry-name>
+                <env-entry-type>java.lang.Character</env-entry-type>
+                <env-entry-value>value_8</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_9</description>
+                <env-entry-name>name_9</env-entry-name>
+                <env-entry-type>java.lang.String</env-entry-type>
+                <env-entry-value>value_9</env-entry-value>
+            </env-entry>
+            <ejb-ref>
+                <description>description_5</description>
+                <ejb-ref-name>name_5</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_5</home>
+                <remote>remote_5</remote>
+                <ejb-link>link_5</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_6</description>
+                <ejb-ref-name>name_6</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_6</home>
+                <remote>remote_6</remote>
+                <ejb-link>link_6</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_7</description>
+                <ejb-ref-name>name_7</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_7</home>
+                <remote>remote_7</remote>
+                <ejb-link>link_7</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_8</description>
+                <ejb-ref-name>name_8</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_8</home>
+                <remote>remote_8</remote>
+                <ejb-link>link_8</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_9</description>
+                <ejb-ref-name>name_9</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_9</home>
+                <remote>remote_9</remote>
+                <ejb-link>link_9</ejb-link>
+            </ejb-ref>
+            <ejb-local-ref>
+                <description>description_5</description>
+                <ejb-ref-name>name_5</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>localHome_5</local-home>
+                <local>local_5</local>
+                <ejb-link>link_5</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_6</description>
+                <ejb-ref-name>name_6</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>localHome_6</local-home>
+                <local>local_6</local>
+                <ejb-link>link_6</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_7</description>
+                <ejb-ref-name>name_7</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>localHome_7</local-home>
+                <local>local_7</local>
+                <ejb-link>link_7</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_8</description>
+                <ejb-ref-name>name_8</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>localHome_8</local-home>
+                <local>local_8</local>
+                <ejb-link>link_8</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_9</description>
+                <ejb-ref-name>name_9</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>localHome_9</local-home>
+                <local>local_9</local>
+                <ejb-link>link_9</ejb-link>
+            </ejb-local-ref>
+            <security-role-ref>
+                <description>description_5</description>
+                <role-name>name_5</role-name>
+                <role-link>link_5</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_6</description>
+                <role-name>name_6</role-name>
+                <role-link>link_6</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_7</description>
+                <role-name>name_7</role-name>
+                <role-link>link_7</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_8</description>
+                <role-name>name_8</role-name>
+                <role-link>link_8</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_9</description>
+                <role-name>name_9</role-name>
+                <role-link>link_9</role-link>
+            </security-role-ref>
+            <security-identity>
+                <description>description_0</description>
+                <use-caller-identity/>
+            </security-identity>
+            <resource-ref>
+                <description>description_5</description>
+                <res-ref-name>name_5</res-ref-name>
+                <res-type>type_5</res-type>
+                <res-auth>SERVLET</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_6</description>
+                <res-ref-name>name_6</res-ref-name>
+                <res-type>type_6</res-type>
+                <res-auth>Container</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_7</description>
+                <res-ref-name>name_7</res-ref-name>
+                <res-type>type_7</res-type>
+                <res-auth>Application</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_8</description>
+                <res-ref-name>name_8</res-ref-name>
+                <res-type>type_8</res-type>
+                <res-auth>SERVLET</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_9</description>
+                <res-ref-name>name_9</res-ref-name>
+                <res-type>type_9</res-type>
+                <res-auth>Container</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-env-ref>
+                <description>description_5</description>
+                <resource-env-ref-name>name_5</resource-env-ref-name>
+                <resource-env-ref-type>java.util.List</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_6</description>
+                <resource-env-ref-name>name_6</resource-env-ref-name>
+                <resource-env-ref-type>java.sql.Data</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_7</description>
+                <resource-env-ref-name>name_7</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.Integer</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_8</description>
+                <resource-env-ref-name>name_8</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.String</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_9</description>
+                <resource-env-ref-name>name_9</resource-env-ref-name>
+                <resource-env-ref-type>java.util.HashTable</resource-env-ref-type>
+            </resource-env-ref>
+        </entity>
+        <entity>
+            <description>description_2</description>
+            <display-name>displayName_2</display-name>
+            <small-icon>smallIcon_2</small-icon>
+            <large-icon>largeIcon_2</large-icon>
+            <ejb-name>name_2</ejb-name>
+            <home>java.lang.Integer</home>
+            <remote>java.lang.String</remote>
+            <local-home>java.util.HashTable</local-home>
+            <local>java.util.List</local>
+            <ejb-class>java.sql.Data</ejb-class>
+            <persistence-type>Bean</persistence-type>
+            <prim-key-class>java.sql.Data</prim-key-class>
+            <reentrant>True</reentrant>
+            <env-entry>
+                <description>description_10</description>
+                <env-entry-name>name_10</env-entry-name>
+                <env-entry-type>java.lang.Integer</env-entry-type>
+                <env-entry-value>value_10</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_11</description>
+                <env-entry-name>name_11</env-entry-name>
+                <env-entry-type>java.lang.Boolean</env-entry-type>
+                <env-entry-value>value_11</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_12</description>
+                <env-entry-name>name_12</env-entry-name>
+                <env-entry-type>java.lang.Double</env-entry-type>
+                <env-entry-value>value_12</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_13</description>
+                <env-entry-name>name_13</env-entry-name>
+                <env-entry-type>java.lang.Byte</env-entry-type>
+                <env-entry-value>value_13</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_14</description>
+                <env-entry-name>name_14</env-entry-name>
+                <env-entry-type>java.lang.Short</env-entry-type>
+                <env-entry-value>value_14</env-entry-value>
+            </env-entry>
+            <ejb-ref>
+                <description>description_10</description>
+                <ejb-ref-name>name_10</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_10</home>
+                <remote>remote_10</remote>
+                <ejb-link>link_10</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_11</description>
+                <ejb-ref-name>name_11</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_11</home>
+                <remote>remote_11</remote>
+                <ejb-link>link_11</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_12</description>
+                <ejb-ref-name>name_12</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_12</home>
+                <remote>remote_12</remote>
+                <ejb-link>link_12</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_13</description>
+                <ejb-ref-name>name_13</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_13</home>
+                <remote>remote_13</remote>
+                <ejb-link>link_13</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_14</description>
+                <ejb-ref-name>name_14</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_14</home>
+                <remote>remote_14</remote>
+                <ejb-link>link_14</ejb-link>
+            </ejb-ref>
+            <ejb-local-ref>
+                <description>description_10</description>
+                <ejb-ref-name>name_10</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>localHome_10</local-home>
+                <local>local_10</local>
+                <ejb-link>link_10</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_11</description>
+                <ejb-ref-name>name_11</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>localHome_11</local-home>
+                <local>local_11</local>
+                <ejb-link>link_11</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_12</description>
+                <ejb-ref-name>name_12</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>localHome_12</local-home>
+                <local>local_12</local>
+                <ejb-link>link_12</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_13</description>
+                <ejb-ref-name>name_13</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>localHome_13</local-home>
+                <local>local_13</local>
+                <ejb-link>link_13</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_14</description>
+                <ejb-ref-name>name_14</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>localHome_14</local-home>
+                <local>local_14</local>
+                <ejb-link>link_14</ejb-link>
+            </ejb-local-ref>
+            <security-role-ref>
+                <description>description_10</description>
+                <role-name>name_10</role-name>
+                <role-link>link_10</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_11</description>
+                <role-name>name_11</role-name>
+                <role-link>link_11</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_12</description>
+                <role-name>name_12</role-name>
+                <role-link>link_12</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_13</description>
+                <role-name>name_13</role-name>
+                <role-link>link_13</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_14</description>
+                <role-name>name_14</role-name>
+                <role-link>link_14</role-link>
+            </security-role-ref>
+            <security-identity>
+                <description>description_1</description>
+                <run-as>
+                    <description>description_1</description>
+                    <role-name>roleName_1</role-name>
+                </run-as>
+            </security-identity>
+            <resource-ref>
+                <description>description_10</description>
+                <res-ref-name>name_10</res-ref-name>
+                <res-type>type_10</res-type>
+                <res-auth>Application</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_11</description>
+                <res-ref-name>name_11</res-ref-name>
+                <res-type>type_11</res-type>
+                <res-auth>SERVLET</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_12</description>
+                <res-ref-name>name_12</res-ref-name>
+                <res-type>type_12</res-type>
+                <res-auth>Container</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_13</description>
+                <res-ref-name>name_13</res-ref-name>
+                <res-type>type_13</res-type>
+                <res-auth>Application</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_14</description>
+                <res-ref-name>name_14</res-ref-name>
+                <res-type>type_14</res-type>
+                <res-auth>SERVLET</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-env-ref>
+                <description>description_10</description>
+                <resource-env-ref-name>name_10</resource-env-ref-name>
+                <resource-env-ref-type>java.sql.Data</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_11</description>
+                <resource-env-ref-name>name_11</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.Integer</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_12</description>
+                <resource-env-ref-name>name_12</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.String</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_13</description>
+                <resource-env-ref-name>name_13</resource-env-ref-name>
+                <resource-env-ref-type>java.util.HashTable</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_14</description>
+                <resource-env-ref-name>name_14</resource-env-ref-name>
+                <resource-env-ref-type>java.util.List</resource-env-ref-type>
+            </resource-env-ref>
+        </entity>
+        <entity>
+            <description>description_3</description>
+            <display-name>displayName_3</display-name>
+            <small-icon>smallIcon_3</small-icon>
+            <large-icon>largeIcon_3</large-icon>
+            <ejb-name>name_3</ejb-name>
+            <home>java.lang.String</home>
+            <remote>java.util.HashTable</remote>
+            <local-home>java.util.List</local-home>
+            <local>java.sql.Data</local>
+            <ejb-class>java.lang.Integer</ejb-class>
+            <persistence-type>Bean</persistence-type>
+            <prim-key-class>java.lang.Integer</prim-key-class>
+            <reentrant>False</reentrant>
+            <env-entry>
+                <description>description_15</description>
+                <env-entry-name>name_15</env-entry-name>
+                <env-entry-type>java.lang.Long</env-entry-type>
+                <env-entry-value>value_15</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_16</description>
+                <env-entry-name>name_16</env-entry-name>
+                <env-entry-type>java.lang.Float</env-entry-type>
+                <env-entry-value>value_16</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_17</description>
+                <env-entry-name>name_17</env-entry-name>
+                <env-entry-type>java.lang.Character</env-entry-type>
+                <env-entry-value>value_17</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_18</description>
+                <env-entry-name>name_18</env-entry-name>
+                <env-entry-type>java.lang.String</env-entry-type>
+                <env-entry-value>value_18</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_19</description>
+                <env-entry-name>name_19</env-entry-name>
+                <env-entry-type>java.lang.Integer</env-entry-type>
+                <env-entry-value>value_19</env-entry-value>
+            </env-entry>
+            <ejb-ref>
+                <description>description_15</description>
+                <ejb-ref-name>name_15</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_15</home>
+                <remote>remote_15</remote>
+                <ejb-link>link_15</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_16</description>
+                <ejb-ref-name>name_16</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_16</home>
+                <remote>remote_16</remote>
+                <ejb-link>link_16</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_17</description>
+                <ejb-ref-name>name_17</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_17</home>
+                <remote>remote_17</remote>
+                <ejb-link>link_17</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_18</description>
+                <ejb-ref-name>name_18</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_18</home>
+                <remote>remote_18</remote>
+                <ejb-link>link_18</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_19</description>
+                <ejb-ref-name>name_19</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_19</home>
+                <remote>remote_19</remote>
+                <ejb-link>link_19</ejb-link>
+            </ejb-ref>
+            <ejb-local-ref>
+                <description>description_15</description>
+                <ejb-ref-name>name_15</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>localHome_15</local-home>
+                <local>local_15</local>
+                <ejb-link>link_15</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_16</description>
+                <ejb-ref-name>name_16</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>localHome_16</local-home>
+                <local>local_16</local>
+                <ejb-link>link_16</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_17</description>
+                <ejb-ref-name>name_17</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>localHome_17</local-home>
+                <local>local_17</local>
+                <ejb-link>link_17</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_18</description>
+                <ejb-ref-name>name_18</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>localHome_18</local-home>
+                <local>local_18</local>
+                <ejb-link>link_18</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_19</description>
+                <ejb-ref-name>name_19</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>localHome_19</local-home>
+                <local>local_19</local>
+                <ejb-link>link_19</ejb-link>
+            </ejb-local-ref>
+            <security-role-ref>
+                <description>description_15</description>
+                <role-name>name_15</role-name>
+                <role-link>link_15</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_16</description>
+                <role-name>name_16</role-name>
+                <role-link>link_16</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_17</description>
+                <role-name>name_17</role-name>
+                <role-link>link_17</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_18</description>
+                <role-name>name_18</role-name>
+                <role-link>link_18</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_19</description>
+                <role-name>name_19</role-name>
+                <role-link>link_19</role-link>
+            </security-role-ref>
+            <security-identity>
+                <description>description_1</description>
+                <use-caller-identity/>
+            </security-identity>
+            <resource-ref>
+                <description>description_15</description>
+                <res-ref-name>name_15</res-ref-name>
+                <res-type>type_15</res-type>
+                <res-auth>Container</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_16</description>
+                <res-ref-name>name_16</res-ref-name>
+                <res-type>type_16</res-type>
+                <res-auth>Application</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_17</description>
+                <res-ref-name>name_17</res-ref-name>
+                <res-type>type_17</res-type>
+                <res-auth>SERVLET</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_18</description>
+                <res-ref-name>name_18</res-ref-name>
+                <res-type>type_18</res-type>
+                <res-auth>Container</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_19</description>
+                <res-ref-name>name_19</res-ref-name>
+                <res-type>type_19</res-type>
+                <res-auth>Application</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-env-ref>
+                <description>description_15</description>
+                <resource-env-ref-name>name_15</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.Integer</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_16</description>
+                <resource-env-ref-name>name_16</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.String</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_17</description>
+                <resource-env-ref-name>name_17</resource-env-ref-name>
+                <resource-env-ref-type>java.util.HashTable</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_18</description>
+                <resource-env-ref-name>name_18</resource-env-ref-name>
+                <resource-env-ref-type>java.util.List</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_19</description>
+                <resource-env-ref-name>name_19</resource-env-ref-name>
+                <resource-env-ref-type>java.sql.Data</resource-env-ref-type>
+            </resource-env-ref>
+        </entity>
+        <entity>
+            <description>description_4</description>
+            <display-name>displayName_4</display-name>
+            <small-icon>smallIcon_4</small-icon>
+            <large-icon>largeIcon_4</large-icon>
+            <ejb-name>name_4</ejb-name>
+            <home>java.util.HashTable</home>
+            <remote>java.util.List</remote>
+            <local-home>java.sql.Data</local-home>
+            <local>java.lang.Integer</local>
+            <ejb-class>java.lang.String</ejb-class>
+            <persistence-type>Bean</persistence-type>
+            <prim-key-class>java.lang.String</prim-key-class>
+            <reentrant>True</reentrant>
+            <env-entry>
+                <description>description_20</description>
+                <env-entry-name>name_20</env-entry-name>
+                <env-entry-type>java.lang.Boolean</env-entry-type>
+                <env-entry-value>value_20</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_21</description>
+                <env-entry-name>name_21</env-entry-name>
+                <env-entry-type>java.lang.Double</env-entry-type>
+                <env-entry-value>value_21</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_22</description>
+                <env-entry-name>name_22</env-entry-name>
+                <env-entry-type>java.lang.Byte</env-entry-type>
+                <env-entry-value>value_22</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_23</description>
+                <env-entry-name>name_23</env-entry-name>
+                <env-entry-type>java.lang.Short</env-entry-type>
+                <env-entry-value>value_23</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_24</description>
+                <env-entry-name>name_24</env-entry-name>
+                <env-entry-type>java.lang.Long</env-entry-type>
+                <env-entry-value>value_24</env-entry-value>
+            </env-entry>
+            <ejb-ref>
+                <description>description_20</description>
+                <ejb-ref-name>name_20</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_20</home>
+                <remote>remote_20</remote>
+                <ejb-link>link_20</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_21</description>
+                <ejb-ref-name>name_21</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_21</home>
+                <remote>remote_21</remote>
+                <ejb-link>link_21</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_22</description>
+                <ejb-ref-name>name_22</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_22</home>
+                <remote>remote_22</remote>
+                <ejb-link>link_22</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_23</description>
+                <ejb-ref-name>name_23</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_23</home>
+                <remote>remote_23</remote>
+                <ejb-link>link_23</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_24</description>
+                <ejb-ref-name>name_24</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_24</home>
+                <remote>remote_24</remote>
+                <ejb-link>link_24</ejb-link>
+            </ejb-ref>
+            <ejb-local-ref>
+                <description>description_20</description>
+                <ejb-ref-name>name_20</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>localHome_20</local-home>
+                <local>local_20</local>
+                <ejb-link>link_20</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_21</description>
+                <ejb-ref-name>name_21</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>localHome_21</local-home>
+                <local>local_21</local>
+                <ejb-link>link_21</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_22</description>
+                <ejb-ref-name>name_22</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>localHome_22</local-home>
+                <local>local_22</local>
+                <ejb-link>link_22</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_23</description>
+                <ejb-ref-name>name_23</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>localHome_23</local-home>
+                <local>local_23</local>
+                <ejb-link>link_23</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_24</description>
+                <ejb-ref-name>name_24</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>localHome_24</local-home>
+                <local>local_24</local>
+                <ejb-link>link_24</ejb-link>
+            </ejb-local-ref>
+            <security-role-ref>
+                <description>description_20</description>
+                <role-name>name_20</role-name>
+                <role-link>link_20</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_21</description>
+                <role-name>name_21</role-name>
+                <role-link>link_21</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_22</description>
+                <role-name>name_22</role-name>
+                <role-link>link_22</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_23</description>
+                <role-name>name_23</role-name>
+                <role-link>link_23</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_24</description>
+                <role-name>name_24</role-name>
+                <role-link>link_24</role-link>
+            </security-role-ref>
+            <security-identity>
+                <description>description_2</description>
+                <run-as>
+                    <description>description_2</description>
+                    <role-name>roleName_2</role-name>
+                </run-as>
+            </security-identity>
+            <resource-ref>
+                <description>description_20</description>
+                <res-ref-name>name_20</res-ref-name>
+                <res-type>type_20</res-type>
+                <res-auth>SERVLET</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_21</description>
+                <res-ref-name>name_21</res-ref-name>
+                <res-type>type_21</res-type>
+                <res-auth>Container</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_22</description>
+                <res-ref-name>name_22</res-ref-name>
+                <res-type>type_22</res-type>
+                <res-auth>Application</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_23</description>
+                <res-ref-name>name_23</res-ref-name>
+                <res-type>type_23</res-type>
+                <res-auth>SERVLET</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_24</description>
+                <res-ref-name>name_24</res-ref-name>
+                <res-type>type_24</res-type>
+                <res-auth>Container</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-env-ref>
+                <description>description_20</description>
+                <resource-env-ref-name>name_20</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.String</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_21</description>
+                <resource-env-ref-name>name_21</resource-env-ref-name>
+                <resource-env-ref-type>java.util.HashTable</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_22</description>
+                <resource-env-ref-name>name_22</resource-env-ref-name>
+                <resource-env-ref-type>java.util.List</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_23</description>
+                <resource-env-ref-name>name_23</resource-env-ref-name>
+                <resource-env-ref-type>java.sql.Data</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_24</description>
+                <resource-env-ref-name>name_24</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.Integer</resource-env-ref-type>
+            </resource-env-ref>
+        </entity>
+        <entity>
+            <description>description_5</description>
+            <display-name>displayName_5</display-name>
+            <small-icon>smallIcon_5</small-icon>
+            <large-icon>largeIcon_5</large-icon>
+            <ejb-name>name_5</ejb-name>
+            <home>java.util.List</home>
+            <remote>java.sql.Data</remote>
+            <local-home>java.lang.Integer</local-home>
+            <local>java.lang.String</local>
+            <ejb-class>java.util.HashTable</ejb-class>
+            <persistence-type>Bean</persistence-type>
+            <prim-key-class>java.util.HashTable</prim-key-class>
+            <reentrant>False</reentrant>
+            <env-entry>
+                <description>description_25</description>
+                <env-entry-name>name_25</env-entry-name>
+                <env-entry-type>java.lang.Float</env-entry-type>
+                <env-entry-value>value_25</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_26</description>
+                <env-entry-name>name_26</env-entry-name>
+                <env-entry-type>java.lang.Character</env-entry-type>
+                <env-entry-value>value_26</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_27</description>
+                <env-entry-name>name_27</env-entry-name>
+                <env-entry-type>java.lang.String</env-entry-type>
+                <env-entry-value>value_27</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_28</description>
+                <env-entry-name>name_28</env-entry-name>
+                <env-entry-type>java.lang.Integer</env-entry-type>
+                <env-entry-value>value_28</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_29</description>
+                <env-entry-name>name_29</env-entry-name>
+                <env-entry-type>java.lang.Boolean</env-entry-type>
+                <env-entry-value>value_29</env-entry-value>
+            </env-entry>
+            <ejb-ref>
+                <description>description_25</description>
+                <ejb-ref-name>name_25</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_25</home>
+                <remote>remote_25</remote>
+                <ejb-link>link_25</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_26</description>
+                <ejb-ref-name>name_26</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_26</home>
+                <remote>remote_26</remote>
+                <ejb-link>link_26</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_27</description>
+                <ejb-ref-name>name_27</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_27</home>
+                <remote>remote_27</remote>
+                <ejb-link>link_27</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_28</description>
+                <ejb-ref-name>name_28</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_28</home>
+                <remote>remote_28</remote>
+                <ejb-link>link_28</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_29</description>
+                <ejb-ref-name>name_29</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_29</home>
+                <remote>remote_29</remote>
+                <ejb-link>link_29</ejb-link>
+            </ejb-ref>
+            <ejb-local-ref>
+                <description>description_25</description>
+                <ejb-ref-name>name_25</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>localHome_25</local-home>
+                <local>local_25</local>
+                <ejb-link>link_25</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_26</description>
+                <ejb-ref-name>name_26</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>localHome_26</local-home>
+                <local>local_26</local>
+                <ejb-link>link_26</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_27</description>
+                <ejb-ref-name>name_27</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>localHome_27</local-home>
+                <local>local_27</local>
+                <ejb-link>link_27</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_28</description>
+                <ejb-ref-name>name_28</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>localHome_28</local-home>
+                <local>local_28</local>
+                <ejb-link>link_28</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_29</description>
+                <ejb-ref-name>name_29</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>localHome_29</local-home>
+                <local>local_29</local>
+                <ejb-link>link_29</ejb-link>
+            </ejb-local-ref>
+            <security-role-ref>
+                <description>description_25</description>
+                <role-name>name_25</role-name>
+                <role-link>link_25</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_26</description>
+                <role-name>name_26</role-name>
+                <role-link>link_26</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_27</description>
+                <role-name>name_27</role-name>
+                <role-link>link_27</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_28</description>
+                <role-name>name_28</role-name>
+                <role-link>link_28</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_29</description>
+                <role-name>name_29</role-name>
+                <role-link>link_29</role-link>
+            </security-role-ref>
+            <security-identity>
+                <description>description_2</description>
+                <use-caller-identity/>
+            </security-identity>
+            <resource-ref>
+                <description>description_25</description>
+                <res-ref-name>name_25</res-ref-name>
+                <res-type>type_25</res-type>
+                <res-auth>Application</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_26</description>
+                <res-ref-name>name_26</res-ref-name>
+                <res-type>type_26</res-type>
+                <res-auth>SERVLET</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_27</description>
+                <res-ref-name>name_27</res-ref-name>
+                <res-type>type_27</res-type>
+                <res-auth>Container</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_28</description>
+                <res-ref-name>name_28</res-ref-name>
+                <res-type>type_28</res-type>
+                <res-auth>Application</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_29</description>
+                <res-ref-name>name_29</res-ref-name>
+                <res-type>type_29</res-type>
+                <res-auth>SERVLET</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-env-ref>
+                <description>description_25</description>
+                <resource-env-ref-name>name_25</resource-env-ref-name>
+                <resource-env-ref-type>java.util.HashTable</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_26</description>
+                <resource-env-ref-name>name_26</resource-env-ref-name>
+                <resource-env-ref-type>java.util.List</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_27</description>
+                <resource-env-ref-name>name_27</resource-env-ref-name>
+                <resource-env-ref-type>java.sql.Data</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_28</description>
+                <resource-env-ref-name>name_28</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.Integer</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_29</description>
+                <resource-env-ref-name>name_29</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.String</resource-env-ref-type>
+            </resource-env-ref>
+        </entity>
+        <entity>
+            <description>description_6</description>
+            <display-name>displayName_6</display-name>
+            <small-icon>smallIcon_6</small-icon>
+            <large-icon>largeIcon_6</large-icon>
+            <ejb-name>name_6</ejb-name>
+            <home>java.sql.Data</home>
+            <remote>java.lang.Integer</remote>
+            <local-home>java.lang.String</local-home>
+            <local>java.util.HashTable</local>
+            <ejb-class>java.util.List</ejb-class>
+            <persistence-type>Bean</persistence-type>
+            <prim-key-class>java.util.List</prim-key-class>
+            <reentrant>True</reentrant>
+            <env-entry>
+                <description>description_30</description>
+                <env-entry-name>name_30</env-entry-name>
+                <env-entry-type>java.lang.Double</env-entry-type>
+                <env-entry-value>value_30</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_31</description>
+                <env-entry-name>name_31</env-entry-name>
+                <env-entry-type>java.lang.Byte</env-entry-type>
+                <env-entry-value>value_31</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_32</description>
+                <env-entry-name>name_32</env-entry-name>
+                <env-entry-type>java.lang.Short</env-entry-type>
+                <env-entry-value>value_32</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_33</description>
+                <env-entry-name>name_33</env-entry-name>
+                <env-entry-type>java.lang.Long</env-entry-type>
+                <env-entry-value>value_33</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_34</description>
+                <env-entry-name>name_34</env-entry-name>
+                <env-entry-type>java.lang.Float</env-entry-type>
+                <env-entry-value>value_34</env-entry-value>
+            </env-entry>
+            <ejb-ref>
+                <description>description_30</description>
+                <ejb-ref-name>name_30</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_30</home>
+                <remote>remote_30</remote>
+                <ejb-link>link_30</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_31</description>
+                <ejb-ref-name>name_31</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_31</home>
+                <remote>remote_31</remote>
+                <ejb-link>link_31</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_32</description>
+                <ejb-ref-name>name_32</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_32</home>
+                <remote>remote_32</remote>
+                <ejb-link>link_32</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_33</description>
+                <ejb-ref-name>name_33</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_33</home>
+                <remote>remote_33</remote>
+                <ejb-link>link_33</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_34</description>
+                <ejb-ref-name>name_34</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_34</home>
+                <remote>remote_34</remote>
+                <ejb-link>link_34</ejb-link>
+            </ejb-ref>
+            <ejb-local-ref>
+                <description>description_30</description>
+                <ejb-ref-name>name_30</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>localHome_30</local-home>
+                <local>local_30</local>
+                <ejb-link>link_30</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_31</description>
+                <ejb-ref-name>name_31</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>localHome_31</local-home>
+                <local>local_31</local>
+                <ejb-link>link_31</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_32</description>
+                <ejb-ref-name>name_32</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>localHome_32</local-home>
+                <local>local_32</local>
+                <ejb-link>link_32</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_33</description>
+                <ejb-ref-name>name_33</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>localHome_33</local-home>
+                <local>local_33</local>
+                <ejb-link>link_33</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_34</description>
+                <ejb-ref-name>name_34</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>localHome_34</local-home>
+                <local>local_34</local>
+                <ejb-link>link_34</ejb-link>
+            </ejb-local-ref>
+            <security-role-ref>
+                <description>description_30</description>
+                <role-name>name_30</role-name>
+                <role-link>link_30</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_31</description>
+                <role-name>name_31</role-name>
+                <role-link>link_31</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_32</description>
+                <role-name>name_32</role-name>
+                <role-link>link_32</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_33</description>
+                <role-name>name_33</role-name>
+                <role-link>link_33</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_34</description>
+                <role-name>name_34</role-name>
+                <role-link>link_34</role-link>
+            </security-role-ref>
+            <security-identity>
+                <description>description_3</description>
+                <run-as>
+                    <description>description_3</description>
+                    <role-name>roleName_3</role-name>
+                </run-as>
+            </security-identity>
+            <resource-ref>
+                <description>description_30</description>
+                <res-ref-name>name_30</res-ref-name>
+                <res-type>type_30</res-type>
+                <res-auth>Container</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_31</description>
+                <res-ref-name>name_31</res-ref-name>
+                <res-type>type_31</res-type>
+                <res-auth>Application</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_32</description>
+                <res-ref-name>name_32</res-ref-name>
+                <res-type>type_32</res-type>
+                <res-auth>SERVLET</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_33</description>
+                <res-ref-name>name_33</res-ref-name>
+                <res-type>type_33</res-type>
+                <res-auth>Container</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_34</description>
+                <res-ref-name>name_34</res-ref-name>
+                <res-type>type_34</res-type>
+                <res-auth>Application</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-env-ref>
+                <description>description_30</description>
+                <resource-env-ref-name>name_30</resource-env-ref-name>
+                <resource-env-ref-type>java.util.List</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_31</description>
+                <resource-env-ref-name>name_31</resource-env-ref-name>
+                <resource-env-ref-type>java.sql.Data</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_32</description>
+                <resource-env-ref-name>name_32</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.Integer</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_33</description>
+                <resource-env-ref-name>name_33</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.String</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_34</description>
+                <resource-env-ref-name>name_34</resource-env-ref-name>
+                <resource-env-ref-type>java.util.HashTable</resource-env-ref-type>
+            </resource-env-ref>
+        </entity>
+        <entity>
+            <description>description_7</description>
+            <display-name>displayName_7</display-name>
+            <small-icon>smallIcon_7</small-icon>
+            <large-icon>largeIcon_7</large-icon>
+            <ejb-name>name_7</ejb-name>
+            <home>java.lang.Integer</home>
+            <remote>java.lang.String</remote>
+            <local-home>java.util.HashTable</local-home>
+            <local>java.util.List</local>
+            <ejb-class>java.sql.Data</ejb-class>
+            <persistence-type>Bean</persistence-type>
+            <prim-key-class>java.sql.Data</prim-key-class>
+            <reentrant>False</reentrant>
+            <env-entry>
+                <description>description_35</description>
+                <env-entry-name>name_35</env-entry-name>
+                <env-entry-type>java.lang.Character</env-entry-type>
+                <env-entry-value>value_35</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_36</description>
+                <env-entry-name>name_36</env-entry-name>
+                <env-entry-type>java.lang.String</env-entry-type>
+                <env-entry-value>value_36</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_37</description>
+                <env-entry-name>name_37</env-entry-name>
+                <env-entry-type>java.lang.Integer</env-entry-type>
+                <env-entry-value>value_37</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_38</description>
+                <env-entry-name>name_38</env-entry-name>
+                <env-entry-type>java.lang.Boolean</env-entry-type>
+                <env-entry-value>value_38</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_39</description>
+                <env-entry-name>name_39</env-entry-name>
+                <env-entry-type>java.lang.Double</env-entry-type>
+                <env-entry-value>value_39</env-entry-value>
+            </env-entry>
+            <ejb-ref>
+                <description>description_35</description>
+                <ejb-ref-name>name_35</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_35</home>
+                <remote>remote_35</remote>
+                <ejb-link>link_35</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_36</description>
+                <ejb-ref-name>name_36</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_36</home>
+                <remote>remote_36</remote>
+                <ejb-link>link_36</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_37</description>
+                <ejb-ref-name>name_37</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_37</home>
+                <remote>remote_37</remote>
+                <ejb-link>link_37</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_38</description>
+                <ejb-ref-name>name_38</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_38</home>
+                <remote>remote_38</remote>
+                <ejb-link>link_38</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_39</description>
+                <ejb-ref-name>name_39</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_39</home>
+                <remote>remote_39</remote>
+                <ejb-link>link_39</ejb-link>
+            </ejb-ref>
+            <ejb-local-ref>
+                <description>description_35</description>
+                <ejb-ref-name>name_35</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>localHome_35</local-home>
+                <local>local_35</local>
+                <ejb-link>link_35</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_36</description>
+                <ejb-ref-name>name_36</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>localHome_36</local-home>
+                <local>local_36</local>
+                <ejb-link>link_36</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_37</description>
+                <ejb-ref-name>name_37</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>localHome_37</local-home>
+                <local>local_37</local>
+                <ejb-link>link_37</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_38</description>
+                <ejb-ref-name>name_38</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>localHome_38</local-home>
+                <local>local_38</local>
+                <ejb-link>link_38</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_39</description>
+                <ejb-ref-name>name_39</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>localHome_39</local-home>
+                <local>local_39</local>
+                <ejb-link>link_39</ejb-link>
+            </ejb-local-ref>
+            <security-role-ref>
+                <description>description_35</description>
+                <role-name>name_35</role-name>
+                <role-link>link_35</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_36</description>
+                <role-name>name_36</role-name>
+                <role-link>link_36</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_37</description>
+                <role-name>name_37</role-name>
+                <role-link>link_37</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_38</description>
+                <role-name>name_38</role-name>
+                <role-link>link_38</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_39</description>
+                <role-name>name_39</role-name>
+                <role-link>link_39</role-link>
+            </security-role-ref>
+            <security-identity>
+                <description>description_3</description>
+                <use-caller-identity/>
+            </security-identity>
+            <resource-ref>
+                <description>description_35</description>
+                <res-ref-name>name_35</res-ref-name>
+                <res-type>type_35</res-type>
+                <res-auth>SERVLET</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_36</description>
+                <res-ref-name>name_36</res-ref-name>
+                <res-type>type_36</res-type>
+                <res-auth>Container</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_37</description>
+                <res-ref-name>name_37</res-ref-name>
+                <res-type>type_37</res-type>
+                <res-auth>Application</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_38</description>
+                <res-ref-name>name_38</res-ref-name>
+                <res-type>type_38</res-type>
+                <res-auth>SERVLET</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_39</description>
+                <res-ref-name>name_39</res-ref-name>
+                <res-type>type_39</res-type>
+                <res-auth>Container</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-env-ref>
+                <description>description_35</description>
+                <resource-env-ref-name>name_35</resource-env-ref-name>
+                <resource-env-ref-type>java.sql.Data</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_36</description>
+                <resource-env-ref-name>name_36</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.Integer</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_37</description>
+                <resource-env-ref-name>name_37</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.String</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_38</description>
+                <resource-env-ref-name>name_38</resource-env-ref-name>
+                <resource-env-ref-type>java.util.HashTable</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_39</description>
+                <resource-env-ref-name>name_39</resource-env-ref-name>
+                <resource-env-ref-type>java.util.List</resource-env-ref-type>
+            </resource-env-ref>
+        </entity>
+        <entity>
+            <description>description_8</description>
+            <display-name>displayName_8</display-name>
+            <small-icon>smallIcon_8</small-icon>
+            <large-icon>largeIcon_8</large-icon>
+            <ejb-name>name_8</ejb-name>
+            <home>java.lang.String</home>
+            <remote>java.util.HashTable</remote>
+            <local-home>java.util.List</local-home>
+            <local>java.sql.Data</local>
+            <ejb-class>java.lang.Integer</ejb-class>
+            <persistence-type>Bean</persistence-type>
+            <prim-key-class>java.lang.Integer</prim-key-class>
+            <reentrant>True</reentrant>
+            <env-entry>
+                <description>description_40</description>
+                <env-entry-name>name_40</env-entry-name>
+                <env-entry-type>java.lang.Byte</env-entry-type>
+                <env-entry-value>value_40</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_41</description>
+                <env-entry-name>name_41</env-entry-name>
+                <env-entry-type>java.lang.Short</env-entry-type>
+                <env-entry-value>value_41</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_42</description>
+                <env-entry-name>name_42</env-entry-name>
+                <env-entry-type>java.lang.Long</env-entry-type>
+                <env-entry-value>value_42</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_43</description>
+                <env-entry-name>name_43</env-entry-name>
+                <env-entry-type>java.lang.Float</env-entry-type>
+                <env-entry-value>value_43</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_44</description>
+                <env-entry-name>name_44</env-entry-name>
+                <env-entry-type>java.lang.Character</env-entry-type>
+                <env-entry-value>value_44</env-entry-value>
+            </env-entry>
+            <ejb-ref>
+                <description>description_40</description>
+                <ejb-ref-name>name_40</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_40</home>
+                <remote>remote_40</remote>
+                <ejb-link>link_40</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_41</description>
+                <ejb-ref-name>name_41</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_41</home>
+                <remote>remote_41</remote>
+                <ejb-link>link_41</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_42</description>
+                <ejb-ref-name>name_42</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_42</home>
+                <remote>remote_42</remote>
+                <ejb-link>link_42</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_43</description>
+                <ejb-ref-name>name_43</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_43</home>
+                <remote>remote_43</remote>
+                <ejb-link>link_43</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_44</description>
+                <ejb-ref-name>name_44</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_44</home>
+                <remote>remote_44</remote>
+                <ejb-link>link_44</ejb-link>
+            </ejb-ref>
+            <ejb-local-ref>
+                <description>description_40</description>
+                <ejb-ref-name>name_40</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>localHome_40</local-home>
+                <local>local_40</local>
+                <ejb-link>link_40</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_41</description>
+                <ejb-ref-name>name_41</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>localHome_41</local-home>
+                <local>local_41</local>
+                <ejb-link>link_41</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_42</description>
+                <ejb-ref-name>name_42</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>localHome_42</local-home>
+                <local>local_42</local>
+                <ejb-link>link_42</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_43</description>
+                <ejb-ref-name>name_43</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>localHome_43</local-home>
+                <local>local_43</local>
+                <ejb-link>link_43</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_44</description>
+                <ejb-ref-name>name_44</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>localHome_44</local-home>
+                <local>local_44</local>
+                <ejb-link>link_44</ejb-link>
+            </ejb-local-ref>
+            <security-role-ref>
+                <description>description_40</description>
+                <role-name>name_40</role-name>
+                <role-link>link_40</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_41</description>
+                <role-name>name_41</role-name>
+                <role-link>link_41</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_42</description>
+                <role-name>name_42</role-name>
+                <role-link>link_42</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_43</description>
+                <role-name>name_43</role-name>
+                <role-link>link_43</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_44</description>
+                <role-name>name_44</role-name>
+                <role-link>link_44</role-link>
+            </security-role-ref>
+            <security-identity>
+                <description>description_4</description>
+                <run-as>
+                    <description>description_4</description>
+                    <role-name>roleName_4</role-name>
+                </run-as>
+            </security-identity>
+            <resource-ref>
+                <description>description_40</description>
+                <res-ref-name>name_40</res-ref-name>
+                <res-type>type_40</res-type>
+                <res-auth>Application</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_41</description>
+                <res-ref-name>name_41</res-ref-name>
+                <res-type>type_41</res-type>
+                <res-auth>SERVLET</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_42</description>
+                <res-ref-name>name_42</res-ref-name>
+                <res-type>type_42</res-type>
+                <res-auth>Container</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_43</description>
+                <res-ref-name>name_43</res-ref-name>
+                <res-type>type_43</res-type>
+                <res-auth>Application</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_44</description>
+                <res-ref-name>name_44</res-ref-name>
+                <res-type>type_44</res-type>
+                <res-auth>SERVLET</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-env-ref>
+                <description>description_40</description>
+                <resource-env-ref-name>name_40</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.Integer</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_41</description>
+                <resource-env-ref-name>name_41</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.String</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_42</description>
+                <resource-env-ref-name>name_42</resource-env-ref-name>
+                <resource-env-ref-type>java.util.HashTable</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_43</description>
+                <resource-env-ref-name>name_43</resource-env-ref-name>
+                <resource-env-ref-type>java.util.List</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_44</description>
+                <resource-env-ref-name>name_44</resource-env-ref-name>
+                <resource-env-ref-type>java.sql.Data</resource-env-ref-type>
+            </resource-env-ref>
+        </entity>
+        <entity>
+            <description>description_9</description>
+            <display-name>displayName_9</display-name>
+            <small-icon>smallIcon_9</small-icon>
+            <large-icon>largeIcon_9</large-icon>
+            <ejb-name>name_9</ejb-name>
+            <home>java.util.HashTable</home>
+            <remote>java.util.List</remote>
+            <local-home>java.sql.Data</local-home>
+            <local>java.lang.Integer</local>
+            <ejb-class>java.lang.String</ejb-class>
+            <persistence-type>Bean</persistence-type>
+            <prim-key-class>java.lang.String</prim-key-class>
+            <reentrant>False</reentrant>
+            <env-entry>
+                <description>description_45</description>
+                <env-entry-name>name_45</env-entry-name>
+                <env-entry-type>java.lang.String</env-entry-type>
+                <env-entry-value>value_45</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_46</description>
+                <env-entry-name>name_46</env-entry-name>
+                <env-entry-type>java.lang.Integer</env-entry-type>
+                <env-entry-value>value_46</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_47</description>
+                <env-entry-name>name_47</env-entry-name>
+                <env-entry-type>java.lang.Boolean</env-entry-type>
+                <env-entry-value>value_47</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_48</description>
+                <env-entry-name>name_48</env-entry-name>
+                <env-entry-type>java.lang.Double</env-entry-type>
+                <env-entry-value>value_48</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_49</description>
+                <env-entry-name>name_49</env-entry-name>
+                <env-entry-type>java.lang.Byte</env-entry-type>
+                <env-entry-value>value_49</env-entry-value>
+            </env-entry>
+            <ejb-ref>
+                <description>description_45</description>
+                <ejb-ref-name>name_45</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_45</home>
+                <remote>remote_45</remote>
+                <ejb-link>link_45</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_46</description>
+                <ejb-ref-name>name_46</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_46</home>
+                <remote>remote_46</remote>
+                <ejb-link>link_46</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_47</description>
+                <ejb-ref-name>name_47</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_47</home>
+                <remote>remote_47</remote>
+                <ejb-link>link_47</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_48</description>
+                <ejb-ref-name>name_48</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_48</home>
+                <remote>remote_48</remote>
+                <ejb-link>link_48</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_49</description>
+                <ejb-ref-name>name_49</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_49</home>
+                <remote>remote_49</remote>
+                <ejb-link>link_49</ejb-link>
+            </ejb-ref>
+            <ejb-local-ref>
+                <description>description_45</description>
+                <ejb-ref-name>name_45</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>localHome_45</local-home>
+                <local>local_45</local>
+                <ejb-link>link_45</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_46</description>
+                <ejb-ref-name>name_46</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>localHome_46</local-home>
+                <local>local_46</local>
+                <ejb-link>link_46</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_47</description>
+                <ejb-ref-name>name_47</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>localHome_47</local-home>
+                <local>local_47</local>
+                <ejb-link>link_47</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_48</description>
+                <ejb-ref-name>name_48</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>localHome_48</local-home>
+                <local>local_48</local>
+                <ejb-link>link_48</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_49</description>
+                <ejb-ref-name>name_49</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>localHome_49</local-home>
+                <local>local_49</local>
+                <ejb-link>link_49</ejb-link>
+            </ejb-local-ref>
+            <security-role-ref>
+                <description>description_45</description>
+                <role-name>name_45</role-name>
+                <role-link>link_45</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_46</description>
+                <role-name>name_46</role-name>
+                <role-link>link_46</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_47</description>
+                <role-name>name_47</role-name>
+                <role-link>link_47</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_48</description>
+                <role-name>name_48</role-name>
+                <role-link>link_48</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_49</description>
+                <role-name>name_49</role-name>
+                <role-link>link_49</role-link>
+            </security-role-ref>
+            <security-identity>
+                <description>description_4</description>
+                <use-caller-identity/>
+            </security-identity>
+            <resource-ref>
+                <description>description_45</description>
+                <res-ref-name>name_45</res-ref-name>
+                <res-type>type_45</res-type>
+                <res-auth>Container</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_46</description>
+                <res-ref-name>name_46</res-ref-name>
+                <res-type>type_46</res-type>
+                <res-auth>Application</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_47</description>
+                <res-ref-name>name_47</res-ref-name>
+                <res-type>type_47</res-type>
+                <res-auth>SERVLET</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_48</description>
+                <res-ref-name>name_48</res-ref-name>
+                <res-type>type_48</res-type>
+                <res-auth>Container</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_49</description>
+                <res-ref-name>name_49</res-ref-name>
+                <res-type>type_49</res-type>
+                <res-auth>Application</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-env-ref>
+                <description>description_45</description>
+                <resource-env-ref-name>name_45</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.String</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_46</description>
+                <resource-env-ref-name>name_46</resource-env-ref-name>
+                <resource-env-ref-type>java.util.HashTable</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_47</description>
+                <resource-env-ref-name>name_47</resource-env-ref-name>
+                <resource-env-ref-type>java.util.List</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_48</description>
+                <resource-env-ref-name>name_48</resource-env-ref-name>
+                <resource-env-ref-type>java.sql.Data</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_49</description>
+                <resource-env-ref-name>name_49</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.Integer</resource-env-ref-type>
+            </resource-env-ref>
+        </entity>
+    </enterprise-beans>
+    <relationships>
+        <description>description_0</description>
+        <ejb-relation>
+            <description>description_0</description>
+            <ejb-relation-name>name_0</ejb-relation-name>
+            <ejb-relationship-role>
+                <description>description_0</description>
+                <ejb-relationship-role-name>roleName_0</ejb-relationship-role-name>
+                <multiplicity>One</multiplicity>
+                <cascade-delete/>
+                <relationship-role-source>
+                    <description>description_0</description>
+                </relationship-role-source>
+                <cmr-field>
+                    <description>description_0</description>
+                    <cmr-field-name>name_0</cmr-field-name>
+                    <cmr-field-type>java.util.HashTable</cmr-field-type>
+                </cmr-field>
+            </ejb-relationship-role>
+            <ejb-relationship-role>
+                <description>description_1</description>
+                <ejb-relationship-role-name>roleName_1</ejb-relationship-role-name>
+                <multiplicity>Many</multiplicity>
+                <relationship-role-source>
+                    <description>description_1</description>
+                </relationship-role-source>
+                <cmr-field>
+                    <description>description_1</description>
+                    <cmr-field-name>name_1</cmr-field-name>
+                    <cmr-field-type>java.util.List</cmr-field-type>
+                </cmr-field>
+            </ejb-relationship-role>
+        </ejb-relation>
+        <ejb-relation>
+            <description>description_1</description>
+            <ejb-relation-name>name_1</ejb-relation-name>
+            <ejb-relationship-role>
+                <description>description_2</description>
+                <ejb-relationship-role-name>roleName_2</ejb-relationship-role-name>
+                <multiplicity>One</multiplicity>
+                <cascade-delete/>
+                <relationship-role-source>
+                    <description>description_2</description>
+                </relationship-role-source>
+                <cmr-field>
+                    <description>description_2</description>
+                    <cmr-field-name>name_2</cmr-field-name>
+                    <cmr-field-type>java.sql.Data</cmr-field-type>
+                </cmr-field>
+            </ejb-relationship-role>
+            <ejb-relationship-role>
+                <description>description_3</description>
+                <ejb-relationship-role-name>roleName_3</ejb-relationship-role-name>
+                <multiplicity>Many</multiplicity>
+                <relationship-role-source>
+                    <description>description_3</description>
+                </relationship-role-source>
+                <cmr-field>
+                    <description>description_3</description>
+                    <cmr-field-name>name_3</cmr-field-name>
+                    <cmr-field-type>java.lang.Integer</cmr-field-type>
+                </cmr-field>
+            </ejb-relationship-role>
+        </ejb-relation>
+        <ejb-relation>
+            <description>description_2</description>
+            <ejb-relation-name>name_2</ejb-relation-name>
+            <ejb-relationship-role>
+                <description>description_4</description>
+                <ejb-relationship-role-name>roleName_4</ejb-relationship-role-name>
+                <multiplicity>One</multiplicity>
+                <cascade-delete/>
+                <relationship-role-source>
+                    <description>description_4</description>
+                </relationship-role-source>
+                <cmr-field>
+                    <description>description_4</description>
+                    <cmr-field-name>name_4</cmr-field-name>
+                    <cmr-field-type>java.lang.String</cmr-field-type>
+                </cmr-field>
+            </ejb-relationship-role>
+            <ejb-relationship-role>
+                <description>description_5</description>
+                <ejb-relationship-role-name>roleName_5</ejb-relationship-role-name>
+                <multiplicity>Many</multiplicity>
+                <relationship-role-source>
+                    <description>description_5</description>
+                </relationship-role-source>
+                <cmr-field>
+                    <description>description_5</description>
+                    <cmr-field-name>name_5</cmr-field-name>
+                    <cmr-field-type>java.util.HashTable</cmr-field-type>
+                </cmr-field>
+            </ejb-relationship-role>
+        </ejb-relation>
+        <ejb-relation>
+            <description>description_3</description>
+            <ejb-relation-name>name_3</ejb-relation-name>
+            <ejb-relationship-role>
+                <description>description_6</description>
+                <ejb-relationship-role-name>roleName_6</ejb-relationship-role-name>
+                <multiplicity>One</multiplicity>
+                <cascade-delete/>
+                <relationship-role-source>
+                    <description>description_6</description>
+                </relationship-role-source>
+                <cmr-field>
+                    <description>description_6</description>
+                    <cmr-field-name>name_6</cmr-field-name>
+                    <cmr-field-type>java.util.List</cmr-field-type>
+                </cmr-field>
+            </ejb-relationship-role>
+            <ejb-relationship-role>
+                <description>description_7</description>
+                <ejb-relationship-role-name>roleName_7</ejb-relationship-role-name>
+                <multiplicity>Many</multiplicity>
+                <relationship-role-source>
+                    <description>description_7</description>
+                </relationship-role-source>
+                <cmr-field>
+                    <description>description_7</description>
+                    <cmr-field-name>name_7</cmr-field-name>
+                    <cmr-field-type>java.sql.Data</cmr-field-type>
+                </cmr-field>
+            </ejb-relationship-role>
+        </ejb-relation>
+        <ejb-relation>
+            <description>description_4</description>
+            <ejb-relation-name>name_4</ejb-relation-name>
+            <ejb-relationship-role>
+                <description>description_8</description>
+                <ejb-relationship-role-name>roleName_8</ejb-relationship-role-name>
+                <multiplicity>One</multiplicity>
+                <cascade-delete/>
+                <relationship-role-source>
+                    <description>description_8</description>
+                </relationship-role-source>
+                <cmr-field>
+                    <description>description_8</description>
+                    <cmr-field-name>name_8</cmr-field-name>
+                    <cmr-field-type>java.lang.Integer</cmr-field-type>
+                </cmr-field>
+            </ejb-relationship-role>
+            <ejb-relationship-role>
+                <description>description_9</description>
+                <ejb-relationship-role-name>roleName_9</ejb-relationship-role-name>
+                <multiplicity>Many</multiplicity>
+                <relationship-role-source>
+                    <description>description_9</description>
+                </relationship-role-source>
+                <cmr-field>
+                    <description>description_9</description>
+                    <cmr-field-name>name_9</cmr-field-name>
+                    <cmr-field-type>java.lang.String</cmr-field-type>
+                </cmr-field>
+            </ejb-relationship-role>
+        </ejb-relation>
+    </relationships>
+    <assembly-descriptor>
+        <security-role>
+            <description>description_5</description>
+            <role-name>roleName_5</role-name>
+        </security-role>
+        <security-role>
+            <description>description_6</description>
+            <role-name>roleName_6</role-name>
+        </security-role>
+        <security-role>
+            <description>description_7</description>
+            <role-name>roleName_7</role-name>
+        </security-role>
+        <security-role>
+            <description>description_8</description>
+            <role-name>roleName_8</role-name>
+        </security-role>
+        <security-role>
+            <description>description_9</description>
+            <role-name>roleName_9</role-name>
+        </security-role>
+        <method-permission>
+            <description>description_0</description>
+            <unchecked/>
+            <method>
+                <description>description_0</description>
+                <method-name>name_0</method-name>
+            </method>
+            <method>
+                <description>description_1</description>
+                <method-intf>Remote</method-intf>
+                <method-name>name_1</method-name>
+                <method-params/>
+            </method>
+            <method>
+                <description>description_2</description>
+                <method-intf>Home</method-intf>
+                <method-name>name_2</method-name>
+                <method-params>
+                    <method-param>parms_0</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_3</description>
+                <method-intf>Local</method-intf>
+                <method-name>name_3</method-name>
+                <method-params>
+                    <method-param>parms_1</method-param>
+                    <method-param>parms_2</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_4</description>
+                <method-intf>LocalHome</method-intf>
+                <method-name>name_4</method-name>
+                <method-params>
+                    <method-param>parms_3</method-param>
+                    <method-param>parms_4</method-param>
+                    <method-param>parms_5</method-param>
+                </method-params>
+            </method>
+        </method-permission>
+        <method-permission>
+            <description>description_1</description>
+            <method>
+                <description>description_5</description>
+                <method-intf>ServiceEndpoint</method-intf>
+                <method-name>name_5</method-name>
+            </method>
+            <method>
+                <description>description_6</description>
+                <method-name>name_6</method-name>
+                <method-params/>
+            </method>
+            <method>
+                <description>description_7</description>
+                <method-intf>Remote</method-intf>
+                <method-name>name_7</method-name>
+                <method-params>
+                    <method-param>parms_6</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_8</description>
+                <method-intf>Home</method-intf>
+                <method-name>name_8</method-name>
+                <method-params>
+                    <method-param>parms_7</method-param>
+                    <method-param>parms_8</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_9</description>
+                <method-intf>Local</method-intf>
+                <method-name>name_9</method-name>
+                <method-params>
+                    <method-param>parms_9</method-param>
+                    <method-param>parms_10</method-param>
+                    <method-param>parms_11</method-param>
+                </method-params>
+            </method>
+        </method-permission>
+        <method-permission>
+            <description>description_2</description>
+            <unchecked/>
+            <method>
+                <description>description_10</description>
+                <method-intf>LocalHome</method-intf>
+                <method-name>name_10</method-name>
+            </method>
+            <method>
+                <description>description_11</description>
+                <method-intf>ServiceEndpoint</method-intf>
+                <method-name>name_11</method-name>
+                <method-params/>
+            </method>
+            <method>
+                <description>description_12</description>
+                <method-name>name_12</method-name>
+                <method-params>
+                    <method-param>parms_12</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_13</description>
+                <method-intf>Remote</method-intf>
+                <method-name>name_13</method-name>
+                <method-params>
+                    <method-param>parms_13</method-param>
+                    <method-param>parms_14</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_14</description>
+                <method-intf>Home</method-intf>
+                <method-name>name_14</method-name>
+                <method-params>
+                    <method-param>parms_15</method-param>
+                    <method-param>parms_16</method-param>
+                    <method-param>parms_17</method-param>
+                </method-params>
+            </method>
+        </method-permission>
+        <method-permission>
+            <description>description_3</description>
+            <method>
+                <description>description_15</description>
+                <method-intf>Local</method-intf>
+                <method-name>name_15</method-name>
+            </method>
+            <method>
+                <description>description_16</description>
+                <method-intf>LocalHome</method-intf>
+                <method-name>name_16</method-name>
+                <method-params/>
+            </method>
+            <method>
+                <description>description_17</description>
+                <method-intf>ServiceEndpoint</method-intf>
+                <method-name>name_17</method-name>
+                <method-params>
+                    <method-param>parms_18</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_18</description>
+                <method-name>name_18</method-name>
+                <method-params>
+                    <method-param>parms_19</method-param>
+                    <method-param>parms_20</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_19</description>
+                <method-intf>Remote</method-intf>
+                <method-name>name_19</method-name>
+                <method-params>
+                    <method-param>parms_21</method-param>
+                    <method-param>parms_22</method-param>
+                    <method-param>parms_23</method-param>
+                </method-params>
+            </method>
+        </method-permission>
+        <method-permission>
+            <description>description_4</description>
+            <unchecked/>
+            <method>
+                <description>description_20</description>
+                <method-intf>Home</method-intf>
+                <method-name>name_20</method-name>
+            </method>
+            <method>
+                <description>description_21</description>
+                <method-intf>Local</method-intf>
+                <method-name>name_21</method-name>
+                <method-params/>
+            </method>
+            <method>
+                <description>description_22</description>
+                <method-intf>LocalHome</method-intf>
+                <method-name>name_22</method-name>
+                <method-params>
+                    <method-param>parms_24</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_23</description>
+                <method-intf>ServiceEndpoint</method-intf>
+                <method-name>name_23</method-name>
+                <method-params>
+                    <method-param>parms_25</method-param>
+                    <method-param>parms_26</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_24</description>
+                <method-name>name_24</method-name>
+                <method-params>
+                    <method-param>parms_27</method-param>
+                    <method-param>parms_28</method-param>
+                    <method-param>parms_29</method-param>
+                </method-params>
+            </method>
+        </method-permission>
+        <container-transaction>
+            <description>description_0</description>
+            <method>
+                <description>description_25</description>
+                <method-intf>Remote</method-intf>
+                <method-name>name_25</method-name>
+            </method>
+            <method>
+                <description>description_26</description>
+                <method-intf>Home</method-intf>
+                <method-name>name_26</method-name>
+                <method-params/>
+            </method>
+            <method>
+                <description>description_27</description>
+                <method-intf>Local</method-intf>
+                <method-name>name_27</method-name>
+                <method-params>
+                    <method-param>parms_30</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_28</description>
+                <method-intf>LocalHome</method-intf>
+                <method-name>name_28</method-name>
+                <method-params>
+                    <method-param>parms_31</method-param>
+                    <method-param>parms_32</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_29</description>
+                <method-intf>ServiceEndpoint</method-intf>
+                <method-name>name_29</method-name>
+                <method-params>
+                    <method-param>parms_33</method-param>
+                    <method-param>parms_34</method-param>
+                    <method-param>parms_35</method-param>
+                </method-params>
+            </method>
+            <trans-attribute>NotSupported</trans-attribute>
+        </container-transaction>
+        <container-transaction>
+            <description>description_1</description>
+            <method>
+                <description>description_30</description>
+                <method-name>name_30</method-name>
+            </method>
+            <method>
+                <description>description_31</description>
+                <method-intf>Remote</method-intf>
+                <method-name>name_31</method-name>
+                <method-params/>
+            </method>
+            <method>
+                <description>description_32</description>
+                <method-intf>Home</method-intf>
+                <method-name>name_32</method-name>
+                <method-params>
+                    <method-param>parms_36</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_33</description>
+                <method-intf>Local</method-intf>
+                <method-name>name_33</method-name>
+                <method-params>
+                    <method-param>parms_37</method-param>
+                    <method-param>parms_38</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_34</description>
+                <method-intf>LocalHome</method-intf>
+                <method-name>name_34</method-name>
+                <method-params>
+                    <method-param>parms_39</method-param>
+                    <method-param>parms_40</method-param>
+                    <method-param>parms_41</method-param>
+                </method-params>
+            </method>
+            <trans-attribute>Supports</trans-attribute>
+        </container-transaction>
+        <container-transaction>
+            <description>description_2</description>
+            <method>
+                <description>description_35</description>
+                <method-intf>ServiceEndpoint</method-intf>
+                <method-name>name_35</method-name>
+            </method>
+            <method>
+                <description>description_36</description>
+                <method-name>name_36</method-name>
+                <method-params/>
+            </method>
+            <method>
+                <description>description_37</description>
+                <method-intf>Remote</method-intf>
+                <method-name>name_37</method-name>
+                <method-params>
+                    <method-param>parms_42</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_38</description>
+                <method-intf>Home</method-intf>
+                <method-name>name_38</method-name>
+                <method-params>
+                    <method-param>parms_43</method-param>
+                    <method-param>parms_44</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_39</description>
+                <method-intf>Local</method-intf>
+                <method-name>name_39</method-name>
+                <method-params>
+                    <method-param>parms_45</method-param>
+                    <method-param>parms_46</method-param>
+                    <method-param>parms_47</method-param>
+                </method-params>
+            </method>
+            <trans-attribute>Required</trans-attribute>
+        </container-transaction>
+        <container-transaction>
+            <description>description_3</description>
+            <method>
+                <description>description_40</description>
+                <method-intf>LocalHome</method-intf>
+                <method-name>name_40</method-name>
+            </method>
+            <method>
+                <description>description_41</description>
+                <method-intf>ServiceEndpoint</method-intf>
+                <method-name>name_41</method-name>
+                <method-params/>
+            </method>
+            <method>
+                <description>description_42</description>
+                <method-name>name_42</method-name>
+                <method-params>
+                    <method-param>parms_48</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_43</description>
+                <method-intf>Remote</method-intf>
+                <method-name>name_43</method-name>
+                <method-params>
+                    <method-param>parms_49</method-param>
+                    <method-param>parms_50</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_44</description>
+                <method-intf>Home</method-intf>
+                <method-name>name_44</method-name>
+                <method-params>
+                    <method-param>parms_51</method-param>
+                    <method-param>parms_52</method-param>
+                    <method-param>parms_53</method-param>
+                </method-params>
+            </method>
+            <trans-attribute>RequiresNew</trans-attribute>
+        </container-transaction>
+        <container-transaction>
+            <description>description_4</description>
+            <method>
+                <description>description_45</description>
+                <method-intf>Local</method-intf>
+                <method-name>name_45</method-name>
+            </method>
+            <method>
+                <description>description_46</description>
+                <method-intf>LocalHome</method-intf>
+                <method-name>name_46</method-name>
+                <method-params/>
+            </method>
+            <method>
+                <description>description_47</description>
+                <method-intf>ServiceEndpoint</method-intf>
+                <method-name>name_47</method-name>
+                <method-params>
+                    <method-param>parms_54</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_48</description>
+                <method-name>name_48</method-name>
+                <method-params>
+                    <method-param>parms_55</method-param>
+                    <method-param>parms_56</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_49</description>
+                <method-intf>Remote</method-intf>
+                <method-name>name_49</method-name>
+                <method-params>
+                    <method-param>parms_57</method-param>
+                    <method-param>parms_58</method-param>
+                    <method-param>parms_59</method-param>
+                </method-params>
+            </method>
+            <trans-attribute>Mandatory</trans-attribute>
+        </container-transaction>
+        <exclude-list>
+            <description>description_0</description>
+            <method>
+                <description>description_50</description>
+                <method-intf>Home</method-intf>
+                <method-name>name_50</method-name>
+            </method>
+            <method>
+                <description>description_51</description>
+                <method-intf>Local</method-intf>
+                <method-name>name_51</method-name>
+                <method-params/>
+            </method>
+            <method>
+                <description>description_52</description>
+                <method-intf>LocalHome</method-intf>
+                <method-name>name_52</method-name>
+                <method-params>
+                    <method-param>parms_60</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_53</description>
+                <method-intf>ServiceEndpoint</method-intf>
+                <method-name>name_53</method-name>
+                <method-params>
+                    <method-param>parms_61</method-param>
+                    <method-param>parms_62</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_54</description>
+                <method-name>name_54</method-name>
+                <method-params>
+                    <method-param>parms_63</method-param>
+                    <method-param>parms_64</method-param>
+                    <method-param>parms_65</method-param>
+                </method-params>
+            </method>
+        </exclude-list>
+    </assembly-descriptor>
+    <ejb-client-jar>ejbClientJar_0</ejb-client-jar>
+</ejb-jar>
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/EMFTests/ejb-jar2-0.xml b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/EMFTests/ejb-jar2-0.xml
new file mode 100644
index 0000000..aa8dc0f
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/EMFTests/ejb-jar2-0.xml
@@ -0,0 +1,2863 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd">
+<ejb-jar id="ejb-jar_ID">
+    <description>description_0</description>
+	<display-name>displayName_0</display-name>
+    <small-icon>smallIcon_0</small-icon>
+    <large-icon>largeIcon_0</large-icon>
+	<enterprise-beans>
+		<entity id="CMP1">
+			<ejb-name>CMP1</ejb-name>
+			<local-home>ejbs.CMP1LocalHome</local-home>
+			<local>ejbs.CMP1Local</local>
+			<ejb-class>ejbs.CMP1Bean</ejb-class>
+			<persistence-type>Container</persistence-type>
+			<prim-key-class>ejbs.CMP1Key</prim-key-class>
+			<reentrant>False</reentrant>
+			<cmp-version>2.x</cmp-version>
+			<abstract-schema-name>CMP1</abstract-schema-name>
+			<cmp-field>
+				<field-name>id</field-name>
+			</cmp-field>
+		</entity>
+		<entity id="CMP2">
+			<ejb-name>CMP2</ejb-name>
+			<local-home>ejbs.CMP2LocalHome</local-home>
+			<local>ejbs.CMP2Local</local>
+			<ejb-class>ejbs.CMP2Bean</ejb-class>
+			<persistence-type>Container</persistence-type>
+			<prim-key-class>ejbs.CMP2Key</prim-key-class>
+			<reentrant>False</reentrant>
+			<cmp-version>2.x</cmp-version>
+			<abstract-schema-name>CMP2</abstract-schema-name>
+			<cmp-field>
+				<field-name>id</field-name>
+			</cmp-field>
+		</entity>
+        <entity>
+            <description>description_0</description>
+            <display-name>displayName_0</display-name>
+            <small-icon>smallIcon_0</small-icon>
+            <large-icon>largeIcon_0</large-icon>
+            <ejb-name>name_0</ejb-name>
+            <home>java.util.List</home>
+            <remote>java.sql.Data</remote>
+            <local-home>java.lang.Integer</local-home>
+            <local>java.lang.String</local>
+            <ejb-class>java.util.HashTable</ejb-class>
+            <persistence-type>Bean</persistence-type>
+            <prim-key-class>java.util.HashTable</prim-key-class>
+            <reentrant>True</reentrant>
+            <env-entry>
+                <description>description_0</description>
+                <env-entry-name>name_0</env-entry-name>
+                <env-entry-type>java.lang.String</env-entry-type>
+                <env-entry-value>value_0</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_1</description>
+                <env-entry-name>name_1</env-entry-name>
+                <env-entry-type>java.lang.Integer</env-entry-type>
+                <env-entry-value>value_1</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_2</description>
+                <env-entry-name>name_2</env-entry-name>
+                <env-entry-type>java.lang.Boolean</env-entry-type>
+                <env-entry-value>value_2</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_3</description>
+                <env-entry-name>name_3</env-entry-name>
+                <env-entry-type>java.lang.Double</env-entry-type>
+                <env-entry-value>value_3</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_4</description>
+                <env-entry-name>name_4</env-entry-name>
+                <env-entry-type>java.lang.Byte</env-entry-type>
+                <env-entry-value>value_4</env-entry-value>
+            </env-entry>
+            <ejb-ref>
+                <description>description_0</description>
+                <ejb-ref-name>name_0</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_0</home>
+                <remote>remote_0</remote>
+                <ejb-link>link_0</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_1</description>
+                <ejb-ref-name>name_1</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_1</home>
+                <remote>remote_1</remote>
+                <ejb-link>link_1</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_2</description>
+                <ejb-ref-name>name_2</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_2</home>
+                <remote>remote_2</remote>
+                <ejb-link>link_2</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_3</description>
+                <ejb-ref-name>name_3</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_3</home>
+                <remote>remote_3</remote>
+                <ejb-link>link_3</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_4</description>
+                <ejb-ref-name>name_4</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_4</home>
+                <remote>remote_4</remote>
+                <ejb-link>link_4</ejb-link>
+            </ejb-ref>
+            <ejb-local-ref>
+                <description>description_0</description>
+                <ejb-ref-name>name_0</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>home_1</local-home>
+                <local>remote_1</local>
+                <ejb-link>link_0</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_1</description>
+                <ejb-ref-name>name_1</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>home_3</local-home>
+                <local>remote_3</local>
+                <ejb-link>link_1</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_2</description>
+                <ejb-ref-name>name_2</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>home_5</local-home>
+                <local>remote_5</local>
+                <ejb-link>link_2</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_3</description>
+                <ejb-ref-name>name_3</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>home_7</local-home>
+                <local>remote_7</local>
+                <ejb-link>link_3</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_4</description>
+                <ejb-ref-name>name_4</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>home_9</local-home>
+                <local>remote_9</local>
+                <ejb-link>link_4</ejb-link>
+            </ejb-local-ref>
+            <security-role-ref>
+            	<description>description_0</description>
+                <role-name>name_0</role-name>
+                <role-link>link_0</role-link>
+            </security-role-ref>
+            <security-role-ref>
+            	<description>description_1</description>
+                <role-name>name_1</role-name>
+                <role-link>link_1</role-link>
+            </security-role-ref>
+            <security-role-ref>
+            	<description>description_2</description>
+                <role-name>name_2</role-name>
+                <role-link>link_2</role-link>
+            </security-role-ref>
+            <security-role-ref>
+            	<description>description_3</description>
+                <role-name>name_3</role-name>
+                <role-link>link_3</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_4</description>
+                <role-name>name_4</role-name>
+                <role-link>link_4</role-link>
+            </security-role-ref>
+            <security-identity>
+                <description>description_0</description>
+                <run-as>
+                    <description>description_0</description>
+                    <role-name>roleName_0</role-name>
+                </run-as>
+            </security-identity>
+            <resource-ref>
+                <description>description_0</description>
+                <res-ref-name>name_0</res-ref-name>
+                <res-type>type_0</res-type>
+                <res-auth>Container</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_1</description>
+                <res-ref-name>name_1</res-ref-name>
+                <res-type>type_1</res-type>
+                <res-auth>Application</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_2</description>
+                <res-ref-name>name_2</res-ref-name>
+                <res-type>type_2</res-type>
+                <res-auth>SERVLET</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_3</description>
+                <res-ref-name>name_3</res-ref-name>
+                <res-type>type_3</res-type>
+                <res-auth>Container</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_4</description>
+                <res-ref-name>name_4</res-ref-name>
+                <res-type>type_4</res-type>
+                <res-auth>Application</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-env-ref>
+                <description>description_0</description>
+                <resource-env-ref-name>name_0</resource-env-ref-name>
+                <resource-env-ref-type>java.util.HashTable</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_1</description>
+                <resource-env-ref-name>name_1</resource-env-ref-name>
+                <resource-env-ref-type>java.util.List</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_2</description>
+                <resource-env-ref-name>name_2</resource-env-ref-name>
+                <resource-env-ref-type>java.sql.Data</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_3</description>
+                <resource-env-ref-name>name_3</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.Integer</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_4</description>
+                <resource-env-ref-name>name_4</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.String</resource-env-ref-type>
+            </resource-env-ref>
+        </entity>
+        <entity>
+            <description>description_1</description>
+            <display-name>displayName_1</display-name>
+            <small-icon>smallIcon_1</small-icon>
+            <large-icon>largeIcon_1</large-icon>
+            <ejb-name>name_1</ejb-name>
+            <home>java.sql.Data</home>
+            <remote>java.lang.Integer</remote>
+            <local-home>java.lang.String</local-home>
+            <local>java.util.HashTable</local>
+            <ejb-class>java.util.List</ejb-class>
+            <persistence-type>Bean</persistence-type>
+            <prim-key-class>java.util.List</prim-key-class>
+            <reentrant>False</reentrant>
+            <env-entry>
+                <description>description_5</description>
+                <env-entry-name>name_5</env-entry-name>
+                <env-entry-type>java.lang.Short</env-entry-type>
+                <env-entry-value>value_5</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_6</description>
+                <env-entry-name>name_6</env-entry-name>
+                <env-entry-type>java.lang.Long</env-entry-type>
+                <env-entry-value>value_6</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_7</description>
+                <env-entry-name>name_7</env-entry-name>
+                <env-entry-type>java.lang.Float</env-entry-type>
+                <env-entry-value>value_7</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_8</description>
+                <env-entry-name>name_8</env-entry-name>
+                <env-entry-type>java.lang.Character</env-entry-type>
+                <env-entry-value>value_8</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_9</description>
+                <env-entry-name>name_9</env-entry-name>
+                <env-entry-type>java.lang.String</env-entry-type>
+                <env-entry-value>value_9</env-entry-value>
+            </env-entry>
+            <ejb-ref>
+                <description>description_5</description>
+                <ejb-ref-name>name_5</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_5</home>
+                <remote>remote_5</remote>
+                <ejb-link>link_5</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_6</description>
+                <ejb-ref-name>name_6</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_6</home>
+                <remote>remote_6</remote>
+                <ejb-link>link_6</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_7</description>
+                <ejb-ref-name>name_7</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_7</home>
+                <remote>remote_7</remote>
+                <ejb-link>link_7</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_8</description>
+                <ejb-ref-name>name_8</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_8</home>
+                <remote>remote_8</remote>
+                <ejb-link>link_8</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_9</description>
+                <ejb-ref-name>name_9</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_9</home>
+                <remote>remote_9</remote>
+                <ejb-link>link_9</ejb-link>
+            </ejb-ref>
+            <ejb-local-ref>
+                <description>description_5</description>
+                <ejb-ref-name>name_5</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>home_11</local-home>
+                <local>remote_11</local>
+                <ejb-link>link_5</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_6</description>
+                <ejb-ref-name>name_6</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>home_13</local-home>
+                <local>remote_13</local>
+                <ejb-link>link_6</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_7</description>
+                <ejb-ref-name>name_7</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>home_15</local-home>
+                <local>remote_15</local>
+                <ejb-link>link_7</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_8</description>
+                <ejb-ref-name>name_8</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>home_17</local-home>
+                <local>remote_17</local>
+                <ejb-link>link_8</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_9</description>
+                <ejb-ref-name>name_9</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>home_19</local-home>
+                <local>remote_19</local>
+                <ejb-link>link_9</ejb-link>
+            </ejb-local-ref>
+            <security-role-ref>
+            	<description>description_5</description>
+                <role-name>name_5</role-name>
+                <role-link>link_5</role-link>
+            </security-role-ref>
+            <security-role-ref>
+            	<description>description_6</description>
+                <role-name>name_6</role-name>
+                <role-link>link_6</role-link>
+            </security-role-ref>
+            <security-role-ref>
+            	<description>description_7</description>
+                <role-name>name_7</role-name>
+                <role-link>link_7</role-link>
+            </security-role-ref>
+            <security-role-ref>
+            	<description>description_8</description>
+                <role-name>name_8</role-name>
+                <role-link>link_8</role-link>
+            </security-role-ref>
+            <security-role-ref>
+            	<description>description_9</description>
+                <role-name>name_9</role-name>
+                <role-link>link_9</role-link>
+            </security-role-ref>
+            <security-identity>
+                <description>description_0</description>
+                <use-caller-identity></use-caller-identity>
+            </security-identity>
+            <resource-ref>
+                <description>description_5</description>
+                <res-ref-name>name_5</res-ref-name>
+                <res-type>type_5</res-type>
+                <res-auth>SERVLET</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_6</description>
+                <res-ref-name>name_6</res-ref-name>
+                <res-type>type_6</res-type>
+                <res-auth>Container</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_7</description>
+                <res-ref-name>name_7</res-ref-name>
+                <res-type>type_7</res-type>
+                <res-auth>Application</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_8</description>
+                <res-ref-name>name_8</res-ref-name>
+                <res-type>type_8</res-type>
+                <res-auth>SERVLET</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_9</description>
+                <res-ref-name>name_9</res-ref-name>
+                <res-type>type_9</res-type>
+                <res-auth>Container</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-env-ref>
+                <description>description_5</description>
+                <resource-env-ref-name>name_5</resource-env-ref-name>
+                <resource-env-ref-type>java.util.List</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_6</description>
+                <resource-env-ref-name>name_6</resource-env-ref-name>
+                <resource-env-ref-type>java.sql.Data</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_7</description>
+                <resource-env-ref-name>name_7</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.Integer</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_8</description>
+                <resource-env-ref-name>name_8</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.String</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_9</description>
+                <resource-env-ref-name>name_9</resource-env-ref-name>
+                <resource-env-ref-type>java.util.HashTable</resource-env-ref-type>
+            </resource-env-ref>
+        </entity>
+        <entity>
+            <description>description_0</description>
+            <display-name>displayName_0</display-name>
+            <small-icon>smallIcon_0</small-icon>
+            <large-icon>largeIcon_0</large-icon>
+            <ejb-name>name_0</ejb-name>
+            <home>java.lang.Integer</home>
+            <remote>java.lang.String</remote>
+            <local-home>java.util.HashTable</local-home>
+            <local>java.util.List</local>
+            <ejb-class>java.sql.Data</ejb-class>
+            <persistence-type>Container</persistence-type>
+            <prim-key-class>java.sql.Data</prim-key-class>
+            <reentrant>True</reentrant>
+            <cmp-version>2.x</cmp-version>
+            <abstract-schema-name>abstractSchemaName_0</abstract-schema-name>
+            <cmp-field>
+                <description>description_1</description>
+                <field-name>name_1</field-name>
+            </cmp-field>
+            <cmp-field>
+                <description>description_3</description>
+                <field-name>name_3</field-name>
+            </cmp-field>
+            <cmp-field>
+                <description>description_4</description>
+                <field-name>name_4</field-name>
+            </cmp-field>
+            <env-entry>
+                <description>description_10</description>
+                <env-entry-name>name_10</env-entry-name>
+                <env-entry-type>java.lang.Integer</env-entry-type>
+                <env-entry-value>value_10</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_11</description>
+                <env-entry-name>name_11</env-entry-name>
+                <env-entry-type>java.lang.Boolean</env-entry-type>
+                <env-entry-value>value_11</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_12</description>
+                <env-entry-name>name_12</env-entry-name>
+                <env-entry-type>java.lang.Double</env-entry-type>
+                <env-entry-value>value_12</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_13</description>
+                <env-entry-name>name_13</env-entry-name>
+                <env-entry-type>java.lang.Byte</env-entry-type>
+                <env-entry-value>value_13</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_14</description>
+                <env-entry-name>name_14</env-entry-name>
+                <env-entry-type>java.lang.Short</env-entry-type>
+                <env-entry-value>value_14</env-entry-value>
+            </env-entry>
+            <ejb-ref>
+                <description>description_10</description>
+                <ejb-ref-name>name_10</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_10</home>
+                <remote>remote_10</remote>
+                <ejb-link>link_10</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_11</description>
+                <ejb-ref-name>name_11</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_11</home>
+                <remote>remote_11</remote>
+                <ejb-link>link_11</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_12</description>
+                <ejb-ref-name>name_12</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_12</home>
+                <remote>remote_12</remote>
+                <ejb-link>link_12</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_13</description>
+                <ejb-ref-name>name_13</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_13</home>
+                <remote>remote_13</remote>
+                <ejb-link>link_13</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_14</description>
+                <ejb-ref-name>name_14</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_14</home>
+                <remote>remote_14</remote>
+                <ejb-link>link_14</ejb-link>
+            </ejb-ref>
+            <ejb-local-ref>
+                <description>description_10</description>
+                <ejb-ref-name>name_10</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>home_21</local-home>
+                <local>remote_21</local>
+                <ejb-link>link_10</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_11</description>
+                <ejb-ref-name>name_11</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>home_23</local-home>
+                <local>remote_23</local>
+                <ejb-link>link_11</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_12</description>
+                <ejb-ref-name>name_12</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>home_25</local-home>
+                <local>remote_25</local>
+                <ejb-link>link_12</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_13</description>
+                <ejb-ref-name>name_13</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>home_27</local-home>
+                <local>remote_27</local>
+                <ejb-link>link_13</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_14</description>
+                <ejb-ref-name>name_14</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>home_29</local-home>
+                <local>remote_29</local>
+                <ejb-link>link_14</ejb-link>
+            </ejb-local-ref>
+            <security-role-ref>
+            	<description>description_10</description>
+                <role-name>name_10</role-name>
+                <role-link>link_10</role-link>
+            </security-role-ref>
+            <security-role-ref>
+            	<description>description_11</description>
+                <role-name>name_11</role-name>
+                <role-link>link_11</role-link>
+            </security-role-ref>
+            <security-role-ref>
+            	<description>description_12</description>
+                <role-name>name_12</role-name>
+                <role-link>link_12</role-link>
+            </security-role-ref>
+            <security-role-ref>
+            	<description>description_13</description>
+                <role-name>name_13</role-name>
+                <role-link>link_13</role-link>
+            </security-role-ref>
+            <security-role-ref>
+            	<description>description_14</description>
+                <role-name>name_14</role-name>
+                <role-link>link_14</role-link>
+            </security-role-ref>
+            <security-identity>
+                <description>description_1</description>
+                <run-as>
+                    <description>description_1</description>
+                    <role-name>roleName_1</role-name>
+                </run-as>
+            </security-identity>
+            <resource-ref>
+                <description>description_10</description>
+                <res-ref-name>name_10</res-ref-name>
+                <res-type>type_10</res-type>
+                <res-auth>Application</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_11</description>
+                <res-ref-name>name_11</res-ref-name>
+                <res-type>type_11</res-type>
+                <res-auth>SERVLET</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_12</description>
+                <res-ref-name>name_12</res-ref-name>
+                <res-type>type_12</res-type>
+                <res-auth>Container</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_13</description>
+                <res-ref-name>name_13</res-ref-name>
+                <res-type>type_13</res-type>
+                <res-auth>Application</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_14</description>
+                <res-ref-name>name_14</res-ref-name>
+                <res-type>type_14</res-type>
+                <res-auth>SERVLET</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-env-ref>
+                <description>description_10</description>
+                <resource-env-ref-name>name_10</resource-env-ref-name>
+                <resource-env-ref-type>java.sql.Data</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_11</description>
+                <resource-env-ref-name>name_11</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.Integer</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_12</description>
+                <resource-env-ref-name>name_12</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.String</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_13</description>
+                <resource-env-ref-name>name_13</resource-env-ref-name>
+                <resource-env-ref-type>java.util.HashTable</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_14</description>
+                <resource-env-ref-name>name_14</resource-env-ref-name>
+                <resource-env-ref-type>java.util.List</resource-env-ref-type>
+            </resource-env-ref>
+            <query>
+                <description>description_0</description>
+                <query-method>
+                    <method-name>name_0</method-name>
+                </query-method>
+                <result-type-mapping>Local</result-type-mapping>
+                <ejb-ql>ejbQL_0</ejb-ql>
+            </query>
+            <query>
+                <description>description_1</description>
+                <query-method>
+                    <method-name>name_1</method-name>
+                    <method-params/>
+                </query-method>
+                <result-type-mapping>Remote</result-type-mapping>
+                <ejb-ql>ejbQL_1</ejb-ql>
+            </query>
+            <query>
+                <description>description_2</description>
+                <query-method>
+                    <method-name>name_2</method-name>
+                    <method-params>
+                        <method-param>parms_0</method-param>
+                    </method-params>
+                </query-method>
+                <result-type-mapping>Local</result-type-mapping>
+                <ejb-ql>ejbQL_2</ejb-ql>
+            </query>
+            <query>
+                <description>description_3</description>
+                <query-method>
+                    <method-name>name_3</method-name>
+                    <method-params>
+                        <method-param>parms_1</method-param>
+                        <method-param>parms_2</method-param>
+                    </method-params>
+                </query-method>
+                <result-type-mapping>Remote</result-type-mapping>
+                <ejb-ql>ejbQL_3</ejb-ql>
+            </query>
+            <query>
+                <description>description_4</description>
+                <query-method>
+                    <method-name>name_4</method-name>
+                    <method-params>
+                        <method-param>parms_3</method-param>
+                        <method-param>parms_4</method-param>
+                        <method-param>parms_5</method-param>
+                    </method-params>
+                </query-method>
+                <result-type-mapping>Local</result-type-mapping>
+                <ejb-ql>ejbQL_4</ejb-ql>
+            </query>
+        </entity>
+        <session>
+            <description>description_0</description>
+            <display-name>displayName_0</display-name>
+            <small-icon>smallIcon_0</small-icon>
+            <large-icon>largeIcon_0</large-icon>
+            <ejb-name>name_0</ejb-name>
+            <home>java.lang.String</home>
+            <remote>java.util.HashTable</remote>
+            <local-home>java.util.List</local-home>
+            <local>java.sql.Data</local>
+            <ejb-class>java.lang.Integer</ejb-class>
+            <session-type>Stateful</session-type>
+            <transaction-type>Bean</transaction-type>
+            <env-entry>
+                <description>description_15</description>
+                <env-entry-name>name_15</env-entry-name>
+                <env-entry-type>java.lang.Long</env-entry-type>
+                <env-entry-value>value_15</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_16</description>
+                <env-entry-name>name_16</env-entry-name>
+                <env-entry-type>java.lang.Float</env-entry-type>
+                <env-entry-value>value_16</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_17</description>
+                <env-entry-name>name_17</env-entry-name>
+                <env-entry-type>java.lang.Character</env-entry-type>
+                <env-entry-value>value_17</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_18</description>
+                <env-entry-name>name_18</env-entry-name>
+                <env-entry-type>java.lang.String</env-entry-type>
+                <env-entry-value>value_18</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_19</description>
+                <env-entry-name>name_19</env-entry-name>
+                <env-entry-type>java.lang.Integer</env-entry-type>
+                <env-entry-value>value_19</env-entry-value>
+            </env-entry>
+            <ejb-ref>
+                <description>description_15</description>
+                <ejb-ref-name>name_15</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_15</home>
+                <remote>remote_15</remote>
+                <ejb-link>link_15</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_16</description>
+                <ejb-ref-name>name_16</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_16</home>
+                <remote>remote_16</remote>
+                <ejb-link>link_16</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_17</description>
+                <ejb-ref-name>name_17</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_17</home>
+                <remote>remote_17</remote>
+                <ejb-link>link_17</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_18</description>
+                <ejb-ref-name>name_18</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_18</home>
+                <remote>remote_18</remote>
+                <ejb-link>link_18</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_19</description>
+                <ejb-ref-name>name_19</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_19</home>
+                <remote>remote_19</remote>
+                <ejb-link>link_19</ejb-link>
+            </ejb-ref>
+            <ejb-local-ref>
+                <description>description_15</description>
+                <ejb-ref-name>name_15</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>home_31</local-home>
+                <local>remote_31</local>
+                <ejb-link>link_15</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_16</description>
+                <ejb-ref-name>name_16</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>home_33</local-home>
+                <local>remote_33</local>
+                <ejb-link>link_16</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_17</description>
+                <ejb-ref-name>name_17</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>home_35</local-home>
+                <local>remote_35</local>
+                <ejb-link>link_17</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_18</description>
+                <ejb-ref-name>name_18</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>home_37</local-home>
+                <local>remote_37</local>
+                <ejb-link>link_18</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_19</description>
+                <ejb-ref-name>name_19</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>home_39</local-home>
+                <local>remote_39</local>
+                <ejb-link>link_19</ejb-link>
+            </ejb-local-ref>
+            <security-role-ref>
+            	<description>description_15</description>
+                <role-name>name_15</role-name>
+                <role-link>link_15</role-link>
+            </security-role-ref>
+            <security-role-ref>
+            	<description>description_16</description>
+                <role-name>name_16</role-name>
+                <role-link>link_16</role-link>
+            </security-role-ref>
+            <security-role-ref>
+            	<description>description_17</description>
+                <role-name>name_17</role-name>
+                <role-link>link_17</role-link>
+            </security-role-ref>
+            <security-role-ref>
+            	<description>description_18</description>
+                <role-name>name_18</role-name>
+                <role-link>link_18</role-link>
+            </security-role-ref>
+            <security-role-ref>
+            	<description>description_19</description>
+                <role-name>name_19</role-name>
+                <role-link>link_19</role-link>
+            </security-role-ref>
+            <security-identity>
+                <description>description_1</description>
+                <use-caller-identity></use-caller-identity>
+            </security-identity>
+            <resource-ref>
+                <description>description_15</description>
+                <res-ref-name>name_15</res-ref-name>
+                <res-type>type_15</res-type>
+                <res-auth>Container</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_16</description>
+                <res-ref-name>name_16</res-ref-name>
+                <res-type>type_16</res-type>
+                <res-auth>Application</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_17</description>
+                <res-ref-name>name_17</res-ref-name>
+                <res-type>type_17</res-type>
+                <res-auth>SERVLET</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_18</description>
+                <res-ref-name>name_18</res-ref-name>
+                <res-type>type_18</res-type>
+                <res-auth>Container</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_19</description>
+                <res-ref-name>name_19</res-ref-name>
+                <res-type>type_19</res-type>
+                <res-auth>Application</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-env-ref>
+                <description>description_15</description>
+                <resource-env-ref-name>name_15</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.Integer</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_16</description>
+                <resource-env-ref-name>name_16</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.String</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_17</description>
+                <resource-env-ref-name>name_17</resource-env-ref-name>
+                <resource-env-ref-type>java.util.HashTable</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_18</description>
+                <resource-env-ref-name>name_18</resource-env-ref-name>
+                <resource-env-ref-type>java.util.List</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_19</description>
+                <resource-env-ref-name>name_19</resource-env-ref-name>
+                <resource-env-ref-type>java.sql.Data</resource-env-ref-type>
+            </resource-env-ref>
+        </session>
+        <entity>
+            <description>description_2</description>
+            <display-name>displayName_2</display-name>
+            <small-icon>smallIcon_2</small-icon>
+            <large-icon>largeIcon_2</large-icon>
+            <ejb-name>name_2</ejb-name>
+            <home>java.util.HashTable</home>
+            <remote>java.util.List</remote>
+            <local-home>java.sql.Data</local-home>
+            <local>java.lang.Integer</local>
+            <ejb-class>java.lang.String</ejb-class>
+            <persistence-type>Bean</persistence-type>
+            <prim-key-class>java.lang.String</prim-key-class>
+            <reentrant>True</reentrant>
+            <env-entry>
+                <description>description_20</description>
+                <env-entry-name>name_20</env-entry-name>
+                <env-entry-type>java.lang.Boolean</env-entry-type>
+                <env-entry-value>value_20</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_21</description>
+                <env-entry-name>name_21</env-entry-name>
+                <env-entry-type>java.lang.Double</env-entry-type>
+                <env-entry-value>value_21</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_22</description>
+                <env-entry-name>name_22</env-entry-name>
+                <env-entry-type>java.lang.Byte</env-entry-type>
+                <env-entry-value>value_22</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_23</description>
+                <env-entry-name>name_23</env-entry-name>
+                <env-entry-type>java.lang.Short</env-entry-type>
+                <env-entry-value>value_23</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_24</description>
+                <env-entry-name>name_24</env-entry-name>
+                <env-entry-type>java.lang.Long</env-entry-type>
+                <env-entry-value>value_24</env-entry-value>
+            </env-entry>
+            <ejb-ref>
+                <description>description_20</description>
+                <ejb-ref-name>name_20</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_20</home>
+                <remote>remote_20</remote>
+                <ejb-link>link_20</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_21</description>
+                <ejb-ref-name>name_21</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_21</home>
+                <remote>remote_21</remote>
+                <ejb-link>link_21</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_22</description>
+                <ejb-ref-name>name_22</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_22</home>
+                <remote>remote_22</remote>
+                <ejb-link>link_22</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_23</description>
+                <ejb-ref-name>name_23</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_23</home>
+                <remote>remote_23</remote>
+                <ejb-link>link_23</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_24</description>
+                <ejb-ref-name>name_24</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_24</home>
+                <remote>remote_24</remote>
+                <ejb-link>link_24</ejb-link>
+            </ejb-ref>
+            <ejb-local-ref>
+                <description>description_20</description>
+                <ejb-ref-name>name_20</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>home_41</local-home>
+                <local>remote_41</local>
+                <ejb-link>link_20</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_21</description>
+                <ejb-ref-name>name_21</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>home_43</local-home>
+                <local>remote_43</local>
+                <ejb-link>link_21</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_22</description>
+                <ejb-ref-name>name_22</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>home_45</local-home>
+                <local>remote_45</local>
+                <ejb-link>link_22</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_23</description>
+                <ejb-ref-name>name_23</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>home_47</local-home>
+                <local>remote_47</local>
+                <ejb-link>link_23</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_24</description>
+                <ejb-ref-name>name_24</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>home_49</local-home>
+                <local>remote_49</local>
+                <ejb-link>link_24</ejb-link>
+            </ejb-local-ref>
+            <security-role-ref>
+            	<description>description_20</description>
+                <role-name>name_20</role-name>
+                <role-link>link_20</role-link>
+            </security-role-ref>
+            <security-role-ref>
+            	<description>description_21</description>
+                <role-name>name_21</role-name>
+                <role-link>link_21</role-link>
+            </security-role-ref>
+            <security-role-ref>
+            	<description>description_22</description>
+                <role-name>name_22</role-name>
+                <role-link>link_22</role-link>
+            </security-role-ref>
+            <security-role-ref>
+            	<description>description_23</description>
+                <role-name>name_23</role-name>
+                <role-link>link_23</role-link>
+            </security-role-ref>
+            <security-role-ref>
+            	<description>description_24</description>
+                <role-name>name_24</role-name>
+                <role-link>link_24</role-link>
+            </security-role-ref>
+            <security-identity>
+                <description>description_2</description>
+                <run-as>
+                    <description>description_2</description>
+                    <role-name>roleName_2</role-name>
+                </run-as>
+            </security-identity>
+            <resource-ref>
+                <description>description_20</description>
+                <res-ref-name>name_20</res-ref-name>
+                <res-type>type_20</res-type>
+                <res-auth>SERVLET</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_21</description>
+                <res-ref-name>name_21</res-ref-name>
+                <res-type>type_21</res-type>
+                <res-auth>Container</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_22</description>
+                <res-ref-name>name_22</res-ref-name>
+                <res-type>type_22</res-type>
+                <res-auth>Application</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_23</description>
+                <res-ref-name>name_23</res-ref-name>
+                <res-type>type_23</res-type>
+                <res-auth>SERVLET</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_24</description>
+                <res-ref-name>name_24</res-ref-name>
+                <res-type>type_24</res-type>
+                <res-auth>Container</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-env-ref>
+                <description>description_20</description>
+                <resource-env-ref-name>name_20</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.String</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_21</description>
+                <resource-env-ref-name>name_21</resource-env-ref-name>
+                <resource-env-ref-type>java.util.HashTable</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_22</description>
+                <resource-env-ref-name>name_22</resource-env-ref-name>
+                <resource-env-ref-type>java.util.List</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_23</description>
+                <resource-env-ref-name>name_23</resource-env-ref-name>
+                <resource-env-ref-type>java.sql.Data</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_24</description>
+                <resource-env-ref-name>name_24</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.Integer</resource-env-ref-type>
+            </resource-env-ref>
+        </entity>
+        <entity>
+            <description>description_3</description>
+            <display-name>displayName_3</display-name>
+            <small-icon>smallIcon_3</small-icon>
+            <large-icon>largeIcon_3</large-icon>
+            <ejb-name>name_3</ejb-name>
+            <home>java.util.List</home>
+            <remote>java.sql.Data</remote>
+            <local-home>java.lang.Integer</local-home>
+            <local>java.lang.String</local>
+            <ejb-class>java.util.HashTable</ejb-class>
+            <persistence-type>Bean</persistence-type>
+            <prim-key-class>java.util.HashTable</prim-key-class>
+            <reentrant>False</reentrant>
+            <env-entry>
+                <description>description_25</description>
+                <env-entry-name>name_25</env-entry-name>
+                <env-entry-type>java.lang.Float</env-entry-type>
+                <env-entry-value>value_25</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_26</description>
+                <env-entry-name>name_26</env-entry-name>
+                <env-entry-type>java.lang.Character</env-entry-type>
+                <env-entry-value>value_26</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_27</description>
+                <env-entry-name>name_27</env-entry-name>
+                <env-entry-type>java.lang.String</env-entry-type>
+                <env-entry-value>value_27</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_28</description>
+                <env-entry-name>name_28</env-entry-name>
+                <env-entry-type>java.lang.Integer</env-entry-type>
+                <env-entry-value>value_28</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_29</description>
+                <env-entry-name>name_29</env-entry-name>
+                <env-entry-type>java.lang.Boolean</env-entry-type>
+                <env-entry-value>value_29</env-entry-value>
+            </env-entry>
+            <ejb-ref>
+                <description>description_25</description>
+                <ejb-ref-name>name_25</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_25</home>
+                <remote>remote_25</remote>
+                <ejb-link>link_25</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_26</description>
+                <ejb-ref-name>name_26</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_26</home>
+                <remote>remote_26</remote>
+                <ejb-link>link_26</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_27</description>
+                <ejb-ref-name>name_27</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_27</home>
+                <remote>remote_27</remote>
+                <ejb-link>link_27</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_28</description>
+                <ejb-ref-name>name_28</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_28</home>
+                <remote>remote_28</remote>
+                <ejb-link>link_28</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_29</description>
+                <ejb-ref-name>name_29</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_29</home>
+                <remote>remote_29</remote>
+                <ejb-link>link_29</ejb-link>
+            </ejb-ref>
+            <ejb-local-ref>
+                <description>description_25</description>
+                <ejb-ref-name>name_25</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>home_51</local-home>
+                <local>remote_51</local>
+                <ejb-link>link_25</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_26</description>
+                <ejb-ref-name>name_26</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>home_53</local-home>
+                <local>remote_53</local>
+                <ejb-link>link_26</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_27</description>
+                <ejb-ref-name>name_27</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>home_55</local-home>
+                <local>remote_55</local>
+                <ejb-link>link_27</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_28</description>
+                <ejb-ref-name>name_28</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>home_57</local-home>
+                <local>remote_57</local>
+                <ejb-link>link_28</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_29</description>
+                <ejb-ref-name>name_29</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>home_59</local-home>
+                <local>remote_59</local>
+                <ejb-link>link_29</ejb-link>
+            </ejb-local-ref>
+            <security-role-ref>
+            	<description>description_25</description>
+                <role-name>name_25</role-name>
+                <role-link>link_25</role-link>
+            </security-role-ref>
+            <security-role-ref>
+            	<description>description_26</description>
+                <role-name>name_26</role-name>
+                <role-link>link_26</role-link>
+            </security-role-ref>
+            <security-role-ref>
+            	<description>description_27</description>
+                <role-name>name_27</role-name>
+                <role-link>link_27</role-link>
+            </security-role-ref>
+            <security-role-ref>
+            	<description>description_28</description>
+                <role-name>name_28</role-name>
+                <role-link>link_28</role-link>
+            </security-role-ref>
+            <security-role-ref>
+            	<description>description_29</description>
+                <role-name>name_29</role-name>
+                <role-link>link_29</role-link>
+            </security-role-ref>
+            <security-identity>
+                <description>description_2</description>
+                <use-caller-identity></use-caller-identity>
+            </security-identity>
+            <resource-ref>
+                <description>description_25</description>
+                <res-ref-name>name_25</res-ref-name>
+                <res-type>type_25</res-type>
+                <res-auth>Application</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_26</description>
+                <res-ref-name>name_26</res-ref-name>
+                <res-type>type_26</res-type>
+                <res-auth>SERVLET</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_27</description>
+                <res-ref-name>name_27</res-ref-name>
+                <res-type>type_27</res-type>
+                <res-auth>Container</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_28</description>
+                <res-ref-name>name_28</res-ref-name>
+                <res-type>type_28</res-type>
+                <res-auth>Application</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_29</description>
+                <res-ref-name>name_29</res-ref-name>
+                <res-type>type_29</res-type>
+                <res-auth>SERVLET</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-env-ref>
+                <description>description_25</description>
+                <resource-env-ref-name>name_25</resource-env-ref-name>
+                <resource-env-ref-type>java.util.HashTable</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_26</description>
+                <resource-env-ref-name>name_26</resource-env-ref-name>
+                <resource-env-ref-type>java.util.List</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_27</description>
+                <resource-env-ref-name>name_27</resource-env-ref-name>
+                <resource-env-ref-type>java.sql.Data</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_28</description>
+                <resource-env-ref-name>name_28</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.Integer</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_29</description>
+                <resource-env-ref-name>name_29</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.String</resource-env-ref-type>
+            </resource-env-ref>
+        </entity>
+        <message-driven>
+            <description>description_0</description>
+            <display-name>displayName_0</display-name>
+            <small-icon>smallIcon_0</small-icon>
+            <large-icon>largeIcon_0</large-icon>
+            <ejb-name>name_0</ejb-name>
+            <ejb-class>java.util.List</ejb-class>
+            <transaction-type>Bean</transaction-type>
+            <message-selector>messageSelector_0</message-selector>
+            <acknowledge-mode>Auto-acknowledge</acknowledge-mode>
+            <message-driven-destination>
+                <destination-type>javax.jms.Queue</destination-type>
+                <subscription-durability>Durable</subscription-durability>
+            </message-driven-destination>
+            <env-entry>
+                <description>description_30</description>
+                <env-entry-name>name_30</env-entry-name>
+                <env-entry-type>java.lang.Double</env-entry-type>
+                <env-entry-value>value_30</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_31</description>
+                <env-entry-name>name_31</env-entry-name>
+                <env-entry-type>java.lang.Byte</env-entry-type>
+                <env-entry-value>value_31</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_32</description>
+                <env-entry-name>name_32</env-entry-name>
+                <env-entry-type>java.lang.Short</env-entry-type>
+                <env-entry-value>value_32</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_33</description>
+                <env-entry-name>name_33</env-entry-name>
+                <env-entry-type>java.lang.Long</env-entry-type>
+                <env-entry-value>value_33</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_34</description>
+                <env-entry-name>name_34</env-entry-name>
+                <env-entry-type>java.lang.Float</env-entry-type>
+                <env-entry-value>value_34</env-entry-value>
+            </env-entry>
+            <ejb-ref>
+                <description>description_30</description>
+                <ejb-ref-name>name_30</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_30</home>
+                <remote>remote_30</remote>
+                <ejb-link>link_30</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_31</description>
+                <ejb-ref-name>name_31</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_31</home>
+                <remote>remote_31</remote>
+                <ejb-link>link_31</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_32</description>
+                <ejb-ref-name>name_32</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_32</home>
+                <remote>remote_32</remote>
+                <ejb-link>link_32</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_33</description>
+                <ejb-ref-name>name_33</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_33</home>
+                <remote>remote_33</remote>
+                <ejb-link>link_33</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_34</description>
+                <ejb-ref-name>name_34</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_34</home>
+                <remote>remote_34</remote>
+                <ejb-link>link_34</ejb-link>
+            </ejb-ref>
+            <ejb-local-ref>
+                <description>description_30</description>
+                <ejb-ref-name>name_30</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>home_61</local-home>
+                <local>remote_61</local>
+                <ejb-link>link_30</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_31</description>
+                <ejb-ref-name>name_31</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>home_63</local-home>
+                <local>remote_63</local>
+                <ejb-link>link_31</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_32</description>
+                <ejb-ref-name>name_32</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>home_65</local-home>
+                <local>remote_65</local>
+                <ejb-link>link_32</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_33</description>
+                <ejb-ref-name>name_33</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>home_67</local-home>
+                <local>remote_67</local>
+                <ejb-link>link_33</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_34</description>
+                <ejb-ref-name>name_34</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>home_69</local-home>
+                <local>remote_69</local>
+                <ejb-link>link_34</ejb-link>
+            </ejb-local-ref>
+            <security-identity>
+                <description>description_3</description>
+                <run-as>
+                    <description>description_3</description>
+                    <role-name>roleName_3</role-name>
+                </run-as>
+            </security-identity>
+            <resource-ref>
+                <description>description_30</description>
+                <res-ref-name>name_30</res-ref-name>
+                <res-type>type_30</res-type>
+                <res-auth>Container</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_31</description>
+                <res-ref-name>name_31</res-ref-name>
+                <res-type>type_31</res-type>
+                <res-auth>Application</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_32</description>
+                <res-ref-name>name_32</res-ref-name>
+                <res-type>type_32</res-type>
+                <res-auth>SERVLET</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_33</description>
+                <res-ref-name>name_33</res-ref-name>
+                <res-type>type_33</res-type>
+                <res-auth>Container</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_34</description>
+                <res-ref-name>name_34</res-ref-name>
+                <res-type>type_34</res-type>
+                <res-auth>Application</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-env-ref>
+                <description>description_30</description>
+                <resource-env-ref-name>name_30</resource-env-ref-name>
+                <resource-env-ref-type>java.util.List</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_31</description>
+                <resource-env-ref-name>name_31</resource-env-ref-name>
+                <resource-env-ref-type>java.sql.Data</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_32</description>
+                <resource-env-ref-name>name_32</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.Integer</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_33</description>
+                <resource-env-ref-name>name_33</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.String</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_34</description>
+                <resource-env-ref-name>name_34</resource-env-ref-name>
+                <resource-env-ref-type>java.util.HashTable</resource-env-ref-type>
+            </resource-env-ref>
+        </message-driven>
+        <session>
+            <description>description_1</description>
+            <display-name>displayName_1</display-name>
+            <small-icon>smallIcon_1</small-icon>
+            <large-icon>largeIcon_1</large-icon>
+            <ejb-name>name_1</ejb-name>
+            <home>java.lang.String</home>
+            <remote>java.util.HashTable</remote>
+            <local-home>java.util.List</local-home>
+            <local>java.sql.Data</local>
+            <ejb-class>java.lang.Integer</ejb-class>
+            <session-type>Stateless</session-type>
+            <transaction-type>Container</transaction-type>
+            <env-entry>
+                <description>description_35</description>
+                <env-entry-name>name_35</env-entry-name>
+                <env-entry-type>java.lang.Character</env-entry-type>
+                <env-entry-value>value_35</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_36</description>
+                <env-entry-name>name_36</env-entry-name>
+                <env-entry-type>java.lang.String</env-entry-type>
+                <env-entry-value>value_36</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_37</description>
+                <env-entry-name>name_37</env-entry-name>
+                <env-entry-type>java.lang.Integer</env-entry-type>
+                <env-entry-value>value_37</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_38</description>
+                <env-entry-name>name_38</env-entry-name>
+                <env-entry-type>java.lang.Boolean</env-entry-type>
+                <env-entry-value>value_38</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_39</description>
+                <env-entry-name>name_39</env-entry-name>
+                <env-entry-type>java.lang.Double</env-entry-type>
+                <env-entry-value>value_39</env-entry-value>
+            </env-entry>
+            <ejb-ref>
+                <description>description_35</description>
+                <ejb-ref-name>name_35</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_35</home>
+                <remote>remote_35</remote>
+                <ejb-link>link_35</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_36</description>
+                <ejb-ref-name>name_36</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_36</home>
+                <remote>remote_36</remote>
+                <ejb-link>link_36</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_37</description>
+                <ejb-ref-name>name_37</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_37</home>
+                <remote>remote_37</remote>
+                <ejb-link>link_37</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_38</description>
+                <ejb-ref-name>name_38</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_38</home>
+                <remote>remote_38</remote>
+                <ejb-link>link_38</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_39</description>
+                <ejb-ref-name>name_39</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_39</home>
+                <remote>remote_39</remote>
+                <ejb-link>link_39</ejb-link>
+            </ejb-ref>
+            <ejb-local-ref>
+                <description>description_35</description>
+                <ejb-ref-name>name_35</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>home_71</local-home>
+                <local>remote_71</local>
+                <ejb-link>link_35</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_36</description>
+                <ejb-ref-name>name_36</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>home_73</local-home>
+                <local>remote_73</local>
+                <ejb-link>link_36</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_37</description>
+                <ejb-ref-name>name_37</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>home_75</local-home>
+                <local>remote_75</local>
+                <ejb-link>link_37</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_38</description>
+                <ejb-ref-name>name_38</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>home_77</local-home>
+                <local>remote_77</local>
+                <ejb-link>link_38</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_39</description>
+                <ejb-ref-name>name_39</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>home_79</local-home>
+                <local>remote_79</local>
+                <ejb-link>link_39</ejb-link>
+            </ejb-local-ref>
+            <security-role-ref>
+            	<description>description_35</description>
+                <role-name>name_35</role-name>
+                <role-link>link_35</role-link>
+            </security-role-ref>
+            <security-role-ref>
+            	<description>description_36</description>
+                <role-name>name_36</role-name>
+                <role-link>link_36</role-link>
+            </security-role-ref>
+            <security-role-ref>
+            	<description>description_37</description>
+                <role-name>name_37</role-name>
+                <role-link>link_37</role-link>
+            </security-role-ref>
+            <security-role-ref>
+            	<description>description_38</description>
+                <role-name>name_38</role-name>
+                <role-link>link_38</role-link>
+            </security-role-ref>
+            <security-role-ref>
+            	<description>description_39</description>
+                <role-name>name_39</role-name>
+                <role-link>link_39</role-link>
+            </security-role-ref>
+            <security-identity>
+                <description>description_3</description>
+                <use-caller-identity></use-caller-identity>
+            </security-identity>
+            <resource-ref>
+                <description>description_35</description>
+                <res-ref-name>name_35</res-ref-name>
+                <res-type>type_35</res-type>
+                <res-auth>SERVLET</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_36</description>
+                <res-ref-name>name_36</res-ref-name>
+                <res-type>type_36</res-type>
+                <res-auth>Container</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_37</description>
+                <res-ref-name>name_37</res-ref-name>
+                <res-type>type_37</res-type>
+                <res-auth>Application</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_38</description>
+                <res-ref-name>name_38</res-ref-name>
+                <res-type>type_38</res-type>
+                <res-auth>SERVLET</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_39</description>
+                <res-ref-name>name_39</res-ref-name>
+                <res-type>type_39</res-type>
+                <res-auth>Container</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-env-ref>
+                <description>description_35</description>
+                <resource-env-ref-name>name_35</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.Integer</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_36</description>
+                <resource-env-ref-name>name_36</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.String</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_37</description>
+                <resource-env-ref-name>name_37</resource-env-ref-name>
+                <resource-env-ref-type>java.util.HashTable</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_38</description>
+                <resource-env-ref-name>name_38</resource-env-ref-name>
+                <resource-env-ref-type>java.util.List</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_39</description>
+                <resource-env-ref-name>name_39</resource-env-ref-name>
+                <resource-env-ref-type>java.sql.Data</resource-env-ref-type>
+            </resource-env-ref>
+        </session>
+        <entity>
+            <description>description_4</description>
+            <display-name>displayName_4</display-name>
+            <small-icon>smallIcon_4</small-icon>
+            <large-icon>largeIcon_4</large-icon>
+            <ejb-name>name_4</ejb-name>
+            <home>java.util.HashTable</home>
+            <remote>java.util.List</remote>
+            <local-home>java.sql.Data</local-home>
+            <local>java.lang.Integer</local>
+            <ejb-class>java.lang.String</ejb-class>
+            <persistence-type>Bean</persistence-type>
+            <prim-key-class>java.lang.String</prim-key-class>
+            <reentrant>True</reentrant>
+            <env-entry>
+                <description>description_40</description>
+                <env-entry-name>name_40</env-entry-name>
+                <env-entry-type>java.lang.Byte</env-entry-type>
+                <env-entry-value>value_40</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_41</description>
+                <env-entry-name>name_41</env-entry-name>
+                <env-entry-type>java.lang.Short</env-entry-type>
+                <env-entry-value>value_41</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_42</description>
+                <env-entry-name>name_42</env-entry-name>
+                <env-entry-type>java.lang.Long</env-entry-type>
+                <env-entry-value>value_42</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_43</description>
+                <env-entry-name>name_43</env-entry-name>
+                <env-entry-type>java.lang.Float</env-entry-type>
+                <env-entry-value>value_43</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_44</description>
+                <env-entry-name>name_44</env-entry-name>
+                <env-entry-type>java.lang.Character</env-entry-type>
+                <env-entry-value>value_44</env-entry-value>
+            </env-entry>
+            <ejb-ref>
+                <description>description_40</description>
+                <ejb-ref-name>name_40</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_40</home>
+                <remote>remote_40</remote>
+                <ejb-link>link_40</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_41</description>
+                <ejb-ref-name>name_41</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_41</home>
+                <remote>remote_41</remote>
+                <ejb-link>link_41</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_42</description>
+                <ejb-ref-name>name_42</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_42</home>
+                <remote>remote_42</remote>
+                <ejb-link>link_42</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_43</description>
+                <ejb-ref-name>name_43</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_43</home>
+                <remote>remote_43</remote>
+                <ejb-link>link_43</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_44</description>
+                <ejb-ref-name>name_44</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_44</home>
+                <remote>remote_44</remote>
+                <ejb-link>link_44</ejb-link>
+            </ejb-ref>
+            <ejb-local-ref>
+                <description>description_40</description>
+                <ejb-ref-name>name_40</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>home_81</local-home>
+                <local>remote_81</local>
+                <ejb-link>link_40</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_41</description>
+                <ejb-ref-name>name_41</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>home_83</local-home>
+                <local>remote_83</local>
+                <ejb-link>link_41</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_42</description>
+                <ejb-ref-name>name_42</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>home_85</local-home>
+                <local>remote_85</local>
+                <ejb-link>link_42</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_43</description>
+                <ejb-ref-name>name_43</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>home_87</local-home>
+                <local>remote_87</local>
+                <ejb-link>link_43</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_44</description>
+                <ejb-ref-name>name_44</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>home_89</local-home>
+                <local>remote_89</local>
+                <ejb-link>link_44</ejb-link>
+            </ejb-local-ref>
+            <security-role-ref>
+            	<description>description_40</description>
+                <role-name>name_40</role-name>
+                <role-link>link_40</role-link>
+            </security-role-ref>
+            <security-role-ref>
+            	<description>description_41</description>
+                <role-name>name_41</role-name>
+                <role-link>link_41</role-link>
+            </security-role-ref>
+            <security-role-ref>
+            	<description>description_42</description>
+                <role-name>name_42</role-name>
+                <role-link>link_42</role-link>
+            </security-role-ref>
+            <security-role-ref>
+            	<description>description_43</description>
+                <role-name>name_43</role-name>
+                <role-link>link_43</role-link>
+            </security-role-ref>
+            <security-role-ref>
+            	<description>description_44</description>
+                <role-name>name_44</role-name>
+                <role-link>link_44</role-link>
+            </security-role-ref>
+            <security-identity>
+                <description>description_4</description>
+                <run-as>
+                    <description>description_4</description>
+                    <role-name>roleName_4</role-name>
+                </run-as>
+            </security-identity>
+            <resource-ref>
+                <description>description_40</description>
+                <res-ref-name>name_40</res-ref-name>
+                <res-type>type_40</res-type>
+                <res-auth>Application</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_41</description>
+                <res-ref-name>name_41</res-ref-name>
+                <res-type>type_41</res-type>
+                <res-auth>SERVLET</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_42</description>
+                <res-ref-name>name_42</res-ref-name>
+                <res-type>type_42</res-type>
+                <res-auth>Container</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_43</description>
+                <res-ref-name>name_43</res-ref-name>
+                <res-type>type_43</res-type>
+                <res-auth>Application</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_44</description>
+                <res-ref-name>name_44</res-ref-name>
+                <res-type>type_44</res-type>
+                <res-auth>SERVLET</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-env-ref>
+                <description>description_40</description>
+                <resource-env-ref-name>name_40</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.String</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_41</description>
+                <resource-env-ref-name>name_41</resource-env-ref-name>
+                <resource-env-ref-type>java.util.HashTable</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_42</description>
+                <resource-env-ref-name>name_42</resource-env-ref-name>
+                <resource-env-ref-type>java.util.List</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_43</description>
+                <resource-env-ref-name>name_43</resource-env-ref-name>
+                <resource-env-ref-type>java.sql.Data</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_44</description>
+                <resource-env-ref-name>name_44</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.Integer</resource-env-ref-type>
+            </resource-env-ref>
+        </entity>
+        <entity>
+            <description>description_5</description>
+            <display-name>displayName_5</display-name>
+            <small-icon>smallIcon_5</small-icon>
+            <large-icon>largeIcon_5</large-icon>
+            <ejb-name>name_5</ejb-name>
+            <home>java.util.List</home>
+            <remote>java.sql.Data</remote>
+            <local-home>java.lang.Integer</local-home>
+            <local>java.lang.String</local>
+            <ejb-class>java.util.HashTable</ejb-class>
+            <persistence-type>Bean</persistence-type>
+            <prim-key-class>java.util.HashTable</prim-key-class>
+            <reentrant>False</reentrant>
+            <env-entry>
+                <description>description_45</description>
+                <env-entry-name>name_45</env-entry-name>
+                <env-entry-type>java.lang.String</env-entry-type>
+                <env-entry-value>value_45</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_46</description>
+                <env-entry-name>name_46</env-entry-name>
+                <env-entry-type>java.lang.Integer</env-entry-type>
+                <env-entry-value>value_46</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_47</description>
+                <env-entry-name>name_47</env-entry-name>
+                <env-entry-type>java.lang.Boolean</env-entry-type>
+                <env-entry-value>value_47</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_48</description>
+                <env-entry-name>name_48</env-entry-name>
+                <env-entry-type>java.lang.Double</env-entry-type>
+                <env-entry-value>value_48</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_49</description>
+                <env-entry-name>name_49</env-entry-name>
+                <env-entry-type>java.lang.Byte</env-entry-type>
+                <env-entry-value>value_49</env-entry-value>
+            </env-entry>
+            <ejb-ref>
+                <description>description_45</description>
+                <ejb-ref-name>name_45</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_45</home>
+                <remote>remote_45</remote>
+                <ejb-link>link_45</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_46</description>
+                <ejb-ref-name>name_46</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_46</home>
+                <remote>remote_46</remote>
+                <ejb-link>link_46</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_47</description>
+                <ejb-ref-name>name_47</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_47</home>
+                <remote>remote_47</remote>
+                <ejb-link>link_47</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_48</description>
+                <ejb-ref-name>name_48</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_48</home>
+                <remote>remote_48</remote>
+                <ejb-link>link_48</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_49</description>
+                <ejb-ref-name>name_49</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_49</home>
+                <remote>remote_49</remote>
+                <ejb-link>link_49</ejb-link>
+            </ejb-ref>
+            <ejb-local-ref>
+                <description>description_45</description>
+                <ejb-ref-name>name_45</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>home_91</local-home>
+                <local>remote_91</local>
+                <ejb-link>link_45</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_46</description>
+                <ejb-ref-name>name_46</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>home_93</local-home>
+                <local>remote_93</local>
+                <ejb-link>link_46</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_47</description>
+                <ejb-ref-name>name_47</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>home_95</local-home>
+                <local>remote_95</local>
+                <ejb-link>link_47</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_48</description>
+                <ejb-ref-name>name_48</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>home_97</local-home>
+                <local>remote_97</local>
+                <ejb-link>link_48</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_49</description>
+                <ejb-ref-name>name_49</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>home_99</local-home>
+                <local>remote_99</local>
+                <ejb-link>link_49</ejb-link>
+            </ejb-local-ref>
+            <security-role-ref>
+            	<description>description_45</description>
+                <role-name>name_45</role-name>
+                <role-link>link_45</role-link>
+            </security-role-ref>
+            <security-role-ref>
+            	<description>description_46</description>
+                <role-name>name_46</role-name>
+                <role-link>link_46</role-link>
+            </security-role-ref>
+            <security-role-ref>
+            	<description>description_47</description>
+                <role-name>name_47</role-name>
+                <role-link>link_47</role-link>
+            </security-role-ref>
+            <security-role-ref>
+            	<description>description_48</description>
+                <role-name>name_48</role-name>
+                <role-link>link_48</role-link>
+            </security-role-ref>
+            <security-role-ref>
+            	<description>description_49</description>
+                <role-name>name_49</role-name>
+                <role-link>link_49</role-link>
+            </security-role-ref>
+            <security-identity>
+                <description>description_4</description>
+                <use-caller-identity></use-caller-identity>
+            </security-identity>
+            <resource-ref>
+                <description>description_45</description>
+                <res-ref-name>name_45</res-ref-name>
+                <res-type>type_45</res-type>
+                <res-auth>Container</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_46</description>
+                <res-ref-name>name_46</res-ref-name>
+                <res-type>type_46</res-type>
+                <res-auth>Application</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_47</description>
+                <res-ref-name>name_47</res-ref-name>
+                <res-type>type_47</res-type>
+                <res-auth>SERVLET</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_48</description>
+                <res-ref-name>name_48</res-ref-name>
+                <res-type>type_48</res-type>
+                <res-auth>Container</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_49</description>
+                <res-ref-name>name_49</res-ref-name>
+                <res-type>type_49</res-type>
+                <res-auth>Application</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-env-ref>
+                <description>description_45</description>
+                <resource-env-ref-name>name_45</resource-env-ref-name>
+                <resource-env-ref-type>java.util.HashTable</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_46</description>
+                <resource-env-ref-name>name_46</resource-env-ref-name>
+                <resource-env-ref-type>java.util.List</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_47</description>
+                <resource-env-ref-name>name_47</resource-env-ref-name>
+                <resource-env-ref-type>java.sql.Data</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_48</description>
+                <resource-env-ref-name>name_48</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.Integer</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_49</description>
+                <resource-env-ref-name>name_49</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.String</resource-env-ref-type>
+            </resource-env-ref>
+        </entity>
+	</enterprise-beans>
+    <relationships>
+        <description>description_0</description>
+        <ejb-relation>
+            <description>description_0</description>
+            <ejb-relation-name>name_0</ejb-relation-name>
+            <ejb-relationship-role>
+                <description>description_0</description>
+                <ejb-relationship-role-name>roleName_0</ejb-relationship-role-name>
+                <multiplicity>One</multiplicity>
+                <cascade-delete></cascade-delete>
+                <relationship-role-source>
+                    <description>description_0</description>
+                </relationship-role-source>
+                <cmr-field>
+                    <description>description_0</description>
+                    <cmr-field-name>name_0</cmr-field-name>
+                    <cmr-field-type>java.util.List</cmr-field-type>
+                </cmr-field>
+            </ejb-relationship-role>
+            <ejb-relationship-role>
+                <description>description_1</description>
+                <ejb-relationship-role-name>roleName_1</ejb-relationship-role-name>
+                <multiplicity>Many</multiplicity>
+                <relationship-role-source>
+                    <description>description_1</description>
+                </relationship-role-source>
+                <cmr-field>
+                    <description>description_1</description>
+                    <cmr-field-name>name_1</cmr-field-name>
+                    <cmr-field-type>java.sql.Data</cmr-field-type>
+                </cmr-field>
+            </ejb-relationship-role>
+        </ejb-relation>
+        <ejb-relation>
+            <description>description_1</description>
+            <ejb-relation-name>name_1</ejb-relation-name>
+            <ejb-relationship-role>
+                <description>description_2</description>
+                <ejb-relationship-role-name>roleName_2</ejb-relationship-role-name>
+                <multiplicity>One</multiplicity>
+                <cascade-delete></cascade-delete>
+                <relationship-role-source>
+                    <description>description_2</description>
+                </relationship-role-source>
+                <cmr-field>
+                    <description>description_2</description>
+                    <cmr-field-name>name_2</cmr-field-name>
+                    <cmr-field-type>java.lang.Integer</cmr-field-type>
+                </cmr-field>
+            </ejb-relationship-role>
+            <ejb-relationship-role>
+                <description>description_3</description>
+                <ejb-relationship-role-name>roleName_3</ejb-relationship-role-name>
+                <multiplicity>Many</multiplicity>
+                <relationship-role-source>
+                    <description>description_3</description>
+                </relationship-role-source>
+                <cmr-field>
+                    <description>description_3</description>
+                    <cmr-field-name>name_3</cmr-field-name>
+                    <cmr-field-type>java.lang.String</cmr-field-type>
+                </cmr-field>
+            </ejb-relationship-role>
+        </ejb-relation>
+        <ejb-relation>
+            <description>description_2</description>
+            <ejb-relation-name>name_2</ejb-relation-name>
+            <ejb-relationship-role>
+                <description>description_4</description>
+                <ejb-relationship-role-name>roleName_4</ejb-relationship-role-name>
+                <multiplicity>One</multiplicity>
+                <cascade-delete></cascade-delete>
+                <relationship-role-source>
+                    <description>description_4</description>
+                </relationship-role-source>
+                <cmr-field>
+                    <description>description_4</description>
+                    <cmr-field-name>name_4</cmr-field-name>
+                    <cmr-field-type>java.util.HashTable</cmr-field-type>
+                </cmr-field>
+            </ejb-relationship-role>
+            <ejb-relationship-role>
+                <description>description_5</description>
+                <ejb-relationship-role-name>roleName_5</ejb-relationship-role-name>
+                <multiplicity>Many</multiplicity>
+                <relationship-role-source>
+                    <description>description_5</description>
+                </relationship-role-source>
+                <cmr-field>
+                    <description>description_5</description>
+                    <cmr-field-name>name_5</cmr-field-name>
+                    <cmr-field-type>java.util.List</cmr-field-type>
+                </cmr-field>
+            </ejb-relationship-role>
+        </ejb-relation>
+        <ejb-relation>
+            <description>description_3</description>
+            <ejb-relation-name>name_3</ejb-relation-name>
+            <ejb-relationship-role>
+                <description>description_6</description>
+                <ejb-relationship-role-name>roleName_6</ejb-relationship-role-name>
+                <multiplicity>One</multiplicity>
+                <cascade-delete></cascade-delete>
+                <relationship-role-source>
+                    <description>description_6</description>
+                </relationship-role-source>
+                <cmr-field>
+                    <description>description_6</description>
+                    <cmr-field-name>name_6</cmr-field-name>
+                    <cmr-field-type>java.sql.Data</cmr-field-type>
+                </cmr-field>
+            </ejb-relationship-role>
+            <ejb-relationship-role>
+                <description>description_7</description>
+                <ejb-relationship-role-name>roleName_7</ejb-relationship-role-name>
+                <multiplicity>Many</multiplicity>
+                <relationship-role-source>
+                    <description>description_7</description>
+                </relationship-role-source>
+                <cmr-field>
+                    <description>description_7</description>
+                    <cmr-field-name>name_7</cmr-field-name>
+                    <cmr-field-type>java.lang.Integer</cmr-field-type>
+                </cmr-field>
+            </ejb-relationship-role>
+        </ejb-relation>
+        <ejb-relation>
+            <description>description_4</description>
+            <ejb-relation-name>name_4</ejb-relation-name>
+            <ejb-relationship-role>
+                <description>description_8</description>
+                <ejb-relationship-role-name>roleName_8</ejb-relationship-role-name>
+                <multiplicity>One</multiplicity>
+                <cascade-delete></cascade-delete>
+                <relationship-role-source>
+                    <description>description_8</description>
+                </relationship-role-source>
+                <cmr-field>
+                    <description>description_8</description>
+                    <cmr-field-name>name_8</cmr-field-name>
+                    <cmr-field-type>java.lang.String</cmr-field-type>
+                </cmr-field>
+            </ejb-relationship-role>
+            <ejb-relationship-role>
+                <description>description_9</description>
+                <ejb-relationship-role-name>roleName_9</ejb-relationship-role-name>
+                <multiplicity>Many</multiplicity>
+                <relationship-role-source>
+                    <description>description_9</description>
+                </relationship-role-source>
+                <cmr-field>
+                    <description>description_9</description>
+                    <cmr-field-name>name_9</cmr-field-name>
+                    <cmr-field-type>java.util.HashTable</cmr-field-type>
+                </cmr-field>
+            </ejb-relationship-role>
+        </ejb-relation>
+    </relationships>
+    <assembly-descriptor>
+        <security-role>
+            <description>description_5</description>
+            <role-name>roleName_5</role-name>
+        </security-role>
+        <security-role>
+            <description>description_6</description>
+            <role-name>roleName_6</role-name>
+        </security-role>
+        <security-role>
+            <description>description_7</description>
+            <role-name>roleName_7</role-name>
+        </security-role>
+        <security-role>
+            <description>description_8</description>
+            <role-name>roleName_8</role-name>
+        </security-role>
+        <security-role>
+            <description>description_9</description>
+            <role-name>roleName_9</role-name>
+        </security-role>
+        <method-permission>
+            <description>description_0</description>
+            <unchecked></unchecked>
+            <method>
+                <description>description_0</description>
+                <method-name>name_0</method-name>
+            </method>
+            <method>
+                <description>description_1</description>
+                <method-intf>Remote</method-intf>
+                <method-name>name_1</method-name>
+                <method-params/>
+            </method>
+            <method>
+                <description>description_2</description>
+                <method-intf>Home</method-intf>
+                <method-name>name_2</method-name>
+                <method-params>
+                    <method-param>parms_0</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_3</description>
+                <method-intf>Local</method-intf>
+                <method-name>name_3</method-name>
+                <method-params>
+                    <method-param>parms_1</method-param>
+                    <method-param>parms_2</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_4</description>
+                <method-intf>LocalHome</method-intf>
+                <method-name>name_4</method-name>
+                <method-params>
+                    <method-param>parms_3</method-param>
+                    <method-param>parms_4</method-param>
+                    <method-param>parms_5</method-param>
+                </method-params>
+            </method>
+        </method-permission>
+        <method-permission>
+            <description>description_1</description>
+            <method>
+                <description>description_5</description>
+                <method-intf>ServiceEndpoint</method-intf>
+                <method-name>name_5</method-name>
+            </method>
+            <method>
+                <description>description_6</description>
+                <method-name>name_6</method-name>
+                <method-params/>
+            </method>
+            <method>
+                <description>description_7</description>
+                <method-intf>Remote</method-intf>
+                <method-name>name_7</method-name>
+                <method-params>
+                    <method-param>parms_6</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_8</description>
+                <method-intf>Home</method-intf>
+                <method-name>name_8</method-name>
+                <method-params>
+                    <method-param>parms_7</method-param>
+                    <method-param>parms_8</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_9</description>
+                <method-intf>Local</method-intf>
+                <method-name>name_9</method-name>
+                <method-params>
+                    <method-param>parms_9</method-param>
+                    <method-param>parms_10</method-param>
+                    <method-param>parms_11</method-param>
+                </method-params>
+            </method>
+        </method-permission>
+        <method-permission>
+            <description>description_2</description>
+            <unchecked></unchecked>
+            <method>
+                <description>description_10</description>
+                <method-intf>LocalHome</method-intf>
+                <method-name>name_10</method-name>
+            </method>
+            <method>
+                <description>description_11</description>
+                <method-intf>ServiceEndpoint</method-intf>
+                <method-name>name_11</method-name>
+                <method-params/>
+            </method>
+            <method>
+                <description>description_12</description>
+                <method-name>name_12</method-name>
+                <method-params>
+                    <method-param>parms_12</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_13</description>
+                <method-intf>Remote</method-intf>
+                <method-name>name_13</method-name>
+                <method-params>
+                    <method-param>parms_13</method-param>
+                    <method-param>parms_14</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_14</description>
+                <method-intf>Home</method-intf>
+                <method-name>name_14</method-name>
+                <method-params>
+                    <method-param>parms_15</method-param>
+                    <method-param>parms_16</method-param>
+                    <method-param>parms_17</method-param>
+                </method-params>
+            </method>
+        </method-permission>
+        <method-permission>
+            <description>description_3</description>
+            <method>
+                <description>description_15</description>
+                <method-intf>Local</method-intf>
+                <method-name>name_15</method-name>
+            </method>
+            <method>
+                <description>description_16</description>
+                <method-intf>LocalHome</method-intf>
+                <method-name>name_16</method-name>
+                <method-params/>
+            </method>
+            <method>
+                <description>description_17</description>
+                <method-intf>ServiceEndpoint</method-intf>
+                <method-name>name_17</method-name>
+                <method-params>
+                    <method-param>parms_18</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_18</description>
+                <method-name>name_18</method-name>
+                <method-params>
+                    <method-param>parms_19</method-param>
+                    <method-param>parms_20</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_19</description>
+                <method-intf>Remote</method-intf>
+                <method-name>name_19</method-name>
+                <method-params>
+                    <method-param>parms_21</method-param>
+                    <method-param>parms_22</method-param>
+                    <method-param>parms_23</method-param>
+                </method-params>
+            </method>
+        </method-permission>
+        <method-permission>
+            <description>description_4</description>
+            <unchecked></unchecked>
+            <method>
+                <description>description_20</description>
+                <method-intf>Home</method-intf>
+                <method-name>name_20</method-name>
+            </method>
+            <method>
+                <description>description_21</description>
+                <method-intf>Local</method-intf>
+                <method-name>name_21</method-name>
+                <method-params/>
+            </method>
+            <method>
+                <description>description_22</description>
+                <method-intf>LocalHome</method-intf>
+                <method-name>name_22</method-name>
+                <method-params>
+                    <method-param>parms_24</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_23</description>
+                <method-intf>ServiceEndpoint</method-intf>
+                <method-name>name_23</method-name>
+                <method-params>
+                    <method-param>parms_25</method-param>
+                    <method-param>parms_26</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_24</description>
+                <method-name>name_24</method-name>
+                <method-params>
+                    <method-param>parms_27</method-param>
+                    <method-param>parms_28</method-param>
+                    <method-param>parms_29</method-param>
+                </method-params>
+            </method>
+        </method-permission>
+        <container-transaction>
+            <description>description_0</description>
+            <method>
+                <description>description_25</description>
+                <method-intf>Remote</method-intf>
+                <method-name>name_25</method-name>
+            </method>
+            <method>
+                <description>description_26</description>
+                <method-intf>Home</method-intf>
+                <method-name>name_26</method-name>
+                <method-params/>
+            </method>
+            <method>
+                <description>description_27</description>
+                <method-intf>Local</method-intf>
+                <method-name>name_27</method-name>
+                <method-params>
+                    <method-param>parms_30</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_28</description>
+                <method-intf>LocalHome</method-intf>
+                <method-name>name_28</method-name>
+                <method-params>
+                    <method-param>parms_31</method-param>
+                    <method-param>parms_32</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_29</description>
+                <method-intf>ServiceEndpoint</method-intf>
+                <method-name>name_29</method-name>
+                <method-params>
+                    <method-param>parms_33</method-param>
+                    <method-param>parms_34</method-param>
+                    <method-param>parms_35</method-param>
+                </method-params>
+            </method>
+            <trans-attribute>NotSupported</trans-attribute>
+        </container-transaction>
+        <container-transaction>
+            <description>description_1</description>
+            <method>
+                <description>description_30</description>
+                <method-name>name_30</method-name>
+            </method>
+            <method>
+                <description>description_31</description>
+                <method-intf>Remote</method-intf>
+                <method-name>name_31</method-name>
+                <method-params/>
+            </method>
+            <method>
+                <description>description_32</description>
+                <method-intf>Home</method-intf>
+                <method-name>name_32</method-name>
+                <method-params>
+                    <method-param>parms_36</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_33</description>
+                <method-intf>Local</method-intf>
+                <method-name>name_33</method-name>
+                <method-params>
+                    <method-param>parms_37</method-param>
+                    <method-param>parms_38</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_34</description>
+                <method-intf>LocalHome</method-intf>
+                <method-name>name_34</method-name>
+                <method-params>
+                    <method-param>parms_39</method-param>
+                    <method-param>parms_40</method-param>
+                    <method-param>parms_41</method-param>
+                </method-params>
+            </method>
+            <trans-attribute>Supports</trans-attribute>
+        </container-transaction>
+        <container-transaction>
+            <description>description_2</description>
+            <method>
+                <description>description_35</description>
+                <method-intf>ServiceEndpoint</method-intf>
+                <method-name>name_35</method-name>
+            </method>
+            <method>
+                <description>description_36</description>
+                <method-name>name_36</method-name>
+                <method-params/>
+            </method>
+            <method>
+                <description>description_37</description>
+                <method-intf>Remote</method-intf>
+                <method-name>name_37</method-name>
+                <method-params>
+                    <method-param>parms_42</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_38</description>
+                <method-intf>Home</method-intf>
+                <method-name>name_38</method-name>
+                <method-params>
+                    <method-param>parms_43</method-param>
+                    <method-param>parms_44</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_39</description>
+                <method-intf>Local</method-intf>
+                <method-name>name_39</method-name>
+                <method-params>
+                    <method-param>parms_45</method-param>
+                    <method-param>parms_46</method-param>
+                    <method-param>parms_47</method-param>
+                </method-params>
+            </method>
+            <trans-attribute>Required</trans-attribute>
+        </container-transaction>
+        <container-transaction>
+            <description>description_3</description>
+            <method>
+                <description>description_40</description>
+                <method-intf>LocalHome</method-intf>
+                <method-name>name_40</method-name>
+            </method>
+            <method>
+                <description>description_41</description>
+                <method-intf>ServiceEndpoint</method-intf>
+                <method-name>name_41</method-name>
+                <method-params/>
+            </method>
+            <method>
+                <description>description_42</description>
+                <method-name>name_42</method-name>
+                <method-params>
+                    <method-param>parms_48</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_43</description>
+                <method-intf>Remote</method-intf>
+                <method-name>name_43</method-name>
+                <method-params>
+                    <method-param>parms_49</method-param>
+                    <method-param>parms_50</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_44</description>
+                <method-intf>Home</method-intf>
+                <method-name>name_44</method-name>
+                <method-params>
+                    <method-param>parms_51</method-param>
+                    <method-param>parms_52</method-param>
+                    <method-param>parms_53</method-param>
+                </method-params>
+            </method>
+            <trans-attribute>RequiresNew</trans-attribute>
+        </container-transaction>
+        <container-transaction>
+            <description>description_4</description>
+            <method>
+                <description>description_45</description>
+                <method-intf>Local</method-intf>
+                <method-name>name_45</method-name>
+            </method>
+            <method>
+                <description>description_46</description>
+                <method-intf>LocalHome</method-intf>
+                <method-name>name_46</method-name>
+                <method-params/>
+            </method>
+            <method>
+                <description>description_47</description>
+                <method-intf>ServiceEndpoint</method-intf>
+                <method-name>name_47</method-name>
+                <method-params>
+                    <method-param>parms_54</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_48</description>
+                <method-name>name_48</method-name>
+                <method-params>
+                    <method-param>parms_55</method-param>
+                    <method-param>parms_56</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_49</description>
+                <method-intf>Remote</method-intf>
+                <method-name>name_49</method-name>
+                <method-params>
+                    <method-param>parms_57</method-param>
+                    <method-param>parms_58</method-param>
+                    <method-param>parms_59</method-param>
+                </method-params>
+            </method>
+            <trans-attribute>Mandatory</trans-attribute>
+        </container-transaction>
+        <exclude-list>
+            <description>description_0</description>
+            <method>
+                <description>description_50</description>
+                <method-intf>Home</method-intf>
+                <method-name>name_50</method-name>
+            </method>
+            <method>
+                <description>description_51</description>
+                <method-intf>Local</method-intf>
+                <method-name>name_51</method-name>
+                <method-params/>
+            </method>
+            <method>
+                <description>description_52</description>
+                <method-intf>LocalHome</method-intf>
+                <method-name>name_52</method-name>
+                <method-params>
+                    <method-param>parms_60</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_53</description>
+                <method-intf>ServiceEndpoint</method-intf>
+                <method-name>name_53</method-name>
+                <method-params>
+                    <method-param>parms_61</method-param>
+                    <method-param>parms_62</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_54</description>
+                <method-name>name_54</method-name>
+                <method-params>
+                    <method-param>parms_63</method-param>
+                    <method-param>parms_64</method-param>
+                    <method-param>parms_65</method-param>
+                </method-params>
+            </method>
+        </exclude-list>
+    </assembly-descriptor>
+    <ejb-client-jar>ejbClientJar_0</ejb-client-jar>
+</ejb-jar>
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/EMFTests/ejb-jar2-0sax.xml b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/EMFTests/ejb-jar2-0sax.xml
new file mode 100644
index 0000000..f597242
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/EMFTests/ejb-jar2-0sax.xml
@@ -0,0 +1,2859 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd">
+<ejb-jar id="ejb-jar_ID">
+    <description>description_0</description>
+    <display-name>displayName_0</display-name>
+    <small-icon>smallIcon_0</small-icon>
+    <large-icon>largeIcon_0</large-icon>
+    <enterprise-beans>
+        <entity id="CMP1">
+            <ejb-name>CMP1</ejb-name>
+            <local-home>ejbs.CMP1LocalHome</local-home>
+            <local>ejbs.CMP1Local</local>
+            <ejb-class>ejbs.CMP1Bean</ejb-class>
+            <persistence-type>Container</persistence-type>
+            <prim-key-class>ejbs.CMP1Key</prim-key-class>
+            <reentrant>False</reentrant>
+            <cmp-version>2.x</cmp-version>
+            <abstract-schema-name>CMP1</abstract-schema-name>
+            <cmp-field>
+                <field-name>id</field-name>
+            </cmp-field>
+        </entity>
+        <entity id="CMP2">
+            <ejb-name>CMP2</ejb-name>
+            <local-home>ejbs.CMP2LocalHome</local-home>
+            <local>ejbs.CMP2Local</local>
+            <ejb-class>ejbs.CMP2Bean</ejb-class>
+            <persistence-type>Container</persistence-type>
+            <prim-key-class>ejbs.CMP2Key</prim-key-class>
+            <reentrant>False</reentrant>
+            <cmp-version>2.x</cmp-version>
+            <abstract-schema-name>CMP2</abstract-schema-name>
+            <cmp-field>
+                <field-name>id</field-name>
+            </cmp-field>
+        </entity>
+        <entity>
+            <description>description_0</description>
+            <display-name>displayName_0</display-name>
+            <small-icon>smallIcon_0</small-icon>
+            <large-icon>largeIcon_0</large-icon>
+            <ejb-name>name_0</ejb-name>
+            <home>java.util.List</home>
+            <remote>java.sql.Data</remote>
+            <local-home>java.lang.Integer</local-home>
+            <local>java.lang.String</local>
+            <ejb-class>java.util.HashTable</ejb-class>
+            <persistence-type>Bean</persistence-type>
+            <prim-key-class>java.util.HashTable</prim-key-class>
+            <reentrant>True</reentrant>
+            <env-entry>
+                <description>description_0</description>
+                <env-entry-name>name_0</env-entry-name>
+                <env-entry-type>java.lang.String</env-entry-type>
+                <env-entry-value>value_0</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_1</description>
+                <env-entry-name>name_1</env-entry-name>
+                <env-entry-type>java.lang.Integer</env-entry-type>
+                <env-entry-value>value_1</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_2</description>
+                <env-entry-name>name_2</env-entry-name>
+                <env-entry-type>java.lang.Boolean</env-entry-type>
+                <env-entry-value>value_2</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_3</description>
+                <env-entry-name>name_3</env-entry-name>
+                <env-entry-type>java.lang.Double</env-entry-type>
+                <env-entry-value>value_3</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_4</description>
+                <env-entry-name>name_4</env-entry-name>
+                <env-entry-type>java.lang.Byte</env-entry-type>
+                <env-entry-value>value_4</env-entry-value>
+            </env-entry>
+            <ejb-ref>
+                <description>description_0</description>
+                <ejb-ref-name>name_0</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_0</home>
+                <remote>remote_0</remote>
+                <ejb-link>link_0</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_1</description>
+                <ejb-ref-name>name_1</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_1</home>
+                <remote>remote_1</remote>
+                <ejb-link>link_1</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_2</description>
+                <ejb-ref-name>name_2</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_2</home>
+                <remote>remote_2</remote>
+                <ejb-link>link_2</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_3</description>
+                <ejb-ref-name>name_3</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_3</home>
+                <remote>remote_3</remote>
+                <ejb-link>link_3</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_4</description>
+                <ejb-ref-name>name_4</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_4</home>
+                <remote>remote_4</remote>
+                <ejb-link>link_4</ejb-link>
+            </ejb-ref>
+            <ejb-local-ref>
+                <description>description_0</description>
+                <ejb-ref-name>name_0</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>home_1</local-home>
+                <local>remote_1</local>
+                <ejb-link>link_0</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_1</description>
+                <ejb-ref-name>name_1</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>home_3</local-home>
+                <local>remote_3</local>
+                <ejb-link>link_1</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_2</description>
+                <ejb-ref-name>name_2</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>home_5</local-home>
+                <local>remote_5</local>
+                <ejb-link>link_2</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_3</description>
+                <ejb-ref-name>name_3</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>home_7</local-home>
+                <local>remote_7</local>
+                <ejb-link>link_3</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_4</description>
+                <ejb-ref-name>name_4</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>home_9</local-home>
+                <local>remote_9</local>
+                <ejb-link>link_4</ejb-link>
+            </ejb-local-ref>
+            <security-role-ref>
+                <description>description_0</description>
+                <role-name>name_0</role-name>
+                <role-link>link_0</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_1</description>
+                <role-name>name_1</role-name>
+                <role-link>link_1</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_2</description>
+                <role-name>name_2</role-name>
+                <role-link>link_2</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_3</description>
+                <role-name>name_3</role-name>
+                <role-link>link_3</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_4</description>
+                <role-name>name_4</role-name>
+                <role-link>link_4</role-link>
+            </security-role-ref>
+            <security-identity>
+                <description>description_0</description>
+                <run-as>
+                    <description>description_0</description>
+                    <role-name>roleName_0</role-name>
+                </run-as>
+            </security-identity>
+            <resource-ref>
+                <description>description_0</description>
+                <res-ref-name>name_0</res-ref-name>
+                <res-type>type_0</res-type>
+                <res-auth>Container</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_1</description>
+                <res-ref-name>name_1</res-ref-name>
+                <res-type>type_1</res-type>
+                <res-auth>Application</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_2</description>
+                <res-ref-name>name_2</res-ref-name>
+                <res-type>type_2</res-type>
+                <res-auth>SERVLET</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_3</description>
+                <res-ref-name>name_3</res-ref-name>
+                <res-type>type_3</res-type>
+                <res-auth>Container</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_4</description>
+                <res-ref-name>name_4</res-ref-name>
+                <res-type>type_4</res-type>
+                <res-auth>Application</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-env-ref>
+                <description>description_0</description>
+                <resource-env-ref-name>name_0</resource-env-ref-name>
+                <resource-env-ref-type>java.util.HashTable</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_1</description>
+                <resource-env-ref-name>name_1</resource-env-ref-name>
+                <resource-env-ref-type>java.util.List</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_2</description>
+                <resource-env-ref-name>name_2</resource-env-ref-name>
+                <resource-env-ref-type>java.sql.Data</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_3</description>
+                <resource-env-ref-name>name_3</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.Integer</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_4</description>
+                <resource-env-ref-name>name_4</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.String</resource-env-ref-type>
+            </resource-env-ref>
+        </entity>
+        <entity>
+            <description>description_1</description>
+            <display-name>displayName_1</display-name>
+            <small-icon>smallIcon_1</small-icon>
+            <large-icon>largeIcon_1</large-icon>
+            <ejb-name>name_1</ejb-name>
+            <home>java.sql.Data</home>
+            <remote>java.lang.Integer</remote>
+            <local-home>java.lang.String</local-home>
+            <local>java.util.HashTable</local>
+            <ejb-class>java.util.List</ejb-class>
+            <persistence-type>Bean</persistence-type>
+            <prim-key-class>java.util.List</prim-key-class>
+            <reentrant>False</reentrant>
+            <env-entry>
+                <description>description_5</description>
+                <env-entry-name>name_5</env-entry-name>
+                <env-entry-type>java.lang.Short</env-entry-type>
+                <env-entry-value>value_5</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_6</description>
+                <env-entry-name>name_6</env-entry-name>
+                <env-entry-type>java.lang.Long</env-entry-type>
+                <env-entry-value>value_6</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_7</description>
+                <env-entry-name>name_7</env-entry-name>
+                <env-entry-type>java.lang.Float</env-entry-type>
+                <env-entry-value>value_7</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_8</description>
+                <env-entry-name>name_8</env-entry-name>
+                <env-entry-type>java.lang.Character</env-entry-type>
+                <env-entry-value>value_8</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_9</description>
+                <env-entry-name>name_9</env-entry-name>
+                <env-entry-type>java.lang.String</env-entry-type>
+                <env-entry-value>value_9</env-entry-value>
+            </env-entry>
+            <ejb-ref>
+                <description>description_5</description>
+                <ejb-ref-name>name_5</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_5</home>
+                <remote>remote_5</remote>
+                <ejb-link>link_5</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_6</description>
+                <ejb-ref-name>name_6</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_6</home>
+                <remote>remote_6</remote>
+                <ejb-link>link_6</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_7</description>
+                <ejb-ref-name>name_7</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_7</home>
+                <remote>remote_7</remote>
+                <ejb-link>link_7</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_8</description>
+                <ejb-ref-name>name_8</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_8</home>
+                <remote>remote_8</remote>
+                <ejb-link>link_8</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_9</description>
+                <ejb-ref-name>name_9</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_9</home>
+                <remote>remote_9</remote>
+                <ejb-link>link_9</ejb-link>
+            </ejb-ref>
+            <ejb-local-ref>
+                <description>description_5</description>
+                <ejb-ref-name>name_5</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>home_11</local-home>
+                <local>remote_11</local>
+                <ejb-link>link_5</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_6</description>
+                <ejb-ref-name>name_6</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>home_13</local-home>
+                <local>remote_13</local>
+                <ejb-link>link_6</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_7</description>
+                <ejb-ref-name>name_7</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>home_15</local-home>
+                <local>remote_15</local>
+                <ejb-link>link_7</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_8</description>
+                <ejb-ref-name>name_8</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>home_17</local-home>
+                <local>remote_17</local>
+                <ejb-link>link_8</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_9</description>
+                <ejb-ref-name>name_9</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>home_19</local-home>
+                <local>remote_19</local>
+                <ejb-link>link_9</ejb-link>
+            </ejb-local-ref>
+            <security-role-ref>
+                <description>description_5</description>
+                <role-name>name_5</role-name>
+                <role-link>link_5</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_6</description>
+                <role-name>name_6</role-name>
+                <role-link>link_6</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_7</description>
+                <role-name>name_7</role-name>
+                <role-link>link_7</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_8</description>
+                <role-name>name_8</role-name>
+                <role-link>link_8</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_9</description>
+                <role-name>name_9</role-name>
+                <role-link>link_9</role-link>
+            </security-role-ref>
+            <security-identity>
+                <description>description_0</description>
+                <use-caller-identity/>
+            </security-identity>
+            <resource-ref>
+                <description>description_5</description>
+                <res-ref-name>name_5</res-ref-name>
+                <res-type>type_5</res-type>
+                <res-auth>SERVLET</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_6</description>
+                <res-ref-name>name_6</res-ref-name>
+                <res-type>type_6</res-type>
+                <res-auth>Container</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_7</description>
+                <res-ref-name>name_7</res-ref-name>
+                <res-type>type_7</res-type>
+                <res-auth>Application</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_8</description>
+                <res-ref-name>name_8</res-ref-name>
+                <res-type>type_8</res-type>
+                <res-auth>SERVLET</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_9</description>
+                <res-ref-name>name_9</res-ref-name>
+                <res-type>type_9</res-type>
+                <res-auth>Container</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-env-ref>
+                <description>description_5</description>
+                <resource-env-ref-name>name_5</resource-env-ref-name>
+                <resource-env-ref-type>java.util.List</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_6</description>
+                <resource-env-ref-name>name_6</resource-env-ref-name>
+                <resource-env-ref-type>java.sql.Data</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_7</description>
+                <resource-env-ref-name>name_7</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.Integer</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_8</description>
+                <resource-env-ref-name>name_8</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.String</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_9</description>
+                <resource-env-ref-name>name_9</resource-env-ref-name>
+                <resource-env-ref-type>java.util.HashTable</resource-env-ref-type>
+            </resource-env-ref>
+        </entity>
+        <entity>
+            <description>description_0</description>
+            <display-name>displayName_0</display-name>
+            <small-icon>smallIcon_0</small-icon>
+            <large-icon>largeIcon_0</large-icon>
+            <ejb-name>name_0</ejb-name>
+            <home>java.lang.Integer</home>
+            <remote>java.lang.String</remote>
+            <local-home>java.util.HashTable</local-home>
+            <local>java.util.List</local>
+            <ejb-class>java.sql.Data</ejb-class>
+            <persistence-type>Container</persistence-type>
+            <prim-key-class>java.sql.Data</prim-key-class>
+            <reentrant>True</reentrant>
+            <cmp-version>2.x</cmp-version>
+            <abstract-schema-name>abstractSchemaName_0</abstract-schema-name>
+            <cmp-field>
+                <description>description_1</description>
+                <field-name>name_1</field-name>
+            </cmp-field>
+            <cmp-field>
+                <description>description_3</description>
+                <field-name>name_3</field-name>
+            </cmp-field>
+            <env-entry>
+                <description>description_10</description>
+                <env-entry-name>name_10</env-entry-name>
+                <env-entry-type>java.lang.Integer</env-entry-type>
+                <env-entry-value>value_10</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_11</description>
+                <env-entry-name>name_11</env-entry-name>
+                <env-entry-type>java.lang.Boolean</env-entry-type>
+                <env-entry-value>value_11</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_12</description>
+                <env-entry-name>name_12</env-entry-name>
+                <env-entry-type>java.lang.Double</env-entry-type>
+                <env-entry-value>value_12</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_13</description>
+                <env-entry-name>name_13</env-entry-name>
+                <env-entry-type>java.lang.Byte</env-entry-type>
+                <env-entry-value>value_13</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_14</description>
+                <env-entry-name>name_14</env-entry-name>
+                <env-entry-type>java.lang.Short</env-entry-type>
+                <env-entry-value>value_14</env-entry-value>
+            </env-entry>
+            <ejb-ref>
+                <description>description_10</description>
+                <ejb-ref-name>name_10</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_10</home>
+                <remote>remote_10</remote>
+                <ejb-link>link_10</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_11</description>
+                <ejb-ref-name>name_11</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_11</home>
+                <remote>remote_11</remote>
+                <ejb-link>link_11</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_12</description>
+                <ejb-ref-name>name_12</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_12</home>
+                <remote>remote_12</remote>
+                <ejb-link>link_12</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_13</description>
+                <ejb-ref-name>name_13</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_13</home>
+                <remote>remote_13</remote>
+                <ejb-link>link_13</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_14</description>
+                <ejb-ref-name>name_14</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_14</home>
+                <remote>remote_14</remote>
+                <ejb-link>link_14</ejb-link>
+            </ejb-ref>
+            <ejb-local-ref>
+                <description>description_10</description>
+                <ejb-ref-name>name_10</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>home_21</local-home>
+                <local>remote_21</local>
+                <ejb-link>link_10</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_11</description>
+                <ejb-ref-name>name_11</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>home_23</local-home>
+                <local>remote_23</local>
+                <ejb-link>link_11</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_12</description>
+                <ejb-ref-name>name_12</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>home_25</local-home>
+                <local>remote_25</local>
+                <ejb-link>link_12</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_13</description>
+                <ejb-ref-name>name_13</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>home_27</local-home>
+                <local>remote_27</local>
+                <ejb-link>link_13</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_14</description>
+                <ejb-ref-name>name_14</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>home_29</local-home>
+                <local>remote_29</local>
+                <ejb-link>link_14</ejb-link>
+            </ejb-local-ref>
+            <security-role-ref>
+                <description>description_10</description>
+                <role-name>name_10</role-name>
+                <role-link>link_10</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_11</description>
+                <role-name>name_11</role-name>
+                <role-link>link_11</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_12</description>
+                <role-name>name_12</role-name>
+                <role-link>link_12</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_13</description>
+                <role-name>name_13</role-name>
+                <role-link>link_13</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_14</description>
+                <role-name>name_14</role-name>
+                <role-link>link_14</role-link>
+            </security-role-ref>
+            <security-identity>
+                <description>description_1</description>
+                <run-as>
+                    <description>description_1</description>
+                    <role-name>roleName_1</role-name>
+                </run-as>
+            </security-identity>
+            <resource-ref>
+                <description>description_10</description>
+                <res-ref-name>name_10</res-ref-name>
+                <res-type>type_10</res-type>
+                <res-auth>Application</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_11</description>
+                <res-ref-name>name_11</res-ref-name>
+                <res-type>type_11</res-type>
+                <res-auth>SERVLET</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_12</description>
+                <res-ref-name>name_12</res-ref-name>
+                <res-type>type_12</res-type>
+                <res-auth>Container</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_13</description>
+                <res-ref-name>name_13</res-ref-name>
+                <res-type>type_13</res-type>
+                <res-auth>Application</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_14</description>
+                <res-ref-name>name_14</res-ref-name>
+                <res-type>type_14</res-type>
+                <res-auth>SERVLET</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-env-ref>
+                <description>description_10</description>
+                <resource-env-ref-name>name_10</resource-env-ref-name>
+                <resource-env-ref-type>java.sql.Data</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_11</description>
+                <resource-env-ref-name>name_11</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.Integer</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_12</description>
+                <resource-env-ref-name>name_12</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.String</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_13</description>
+                <resource-env-ref-name>name_13</resource-env-ref-name>
+                <resource-env-ref-type>java.util.HashTable</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_14</description>
+                <resource-env-ref-name>name_14</resource-env-ref-name>
+                <resource-env-ref-type>java.util.List</resource-env-ref-type>
+            </resource-env-ref>
+            <query>
+                <description>description_0</description>
+                <query-method>
+                    <method-name>name_0</method-name>
+                </query-method>
+                <result-type-mapping>Local</result-type-mapping>
+                <ejb-ql>ejbQL_0</ejb-ql>
+            </query>
+            <query>
+                <description>description_1</description>
+                <query-method>
+                    <method-name>name_1</method-name>
+                    <method-params/>
+                </query-method>
+                <result-type-mapping>Remote</result-type-mapping>
+                <ejb-ql>ejbQL_1</ejb-ql>
+            </query>
+            <query>
+                <description>description_2</description>
+                <query-method>
+                    <method-name>name_2</method-name>
+                    <method-params>
+                        <method-param>parms_0</method-param>
+                    </method-params>
+                </query-method>
+                <result-type-mapping>Local</result-type-mapping>
+                <ejb-ql>ejbQL_2</ejb-ql>
+            </query>
+            <query>
+                <description>description_3</description>
+                <query-method>
+                    <method-name>name_3</method-name>
+                    <method-params>
+                        <method-param>parms_1</method-param>
+                        <method-param>parms_2</method-param>
+                    </method-params>
+                </query-method>
+                <result-type-mapping>Remote</result-type-mapping>
+                <ejb-ql>ejbQL_3</ejb-ql>
+            </query>
+            <query>
+                <description>description_4</description>
+                <query-method>
+                    <method-name>name_4</method-name>
+                    <method-params>
+                        <method-param>parms_3</method-param>
+                        <method-param>parms_4</method-param>
+                        <method-param>parms_5</method-param>
+                    </method-params>
+                </query-method>
+                <result-type-mapping>Local</result-type-mapping>
+                <ejb-ql>ejbQL_4</ejb-ql>
+            </query>
+        </entity>
+        <session>
+            <description>description_0</description>
+            <display-name>displayName_0</display-name>
+            <small-icon>smallIcon_0</small-icon>
+            <large-icon>largeIcon_0</large-icon>
+            <ejb-name>name_0</ejb-name>
+            <home>java.lang.String</home>
+            <remote>java.util.HashTable</remote>
+            <local-home>java.util.List</local-home>
+            <local>java.sql.Data</local>
+            <ejb-class>java.lang.Integer</ejb-class>
+            <session-type>Stateful</session-type>
+            <transaction-type>Bean</transaction-type>
+            <env-entry>
+                <description>description_15</description>
+                <env-entry-name>name_15</env-entry-name>
+                <env-entry-type>java.lang.Long</env-entry-type>
+                <env-entry-value>value_15</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_16</description>
+                <env-entry-name>name_16</env-entry-name>
+                <env-entry-type>java.lang.Float</env-entry-type>
+                <env-entry-value>value_16</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_17</description>
+                <env-entry-name>name_17</env-entry-name>
+                <env-entry-type>java.lang.Character</env-entry-type>
+                <env-entry-value>value_17</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_18</description>
+                <env-entry-name>name_18</env-entry-name>
+                <env-entry-type>java.lang.String</env-entry-type>
+                <env-entry-value>value_18</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_19</description>
+                <env-entry-name>name_19</env-entry-name>
+                <env-entry-type>java.lang.Integer</env-entry-type>
+                <env-entry-value>value_19</env-entry-value>
+            </env-entry>
+            <ejb-ref>
+                <description>description_15</description>
+                <ejb-ref-name>name_15</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_15</home>
+                <remote>remote_15</remote>
+                <ejb-link>link_15</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_16</description>
+                <ejb-ref-name>name_16</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_16</home>
+                <remote>remote_16</remote>
+                <ejb-link>link_16</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_17</description>
+                <ejb-ref-name>name_17</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_17</home>
+                <remote>remote_17</remote>
+                <ejb-link>link_17</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_18</description>
+                <ejb-ref-name>name_18</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_18</home>
+                <remote>remote_18</remote>
+                <ejb-link>link_18</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_19</description>
+                <ejb-ref-name>name_19</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_19</home>
+                <remote>remote_19</remote>
+                <ejb-link>link_19</ejb-link>
+            </ejb-ref>
+            <ejb-local-ref>
+                <description>description_15</description>
+                <ejb-ref-name>name_15</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>home_31</local-home>
+                <local>remote_31</local>
+                <ejb-link>link_15</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_16</description>
+                <ejb-ref-name>name_16</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>home_33</local-home>
+                <local>remote_33</local>
+                <ejb-link>link_16</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_17</description>
+                <ejb-ref-name>name_17</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>home_35</local-home>
+                <local>remote_35</local>
+                <ejb-link>link_17</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_18</description>
+                <ejb-ref-name>name_18</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>home_37</local-home>
+                <local>remote_37</local>
+                <ejb-link>link_18</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_19</description>
+                <ejb-ref-name>name_19</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>home_39</local-home>
+                <local>remote_39</local>
+                <ejb-link>link_19</ejb-link>
+            </ejb-local-ref>
+            <security-role-ref>
+                <description>description_15</description>
+                <role-name>name_15</role-name>
+                <role-link>link_15</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_16</description>
+                <role-name>name_16</role-name>
+                <role-link>link_16</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_17</description>
+                <role-name>name_17</role-name>
+                <role-link>link_17</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_18</description>
+                <role-name>name_18</role-name>
+                <role-link>link_18</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_19</description>
+                <role-name>name_19</role-name>
+                <role-link>link_19</role-link>
+            </security-role-ref>
+            <security-identity>
+                <description>description_1</description>
+                <use-caller-identity/>
+            </security-identity>
+            <resource-ref>
+                <description>description_15</description>
+                <res-ref-name>name_15</res-ref-name>
+                <res-type>type_15</res-type>
+                <res-auth>Container</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_16</description>
+                <res-ref-name>name_16</res-ref-name>
+                <res-type>type_16</res-type>
+                <res-auth>Application</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_17</description>
+                <res-ref-name>name_17</res-ref-name>
+                <res-type>type_17</res-type>
+                <res-auth>SERVLET</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_18</description>
+                <res-ref-name>name_18</res-ref-name>
+                <res-type>type_18</res-type>
+                <res-auth>Container</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_19</description>
+                <res-ref-name>name_19</res-ref-name>
+                <res-type>type_19</res-type>
+                <res-auth>Application</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-env-ref>
+                <description>description_15</description>
+                <resource-env-ref-name>name_15</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.Integer</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_16</description>
+                <resource-env-ref-name>name_16</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.String</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_17</description>
+                <resource-env-ref-name>name_17</resource-env-ref-name>
+                <resource-env-ref-type>java.util.HashTable</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_18</description>
+                <resource-env-ref-name>name_18</resource-env-ref-name>
+                <resource-env-ref-type>java.util.List</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_19</description>
+                <resource-env-ref-name>name_19</resource-env-ref-name>
+                <resource-env-ref-type>java.sql.Data</resource-env-ref-type>
+            </resource-env-ref>
+        </session>
+        <entity>
+            <description>description_2</description>
+            <display-name>displayName_2</display-name>
+            <small-icon>smallIcon_2</small-icon>
+            <large-icon>largeIcon_2</large-icon>
+            <ejb-name>name_2</ejb-name>
+            <home>java.util.HashTable</home>
+            <remote>java.util.List</remote>
+            <local-home>java.sql.Data</local-home>
+            <local>java.lang.Integer</local>
+            <ejb-class>java.lang.String</ejb-class>
+            <persistence-type>Bean</persistence-type>
+            <prim-key-class>java.lang.String</prim-key-class>
+            <reentrant>True</reentrant>
+            <env-entry>
+                <description>description_20</description>
+                <env-entry-name>name_20</env-entry-name>
+                <env-entry-type>java.lang.Boolean</env-entry-type>
+                <env-entry-value>value_20</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_21</description>
+                <env-entry-name>name_21</env-entry-name>
+                <env-entry-type>java.lang.Double</env-entry-type>
+                <env-entry-value>value_21</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_22</description>
+                <env-entry-name>name_22</env-entry-name>
+                <env-entry-type>java.lang.Byte</env-entry-type>
+                <env-entry-value>value_22</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_23</description>
+                <env-entry-name>name_23</env-entry-name>
+                <env-entry-type>java.lang.Short</env-entry-type>
+                <env-entry-value>value_23</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_24</description>
+                <env-entry-name>name_24</env-entry-name>
+                <env-entry-type>java.lang.Long</env-entry-type>
+                <env-entry-value>value_24</env-entry-value>
+            </env-entry>
+            <ejb-ref>
+                <description>description_20</description>
+                <ejb-ref-name>name_20</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_20</home>
+                <remote>remote_20</remote>
+                <ejb-link>link_20</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_21</description>
+                <ejb-ref-name>name_21</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_21</home>
+                <remote>remote_21</remote>
+                <ejb-link>link_21</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_22</description>
+                <ejb-ref-name>name_22</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_22</home>
+                <remote>remote_22</remote>
+                <ejb-link>link_22</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_23</description>
+                <ejb-ref-name>name_23</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_23</home>
+                <remote>remote_23</remote>
+                <ejb-link>link_23</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_24</description>
+                <ejb-ref-name>name_24</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_24</home>
+                <remote>remote_24</remote>
+                <ejb-link>link_24</ejb-link>
+            </ejb-ref>
+            <ejb-local-ref>
+                <description>description_20</description>
+                <ejb-ref-name>name_20</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>home_41</local-home>
+                <local>remote_41</local>
+                <ejb-link>link_20</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_21</description>
+                <ejb-ref-name>name_21</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>home_43</local-home>
+                <local>remote_43</local>
+                <ejb-link>link_21</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_22</description>
+                <ejb-ref-name>name_22</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>home_45</local-home>
+                <local>remote_45</local>
+                <ejb-link>link_22</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_23</description>
+                <ejb-ref-name>name_23</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>home_47</local-home>
+                <local>remote_47</local>
+                <ejb-link>link_23</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_24</description>
+                <ejb-ref-name>name_24</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>home_49</local-home>
+                <local>remote_49</local>
+                <ejb-link>link_24</ejb-link>
+            </ejb-local-ref>
+            <security-role-ref>
+                <description>description_20</description>
+                <role-name>name_20</role-name>
+                <role-link>link_20</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_21</description>
+                <role-name>name_21</role-name>
+                <role-link>link_21</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_22</description>
+                <role-name>name_22</role-name>
+                <role-link>link_22</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_23</description>
+                <role-name>name_23</role-name>
+                <role-link>link_23</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_24</description>
+                <role-name>name_24</role-name>
+                <role-link>link_24</role-link>
+            </security-role-ref>
+            <security-identity>
+                <description>description_2</description>
+                <run-as>
+                    <description>description_2</description>
+                    <role-name>roleName_2</role-name>
+                </run-as>
+            </security-identity>
+            <resource-ref>
+                <description>description_20</description>
+                <res-ref-name>name_20</res-ref-name>
+                <res-type>type_20</res-type>
+                <res-auth>SERVLET</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_21</description>
+                <res-ref-name>name_21</res-ref-name>
+                <res-type>type_21</res-type>
+                <res-auth>Container</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_22</description>
+                <res-ref-name>name_22</res-ref-name>
+                <res-type>type_22</res-type>
+                <res-auth>Application</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_23</description>
+                <res-ref-name>name_23</res-ref-name>
+                <res-type>type_23</res-type>
+                <res-auth>SERVLET</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_24</description>
+                <res-ref-name>name_24</res-ref-name>
+                <res-type>type_24</res-type>
+                <res-auth>Container</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-env-ref>
+                <description>description_20</description>
+                <resource-env-ref-name>name_20</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.String</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_21</description>
+                <resource-env-ref-name>name_21</resource-env-ref-name>
+                <resource-env-ref-type>java.util.HashTable</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_22</description>
+                <resource-env-ref-name>name_22</resource-env-ref-name>
+                <resource-env-ref-type>java.util.List</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_23</description>
+                <resource-env-ref-name>name_23</resource-env-ref-name>
+                <resource-env-ref-type>java.sql.Data</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_24</description>
+                <resource-env-ref-name>name_24</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.Integer</resource-env-ref-type>
+            </resource-env-ref>
+        </entity>
+        <entity>
+            <description>description_3</description>
+            <display-name>displayName_3</display-name>
+            <small-icon>smallIcon_3</small-icon>
+            <large-icon>largeIcon_3</large-icon>
+            <ejb-name>name_3</ejb-name>
+            <home>java.util.List</home>
+            <remote>java.sql.Data</remote>
+            <local-home>java.lang.Integer</local-home>
+            <local>java.lang.String</local>
+            <ejb-class>java.util.HashTable</ejb-class>
+            <persistence-type>Bean</persistence-type>
+            <prim-key-class>java.util.HashTable</prim-key-class>
+            <reentrant>False</reentrant>
+            <env-entry>
+                <description>description_25</description>
+                <env-entry-name>name_25</env-entry-name>
+                <env-entry-type>java.lang.Float</env-entry-type>
+                <env-entry-value>value_25</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_26</description>
+                <env-entry-name>name_26</env-entry-name>
+                <env-entry-type>java.lang.Character</env-entry-type>
+                <env-entry-value>value_26</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_27</description>
+                <env-entry-name>name_27</env-entry-name>
+                <env-entry-type>java.lang.String</env-entry-type>
+                <env-entry-value>value_27</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_28</description>
+                <env-entry-name>name_28</env-entry-name>
+                <env-entry-type>java.lang.Integer</env-entry-type>
+                <env-entry-value>value_28</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_29</description>
+                <env-entry-name>name_29</env-entry-name>
+                <env-entry-type>java.lang.Boolean</env-entry-type>
+                <env-entry-value>value_29</env-entry-value>
+            </env-entry>
+            <ejb-ref>
+                <description>description_25</description>
+                <ejb-ref-name>name_25</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_25</home>
+                <remote>remote_25</remote>
+                <ejb-link>link_25</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_26</description>
+                <ejb-ref-name>name_26</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_26</home>
+                <remote>remote_26</remote>
+                <ejb-link>link_26</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_27</description>
+                <ejb-ref-name>name_27</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_27</home>
+                <remote>remote_27</remote>
+                <ejb-link>link_27</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_28</description>
+                <ejb-ref-name>name_28</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_28</home>
+                <remote>remote_28</remote>
+                <ejb-link>link_28</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_29</description>
+                <ejb-ref-name>name_29</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_29</home>
+                <remote>remote_29</remote>
+                <ejb-link>link_29</ejb-link>
+            </ejb-ref>
+            <ejb-local-ref>
+                <description>description_25</description>
+                <ejb-ref-name>name_25</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>home_51</local-home>
+                <local>remote_51</local>
+                <ejb-link>link_25</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_26</description>
+                <ejb-ref-name>name_26</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>home_53</local-home>
+                <local>remote_53</local>
+                <ejb-link>link_26</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_27</description>
+                <ejb-ref-name>name_27</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>home_55</local-home>
+                <local>remote_55</local>
+                <ejb-link>link_27</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_28</description>
+                <ejb-ref-name>name_28</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>home_57</local-home>
+                <local>remote_57</local>
+                <ejb-link>link_28</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_29</description>
+                <ejb-ref-name>name_29</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>home_59</local-home>
+                <local>remote_59</local>
+                <ejb-link>link_29</ejb-link>
+            </ejb-local-ref>
+            <security-role-ref>
+                <description>description_25</description>
+                <role-name>name_25</role-name>
+                <role-link>link_25</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_26</description>
+                <role-name>name_26</role-name>
+                <role-link>link_26</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_27</description>
+                <role-name>name_27</role-name>
+                <role-link>link_27</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_28</description>
+                <role-name>name_28</role-name>
+                <role-link>link_28</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_29</description>
+                <role-name>name_29</role-name>
+                <role-link>link_29</role-link>
+            </security-role-ref>
+            <security-identity>
+                <description>description_2</description>
+                <use-caller-identity/>
+            </security-identity>
+            <resource-ref>
+                <description>description_25</description>
+                <res-ref-name>name_25</res-ref-name>
+                <res-type>type_25</res-type>
+                <res-auth>Application</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_26</description>
+                <res-ref-name>name_26</res-ref-name>
+                <res-type>type_26</res-type>
+                <res-auth>SERVLET</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_27</description>
+                <res-ref-name>name_27</res-ref-name>
+                <res-type>type_27</res-type>
+                <res-auth>Container</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_28</description>
+                <res-ref-name>name_28</res-ref-name>
+                <res-type>type_28</res-type>
+                <res-auth>Application</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_29</description>
+                <res-ref-name>name_29</res-ref-name>
+                <res-type>type_29</res-type>
+                <res-auth>SERVLET</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-env-ref>
+                <description>description_25</description>
+                <resource-env-ref-name>name_25</resource-env-ref-name>
+                <resource-env-ref-type>java.util.HashTable</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_26</description>
+                <resource-env-ref-name>name_26</resource-env-ref-name>
+                <resource-env-ref-type>java.util.List</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_27</description>
+                <resource-env-ref-name>name_27</resource-env-ref-name>
+                <resource-env-ref-type>java.sql.Data</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_28</description>
+                <resource-env-ref-name>name_28</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.Integer</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_29</description>
+                <resource-env-ref-name>name_29</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.String</resource-env-ref-type>
+            </resource-env-ref>
+        </entity>
+        <message-driven>
+            <description>description_0</description>
+            <display-name>displayName_0</display-name>
+            <small-icon>smallIcon_0</small-icon>
+            <large-icon>largeIcon_0</large-icon>
+            <ejb-name>name_0</ejb-name>
+            <ejb-class>java.util.List</ejb-class>
+            <transaction-type>Bean</transaction-type>
+            <message-selector>messageSelector_0</message-selector>
+            <acknowledge-mode>Auto-acknowledge</acknowledge-mode>
+            <message-driven-destination>
+                <destination-type>javax.jms.Queue</destination-type>
+                <subscription-durability>Durable</subscription-durability>
+            </message-driven-destination>
+            <env-entry>
+                <description>description_30</description>
+                <env-entry-name>name_30</env-entry-name>
+                <env-entry-type>java.lang.Double</env-entry-type>
+                <env-entry-value>value_30</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_31</description>
+                <env-entry-name>name_31</env-entry-name>
+                <env-entry-type>java.lang.Byte</env-entry-type>
+                <env-entry-value>value_31</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_32</description>
+                <env-entry-name>name_32</env-entry-name>
+                <env-entry-type>java.lang.Short</env-entry-type>
+                <env-entry-value>value_32</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_33</description>
+                <env-entry-name>name_33</env-entry-name>
+                <env-entry-type>java.lang.Long</env-entry-type>
+                <env-entry-value>value_33</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_34</description>
+                <env-entry-name>name_34</env-entry-name>
+                <env-entry-type>java.lang.Float</env-entry-type>
+                <env-entry-value>value_34</env-entry-value>
+            </env-entry>
+            <ejb-ref>
+                <description>description_30</description>
+                <ejb-ref-name>name_30</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_30</home>
+                <remote>remote_30</remote>
+                <ejb-link>link_30</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_31</description>
+                <ejb-ref-name>name_31</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_31</home>
+                <remote>remote_31</remote>
+                <ejb-link>link_31</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_32</description>
+                <ejb-ref-name>name_32</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_32</home>
+                <remote>remote_32</remote>
+                <ejb-link>link_32</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_33</description>
+                <ejb-ref-name>name_33</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_33</home>
+                <remote>remote_33</remote>
+                <ejb-link>link_33</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_34</description>
+                <ejb-ref-name>name_34</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_34</home>
+                <remote>remote_34</remote>
+                <ejb-link>link_34</ejb-link>
+            </ejb-ref>
+            <ejb-local-ref>
+                <description>description_30</description>
+                <ejb-ref-name>name_30</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>home_61</local-home>
+                <local>remote_61</local>
+                <ejb-link>link_30</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_31</description>
+                <ejb-ref-name>name_31</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>home_63</local-home>
+                <local>remote_63</local>
+                <ejb-link>link_31</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_32</description>
+                <ejb-ref-name>name_32</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>home_65</local-home>
+                <local>remote_65</local>
+                <ejb-link>link_32</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_33</description>
+                <ejb-ref-name>name_33</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>home_67</local-home>
+                <local>remote_67</local>
+                <ejb-link>link_33</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_34</description>
+                <ejb-ref-name>name_34</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>home_69</local-home>
+                <local>remote_69</local>
+                <ejb-link>link_34</ejb-link>
+            </ejb-local-ref>
+            <security-identity>
+                <description>description_3</description>
+                <run-as>
+                    <description>description_3</description>
+                    <role-name>roleName_3</role-name>
+                </run-as>
+            </security-identity>
+            <resource-ref>
+                <description>description_30</description>
+                <res-ref-name>name_30</res-ref-name>
+                <res-type>type_30</res-type>
+                <res-auth>Container</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_31</description>
+                <res-ref-name>name_31</res-ref-name>
+                <res-type>type_31</res-type>
+                <res-auth>Application</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_32</description>
+                <res-ref-name>name_32</res-ref-name>
+                <res-type>type_32</res-type>
+                <res-auth>SERVLET</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_33</description>
+                <res-ref-name>name_33</res-ref-name>
+                <res-type>type_33</res-type>
+                <res-auth>Container</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_34</description>
+                <res-ref-name>name_34</res-ref-name>
+                <res-type>type_34</res-type>
+                <res-auth>Application</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-env-ref>
+                <description>description_30</description>
+                <resource-env-ref-name>name_30</resource-env-ref-name>
+                <resource-env-ref-type>java.util.List</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_31</description>
+                <resource-env-ref-name>name_31</resource-env-ref-name>
+                <resource-env-ref-type>java.sql.Data</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_32</description>
+                <resource-env-ref-name>name_32</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.Integer</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_33</description>
+                <resource-env-ref-name>name_33</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.String</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_34</description>
+                <resource-env-ref-name>name_34</resource-env-ref-name>
+                <resource-env-ref-type>java.util.HashTable</resource-env-ref-type>
+            </resource-env-ref>
+        </message-driven>
+        <session>
+            <description>description_1</description>
+            <display-name>displayName_1</display-name>
+            <small-icon>smallIcon_1</small-icon>
+            <large-icon>largeIcon_1</large-icon>
+            <ejb-name>name_1</ejb-name>
+            <home>java.lang.String</home>
+            <remote>java.util.HashTable</remote>
+            <local-home>java.util.List</local-home>
+            <local>java.sql.Data</local>
+            <ejb-class>java.lang.Integer</ejb-class>
+            <session-type>Stateless</session-type>
+            <transaction-type>Container</transaction-type>
+            <env-entry>
+                <description>description_35</description>
+                <env-entry-name>name_35</env-entry-name>
+                <env-entry-type>java.lang.Character</env-entry-type>
+                <env-entry-value>value_35</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_36</description>
+                <env-entry-name>name_36</env-entry-name>
+                <env-entry-type>java.lang.String</env-entry-type>
+                <env-entry-value>value_36</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_37</description>
+                <env-entry-name>name_37</env-entry-name>
+                <env-entry-type>java.lang.Integer</env-entry-type>
+                <env-entry-value>value_37</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_38</description>
+                <env-entry-name>name_38</env-entry-name>
+                <env-entry-type>java.lang.Boolean</env-entry-type>
+                <env-entry-value>value_38</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_39</description>
+                <env-entry-name>name_39</env-entry-name>
+                <env-entry-type>java.lang.Double</env-entry-type>
+                <env-entry-value>value_39</env-entry-value>
+            </env-entry>
+            <ejb-ref>
+                <description>description_35</description>
+                <ejb-ref-name>name_35</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_35</home>
+                <remote>remote_35</remote>
+                <ejb-link>link_35</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_36</description>
+                <ejb-ref-name>name_36</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_36</home>
+                <remote>remote_36</remote>
+                <ejb-link>link_36</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_37</description>
+                <ejb-ref-name>name_37</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_37</home>
+                <remote>remote_37</remote>
+                <ejb-link>link_37</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_38</description>
+                <ejb-ref-name>name_38</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_38</home>
+                <remote>remote_38</remote>
+                <ejb-link>link_38</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_39</description>
+                <ejb-ref-name>name_39</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_39</home>
+                <remote>remote_39</remote>
+                <ejb-link>link_39</ejb-link>
+            </ejb-ref>
+            <ejb-local-ref>
+                <description>description_35</description>
+                <ejb-ref-name>name_35</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>home_71</local-home>
+                <local>remote_71</local>
+                <ejb-link>link_35</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_36</description>
+                <ejb-ref-name>name_36</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>home_73</local-home>
+                <local>remote_73</local>
+                <ejb-link>link_36</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_37</description>
+                <ejb-ref-name>name_37</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>home_75</local-home>
+                <local>remote_75</local>
+                <ejb-link>link_37</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_38</description>
+                <ejb-ref-name>name_38</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>home_77</local-home>
+                <local>remote_77</local>
+                <ejb-link>link_38</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_39</description>
+                <ejb-ref-name>name_39</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>home_79</local-home>
+                <local>remote_79</local>
+                <ejb-link>link_39</ejb-link>
+            </ejb-local-ref>
+            <security-role-ref>
+                <description>description_35</description>
+                <role-name>name_35</role-name>
+                <role-link>link_35</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_36</description>
+                <role-name>name_36</role-name>
+                <role-link>link_36</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_37</description>
+                <role-name>name_37</role-name>
+                <role-link>link_37</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_38</description>
+                <role-name>name_38</role-name>
+                <role-link>link_38</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_39</description>
+                <role-name>name_39</role-name>
+                <role-link>link_39</role-link>
+            </security-role-ref>
+            <security-identity>
+                <description>description_3</description>
+                <use-caller-identity/>
+            </security-identity>
+            <resource-ref>
+                <description>description_35</description>
+                <res-ref-name>name_35</res-ref-name>
+                <res-type>type_35</res-type>
+                <res-auth>SERVLET</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_36</description>
+                <res-ref-name>name_36</res-ref-name>
+                <res-type>type_36</res-type>
+                <res-auth>Container</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_37</description>
+                <res-ref-name>name_37</res-ref-name>
+                <res-type>type_37</res-type>
+                <res-auth>Application</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_38</description>
+                <res-ref-name>name_38</res-ref-name>
+                <res-type>type_38</res-type>
+                <res-auth>SERVLET</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_39</description>
+                <res-ref-name>name_39</res-ref-name>
+                <res-type>type_39</res-type>
+                <res-auth>Container</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-env-ref>
+                <description>description_35</description>
+                <resource-env-ref-name>name_35</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.Integer</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_36</description>
+                <resource-env-ref-name>name_36</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.String</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_37</description>
+                <resource-env-ref-name>name_37</resource-env-ref-name>
+                <resource-env-ref-type>java.util.HashTable</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_38</description>
+                <resource-env-ref-name>name_38</resource-env-ref-name>
+                <resource-env-ref-type>java.util.List</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_39</description>
+                <resource-env-ref-name>name_39</resource-env-ref-name>
+                <resource-env-ref-type>java.sql.Data</resource-env-ref-type>
+            </resource-env-ref>
+        </session>
+        <entity>
+            <description>description_4</description>
+            <display-name>displayName_4</display-name>
+            <small-icon>smallIcon_4</small-icon>
+            <large-icon>largeIcon_4</large-icon>
+            <ejb-name>name_4</ejb-name>
+            <home>java.util.HashTable</home>
+            <remote>java.util.List</remote>
+            <local-home>java.sql.Data</local-home>
+            <local>java.lang.Integer</local>
+            <ejb-class>java.lang.String</ejb-class>
+            <persistence-type>Bean</persistence-type>
+            <prim-key-class>java.lang.String</prim-key-class>
+            <reentrant>True</reentrant>
+            <env-entry>
+                <description>description_40</description>
+                <env-entry-name>name_40</env-entry-name>
+                <env-entry-type>java.lang.Byte</env-entry-type>
+                <env-entry-value>value_40</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_41</description>
+                <env-entry-name>name_41</env-entry-name>
+                <env-entry-type>java.lang.Short</env-entry-type>
+                <env-entry-value>value_41</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_42</description>
+                <env-entry-name>name_42</env-entry-name>
+                <env-entry-type>java.lang.Long</env-entry-type>
+                <env-entry-value>value_42</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_43</description>
+                <env-entry-name>name_43</env-entry-name>
+                <env-entry-type>java.lang.Float</env-entry-type>
+                <env-entry-value>value_43</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_44</description>
+                <env-entry-name>name_44</env-entry-name>
+                <env-entry-type>java.lang.Character</env-entry-type>
+                <env-entry-value>value_44</env-entry-value>
+            </env-entry>
+            <ejb-ref>
+                <description>description_40</description>
+                <ejb-ref-name>name_40</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_40</home>
+                <remote>remote_40</remote>
+                <ejb-link>link_40</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_41</description>
+                <ejb-ref-name>name_41</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_41</home>
+                <remote>remote_41</remote>
+                <ejb-link>link_41</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_42</description>
+                <ejb-ref-name>name_42</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_42</home>
+                <remote>remote_42</remote>
+                <ejb-link>link_42</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_43</description>
+                <ejb-ref-name>name_43</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_43</home>
+                <remote>remote_43</remote>
+                <ejb-link>link_43</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_44</description>
+                <ejb-ref-name>name_44</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_44</home>
+                <remote>remote_44</remote>
+                <ejb-link>link_44</ejb-link>
+            </ejb-ref>
+            <ejb-local-ref>
+                <description>description_40</description>
+                <ejb-ref-name>name_40</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>home_81</local-home>
+                <local>remote_81</local>
+                <ejb-link>link_40</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_41</description>
+                <ejb-ref-name>name_41</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>home_83</local-home>
+                <local>remote_83</local>
+                <ejb-link>link_41</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_42</description>
+                <ejb-ref-name>name_42</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>home_85</local-home>
+                <local>remote_85</local>
+                <ejb-link>link_42</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_43</description>
+                <ejb-ref-name>name_43</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>home_87</local-home>
+                <local>remote_87</local>
+                <ejb-link>link_43</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_44</description>
+                <ejb-ref-name>name_44</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>home_89</local-home>
+                <local>remote_89</local>
+                <ejb-link>link_44</ejb-link>
+            </ejb-local-ref>
+            <security-role-ref>
+                <description>description_40</description>
+                <role-name>name_40</role-name>
+                <role-link>link_40</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_41</description>
+                <role-name>name_41</role-name>
+                <role-link>link_41</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_42</description>
+                <role-name>name_42</role-name>
+                <role-link>link_42</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_43</description>
+                <role-name>name_43</role-name>
+                <role-link>link_43</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_44</description>
+                <role-name>name_44</role-name>
+                <role-link>link_44</role-link>
+            </security-role-ref>
+            <security-identity>
+                <description>description_4</description>
+                <run-as>
+                    <description>description_4</description>
+                    <role-name>roleName_4</role-name>
+                </run-as>
+            </security-identity>
+            <resource-ref>
+                <description>description_40</description>
+                <res-ref-name>name_40</res-ref-name>
+                <res-type>type_40</res-type>
+                <res-auth>Application</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_41</description>
+                <res-ref-name>name_41</res-ref-name>
+                <res-type>type_41</res-type>
+                <res-auth>SERVLET</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_42</description>
+                <res-ref-name>name_42</res-ref-name>
+                <res-type>type_42</res-type>
+                <res-auth>Container</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_43</description>
+                <res-ref-name>name_43</res-ref-name>
+                <res-type>type_43</res-type>
+                <res-auth>Application</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_44</description>
+                <res-ref-name>name_44</res-ref-name>
+                <res-type>type_44</res-type>
+                <res-auth>SERVLET</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-env-ref>
+                <description>description_40</description>
+                <resource-env-ref-name>name_40</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.String</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_41</description>
+                <resource-env-ref-name>name_41</resource-env-ref-name>
+                <resource-env-ref-type>java.util.HashTable</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_42</description>
+                <resource-env-ref-name>name_42</resource-env-ref-name>
+                <resource-env-ref-type>java.util.List</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_43</description>
+                <resource-env-ref-name>name_43</resource-env-ref-name>
+                <resource-env-ref-type>java.sql.Data</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_44</description>
+                <resource-env-ref-name>name_44</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.Integer</resource-env-ref-type>
+            </resource-env-ref>
+        </entity>
+        <entity>
+            <description>description_5</description>
+            <display-name>displayName_5</display-name>
+            <small-icon>smallIcon_5</small-icon>
+            <large-icon>largeIcon_5</large-icon>
+            <ejb-name>name_5</ejb-name>
+            <home>java.util.List</home>
+            <remote>java.sql.Data</remote>
+            <local-home>java.lang.Integer</local-home>
+            <local>java.lang.String</local>
+            <ejb-class>java.util.HashTable</ejb-class>
+            <persistence-type>Bean</persistence-type>
+            <prim-key-class>java.util.HashTable</prim-key-class>
+            <reentrant>False</reentrant>
+            <env-entry>
+                <description>description_45</description>
+                <env-entry-name>name_45</env-entry-name>
+                <env-entry-type>java.lang.String</env-entry-type>
+                <env-entry-value>value_45</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_46</description>
+                <env-entry-name>name_46</env-entry-name>
+                <env-entry-type>java.lang.Integer</env-entry-type>
+                <env-entry-value>value_46</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_47</description>
+                <env-entry-name>name_47</env-entry-name>
+                <env-entry-type>java.lang.Boolean</env-entry-type>
+                <env-entry-value>value_47</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_48</description>
+                <env-entry-name>name_48</env-entry-name>
+                <env-entry-type>java.lang.Double</env-entry-type>
+                <env-entry-value>value_48</env-entry-value>
+            </env-entry>
+            <env-entry>
+                <description>description_49</description>
+                <env-entry-name>name_49</env-entry-name>
+                <env-entry-type>java.lang.Byte</env-entry-type>
+                <env-entry-value>value_49</env-entry-value>
+            </env-entry>
+            <ejb-ref>
+                <description>description_45</description>
+                <ejb-ref-name>name_45</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_45</home>
+                <remote>remote_45</remote>
+                <ejb-link>link_45</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_46</description>
+                <ejb-ref-name>name_46</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_46</home>
+                <remote>remote_46</remote>
+                <ejb-link>link_46</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_47</description>
+                <ejb-ref-name>name_47</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_47</home>
+                <remote>remote_47</remote>
+                <ejb-link>link_47</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_48</description>
+                <ejb-ref-name>name_48</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <home>home_48</home>
+                <remote>remote_48</remote>
+                <ejb-link>link_48</ejb-link>
+            </ejb-ref>
+            <ejb-ref>
+                <description>description_49</description>
+                <ejb-ref-name>name_49</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <home>home_49</home>
+                <remote>remote_49</remote>
+                <ejb-link>link_49</ejb-link>
+            </ejb-ref>
+            <ejb-local-ref>
+                <description>description_45</description>
+                <ejb-ref-name>name_45</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>home_91</local-home>
+                <local>remote_91</local>
+                <ejb-link>link_45</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_46</description>
+                <ejb-ref-name>name_46</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>home_93</local-home>
+                <local>remote_93</local>
+                <ejb-link>link_46</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_47</description>
+                <ejb-ref-name>name_47</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>home_95</local-home>
+                <local>remote_95</local>
+                <ejb-link>link_47</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_48</description>
+                <ejb-ref-name>name_48</ejb-ref-name>
+                <ejb-ref-type>Session</ejb-ref-type>
+                <local-home>home_97</local-home>
+                <local>remote_97</local>
+                <ejb-link>link_48</ejb-link>
+            </ejb-local-ref>
+            <ejb-local-ref>
+                <description>description_49</description>
+                <ejb-ref-name>name_49</ejb-ref-name>
+                <ejb-ref-type>Entity</ejb-ref-type>
+                <local-home>home_99</local-home>
+                <local>remote_99</local>
+                <ejb-link>link_49</ejb-link>
+            </ejb-local-ref>
+            <security-role-ref>
+                <description>description_45</description>
+                <role-name>name_45</role-name>
+                <role-link>link_45</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_46</description>
+                <role-name>name_46</role-name>
+                <role-link>link_46</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_47</description>
+                <role-name>name_47</role-name>
+                <role-link>link_47</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_48</description>
+                <role-name>name_48</role-name>
+                <role-link>link_48</role-link>
+            </security-role-ref>
+            <security-role-ref>
+                <description>description_49</description>
+                <role-name>name_49</role-name>
+                <role-link>link_49</role-link>
+            </security-role-ref>
+            <security-identity>
+                <description>description_4</description>
+                <use-caller-identity/>
+            </security-identity>
+            <resource-ref>
+                <description>description_45</description>
+                <res-ref-name>name_45</res-ref-name>
+                <res-type>type_45</res-type>
+                <res-auth>Container</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_46</description>
+                <res-ref-name>name_46</res-ref-name>
+                <res-type>type_46</res-type>
+                <res-auth>Application</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_47</description>
+                <res-ref-name>name_47</res-ref-name>
+                <res-type>type_47</res-type>
+                <res-auth>SERVLET</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_48</description>
+                <res-ref-name>name_48</res-ref-name>
+                <res-type>type_48</res-type>
+                <res-auth>Container</res-auth>
+                <res-sharing-scope>Shareable</res-sharing-scope>
+            </resource-ref>
+            <resource-ref>
+                <description>description_49</description>
+                <res-ref-name>name_49</res-ref-name>
+                <res-type>type_49</res-type>
+                <res-auth>Application</res-auth>
+                <res-sharing-scope>Unshareable</res-sharing-scope>
+            </resource-ref>
+            <resource-env-ref>
+                <description>description_45</description>
+                <resource-env-ref-name>name_45</resource-env-ref-name>
+                <resource-env-ref-type>java.util.HashTable</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_46</description>
+                <resource-env-ref-name>name_46</resource-env-ref-name>
+                <resource-env-ref-type>java.util.List</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_47</description>
+                <resource-env-ref-name>name_47</resource-env-ref-name>
+                <resource-env-ref-type>java.sql.Data</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_48</description>
+                <resource-env-ref-name>name_48</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.Integer</resource-env-ref-type>
+            </resource-env-ref>
+            <resource-env-ref>
+                <description>description_49</description>
+                <resource-env-ref-name>name_49</resource-env-ref-name>
+                <resource-env-ref-type>java.lang.String</resource-env-ref-type>
+            </resource-env-ref>
+        </entity>
+    </enterprise-beans>
+    <relationships>
+        <description>description_0</description>
+        <ejb-relation>
+            <description>description_0</description>
+            <ejb-relation-name>name_0</ejb-relation-name>
+            <ejb-relationship-role>
+                <description>description_0</description>
+                <ejb-relationship-role-name>roleName_0</ejb-relationship-role-name>
+                <multiplicity>One</multiplicity>
+                <cascade-delete/>
+                <relationship-role-source>
+                    <description>description_0</description>
+                </relationship-role-source>
+                <cmr-field>
+                    <description>description_0</description>
+                    <cmr-field-name>name_0</cmr-field-name>
+                    <cmr-field-type>java.util.List</cmr-field-type>
+                </cmr-field>
+            </ejb-relationship-role>
+            <ejb-relationship-role>
+                <description>description_1</description>
+                <ejb-relationship-role-name>roleName_1</ejb-relationship-role-name>
+                <multiplicity>Many</multiplicity>
+                <relationship-role-source>
+                    <description>description_1</description>
+                </relationship-role-source>
+                <cmr-field>
+                    <description>description_1</description>
+                    <cmr-field-name>name_1</cmr-field-name>
+                    <cmr-field-type>java.sql.Data</cmr-field-type>
+                </cmr-field>
+            </ejb-relationship-role>
+        </ejb-relation>
+        <ejb-relation>
+            <description>description_1</description>
+            <ejb-relation-name>name_1</ejb-relation-name>
+            <ejb-relationship-role>
+                <description>description_2</description>
+                <ejb-relationship-role-name>roleName_2</ejb-relationship-role-name>
+                <multiplicity>One</multiplicity>
+                <cascade-delete/>
+                <relationship-role-source>
+                    <description>description_2</description>
+                </relationship-role-source>
+                <cmr-field>
+                    <description>description_2</description>
+                    <cmr-field-name>name_2</cmr-field-name>
+                    <cmr-field-type>java.lang.Integer</cmr-field-type>
+                </cmr-field>
+            </ejb-relationship-role>
+            <ejb-relationship-role>
+                <description>description_3</description>
+                <ejb-relationship-role-name>roleName_3</ejb-relationship-role-name>
+                <multiplicity>Many</multiplicity>
+                <relationship-role-source>
+                    <description>description_3</description>
+                </relationship-role-source>
+                <cmr-field>
+                    <description>description_3</description>
+                    <cmr-field-name>name_3</cmr-field-name>
+                    <cmr-field-type>java.lang.String</cmr-field-type>
+                </cmr-field>
+            </ejb-relationship-role>
+        </ejb-relation>
+        <ejb-relation>
+            <description>description_2</description>
+            <ejb-relation-name>name_2</ejb-relation-name>
+            <ejb-relationship-role>
+                <description>description_4</description>
+                <ejb-relationship-role-name>roleName_4</ejb-relationship-role-name>
+                <multiplicity>One</multiplicity>
+                <cascade-delete/>
+                <relationship-role-source>
+                    <description>description_4</description>
+                </relationship-role-source>
+                <cmr-field>
+                    <description>description_4</description>
+                    <cmr-field-name>name_4</cmr-field-name>
+                    <cmr-field-type>java.util.HashTable</cmr-field-type>
+                </cmr-field>
+            </ejb-relationship-role>
+            <ejb-relationship-role>
+                <description>description_5</description>
+                <ejb-relationship-role-name>roleName_5</ejb-relationship-role-name>
+                <multiplicity>Many</multiplicity>
+                <relationship-role-source>
+                    <description>description_5</description>
+                </relationship-role-source>
+                <cmr-field>
+                    <description>description_5</description>
+                    <cmr-field-name>name_5</cmr-field-name>
+                    <cmr-field-type>java.util.List</cmr-field-type>
+                </cmr-field>
+            </ejb-relationship-role>
+        </ejb-relation>
+        <ejb-relation>
+            <description>description_3</description>
+            <ejb-relation-name>name_3</ejb-relation-name>
+            <ejb-relationship-role>
+                <description>description_6</description>
+                <ejb-relationship-role-name>roleName_6</ejb-relationship-role-name>
+                <multiplicity>One</multiplicity>
+                <cascade-delete/>
+                <relationship-role-source>
+                    <description>description_6</description>
+                </relationship-role-source>
+                <cmr-field>
+                    <description>description_6</description>
+                    <cmr-field-name>name_6</cmr-field-name>
+                    <cmr-field-type>java.sql.Data</cmr-field-type>
+                </cmr-field>
+            </ejb-relationship-role>
+            <ejb-relationship-role>
+                <description>description_7</description>
+                <ejb-relationship-role-name>roleName_7</ejb-relationship-role-name>
+                <multiplicity>Many</multiplicity>
+                <relationship-role-source>
+                    <description>description_7</description>
+                </relationship-role-source>
+                <cmr-field>
+                    <description>description_7</description>
+                    <cmr-field-name>name_7</cmr-field-name>
+                    <cmr-field-type>java.lang.Integer</cmr-field-type>
+                </cmr-field>
+            </ejb-relationship-role>
+        </ejb-relation>
+        <ejb-relation>
+            <description>description_4</description>
+            <ejb-relation-name>name_4</ejb-relation-name>
+            <ejb-relationship-role>
+                <description>description_8</description>
+                <ejb-relationship-role-name>roleName_8</ejb-relationship-role-name>
+                <multiplicity>One</multiplicity>
+                <cascade-delete/>
+                <relationship-role-source>
+                    <description>description_8</description>
+                </relationship-role-source>
+                <cmr-field>
+                    <description>description_8</description>
+                    <cmr-field-name>name_8</cmr-field-name>
+                    <cmr-field-type>java.lang.String</cmr-field-type>
+                </cmr-field>
+            </ejb-relationship-role>
+            <ejb-relationship-role>
+                <description>description_9</description>
+                <ejb-relationship-role-name>roleName_9</ejb-relationship-role-name>
+                <multiplicity>Many</multiplicity>
+                <relationship-role-source>
+                    <description>description_9</description>
+                </relationship-role-source>
+                <cmr-field>
+                    <description>description_9</description>
+                    <cmr-field-name>name_9</cmr-field-name>
+                    <cmr-field-type>java.util.HashTable</cmr-field-type>
+                </cmr-field>
+            </ejb-relationship-role>
+        </ejb-relation>
+    </relationships>
+    <assembly-descriptor>
+        <security-role>
+            <description>description_5</description>
+            <role-name>roleName_5</role-name>
+        </security-role>
+        <security-role>
+            <description>description_6</description>
+            <role-name>roleName_6</role-name>
+        </security-role>
+        <security-role>
+            <description>description_7</description>
+            <role-name>roleName_7</role-name>
+        </security-role>
+        <security-role>
+            <description>description_8</description>
+            <role-name>roleName_8</role-name>
+        </security-role>
+        <security-role>
+            <description>description_9</description>
+            <role-name>roleName_9</role-name>
+        </security-role>
+        <method-permission>
+            <description>description_0</description>
+            <unchecked/>
+            <method>
+                <description>description_0</description>
+                <method-name>name_0</method-name>
+            </method>
+            <method>
+                <description>description_1</description>
+                <method-intf>Remote</method-intf>
+                <method-name>name_1</method-name>
+                <method-params/>
+            </method>
+            <method>
+                <description>description_2</description>
+                <method-intf>Home</method-intf>
+                <method-name>name_2</method-name>
+                <method-params>
+                    <method-param>parms_0</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_3</description>
+                <method-intf>Local</method-intf>
+                <method-name>name_3</method-name>
+                <method-params>
+                    <method-param>parms_1</method-param>
+                    <method-param>parms_2</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_4</description>
+                <method-intf>LocalHome</method-intf>
+                <method-name>name_4</method-name>
+                <method-params>
+                    <method-param>parms_3</method-param>
+                    <method-param>parms_4</method-param>
+                    <method-param>parms_5</method-param>
+                </method-params>
+            </method>
+        </method-permission>
+        <method-permission>
+            <description>description_1</description>
+            <method>
+                <description>description_5</description>
+                <method-intf>ServiceEndpoint</method-intf>
+                <method-name>name_5</method-name>
+            </method>
+            <method>
+                <description>description_6</description>
+                <method-name>name_6</method-name>
+                <method-params/>
+            </method>
+            <method>
+                <description>description_7</description>
+                <method-intf>Remote</method-intf>
+                <method-name>name_7</method-name>
+                <method-params>
+                    <method-param>parms_6</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_8</description>
+                <method-intf>Home</method-intf>
+                <method-name>name_8</method-name>
+                <method-params>
+                    <method-param>parms_7</method-param>
+                    <method-param>parms_8</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_9</description>
+                <method-intf>Local</method-intf>
+                <method-name>name_9</method-name>
+                <method-params>
+                    <method-param>parms_9</method-param>
+                    <method-param>parms_10</method-param>
+                    <method-param>parms_11</method-param>
+                </method-params>
+            </method>
+        </method-permission>
+        <method-permission>
+            <description>description_2</description>
+            <unchecked/>
+            <method>
+                <description>description_10</description>
+                <method-intf>LocalHome</method-intf>
+                <method-name>name_10</method-name>
+            </method>
+            <method>
+                <description>description_11</description>
+                <method-intf>ServiceEndpoint</method-intf>
+                <method-name>name_11</method-name>
+                <method-params/>
+            </method>
+            <method>
+                <description>description_12</description>
+                <method-name>name_12</method-name>
+                <method-params>
+                    <method-param>parms_12</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_13</description>
+                <method-intf>Remote</method-intf>
+                <method-name>name_13</method-name>
+                <method-params>
+                    <method-param>parms_13</method-param>
+                    <method-param>parms_14</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_14</description>
+                <method-intf>Home</method-intf>
+                <method-name>name_14</method-name>
+                <method-params>
+                    <method-param>parms_15</method-param>
+                    <method-param>parms_16</method-param>
+                    <method-param>parms_17</method-param>
+                </method-params>
+            </method>
+        </method-permission>
+        <method-permission>
+            <description>description_3</description>
+            <method>
+                <description>description_15</description>
+                <method-intf>Local</method-intf>
+                <method-name>name_15</method-name>
+            </method>
+            <method>
+                <description>description_16</description>
+                <method-intf>LocalHome</method-intf>
+                <method-name>name_16</method-name>
+                <method-params/>
+            </method>
+            <method>
+                <description>description_17</description>
+                <method-intf>ServiceEndpoint</method-intf>
+                <method-name>name_17</method-name>
+                <method-params>
+                    <method-param>parms_18</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_18</description>
+                <method-name>name_18</method-name>
+                <method-params>
+                    <method-param>parms_19</method-param>
+                    <method-param>parms_20</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_19</description>
+                <method-intf>Remote</method-intf>
+                <method-name>name_19</method-name>
+                <method-params>
+                    <method-param>parms_21</method-param>
+                    <method-param>parms_22</method-param>
+                    <method-param>parms_23</method-param>
+                </method-params>
+            </method>
+        </method-permission>
+        <method-permission>
+            <description>description_4</description>
+            <unchecked/>
+            <method>
+                <description>description_20</description>
+                <method-intf>Home</method-intf>
+                <method-name>name_20</method-name>
+            </method>
+            <method>
+                <description>description_21</description>
+                <method-intf>Local</method-intf>
+                <method-name>name_21</method-name>
+                <method-params/>
+            </method>
+            <method>
+                <description>description_22</description>
+                <method-intf>LocalHome</method-intf>
+                <method-name>name_22</method-name>
+                <method-params>
+                    <method-param>parms_24</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_23</description>
+                <method-intf>ServiceEndpoint</method-intf>
+                <method-name>name_23</method-name>
+                <method-params>
+                    <method-param>parms_25</method-param>
+                    <method-param>parms_26</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_24</description>
+                <method-name>name_24</method-name>
+                <method-params>
+                    <method-param>parms_27</method-param>
+                    <method-param>parms_28</method-param>
+                    <method-param>parms_29</method-param>
+                </method-params>
+            </method>
+        </method-permission>
+        <container-transaction>
+            <description>description_0</description>
+            <method>
+                <description>description_25</description>
+                <method-intf>Remote</method-intf>
+                <method-name>name_25</method-name>
+            </method>
+            <method>
+                <description>description_26</description>
+                <method-intf>Home</method-intf>
+                <method-name>name_26</method-name>
+                <method-params/>
+            </method>
+            <method>
+                <description>description_27</description>
+                <method-intf>Local</method-intf>
+                <method-name>name_27</method-name>
+                <method-params>
+                    <method-param>parms_30</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_28</description>
+                <method-intf>LocalHome</method-intf>
+                <method-name>name_28</method-name>
+                <method-params>
+                    <method-param>parms_31</method-param>
+                    <method-param>parms_32</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_29</description>
+                <method-intf>ServiceEndpoint</method-intf>
+                <method-name>name_29</method-name>
+                <method-params>
+                    <method-param>parms_33</method-param>
+                    <method-param>parms_34</method-param>
+                    <method-param>parms_35</method-param>
+                </method-params>
+            </method>
+            <trans-attribute>NotSupported</trans-attribute>
+        </container-transaction>
+        <container-transaction>
+            <description>description_1</description>
+            <method>
+                <description>description_30</description>
+                <method-name>name_30</method-name>
+            </method>
+            <method>
+                <description>description_31</description>
+                <method-intf>Remote</method-intf>
+                <method-name>name_31</method-name>
+                <method-params/>
+            </method>
+            <method>
+                <description>description_32</description>
+                <method-intf>Home</method-intf>
+                <method-name>name_32</method-name>
+                <method-params>
+                    <method-param>parms_36</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_33</description>
+                <method-intf>Local</method-intf>
+                <method-name>name_33</method-name>
+                <method-params>
+                    <method-param>parms_37</method-param>
+                    <method-param>parms_38</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_34</description>
+                <method-intf>LocalHome</method-intf>
+                <method-name>name_34</method-name>
+                <method-params>
+                    <method-param>parms_39</method-param>
+                    <method-param>parms_40</method-param>
+                    <method-param>parms_41</method-param>
+                </method-params>
+            </method>
+            <trans-attribute>Supports</trans-attribute>
+        </container-transaction>
+        <container-transaction>
+            <description>description_2</description>
+            <method>
+                <description>description_35</description>
+                <method-intf>ServiceEndpoint</method-intf>
+                <method-name>name_35</method-name>
+            </method>
+            <method>
+                <description>description_36</description>
+                <method-name>name_36</method-name>
+                <method-params/>
+            </method>
+            <method>
+                <description>description_37</description>
+                <method-intf>Remote</method-intf>
+                <method-name>name_37</method-name>
+                <method-params>
+                    <method-param>parms_42</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_38</description>
+                <method-intf>Home</method-intf>
+                <method-name>name_38</method-name>
+                <method-params>
+                    <method-param>parms_43</method-param>
+                    <method-param>parms_44</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_39</description>
+                <method-intf>Local</method-intf>
+                <method-name>name_39</method-name>
+                <method-params>
+                    <method-param>parms_45</method-param>
+                    <method-param>parms_46</method-param>
+                    <method-param>parms_47</method-param>
+                </method-params>
+            </method>
+            <trans-attribute>Required</trans-attribute>
+        </container-transaction>
+        <container-transaction>
+            <description>description_3</description>
+            <method>
+                <description>description_40</description>
+                <method-intf>LocalHome</method-intf>
+                <method-name>name_40</method-name>
+            </method>
+            <method>
+                <description>description_41</description>
+                <method-intf>ServiceEndpoint</method-intf>
+                <method-name>name_41</method-name>
+                <method-params/>
+            </method>
+            <method>
+                <description>description_42</description>
+                <method-name>name_42</method-name>
+                <method-params>
+                    <method-param>parms_48</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_43</description>
+                <method-intf>Remote</method-intf>
+                <method-name>name_43</method-name>
+                <method-params>
+                    <method-param>parms_49</method-param>
+                    <method-param>parms_50</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_44</description>
+                <method-intf>Home</method-intf>
+                <method-name>name_44</method-name>
+                <method-params>
+                    <method-param>parms_51</method-param>
+                    <method-param>parms_52</method-param>
+                    <method-param>parms_53</method-param>
+                </method-params>
+            </method>
+            <trans-attribute>RequiresNew</trans-attribute>
+        </container-transaction>
+        <container-transaction>
+            <description>description_4</description>
+            <method>
+                <description>description_45</description>
+                <method-intf>Local</method-intf>
+                <method-name>name_45</method-name>
+            </method>
+            <method>
+                <description>description_46</description>
+                <method-intf>LocalHome</method-intf>
+                <method-name>name_46</method-name>
+                <method-params/>
+            </method>
+            <method>
+                <description>description_47</description>
+                <method-intf>ServiceEndpoint</method-intf>
+                <method-name>name_47</method-name>
+                <method-params>
+                    <method-param>parms_54</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_48</description>
+                <method-name>name_48</method-name>
+                <method-params>
+                    <method-param>parms_55</method-param>
+                    <method-param>parms_56</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_49</description>
+                <method-intf>Remote</method-intf>
+                <method-name>name_49</method-name>
+                <method-params>
+                    <method-param>parms_57</method-param>
+                    <method-param>parms_58</method-param>
+                    <method-param>parms_59</method-param>
+                </method-params>
+            </method>
+            <trans-attribute>Mandatory</trans-attribute>
+        </container-transaction>
+        <exclude-list>
+            <description>description_0</description>
+            <method>
+                <description>description_50</description>
+                <method-intf>Home</method-intf>
+                <method-name>name_50</method-name>
+            </method>
+            <method>
+                <description>description_51</description>
+                <method-intf>Local</method-intf>
+                <method-name>name_51</method-name>
+                <method-params/>
+            </method>
+            <method>
+                <description>description_52</description>
+                <method-intf>LocalHome</method-intf>
+                <method-name>name_52</method-name>
+                <method-params>
+                    <method-param>parms_60</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_53</description>
+                <method-intf>ServiceEndpoint</method-intf>
+                <method-name>name_53</method-name>
+                <method-params>
+                    <method-param>parms_61</method-param>
+                    <method-param>parms_62</method-param>
+                </method-params>
+            </method>
+            <method>
+                <description>description_54</description>
+                <method-name>name_54</method-name>
+                <method-params>
+                    <method-param>parms_63</method-param>
+                    <method-param>parms_64</method-param>
+                    <method-param>parms_65</method-param>
+                </method-params>
+            </method>
+        </exclude-list>
+    </assembly-descriptor>
+    <ejb-client-jar>ejbClientJar_0</ejb-client-jar>
+</ejb-jar>
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/EMFTests/ra.xml b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/EMFTests/ra.xml
new file mode 100644
index 0000000..e0816ae
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/EMFTests/ra.xml
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE connector PUBLIC "-//Sun Microsystems, Inc.//DTD Connector 1.0//EN" "http://java.sun.com/dtd/connector_1_0.dtd">
+
+   <connector id="Connector_ID">
+      <display-name>displayName_0</display-name>
+      <description>description_0</description>
+      <icon>
+         <small-icon>smallIcon_0</small-icon>
+         <large-icon>largeIcon_0</large-icon>
+      </icon>
+      <vendor-name>vendorName_0</vendor-name>
+      <spec-version>1.0</spec-version>
+      <eis-type>eisType_0</eis-type>
+      <version>1.0</version>
+      <license>
+         <description>description_0</description>
+         <license-required>true</license-required>
+      </license>
+      <resourceadapter id="ResourceAdapter_1051639769087">
+         <managedconnectionfactory-class>managedConnectionFactoryClass_0</managedconnectionfactory-class>
+         <connectionfactory-interface>connectionFactoryInterface_0</connectionfactory-interface>
+         <connectionfactory-impl-class>connectionFactoryImplClass_0</connectionfactory-impl-class>
+         <connection-interface>connectionInterface_0</connection-interface>
+         <connection-impl-class>connectionImplClass_0</connection-impl-class>
+         <transaction-support>NoTransaction</transaction-support>
+         <config-property id="ConfigProperty_1051639769127">
+            <description>description_0</description>
+            <config-property-name>name_0</config-property-name>
+            <config-property-type>type_0</config-property-type>
+            <config-property-value>value_0</config-property-value>
+         </config-property>
+         <config-property id="ConfigProperty_1051639769128">
+            <description>description_1</description>
+            <config-property-name>name_1</config-property-name>
+            <config-property-type>type_1</config-property-type>
+            <config-property-value>value_1</config-property-value>
+         </config-property>
+         <config-property id="ConfigProperty_1051639769129">
+            <description>description_2</description>
+            <config-property-name>name_2</config-property-name>
+            <config-property-type>type_2</config-property-type>
+            <config-property-value>value_2</config-property-value>
+         </config-property>
+         <config-property id="ConfigProperty_1051639769130">
+            <description>description_3</description>
+            <config-property-name>name_3</config-property-name>
+            <config-property-type>type_3</config-property-type>
+            <config-property-value>value_3</config-property-value>
+         </config-property>
+         <config-property id="ConfigProperty_1051639769131">
+            <description>description_4</description>
+            <config-property-name>name_4</config-property-name>
+            <config-property-type>type_4</config-property-type>
+            <config-property-value>value_4</config-property-value>
+         </config-property>
+         <authentication-mechanism id="AuthenticationMechanism_1051639769147">
+            <description>description_0</description>
+            <authentication-mechanism-type>BasicPassword</authentication-mechanism-type>
+            <credential-interface>credentialInterface_0</credential-interface>
+         </authentication-mechanism>
+         <authentication-mechanism id="AuthenticationMechanism_1051639769148">
+            <description>description_1</description>
+            <authentication-mechanism-type>Kerbv5</authentication-mechanism-type>
+            <credential-interface>credentialInterface_1</credential-interface>
+         </authentication-mechanism>
+         <authentication-mechanism id="AuthenticationMechanism_1051639769149">
+            <description>description_2</description>
+            <authentication-mechanism-type>BasicPassword</authentication-mechanism-type>
+            <credential-interface>credentialInterface_2</credential-interface>
+         </authentication-mechanism>
+         <authentication-mechanism id="AuthenticationMechanism_1051639769150">
+            <description>description_3</description>
+            <authentication-mechanism-type>Kerbv5</authentication-mechanism-type>
+            <credential-interface>credentialInterface_3</credential-interface>
+         </authentication-mechanism>
+         <authentication-mechanism id="AuthenticationMechanism_1051639769151">
+            <description>description_4</description>
+            <authentication-mechanism-type>BasicPassword</authentication-mechanism-type>
+            <credential-interface>credentialInterface_4</credential-interface>
+         </authentication-mechanism>
+         <reauthentication-support>true</reauthentication-support>
+         <security-permission id="SecurityPermission_1051639769167">
+            <description>description_0</description>
+            <security-permission-spec>specification_0</security-permission-spec>
+         </security-permission>
+         <security-permission id="SecurityPermission_1051639769177">
+            <description>description_1</description>
+            <security-permission-spec>specification_1</security-permission-spec>
+         </security-permission>
+         <security-permission id="SecurityPermission_1051639769178">
+            <description>description_2</description>
+            <security-permission-spec>specification_2</security-permission-spec>
+         </security-permission>
+         <security-permission id="SecurityPermission_1051639769179">
+            <description>description_3</description>
+            <security-permission-spec>specification_3</security-permission-spec>
+         </security-permission>
+         <security-permission id="SecurityPermission_1051639769180">
+            <description>description_4</description>
+            <security-permission-spec>specification_4</security-permission-spec>
+         </security-permission>
+      </resourceadapter>
+   </connector>
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/EMFTests/web.xml b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/EMFTests/web.xml
new file mode 100644
index 0000000..27831b0
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/EMFTests/web.xml
@@ -0,0 +1,1285 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
+
+   <web-app id="WebApp_ID">
+      <icon>
+         <small-icon>smallIcon_0</small-icon>
+         <large-icon>largeIcon_0</large-icon>
+      </icon>
+      <display-name>displayName_0</display-name>
+      <description>description_0</description>
+      <distributable></distributable>
+      <context-param id="ContextParam_1051643499852">
+         <param-name>paramName_0</param-name>
+         <param-value>paramValue_0</param-value>
+         <description>description_0</description>
+      </context-param>
+      <context-param id="ContextParam_1051643499853">
+         <param-name>paramName_1</param-name>
+         <param-value>paramValue_1</param-value>
+         <description>description_1</description>
+      </context-param>
+      <context-param id="ContextParam_1051643499862">
+         <param-name>paramName_2</param-name>
+         <param-value>paramValue_2</param-value>
+         <description>description_2</description>
+      </context-param>
+      <context-param id="ContextParam_1051643499863">
+         <param-name>paramName_3</param-name>
+         <param-value>paramValue_3</param-value>
+         <description>description_3</description>
+      </context-param>
+      <context-param id="ContextParam_1051643499872">
+         <param-name>paramName_4</param-name>
+         <param-value>paramValue_4</param-value>
+         <description>description_4</description>
+      </context-param>
+      <filter id="Filter_1051643499902">
+         <icon>
+            <small-icon>smallIcon_0</small-icon>
+            <large-icon>largeIcon_0</large-icon>
+         </icon>
+         <filter-name>name_0</filter-name>
+         <display-name>displayName_0</display-name>
+         <description>description_0</description>
+         <filter-class>java.lang.Integer</filter-class>
+         <init-param id="InitParam_1051643500002">
+            <param-name>paramName_25</param-name>
+            <param-value>paramValue_25</param-value>
+            <description>description_25</description>
+         </init-param>
+         <init-param id="InitParam_1051643500003">
+            <param-name>paramName_26</param-name>
+            <param-value>paramValue_26</param-value>
+            <description>description_26</description>
+         </init-param>
+         <init-param id="InitParam_1051643500004">
+            <param-name>paramName_27</param-name>
+            <param-value>paramValue_27</param-value>
+            <description>description_27</description>
+         </init-param>
+         <init-param id="InitParam_1051643500005">
+            <param-name>paramName_28</param-name>
+            <param-value>paramValue_28</param-value>
+            <description>description_28</description>
+         </init-param>
+         <init-param id="InitParam_1051643500006">
+            <param-name>paramName_29</param-name>
+            <param-value>paramValue_29</param-value>
+            <description>description_29</description>
+         </init-param>
+      </filter>
+      <filter id="Filter_1051643500002">
+         <icon>
+            <small-icon>smallIcon_1</small-icon>
+            <large-icon>largeIcon_1</large-icon>
+         </icon>
+         <filter-name>name_1</filter-name>
+         <display-name>displayName_1</display-name>
+         <description>description_1</description>
+         <filter-class>java.lang.String</filter-class>
+         <init-param id="InitParam_1051643500007">
+            <param-name>paramName_30</param-name>
+            <param-value>paramValue_30</param-value>
+            <description>description_30</description>
+         </init-param>
+         <init-param id="InitParam_1051643500012">
+            <param-name>paramName_31</param-name>
+            <param-value>paramValue_31</param-value>
+            <description>description_31</description>
+         </init-param>
+         <init-param id="InitParam_1051643500013">
+            <param-name>paramName_32</param-name>
+            <param-value>paramValue_32</param-value>
+            <description>description_32</description>
+         </init-param>
+         <init-param id="InitParam_1051643500014">
+            <param-name>paramName_33</param-name>
+            <param-value>paramValue_33</param-value>
+            <description>description_33</description>
+         </init-param>
+         <init-param id="InitParam_1051643500015">
+            <param-name>paramName_34</param-name>
+            <param-value>paramValue_34</param-value>
+            <description>description_34</description>
+         </init-param>
+      </filter>
+      <filter id="Filter_1051643500012">
+         <icon>
+            <small-icon>smallIcon_2</small-icon>
+            <large-icon>largeIcon_2</large-icon>
+         </icon>
+         <filter-name>name_2</filter-name>
+         <display-name>displayName_2</display-name>
+         <description>description_2</description>
+         <filter-class>java.util.HashTable</filter-class>
+         <init-param id="InitParam_1051643500016">
+            <param-name>paramName_35</param-name>
+            <param-value>paramValue_35</param-value>
+            <description>description_35</description>
+         </init-param>
+         <init-param id="InitParam_1051643500017">
+            <param-name>paramName_36</param-name>
+            <param-value>paramValue_36</param-value>
+            <description>description_36</description>
+         </init-param>
+         <init-param id="InitParam_1051643500018">
+            <param-name>paramName_37</param-name>
+            <param-value>paramValue_37</param-value>
+            <description>description_37</description>
+         </init-param>
+         <init-param id="InitParam_1051643500019">
+            <param-name>paramName_38</param-name>
+            <param-value>paramValue_38</param-value>
+            <description>description_38</description>
+         </init-param>
+         <init-param id="InitParam_1051643500020">
+            <param-name>paramName_39</param-name>
+            <param-value>paramValue_39</param-value>
+            <description>description_39</description>
+         </init-param>
+      </filter>
+      <filter id="Filter_1051643500013">
+         <icon>
+            <small-icon>smallIcon_3</small-icon>
+            <large-icon>largeIcon_3</large-icon>
+         </icon>
+         <filter-name>name_3</filter-name>
+         <display-name>displayName_3</display-name>
+         <description>description_3</description>
+         <filter-class>java.util.List</filter-class>
+         <init-param id="InitParam_1051643500021">
+            <param-name>paramName_40</param-name>
+            <param-value>paramValue_40</param-value>
+            <description>description_40</description>
+         </init-param>
+         <init-param id="InitParam_1051643500022">
+            <param-name>paramName_41</param-name>
+            <param-value>paramValue_41</param-value>
+            <description>description_41</description>
+         </init-param>
+         <init-param id="InitParam_1051643500032">
+            <param-name>paramName_42</param-name>
+            <param-value>paramValue_42</param-value>
+            <description>description_42</description>
+         </init-param>
+         <init-param id="InitParam_1051643500033">
+            <param-name>paramName_43</param-name>
+            <param-value>paramValue_43</param-value>
+            <description>description_43</description>
+         </init-param>
+         <init-param id="InitParam_1051643500034">
+            <param-name>paramName_44</param-name>
+            <param-value>paramValue_44</param-value>
+            <description>description_44</description>
+         </init-param>
+      </filter>
+      <filter id="Filter_1051643500032">
+         <icon>
+            <small-icon>smallIcon_4</small-icon>
+            <large-icon>largeIcon_4</large-icon>
+         </icon>
+         <filter-name>name_4</filter-name>
+         <display-name>displayName_4</display-name>
+         <description>description_4</description>
+         <filter-class>java.sql.Data</filter-class>
+         <init-param id="InitParam_1051643500035">
+            <param-name>paramName_45</param-name>
+            <param-value>paramValue_45</param-value>
+            <description>description_45</description>
+         </init-param>
+         <init-param id="InitParam_1051643500036">
+            <param-name>paramName_46</param-name>
+            <param-value>paramValue_46</param-value>
+            <description>description_46</description>
+         </init-param>
+         <init-param id="InitParam_1051643500037">
+            <param-name>paramName_47</param-name>
+            <param-value>paramValue_47</param-value>
+            <description>description_47</description>
+         </init-param>
+         <init-param id="InitParam_1051643500038">
+            <param-name>paramName_48</param-name>
+            <param-value>paramValue_48</param-value>
+            <description>description_48</description>
+         </init-param>
+         <init-param id="InitParam_1051643500042">
+            <param-name>paramName_49</param-name>
+            <param-value>paramValue_49</param-value>
+            <description>description_49</description>
+         </init-param>
+      </filter>
+      <filter-mapping id="FilterMapping_1051643500082">
+         <filter-name>name_0</filter-name>
+         <url-pattern>urlPattern_0</url-pattern>
+      </filter-mapping>
+      <filter-mapping id="FilterMapping_1051643500083">
+         <filter-name>name_1</filter-name>
+         <url-pattern>urlPattern_1</url-pattern>
+      </filter-mapping>
+      <filter-mapping id="FilterMapping_1051643500084">
+         <filter-name>name_2</filter-name>
+         <url-pattern>urlPattern_2</url-pattern>
+      </filter-mapping>
+      <filter-mapping id="FilterMapping_1051643500085">
+         <filter-name>name_3</filter-name>
+         <url-pattern>urlPattern_3</url-pattern>
+      </filter-mapping>
+      <filter-mapping id="FilterMapping_1051643500086">
+         <filter-name>name_4</filter-name>
+         <url-pattern>urlPattern_4</url-pattern>
+      </filter-mapping>
+      <listener id="Listener_1051643500112">
+         <listener-class>java.lang.Integer</listener-class>
+      </listener>
+      <listener id="Listener_1051643500113">
+         <listener-class>java.lang.String</listener-class>
+      </listener>
+      <listener id="Listener_1051643500114">
+         <listener-class>java.util.HashTable</listener-class>
+      </listener>
+      <listener id="Listener_1051643500115">
+         <listener-class>java.util.List</listener-class>
+      </listener>
+      <listener id="Listener_1051643500116">
+         <listener-class>java.sql.Data</listener-class>
+      </listener>
+      <servlet id="Servlet_1051643500212">
+         <icon>
+            <small-icon>smallIcon_0</small-icon>
+            <large-icon>largeIcon_0</large-icon>
+         </icon>
+         <servlet-name>servletName_0</servlet-name>
+         <display-name>displayName_0</display-name>
+         <description>description_0</description>
+         <jsp-file>jspFile_0</jsp-file>
+         <init-param id="InitParam_1051643500232">
+            <param-name>paramName_0</param-name>
+            <param-value>paramValue_0</param-value>
+            <description>description_0</description>
+         </init-param>
+         <init-param id="InitParam_1051643500233">
+            <param-name>paramName_1</param-name>
+            <param-value>paramValue_1</param-value>
+            <description>description_1</description>
+         </init-param>
+         <init-param id="InitParam_1051643500234">
+            <param-name>paramName_2</param-name>
+            <param-value>paramValue_2</param-value>
+            <description>description_2</description>
+         </init-param>
+         <init-param id="InitParam_1051643500235">
+            <param-name>paramName_3</param-name>
+            <param-value>paramValue_3</param-value>
+            <description>description_3</description>
+         </init-param>
+         <init-param id="InitParam_1051643500236">
+            <param-name>paramName_4</param-name>
+            <param-value>paramValue_4</param-value>
+            <description>description_4</description>
+         </init-param>
+         <load-on-startup>0</load-on-startup>
+         <run-as id="RunAsSpecifiedIdentity_1051643500232">
+            <description>description_0</description>
+            <role-name>roleName_0</role-name>
+         </run-as>
+         <security-role-ref id="SecurityRoleRef_1051643500272">
+            <description>description_0</description>
+            <role-name>name_0</role-name>
+            <role-link>link_0</role-link>
+         </security-role-ref>
+         <security-role-ref id="SecurityRoleRef_1051643500273">
+            <description>description_1</description>
+            <role-name>name_1</role-name>
+            <role-link>link_1</role-link>
+         </security-role-ref>
+         <security-role-ref id="SecurityRoleRef_1051643500274">
+            <description>description_2</description>
+            <role-name>name_2</role-name>
+            <role-link>link_2</role-link>
+         </security-role-ref>
+         <security-role-ref id="SecurityRoleRef_1051643500275">
+            <description>description_3</description>
+            <role-name>name_3</role-name>
+            <role-link>link_3</role-link>
+         </security-role-ref>
+         <security-role-ref id="SecurityRoleRef_1051643500276">
+            <description>description_4</description>
+            <role-name>name_4</role-name>
+            <role-link>link_4</role-link>
+         </security-role-ref>
+      </servlet>
+      <servlet id="Servlet_1051643500272">
+         <icon>
+            <small-icon>smallIcon_1</small-icon>
+            <large-icon>largeIcon_1</large-icon>
+         </icon>
+         <servlet-name>servletName_1</servlet-name>
+         <display-name>displayName_1</display-name>
+         <description>description_1</description>
+         <servlet-class>className_0</servlet-class>
+         <init-param id="InitParam_1051643500272">
+            <param-name>paramName_5</param-name>
+            <param-value>paramValue_5</param-value>
+            <description>description_5</description>
+         </init-param>
+         <init-param id="InitParam_1051643500273">
+            <param-name>paramName_6</param-name>
+            <param-value>paramValue_6</param-value>
+            <description>description_6</description>
+         </init-param>
+         <init-param id="InitParam_1051643500274">
+            <param-name>paramName_7</param-name>
+            <param-value>paramValue_7</param-value>
+            <description>description_7</description>
+         </init-param>
+         <init-param id="InitParam_1051643500275">
+            <param-name>paramName_8</param-name>
+            <param-value>paramValue_8</param-value>
+            <description>description_8</description>
+         </init-param>
+         <init-param id="InitParam_1051643500276">
+            <param-name>paramName_9</param-name>
+            <param-value>paramValue_9</param-value>
+            <description>description_9</description>
+         </init-param>
+         <load-on-startup>1</load-on-startup>
+         <run-as id="RunAsSpecifiedIdentity_1051643500272">
+            <description>description_1</description>
+            <role-name>roleName_1</role-name>
+         </run-as>
+         <security-role-ref id="SecurityRoleRef_1051643500277">
+            <description>description_5</description>
+            <role-name>name_5</role-name>
+            <role-link>link_5</role-link>
+         </security-role-ref>
+         <security-role-ref id="SecurityRoleRef_1051643500278">
+            <description>description_6</description>
+            <role-name>name_6</role-name>
+            <role-link>link_6</role-link>
+         </security-role-ref>
+         <security-role-ref id="SecurityRoleRef_1051643500282">
+            <description>description_7</description>
+            <role-name>name_7</role-name>
+            <role-link>link_7</role-link>
+         </security-role-ref>
+         <security-role-ref id="SecurityRoleRef_1051643500283">
+            <description>description_8</description>
+            <role-name>name_8</role-name>
+            <role-link>link_8</role-link>
+         </security-role-ref>
+         <security-role-ref id="SecurityRoleRef_1051643500284">
+            <description>description_9</description>
+            <role-name>name_9</role-name>
+            <role-link>link_9</role-link>
+         </security-role-ref>
+      </servlet>
+      <servlet id="Servlet_1051643500282">
+         <icon>
+            <small-icon>smallIcon_2</small-icon>
+            <large-icon>largeIcon_2</large-icon>
+         </icon>
+         <servlet-name>servletName_2</servlet-name>
+         <display-name>displayName_2</display-name>
+         <description>description_2</description>
+         <jsp-file>jspFile_1</jsp-file>
+         <init-param id="InitParam_1051643500282">
+            <param-name>paramName_10</param-name>
+            <param-value>paramValue_10</param-value>
+            <description>description_10</description>
+         </init-param>
+         <init-param id="InitParam_1051643500283">
+            <param-name>paramName_11</param-name>
+            <param-value>paramValue_11</param-value>
+            <description>description_11</description>
+         </init-param>
+         <init-param id="InitParam_1051643500284">
+            <param-name>paramName_12</param-name>
+            <param-value>paramValue_12</param-value>
+            <description>description_12</description>
+         </init-param>
+         <init-param id="InitParam_1051643500285">
+            <param-name>paramName_13</param-name>
+            <param-value>paramValue_13</param-value>
+            <description>description_13</description>
+         </init-param>
+         <init-param id="InitParam_1051643500286">
+            <param-name>paramName_14</param-name>
+            <param-value>paramValue_14</param-value>
+            <description>description_14</description>
+         </init-param>
+         <load-on-startup>2</load-on-startup>
+         <run-as id="RunAsSpecifiedIdentity_1051643500282">
+            <description>description_2</description>
+            <role-name>roleName_2</role-name>
+         </run-as>
+         <security-role-ref id="SecurityRoleRef_1051643500285">
+            <description>description_10</description>
+            <role-name>name_10</role-name>
+            <role-link>link_10</role-link>
+         </security-role-ref>
+         <security-role-ref id="SecurityRoleRef_1051643500286">
+            <description>description_11</description>
+            <role-name>name_11</role-name>
+            <role-link>link_11</role-link>
+         </security-role-ref>
+         <security-role-ref id="SecurityRoleRef_1051643500287">
+            <description>description_12</description>
+            <role-name>name_12</role-name>
+            <role-link>link_12</role-link>
+         </security-role-ref>
+         <security-role-ref id="SecurityRoleRef_1051643500288">
+            <description>description_13</description>
+            <role-name>name_13</role-name>
+            <role-link>link_13</role-link>
+         </security-role-ref>
+         <security-role-ref id="SecurityRoleRef_1051643500289">
+            <description>description_14</description>
+            <role-name>name_14</role-name>
+            <role-link>link_14</role-link>
+         </security-role-ref>
+      </servlet>
+      <servlet id="Servlet_1051643500283">
+         <icon>
+            <small-icon>smallIcon_3</small-icon>
+            <large-icon>largeIcon_3</large-icon>
+         </icon>
+         <servlet-name>servletName_3</servlet-name>
+         <display-name>displayName_3</display-name>
+         <description>description_3</description>
+         <servlet-class>className_1</servlet-class>
+         <init-param id="InitParam_1051643500287">
+            <param-name>paramName_15</param-name>
+            <param-value>paramValue_15</param-value>
+            <description>description_15</description>
+         </init-param>
+         <init-param id="InitParam_1051643500288">
+            <param-name>paramName_16</param-name>
+            <param-value>paramValue_16</param-value>
+            <description>description_16</description>
+         </init-param>
+         <init-param id="InitParam_1051643500292">
+            <param-name>paramName_17</param-name>
+            <param-value>paramValue_17</param-value>
+            <description>description_17</description>
+         </init-param>
+         <init-param id="InitParam_1051643500293">
+            <param-name>paramName_18</param-name>
+            <param-value>paramValue_18</param-value>
+            <description>description_18</description>
+         </init-param>
+         <init-param id="InitParam_1051643500294">
+            <param-name>paramName_19</param-name>
+            <param-value>paramValue_19</param-value>
+            <description>description_19</description>
+         </init-param>
+         <load-on-startup>3</load-on-startup>
+         <run-as id="RunAsSpecifiedIdentity_1051643500292">
+            <description>description_3</description>
+            <role-name>roleName_3</role-name>
+         </run-as>
+         <security-role-ref id="SecurityRoleRef_1051643500292">
+            <description>description_15</description>
+            <role-name>name_15</role-name>
+            <role-link>link_15</role-link>
+         </security-role-ref>
+         <security-role-ref id="SecurityRoleRef_1051643500293">
+            <description>description_16</description>
+            <role-name>name_16</role-name>
+            <role-link>link_16</role-link>
+         </security-role-ref>
+         <security-role-ref id="SecurityRoleRef_1051643500294">
+            <description>description_17</description>
+            <role-name>name_17</role-name>
+            <role-link>link_17</role-link>
+         </security-role-ref>
+         <security-role-ref id="SecurityRoleRef_1051643500295">
+            <description>description_18</description>
+            <role-name>name_18</role-name>
+            <role-link>link_18</role-link>
+         </security-role-ref>
+         <security-role-ref id="SecurityRoleRef_1051643500296">
+            <description>description_19</description>
+            <role-name>name_19</role-name>
+            <role-link>link_19</role-link>
+         </security-role-ref>
+      </servlet>
+      <servlet id="Servlet_1051643500292">
+         <icon>
+            <small-icon>smallIcon_4</small-icon>
+            <large-icon>largeIcon_4</large-icon>
+         </icon>
+         <servlet-name>servletName_4</servlet-name>
+         <display-name>displayName_4</display-name>
+         <description>description_4</description>
+         <jsp-file>jspFile_2</jsp-file>
+         <init-param id="InitParam_1051643500295">
+            <param-name>paramName_20</param-name>
+            <param-value>paramValue_20</param-value>
+            <description>description_20</description>
+         </init-param>
+         <init-param id="InitParam_1051643500296">
+            <param-name>paramName_21</param-name>
+            <param-value>paramValue_21</param-value>
+            <description>description_21</description>
+         </init-param>
+         <init-param id="InitParam_1051643500297">
+            <param-name>paramName_22</param-name>
+            <param-value>paramValue_22</param-value>
+            <description>description_22</description>
+         </init-param>
+         <init-param id="InitParam_1051643500298">
+            <param-name>paramName_23</param-name>
+            <param-value>paramValue_23</param-value>
+            <description>description_23</description>
+         </init-param>
+         <init-param id="InitParam_1051643500299">
+            <param-name>paramName_24</param-name>
+            <param-value>paramValue_24</param-value>
+            <description>description_24</description>
+         </init-param>
+         <load-on-startup>4</load-on-startup>
+         <run-as id="RunAsSpecifiedIdentity_1051643500293">
+            <description>description_4</description>
+            <role-name>roleName_4</role-name>
+         </run-as>
+         <security-role-ref id="SecurityRoleRef_1051643500297">
+            <description>description_20</description>
+            <role-name>name_20</role-name>
+            <role-link>link_20</role-link>
+         </security-role-ref>
+         <security-role-ref id="SecurityRoleRef_1051643500298">
+            <description>description_21</description>
+            <role-name>name_21</role-name>
+            <role-link>link_21</role-link>
+         </security-role-ref>
+         <security-role-ref id="SecurityRoleRef_1051643500299">
+            <description>description_22</description>
+            <role-name>name_22</role-name>
+            <role-link>link_22</role-link>
+         </security-role-ref>
+         <security-role-ref id="SecurityRoleRef_1051643500300">
+            <description>description_23</description>
+            <role-name>name_23</role-name>
+            <role-link>link_23</role-link>
+         </security-role-ref>
+         <security-role-ref id="SecurityRoleRef_1051643500301">
+            <description>description_24</description>
+            <role-name>name_24</role-name>
+            <role-link>link_24</role-link>
+         </security-role-ref>
+      </servlet>
+      <servlet-mapping id="ServletMapping_1051643500312">
+         <servlet-name>servletName_0</servlet-name>
+         <url-pattern>urlPattern_0</url-pattern>
+      </servlet-mapping>
+      <servlet-mapping id="ServletMapping_1051643500313">
+         <servlet-name>servletName_1</servlet-name>
+         <url-pattern>urlPattern_1</url-pattern>
+      </servlet-mapping>
+      <servlet-mapping id="ServletMapping_1051643500314">
+         <servlet-name>servletName_2</servlet-name>
+         <url-pattern>urlPattern_2</url-pattern>
+      </servlet-mapping>
+      <servlet-mapping id="ServletMapping_1051643500315">
+         <servlet-name>servletName_3</servlet-name>
+         <url-pattern>urlPattern_3</url-pattern>
+      </servlet-mapping>
+      <servlet-mapping id="ServletMapping_1051643500316">
+         <servlet-name>servletName_4</servlet-name>
+         <url-pattern>urlPattern_4</url-pattern>
+      </servlet-mapping>
+      <session-config id="SessionConfig_1051643500312">
+         <session-timeout>0</session-timeout>
+      </session-config>
+      <mime-mapping id="MimeMapping_1051643500332">
+         <extension>extension_0</extension>
+         <mime-type>mimeType_0</mime-type>
+      </mime-mapping>
+      <mime-mapping id="MimeMapping_1051643500333">
+         <extension>extension_1</extension>
+         <mime-type>mimeType_1</mime-type>
+      </mime-mapping>
+      <mime-mapping id="MimeMapping_1051643500334">
+         <extension>extension_2</extension>
+         <mime-type>mimeType_2</mime-type>
+      </mime-mapping>
+      <mime-mapping id="MimeMapping_1051643500335">
+         <extension>extension_3</extension>
+         <mime-type>mimeType_3</mime-type>
+      </mime-mapping>
+      <mime-mapping id="MimeMapping_1051643500336">
+         <extension>extension_4</extension>
+         <mime-type>mimeType_4</mime-type>
+      </mime-mapping>
+      <welcome-file-list id="WelcomeFileList_1051643500332">
+         <welcome-file>welcomeFile_0</welcome-file>
+         <welcome-file>welcomeFile_1</welcome-file>
+         <welcome-file>welcomeFile_2</welcome-file>
+         <welcome-file>welcomeFile_3</welcome-file>
+         <welcome-file>welcomeFile_4</welcome-file>
+      </welcome-file-list>
+      <error-page id="ExceptionTypeErrorPage_1051643500342">
+         <exception-type>java.util.HashTable</exception-type>
+         <location>location_0</location>
+      </error-page>
+      <error-page id="ErrorCodeErrorPage_1051643500342">
+         <error-code>errorCode_0</error-code>
+         <location>location_1</location>
+      </error-page>
+      <error-page id="ExceptionTypeErrorPage_1051643500343">
+         <exception-type>java.util.List</exception-type>
+         <location>location_2</location>
+      </error-page>
+      <error-page id="ErrorCodeErrorPage_1051643500343">
+         <error-code>errorCode_1</error-code>
+         <location>location_3</location>
+      </error-page>
+      <error-page id="ExceptionTypeErrorPage_1051643500352">
+         <exception-type>java.sql.Data</exception-type>
+         <location>location_4</location>
+      </error-page>
+      <taglib id="TagLibRef_1051643500362">
+         <taglib-uri>taglibURI_0</taglib-uri>
+         <taglib-location>taglibLocation_0</taglib-location>
+      </taglib>
+      <taglib id="TagLibRef_1051643500363">
+         <taglib-uri>taglibURI_1</taglib-uri>
+         <taglib-location>taglibLocation_1</taglib-location>
+      </taglib>
+      <taglib id="TagLibRef_1051643500364">
+         <taglib-uri>taglibURI_2</taglib-uri>
+         <taglib-location>taglibLocation_2</taglib-location>
+      </taglib>
+      <taglib id="TagLibRef_1051643500365">
+         <taglib-uri>taglibURI_3</taglib-uri>
+         <taglib-location>taglibLocation_3</taglib-location>
+      </taglib>
+      <taglib id="TagLibRef_1051643500366">
+         <taglib-uri>taglibURI_4</taglib-uri>
+         <taglib-location>taglibLocation_4</taglib-location>
+      </taglib>
+      <resource-env-ref id="ResourceEnvRef_1051643500382">
+         <description>description_0</description>
+         <resource-env-ref-name>name_0</resource-env-ref-name>
+         <resource-env-ref-type>java.lang.Integer</resource-env-ref-type>
+      </resource-env-ref>
+      <resource-env-ref id="ResourceEnvRef_1051643500383">
+         <description>description_1</description>
+         <resource-env-ref-name>name_1</resource-env-ref-name>
+         <resource-env-ref-type>java.lang.String</resource-env-ref-type>
+      </resource-env-ref>
+      <resource-env-ref id="ResourceEnvRef_1051643500384">
+         <description>description_2</description>
+         <resource-env-ref-name>name_2</resource-env-ref-name>
+         <resource-env-ref-type>java.util.HashTable</resource-env-ref-type>
+      </resource-env-ref>
+      <resource-env-ref id="ResourceEnvRef_1051643500385">
+         <description>description_3</description>
+         <resource-env-ref-name>name_3</resource-env-ref-name>
+         <resource-env-ref-type>java.util.List</resource-env-ref-type>
+      </resource-env-ref>
+      <resource-env-ref id="ResourceEnvRef_1051643500386">
+         <description>description_4</description>
+         <resource-env-ref-name>name_4</resource-env-ref-name>
+         <resource-env-ref-type>java.sql.Data</resource-env-ref-type>
+      </resource-env-ref>
+      <resource-ref id="ResourceRef_1051643500402">
+         <description>description_0</description>
+         <res-ref-name>name_0</res-ref-name>
+         <res-type>type_0</res-type>
+         <res-auth>Container</res-auth>
+         <res-sharing-scope>Shareable</res-sharing-scope>
+      </resource-ref>
+      <resource-ref id="ResourceRef_1051643500403">
+         <description>description_1</description>
+         <res-ref-name>name_1</res-ref-name>
+         <res-type>type_1</res-type>
+         <res-auth>Application</res-auth>
+         <res-sharing-scope>Unshareable</res-sharing-scope>
+      </resource-ref>
+      <resource-ref id="ResourceRef_1051643500404">
+         <description>description_2</description>
+         <res-ref-name>name_2</res-ref-name>
+         <res-type>type_2</res-type>
+         <res-auth>Container</res-auth>
+         <res-sharing-scope>Shareable</res-sharing-scope>
+      </resource-ref>
+      <resource-ref id="ResourceRef_1051643500405">
+         <description>description_3</description>
+         <res-ref-name>name_3</res-ref-name>
+         <res-type>type_3</res-type>
+         <res-auth>Application</res-auth>
+         <res-sharing-scope>Unshareable</res-sharing-scope>
+      </resource-ref>
+      <resource-ref id="ResourceRef_1051643500406">
+         <description>description_4</description>
+         <res-ref-name>name_4</res-ref-name>
+         <res-type>type_4</res-type>
+         <res-auth>Container</res-auth>
+         <res-sharing-scope>Shareable</res-sharing-scope>
+      </resource-ref>
+      <security-constraint id="SecurityConstraint_1051643500432">
+         <display-name>displayName_0</display-name>
+         <web-resource-collection id="WebResourceCollection_1051643500452">
+            <web-resource-name>webResourceName_0</web-resource-name>
+            <description>description_0</description>
+            <url-pattern>urlPattern_0</url-pattern>
+            <url-pattern>urlPattern_1</url-pattern>
+            <url-pattern>urlPattern_2</url-pattern>
+            <url-pattern>urlPattern_3</url-pattern>
+            <url-pattern>urlPattern_4</url-pattern>
+            <http-method>GET</http-method>
+            <http-method>POST</http-method>
+            <http-method>PUT</http-method>
+            <http-method>DELETE</http-method>
+            <http-method>HEAD</http-method>
+         </web-resource-collection>
+         <web-resource-collection id="WebResourceCollection_1051643500453">
+            <web-resource-name>webResourceName_1</web-resource-name>
+            <description>description_1</description>
+            <url-pattern>urlPattern_5</url-pattern>
+            <url-pattern>urlPattern_6</url-pattern>
+            <url-pattern>urlPattern_7</url-pattern>
+            <url-pattern>urlPattern_8</url-pattern>
+            <url-pattern>urlPattern_9</url-pattern>
+            <http-method>OPTIONS</http-method>
+            <http-method>TRACE</http-method>
+            <http-method>GET</http-method>
+            <http-method>POST</http-method>
+            <http-method>PUT</http-method>
+         </web-resource-collection>
+         <web-resource-collection id="WebResourceCollection_1051643500454">
+            <web-resource-name>webResourceName_2</web-resource-name>
+            <description>description_2</description>
+            <url-pattern>urlPattern_10</url-pattern>
+            <url-pattern>urlPattern_11</url-pattern>
+            <url-pattern>urlPattern_12</url-pattern>
+            <url-pattern>urlPattern_13</url-pattern>
+            <url-pattern>urlPattern_14</url-pattern>
+            <http-method>DELETE</http-method>
+            <http-method>HEAD</http-method>
+            <http-method>OPTIONS</http-method>
+            <http-method>TRACE</http-method>
+            <http-method>GET</http-method>
+         </web-resource-collection>
+         <web-resource-collection id="WebResourceCollection_1051643500455">
+            <web-resource-name>webResourceName_3</web-resource-name>
+            <description>description_3</description>
+            <url-pattern>urlPattern_15</url-pattern>
+            <url-pattern>urlPattern_16</url-pattern>
+            <url-pattern>urlPattern_17</url-pattern>
+            <url-pattern>urlPattern_18</url-pattern>
+            <url-pattern>urlPattern_19</url-pattern>
+            <http-method>POST</http-method>
+            <http-method>PUT</http-method>
+            <http-method>DELETE</http-method>
+            <http-method>HEAD</http-method>
+            <http-method>OPTIONS</http-method>
+         </web-resource-collection>
+         <web-resource-collection id="WebResourceCollection_1051643500462">
+            <web-resource-name>webResourceName_4</web-resource-name>
+            <description>description_4</description>
+            <url-pattern>urlPattern_20</url-pattern>
+            <url-pattern>urlPattern_21</url-pattern>
+            <url-pattern>urlPattern_22</url-pattern>
+            <url-pattern>urlPattern_23</url-pattern>
+            <url-pattern>urlPattern_24</url-pattern>
+            <http-method>TRACE</http-method>
+            <http-method>GET</http-method>
+            <http-method>POST</http-method>
+            <http-method>PUT</http-method>
+            <http-method>DELETE</http-method>
+         </web-resource-collection>
+         <auth-constraint id="AuthConstraint_1051643500462">
+            <description>description_0</description>
+            <role-name>roles_0</role-name>
+            <role-name>roles_1</role-name>
+            <role-name>roles_2</role-name>
+            <role-name>roles_3</role-name>
+            <role-name>roles_4</role-name>
+         </auth-constraint>
+         <user-data-constraint id="UserDataConstraint_1051643500462">
+            <description>description_0</description>
+            <transport-guarantee>NONE</transport-guarantee>
+         </user-data-constraint>
+      </security-constraint>
+      <security-constraint id="SecurityConstraint_1051643500462">
+         <display-name>displayName_1</display-name>
+         <web-resource-collection id="WebResourceCollection_1051643500463">
+            <web-resource-name>webResourceName_5</web-resource-name>
+            <description>description_5</description>
+            <url-pattern>urlPattern_25</url-pattern>
+            <url-pattern>urlPattern_26</url-pattern>
+            <url-pattern>urlPattern_27</url-pattern>
+            <url-pattern>urlPattern_28</url-pattern>
+            <url-pattern>urlPattern_29</url-pattern>
+            <http-method>HEAD</http-method>
+            <http-method>OPTIONS</http-method>
+            <http-method>TRACE</http-method>
+            <http-method>GET</http-method>
+            <http-method>POST</http-method>
+         </web-resource-collection>
+         <web-resource-collection id="WebResourceCollection_1051643500464">
+            <web-resource-name>webResourceName_6</web-resource-name>
+            <description>description_6</description>
+            <url-pattern>urlPattern_30</url-pattern>
+            <url-pattern>urlPattern_31</url-pattern>
+            <url-pattern>urlPattern_32</url-pattern>
+            <url-pattern>urlPattern_33</url-pattern>
+            <url-pattern>urlPattern_34</url-pattern>
+            <http-method>PUT</http-method>
+            <http-method>DELETE</http-method>
+            <http-method>HEAD</http-method>
+            <http-method>OPTIONS</http-method>
+            <http-method>TRACE</http-method>
+         </web-resource-collection>
+         <web-resource-collection id="WebResourceCollection_1051643500465">
+            <web-resource-name>webResourceName_7</web-resource-name>
+            <description>description_7</description>
+            <url-pattern>urlPattern_35</url-pattern>
+            <url-pattern>urlPattern_36</url-pattern>
+            <url-pattern>urlPattern_37</url-pattern>
+            <url-pattern>urlPattern_38</url-pattern>
+            <url-pattern>urlPattern_39</url-pattern>
+            <http-method>GET</http-method>
+            <http-method>POST</http-method>
+            <http-method>PUT</http-method>
+            <http-method>DELETE</http-method>
+            <http-method>HEAD</http-method>
+         </web-resource-collection>
+         <web-resource-collection id="WebResourceCollection_1051643500466">
+            <web-resource-name>webResourceName_8</web-resource-name>
+            <description>description_8</description>
+            <url-pattern>urlPattern_40</url-pattern>
+            <url-pattern>urlPattern_41</url-pattern>
+            <url-pattern>urlPattern_42</url-pattern>
+            <url-pattern>urlPattern_43</url-pattern>
+            <url-pattern>urlPattern_44</url-pattern>
+            <http-method>OPTIONS</http-method>
+            <http-method>TRACE</http-method>
+            <http-method>GET</http-method>
+            <http-method>POST</http-method>
+            <http-method>PUT</http-method>
+         </web-resource-collection>
+         <web-resource-collection id="WebResourceCollection_1051643500467">
+            <web-resource-name>webResourceName_9</web-resource-name>
+            <description>description_9</description>
+            <url-pattern>urlPattern_45</url-pattern>
+            <url-pattern>urlPattern_46</url-pattern>
+            <url-pattern>urlPattern_47</url-pattern>
+            <url-pattern>urlPattern_48</url-pattern>
+            <url-pattern>urlPattern_49</url-pattern>
+            <http-method>DELETE</http-method>
+            <http-method>HEAD</http-method>
+            <http-method>OPTIONS</http-method>
+            <http-method>TRACE</http-method>
+            <http-method>GET</http-method>
+         </web-resource-collection>
+         <auth-constraint id="AuthConstraint_1051643500463">
+            <description>description_1</description>
+            <role-name>roles_5</role-name>
+            <role-name>roles_6</role-name>
+            <role-name>roles_7</role-name>
+            <role-name>roles_8</role-name>
+            <role-name>roles_9</role-name>
+         </auth-constraint>
+         <user-data-constraint id="UserDataConstraint_1051643500463">
+            <description>description_1</description>
+            <transport-guarantee>INTEGRAL</transport-guarantee>
+         </user-data-constraint>
+      </security-constraint>
+      <security-constraint id="SecurityConstraint_1051643500463">
+         <display-name>displayName_2</display-name>
+         <web-resource-collection id="WebResourceCollection_1051643500468">
+            <web-resource-name>webResourceName_10</web-resource-name>
+            <description>description_10</description>
+            <url-pattern>urlPattern_50</url-pattern>
+            <url-pattern>urlPattern_51</url-pattern>
+            <url-pattern>urlPattern_52</url-pattern>
+            <url-pattern>urlPattern_53</url-pattern>
+            <url-pattern>urlPattern_54</url-pattern>
+            <http-method>POST</http-method>
+            <http-method>PUT</http-method>
+            <http-method>DELETE</http-method>
+            <http-method>HEAD</http-method>
+            <http-method>OPTIONS</http-method>
+         </web-resource-collection>
+         <web-resource-collection id="WebResourceCollection_1051643500469">
+            <web-resource-name>webResourceName_11</web-resource-name>
+            <description>description_11</description>
+            <url-pattern>urlPattern_55</url-pattern>
+            <url-pattern>urlPattern_56</url-pattern>
+            <url-pattern>urlPattern_57</url-pattern>
+            <url-pattern>urlPattern_58</url-pattern>
+            <url-pattern>urlPattern_59</url-pattern>
+            <http-method>TRACE</http-method>
+            <http-method>GET</http-method>
+            <http-method>POST</http-method>
+            <http-method>PUT</http-method>
+            <http-method>DELETE</http-method>
+         </web-resource-collection>
+         <web-resource-collection id="WebResourceCollection_1051643500470">
+            <web-resource-name>webResourceName_12</web-resource-name>
+            <description>description_12</description>
+            <url-pattern>urlPattern_60</url-pattern>
+            <url-pattern>urlPattern_61</url-pattern>
+            <url-pattern>urlPattern_62</url-pattern>
+            <url-pattern>urlPattern_63</url-pattern>
+            <url-pattern>urlPattern_64</url-pattern>
+            <http-method>HEAD</http-method>
+            <http-method>OPTIONS</http-method>
+            <http-method>TRACE</http-method>
+            <http-method>GET</http-method>
+            <http-method>POST</http-method>
+         </web-resource-collection>
+         <web-resource-collection id="WebResourceCollection_1051643500471">
+            <web-resource-name>webResourceName_13</web-resource-name>
+            <description>description_13</description>
+            <url-pattern>urlPattern_65</url-pattern>
+            <url-pattern>urlPattern_66</url-pattern>
+            <url-pattern>urlPattern_67</url-pattern>
+            <url-pattern>urlPattern_68</url-pattern>
+            <url-pattern>urlPattern_69</url-pattern>
+            <http-method>PUT</http-method>
+            <http-method>DELETE</http-method>
+            <http-method>HEAD</http-method>
+            <http-method>OPTIONS</http-method>
+            <http-method>TRACE</http-method>
+         </web-resource-collection>
+         <web-resource-collection id="WebResourceCollection_1051643500472">
+            <web-resource-name>webResourceName_14</web-resource-name>
+            <description>description_14</description>
+            <url-pattern>urlPattern_70</url-pattern>
+            <url-pattern>urlPattern_71</url-pattern>
+            <url-pattern>urlPattern_72</url-pattern>
+            <url-pattern>urlPattern_73</url-pattern>
+            <url-pattern>urlPattern_74</url-pattern>
+            <http-method>GET</http-method>
+            <http-method>POST</http-method>
+            <http-method>PUT</http-method>
+            <http-method>DELETE</http-method>
+            <http-method>HEAD</http-method>
+         </web-resource-collection>
+         <auth-constraint id="AuthConstraint_1051643500464">
+            <description>description_2</description>
+            <role-name>roles_10</role-name>
+            <role-name>roles_11</role-name>
+            <role-name>roles_12</role-name>
+            <role-name>roles_13</role-name>
+            <role-name>roles_14</role-name>
+         </auth-constraint>
+         <user-data-constraint id="UserDataConstraint_1051643500464">
+            <description>description_2</description>
+            <transport-guarantee>CONFIDENTIAL</transport-guarantee>
+         </user-data-constraint>
+      </security-constraint>
+      <security-constraint id="SecurityConstraint_1051643500464">
+         <display-name>displayName_3</display-name>
+         <web-resource-collection id="WebResourceCollection_1051643500473">
+            <web-resource-name>webResourceName_15</web-resource-name>
+            <description>description_15</description>
+            <url-pattern>urlPattern_75</url-pattern>
+            <url-pattern>urlPattern_76</url-pattern>
+            <url-pattern>urlPattern_77</url-pattern>
+            <url-pattern>urlPattern_78</url-pattern>
+            <url-pattern>urlPattern_79</url-pattern>
+            <http-method>OPTIONS</http-method>
+            <http-method>TRACE</http-method>
+            <http-method>GET</http-method>
+            <http-method>POST</http-method>
+            <http-method>PUT</http-method>
+         </web-resource-collection>
+         <web-resource-collection id="WebResourceCollection_1051643500474">
+            <web-resource-name>webResourceName_16</web-resource-name>
+            <description>description_16</description>
+            <url-pattern>urlPattern_80</url-pattern>
+            <url-pattern>urlPattern_81</url-pattern>
+            <url-pattern>urlPattern_82</url-pattern>
+            <url-pattern>urlPattern_83</url-pattern>
+            <url-pattern>urlPattern_84</url-pattern>
+            <http-method>DELETE</http-method>
+            <http-method>HEAD</http-method>
+            <http-method>OPTIONS</http-method>
+            <http-method>TRACE</http-method>
+            <http-method>GET</http-method>
+         </web-resource-collection>
+         <web-resource-collection id="WebResourceCollection_1051643500475">
+            <web-resource-name>webResourceName_17</web-resource-name>
+            <description>description_17</description>
+            <url-pattern>urlPattern_85</url-pattern>
+            <url-pattern>urlPattern_86</url-pattern>
+            <url-pattern>urlPattern_87</url-pattern>
+            <url-pattern>urlPattern_88</url-pattern>
+            <url-pattern>urlPattern_89</url-pattern>
+            <http-method>POST</http-method>
+            <http-method>PUT</http-method>
+            <http-method>DELETE</http-method>
+            <http-method>HEAD</http-method>
+            <http-method>OPTIONS</http-method>
+         </web-resource-collection>
+         <web-resource-collection id="WebResourceCollection_1051643500476">
+            <web-resource-name>webResourceName_18</web-resource-name>
+            <description>description_18</description>
+            <url-pattern>urlPattern_90</url-pattern>
+            <url-pattern>urlPattern_91</url-pattern>
+            <url-pattern>urlPattern_92</url-pattern>
+            <url-pattern>urlPattern_93</url-pattern>
+            <url-pattern>urlPattern_94</url-pattern>
+            <http-method>TRACE</http-method>
+            <http-method>GET</http-method>
+            <http-method>POST</http-method>
+            <http-method>PUT</http-method>
+            <http-method>DELETE</http-method>
+         </web-resource-collection>
+         <web-resource-collection id="WebResourceCollection_1051643500477">
+            <web-resource-name>webResourceName_19</web-resource-name>
+            <description>description_19</description>
+            <url-pattern>urlPattern_95</url-pattern>
+            <url-pattern>urlPattern_96</url-pattern>
+            <url-pattern>urlPattern_97</url-pattern>
+            <url-pattern>urlPattern_98</url-pattern>
+            <url-pattern>urlPattern_99</url-pattern>
+            <http-method>HEAD</http-method>
+            <http-method>OPTIONS</http-method>
+            <http-method>TRACE</http-method>
+            <http-method>GET</http-method>
+            <http-method>POST</http-method>
+         </web-resource-collection>
+         <auth-constraint id="AuthConstraint_1051643500472">
+            <description>description_3</description>
+            <role-name>roles_15</role-name>
+            <role-name>roles_16</role-name>
+            <role-name>roles_17</role-name>
+            <role-name>roles_18</role-name>
+            <role-name>roles_19</role-name>
+         </auth-constraint>
+         <user-data-constraint id="UserDataConstraint_1051643500472">
+            <description>description_3</description>
+            <transport-guarantee>NONE</transport-guarantee>
+         </user-data-constraint>
+      </security-constraint>
+      <security-constraint id="SecurityConstraint_1051643500472">
+         <display-name>displayName_4</display-name>
+         <web-resource-collection id="WebResourceCollection_1051643500478">
+            <web-resource-name>webResourceName_20</web-resource-name>
+            <description>description_20</description>
+            <url-pattern>urlPattern_100</url-pattern>
+            <url-pattern>urlPattern_101</url-pattern>
+            <url-pattern>urlPattern_102</url-pattern>
+            <url-pattern>urlPattern_103</url-pattern>
+            <url-pattern>urlPattern_104</url-pattern>
+            <http-method>PUT</http-method>
+            <http-method>DELETE</http-method>
+            <http-method>HEAD</http-method>
+            <http-method>OPTIONS</http-method>
+            <http-method>TRACE</http-method>
+         </web-resource-collection>
+         <web-resource-collection id="WebResourceCollection_1051643500479">
+            <web-resource-name>webResourceName_21</web-resource-name>
+            <description>description_21</description>
+            <url-pattern>urlPattern_105</url-pattern>
+            <url-pattern>urlPattern_106</url-pattern>
+            <url-pattern>urlPattern_107</url-pattern>
+            <url-pattern>urlPattern_108</url-pattern>
+            <url-pattern>urlPattern_109</url-pattern>
+            <http-method>GET</http-method>
+            <http-method>POST</http-method>
+            <http-method>PUT</http-method>
+            <http-method>DELETE</http-method>
+            <http-method>HEAD</http-method>
+         </web-resource-collection>
+         <web-resource-collection id="WebResourceCollection_1051643500480">
+            <web-resource-name>webResourceName_22</web-resource-name>
+            <description>description_22</description>
+            <url-pattern>urlPattern_110</url-pattern>
+            <url-pattern>urlPattern_111</url-pattern>
+            <url-pattern>urlPattern_112</url-pattern>
+            <url-pattern>urlPattern_113</url-pattern>
+            <url-pattern>urlPattern_114</url-pattern>
+            <http-method>OPTIONS</http-method>
+            <http-method>TRACE</http-method>
+            <http-method>GET</http-method>
+            <http-method>POST</http-method>
+            <http-method>PUT</http-method>
+         </web-resource-collection>
+         <web-resource-collection id="WebResourceCollection_1051643500481">
+            <web-resource-name>webResourceName_23</web-resource-name>
+            <description>description_23</description>
+            <url-pattern>urlPattern_115</url-pattern>
+            <url-pattern>urlPattern_116</url-pattern>
+            <url-pattern>urlPattern_117</url-pattern>
+            <url-pattern>urlPattern_118</url-pattern>
+            <url-pattern>urlPattern_119</url-pattern>
+            <http-method>DELETE</http-method>
+            <http-method>HEAD</http-method>
+            <http-method>OPTIONS</http-method>
+            <http-method>TRACE</http-method>
+            <http-method>GET</http-method>
+         </web-resource-collection>
+         <web-resource-collection id="WebResourceCollection_1051643500482">
+            <web-resource-name>webResourceName_24</web-resource-name>
+            <description>description_24</description>
+            <url-pattern>urlPattern_120</url-pattern>
+            <url-pattern>urlPattern_121</url-pattern>
+            <url-pattern>urlPattern_122</url-pattern>
+            <url-pattern>urlPattern_123</url-pattern>
+            <url-pattern>urlPattern_124</url-pattern>
+            <http-method>POST</http-method>
+            <http-method>PUT</http-method>
+            <http-method>DELETE</http-method>
+            <http-method>HEAD</http-method>
+            <http-method>OPTIONS</http-method>
+         </web-resource-collection>
+         <auth-constraint id="AuthConstraint_1051643500473">
+            <description>description_4</description>
+            <role-name>roles_20</role-name>
+            <role-name>roles_21</role-name>
+            <role-name>roles_22</role-name>
+            <role-name>roles_23</role-name>
+            <role-name>roles_24</role-name>
+         </auth-constraint>
+         <user-data-constraint id="UserDataConstraint_1051643500473">
+            <description>description_4</description>
+            <transport-guarantee>INTEGRAL</transport-guarantee>
+         </user-data-constraint>
+      </security-constraint>
+      <login-config id="LoginConfig_1051643500482">
+         <auth-method>BASIC</auth-method>
+         <realm-name>realmName_0</realm-name>
+         <form-login-config id="FormLoginConfig_1051643500482">
+            <form-login-page>formLoginPage_0</form-login-page>
+            <form-error-page>formErrorPage_0</form-error-page>
+         </form-login-config>
+      </login-config>
+      <security-role id="SecurityRole_1051643500492">
+         <description>description_0</description>
+         <role-name>roleName_0</role-name>
+      </security-role>
+      <security-role id="SecurityRole_1051643500493">
+         <description>description_1</description>
+         <role-name>roleName_1</role-name>
+      </security-role>
+      <security-role id="SecurityRole_1051643500494">
+         <description>description_2</description>
+         <role-name>roleName_2</role-name>
+      </security-role>
+      <security-role id="SecurityRole_1051643500495">
+         <description>description_3</description>
+         <role-name>roleName_3</role-name>
+      </security-role>
+      <security-role id="SecurityRole_1051643500496">
+         <description>description_4</description>
+         <role-name>roleName_4</role-name>
+      </security-role>
+      <env-entry id="EnvEntry_1051643500513">
+         <description>description_0</description>
+         <env-entry-name>name_0</env-entry-name>
+         <env-entry-value>value_0</env-entry-value>
+         <env-entry-type>java.lang.String</env-entry-type>
+      </env-entry>
+      <env-entry id="EnvEntry_1051643500514">
+         <description>description_1</description>
+         <env-entry-name>name_1</env-entry-name>
+         <env-entry-value>value_1</env-entry-value>
+         <env-entry-type>java.lang.Integer</env-entry-type>
+      </env-entry>
+      <env-entry id="EnvEntry_1051643500515">
+         <description>description_2</description>
+         <env-entry-name>name_2</env-entry-name>
+         <env-entry-value>value_2</env-entry-value>
+         <env-entry-type>java.lang.Boolean</env-entry-type>
+      </env-entry>
+      <env-entry id="EnvEntry_1051643500516">
+         <description>description_3</description>
+         <env-entry-name>name_3</env-entry-name>
+         <env-entry-value>value_3</env-entry-value>
+         <env-entry-type>java.lang.Double</env-entry-type>
+      </env-entry>
+      <env-entry id="EnvEntry_1051643500517">
+         <description>description_4</description>
+         <env-entry-name>name_4</env-entry-name>
+         <env-entry-value>value_4</env-entry-value>
+         <env-entry-type>java.lang.Byte</env-entry-type>
+      </env-entry>
+      <ejb-ref id="EjbRef_1051643500533">
+         <description>description_0</description>
+         <ejb-ref-name>name_0</ejb-ref-name>
+         <ejb-ref-type>Session</ejb-ref-type>
+         <home>home_0</home>
+         <remote>remote_0</remote>
+         <ejb-link>link_0</ejb-link>
+      </ejb-ref>
+      <ejb-ref id="EjbRef_1051643500534">
+         <description>description_1</description>
+         <ejb-ref-name>name_1</ejb-ref-name>
+         <ejb-ref-type>Entity</ejb-ref-type>
+         <home>home_1</home>
+         <remote>remote_1</remote>
+         <ejb-link>link_1</ejb-link>
+      </ejb-ref>
+      <ejb-ref id="EjbRef_1051643500535">
+         <description>description_2</description>
+         <ejb-ref-name>name_2</ejb-ref-name>
+         <ejb-ref-type>Session</ejb-ref-type>
+         <home>home_2</home>
+         <remote>remote_2</remote>
+         <ejb-link>link_2</ejb-link>
+      </ejb-ref>
+      <ejb-ref id="EjbRef_1051643500536">
+         <description>description_3</description>
+         <ejb-ref-name>name_3</ejb-ref-name>
+         <ejb-ref-type>Entity</ejb-ref-type>
+         <home>home_3</home>
+         <remote>remote_3</remote>
+         <ejb-link>link_3</ejb-link>
+      </ejb-ref>
+      <ejb-ref id="EjbRef_1051643500537">
+         <description>description_4</description>
+         <ejb-ref-name>name_4</ejb-ref-name>
+         <ejb-ref-type>Session</ejb-ref-type>
+         <home>home_4</home>
+         <remote>remote_4</remote>
+         <ejb-link>link_4</ejb-link>
+      </ejb-ref>
+      <ejb-local-ref id="EJBLocalRef_1051643500553">
+         <description>description_5</description>
+         <ejb-ref-name>name_5</ejb-ref-name>
+         <ejb-ref-type>Entity</ejb-ref-type>
+         <local-home>home_5</local-home>
+         <local>remote_5</local>
+         <ejb-link>link_5</ejb-link>
+      </ejb-local-ref>
+      <ejb-local-ref id="EJBLocalRef_1051643500554">
+         <description>description_6</description>
+         <ejb-ref-name>name_6</ejb-ref-name>
+         <ejb-ref-type>Session</ejb-ref-type>
+         <local-home>home_6</local-home>
+         <local>remote_6</local>
+         <ejb-link>link_6</ejb-link>
+      </ejb-local-ref>
+      <ejb-local-ref id="EJBLocalRef_1051643500555">
+         <description>description_7</description>
+         <ejb-ref-name>name_7</ejb-ref-name>
+         <ejb-ref-type>Entity</ejb-ref-type>
+         <local-home>home_7</local-home>
+         <local>remote_7</local>
+         <ejb-link>link_7</ejb-link>
+      </ejb-local-ref>
+      <ejb-local-ref id="EJBLocalRef_1051643500556">
+         <description>description_8</description>
+         <ejb-ref-name>name_8</ejb-ref-name>
+         <ejb-ref-type>Session</ejb-ref-type>
+         <local-home>home_8</local-home>
+         <local>remote_8</local>
+         <ejb-link>link_8</ejb-link>
+      </ejb-local-ref>
+      <ejb-local-ref id="EJBLocalRef_1051643500557">
+         <description>description_9</description>
+         <ejb-ref-name>name_9</ejb-ref-name>
+         <ejb-ref-type>Entity</ejb-ref-type>
+         <local-home>home_9</local-home>
+         <local>remote_9</local>
+         <ejb-link>link_9</ejb-link>
+      </ejb-local-ref>
+   </web-app>
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/.metadata/.plugins/com.ibm.etools.j2ee/looseApp.xmi b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/.metadata/.plugins/com.ibm.etools.j2ee/looseApp.xmi
new file mode 100644
index 0000000..1e3ae0b
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/.metadata/.plugins/com.ibm.etools.j2ee/looseApp.xmi
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="ASCII"?>

+<org.eclipse.jst.j2ee.internal.commonarchivecore.looseconfig:LooseApplication xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:org.eclipse.jst.j2ee.internal.commonarchivecore.looseconfig="commonarchive.looseconfig.xmi" uri="\d:\work\WTP\org.eclipse.jst.j2ee.core.tests\commonArchiveResources\loose_module_workspace\LooseEAR" binariesPath="\d:\work\WTP\org.eclipse.jst.j2ee.core.tests\commonArchiveResources\loose_module_workspace\LooseEAR" resourcesPath="\d:\work\WTP\org.eclipse.jst.j2ee.core.tests\commonArchiveResources\loose_module_workspace\LooseEAR">

+  <looseArchives xsi:type="org.eclipse.jst.j2ee.internal.commonarchivecore.looseconfig:LooseModule" uri="LooseEAREjb.jar" binariesPath="/d:/work/WTP/org.eclipse.jst.j2ee.core.tests/commonArchiveResources\loose_module_workspace\LooseEAREjb\bin" resourcesPath="/d:/work/WTP/org.eclipse.jst.j2ee.core.tests/commonArchiveResources\loose_module_workspace\LooseEAREjb\bin"/>

+  <looseArchives xsi:type="org.eclipse.jst.j2ee.internal.commonarchivecore.looseconfig:LooseWARFile" uri="LooseEARWeb.war" binariesPath="/d:/work/WTP/org.eclipse.jst.j2ee.core.tests/commonArchiveResources\loose_module_workspace\LooseEARWeb\webApplication" resourcesPath="/d:/work/WTP/org.eclipse.jst.j2ee.core.tests/commonArchiveResources\loose_module_workspace\LooseEARWeb\webApplication">

+    <looseLibs uri="WEB-INF/lib/library.jar" binariesPath="/d:/work/WTP/org.eclipse.jst.j2ee.core.tests/commonArchiveResources\loose_module_workspace\LooseJavaWebLib\bin" resourcesPath="/d:/work/WTP/org.eclipse.jst.j2ee.core.tests/commonArchiveResources\loose_module_workspace\LooseJavaWebLib\bin"/>

+  </looseArchives>

+  <looseArchives xsi:type="org.eclipse.jst.j2ee.internal.commonarchivecore.looseconfig:LooseLibrary" uri="util.jar" binariesPath="/d:/work/WTP/org.eclipse.jst.j2ee.core.tests/commonArchiveResources\loose_module_workspace\LooseJavaUtil\bin" resourcesPath="/d:/work/WTP/org.eclipse.jst.j2ee.core.tests/commonArchiveResources\loose_module_workspace\LooseJavaUtil\bin"/>

+</org.eclipse.jst.j2ee.internal.commonarchivecore.looseconfig:LooseApplication>

diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/.metadata/.plugins/com.ibm.etools.j2ee/looseConfig.xmi b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/.metadata/.plugins/com.ibm.etools.j2ee/looseConfig.xmi
new file mode 100644
index 0000000..64ffaf7
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/.metadata/.plugins/com.ibm.etools.j2ee/looseConfig.xmi
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="ASCII"?>

+<org.eclipse.jst.j2ee.internal.commonarchivecore.looseconfig:LooseConfiguration xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:org.eclipse.jst.j2ee.internal.commonarchivecore.looseconfig="commonarchive.looseconfig.xmi">

+  <applications uri="\d:\work\WTP\org.eclipse.jst.j2ee.core.tests\commonArchiveResources\loose_module_workspace\LooseEAR" binariesPath="\d:\work\WTP\org.eclipse.jst.j2ee.core.tests\commonArchiveResources\loose_module_workspace\LooseEAR" resourcesPath="\d:\work\WTP\org.eclipse.jst.j2ee.core.tests\commonArchiveResources\loose_module_workspace\LooseEAR">

+    <looseArchives xsi:type="org.eclipse.jst.j2ee.internal.commonarchivecore.looseconfig:LooseModule" uri="LooseEAREjb.jar" binariesPath="/d:/work/WTP/org.eclipse.jst.j2ee.core.tests/commonArchiveResources\loose_module_workspace\LooseEAREjb\bin" resourcesPath="/d:/work/WTP/org.eclipse.jst.j2ee.core.tests/commonArchiveResources\loose_module_workspace\LooseEAREjb\bin"/>

+    <looseArchives xsi:type="org.eclipse.jst.j2ee.internal.commonarchivecore.looseconfig:LooseWARFile" uri="LooseEARWeb.war" binariesPath="/d:/work/WTP/org.eclipse.jst.j2ee.core.tests/commonArchiveResources\loose_module_workspace\LooseEARWeb\webApplication" resourcesPath="/d:/work/WTP/org.eclipse.jst.j2ee.core.tests/commonArchiveResources\loose_module_workspace\LooseEARWeb\webApplication">

+      <looseLibs uri="WEB-INF/lib/library.jar" binariesPath="/d:/work/WTP/org.eclipse.jst.j2ee.core.tests/commonArchiveResources\loose_module_workspace\LooseJavaWebLib\bin" resourcesPath="/d:/work/WTP/org.eclipse.jst.j2ee.core.tests/commonArchiveResources\loose_module_workspace\LooseJavaWebLib\bin"/>

+    </looseArchives>

+    <looseArchives xsi:type="org.eclipse.jst.j2ee.internal.commonarchivecore.looseconfig:LooseLibrary" uri="util.jar" binariesPath="/d:/work/WTP/org.eclipse.jst.j2ee.core.tests/commonArchiveResources\loose_module_workspace\LooseJavaUtil\bin" resourcesPath="/d:/work/WTP/org.eclipse.jst.j2ee.core.tests/commonArchiveResources\loose_module_workspace\LooseJavaUtil\bin"/>

+  </applications>

+</org.eclipse.jst.j2ee.internal.commonarchivecore.looseconfig:LooseConfiguration>

diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseConnector/META-INF/MANIFEST.MF b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseConnector/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..59499bc
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseConnector/META-INF/MANIFEST.MF
@@ -0,0 +1,2 @@
+Manifest-Version: 1.0
+
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseConnector/META-INF/application.xml b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseConnector/META-INF/application.xml
new file mode 100644
index 0000000..6a1cd6f
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseConnector/META-INF/application.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<application id="Application_ID"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/application_1_4.xsd">
+    <module>
+        <connector>fooRAR</connector>
+    </module>
+</application>
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseConnector/fooRAR/META-INF/MANIFEST.MF b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseConnector/fooRAR/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..59499bc
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseConnector/fooRAR/META-INF/MANIFEST.MF
@@ -0,0 +1,2 @@
+Manifest-Version: 1.0
+
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseConnector/fooRAR/META-INF/ra.xml b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseConnector/fooRAR/META-INF/ra.xml
new file mode 100644
index 0000000..b341c53
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseConnector/fooRAR/META-INF/ra.xml
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE connector PUBLIC "-//Sun Microsystems, Inc.//DTD Connector 1.0//EN"
+                           "http://java.sun.com/dtd/connector_1_0.dtd">
+<connector>
+    <display-name>displayName_0</display-name>
+    <description>description_0</description>
+    <icon>
+        <small-icon>smallIcon_0</small-icon>
+        <large-icon>largeIcon_0</large-icon>
+    </icon>
+    <vendor-name>vendorName_0</vendor-name>
+    <spec-version>1.0</spec-version>
+    <eis-type>eisType_0</eis-type>
+    <version>1.0</version>
+    <license>
+        <description>description_0</description>
+        <license-required>true</license-required>
+    </license>
+    <resourceadapter>
+        <managedconnectionfactory-class>managedConnectionFactoryClass_0</managedconnectionfactory-class>
+        <connectionfactory-interface>connectionFactoryInterface_0</connectionfactory-interface>
+        <connectionfactory-impl-class>connectionFactoryImplClass_0</connectionfactory-impl-class>
+        <connection-interface>connectionInterface_0</connection-interface>
+        <connection-impl-class>connectionImplClass_0</connection-impl-class>
+        <transaction-support>NoTransaction</transaction-support>
+        <config-property>
+            <description>description_0</description>
+            <config-property-name>name_0</config-property-name>
+            <config-property-type>type_0</config-property-type>
+            <config-property-value>value_0</config-property-value>
+        </config-property>
+        <config-property>
+            <description>description_1</description>
+            <config-property-name>name_1</config-property-name>
+            <config-property-type>type_1</config-property-type>
+            <config-property-value>value_1</config-property-value>
+        </config-property>
+        <config-property>
+            <description>description_2</description>
+            <config-property-name>name_2</config-property-name>
+            <config-property-type>type_2</config-property-type>
+            <config-property-value>value_2</config-property-value>
+        </config-property>
+        <config-property>
+            <description>description_3</description>
+            <config-property-name>name_3</config-property-name>
+            <config-property-type>type_3</config-property-type>
+            <config-property-value>value_3</config-property-value>
+        </config-property>
+        <config-property>
+            <description>description_4</description>
+            <config-property-name>name_4</config-property-name>
+            <config-property-type>type_4</config-property-type>
+            <config-property-value>value_4</config-property-value>
+        </config-property>
+        <authentication-mechanism>
+            <description>description_0</description>
+            <authentication-mechanism-type>BasicPassword</authentication-mechanism-type>
+            <credential-interface>credentialInterface_0</credential-interface>
+        </authentication-mechanism>
+        <authentication-mechanism>
+            <description>description_1</description>
+            <authentication-mechanism-type>Kerbv5</authentication-mechanism-type>
+            <credential-interface>credentialInterface_1</credential-interface>
+        </authentication-mechanism>
+        <authentication-mechanism>
+            <description>description_2</description>
+            <authentication-mechanism-type>BasicPassword</authentication-mechanism-type>
+            <credential-interface>credentialInterface_2</credential-interface>
+        </authentication-mechanism>
+        <authentication-mechanism>
+            <description>description_3</description>
+            <authentication-mechanism-type>Kerbv5</authentication-mechanism-type>
+            <credential-interface>credentialInterface_3</credential-interface>
+        </authentication-mechanism>
+        <authentication-mechanism>
+            <description>description_4</description>
+            <authentication-mechanism-type>BasicPassword</authentication-mechanism-type>
+            <credential-interface>credentialInterface_4</credential-interface>
+        </authentication-mechanism>
+        <reauthentication-support>true</reauthentication-support>
+        <security-permission>
+            <description>description_0</description>
+            <security-permission-spec>specification_0</security-permission-spec>
+        </security-permission>
+        <security-permission>
+            <description>description_1</description>
+            <security-permission-spec>specification_1</security-permission-spec>
+        </security-permission>
+        <security-permission>
+            <description>description_2</description>
+            <security-permission-spec>specification_2</security-permission-spec>
+        </security-permission>
+        <security-permission>
+            <description>description_3</description>
+            <security-permission-spec>specification_3</security-permission-spec>
+        </security-permission>
+        <security-permission>
+            <description>description_4</description>
+            <security-permission-spec>specification_4</security-permission-spec>
+        </security-permission>
+    </resourceadapter>
+</connector>
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAR/META-INF/application.xml b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAR/META-INF/application.xml
new file mode 100644
index 0000000..56067f6
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAR/META-INF/application.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE application PUBLIC "-//Sun Microsystems, Inc.//DTD J2EE Application 1.2//EN" "http://java.sun.com/j2ee/dtds/application_1_2.dtd">
+<application id="Application_ID">
+	<display-name>LooseEAR</display-name>
+	<module id="EjbModule_1">
+		<ejb>LooseEAREjb.jar</ejb>
+	</module>
+	<module id="WebModule_1">
+		<web>
+			<web-uri>LooseEARWeb.war</web-uri>
+			<context-root>LooseEARWeb</context-root></web>
+	</module>
+</application>
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAR/META-INF/ibm-application-ext.xmi b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAR/META-INF/ibm-application-ext.xmi
new file mode 100644
index 0000000..f3fbd0d
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAR/META-INF/ibm-application-ext.xmi
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<applicationext:ApplicationExtension xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:applicationext="applicationext.xmi" xmlns:application="application.xmi" xmi:id="Application_ID_Ext">

+  <moduleExtensions xmi:type="applicationext:EjbModuleExtension" xmi:id="EjbModule_1_Ext" absolutePath="D:\WSAD_DEV\eclipse\workspace\LooseEAREjb\bin">

+    <module xmi:type="application:EjbModule" href="META-INF/application.xml#EjbModule_1"/>

+  </moduleExtensions>

+  <moduleExtensions xmi:type="applicationext:WebModuleExtension" xmi:id="WebModule_1_Ext" absolutePath="D:\WSAD_DEV\eclipse\workspace\LooseEARWeb\webApplication">

+    <module xmi:type="application:WebModule" href="META-INF/application.xml#WebModule_1"/>

+  </moduleExtensions>

+  <application href="META-INF/application.xml#Application_ID"/>

+</applicationext:ApplicationExtension>

diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEARApp/META-INF/MANIFEST.MF b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEARApp/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..59499bc
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEARApp/META-INF/MANIFEST.MF
@@ -0,0 +1,2 @@
+Manifest-Version: 1.0
+
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEARApp/META-INF/application.xml b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEARApp/META-INF/application.xml
new file mode 100644
index 0000000..b44d91e
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEARApp/META-INF/application.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<application id="Application_ID"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/application_1_4.xsd">
+    <module>
+        <java>fooAPP</java>
+    </module>
+</application>
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEARApp/fooAPP/META-INF/MANIFEST.MF b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEARApp/fooAPP/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..59499bc
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEARApp/fooAPP/META-INF/MANIFEST.MF
@@ -0,0 +1,2 @@
+Manifest-Version: 1.0
+
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEARApp/fooAPP/META-INF/application-client.xml b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEARApp/fooAPP/META-INF/application-client.xml
new file mode 100644
index 0000000..c8bed76
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEARApp/fooAPP/META-INF/application-client.xml
@@ -0,0 +1,272 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE application-client PUBLIC "-//Sun Microsystems, Inc.//DTD J2EE Application Client 1.3//EN"
+                                    "http://java.sun.com/dtd/application-client_1_3.dtd">
+<application-client id="Application-client_ID">
+    <icon>
+        <small-icon>smallIcon_0</small-icon>
+        <large-icon>largeIcon_0</large-icon>
+    </icon>
+    <display-name>displayName_0</display-name>
+    <description>description_0</description>
+    <env-entry>
+        <description>description_0</description>
+        <env-entry-name>name_0</env-entry-name>
+        <env-entry-type>java.lang.String</env-entry-type>
+        <env-entry-value>value_0</env-entry-value>
+    </env-entry>
+    <env-entry>
+        <description>description_1</description>
+        <env-entry-name>name_1</env-entry-name>
+        <env-entry-type>java.lang.Integer</env-entry-type>
+        <env-entry-value>value_1</env-entry-value>
+    </env-entry>
+    <env-entry>
+        <description>description_2</description>
+        <env-entry-name>name_2</env-entry-name>
+        <env-entry-type>java.lang.Boolean</env-entry-type>
+        <env-entry-value>value_2</env-entry-value>
+    </env-entry>
+    <env-entry>
+        <description>description_3</description>
+        <env-entry-name>name_3</env-entry-name>
+        <env-entry-type>java.lang.Double</env-entry-type>
+        <env-entry-value>value_3</env-entry-value>
+    </env-entry>
+    <env-entry>
+        <description>description_4</description>
+        <env-entry-name>name_4</env-entry-name>
+        <env-entry-type>java.lang.Byte</env-entry-type>
+        <env-entry-value>value_4</env-entry-value>
+    </env-entry>
+    <env-entry>
+        <description>description_0</description>
+        <env-entry-name>name_0</env-entry-name>
+        <env-entry-type>java.lang.String</env-entry-type>
+        <env-entry-value>value_0</env-entry-value>
+    </env-entry>
+    <env-entry>
+        <description>description_1</description>
+        <env-entry-name>name_1</env-entry-name>
+        <env-entry-type>java.lang.Integer</env-entry-type>
+        <env-entry-value>value_1</env-entry-value>
+    </env-entry>
+    <env-entry>
+        <description>description_2</description>
+        <env-entry-name>name_2</env-entry-name>
+        <env-entry-type>java.lang.Boolean</env-entry-type>
+        <env-entry-value>value_2</env-entry-value>
+    </env-entry>
+    <env-entry>
+        <description>description_3</description>
+        <env-entry-name>name_3</env-entry-name>
+        <env-entry-type>java.lang.Double</env-entry-type>
+        <env-entry-value>value_3</env-entry-value>
+    </env-entry>
+    <env-entry>
+        <description>description_4</description>
+        <env-entry-name>name_4</env-entry-name>
+        <env-entry-type>java.lang.Byte</env-entry-type>
+        <env-entry-value>value_4</env-entry-value>
+    </env-entry>
+    <ejb-ref>
+        <description>description_0</description>
+        <ejb-ref-name>name_0</ejb-ref-name>
+        <ejb-ref-type>Session</ejb-ref-type>
+        <home>home_0</home>
+        <remote>remote_0</remote>
+        <ejb-link>link_0</ejb-link>
+    </ejb-ref>
+    <ejb-ref>
+        <description>description_1</description>
+        <ejb-ref-name>name_1</ejb-ref-name>
+        <ejb-ref-type>Entity</ejb-ref-type>
+        <home>home_1</home>
+        <remote>remote_1</remote>
+        <ejb-link>link_1</ejb-link>
+    </ejb-ref>
+    <ejb-ref>
+        <description>description_2</description>
+        <ejb-ref-name>name_2</ejb-ref-name>
+        <ejb-ref-type>Session</ejb-ref-type>
+        <home>home_2</home>
+        <remote>remote_2</remote>
+        <ejb-link>link_2</ejb-link>
+    </ejb-ref>
+    <ejb-ref>
+        <description>description_3</description>
+        <ejb-ref-name>name_3</ejb-ref-name>
+        <ejb-ref-type>Entity</ejb-ref-type>
+        <home>home_3</home>
+        <remote>remote_3</remote>
+        <ejb-link>link_3</ejb-link>
+    </ejb-ref>
+    <ejb-ref>
+        <description>description_4</description>
+        <ejb-ref-name>name_4</ejb-ref-name>
+        <ejb-ref-type>Session</ejb-ref-type>
+        <home>home_4</home>
+        <remote>remote_4</remote>
+        <ejb-link>link_4</ejb-link>
+    </ejb-ref>
+    <ejb-ref>
+        <description>description_0</description>
+        <ejb-ref-name>name_0</ejb-ref-name>
+        <ejb-ref-type>Session</ejb-ref-type>
+        <home>home_0</home>
+        <remote>remote_0</remote>
+        <ejb-link>link_0</ejb-link>
+    </ejb-ref>
+    <ejb-ref>
+        <description>description_1</description>
+        <ejb-ref-name>name_1</ejb-ref-name>
+        <ejb-ref-type>Entity</ejb-ref-type>
+        <home>home_1</home>
+        <remote>remote_1</remote>
+        <ejb-link>link_1</ejb-link>
+    </ejb-ref>
+    <ejb-ref>
+        <description>description_2</description>
+        <ejb-ref-name>name_2</ejb-ref-name>
+        <ejb-ref-type>Session</ejb-ref-type>
+        <home>home_2</home>
+        <remote>remote_2</remote>
+        <ejb-link>link_2</ejb-link>
+    </ejb-ref>
+    <ejb-ref>
+        <description>description_3</description>
+        <ejb-ref-name>name_3</ejb-ref-name>
+        <ejb-ref-type>Entity</ejb-ref-type>
+        <home>home_3</home>
+        <remote>remote_3</remote>
+        <ejb-link>link_3</ejb-link>
+    </ejb-ref>
+    <ejb-ref>
+        <description>description_4</description>
+        <ejb-ref-name>name_4</ejb-ref-name>
+        <ejb-ref-type>Session</ejb-ref-type>
+        <home>home_4</home>
+        <remote>remote_4</remote>
+        <ejb-link>link_4</ejb-link>
+    </ejb-ref>
+    <resource-ref>
+        <description>description_0</description>
+        <res-ref-name>name_0</res-ref-name>
+        <res-type>type_0</res-type>
+        <res-auth>Container</res-auth>
+        <res-sharing-scope>Shareable</res-sharing-scope>
+    </resource-ref>
+    <resource-ref>
+        <description>description_1</description>
+        <res-ref-name>name_1</res-ref-name>
+        <res-type>type_1</res-type>
+        <res-auth>Container</res-auth>
+        <res-sharing-scope>Unshareable</res-sharing-scope>
+    </resource-ref>
+    <resource-ref>
+        <description>description_2</description>
+        <res-ref-name>name_2</res-ref-name>
+        <res-type>type_2</res-type>
+        <res-auth>Application</res-auth>
+        <res-sharing-scope>Shareable</res-sharing-scope>
+    </resource-ref>
+    <resource-ref>
+        <description>description_3</description>
+        <res-ref-name>name_3</res-ref-name>
+        <res-type>type_3</res-type>
+        <res-auth>Application</res-auth>
+        <res-sharing-scope>Unshareable</res-sharing-scope>
+    </resource-ref>
+    <resource-ref>
+        <description>description_4</description>
+        <res-ref-name>name_4</res-ref-name>
+        <res-type>type_4</res-type>
+        <res-auth>Application</res-auth>
+        <res-sharing-scope>Shareable</res-sharing-scope>
+    </resource-ref>
+    <resource-ref>
+        <description>description_0</description>
+        <res-ref-name>name_0</res-ref-name>
+        <res-type>type_0</res-type>
+        <res-auth>Container</res-auth>
+        <res-sharing-scope>Shareable</res-sharing-scope>
+    </resource-ref>
+    <resource-ref>
+        <description>description_1</description>
+        <res-ref-name>name_1</res-ref-name>
+        <res-type>type_1</res-type>
+        <res-auth>Application</res-auth>
+        <res-sharing-scope>Unshareable</res-sharing-scope>
+    </resource-ref>
+    <resource-ref>
+        <description>description_2</description>
+        <res-ref-name>name_2</res-ref-name>
+        <res-type>type_2</res-type>
+        <res-auth>SERVLET</res-auth>
+        <res-sharing-scope>Shareable</res-sharing-scope>
+    </resource-ref>
+    <resource-ref>
+        <description>description_3</description>
+        <res-ref-name>name_3</res-ref-name>
+        <res-type>type_3</res-type>
+        <res-auth>Container</res-auth>
+        <res-sharing-scope>Unshareable</res-sharing-scope>
+    </resource-ref>
+    <resource-ref>
+        <description>description_4</description>
+        <res-ref-name>name_4</res-ref-name>
+        <res-type>type_4</res-type>
+        <res-auth>Application</res-auth>
+        <res-sharing-scope>Shareable</res-sharing-scope>
+    </resource-ref>
+    <resource-env-ref>
+        <description>description_0</description>
+        <resource-env-ref-name>name_0</resource-env-ref-name>
+        <resource-env-ref-type>java.util.HashTable</resource-env-ref-type>
+    </resource-env-ref>
+    <resource-env-ref>
+        <description>description_1</description>
+        <resource-env-ref-name>name_1</resource-env-ref-name>
+        <resource-env-ref-type>java.util.List</resource-env-ref-type>
+    </resource-env-ref>
+    <resource-env-ref>
+        <description>description_2</description>
+        <resource-env-ref-name>name_2</resource-env-ref-name>
+        <resource-env-ref-type>java.sql.Data</resource-env-ref-type>
+    </resource-env-ref>
+    <resource-env-ref>
+        <description>description_3</description>
+        <resource-env-ref-name>name_3</resource-env-ref-name>
+        <resource-env-ref-type>java.lang.Integer</resource-env-ref-type>
+    </resource-env-ref>
+    <resource-env-ref>
+        <description>description_4</description>
+        <resource-env-ref-name>name_4</resource-env-ref-name>
+        <resource-env-ref-type>java.lang.String</resource-env-ref-type>
+    </resource-env-ref>
+    <resource-env-ref>
+        <description>description_0</description>
+        <resource-env-ref-name>name_0</resource-env-ref-name>
+        <resource-env-ref-type>java.util.HashTable</resource-env-ref-type>
+    </resource-env-ref>
+    <resource-env-ref>
+        <description>description_1</description>
+        <resource-env-ref-name>name_1</resource-env-ref-name>
+        <resource-env-ref-type>java.util.List</resource-env-ref-type>
+    </resource-env-ref>
+    <resource-env-ref>
+        <description>description_2</description>
+        <resource-env-ref-name>name_2</resource-env-ref-name>
+        <resource-env-ref-type>java.sql.Data</resource-env-ref-type>
+    </resource-env-ref>
+    <resource-env-ref>
+        <description>description_3</description>
+        <resource-env-ref-name>name_3</resource-env-ref-name>
+        <resource-env-ref-type>java.lang.Integer</resource-env-ref-type>
+    </resource-env-ref>
+    <resource-env-ref>
+        <description>description_4</description>
+        <resource-env-ref-name>name_4</resource-env-ref-name>
+        <resource-env-ref-type>java.lang.String</resource-env-ref-type>
+    </resource-env-ref>
+    <callback-handler>java.util.HashTable</callback-handler>
+</application-client>
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/.classpath b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/.classpath
new file mode 100644
index 0000000..b25cae2
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="ejbModule"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/WebSphere Application Server v6.0 JRE"/>
+	<classpathentry kind="con" path="com.ibm.wtp.server.java.core.container/com.ibm.ws.ast.st.runtime.core.runtimeTarget.v60/WebSphere Application Server v6.0"/>
+	<classpathentry kind="output" path="ejbModule"/>
+</classpath>
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/.j2ee b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/.j2ee
new file mode 100644
index 0000000..659969d
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/.j2ee
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<j2eesettings version="600">

+<moduleversion>20</moduleversion>

+</j2eesettings>

diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/.project b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/.project
new file mode 100644
index 0000000..a84f751
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/.project
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>LooseEAREjb</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>com.ibm.wtp.migration.MigrationBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>com.ibm.etools.validation.validationbuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>com.ibm.wtp.j2ee.LibCopyBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>com.ibm.etools.j2ee.LibCopyBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
+		<nature>com.ibm.etools.j2ee.EJB2_0Nature</nature>
+		<nature>com.ibm.wtp.ejb.EJBNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.jem.beaninfo.BeanInfoNature</nature>
+	</natures>
+</projectDescription>
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/.runtime b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/.runtime
new file mode 100644
index 0000000..ddc5d41
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/.runtime
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<runtime runtime-id="WebSphere Application Server v6.0"/>

diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/bin/META-INF/MANIFEST.MF b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/bin/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..7ebad27
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/bin/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Class-Path: util.jar ../boo.jar
+
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/bin/META-INF/ejb-jar.xml b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/bin/META-INF/ejb-jar.xml
new file mode 100644
index 0000000..bdce1e4
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/bin/META-INF/ejb-jar.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 1.1//EN" "http://java.sun.com/j2ee/dtds/ejb-jar_1_1.dtd">
+<ejb-jar id="ejb-jar_ID">
+	<display-name>LooseEAREjb</display-name>
+	<enterprise-beans>
+		<entity id="MyCMP">
+			<ejb-name>MyCMP</ejb-name>
+			<home>com.ibm.test.ejb.MyCMPHome</home>
+			<remote>com.ibm.test.ejb.MyCMP</remote>
+			<ejb-class>com.ibm.test.ejb.MyCMPBean</ejb-class>
+			<persistence-type>Container</persistence-type>
+			<prim-key-class>com.ibm.test.ejb.MyCMPKey</prim-key-class>
+			<reentrant>False</reentrant>
+			<cmp-field>
+				<field-name>k1</field-name>
+			</cmp-field>
+		</entity>
+	</enterprise-beans>
+</ejb-jar>
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/bin/META-INF/ibm-ejb-jar-bnd.xmi b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/bin/META-INF/ibm-ejb-jar-bnd.xmi
new file mode 100644
index 0000000..573af4e
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/bin/META-INF/ibm-ejb-jar-bnd.xmi
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<ejbbnd:EJBJarBinding xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:ejbbnd="ejbbnd.xmi" xmlns:ejb="ejb.xmi" xmi:id="ejb-jar_ID_Bnd">

+  <ejbJar href="META-INF/ejb-jar.xml#ejb-jar_ID"/>

+  <ejbBindings xmi:id="MyCMP_Bnd" jndiName="ejb/com/ibm/test/ejb/MyCMPHome">

+    <enterpriseBean xmi:type="ejb:ContainerManagedEntity" href="META-INF/ejb-jar.xml#MyCMP"/>

+  </ejbBindings>

+</ejbbnd:EJBJarBinding>

diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/bin/META-INF/ibm-ejb-jar-ext.xmi b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/bin/META-INF/ibm-ejb-jar-ext.xmi
new file mode 100644
index 0000000..46e70a8
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/bin/META-INF/ibm-ejb-jar-ext.xmi
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<ejbext:EJBJarExtension xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:ejbext="ejbext.xmi" xmlns:ejb="ejb.xmi" xmi:id="ejb-jar_ID">

+  <ejbJar href="META-INF/ejb-jar.xml#ejb-jar_ID"/>

+</ejbext:EJBJarExtension>

diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/bin/com/ibm/test/ejb/MyCMP.class b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/bin/com/ibm/test/ejb/MyCMP.class
new file mode 100644
index 0000000..51f7277
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/bin/com/ibm/test/ejb/MyCMP.class
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/bin/com/ibm/test/ejb/MyCMPBean.class b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/bin/com/ibm/test/ejb/MyCMPBean.class
new file mode 100644
index 0000000..78ced2f
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/bin/com/ibm/test/ejb/MyCMPBean.class
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/bin/com/ibm/test/ejb/MyCMPHome.class b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/bin/com/ibm/test/ejb/MyCMPHome.class
new file mode 100644
index 0000000..0492590
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/bin/com/ibm/test/ejb/MyCMPHome.class
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/bin/com/ibm/test/ejb/MyCMPKey.class b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/bin/com/ibm/test/ejb/MyCMPKey.class
new file mode 100644
index 0000000..91b6702
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/bin/com/ibm/test/ejb/MyCMPKey.class
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/META-INF/MANIFEST.MF b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..59499bc
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/META-INF/MANIFEST.MF
@@ -0,0 +1,2 @@
+Manifest-Version: 1.0
+
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/META-INF/ejb-jar.xml b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/META-INF/ejb-jar.xml
new file mode 100644
index 0000000..46bae90
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/META-INF/ejb-jar.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd">
+<ejb-jar id="ejb-jar_ID">
+	<display-name>LooseEAREjb</display-name>
+	<enterprise-beans>
+		<entity id="CMP1">
+			<ejb-name>CMP1</ejb-name>
+			<local-home>ejbs.CMP1LocalHome</local-home>
+			<local>ejbs.CMP1Local</local>
+			<ejb-class>ejbs.CMP1Bean</ejb-class>
+			<persistence-type>Container</persistence-type>
+			<prim-key-class>ejbs.CMP1Key</prim-key-class>
+			<reentrant>False</reentrant>
+			<cmp-version>2.x</cmp-version>
+			<abstract-schema-name>CMP1</abstract-schema-name>
+			<cmp-field>
+				<field-name>id</field-name>
+			</cmp-field>
+		</entity>
+		<entity id="CMP2">
+			<ejb-name>CMP2</ejb-name>
+			<local-home>ejbs.CMP2LocalHome</local-home>
+			<local>ejbs.CMP2Local</local>
+			<ejb-class>ejbs.CMP2Bean</ejb-class>
+			<persistence-type>Container</persistence-type>
+			<prim-key-class>ejbs.CMP2Key</prim-key-class>
+			<reentrant>False</reentrant>
+			<cmp-version>2.x</cmp-version>
+			<abstract-schema-name>CMP2</abstract-schema-name>
+			<cmp-field>
+				<field-name>id</field-name>
+			</cmp-field>
+		</entity>
+	</enterprise-beans>
+</ejb-jar>
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/META-INF/ibm-ejb-jar-bnd.xmi b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/META-INF/ibm-ejb-jar-bnd.xmi
new file mode 100644
index 0000000..a08df99
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/META-INF/ibm-ejb-jar-bnd.xmi
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<ejbbnd:EJBJarBinding xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:ejb="ejb.xmi" xmlns:ejbbnd="ejbbnd.xmi" xmi:id="EJBJarBinding_1099076698481">

+  <ejbJar href="META-INF/ejb-jar.xml#ejb-jar_ID"/>

+  <ejbBindings xmi:id="EnterpriseBeanBinding_1099076698491" jndiName="ejb/ejbs/CMP1LocalHome">

+    <enterpriseBean xmi:type="ejb:ContainerManagedEntity" href="META-INF/ejb-jar.xml#CMP1"/>

+  </ejbBindings>

+  <ejbBindings xmi:id="EnterpriseBeanBinding_1099076729295" jndiName="ejb/ejbs/CMP2LocalHome">

+    <enterpriseBean xmi:type="ejb:ContainerManagedEntity" href="META-INF/ejb-jar.xml#CMP2"/>

+  </ejbBindings>

+  <defaultCMPConnectionFactory xmi:id="CMPConnectionFactoryBinding_1099076698491" jndiName="jdbc/Default" resAuth="Per_Connection_Factory"/>

+</ejbbnd:EJBJarBinding>

diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/META-INF/ibm-ejb-jar-ext.xmi b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/META-INF/ibm-ejb-jar-ext.xmi
new file mode 100644
index 0000000..46e70a8
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/META-INF/ibm-ejb-jar-ext.xmi
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<ejbext:EJBJarExtension xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:ejbext="ejbext.xmi" xmlns:ejb="ejb.xmi" xmi:id="ejb-jar_ID">

+  <ejbJar href="META-INF/ejb-jar.xml#ejb-jar_ID"/>

+</ejbext:EJBJarExtension>

diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/com/ibm/test/ejb/MyCMP.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/com/ibm/test/ejb/MyCMP.java
new file mode 100644
index 0000000..12b8b7c
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/com/ibm/test/ejb/MyCMP.java
@@ -0,0 +1,6 @@
+package com.ibm.test.ejb;
+/**
+ * Remote interface for Enterprise Bean: MyCMP
+ */
+public interface MyCMP extends javax.ejb.EJBObject {
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/com/ibm/test/ejb/MyCMPBean.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/com/ibm/test/ejb/MyCMPBean.java
new file mode 100644
index 0000000..bcdb044
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/com/ibm/test/ejb/MyCMPBean.java
@@ -0,0 +1,97 @@
+package com.ibm.test.ejb;
+/**
+ * Bean implementation class for Enterprise Bean: MyCMP
+ */
+public class MyCMPBean extends com.ibm.test.A implements javax.ejb.EntityBean {
+	private javax.ejb.EntityContext myEntityCtx;
+	/**
+	 * Implemetation field for persistent attribute: k1
+	 */
+	public java.lang.String k1;
+	/**
+	 * getEntityContext
+	 */
+	public javax.ejb.EntityContext getEntityContext() {
+		return myEntityCtx;
+	}
+	/**
+	 * setEntityContext
+	 */
+	public void setEntityContext(javax.ejb.EntityContext ctx) {
+		myEntityCtx = ctx;
+	}
+	/**
+	 * unsetEntityContext
+	 */
+	public void unsetEntityContext() {
+		myEntityCtx = null;
+	}
+	/**
+	 * ejbActivate
+	 */
+	public void ejbActivate() {
+		_initLinks();
+	}
+	/**
+	 * ejbCreate method for a CMP entity bean.
+	 */
+	public com.ibm.test.ejb.MyCMPKey ejbCreate(java.lang.String k1) throws javax.ejb.CreateException {
+		_initLinks();
+		this.k1 = k1;
+		return null;
+	}
+	/**
+	 * ejbLoad
+	 */
+	public void ejbLoad() {
+		_initLinks();
+	}
+	/**
+	 * ejbPassivate
+	 */
+	public void ejbPassivate() {
+	}
+	/**
+	 * ejbPostCreate
+	 */
+	public void ejbPostCreate(java.lang.String k1) throws javax.ejb.CreateException {
+	}
+	/**
+	 * ejbRemove
+	 */
+	public void ejbRemove() throws javax.ejb.RemoveException {
+		try {
+			_removeLinks();
+		} catch (java.rmi.RemoteException e) {
+			throw new javax.ejb.RemoveException(e.getMessage());
+		}
+	}
+	/**
+	 * ejbStore
+	 */
+	public void ejbStore() {
+	}
+	/**
+	 * This method was generated for supporting the associations.
+	 */
+	protected void _initLinks() {
+	}
+	/**
+	 * This method was generated for supporting the associations.
+	 */
+	protected java.util.Vector _getLinks() {
+		java.util.Vector links = new java.util.Vector();
+		return links;
+	}
+	/**
+	 * This method was generated for supporting the associations.
+	 */
+	protected void _removeLinks() throws java.rmi.RemoteException, javax.ejb.RemoveException {
+		java.util.List links = _getLinks();
+		for (int i = 0; i < links.size() ; i++) {
+			try {
+				((com.ibm.ivj.ejb.associations.interfaces.Link) links.get(i)).remove();
+			} catch (javax.ejb.FinderException e) {} //Consume Finder error since I am going away
+		}
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/com/ibm/test/ejb/MyCMPHome.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/com/ibm/test/ejb/MyCMPHome.java
new file mode 100644
index 0000000..7c09f21
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/com/ibm/test/ejb/MyCMPHome.java
@@ -0,0 +1,14 @@
+package com.ibm.test.ejb;
+/**
+ * Home interface for Enterprise Bean: MyCMP
+ */
+public interface MyCMPHome extends javax.ejb.EJBHome {
+	/**
+	 * Creates an instance from a key for Entity Bean: MyCMP
+	 */
+	public com.ibm.test.ejb.MyCMP create(java.lang.String k1) throws javax.ejb.CreateException, java.rmi.RemoteException;
+	/**
+	 * Finds an instance using a key for Entity Bean: MyCMP
+	 */
+	public com.ibm.test.ejb.MyCMP findByPrimaryKey(com.ibm.test.ejb.MyCMPKey primaryKey) throws javax.ejb.FinderException, java.rmi.RemoteException;
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/com/ibm/test/ejb/MyCMPKey.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/com/ibm/test/ejb/MyCMPKey.java
new file mode 100644
index 0000000..7aa6f79
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/com/ibm/test/ejb/MyCMPKey.java
@@ -0,0 +1,39 @@
+package com.ibm.test.ejb;
+/**
+ * Key class for Entity Bean: MyCMP
+ */
+public class MyCMPKey extends com.ibm.test.A implements java.io.Serializable {
+
+	static final long serialVersionUID = 3206093459760846163L;
+	/**
+	 * Implemetation field for persistent attribute: k1
+	 */
+	public java.lang.String k1;
+	/**
+	 * Creates an empty key for Entity Bean: MyCMP
+	 */
+	public MyCMPKey() {
+	}
+	/**
+	 * Returns true if both keys are equal.
+	 */
+	public boolean equals(java.lang.Object otherKey) {
+		if (otherKey instanceof com.ibm.test.ejb.MyCMPKey) {
+			com.ibm.test.ejb.MyCMPKey o = (com.ibm.test.ejb.MyCMPKey)otherKey;
+			return ((this.k1.equals(o.k1)));
+		}
+		return false;
+	}
+	/**
+	 * Returns the hash code for the key.
+	 */
+	public int hashCode() {
+		return (k1.hashCode());
+	}
+	/**
+	 * Creates a key for Entity Bean: MyCMP
+	 */
+	public MyCMPKey(java.lang.String k1) {
+		this.k1 = k1;
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/ejbs/CMP1Bean.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/ejbs/CMP1Bean.java
new file mode 100644
index 0000000..7972747
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/ejbs/CMP1Bean.java
@@ -0,0 +1,72 @@
+package ejbs;
+/**
+ * Bean implementation class for Enterprise Bean: CMP1
+ */
+public abstract class CMP1Bean implements javax.ejb.EntityBean {
+	private javax.ejb.EntityContext myEntityCtx;
+	/**
+	 * setEntityContext
+	 */
+	public void setEntityContext(javax.ejb.EntityContext ctx) {
+		myEntityCtx = ctx;
+	}
+	/**
+	 * getEntityContext
+	 */
+	public javax.ejb.EntityContext getEntityContext() {
+		return myEntityCtx;
+	}
+	/**
+	 * unsetEntityContext
+	 */
+	public void unsetEntityContext() {
+		myEntityCtx = null;
+	}
+	/**
+	 * ejbCreate
+	 */
+	public ejbs.CMP1Key ejbCreate(java.lang.Integer id)
+		throws javax.ejb.CreateException {
+		setId(id);
+		return null;
+	}
+	/**
+	 * ejbPostCreate
+	 */
+	public void ejbPostCreate(java.lang.Integer id)
+		throws javax.ejb.CreateException {
+	}
+	/**
+	 * ejbActivate
+	 */
+	public void ejbActivate() {
+	}
+	/**
+	 * ejbLoad
+	 */
+	public void ejbLoad() {
+	}
+	/**
+	 * ejbPassivate
+	 */
+	public void ejbPassivate() {
+	}
+	/**
+	 * ejbRemove
+	 */
+	public void ejbRemove() throws javax.ejb.RemoveException {
+	}
+	/**
+	 * ejbStore
+	 */
+	public void ejbStore() {
+	}
+	/**
+	 * Get accessor for persistent attribute: id
+	 */
+	public abstract java.lang.Integer getId();
+	/**
+	 * Set accessor for persistent attribute: id
+	 */
+	public abstract void setId(java.lang.Integer newId);
+}
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/ejbs/CMP1Key.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/ejbs/CMP1Key.java
new file mode 100644
index 0000000..6924016
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/ejbs/CMP1Key.java
@@ -0,0 +1,38 @@
+package ejbs;
+/**
+ * Key class for Entity Bean: CMP1
+ */
+public class CMP1Key implements java.io.Serializable {
+	static final long serialVersionUID = 3206093459760846163L;
+	/**
+	 * Implementation field for persistent attribute: id
+	 */
+	public java.lang.Integer id;
+	/**
+	 * Creates an empty key for Entity Bean: CMP1
+	 */
+	public CMP1Key() {
+	}
+	/**
+	 * Creates a key for Entity Bean: CMP1
+	 */
+	public CMP1Key(java.lang.Integer id) {
+		this.id = id;
+	}
+	/**
+	 * Returns true if both keys are equal.
+	 */
+	public boolean equals(java.lang.Object otherKey) {
+		if (otherKey instanceof ejbs.CMP1Key) {
+			ejbs.CMP1Key o = (ejbs.CMP1Key) otherKey;
+			return ((this.id.equals(o.id)));
+		}
+		return false;
+	}
+	/**
+	 * Returns the hash code for the key.
+	 */
+	public int hashCode() {
+		return (id.hashCode());
+	}
+}
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/ejbs/CMP1Local.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/ejbs/CMP1Local.java
new file mode 100644
index 0000000..bdfdb59
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/ejbs/CMP1Local.java
@@ -0,0 +1,6 @@
+package ejbs;
+/**
+ * Local interface for Enterprise Bean: CMP1
+ */
+public interface CMP1Local extends javax.ejb.EJBLocalObject {
+}
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/ejbs/CMP1LocalHome.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/ejbs/CMP1LocalHome.java
new file mode 100644
index 0000000..d856a30
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/ejbs/CMP1LocalHome.java
@@ -0,0 +1,16 @@
+package ejbs;
+/**
+ * Local Home interface for Enterprise Bean: CMP1
+ */
+public interface CMP1LocalHome extends javax.ejb.EJBLocalHome {
+	/**
+	 * Creates an instance from a key for Entity Bean: CMP1
+	 */
+	public ejbs.CMP1Local create(java.lang.Integer id)
+		throws javax.ejb.CreateException;
+	/**
+	 * Finds an instance using a key for Entity Bean: CMP1
+	 */
+	public ejbs.CMP1Local findByPrimaryKey(ejbs.CMP1Key primaryKey)
+		throws javax.ejb.FinderException;
+}
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/ejbs/CMP2Bean.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/ejbs/CMP2Bean.java
new file mode 100644
index 0000000..b69abe1
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/ejbs/CMP2Bean.java
@@ -0,0 +1,72 @@
+package ejbs;
+/**
+ * Bean implementation class for Enterprise Bean: CMP2
+ */
+public abstract class CMP2Bean implements javax.ejb.EntityBean {
+	private javax.ejb.EntityContext myEntityCtx;
+	/**
+	 * setEntityContext
+	 */
+	public void setEntityContext(javax.ejb.EntityContext ctx) {
+		myEntityCtx = ctx;
+	}
+	/**
+	 * getEntityContext
+	 */
+	public javax.ejb.EntityContext getEntityContext() {
+		return myEntityCtx;
+	}
+	/**
+	 * unsetEntityContext
+	 */
+	public void unsetEntityContext() {
+		myEntityCtx = null;
+	}
+	/**
+	 * ejbCreate
+	 */
+	public ejbs.CMP2Key ejbCreate(java.lang.Integer id)
+		throws javax.ejb.CreateException {
+		setId(id);
+		return null;
+	}
+	/**
+	 * ejbPostCreate
+	 */
+	public void ejbPostCreate(java.lang.Integer id)
+		throws javax.ejb.CreateException {
+	}
+	/**
+	 * ejbActivate
+	 */
+	public void ejbActivate() {
+	}
+	/**
+	 * ejbLoad
+	 */
+	public void ejbLoad() {
+	}
+	/**
+	 * ejbPassivate
+	 */
+	public void ejbPassivate() {
+	}
+	/**
+	 * ejbRemove
+	 */
+	public void ejbRemove() throws javax.ejb.RemoveException {
+	}
+	/**
+	 * ejbStore
+	 */
+	public void ejbStore() {
+	}
+	/**
+	 * Get accessor for persistent attribute: id
+	 */
+	public abstract java.lang.Integer getId();
+	/**
+	 * Set accessor for persistent attribute: id
+	 */
+	public abstract void setId(java.lang.Integer newId);
+}
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/ejbs/CMP2Key.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/ejbs/CMP2Key.java
new file mode 100644
index 0000000..38e9bc7
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/ejbs/CMP2Key.java
@@ -0,0 +1,38 @@
+package ejbs;
+/**
+ * Key class for Entity Bean: CMP2
+ */
+public class CMP2Key implements java.io.Serializable {
+	static final long serialVersionUID = 3206093459760846163L;
+	/**
+	 * Implementation field for persistent attribute: id
+	 */
+	public java.lang.Integer id;
+	/**
+	 * Creates an empty key for Entity Bean: CMP2
+	 */
+	public CMP2Key() {
+	}
+	/**
+	 * Creates a key for Entity Bean: CMP2
+	 */
+	public CMP2Key(java.lang.Integer id) {
+		this.id = id;
+	}
+	/**
+	 * Returns true if both keys are equal.
+	 */
+	public boolean equals(java.lang.Object otherKey) {
+		if (otherKey instanceof ejbs.CMP2Key) {
+			ejbs.CMP2Key o = (ejbs.CMP2Key) otherKey;
+			return ((this.id.equals(o.id)));
+		}
+		return false;
+	}
+	/**
+	 * Returns the hash code for the key.
+	 */
+	public int hashCode() {
+		return (id.hashCode());
+	}
+}
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/ejbs/CMP2Local.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/ejbs/CMP2Local.java
new file mode 100644
index 0000000..f6ac730
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/ejbs/CMP2Local.java
@@ -0,0 +1,6 @@
+package ejbs;
+/**
+ * Local interface for Enterprise Bean: CMP2
+ */
+public interface CMP2Local extends javax.ejb.EJBLocalObject {
+}
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/ejbs/CMP2LocalHome.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/ejbs/CMP2LocalHome.java
new file mode 100644
index 0000000..8a1bdf9
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/ejbs/CMP2LocalHome.java
@@ -0,0 +1,16 @@
+package ejbs;
+/**
+ * Local Home interface for Enterprise Bean: CMP2
+ */
+public interface CMP2LocalHome extends javax.ejb.EJBLocalHome {
+	/**
+	 * Creates an instance from a key for Entity Bean: CMP2
+	 */
+	public ejbs.CMP2Local create(java.lang.Integer id)
+		throws javax.ejb.CreateException;
+	/**
+	 * Finds an instance using a key for Entity Bean: CMP2
+	 */
+	public ejbs.CMP2Local findByPrimaryKey(ejbs.CMP2Key primaryKey)
+		throws javax.ejb.FinderException;
+}
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEARWeb/.classpath b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEARWeb/.classpath
new file mode 100644
index 0000000..71bb38b
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEARWeb/.classpath
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+    <classpathentry kind="var" path="SERVERJDK_PLUGINDIR/jre/lib/rt.jar"
+        rootpath="src" sourcepath="SERVERJDK_PLUGINDIR/src.jar"/>
+    <classpathentry kind="src" path="source"/>
+    <classpathentry kind="var" path="WAS_PLUGINDIR/lib/j2ee.jar"/>
+    <classpathentry kind="var" path="WAS_PLUGINDIR/lib/webcontainer.jar"/>
+    <classpathentry kind="var" path="WAS_PLUGINDIR/lib/ivjejb35.jar"/>
+    <classpathentry kind="var" path="WAS_PLUGINDIR/lib/websphere.jar"/>
+    <classpathentry kind="output" path="webApplication\WEB-INF\classes"/>
+</classpath>
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEARWeb/.websettings b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEARWeb/.websettings
new file mode 100644
index 0000000..0e5b9a8
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEARWeb/.websettings
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<websettings>
+	<context-root>LooseEARWeb</context-root>
+</websettings>
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEARWeb/source/com/ibm/test/web/C.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEARWeb/source/com/ibm/test/web/C.java
new file mode 100644
index 0000000..b71b394
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEARWeb/source/com/ibm/test/web/C.java
@@ -0,0 +1,14 @@
+package com.ibm.test.web;
+public class C {
+
+	/**
+	 * Constructor for C
+	 */
+	public C() {
+		super();
+	}
+
+	public static void main(String[] args) {
+	}
+}
+
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEARWeb/webApplication/META-INF/MANIFEST.MF b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEARWeb/webApplication/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..735160a
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEARWeb/webApplication/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Class-Path: LooseEAREjb.jar
+
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEARWeb/webApplication/WEB-INF/classes/com/ibm/test/web/C.class b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEARWeb/webApplication/WEB-INF/classes/com/ibm/test/web/C.class
new file mode 100644
index 0000000..4051131
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEARWeb/webApplication/WEB-INF/classes/com/ibm/test/web/C.class
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEARWeb/webApplication/WEB-INF/ibm-web-bnd.xmi b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEARWeb/webApplication/WEB-INF/ibm-web-bnd.xmi
new file mode 100644
index 0000000..d74844b
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEARWeb/webApplication/WEB-INF/ibm-web-bnd.xmi
@@ -0,0 +1,3 @@
+<webappbnd:WebAppBinding xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:webappbnd="webappbnd.xmi" xmlns:webapplication="webapplication.xmi" xmi:id="WebAppBinding_1" virtualHostName="default_host">
+	<webapp href="WEB-INF/web.xml#WebApp"/>
+</webappbnd:WebAppBinding>
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEARWeb/webApplication/WEB-INF/ibm-web-ext.xmi b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEARWeb/webApplication/WEB-INF/ibm-web-ext.xmi
new file mode 100644
index 0000000..82ec262
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEARWeb/webApplication/WEB-INF/ibm-web-ext.xmi
@@ -0,0 +1,10 @@
+<webappext:WebAppExtension xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:webappext="webappext.xmi" xmlns:webapplication="webapplication.xmi" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmi:id="WebAppExtension_1"
+  reloadInterval="3"
+  reloadingEnabled="true"
+  defaultErrorPage="error.jsp"
+  additionalClassPath=""
+  fileServingEnabled="true"
+  directoryBrowsingEnabled="false"
+  serveServletsByClassnameEnabled="true">
+	<webApp href="WEB-INF/web.xml#WebApp"/>
+</webappext:WebAppExtension>
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEARWeb/webApplication/WEB-INF/web.xml b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEARWeb/webApplication/WEB-INF/web.xml
new file mode 100644
index 0000000..1412efd
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEARWeb/webApplication/WEB-INF/web.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN" "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
+<web-app id="WebApp">
+	<display-name>LooseEARWeb</display-name>
+	<welcome-file-list>
+		<welcome-file>index.html</welcome-file>
+		<welcome-file>index.htm</welcome-file>
+		<welcome-file>index.jsp</welcome-file>
+		<welcome-file>default.html</welcome-file>
+		<welcome-file>default.htm</welcome-file>
+		<welcome-file>default.jsp</welcome-file>
+	</welcome-file-list>
+</web-app>
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseJavaUtil/.classpath b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseJavaUtil/.classpath
new file mode 100644
index 0000000..d8b3fa0
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseJavaUtil/.classpath
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+    <classpathentry kind="src" path="src"/>
+    <classpathentry kind="var" path="JRE_LIB" rootpath="JRE_SRCROOT" sourcepath="JRE_SRC"/>
+    <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseJavaUtil/bin/com/ibm/test/A.class b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseJavaUtil/bin/com/ibm/test/A.class
new file mode 100644
index 0000000..bfcfff0
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseJavaUtil/bin/com/ibm/test/A.class
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseJavaUtil/src/com/ibm/test/A.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseJavaUtil/src/com/ibm/test/A.java
new file mode 100644
index 0000000..07f09c1
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseJavaUtil/src/com/ibm/test/A.java
@@ -0,0 +1,14 @@
+package com.ibm.test;
+public class A {
+
+	/**
+	 * Constructor for A
+	 */
+	public A() {
+		super();
+	}
+
+	public static void main(String[] args) {
+	}
+}
+
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseJavaWebLib/.classpath b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseJavaWebLib/.classpath
new file mode 100644
index 0000000..d8b3fa0
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseJavaWebLib/.classpath
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+    <classpathentry kind="src" path="src"/>
+    <classpathentry kind="var" path="JRE_LIB" rootpath="JRE_SRCROOT" sourcepath="JRE_SRC"/>
+    <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseJavaWebLib/bin/com/ibm/web/test/B.class b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseJavaWebLib/bin/com/ibm/web/test/B.class
new file mode 100644
index 0000000..e3ee564
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseJavaWebLib/bin/com/ibm/web/test/B.class
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseJavaWebLib/src/com/ibm/web/test/B.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseJavaWebLib/src/com/ibm/web/test/B.java
new file mode 100644
index 0000000..ab18533
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseJavaWebLib/src/com/ibm/web/test/B.java
@@ -0,0 +1,14 @@
+package com.ibm.web.test;
+public class B {
+
+	/**
+	 * Constructor for B
+	 */
+	public B() {
+		super();
+	}
+
+	public static void main(String[] args) {
+	}
+}
+
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/boo.jar/META-INF/MANIFEST.MF b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/boo.jar/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..1743e3d
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/boo.jar/META-INF/MANIFEST.MF
@@ -0,0 +1,4 @@
+Manifest-Version: 1.0
+Class-Path: util.jar LooseEAREjb/bin foobar.jar 
+
+
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/foobar.jar b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/foobar.jar
new file mode 100644
index 0000000..4a76798
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/foobar.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/readme.txt b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/readme.txt
new file mode 100644
index 0000000..fdd5d18
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/readme.txt
@@ -0,0 +1 @@
+This is not a full     workspace; it is just the files necessary to emulate one, for unit testing the runtime
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/AllDOMTests.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/AllDOMTests.java
new file mode 100644
index 0000000..49b7420
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/AllDOMTests.java
@@ -0,0 +1,59 @@
+/*
+ * Created on Sep 5, 2003
+ *
+ */
+package org.eclipse.jst.j2ee.archive.emftests;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.wst.common.internal.emf.resource.EMF2DOMRendererFactory;
+
+/**
+ * @author Administrator
+ */
+public class AllDOMTests extends TestSuite {
+	
+//	private RendererFactory defaultRendererFactory;
+
+//    public AllDOMTests(String name) {
+//		super(name);
+//	}
+	
+//	public AllDOMTests(String name, RendererFactory rf) {
+//		super(name);
+//		this.defaultRendererFactory = rf;
+//	}
+	
+	public static Test suite() {
+		TestSuite suite = new TestSuite("All DOM Tests for com.ibm.etools.archive.emftest");
+		//$JUnit-BEGIN$
+		suite.addTest(AppClientEMFEditTest.suite(EMF2DOMRendererFactory.INSTANCE));
+		suite.addTest(AppClientEMFTest.suite(EMF2DOMRendererFactory.INSTANCE));
+		suite.addTest(EarEMFEditTest.suite(EMF2DOMRendererFactory.INSTANCE));
+		suite.addTest(EarEMFTest.suite(EMF2DOMRendererFactory.INSTANCE)); //
+		suite.addTest(EjbEMFEditTest.suite(EMF2DOMRendererFactory.INSTANCE));
+		suite.addTest(EjbEMFTest.suite(EMF2DOMRendererFactory.INSTANCE));
+		suite.addTest(RarEMFEditTest.suite(EMF2DOMRendererFactory.INSTANCE));
+		suite.addTest(RarEMFTest.suite(EMF2DOMRendererFactory.INSTANCE));
+		suite.addTest(WarEMFEditTest.suite(EMF2DOMRendererFactory.INSTANCE));
+		suite.addTest(WarEMFTest.suite(EMF2DOMRendererFactory.INSTANCE));
+		suite.addTest(WebServicesEMFTest.suite(EMF2DOMRendererFactory.INSTANCE));
+		//$JUnit-END$
+		return suite;
+	}
+	
+	public static void main(java.lang.String[] args) {
+		 junit.textui.TestRunner.main(new String[] { AllDOMTests.class.getName() });
+	}	
+	
+//	public void testSwitchRenderer() {
+//		RendererFactory.setDefaultRendererFactory(EMF2DOMRendererFactory.INSTANCE);
+//	
+//	}
+//
+//	public void testSwitchRendererBack() {
+//		RendererFactory.setDefaultRendererFactory(defaultRendererFactory);
+//	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/AllSAXTests.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/AllSAXTests.java
new file mode 100644
index 0000000..a59f66f
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/AllSAXTests.java
@@ -0,0 +1,59 @@
+/*
+ * Created on Sep 5, 2003
+ *
+ */
+package org.eclipse.jst.j2ee.archive.emftests;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.wst.common.internal.emf.resource.EMF2SAXRendererFactory;
+
+/**
+ * @author Administrator
+ */
+public class AllSAXTests extends TestSuite{
+
+//	private RendererFactory defaultRendererFactory;
+//	
+//	AllTests tests = new AllTests(); // force the class to load if this test is loaded 
+//  
+//	public AllSAXTests(String name) {
+//		super(name);
+//	} 
+//
+//	public AllSAXTests(String name, RendererFactory rf) {
+//		super(name);
+//		this.defaultRendererFactory = rf;
+//	}
+	
+	public static Test suite() {
+		TestSuite suite = new TestSuite("All SAX Tests for com.ibm.etools.archive.emftest");
+		//$JUnit-BEGIN$
+		suite.addTest(AppClientEMFEditTest.suite(EMF2SAXRendererFactory.INSTANCE));
+		suite.addTest(AppClientEMFTest.suite(EMF2SAXRendererFactory.INSTANCE));
+		suite.addTest(EarEMFEditTest.suite(EMF2SAXRendererFactory.INSTANCE));
+		suite.addTest(EarEMFTest.suite(EMF2SAXRendererFactory.INSTANCE)); //
+		suite.addTest(EjbEMFEditTest.suite(EMF2SAXRendererFactory.INSTANCE));
+		suite.addTest(EjbEMFTest.suite(EMF2SAXRendererFactory.INSTANCE));
+		suite.addTest(RarEMFEditTest.suite(EMF2SAXRendererFactory.INSTANCE));
+		suite.addTest(RarEMFTest.suite(EMF2SAXRendererFactory.INSTANCE));
+		suite.addTest(WarEMFEditTest.suite(EMF2SAXRendererFactory.INSTANCE));
+		suite.addTest(WarEMFTest.suite(EMF2SAXRendererFactory.INSTANCE));
+		suite.addTest(WebServicesEMFTest.suite(EMF2SAXRendererFactory.INSTANCE));
+		//$JUnit-END$
+		return suite;
+	}
+	
+	public static void main(java.lang.String[] args) {
+		 junit.textui.TestRunner.main(new String[] { AllSAXTests.class.getName() });
+	}	
+	
+//	public void testSwitchRenderer() {
+//		RendererFactory.setDefaultRendererFactory(EMF2SAXRendererFactory.INSTANCE); 
+//	}
+//	
+//	public void testSwitchRendererBack() {
+//		RendererFactory.setDefaultRendererFactory(defaultRendererFactory);
+//	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/AllTests.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/AllTests.java
new file mode 100644
index 0000000..7e3008b
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/AllTests.java
@@ -0,0 +1,33 @@
+/*
+ * Created on Apr 1, 2003
+ *
+ * To change this generated comment go to 
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+package org.eclipse.jst.j2ee.archive.emftests;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * To change this generated comment go to 
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+public class AllTests {
+
+    public static Test suite() {
+        TestSuite suite = new TestSuite("Test for Common Archive and EMF Tests");
+        //$JUnit-BEGIN$
+
+		suite.addTest(AllDOMTests.suite());
+		suite.addTest(AllSAXTests.suite());
+
+		//$JUnit-END$
+		return suite;
+	}
+	
+	public static void main(java.lang.String[] args) {
+		junit.textui.TestRunner.main(new String[] { AllTests.class.getName() });
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/AppClientEMFEditTest.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/AppClientEMFEditTest.java
new file mode 100644
index 0000000..419c3af
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/AppClientEMFEditTest.java
@@ -0,0 +1,64 @@
+package org.eclipse.jst.j2ee.archive.emftests;
+
+import junit.framework.TestSuite;
+import junit.textui.TestRunner;
+
+import org.eclipse.jst.j2ee.client.ApplicationClientResource;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.ApplicationClientFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.EARFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.DuplicateObjectException;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.OpenFailureException;
+import org.eclipse.jst.j2ee.core.tests.bvt.AutomatedBVT;
+import org.eclipse.wst.common.internal.emf.resource.RendererFactory;
+
+
+public class AppClientEMFEditTest extends GeneralEMFEditingTest {
+    EARFile earFile;
+    ApplicationClientFile appClientFile;
+
+    public AppClientEMFEditTest(String name) {
+        super(name);
+    }
+    
+    public AppClientEMFEditTest(String name, RendererFactory factory) {
+    	super(name, factory);
+    }
+    
+    public static void main(java.lang.String[] args) {
+        String[] className = { "com.ibm.etools.archive.test.AppClientEMFEditTest", "-noloading" };
+        TestRunner.main(className);
+    }
+    
+    public static junit.framework.Test suite(RendererFactory factory) {
+        TestSuite suite = new TestSuite(AppClientEMFEditTest.class.getName());
+        suite.addTest(new AppClientEMFEditTest("testApplicationClientEdit", factory));
+        return suite;
+    }
+    
+    public void testApplicationClientEdit() throws Exception {
+        getAppClient();
+        assertEquals("1.3", appClientFile.getDeploymentDescriptor().getVersion());
+
+        ApplicationClientResource DD = (ApplicationClientResource) appClientFile.getDeploymentDescriptorResource();
+		setVersion(VERSION_1_3);
+		setModuleType(APP_CLIENT);
+        editRoot(DD.getRootObject());
+        String curDir = AutomatedBVT.baseDirectory;
+        String out = curDir + "testOutput/EMFModelCreationTests/EditAppEAR";
+        appClientFile.extractTo(out, Archive.EXPAND_ALL);
+        appClientFile.close();
+
+        //Compare
+        
+        String exampleDeploymentDesURI = curDir + "EMFTests/application-client.xml";
+        String curDeploymentDesURI = curDir + out + "/AppClientfoo/META-INF/application-client.xml";
+		setIgnoreAtt(ignorableAttributes());
+        //compareContents(curDeploymentDesURI, exampleDeploymentDesURI);
+    }
+
+    public void getAppClient() throws DuplicateObjectException, OpenFailureException {
+        String in = AutomatedBVT.baseDirectory + "loose_module_workspace/LooseEARApp/fooAPP/";
+        appClientFile = getArchiveFactory().openApplicationClientFile(in);
+    }
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/AppClientEMFTest.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/AppClientEMFTest.java
new file mode 100644
index 0000000..5e2596e
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/AppClientEMFTest.java
@@ -0,0 +1,124 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.archive.emftests;
+
+import junit.framework.TestSuite;
+import junit.textui.TestRunner;
+
+import org.eclipse.jst.j2ee.archive.testutilities.EMFAttributeFeatureGenerator;
+import org.eclipse.jst.j2ee.client.ApplicationClientResource;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.ApplicationClientFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.EARFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.DuplicateObjectException;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.OpenFailureException;
+import org.eclipse.jst.j2ee.core.tests.bvt.AutomatedBVT;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.wst.common.internal.emf.resource.RendererFactory;
+
+
+public class AppClientEMFTest extends GeneralEMFPopulationTest {
+    EARFile earFile;
+    protected ApplicationClientFile appClientFile;
+	EARFile earFile14;
+	ApplicationClientFile appClientFile14;
+
+    public AppClientEMFTest(String name) {
+        super(name);
+    }
+    
+    public AppClientEMFTest(String name, RendererFactory factory) {
+    	super(name, factory);
+    }
+    
+    public static void main(java.lang.String[] args) {
+        String[] className = { "com.ibm.etools.archive.test.AppClientEMFTest", "-noloading" };
+        TestRunner.main(className);
+    }
+
+    public static junit.framework.Test suite(RendererFactory factory) {
+        TestSuite suite = new TestSuite(AppClientEMFTest.class.getName());
+        //[248158] suite.addTest(new AppClientEMFTest("testApplicationClientPopulation", factory));
+        suite.addTest(new AppClientEMFTest("test14ApplicationClientPopulation", factory));
+        return suite;
+    }
+
+    public void testApplicationClientPopulation() throws Exception {
+		EMFAttributeFeatureGenerator.reset();
+        createEAR();
+        createAppClient();
+
+        ApplicationClientResource DD = (ApplicationClientResource) appClientFile.getDeploymentDescriptorResource();
+        DD.setVersionID(J2EEVersionConstants.J2EE_1_3_ID);
+        setVersion(VERSION_1_3);
+        setModuleType(APP_CLIENT);
+        populateRoot(DD.getRootObject());
+
+		String out = AutomatedBVT.baseDirectory +"testOutput/TestAppEAR";
+        earFile.extractTo(out, Archive.EXPAND_ALL);
+        earFile.close();
+
+        //Compare
+        String curDir = AutomatedBVT.baseDirectory;
+        String exampleDeploymentDesURI = curDir + "EMFTestNoID/application-client.xml";
+        String curDeploymentDesURI = curDir + "testOutput/TestAppEAR/fooAPP/META-INF/application-client.xml";
+		setIgnoreAtt(ignorableAttributes());
+		compareContentsIgnoreWhitespace(curDeploymentDesURI, exampleDeploymentDesURI, null);
+    }
+
+	public void test14ApplicationClientPopulation() throws Exception {
+			EMFAttributeFeatureGenerator.reset();
+			createEAR();
+			createAppClient();
+
+			ApplicationClientResource DD = (ApplicationClientResource) appClientFile.getDeploymentDescriptorResource();
+			DD.setVersionID(J2EEVersionConstants.J2EE_1_4_ID);
+			setVersion(VERSION_1_4);
+			setModuleType(APP_CLIENT);
+			populateRoot(DD.getRootObject());
+
+			String out = AutomatedBVT.baseDirectory +"testOutput/TestAppEAR14";
+			earFile.extractTo(out, Archive.EXPAND_ALL);
+			earFile.close();
+
+			getApp14Client();
+			assertEquals("1.4", appClientFile14.getDeploymentDescriptor().getVersion());
+			out = AutomatedBVT.baseDirectory +"testOutput/TestAppEAR14_2";
+			appClientFile14.extractTo(out, Archive.EXPAND_ALL);
+			appClientFile14.close();
+			
+			//Compare
+			String curDir = AutomatedBVT.baseDirectory;
+			String curDeploymentDesURI = curDir + "testOutput/TestAppEAR14/fooAPP/META-INF/application-client.xml";
+			String secondDeploymentDesURI = out + "/META-INF/application-client.xml";
+			setIgnoreAtt(ignorableAttributes());
+			compareContentsIgnoreWhitespace(curDeploymentDesURI, secondDeploymentDesURI, null);
+	}
+	
+    public void createAppClient() throws DuplicateObjectException {
+        appClientFile = getArchiveFactory().createApplicationClientFileInitialized("fooAPP");
+        appClientFile = (ApplicationClientFile) earFile.addCopy(appClientFile);
+        appClientFile.getDeploymentDescriptor().setDisplayName("fooAPP");
+        assertTrue(appClientFile.getDeploymentDescriptor() != null);
+    }
+
+    public void createEAR() {
+        String earName = "Test.ear";
+        earFile = getArchiveFactory().createEARFileInitialized(earName);
+        assertTrue(earFile.getDeploymentDescriptor() != null);
+    }
+    
+    
+	public void getApp14Client() throws DuplicateObjectException, OpenFailureException {
+		String in = AutomatedBVT.baseDirectory + "testOutput/TestAppEAR14/fooAPP";
+		appClientFile14 = getArchiveFactory().openApplicationClientFile(in);
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/EarEMFEditTest.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/EarEMFEditTest.java
new file mode 100644
index 0000000..e5f40f6
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/EarEMFEditTest.java
@@ -0,0 +1,117 @@
+package org.eclipse.jst.j2ee.archive.emftests;
+
+import junit.framework.TestSuite;
+import junit.textui.TestRunner;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.jst.j2ee.application.ApplicationFactory;
+import org.eclipse.jst.j2ee.application.ApplicationResource;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.EARFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.OpenFailureException;
+import org.eclipse.jst.j2ee.core.tests.bvt.AutomatedBVT;
+import org.eclipse.wst.common.internal.emf.resource.RendererFactory;
+
+
+public class EarEMFEditTest extends GeneralEMFEditingTest {
+    EARFile earFile;
+    int createdModules = 0;
+
+    private int NUM_MODULES = 4;
+
+    public EarEMFEditTest(String name) {
+        super(name);
+    }
+    
+    public EarEMFEditTest(String name, RendererFactory factory) {
+    	super(name, factory);
+    }
+	
+    public static void main(java.lang.String[] args) {
+        String[] className = { "com.ibm.etools.archive.test.EarEMFEditTest", "-noloading" };
+        TestRunner.main(className);
+    }
+
+    public static junit.framework.Test suite(RendererFactory factory) {
+        TestSuite suite = new TestSuite(EarEMFEditTest.class.getName());
+        suite.addTest(new EarEMFEditTest("testEAREdit", factory));
+        return suite;
+    }
+
+    public void testEAREdit() throws Exception {
+        getEAR();
+
+		assertEquals("1.2", earFile.getDeploymentDescriptor().getVersion());
+
+        ApplicationResource DD = (ApplicationResource) earFile.getDeploymentDescriptorResource();
+		setVersion(VERSION_1_3);
+		setModuleType(APPICATION); 
+        editRoot(DD.getRootObject());
+        String curDir = AutomatedBVT.baseDirectory;
+        
+        String out = curDir +"testOutput/EditOutput/EMFModelCreationTests/EditEAR";
+        earFile.extractTo(out, Archive.EXPAND_ALL);
+        earFile.close();
+
+        //Compare work in progress
+       
+        String exampleDeploymentDesURI = curDir + "EMFTests/application.xml";
+        String curDeploymentDesURI = curDir + out + "/META-INF/application.xml";
+        //compareContents(curDeploymentDesURI, exampleDeploymentDesURI);
+    }
+
+    public void getEAR() throws OpenFailureException {
+        String in = AutomatedBVT.baseDirectory + "loose_module_workspace/LooseEAR/";
+        earFile = getArchiveFactory().openEARFile(in);
+        assertTrue(earFile.getDeploymentDescriptor() != null);
+    }
+
+	public EObject createInstance(EClass eClassifier) {
+		if (eClassifier.getName().equals("Module")) {
+			createdModules++;
+			switch (createdModules) {
+				case (1) :
+					return createJavaModuleInstance(eClassifier);
+				case (2) :
+					return createEJBModuleInstance(eClassifier);
+				case (3) :
+					return createWebModuleInstance(eClassifier);
+				case (4) :
+					return createConnetorModuleInstance(eClassifier);
+				default :
+					return createJavaModuleInstance(eClassifier);
+			}
+		}
+		return super.createInstance(eClassifier);
+	}
+
+	private EObject createConnetorModuleInstance(EClass eClassifier) {
+		return ((ApplicationFactory) eClassifier.getEPackage().getEFactoryInstance()).createConnectorModule();
+	}
+
+	private EObject createWebModuleInstance(EClass eClassifier) {
+		return ((ApplicationFactory) eClassifier.getEPackage().getEFactoryInstance()).createWebModule();
+	}
+
+	private EObject createEJBModuleInstance(EClass eClassifier) {
+		return ((ApplicationFactory) eClassifier.getEPackage().getEFactoryInstance()).createEjbModule();
+	}
+
+	private EObject createJavaModuleInstance(EClass eClassifier) {
+		return ((ApplicationFactory) eClassifier.getEPackage().getEFactoryInstance()).createJavaClientModule();
+	}
+
+	public Object getSharedObjectByType(EObject owner, EReference ref) {
+		if (ref.getName().equals("module"))
+			return createJavaModuleInstance((EClass) ref.getEType());
+		return super.getSharedObjectByType(owner, ref);
+	}
+
+	public int getDepthForAttribute(EReference ref) {
+		if (ref.getName().equals("modules"))
+			return NUM_MODULES;
+		return super.getDepthForAttribute(ref);
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/EarEMFTest.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/EarEMFTest.java
new file mode 100644
index 0000000..89233fa
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/EarEMFTest.java
@@ -0,0 +1,170 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.archive.emftests;
+
+import junit.framework.TestSuite;
+import junit.textui.TestRunner;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.jst.j2ee.application.ApplicationFactory;
+import org.eclipse.jst.j2ee.application.ApplicationResource;
+import org.eclipse.jst.j2ee.archive.testutilities.EMFAttributeFeatureGenerator;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.EARFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.OpenFailureException;
+import org.eclipse.jst.j2ee.core.tests.bvt.AutomatedBVT;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.wst.common.internal.emf.resource.RendererFactory;
+
+
+public class EarEMFTest extends GeneralEMFPopulationTest {
+    protected EARFile earFile;
+    int createdModules = 0;
+
+    private int NUM_MODULES = 5;
+
+    public EarEMFTest(String name) {
+        super(name);
+    }
+    
+    public EarEMFTest(String name, RendererFactory factory) {
+    	super(name, factory);
+    }
+    
+    public static void main(java.lang.String[] args) {
+        String[] className = { "com.ibm.etools.archive.test.EarEMFTest", "-noloading" };
+        TestRunner.main(className);
+    }
+
+    public static junit.framework.Test suite(RendererFactory factory) {
+        TestSuite suite = new TestSuite(EarEMFTest.class.getName());
+        //[248158] suite.addTest(new EarEMFTest("testEARPopulation", factory));
+		suite.addTest(new EarEMFTest("test14EARPopulation", factory));
+        return suite;
+    }
+
+    public void testEARPopulation() throws Exception {
+		EMFAttributeFeatureGenerator.reset();
+        createEAR();
+        //createAppClient();
+
+        ApplicationResource DD = (ApplicationResource) earFile.getDeploymentDescriptorResource();
+		//TODO: individual test for each version
+		DD.setVersionID(J2EEVersionConstants.J2EE_1_3_ID);
+		setVersion(VERSION_1_3);
+		setModuleType(APPLICATION);
+        populateRoot(DD.getRootObject());
+
+		String out = AutomatedBVT.baseDirectory +"testOutput/TestEAR";
+        earFile.extractTo(out, Archive.EXPAND_ALL);
+        earFile.close();
+
+        //Compare work in progress
+        String curDir = AutomatedBVT.baseDirectory;
+        String exampleDeploymentDesURI = curDir + "EMFTestNoID/application.xml";
+        String curDeploymentDesURI = curDir + "testOutput/TestEAR/META-INF/application.xml";
+		setIgnoreAtt(ignorableAttributes());
+		compareContentsIgnoreWhitespace(curDeploymentDesURI, exampleDeploymentDesURI, null);
+    }
+    
+	public void test14EARPopulation() throws Exception {
+		EMFAttributeFeatureGenerator.reset();
+		createEAR();
+		//createAppClient();
+
+		ApplicationResource DD = (ApplicationResource) earFile.getDeploymentDescriptorResource();
+		//TODO: individual test for each version
+		DD.setVersionID(J2EEVersionConstants.J2EE_1_4_ID);
+		setVersion(VERSION_1_4);
+		setModuleType(APPLICATION);
+		populateRoot(DD.getRootObject());
+
+		String out = AutomatedBVT.baseDirectory +"testOutput/TestEAR14";
+		earFile.extractTo(out, Archive.EXPAND_ALL);
+		earFile.close();
+
+		getEAR();
+		assertEquals("1.4", earFile.getDeploymentDescriptor().getVersion());
+		out = AutomatedBVT.baseDirectory +"testOutput/TestEAR14_2";
+		earFile.extractTo(out, Archive.EXPAND_ALL);
+		
+		earFile.close();
+
+		//Compare work in progress
+		String curDir = AutomatedBVT.baseDirectory;
+		String exampleDeploymentDesURI = out + "/META-INF/application.xml";
+		String curDeploymentDesURI = curDir + "testOutput/TestEAR14/META-INF/application.xml";
+		setIgnoreAtt(ignorableAttributes());
+		compareContentsIgnoreWhitespace(curDeploymentDesURI, exampleDeploymentDesURI, null);
+	}
+    public void createEAR() {
+        String earName = "Test.ear";
+        earFile = getArchiveFactory().createEARFileInitialized(earName);
+        assertTrue(earFile.getDeploymentDescriptor() != null);
+    }
+
+	public void getEAR() throws OpenFailureException {
+		String in =AutomatedBVT.baseDirectory +"testOutput/TestEAR14";
+		earFile = getArchiveFactory().openEARFile(in);
+		assertTrue(earFile.getDeploymentDescriptor() != null);
+	}
+
+    public EObject createInstance(EReference ref, EObject eObject) {
+		EClass eClassifier = (EClass)ref.getEType();
+        if (eClassifier.getName().equals("Module")) {
+            createdModules++;
+            switch (createdModules) {
+                case (1) :
+                    return createJavaModuleInstance(eClassifier);
+                case (2) :
+                    return createEJBModuleInstance(eClassifier);
+                case (3) :
+                    return createWebModuleInstance(eClassifier);
+                case (4) :
+                    return createConnetorModuleInstance(eClassifier);
+                default :
+                    return createJavaModuleInstance(eClassifier);
+            }
+        }
+        return super.createInstance(ref,eObject);
+    }
+
+    private EObject createConnetorModuleInstance(EClass eClassifier) {
+        return ((ApplicationFactory) eClassifier.getEPackage().getEFactoryInstance()).createConnectorModule();
+    }
+
+    private EObject createWebModuleInstance(EClass eClassifier) {
+        return ((ApplicationFactory) eClassifier.getEPackage().getEFactoryInstance()).createWebModule();
+    }
+
+    private EObject createEJBModuleInstance(EClass eClassifier) {
+        return ((ApplicationFactory) eClassifier.getEPackage().getEFactoryInstance()).createEjbModule();
+    }
+
+    private EObject createJavaModuleInstance(EClass eClassifier) {
+        return ((ApplicationFactory) eClassifier.getEPackage().getEFactoryInstance()).createJavaClientModule();
+    }
+
+    public Object getSharedObjectByType(EObject owner, EReference ref) {
+        if (ref.getName().equals("module"))
+            return createJavaModuleInstance((EClass) ref.getEType());
+        return super.getSharedObjectByType(owner, ref);
+    }
+
+    public int getDepthForAttribute(EStructuralFeature ref) {
+        if (ref.getName().equals("modules"))
+            return NUM_MODULES;
+        return super.getDepthForAttribute(ref);
+    }
+}
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/EjbEMFEditTest.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/EjbEMFEditTest.java
new file mode 100644
index 0000000..a00cf1b
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/EjbEMFEditTest.java
@@ -0,0 +1,321 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.archive.emftests;
+
+import java.util.List;
+
+import junit.framework.TestSuite;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EClassifier;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.EcorePackage;
+import org.eclipse.jst.j2ee.archive.testutilities.EMFAttributeFeatureGenerator;
+import org.eclipse.jst.j2ee.common.CommonFactory;
+import org.eclipse.jst.j2ee.common.SecurityIdentity;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.EARFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.EJBJarFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.DuplicateObjectException;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.OpenFailureException;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveOptions;
+import org.eclipse.jst.j2ee.core.tests.bvt.AutomatedBVT;
+import org.eclipse.jst.j2ee.ejb.CMPAttribute;
+import org.eclipse.jst.j2ee.ejb.EJBResource;
+import org.eclipse.jst.j2ee.ejb.EjbFactory;
+import org.eclipse.jst.j2ee.ejb.EjbPackage;
+import org.eclipse.jst.j2ee.ejb.RoleSource;
+import org.eclipse.jst.j2ee.ejb.internal.impl.MethodPermissionImpl;
+import org.eclipse.jst.j2ee.ejb.internal.impl.QueryMethodImpl;
+import org.eclipse.wst.common.internal.emf.resource.EMF2SAXRendererFactory;
+import org.eclipse.wst.common.internal.emf.resource.RendererFactory;
+
+
+public class EjbEMFEditTest extends GeneralEMFEditingTest {
+
+	protected static final EjbPackage EJB_PKG = EjbPackage.eINSTANCE;
+	EARFile earFile;
+	EJBJarFile ejbFile;
+	EObject mesBean, entityBean;
+	SecurityIdentity secID;
+	RoleSource roleSource;
+	int NUM_BEANS = 10;
+	final int NUM_RELATION_ROLES = 2;
+	int createdBeans = 0;
+	int createdSecRoles = 0;
+	protected int createdSecurityIdentities = 0;
+	boolean mpFlag = false;
+
+    public EjbEMFEditTest(String name) {
+        super(name);
+    }
+    
+    public EjbEMFEditTest(String name, RendererFactory factory) {
+    	super(name, factory);
+    }
+    
+    public static void main(java.lang.String[] args) {
+		junit.textui.TestRunner.main(new String[] { EjbEMFEditTest.class.getName() }); 
+    }
+
+    public static junit.framework.Test suite(RendererFactory factory) {
+        TestSuite suite = new TestSuite(EjbEMFEditTest.class.getName());
+        suite.addTest(new EjbEMFEditTest("testEJBJarEdit",factory));
+        suite.addTest(new EjbEMFEditTest("testWCCMJar",factory));
+        return suite;
+    }
+
+    public void testEJBJarEdit() throws Exception {
+        getEJB();
+
+		assertEquals("2.0", ejbFile.getDeploymentDescriptor().getVersion());
+        EJBResource DD = (EJBResource) ejbFile.getDeploymentDescriptorResource();
+		setVersion(VERSION_1_3);
+		setModuleType(EJB); 
+        editRoot(DD.getRootObject());
+        String curDir = AutomatedBVT.baseDirectory;
+        String out = curDir + "testOutput/EMFModelCreationTests/EditEjbEAR";
+        ejbFile.extractTo(out, Archive.EXPAND_ALL);
+        ejbFile.close();
+        
+        
+        //Compare work in progress
+        
+        String exampleDeploymentDesURI = null;
+        //System.out.println(RendererFactory.getDefaultRendererFactory());
+        if (RendererFactory.getDefaultRendererFactory() instanceof EMF2SAXRendererFactory){
+            exampleDeploymentDesURI = curDir + "EMFTests/ejb-jar2-0sax.xml";
+        }
+        else
+            exampleDeploymentDesURI = curDir + "EMFTests/ejb-jar2-0.xml";
+        //System.out.println("File: " + exampleDeploymentDesURI);
+        String curDeploymentDesURI = out + "/META-INF/ejb-jar.xml";
+        //TODO Remove after webservices xsd is restored
+        //compareContentsIgnoreWhitespace(curDeploymentDesURI, exampleDeploymentDesURI, "");
+    }
+
+    public void testWCCMJar() throws Exception {
+		String in = AutomatedBVT.baseDirectory + "../testData/ejb";
+		ArchiveOptions options = new ArchiveOptions();
+		options.setIsReadOnly(true);
+		ejbFile = getArchiveFactory().openEJBJarFile(options, in); 
+		 
+        EJBResource DD = (EJBResource) ejbFile.getDeploymentDescriptorResource();
+		DD.getRootObject();
+
+        String out = AutomatedBVT.baseDirectory + "../testData/testOutput";
+        ejbFile.extractTo(out, Archive.EXPAND_ALL);
+        ejbFile.close();
+
+        /*DD.save(System.out, null); */
+        
+        //Compare work in progress
+        String curDir = AutomatedBVT.baseDirectory;
+        String exampleDeploymentDesURI = in + "/META-INF/ejb-jar.xml";
+        String curDeploymentDesURI = out + "/META-INF/ejb-jar.xml";
+
+        compareContents(curDeploymentDesURI, exampleDeploymentDesURI);
+    }
+    
+    /**
+     * Requires j2ee.core.ws.ext to be on the classpath
+     * @throws DuplicateObjectException
+     * @throws OpenFailureException
+     */
+/*    public void testWCCMProvidedCase() throws Exception {
+
+		String in = AutomatedBVT.baseDirectory + "../wccm/ear";
+        EARFile earFile = null;
+        try {
+ 
+            CommonarchiveFactory factory =
+                    CommonarchiveFactoryImpl.getActiveFactory();
+            ArchiveOptions opt = new ArchiveOptions();
+            opt.setIsReadOnly (true);
+            opt.setUseJavaReflection (false);
+ 
+            earFile = factory.openEARFile (opt, in);
+            System.out.println ("uri: " + earFile.getURI());
+            System.out.println ("origuri: " + earFile.getOriginalURI());
+ 
+            Application application = earFile.getDeploymentDescriptor();
+            ApplicationBinding appBindings = earFile.getBindings();
+            ApplicationExtension appExtensions = earFile.getExtensions();
+ 
+
+        Iterator rs = earFile.getLoadedMofResources().iterator();
+        while (rs.hasNext())
+        {
+            Resource r = (Resource) rs.next();
+ 
+            FileOutputStream fo = new FileOutputStream (r.getURI().toString().replace('/', '-'));
+            r.save (fo, new HashMap());
+            fo.flush();
+            fo.close();
+        }
+ 
+            System.out.println("==========<Done App DD>==========");
+            System.out.println ("");
+ 
+
+        }
+        catch (Exception e) {
+            e.printStackTrace();
+        }
+        finally {
+            if(earFile != null)
+            earFile.close();
+        }
+
+    }*/
+
+    public void getEJB() throws DuplicateObjectException, OpenFailureException {
+		String in = AutomatedBVT.baseDirectory + "loose_module_workspace/LooseEAREjb/ejbModule/";
+		 ejbFile = getArchiveFactory().openEJBJarFile(in);
+        assertTrue(ejbFile.getDeploymentDescriptor() != null);
+    }
+
+	public EObject createInstance(EClass eClassifier) {
+		if (eClassifier.getName().equals("EnterpriseBean")) {
+			createdBeans++;
+			switch (createdBeans) {
+				case (3) :
+					return createContainerManagedEntityInstance(eClassifier);
+				case (7) :
+					return createMessageBeanInstance(eClassifier);
+				case (4) :
+				case (8) :
+					return createSessionBeanInstance(eClassifier);
+				default :
+					return createEntityBeanInstance(eClassifier);
+			}
+		} else if (eClassifier.getName().equals("SecurityIdentity"))
+			return createSecurityIdentitiyInstance(eClassifier);
+		else if (eClassifier.getName().equals("RoleSource"))
+			return createRoleSourceInstance(eClassifier);
+		else if (eClassifier == EcorePackage.eINSTANCE.getEAttribute())
+			return getEjbFactory().createCMPAttribute();
+		return super.createInstance(eClassifier);
+	}
+
+	private EObject createSecurityIdentitiyInstance(EClass eClassifier) {
+		/* Alternate types */
+		createdSecRoles++;
+		if ((createdSecRoles & 1) == 0)
+			return CommonFactory.eINSTANCE.createUseCallerIdentity();
+		else
+			return CommonFactory.eINSTANCE.createRunAsSpecifiedIdentity();
+	}
+
+	private EObject createRoleSourceInstance(EClass eClassifier) {
+		return ((EjbFactory) eClassifier.getEPackage().getEFactoryInstance()).createRoleSource();
+	}
+
+	private EObject createMessageBeanInstance(EClass eClassifier) {
+		return ((EjbFactory) eClassifier.getEPackage().getEFactoryInstance()).createMessageDriven();
+	}
+
+	private EObject createSessionBeanInstance(EClass eClassifier) {
+		return ((EjbFactory) eClassifier.getEPackage().getEFactoryInstance()).createSession();
+	}
+
+	private EObject createEntityBeanInstance(EClass eClassifier) {
+		return ((EjbFactory) eClassifier.getEPackage().getEFactoryInstance()).createEntity();
+	}
+
+	private EObject createContainerManagedEntityInstance(EClass eClassifier) {
+		return EjbFactory.eINSTANCE.createContainerManagedEntity();
+	}
+
+	/**
+	 * @see org.eclipse.jst.j2ee.archive.test.GeneralEMFTest#getDepthForAttribute(EReference)
+	 */
+	public int getDepthForAttribute(EReference ref) {
+		if (ref.getName().equals("enterpriseBeans"))
+			return NUM_BEANS;
+		else if (ref.getName().equals("entityBeans"))
+			return NUM_BEANS;
+		else if (ref.getName().equals("relationshipRoles"))
+			return NUM_RELATION_ROLES;
+		return super.getDepthForAttribute(ref);
+	}
+
+	/* (non-Javadoc)
+	* @see com.ibm.etools.archive.emftest.GeneralEMFPopulationTest#populateFeatures(org.eclipse.emf.ecore.EObject)
+	*/
+	public void populateFeatures(EObject eObject) {
+		if (eObject.eClass() == EJB_PKG.getCMPAttribute()) {
+			((CMPAttribute) eObject).setName((String) EMFAttributeFeatureGenerator.createAttribute(EcorePackage.eINSTANCE.getENamedElement_Name(),eObject));
+			((CMPAttribute) eObject).setEType((EClassifier) createJavaClassProxy(null));
+		} else
+			super.editFeatures(eObject);
+	}
+
+	/* (non-Javadoc)
+	 * @see com.ibm.etools.archive.emftest.GeneralEMFPopulationTest#populateAttributes(org.eclipse.emf.ecore.EObject)
+	 */
+	protected void populateAttributes(EObject eObject) {
+		if (eObject instanceof QueryMethodImpl) {
+			List attributes = eObject.eClass().getEAllAttributes();
+			for (int i = 0; i < attributes.size(); i++) {
+				EAttribute att = (EAttribute) attributes.get(i);
+				Object value = createAttributeValue(att, eObject);
+				if (att.getName().equals("parms") && value == null){
+					value = createAttributeValue(att, eObject);
+				}
+				if (att.isChangeable())
+					eObject.eSet(att, value);
+			}
+		} else if (eObject instanceof MethodPermissionImpl) {
+			List attributes = eObject.eClass().getEAllAttributes();
+			for (int i = 0; i < attributes.size(); i++) {
+				EAttribute att = (EAttribute) attributes.get(i);
+				if(att.getName().equals("unchecked") && mpFlag){
+					continue;					
+				}	
+				
+				Object value = createAttributeValue(att, eObject);
+				if (att.isChangeable())
+					eObject.eSet(att, value);
+			} 
+			mpFlag = !mpFlag;
+		} else
+			super.editAttributes(eObject);
+	}
+	
+
+	protected void populateSharedReference(EObject eObject, EReference ref) {
+		if(eObject instanceof MethodPermissionImpl && ref.getName().equals("roles")){
+			mpFlag = !mpFlag;
+			//if method permission unchecked ignore roles
+			if(!mpFlag){
+				return;
+			}
+		}
+		super.populateSharedReference(eObject, ref);
+	}
+
+	/* (non-Javadoc)
+	 * @see junit.framework.TestCase#tearDown()
+	 */
+	protected void tearDown() throws Exception {
+		earFile = null;
+		ejbFile = null;
+		mesBean = null;
+		entityBean = null;
+		secID  = null;
+		roleSource = null;
+
+		super.tearDown();
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/EjbEMFTest.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/EjbEMFTest.java
new file mode 100644
index 0000000..c153b41
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/EjbEMFTest.java
@@ -0,0 +1,347 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.archive.emftests;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.TestSuite;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EClassifier;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.EcorePackage;
+import org.eclipse.jem.java.internal.impl.JavaClassImpl;
+import org.eclipse.jst.j2ee.archive.testutilities.EMFAttributeFeatureGenerator;
+import org.eclipse.jst.j2ee.common.CommonFactory;
+import org.eclipse.jst.j2ee.common.SecurityIdentity;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.EARFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.EJBJarFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.DuplicateObjectException;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.OpenFailureException;
+import org.eclipse.jst.j2ee.core.tests.bvt.AutomatedBVT;
+import org.eclipse.jst.j2ee.ejb.CMPAttribute;
+import org.eclipse.jst.j2ee.ejb.CMRField;
+import org.eclipse.jst.j2ee.ejb.EJBResource;
+import org.eclipse.jst.j2ee.ejb.EjbFactory;
+import org.eclipse.jst.j2ee.ejb.EjbPackage;
+import org.eclipse.jst.j2ee.ejb.MethodPermission;
+import org.eclipse.jst.j2ee.ejb.RoleSource;
+import org.eclipse.jst.j2ee.ejb.internal.impl.EJBRelationshipRoleImpl;
+import org.eclipse.jst.j2ee.ejb.internal.impl.MethodPermissionImpl;
+import org.eclipse.jst.j2ee.ejb.internal.impl.QueryMethodImpl;
+import org.eclipse.jst.j2ee.internal.J2EEInit;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.wst.common.internal.emf.resource.RendererFactory;
+
+
+public class EjbEMFTest extends GeneralEMFPopulationTest {
+	static {
+		//Temporary workaround to keep packages from being registered twice
+		J2EEInit.init();
+	}
+	protected static final EjbPackage EJB_PKG = EjbPackage.eINSTANCE;
+	EARFile earFile;
+	protected EJBJarFile ejbFile;
+	EObject mesBean, entityBean;
+	SecurityIdentity secID;
+	RoleSource roleSource;
+	int NUM_BEANS = 10;
+	final int NUM_RELATION_ROLES = 2;
+	int createdBeans = 0;
+	int createdSecRoles = 0;
+	protected int createdSecurityIdentities = 0;
+	boolean mpFlag = false;
+	boolean firstReturnTypeMapping = true;
+	
+	public EjbEMFTest(String name) {
+		super(name);
+	}
+	
+    public EjbEMFTest(String name, RendererFactory factory) {
+    	super(name, factory);
+    }
+	
+	public static void main(java.lang.String[] args) {
+		junit.textui.TestRunner.main(new String[] { EjbEMFTest.class.getName()});
+	}
+
+	public static junit.framework.Test suite(RendererFactory factory) {
+		TestSuite suite = new TestSuite(EjbEMFTest.class.getName());
+		//[248158] suite.addTest(new EjbEMFTest("testEJBJarPopulation",factory));
+		suite.addTest(new EjbEMFTest("test14EJBJarPopulation",factory));
+		return suite;
+	}
+
+	public void testEJBJarPopulation() throws Exception {
+		EMFAttributeFeatureGenerator.reset();
+		createEAR();
+		createEJB();
+
+		EJBResource DD = (EJBResource) ejbFile.getDeploymentDescriptorResource();
+		//TODO: individual test for each version
+		DD.setVersionID(J2EEVersionConstants.J2EE_1_3_ID);
+		setVersion(VERSION_1_3);
+		setModuleType(EJB);
+		populateRoot(DD.getRootObject());
+
+		String out = AutomatedBVT.baseDirectory +"testOutput/TestEJBEAR";
+		earFile.extractTo(out, Archive.EXPAND_ALL);
+		earFile.close();
+		setEquivalentLines(getEquivalentLinesMap());
+		//Compare work in progress
+		String curDir = AutomatedBVT.baseDirectory;
+		String exampleDeploymentDesURI = curDir + "/EMFTestNoID/ejb-jar.xml";
+		String curDeploymentDesURI = curDir + "testOutput/TestEJBEAR/fooEJB/META-INF/ejb-jar.xml";
+		setIgnoreAtt(ignorableAttributes());
+		compareContentsIgnoreWhitespace(curDeploymentDesURI, exampleDeploymentDesURI, null);
+//		DD.unload();
+//		DD.load(new HashMap());
+	}
+	
+	public void test14EJBJarPopulation() throws Exception {
+		EMFAttributeFeatureGenerator.reset();
+		createEAR();
+		createEJB();
+
+		EJBResource DD = (EJBResource) ejbFile.getDeploymentDescriptorResource();
+		//TODO: individual test for each version
+		DD.setVersionID(J2EEVersionConstants.J2EE_1_4_ID);
+		setVersion(VERSION_1_4);
+		setModuleType(EJB);
+		//setGeneralDepth(2);
+		populateRoot(DD.getRootObject());
+		String out = AutomatedBVT.baseDirectory +"testOutput/TestEJBEAR14";
+		earFile.extractTo(out, Archive.EXPAND_ALL);
+		earFile.close();
+		
+		setEquivalentLines(getEquivalentLinesMap());
+		getEJB();
+		assertEquals("2.1", ejbFile.getDeploymentDescriptor().getVersion());
+		out = AutomatedBVT.baseDirectory +"testOutput/TestEJBEAR14_2";
+		ejbFile.extractTo(out, Archive.EXPAND_ALL);
+		ejbFile.close();
+
+		//Compare work in progress
+		String curDir = AutomatedBVT.baseDirectory;
+		String exampleDeploymentDesURI = out + "/META-INF/ejb-jar.xml";
+		String curDeploymentDesURI = curDir + "testOutput/TestEJBEAR14/fooEJB/META-INF/ejb-jar.xml";
+		setIgnoreAtt(ignorableAttributes());
+		compareContentsIgnoreWhitespace(curDeploymentDesURI, exampleDeploymentDesURI, null);
+	}
+	
+	/**
+	 * @return
+	 */
+	private Map getEquivalentLinesMap() {
+		Map lines = new HashMap();
+		lines.put("<cascade-delete></cascade-delete>", "<cascade-delete/>");
+		lines.put("<method-params></method-params>","<method-params/>");
+		lines.put("<unchecked></unchecked>","<unchecked/>"); 
+		lines.put("<use-caller-identity></use-caller-identity>","<use-caller-identity/>");
+		return lines;
+	}
+
+	public void getEJB() throws DuplicateObjectException, OpenFailureException {
+		String in = AutomatedBVT.baseDirectory +"testOutput/TestEJBEAR14/fooEJB";
+		ejbFile = getArchiveFactory().openEJBJarFile(in);
+		assertTrue(ejbFile.getDeploymentDescriptor() != null);
+	}
+
+	public void createEJB() throws DuplicateObjectException {
+		ejbFile = getArchiveFactory().createEJBJarFileInitialized("fooEJB");
+		ejbFile = (EJBJarFile) earFile.addCopy(ejbFile);
+		ejbFile.getDeploymentDescriptor().setDisplayName("fooEJB");
+		assertTrue(ejbFile.getDeploymentDescriptor() != null);
+	}
+
+	public void createEAR() {
+		String earName = "Test.ear";
+		earFile = getArchiveFactory().createEARFileInitialized(earName);
+		assertTrue(earFile.getDeploymentDescriptor() != null);
+	}
+
+	public EObject createInstance(EReference ref, EObject eObject) {
+		EClass eClassifier = (EClass)ref.getEType();
+		if (eClassifier.getName().equals("EnterpriseBean")) {
+			createdBeans++;
+			switch (createdBeans) {
+				case (3) :
+					return createContainerManagedEntityInstance(eClassifier);
+				case (7) :
+					return createMessageBeanInstance(eClassifier);
+				case (4) :
+				case (8) :
+					return createSessionBeanInstance(eClassifier);
+				default :
+					return createEntityBeanInstance(eClassifier);
+			}
+		} else if (eClassifier.getName().equals("SecurityIdentity"))
+			return createSecurityIdentitiyInstance(eClassifier);
+		else if (eClassifier.getName().equals("RoleSource"))
+			return createRoleSourceInstance(eClassifier);
+		else if (eClassifier == EcorePackage.eINSTANCE.getEAttribute())
+			return getEjbFactory().createCMPAttribute();
+		return super.createInstance(ref,eObject);
+	}
+
+	private EObject createSecurityIdentitiyInstance(EClass eClassifier) {
+		/* Alternate types */
+		createdSecRoles++;
+		if ((createdSecRoles & 1) == 0)
+			return CommonFactory.eINSTANCE.createUseCallerIdentity();
+		else
+			return CommonFactory.eINSTANCE.createRunAsSpecifiedIdentity();
+	}
+
+	private EObject createRoleSourceInstance(EClass eClassifier) {
+		return ((EjbFactory) eClassifier.getEPackage().getEFactoryInstance()).createRoleSource();
+	}
+
+	private EObject createMessageBeanInstance(EClass eClassifier) {
+		return ((EjbFactory) eClassifier.getEPackage().getEFactoryInstance()).createMessageDriven();
+	}
+
+	private EObject createSessionBeanInstance(EClass eClassifier) {
+		return ((EjbFactory) eClassifier.getEPackage().getEFactoryInstance()).createSession();
+	}
+
+	private EObject createEntityBeanInstance(EClass eClassifier) {
+		return ((EjbFactory) eClassifier.getEPackage().getEFactoryInstance()).createEntity();
+	}
+
+	private EObject createContainerManagedEntityInstance(EClass eClassifier) {
+		return EjbFactory.eINSTANCE.createContainerManagedEntity();
+	}
+
+	/**
+	 * @see org.eclipse.jst.j2ee.archive.test.GeneralEMFTest#getDepthForAttribute(EReference)
+	 */
+	public int getDepthForAttribute(EStructuralFeature ref) {
+		if (ref.getName().equals("enterpriseBeans"))
+			return NUM_BEANS;
+		else if (ref.getName().equals("entityBeans"))
+			return NUM_BEANS;
+		else if (ref.getName().equals("relationshipRoles"))
+			return NUM_RELATION_ROLES;
+		return super.getDepthForAttribute(ref);
+	}
+
+	/* (non-Javadoc)
+	* @see com.ibm.etools.archive.emftest.GeneralEMFPopulationTest#populateFeatures(org.eclipse.emf.ecore.EObject)
+	*/
+	public void populateFeatures(EObject eObject) {
+		if (eObject.eClass() == EJB_PKG.getCMPAttribute()) {
+			((CMPAttribute) eObject).setName((String) EMFAttributeFeatureGenerator.createAttribute(EcorePackage.eINSTANCE.getENamedElement_Name(),eObject));
+			((CMPAttribute) eObject).setEType((EClassifier) EMFAttributeFeatureGenerator.createJavaClassProxy(EcorePackage.eINSTANCE.getETypedElement_EType(),eObject));
+		} else if (eObject.eClass() == EJB_PKG.getCMRField()) {
+			((CMRField) eObject).setName((String) EMFAttributeFeatureGenerator.createAttribute(EcorePackage.eINSTANCE.getENamedElement_Name(),eObject));
+			populateSharedReference(eObject, EJB_PKG.getCMRField_CollectionType());
+			populateSharedReference(eObject, EJB_PKG.getCMRField_Role());		
+		} else
+			super.populateFeatures(eObject);
+	}
+
+	/* (non-Javadoc)
+	 * @see com.ibm.etools.archive.emftest.GeneralEMFPopulationTest#populateAttributes(org.eclipse.emf.ecore.EObject)
+	 */
+	protected void populateAttributes(EObject eObject) {
+		if (eObject instanceof QueryMethodImpl) {
+			List attributes = eObject.eClass().getEAllAttributes();
+			for (int i = 0; i < attributes.size(); i++) { 
+				EAttribute att = (EAttribute) attributes.get(i);
+				if (att.equals(EJB_PKG.getMethodElement_Description()) || att.equals(EJB_PKG.getMethodElement_EnterpriseBean()) || att.equals(EJB_PKG.getMethodElement_Type()) )
+					continue;
+				Object value = createAttributeValue(att, eObject);
+				if (att.getName().equals("parms") && value == null){
+					value = createAttributeValue(att, eObject);
+				}
+				if (att.isChangeable())
+					eObject.eSet(att, value);
+			}
+		} else if (eObject instanceof MethodPermissionImpl) {
+			List attributes = eObject.eClass().getEAllAttributes();
+			for (int i = 0; i < attributes.size(); i++) {
+				EAttribute att = (EAttribute) attributes.get(i);
+				if(att.getName().equals("unchecked") && mpFlag){
+					continue;					
+				}	
+				
+				Object value = createAttributeValue(att, eObject);
+				if (att.isChangeable())
+					eObject.eSet(att, value);
+			} 
+			mpFlag = !mpFlag;
+		} else if (eObject instanceof EJBRelationshipRoleImpl) {
+			List attributes = eObject.eClass().getEAllAttributes();
+			EAttribute lastAttr = null;
+			Object value = null;
+			for (int i = 0; i < attributes.size(); i++) {
+				EAttribute att = (EAttribute) attributes.get(i);
+				if (att.getName().equals("cascadeDelete") && (lastAttr.getName().equals("multiplicity") && !value.toString().equals("Many")))
+					continue;
+
+				value = createAttributeValue(att, eObject);
+				if (att.isChangeable())
+					eObject.eSet(att, value);
+				lastAttr = att;
+		}
+			mpFlag = !mpFlag;
+		} else
+			super.populateAttributes(eObject);
+	}
+	
+
+	protected void populateSharedReference(EObject eObject, EReference ref) {
+		if (ref == EJB_PKG.getCMRField_CollectionType()) {
+			setReferenceValue(eObject, ref, JavaClassImpl.createClassRef("java.util.Collection"));
+			return;
+		} else if(eObject instanceof MethodPermission && ref.getName().equals("roles")){
+			//if method permission unchecked ignore roles
+			if(mpFlag){
+				return;
+			}
+			mpFlag = !mpFlag;
+		}
+		super.populateSharedReference(eObject, ref);
+	}
+
+	/* (non-Javadoc)
+	 * @see com.ibm.etools.archive.emftest.GeneralEMFPopulationTest#createAttributeValue(org.eclipse.emf.ecore.EAttribute, org.eclipse.emf.ecore.EObject)
+	 */
+	protected Object createAttributeValue(EAttribute att, EObject eObject) {
+		//eat the first return type mapping because the order was changed.
+		if (firstReturnTypeMapping && att.equals(EJB_PKG.getQuery_ReturnTypeMapping())){
+			super.createAttributeValue(att,eObject);
+			firstReturnTypeMapping = false;
+		} else if (att.equals(EJB_PKG.getEnterpriseBean_Name()))
+			return EMFAttributeFeatureGenerator.createAttribute(att,EJB_PKG.getEntity());
+		return super.createAttributeValue(att, eObject);
+	}
+
+	/* (non-Javadoc)
+	 * @see junit.framework.TestCase#tearDown()
+	 */
+	protected void tearDown() throws Exception {
+		super.tearDown();
+		earFile = null;
+		ejbFile = null;
+		mesBean = null;
+		entityBean = null;
+		secID = null;
+		roleSource = null;
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/GeneralEMFEditingTest.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/GeneralEMFEditingTest.java
new file mode 100644
index 0000000..36a22db
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/GeneralEMFEditingTest.java
@@ -0,0 +1,479 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.archive.emftests;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.LineNumberReader;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.jem.java.JavaRefPackage;
+import org.eclipse.jem.java.internal.impl.JavaClassImpl;
+import org.eclipse.jst.j2ee.archive.testutilities.EMFAttributeFeatureGenerator;
+import org.eclipse.jst.j2ee.archive.testutilities.J2EEVersionCheck;
+import org.eclipse.jst.j2ee.archive.testutilities.TestUtilities;
+import org.eclipse.jst.j2ee.common.CommonPackage;
+import org.eclipse.jst.j2ee.core.tests.bvt.AutomatedBVT;
+import org.eclipse.wst.common.internal.emf.resource.RendererFactory;
+
+
+public class GeneralEMFEditingTest extends GeneralEMFTest {
+	//inner class to handle deffered shared references
+	protected class DeferredSharedReferenceAction {
+		EObject owner;
+		EReference ref;
+
+		public DeferredSharedReferenceAction(EObject owner, EReference ref) {
+			this.owner = owner;
+			this.ref = ref;
+		}
+
+		public void performAction() {
+			Object value = getSharedObjectByType(owner, ref);
+			setReferenceValue(owner, ref, value);
+		}
+	}
+
+	protected Map equivalentLines;
+	public List deferedReferences;
+	public static int genDepth = 5;
+	public static Object sharedValue;
+	public int classIndex = 0;
+	public static String avClass[];
+	public static HashSet ignoreAtt;
+
+	public int version;
+	public int moduleType;
+	//static versions
+	public static final int VERSION_1_2 = 0;
+	public static final int VERSION_1_3 = 1;
+	public static final int VERSION_1_4 = 2;
+
+	public static final int APPICATION = 0;
+	public static final int APP_CLIENT = 1;
+	public static final int CONNECTOR = 2;
+	public static final int EJB = 3;
+	public static final int WEB = 4;
+
+	public GeneralEMFEditingTest(String name) {
+		super(name);
+	}
+	
+    public GeneralEMFEditingTest(String name, RendererFactory factory) {
+    	super(name, factory);
+    }
+
+	public void editRoot(EObject eObject) {
+		editFeatures(eObject);
+		//if (deferedReferences != null) {
+		//	for (int i = 0; i < deferedReferences.size(); i++) {
+		//		((DeferredSharedReferenceAction) deferedReferences.get(i)).performAction();
+		//	}
+		//}
+	}
+
+	public void editFeatures(EObject eObject) {
+		if (eObject == null)
+			return;
+		else {
+			editAttributes(eObject);
+			editReferences(eObject);
+		}
+	}
+
+	protected void editReferences(EObject eObject) {
+		List references = eObject.eClass().getEAllReferences();
+		for (int i = 0; i < references.size(); i++) {
+			EReference ref = (EReference) references.get(i);
+			if (!ref.isMany() && eObject.eGet(ref) != null)
+				continue;
+			if (ref.isContainment())
+				populateContainmentReference(eObject, ref);
+			else
+				populateSharedReference(eObject, ref);
+		}
+	}
+
+	protected void populateSharedReference(EObject eObject, EReference ref) {
+		if (ref.getEType() == JavaRefPackage.eINSTANCE.getJavaClass())
+			setReferenceValue(eObject, ref, createJavaClassProxy((EClass) ref.getEType()));
+		else {
+			EPackage pkg = ref.getEType().getEPackage();
+			if (pkg == eObject.eClass().getEPackage() || pkg == CommonPackage.eINSTANCE) {
+				if (eObject.eClass().getName().equals("EAnnotation") || eObject.eClass().getName().equals("EAnnotationImpl") || !J2EEVersionCheck.checkReferenceVersion(ref, version, moduleType))
+					return;
+				if (deferedReferences == null)
+					deferedReferences = new ArrayList();
+				deferedReferences.add(new DeferredSharedReferenceAction(eObject, ref));
+			}
+		}
+	}
+
+	protected void populateContainmentReference(EObject eObject, EReference ref) {
+		for (int i = 0; i < getDepthForAttribute(ref); i++) {
+			EObject instance = createInstance((EClass) ref.getEType());
+			if (instance == null)
+				return;
+			if (!J2EEVersionCheck.checkReferenceVersion(ref, version, moduleType))
+				continue;
+			setReferenceValue(eObject, ref, instance);
+			if (((InternalEObject) instance).eIsProxy())
+				return;
+			if (ref.getEType() == eObject.eClass())
+				editAttributes(instance);
+			else
+				editFeatures(instance);
+		}
+	}
+
+	protected void setReferenceValue(EObject eObject, EReference ref, Object value) {
+		if (ref.getName().equals("EAnnotation") || ref.getName().equals("EAnnotationImpl") || !J2EEVersionCheck.checkReferenceVersion(ref, version, moduleType))
+			return;
+		if (ref.isMany()) {
+			List list = (List) eObject.eGet(ref);
+			if (value instanceof Collection)
+				list.addAll((Collection) value);
+			else
+				list.add(value);
+		} else {
+			eObject.eSet(ref, value);
+		}
+	}
+
+	public EObject createInstance(EClass eClassifier) {
+		if (eClassifier == JavaRefPackage.eINSTANCE.getJavaClass())
+			return createJavaClassProxy(eClassifier);
+		return eClassifier.getEPackage().getEFactoryInstance().create(eClassifier);
+	}
+
+	protected void editAttributes(EObject eObject) {
+		List attributes = eObject.eClass().getEAllAttributes();
+		for (int i = 0; i < attributes.size(); i++) {
+			EAttribute att = (EAttribute) attributes.get(i);
+			if (att.isChangeable() && J2EEVersionCheck.checkAttributeVersion(att, version, moduleType)) {
+				Object value = createAttributeValue(att, eObject);
+				eObject.eSet(att, value);
+			}
+		}
+	}
+
+	protected Object createAttributeValue(EAttribute att, EObject eObject) {
+		if (att.getEType() == JavaRefPackage.eINSTANCE.getJavaClass()) {
+			return createJavaClassProxy(att.eClass()).getClass();
+		} 
+		// if (moduleType == WEB)
+			return EMFAttributeFeatureGenerator.createAttribute(att, eObject, true, version, moduleType);
+		//return EMFAttributeFeatureGenerator.createAttribute(att);
+	}
+
+	protected EObject createJavaClassProxy(EClass metaClass) {
+		if (avClass == null) {
+			avClass = new String[] { "java.util.HashTable", "java.util.List", "java.sql.Data", "java.lang.Integer", "java.lang.String" };
+		}
+		String name = avClass[classIndex];
+		classIndex++;
+		if (classIndex == 5)
+			classIndex = 0;
+		return JavaClassImpl.createClassRef(name);
+	}
+
+	// Old Compare method....now using DOMComparator...remove once stable
+	public void compareContents(String file1, String file2) throws Exception {
+	    BufferedReader reader1 = null;
+	    BufferedReader reader2 = null;
+		try {
+			int lineno = 1;
+			reader1 = new BufferedReader(new InputStreamReader(getFileInputStream(file1)));
+			reader2 = new BufferedReader(new InputStreamReader(getFileInputStream(file2)));
+			String line1 = "", line2 = "";
+			while (reader1.ready() && reader2.ready()) {
+				line1 = readLineTrimComments(reader1); 
+				line2 = readLineTrimComments(reader2);
+				if (line1 == null && line2 == null && lineno != 0)
+					return;
+							    
+				if (!line1.trim().equals(line2.trim())) {
+					String message = "Error at line #: " + lineno + '\n' + line1 + '\n' + line2 + '\n';
+					System.out.println(message);
+					//assertTrue(message, false);
+				}
+				lineno++;
+			}
+			assertTrue("The files have a different number of lines:" + lineno + '\n' + line1 + '\n' + line2 + '\n', (!reader1.ready() && !reader2.ready()));
+		} catch (IOException ex) {
+		    ex.printStackTrace();
+			assertTrue("IO failed", false);
+		} finally {
+		    if(reader1 != null)
+		        reader1.close();
+		    if(reader2 != null)
+		        reader2.close();
+		}
+	} 
+
+    /**
+     * @param string
+     * @return
+     */
+    private String readLineTrimComments(BufferedReader reader) throws IOException {
+        String result = reader.readLine(); 
+        if(result.indexOf("<!--") < 0)
+            return result;
+        else {
+            int endCommentIndx = 0;
+            while(reader.ready()) {
+                if( (endCommentIndx = result.indexOf("-->")) >= 0) 
+                    result = reader.readLine();
+                else 
+                    return result;
+            }
+        }
+        return result;
+    }
+
+    public void compareContentsIgnoreWhitespace(String file1, String file2, String identifier) throws Exception {
+
+		LineNumberReader reader1 = new LineNumberReader(new InputStreamReader(getFileInputStream(file1)));
+		LineNumberReader reader2 = new LineNumberReader(new InputStreamReader(getFileInputStream(file2)));
+		compareContentsIgnoreWhitespace(reader1, reader2, identifier);
+
+	}
+
+	public void compareContentsIgnoreWhitespace(LineNumberReader reader1, LineNumberReader reader2, String identifier) throws Exception {
+
+		while (reader1.ready() || reader2.ready()) {
+			String line1 = "", line2 = "";
+			while (reader1.ready() && line1.equals("")) {
+				line1 = reader1.readLine().trim();
+			}
+			while (reader2.ready() && line2.equals("")) {
+				line2 = reader2.readLine().trim();
+			}
+			if (!isEquivalentLines(line1, line2)) {
+				StringBuffer buff = new StringBuffer();
+				buff.append("Difference found in test ");
+
+				buff.append(identifier);
+				buff.append("\nSource line #: ");
+				buff.append(reader1.getLineNumber());
+				buff.append('\n');
+				buff.append(line1);
+				buff.append("\nDestination line #: ");
+				buff.append(reader2.getLineNumber());
+				buff.append('\n');
+				buff.append(line2);
+				assertTrue(buff.toString(), false);
+			}
+		}
+
+	}
+
+	public boolean lineEquals(String line1, String line2) {
+		return line1.equals(line2);
+	}
+
+	public boolean isEquivalentLines(String line1, String line2) {
+		if (lineEquals(line1, line2))
+			return true;
+		if (equalTags(line1, line2))
+			return true;
+		String equiv = (String) getEquivalentLines().get(line1);
+		return equiv != null && equiv.equals(line2);
+	}
+	
+	public boolean equalTags(String line1, String line2){
+		//data check, there should be no data for this test to return true
+		int shortEndIndex1 = line1.indexOf("/>");
+		int shortEndIndex2 = line2.indexOf("/>");
+		if (shortEndIndex1 == -1 && shortEndIndex2 == -1)
+			return false;
+		else if (shortEndIndex1 != -1){
+			String tagName1 = line1.substring(1,shortEndIndex1);
+			String tagName2 = extractTagName(line2);
+			if (checkNoData(line2) && tagName1.equals(tagName2)){
+				return true;
+			}
+		}
+		else if (shortEndIndex2 != -1){
+			String tagName1 = extractTagName(line1); 
+			String tagName2 = line2.substring(1,shortEndIndex2);
+			if (checkNoData(line1) && tagName1.equals(tagName2)){
+				return true;
+			}
+		}
+		return false;
+	}
+	/**
+	 * @param line2
+	 * @return
+	 */
+	private String extractTagName(String line) {
+		int endOpenTag = line.indexOf(">");
+		return line.substring(1,endOpenTag);
+	}
+
+	/**
+	 * @param line2
+	 * @return
+	 */
+	private boolean checkNoData(String line) {
+		int endOpenTag = line.indexOf(">");
+		int startEndTag = line.lastIndexOf("<");
+		if (endOpenTag == line.length())
+			return true;
+		else if (endOpenTag+1 == startEndTag)
+			return true;
+		return false;
+	}
+
+	public Map getEquivalentLines() {
+		if (equivalentLines == null)
+			equivalentLines = new HashMap();
+		return equivalentLines;
+	}
+
+	public void setEquivalentLines(Map equivalentLines) {
+		this.equivalentLines = equivalentLines;
+	}
+	/*
+		public void compareContents(String file1, String file2) throws Exception {
+			InputStream is1, is2;
+			is1 = getFileInputStream(file1);
+			is2 = getFileInputStream(file2);
+			InputSource input1 = new InputSource(is1);
+			InputSource input2 = new InputSource(is2);
+			try {
+				String results;
+				if(ignoreAtt == null)
+					results = DomComparitor.compareDoms(input1, input2);
+				else
+					results = DomComparitor.compareDoms(input1, input2, ignoreAtt);
+				if (results != null) {
+					assertTrue("Unequal doms compared as equal " + file1 + " " + file2 + "Details: " + results, false);
+				}
+			} finally {
+				try {
+					is1.close();
+				} catch (Exception e) {
+					Assert.fail(e.getMessage());
+				}
+				try {
+					is2.close();
+				} catch (Exception e) {
+					Assert.fail(e.getMessage());
+				}
+			}
+		}
+	*/
+	public InputStream getFileInputStream(String path) throws FileNotFoundException {
+		return new FileInputStream(path);
+	}
+
+	public InputStream getResourceAsStream(String fileName) {
+		InputStream in = null;
+		ClassLoader loader = getClass().getClassLoader();
+		if (loader == null) {
+			in = ClassLoader.getSystemResourceAsStream(fileName);
+		} else {
+			in = loader.getResourceAsStream(fileName);
+		}
+		assertTrue("Unable to find resource: " + fileName, in != null);
+		return in;
+	}
+
+	public void setGeneralDepth(int depth) {
+		GeneralEMFPopulationTest.genDepth = depth;
+	}
+
+	public void setModuleType(int type) {
+		moduleType = type;
+	}
+
+	public void setVersion(int version) {
+		this.version = version;
+	}
+
+	public int getDepthForAttribute(EReference ref) {
+		if (ref.isMany())
+			return genDepth;
+		else
+			return 1;
+	}
+
+	public Object getSharedObjectByType(EObject owner, EReference ref) {
+		sharedValue = TestUtilities.getObjectByType(owner.eResource(), ref.getEType(), ref.isMany());
+		return sharedValue;
+	}
+
+	/**
+	 * @param set
+	 */
+	public static void setIgnoreAtt(HashSet set) {
+		ignoreAtt = set;
+	}
+	
+	/* (non-Javadoc)
+	 * @see junit.framework.TestCase#tearDown()
+	 */
+	protected void tearDown() throws Exception {
+		try {
+			String out = AutomatedBVT.baseDirectory + "testOutput/";
+			File del = new File(out);
+			deleteDirectory(del);
+			del.delete();
+			out = AutomatedBVT.baseDirectory + "../testData/testOutput/";
+			del = new File(out);
+			deleteDirectory(del);
+			del.delete();
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+		super.tearDown();
+	}
+	
+	protected void deleteDirectory(File directory)
+	   throws IOException
+	{
+		if (directory.exists()){
+		   File[] delFiles = directory.listFiles();
+	
+		   for(int i=0; i<delFiles.length; ++i)
+		   {
+		      if(delFiles[i].isDirectory())
+		         deleteDirectory(delFiles[i]);
+		      delFiles[i].delete();
+		   }  
+		}
+	}
+
+	protected void setUp() throws Exception {
+		super.setUp();
+		//TODO: Remove this line after ws xsd's are restored.
+		RendererFactory.getDefaultRendererFactory().setValidating(false);
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/GeneralEMFPopulationTest.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/GeneralEMFPopulationTest.java
new file mode 100644
index 0000000..41fce29
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/GeneralEMFPopulationTest.java
@@ -0,0 +1,491 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.archive.emftests;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.LineNumberReader;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.emf.ecore.util.BasicFeatureMap;
+import org.eclipse.emf.ecore.util.FeatureMapUtil;
+import org.eclipse.jem.java.JavaRefPackage;
+import org.eclipse.jst.j2ee.archive.testutilities.EAttributeDescriptor;
+import org.eclipse.jst.j2ee.archive.testutilities.EMFAttributeFeatureGenerator;
+import org.eclipse.jst.j2ee.archive.testutilities.J2EEVersionCheck;
+import org.eclipse.jst.j2ee.archive.testutilities.TestUtilities;
+import org.eclipse.jst.j2ee.common.CommonPackage;
+import org.eclipse.jst.j2ee.common.EJBLocalRef;
+import org.eclipse.jst.j2ee.common.QName;
+import org.eclipse.jst.j2ee.common.ResAuthTypeBase;
+import org.eclipse.jst.j2ee.core.tests.bvt.AutomatedBVT;
+import org.eclipse.jst.j2ee.ejb.EjbPackage;
+import org.eclipse.jst.j2ee.ejb.MessageDriven;
+import org.eclipse.jst.j2ee.ejb.MethodElementKind;
+import org.eclipse.wst.common.internal.emf.resource.RendererFactory;
+
+
+public class GeneralEMFPopulationTest extends GeneralEMFTest {
+    //inner class to handle deffered shared references
+    protected class DeferredSharedReferenceAction {
+        EObject owner;
+        EReference ref;
+
+        public DeferredSharedReferenceAction(EObject owner, EReference ref) {
+            this.owner = owner;
+            this.ref = ref;
+        }
+
+        public void performAction() {
+            Object value = getSharedObjectByType(owner, ref);
+            setReferenceValue(owner, ref, value);
+        }
+    }
+
+    protected Map equivalentLines;
+    public List deferedReferences;
+    public static int genDepth = 5;
+    public static Object sharedValue;
+    public static HashSet ignoreAtt;
+
+    public int version;
+    public int moduleType;
+    //static versions
+    public static final int VERSION_1_2 = 0;
+    public static final int VERSION_1_3 = 1;
+    public static final int VERSION_1_4 = 2;
+    public static final int VERSION_5_0 = 3;
+    public static final int VERSION_6_0 = 3;
+
+    public static final int APPLICATION = 0;
+    public static final int APP_CLIENT = 1;
+    public static final int CONNECTOR = 2;
+    public static final int EJB = 3;
+    public static final int WEB = 4;
+
+    public GeneralEMFPopulationTest(String name) {
+        super(name);
+    }
+    
+    public GeneralEMFPopulationTest(String name, RendererFactory factory) {
+    	super(name, factory);
+    }
+
+    public void populateRoot(EObject eObject) {
+        populateFeatures(eObject);
+        if (deferedReferences != null) {
+            for (int i = 0; i < deferedReferences.size(); i++) {
+                ((DeferredSharedReferenceAction) deferedReferences.get(i)).performAction();
+            }
+        }
+    }
+
+    public void populateFeatures(EObject eObject) {
+        if (eObject == null)
+            return;
+        else {
+            populateAttributes(eObject);
+            populateReferences(eObject);
+        }
+    }
+
+    protected void populateReferences(EObject eObject) {
+        List references = eObject.eClass().getEAllReferences();
+        for (int i = 0; i < references.size(); i++) {
+            EReference ref = (EReference) references.get(i);
+            if (!ref.isMany() && eObject.eGet(ref) != null)
+                continue;
+			if (eObject instanceof MessageDriven && (ref.equals(EjbPackage.eINSTANCE.getEnterpriseBean_HomeInterface()) || ref.equals(EjbPackage.eINSTANCE.getEnterpriseBean_RemoteInterface()) || ref.equals(EjbPackage.eINSTANCE.getEnterpriseBean_LocalInterface()) || ref.equals(EjbPackage.eINSTANCE.getEnterpriseBean_LocalHomeInterface()) || ref.equals(EjbPackage.eINSTANCE.getEnterpriseBean_SecurityRoleRefs())))
+				continue;
+            if (ref.isContainment())
+                populateContainmentReference(eObject, ref);
+            else
+                populateSharedReference(eObject, ref);
+        }
+    }
+
+    protected void populateSharedReference(EObject eObject, EReference ref) {
+        if (ref.getEType() == JavaRefPackage.eINSTANCE.getJavaClass())
+            setReferenceValue(eObject, ref, EMFAttributeFeatureGenerator.createJavaClassProxy(ref,eObject));
+        else {
+            EPackage pkg = ref.getEType().getEPackage();
+            //if (pkg == eObject.eClass().getEPackage() || pkg == CommonPackage.eINSTANCE) {
+                if (eObject.eClass().getName().equals("EAnnotation") || eObject.eClass().getName().equals("EAnnotationImpl") || !J2EEVersionCheck.checkReferenceVersion(ref, version, moduleType))
+                    return;
+                if (deferedReferences == null)
+                    deferedReferences = new ArrayList();
+                deferedReferences.add(new DeferredSharedReferenceAction(eObject, ref));
+            //}
+        }
+    }
+
+    protected void populateContainmentReference(EObject eObject, EReference ref) {
+        for (int i = 0; i < getDepthForAttribute(ref); i++) {
+            EObject instance = createInstance(ref,eObject);
+            if (instance == null)
+                return;
+            if (!J2EEVersionCheck.checkReferenceVersion(ref, version, moduleType))
+                continue;
+            setReferenceValue(eObject, ref, instance);
+            if (((InternalEObject) instance).eIsProxy())
+                return;
+            if (ref.getEType() == eObject.eClass())
+                populateAttributes(instance);
+            else
+                populateFeatures(instance);
+        }
+    }
+
+    protected void setReferenceValue(EObject eObject, EStructuralFeature ref, Object value) {
+        if (ref.getName().equals("EAnnotation") || ref.getName().equals("EAnnotationImpl") || !J2EEVersionCheck.checkReferenceVersion(ref, version, moduleType))
+            return;
+        if (ref.isMany()) {
+            List list = (List) eObject.eGet(ref);
+            if (list instanceof BasicFeatureMap) {
+            	BasicFeatureMap aMap = (BasicFeatureMap)list;
+            	if (value instanceof Collection) {
+            		for (Iterator iterator = ((Collection)value).iterator(); iterator.hasNext();) {
+						Object obj = iterator.next();
+						aMap.add(FeatureMapUtil.createEntry(ref, obj));
+					}
+            	} else aMap.add(FeatureMapUtil.createEntry(ref, value));
+            	
+            } else {
+            if (value instanceof Collection)
+            	list.addAll((Collection) value);
+                
+            else
+                list.add(value);
+            }
+        } else {
+            eObject.eSet(ref, value);
+        }
+    }
+
+    public EObject createInstance(EReference ref, EObject eObject) {
+        if (ref.getEType() == JavaRefPackage.eINSTANCE.getJavaClass())
+            return EMFAttributeFeatureGenerator.createJavaClassProxy(ref, eObject);
+        return ref.getEType().getEPackage().getEFactoryInstance().create((EClass)ref.getEType());
+    }
+
+    protected void populateAttributes(EObject eObject) {
+    	if (eObject.eClass() == CommonPackage.eINSTANCE.getQName()) {
+    		populateAttributesQName(eObject);
+    		return;
+    	}
+        List attributes = eObject.eClass().getEAllAttributes();
+        for (int i = 0; i < attributes.size(); i++) {
+            EAttribute att = (EAttribute) attributes.get(i);
+            if (eObject instanceof EJBLocalRef && (att.equals(CommonPackage.eINSTANCE.getEjbRef_Home()) || att.equals(CommonPackage.eINSTANCE.getEjbRef_Remote())))
+            	continue;
+            EAttributeDescriptor desc = new EAttributeDescriptor(att,eObject.eClass());
+            if (desc.getFeature().getName().equals("group")) continue;
+            primPopulateAttrbute(eObject, att);
+        }
+    }
+
+	protected void primPopulateAttrbute(EObject eObject, EAttribute att) {
+            if (att.isChangeable() && J2EEVersionCheck.checkAttributeVersion(att, version, moduleType)) {
+                for (int j = 0 ; j < getDepthForAttribute(att);j++){
+	                Object value = createAttributeValue(att, eObject);
+	                setReferenceValue(eObject,att,value);
+                }
+            }
+        }
+    
+    
+
+    /**
+	 * @param eObject
+	 */
+	protected void populateAttributesQName(EObject eObject) {
+		String prefix = (String)createAttributeValue(CommonPackage.eINSTANCE.getQName_InternalPrefixOrNsURI(), eObject);
+		String localPart = (String)createAttributeValue(CommonPackage.eINSTANCE.getQName_LocalPart(), eObject);
+		((QName)eObject).setValues(prefix, "http://www.ibm.com", localPart);
+    }
+
+    protected Object createAttributeValue(EAttribute att, EObject eObject) {
+        if (att.getEType() == JavaRefPackage.eINSTANCE.getJavaClass()) {
+            return EMFAttributeFeatureGenerator.createJavaClassProxy(att,eObject).getClass();
+        } else if (att == CommonPackage.eINSTANCE.getResourceRef_Auth())
+			return createResAuth(att, eObject);
+		else if (att == EjbPackage.eINSTANCE.getMethodElement_Type())
+			return createMethodElementType(att, eObject);
+        else
+            return primCreateAttributeValue(att, eObject);
+        //return EMFAttributeFeatureGenerator.createAttribute(att);
+    }
+    
+    protected Object primCreateAttributeValue(EAttribute att, EObject eObject) {
+		return EMFAttributeFeatureGenerator.createAttribute(att, eObject, true, version, moduleType);
+    }
+
+    // Old Compare method....now using DOMComparator...remove once stable
+    public void compareContents(String file1, String file2) throws Exception {
+        try {
+            int lineno = 1;
+            BufferedReader reader1 = new BufferedReader(new InputStreamReader(getFileInputStream(file1)));
+            BufferedReader reader2 = new BufferedReader(new InputStreamReader(getFileInputStream(file2)));
+            String line1 = "", line2 = "";
+            while (reader1.ready() && reader2.ready()) {
+                line1 = reader1.readLine();
+                line2 = reader2.readLine();
+                if (line1 == null && line2 == null && lineno != 0)
+                    return;
+                if (!line1.equals(line2)) {
+                    String message = "Error at line #: " + lineno + '\n' + line1 + '\n' + line2 + '\n';
+                    assertTrue(message, false);
+                    break; // added to escape compare 
+                }
+                lineno++;
+            }
+            assertTrue("The files have a different number of lines:" + lineno + '\n' + line1 + '\n' + line2 + '\n', (!reader1.ready() && !reader2.ready()));
+        } catch (IOException ex) {
+            assertTrue("IO failed", false);
+        }
+    }
+    public void compareContentsIgnoreWhitespace(String file1, String file2, String identifier) throws Exception {
+
+        LineNumberReader reader1 = new LineNumberReader(new InputStreamReader(getFileInputStream(file1)));
+        LineNumberReader reader2 = new LineNumberReader(new InputStreamReader(getFileInputStream(file2)));
+        compareContentsIgnoreWhitespace(reader1, reader2, identifier);
+
+    }
+
+    public void compareContentsIgnoreWhitespace(LineNumberReader reader1, LineNumberReader reader2, String identifier) throws Exception {
+		List errors = new ArrayList();
+		String msg = null;
+        while (reader1.ready() || reader2.ready()) {
+            String line1 = "", line2 = "";
+            while (reader1.ready() && line1 != null && line1.equals("")) {
+                line1 = reader1.readLine();
+                if (line1 != null)
+                	line1 = line1.trim();
+            }
+            while (reader2.ready() && line2 != null && line2.equals("")) {
+                line2 = reader2.readLine();
+                if (line2 != null)
+                	line2 = line2.trim();
+            }
+            if (line1 != null && line2 != null && !isEquivalentLines(line1, line2)) {
+                StringBuffer buff = new StringBuffer();
+                buff.append("------------------------------ ");
+                buff.append("\nSource line #: ");
+                buff.append(reader1.getLineNumber());
+                buff.append('\n');
+                buff.append(line1);
+                buff.append("\nDestination line #: ");
+                buff.append(reader2.getLineNumber());
+                buff.append('\n');
+                buff.append(line2);
+                System.out.println(buff.toString());
+                errors.add(buff);
+                break;
+            }
+        }
+        if (!errors.isEmpty())
+			assertTrue("Errors Found, Check Console.", false);
+    }
+
+    public boolean lineEquals(String line1, String line2) {
+        return line1 != null && line1.equals(line2);
+    }
+
+    public boolean isEquivalentLines(String line1, String line2) {
+        if (lineEquals(line1, line2))
+            return true;
+
+        String equiv = (String) getEquivalentLines().get(line1);
+        if (equiv == null){
+        	equiv = (String)getEquivalentLines().get(line2);
+        	if (equiv != null)
+        		return equiv.equals(line1);
+        }
+        return equiv != null && equiv.equals(line2);
+    }
+    public Map getEquivalentLines() {
+        if (equivalentLines == null)
+            equivalentLines = new HashMap();
+        return equivalentLines;
+    }
+
+    public void setEquivalentLines(Map equivalentLines) {
+        this.equivalentLines = equivalentLines;
+    }
+    /*
+    	public void compareContents(String file1, String file2) throws Exception {
+    		InputStream is1, is2;
+    		is1 = getFileInputStream(file1);
+    		is2 = getFileInputStream(file2);
+    		InputSource input1 = new InputSource(is1);
+    		InputSource input2 = new InputSource(is2);
+    		try {
+    			String results;
+    			if(ignoreAtt == null)
+    				results = DomComparitor.compareDoms(input1, input2);
+    			else
+    				results = DomComparitor.compareDoms(input1, input2, ignoreAtt);
+    			if (results != null) {
+    				assertTrue("Unequal doms compared as equal " + file1 + " " + file2 + "Details: " + results, false);
+    			}
+    		} finally {
+    			try {
+    				is1.close();
+    			} catch (Exception e) {
+    				Assert.fail(e.getMessage());
+    			}
+    			try {
+    				is2.close();
+    			} catch (Exception e) {
+    				Assert.fail(e.getMessage());
+    			}
+    		}
+    	}
+    */
+    public InputStream getFileInputStream(String path) throws FileNotFoundException {
+        return new FileInputStream(path);
+    }
+
+    public InputStream getResourceAsStream(String fileName) {
+        InputStream in = null;
+        ClassLoader loader = getClass().getClassLoader();
+        if (loader == null) {
+            in = ClassLoader.getSystemResourceAsStream(fileName);
+        } else {
+            in = loader.getResourceAsStream(fileName);
+        }
+        assertTrue("Unable to find resource: " + fileName, in != null);
+        return in;
+    }
+
+    public void setGeneralDepth(int depth) {
+        GeneralEMFPopulationTest.genDepth = depth;
+    }
+
+    public void setModuleType(int type) {
+        moduleType = type;
+    }
+
+    public void setVersion(int version) {
+        this.version = version;
+    }
+
+    public int getDepthForAttribute(EStructuralFeature feature) {
+        if (feature.isMany())
+            return genDepth;
+        else
+            return 1;
+    }
+
+    public Object getSharedObjectByType(EObject owner, EReference ref) {
+        sharedValue = TestUtilities.getObjectByType(owner.eResource(), ref.getEType(), ref.isMany());
+        return sharedValue;
+    }
+
+    /**
+     * @param set
+     */
+    public static void setIgnoreAtt(HashSet set) {
+        ignoreAtt = set;
+    }
+    
+	
+	
+	protected Object createResAuth(EAttribute att, EObject eObject) {
+		Object auth = null;
+		do {
+			auth = primCreateAttributeValue(att, eObject);
+		} while (!isValidAuth((ResAuthTypeBase)auth));
+		return auth;
+	}
+	
+	/**
+	 * Web will need to override  for J2EE 1.2/1/3
+	 * @param auth
+	 * @return
+	 */
+	protected boolean isValidAuth(ResAuthTypeBase auth) {
+		return auth == ResAuthTypeBase.APPLICATION_LITERAL || auth == ResAuthTypeBase.CONTAINER_LITERAL;
+	}
+	
+	protected Object createMethodElementType(EAttribute att, EObject eObject) {
+		Object type = null;
+		do {
+			type = primCreateAttributeValue(att, eObject);
+		} while (!isValidMethodElementType((MethodElementKind)type));
+		return type;
+	}
+
+	/**
+	 * Web will need to override  for J2EE 1.2/1/3
+	 * @param auth
+	 * @return
+	 */
+	protected boolean isValidMethodElementType(MethodElementKind type) {
+		if  (version == VERSION_1_4)
+			return true;
+		return version != VERSION_1_4 && type != MethodElementKind.SERVICE_ENDPOINT_LITERAL;
+	}
+	
+	/* (non-Javadoc)
+	 * @see junit.framework.TestCase#tearDown()
+	 */
+	protected void tearDown() throws Exception {
+		try {
+			String out = AutomatedBVT.baseDirectory + "testOutput/";
+			File del = new File(out);
+			deleteDirectory(del);
+			del.delete();
+			out = AutomatedBVT.baseDirectory + "../testData/testOutput/";
+			del = new File(out);
+			deleteDirectory(del);
+			del.delete();
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+		super.tearDown();
+	}
+	
+	protected void deleteDirectory(File directory)
+	   throws IOException
+	{
+		if (directory.exists()){
+		   File[] delFiles = directory.listFiles();
+	
+		   for(int i=0; i<delFiles.length; ++i)
+		   {
+		      if(delFiles[i].isDirectory())
+		         deleteDirectory(delFiles[i]);
+		      delFiles[i].delete();
+		   }  
+		}
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/GeneralEMFTest.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/GeneralEMFTest.java
new file mode 100644
index 0000000..c3511c0
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/GeneralEMFTest.java
@@ -0,0 +1,93 @@
+/**
+ * 
+ */
+package org.eclipse.jst.j2ee.archive.emftests;
+
+import java.util.HashSet;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jst.j2ee.application.ApplicationFactory;
+import org.eclipse.jst.j2ee.application.ApplicationPackage;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.CommonarchiveFactory;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.CommonarchivePackage;
+import org.eclipse.jst.j2ee.ejb.EjbFactory;
+import org.eclipse.jst.j2ee.ejb.EjbPackage;
+import org.eclipse.jst.j2ee.webapplication.WebapplicationFactory;
+import org.eclipse.jst.j2ee.webapplication.WebapplicationPackage;
+import org.eclipse.wst.common.internal.emf.resource.RendererFactory;
+import org.eclipse.wst.common.tests.BaseTestCase;
+import org.eclipse.wst.common.tests.ProjectUtility;
+import org.eclipse.wst.validation.internal.operations.ValidationBuilder;
+
+/**
+ * @author itewk
+ *
+ */
+public abstract class GeneralEMFTest extends BaseTestCase {
+	private RendererFactory testingFactory;
+	private RendererFactory defaultFactory;
+	public static final String VALIDATOR_JOB_FAMILY = "validators";
+	
+	public GeneralEMFTest(String name) {
+		super(name);
+		
+		defaultFactory = RendererFactory.getDefaultRendererFactory();
+		testingFactory = RendererFactory.getDefaultRendererFactory();
+	}
+	
+	public GeneralEMFTest(String name, RendererFactory factory) {
+		super(name);
+		
+		defaultFactory = RendererFactory.getDefaultRendererFactory();
+		testingFactory = factory;
+	}
+	
+	protected void setUp() throws Exception {
+		//set the default factory to the factory needed for this test run
+		RendererFactory.setDefaultRendererFactory(testingFactory);
+		
+		super.setUp();
+	}
+	
+	protected void tearDown() throws Exception {
+		//set the default factory back to the orginal default
+		RendererFactory.setDefaultRendererFactory(defaultFactory);
+		// Wait for all validation jobs to end before ending test....
+		waitOnJobs();
+		super.tearDown();
+	}
+	
+	protected CommonarchiveFactory getArchiveFactory() {
+        return CommonarchivePackage.eINSTANCE.getCommonarchiveFactory();
+    }
+
+	protected EjbFactory getEjbFactory() {
+        return EjbPackage.eINSTANCE.getEjbFactory();
+    }
+
+	protected ApplicationFactory getApplicationFactory() {
+        return ApplicationPackage.eINSTANCE.getApplicationFactory();
+    }
+
+	protected WebapplicationFactory getWebAppFactory() {
+        return WebapplicationPackage.eINSTANCE.getWebapplicationFactory();
+    }
+    
+	protected HashSet ignorableAttributes(){
+		HashSet set = new HashSet();
+		set.add("id");
+		return set;
+	}
+	public static void waitOnJobs() throws InterruptedException {
+		IProject[] projects = ProjectUtility.getAllProjects();
+		for (int i = 0; i < projects.length; i++) {
+			IProject project = projects[i];
+			Job.getJobManager().join(project.getName() + VALIDATOR_JOB_FAMILY,null);
+		}
+		Job.getJobManager().join(ResourcesPlugin.FAMILY_MANUAL_BUILD,null);
+		Job.getJobManager().join(ResourcesPlugin.FAMILY_AUTO_BUILD,null);
+		Job.getJobManager().join(ValidationBuilder.FAMILY_VALIDATION_JOB,null);
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/RarEMFEditTest.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/RarEMFEditTest.java
new file mode 100644
index 0000000..9779bfc
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/RarEMFEditTest.java
@@ -0,0 +1,63 @@
+package org.eclipse.jst.j2ee.archive.emftests;
+
+import junit.framework.TestSuite;
+import junit.textui.TestRunner;
+
+import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.RARFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.DuplicateObjectException;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.OpenFailureException;
+import org.eclipse.jst.j2ee.core.tests.bvt.AutomatedBVT;
+import org.eclipse.jst.j2ee.jca.ConnectorResource;
+import org.eclipse.wst.common.internal.emf.resource.RendererFactory;
+
+
+public class RarEMFEditTest extends GeneralEMFEditingTest {
+    RARFile rarFile;
+
+    public RarEMFEditTest(String name) {
+        super(name);
+    }
+    
+    public RarEMFEditTest(String name, RendererFactory factory) {
+    	super(name, factory);
+    }
+    
+    public static void main(java.lang.String[] args) {
+        String[] className = { "com.ibm.etools.archive.test.RarEMFEditTest", "-noloading" };
+        TestRunner.main(className);
+    }
+
+    public static junit.framework.Test suite(RendererFactory factory) {
+        TestSuite suite = new TestSuite(RarEMFEditTest.class.getName());
+        suite.addTest(new RarEMFEditTest("testRAREdit",factory));
+        return suite;
+    }
+
+    public void testRAREdit() throws Exception {
+        getRar();
+		assertEquals("1.0", rarFile.getDeploymentDescriptor().getSpecVersion());
+
+		ConnectorResource DD = (ConnectorResource) rarFile.getDeploymentDescriptorResource();
+       	setVersion(VERSION_1_3);
+       	setModuleType(CONNECTOR);       
+        editRoot(DD.getRootObject());
+        String curDir = AutomatedBVT.baseDirectory;
+        
+        String out = curDir + "testOutput/EMFModelCreationTests/EditRarEAR";
+        rarFile.extractTo(out, Archive.EXPAND_ALL);
+        rarFile.close();
+
+        //Compare work in progress
+        
+        String exampleDeploymentDesURI = curDir + "EMFTests/ra.xml";
+        String curDeploymentDesURI = curDir + out + "/fooRAR/META-INF/ra.xml";
+        //compareContents(curDeploymentDesURI, exampleDeploymentDesURI);
+    }
+
+    public void getRar() throws DuplicateObjectException, OpenFailureException {
+        String in = AutomatedBVT.baseDirectory + "loose_module_workspace/LooseConnector/fooRAR/";
+        rarFile = getArchiveFactory().openRARFile(in);
+        assertTrue(rarFile.getDeploymentDescriptor() != null);
+    }
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/RarEMFTest.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/RarEMFTest.java
new file mode 100644
index 0000000..2f5bcaa
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/RarEMFTest.java
@@ -0,0 +1,141 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.archive.emftests;
+
+import junit.framework.TestSuite;
+import junit.textui.TestRunner;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.jst.j2ee.archive.testutilities.EMFAttributeFeatureGenerator;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.EARFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.RARFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.DuplicateObjectException;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.OpenFailureException;
+import org.eclipse.jst.j2ee.core.tests.bvt.AutomatedBVT;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.j2ee.jca.ConnectorResource;
+import org.eclipse.jst.j2ee.jca.JcaPackage;
+import org.eclipse.wst.common.internal.emf.resource.RendererFactory;
+
+
+public class RarEMFTest extends GeneralEMFPopulationTest {
+	EARFile earFile;
+	protected RARFile rarFile;
+
+	public RarEMFTest(String name) {
+		super(name);
+	}
+	
+    public RarEMFTest(String name, RendererFactory factory) {
+    	super(name, factory);
+    }
+
+	public static void main(java.lang.String[] args) {
+		String[] className = { "com.ibm.etools.archive.test.RarEMFTest", "-noloading" };
+		TestRunner.main(className);
+	}
+
+	public static junit.framework.Test suite(RendererFactory factory) {
+		TestSuite suite = new TestSuite(RarEMFTest.class.getName());
+		//[248158] suite.addTest(new RarEMFTest("testRARPopulation",factory));
+		suite.addTest(new RarEMFTest("test14RARPopulation",factory));
+		return suite;
+	}
+
+	public void testRARPopulation() throws Exception {
+		EMFAttributeFeatureGenerator.reset();
+		createEAR();
+		createRAR();
+
+		ConnectorResource DD = (ConnectorResource) rarFile.getDeploymentDescriptorResource();
+		//TODO: individual test for each version
+		DD.setVersionID(J2EEVersionConstants.J2EE_1_3_ID);
+		setVersion(VERSION_1_3);
+		setModuleType(CONNECTOR);
+		populateRoot(DD.getRootObject());
+
+		String out = AutomatedBVT.baseDirectory + "testOutput/TestRarEAR";
+		earFile.extractTo(out, Archive.EXPAND_ALL);
+		earFile.close();
+
+		//Compare work in progress
+		String curDir = AutomatedBVT.baseDirectory;
+		String exampleDeploymentDesURI = curDir + "EMFTestNoID/ra.xml";
+		String curDeploymentDesURI = curDir + "testOutput/TestRarEAR/fooRAR/META-INF/ra.xml";
+		setIgnoreAtt(ignorableAttributes());
+		compareContentsIgnoreWhitespace(curDeploymentDesURI, exampleDeploymentDesURI, null);
+	}
+	public void test14RARPopulation() throws Exception {
+		EMFAttributeFeatureGenerator.reset();
+		createEAR();
+		createRAR();
+
+		ConnectorResource DD = (ConnectorResource) rarFile.getDeploymentDescriptorResource();
+		//TODO: individual test for each version
+		DD.setVersionID(J2EEVersionConstants.J2EE_1_4_ID);
+		setVersion(VERSION_1_4);
+		setModuleType(CONNECTOR);
+		populateRoot(DD.getRootObject());
+
+		String out = AutomatedBVT.baseDirectory + "testOutput/Test14RarEAR";
+		earFile.extractTo(out, Archive.EXPAND_ALL);
+		earFile.close();
+
+		getRar();
+		assertTrue("1.5".equals(rarFile.getDeploymentDescriptor().getSpecVersion()));
+		out = AutomatedBVT.baseDirectory + "testOutput/Test14RarEAR2";
+		rarFile.extractTo(out, Archive.EXPAND_ALL);
+		rarFile.close();
+
+		//Compare work in progress
+		String curDir = AutomatedBVT.baseDirectory;
+		String exampleDeploymentDesURI = curDir + "testOutput/Test14RarEAR2/META-INF/ra.xml";
+		String curDeploymentDesURI = curDir + "testOutput/Test14RarEAR/fooRAR/META-INF/ra.xml";
+		setIgnoreAtt(ignorableAttributes());
+		compareContentsIgnoreWhitespace(curDeploymentDesURI, exampleDeploymentDesURI, null);
+	}
+
+	public void getRar() throws DuplicateObjectException, OpenFailureException {
+		String in = AutomatedBVT.baseDirectory + "testOutput/Test14RarEAR/fooRAR";
+		rarFile = getArchiveFactory().openRARFile(in);
+		assertTrue(rarFile.getDeploymentDescriptor() != null);
+	}
+
+	public void createRAR() throws DuplicateObjectException {
+		rarFile = getArchiveFactory().createRARFileInitialized("fooRAR");
+		rarFile = (RARFile) earFile.addCopy(rarFile);
+		rarFile.getDeploymentDescriptor().setDisplayName("fooRAR");
+		assertTrue(rarFile.getDeploymentDescriptor() != null);
+	}
+
+	public void createEAR() {
+		String earName = "Test.ear";
+		earFile = getArchiveFactory().createEARFileInitialized(earName);
+		assertTrue(earFile.getDeploymentDescriptor() != null);
+	}
+
+	/* (non-Javadoc)
+	 * @see com.ibm.etools.archive.emftest.GeneralEMFPopulationTest#createAttributeValue(org.eclipse.emf.ecore.EAttribute)
+	 */
+	protected Object createAttributeValue(EAttribute att, EObject eObject) {
+		//TODO: delete this after the model is fixed
+		if (att == JcaPackage.eINSTANCE.getConfigProperty_Type())
+			return "java.lang.String";
+		else if (att == JcaPackage.eINSTANCE.getAuthenticationMechanism_CredentialInterface())
+			return "javax.resource.spi.security.PasswordCredential";
+		else if (att == JcaPackage.eINSTANCE.getConnector_SpecVersion() && version == VERSION_1_3)
+			return "1.0";
+		else
+			return super.createAttributeValue(att, eObject);
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/ResolverTest.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/ResolverTest.java
new file mode 100644
index 0000000..87b059e
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/ResolverTest.java
@@ -0,0 +1,264 @@
+package org.eclipse.jst.j2ee.archive.emftests;
+
+import java.util.List;
+
+import junit.framework.TestSuite;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EClassifier;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.EcorePackage;
+import org.eclipse.jst.j2ee.archive.testutilities.EMFAttributeFeatureGenerator;
+import org.eclipse.jst.j2ee.common.CommonFactory;
+import org.eclipse.jst.j2ee.common.SecurityIdentity;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.EARFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.EJBJarFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.DuplicateObjectException;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.OpenFailureException;
+import org.eclipse.jst.j2ee.core.tests.bvt.AutomatedBVT;
+import org.eclipse.jst.j2ee.ejb.CMPAttribute;
+import org.eclipse.jst.j2ee.ejb.EJBResource;
+import org.eclipse.jst.j2ee.ejb.EjbFactory;
+import org.eclipse.jst.j2ee.ejb.EjbPackage;
+import org.eclipse.jst.j2ee.ejb.RoleSource;
+import org.eclipse.jst.j2ee.ejb.internal.impl.MethodPermissionImpl;
+import org.eclipse.jst.j2ee.ejb.internal.impl.QueryMethodImpl;
+import org.eclipse.wst.common.internal.emf.resource.RendererFactory;
+
+
+public class ResolverTest extends GeneralEMFEditingTest {
+
+    protected static final String _META_INF_EJB_JAR_XML = "/META-INF/ejb-jar.xml";
+
+    protected static final EjbPackage EJB_PKG = EjbPackage.eINSTANCE;
+
+    EARFile earFile;
+
+    EJBJarFile ejbFile;
+
+    EObject mesBean, entityBean;
+
+    SecurityIdentity secID;
+
+    RoleSource roleSource;
+
+    int NUM_BEANS = 10;
+
+    final int NUM_RELATION_ROLES = 2;
+
+    int createdBeans = 0;
+
+    int createdSecRoles = 0;
+
+    protected int createdSecurityIdentities = 0;
+
+    boolean mpFlag = false;
+
+    public ResolverTest(String name) {
+        super(name);
+    }
+    
+    public ResolverTest(String name, RendererFactory factory) {
+    	super(name, factory);
+    }
+
+    public static void main(java.lang.String[] args) {
+        junit.textui.TestRunner.main(new String[] { ResolverTest.class.getName()});
+    }
+
+    public static junit.framework.Test suite(RendererFactory factory) {
+        TestSuite suite = new TestSuite(ResolverTest.class.getName());
+        suite.addTest(new ResolverTest("testResolver",factory));
+        suite.addTest(new ResolverTest("testResolverNoSchemaLocation",factory));
+        return suite;
+    }
+
+    public void testResolver() throws Exception {
+        String in = AutomatedBVT.baseDirectory + "../testData/sl";
+        getEJB(in);
+
+        assertEquals("2.1", ejbFile.getDeploymentDescriptor().getVersion());
+        EJBResource DD = (EJBResource) ejbFile.getDeploymentDescriptorResource();
+        setVersion(VERSION_1_4);
+        setModuleType(EJB);
+
+        String out = AutomatedBVT.baseDirectory + "../testData/testOutput/sl";
+        ejbFile.extractTo(out, Archive.EXPAND_ALL);
+        ejbFile.close();
+
+        String exampleDeploymentDesURI = in + _META_INF_EJB_JAR_XML;
+        String curDeploymentDesURI = out + _META_INF_EJB_JAR_XML;
+        compareContents(curDeploymentDesURI, exampleDeploymentDesURI);
+    }
+
+    public void testResolverNoSchemaLocation() throws Exception {
+
+        boolean validating = RendererFactory.getDefaultRendererFactory().isValidating();
+        try { 
+            RendererFactory.getDefaultRendererFactory().setValidating(false);
+            
+            String in = AutomatedBVT.baseDirectory + "../testData/no-sl";
+            getEJB(in);
+
+            assertEquals("2.1", ejbFile.getDeploymentDescriptor().getVersion());
+            EJBResource DD = (EJBResource) ejbFile.getDeploymentDescriptorResource();
+            setVersion(VERSION_1_4);
+            setModuleType(EJB);
+
+            String out = AutomatedBVT.baseDirectory + "../testData/testOutput/no-sl";
+            ejbFile.extractTo(out, Archive.EXPAND_ALL);
+            ejbFile.close();
+
+            String exampleDeploymentDesURI = in + _META_INF_EJB_JAR_XML;
+            String curDeploymentDesURI = out + _META_INF_EJB_JAR_XML;
+            compareContents(curDeploymentDesURI, exampleDeploymentDesURI);
+        } catch (RuntimeException re) {
+            re.printStackTrace();
+        } finally {
+            RendererFactory.getDefaultRendererFactory().setValidating(validating);
+        }
+    }
+
+    public void getEJB(String in) throws DuplicateObjectException, OpenFailureException {
+        ejbFile = getArchiveFactory().openEJBJarFile(in);
+        assertTrue(ejbFile.getDeploymentDescriptor() != null);
+    }
+
+    public EObject createInstance(EClass eClassifier) {
+        if (eClassifier.getName().equals("EnterpriseBean")) {
+            createdBeans++;
+            switch (createdBeans) {
+            case (3):
+                return createContainerManagedEntityInstance(eClassifier);
+            case (7):
+                return createMessageBeanInstance(eClassifier);
+            case (4):
+            case (8):
+                return createSessionBeanInstance(eClassifier);
+            default:
+                return createEntityBeanInstance(eClassifier);
+            }
+        } else if (eClassifier.getName().equals("SecurityIdentity"))
+            return createSecurityIdentitiyInstance(eClassifier);
+        else if (eClassifier.getName().equals("RoleSource"))
+            return createRoleSourceInstance(eClassifier);
+        else if (eClassifier == EcorePackage.eINSTANCE.getEAttribute()) return getEjbFactory().createCMPAttribute();
+        return super.createInstance(eClassifier);
+    }
+
+    private EObject createSecurityIdentitiyInstance(EClass eClassifier) {
+        /* Alternate types */
+        createdSecRoles++;
+        if ((createdSecRoles & 1) == 0)
+            return CommonFactory.eINSTANCE.createUseCallerIdentity();
+        else
+            return CommonFactory.eINSTANCE.createRunAsSpecifiedIdentity();
+    }
+
+    private EObject createRoleSourceInstance(EClass eClassifier) {
+        return ((EjbFactory) eClassifier.getEPackage().getEFactoryInstance()).createRoleSource();
+    }
+
+    private EObject createMessageBeanInstance(EClass eClassifier) {
+        return ((EjbFactory) eClassifier.getEPackage().getEFactoryInstance()).createMessageDriven();
+    }
+
+    private EObject createSessionBeanInstance(EClass eClassifier) {
+        return ((EjbFactory) eClassifier.getEPackage().getEFactoryInstance()).createSession();
+    }
+
+    private EObject createEntityBeanInstance(EClass eClassifier) {
+        return ((EjbFactory) eClassifier.getEPackage().getEFactoryInstance()).createEntity();
+    }
+
+    private EObject createContainerManagedEntityInstance(EClass eClassifier) {
+        return EjbFactory.eINSTANCE.createContainerManagedEntity();
+    }
+
+    /**
+     * @see org.eclipse.jst.j2ee.archive.test.GeneralEMFTest#getDepthForAttribute(EReference)
+     */
+    public int getDepthForAttribute(EReference ref) {
+        if (ref.getName().equals("enterpriseBeans"))
+            return NUM_BEANS;
+        else if (ref.getName().equals("entityBeans"))
+            return NUM_BEANS;
+        else if (ref.getName().equals("relationshipRoles")) return NUM_RELATION_ROLES;
+        return super.getDepthForAttribute(ref);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see com.ibm.etools.archive.emftest.GeneralEMFPopulationTest#populateFeatures(org.eclipse.emf.ecore.EObject)
+     */
+    public void populateFeatures(EObject eObject) {
+        if (eObject.eClass() == EJB_PKG.getCMPAttribute()) {
+            ((CMPAttribute) eObject).setName((String) EMFAttributeFeatureGenerator.createAttribute(
+                    EcorePackage.eINSTANCE.getENamedElement_Name(), eObject));
+            ((CMPAttribute) eObject).setEType((EClassifier) createJavaClassProxy(null));
+        } else
+            super.editFeatures(eObject);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see com.ibm.etools.archive.emftest.GeneralEMFPopulationTest#populateAttributes(org.eclipse.emf.ecore.EObject)
+     */
+    protected void populateAttributes(EObject eObject) {
+        if (eObject instanceof QueryMethodImpl) {
+            List attributes = eObject.eClass().getEAllAttributes();
+            for (int i = 0; i < attributes.size(); i++) {
+                EAttribute att = (EAttribute) attributes.get(i);
+                Object value = createAttributeValue(att, eObject);
+                if (att.getName().equals("parms") && value == null) {
+                    value = createAttributeValue(att, eObject);
+                }
+                if (att.isChangeable()) eObject.eSet(att, value);
+            }
+        } else if (eObject instanceof MethodPermissionImpl) {
+            List attributes = eObject.eClass().getEAllAttributes();
+            for (int i = 0; i < attributes.size(); i++) {
+                EAttribute att = (EAttribute) attributes.get(i);
+                if (att.getName().equals("unchecked") && mpFlag) {
+                    continue;
+                }
+
+                Object value = createAttributeValue(att, eObject);
+                if (att.isChangeable()) eObject.eSet(att, value);
+            }
+            mpFlag = !mpFlag;
+        } else
+            super.editAttributes(eObject);
+    }
+
+    protected void populateSharedReference(EObject eObject, EReference ref) {
+        if (eObject instanceof MethodPermissionImpl && ref.getName().equals("roles")) {
+            mpFlag = !mpFlag;
+            //if method permission unchecked ignore roles
+            if (!mpFlag) { return; }
+        }
+        super.populateSharedReference(eObject, ref);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see junit.framework.TestCase#tearDown()
+     */
+    protected void tearDown() throws Exception {
+        earFile = null;
+        ejbFile = null;
+        mesBean = null;
+        entityBean = null;
+        secID = null;
+        roleSource = null;
+
+        super.tearDown();
+    }
+
+}
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/WarEMFEditTest.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/WarEMFEditTest.java
new file mode 100644
index 0000000..f89e9f5
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/WarEMFEditTest.java
@@ -0,0 +1,139 @@
+package org.eclipse.jst.j2ee.archive.emftests;
+
+import java.util.List;
+
+import junit.framework.TestSuite;
+import junit.textui.TestRunner;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.EARFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.WARFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.DuplicateObjectException;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.OpenFailureException;
+import org.eclipse.jst.j2ee.core.tests.bvt.AutomatedBVT;
+import org.eclipse.jst.j2ee.webapplication.ErrorPage;
+import org.eclipse.jst.j2ee.webapplication.WebAppResource;
+import org.eclipse.jst.j2ee.webapplication.WebType;
+import org.eclipse.jst.j2ee.webapplication.WebapplicationFactory;
+import org.eclipse.jst.j2ee.webapplication.WebapplicationPackage;
+import org.eclipse.jst.j2ee.webapplication.internal.impl.FilterMappingImpl;
+import org.eclipse.wst.common.internal.emf.resource.RendererFactory;
+
+
+public class WarEMFEditTest extends GeneralEMFEditingTest {
+	protected EARFile earFile;	
+	protected WARFile warFile;
+	protected int createdWebTypes = 0;
+	protected int createdErrorPages = 0;
+	protected boolean fmFlag = false;
+
+    public WarEMFEditTest(String name) {
+        super(name);
+    }
+    
+    public WarEMFEditTest(String name, RendererFactory factory) {
+    	super(name, factory);
+    }
+
+    public static void main(java.lang.String[] args) {
+        String[] className = { "com.ibm.etools.archive.test.WarEMFTest", "-noloading" };
+        TestRunner.main(className);
+    }
+    public static junit.framework.Test suite(RendererFactory factory) {
+        TestSuite suite = new TestSuite(WarEMFEditTest.class.getName());
+        suite.addTest(new WarEMFEditTest("testWAREdit",factory));
+        return suite;
+    }
+
+    public void testWAREdit() throws Exception {
+        getWARClient();
+
+        WebAppResource DD = (WebAppResource) warFile.getDeploymentDescriptorResource();
+		setVersion(VERSION_1_3);
+		setModuleType(WEB); 
+        editRoot(DD.getRootObject());
+        String curDir = AutomatedBVT.baseDirectory;
+        String out = curDir + "testOutput/EMFModelCreationTests/EditWarEAR";
+        warFile.extractTo(out, Archive.EXPAND_ALL);
+        warFile.close();
+
+        //Compare work in progress
+       
+        String exampleDeploymentDesURI = curDir + "EMFTests/web.xml";
+        String curDeploymentDesURI = curDir + out + "/fooWAR/WEB-INF/web.xml";
+        //compareContents(curDeploymentDesURI, exampleDeploymentDesURI);
+    }
+
+    public void getWARClient() throws DuplicateObjectException, OpenFailureException {
+        String in = AutomatedBVT.baseDirectory + "loose_module_workspace/LooseEARWeb/webApplication/";
+        warFile = getArchiveFactory().openWARFile(in);
+        assertTrue(warFile.getDeploymentDescriptor() != null);
+    }
+	public EObject createInstance(EClass eClassifier) {
+
+		if (WebapplicationPackage.eINSTANCE.getWebType().equals(eClassifier))
+			return createWebType();
+		else if (WebapplicationPackage.eINSTANCE.getErrorPage().equals(eClassifier))
+			return createErrorPage();
+
+		return super.createInstance(eClassifier);
+	}
+	/* The web type is abstract.  Alternate between servlet-class
+	 * and jsp-file
+	 */
+	public WebType createWebType() {
+		createdWebTypes++;
+		if ((createdWebTypes & 1) == 0)
+			return WebapplicationFactory.eINSTANCE.createServletType();
+		else
+			return WebapplicationFactory.eINSTANCE.createJSPType();
+
+	}
+	/* The error page is abstract.  Alternate between exceptiontype
+	 * and error code
+	 */
+	public ErrorPage createErrorPage() {
+		createdErrorPages++;
+		if ((createdErrorPages & 1) == 0)
+			return WebapplicationFactory.eINSTANCE.createErrorCodeErrorPage();
+		else
+			return WebapplicationFactory.eINSTANCE.createExceptionTypeErrorPage();
+	}
+	/* (non-Javadoc)
+	 * @see com.ibm.etools.archive.emftest.GeneralEMFPopulationTest#populateAttributes(org.eclipse.emf.ecore.EObject)
+	 */
+	protected void populateAttributes(EObject eObject) {
+		if (eObject instanceof FilterMappingImpl){
+			List attributes = eObject.eClass().getEAllAttributes();
+			for (int i = 0; i < attributes.size(); i++) {
+				EAttribute att = (EAttribute) attributes.get(i);
+				if(att.getName().equals("urlPattern") && fmFlag){
+					continue;					
+				}	
+				
+				Object value = createAttributeValue(att, eObject);
+				if (att.isChangeable())
+					eObject.eSet(att, value);
+			} 
+			fmFlag = !fmFlag;
+		}
+		else 
+			super.editAttributes(eObject);
+	}
+	
+
+	protected void populateSharedReference(EObject eObject, EReference ref) {
+		if(eObject instanceof FilterMappingImpl && ref.getName().equals("servlet")){
+			fmFlag = !fmFlag;
+			//if method permission unchecked ignore roles
+			if(!fmFlag){
+				return;
+			}
+		}
+		super.populateSharedReference(eObject, ref);
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/WarEMFTest.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/WarEMFTest.java
new file mode 100644
index 0000000..d036e70
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/WarEMFTest.java
@@ -0,0 +1,224 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.archive.emftests;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.TestSuite;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.jst.j2ee.archive.testutilities.EMFAttributeFeatureGenerator;
+import org.eclipse.jst.j2ee.common.ResAuthTypeBase;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.EARFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.WARFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.DuplicateObjectException;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.OpenFailureException;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveOptions;
+import org.eclipse.jst.j2ee.core.tests.bvt.AutomatedBVT;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.j2ee.webapplication.ErrorPage;
+import org.eclipse.jst.j2ee.webapplication.WebAppResource;
+import org.eclipse.jst.j2ee.webapplication.WebType;
+import org.eclipse.jst.j2ee.webapplication.WebapplicationFactory;
+import org.eclipse.jst.j2ee.webapplication.WebapplicationPackage;
+import org.eclipse.jst.j2ee.webapplication.internal.impl.FilterMappingImpl;
+import org.eclipse.wst.common.internal.emf.resource.RendererFactory;
+
+
+public class WarEMFTest extends GeneralEMFPopulationTest {
+    protected EARFile earFile;
+    protected WARFile warFile;
+    protected int createdWebTypes = 0;
+    protected int createdErrorPages = 0;
+	protected boolean fmFlag = false;
+	
+    public WarEMFTest(String name) {
+        super(name);
+    }
+    
+    public WarEMFTest(String name, RendererFactory factory) {
+    	super(name, factory);
+    }
+
+    public static void main(java.lang.String[] args) {
+        junit.textui.TestRunner.main(new String[]{ WarEMFTest.class.getName() });
+    }
+    
+    public static junit.framework.Test suite(RendererFactory factory) {
+        TestSuite suite = new TestSuite(WarEMFTest.class.getName());
+        //[248158] suite.addTest(new WarEMFTest("testWARPopulation",factory));
+		suite.addTest(new WarEMFTest("test14WARPopulation",factory));
+        return suite;
+    }
+
+    public void testWARPopulation() throws Exception {
+        EMFAttributeFeatureGenerator.reset();
+        createEAR();
+        createWARClient();
+
+        WebAppResource DD = (WebAppResource) warFile.getDeploymentDescriptorResource();
+        DD.setVersionID(J2EEVersionConstants.J2EE_1_3_ID);
+		//TODO: individual test for each version
+		setVersion(VERSION_1_3);
+		setModuleType(WEB);
+        populateRoot(DD.getRootObject());
+
+		String out = AutomatedBVT.baseDirectory +"testOutput/TestWarEAR";
+        earFile.extractTo(out, Archive.EXPAND_ALL);
+        earFile.close();
+
+        //Compare work in progress
+        String curDir = AutomatedBVT.baseDirectory;
+        String exampleDeploymentDesURI = curDir + "EMFTestNoID/web.xml";
+        String curDeploymentDesURI = curDir + "testOutput/TestWarEAR/fooWAR/WEB-INF/web.xml";
+		setIgnoreAtt(ignorableAttributes());
+		setEquivalentLines(getEquivalentLinesMap());
+		compareContentsIgnoreWhitespace(curDeploymentDesURI, exampleDeploymentDesURI, null);
+    }
+    
+	public void test14WARPopulation() throws Exception {
+		EMFAttributeFeatureGenerator.reset();
+		createEAR();
+		createWARClient();
+
+		WebAppResource DD = (WebAppResource) warFile.getDeploymentDescriptorResource();
+		DD.setVersionID(J2EEVersionConstants.J2EE_1_4_ID);
+		//TODO: individual test for each version
+		setVersion(VERSION_1_4);
+		setModuleType(WEB);
+		//setGeneralDepth(2);
+		populateRoot(DD.getRootObject());
+
+		String out = AutomatedBVT.baseDirectory +"testOutput/TestWarEAR14";
+		earFile.extractTo(out, Archive.EXPAND_ALL);
+		earFile.close();
+		
+		getWARClient();
+		assertEquals("2.4", warFile.getDeploymentDescriptor().getVersion());
+		out = AutomatedBVT.baseDirectory +"testOutput/TestWarEAR14_2";
+		warFile.extractTo(out, Archive.EXPAND_ALL);
+		warFile.close();
+
+		//Compare work in progress
+		String curDir = AutomatedBVT.baseDirectory;
+		String exampleDeploymentDesURI = out + "/WEB-INF/web.xml";
+		String curDeploymentDesURI = curDir + "testOutput/TestWarEAR14/fooWAR/WEB-INF/web.xml";
+		setIgnoreAtt(ignorableAttributes());
+		compareContentsIgnoreWhitespace(curDeploymentDesURI, exampleDeploymentDesURI, null);
+	}
+	
+	/**
+	 * @return
+	 */
+	private Map getEquivalentLinesMap() {
+		Map lines = new HashMap();
+		lines.put("<distributable></distributable>", "<distributable/>"); 
+		return lines;
+	}
+
+    public void createWARClient() throws DuplicateObjectException {
+        warFile = getArchiveFactory().createWARFileInitialized("fooWAR");
+        warFile = (WARFile) earFile.addCopy(warFile);
+        warFile.getDeploymentDescriptor().setDisplayName("fooWAR");
+        assertTrue(warFile.getDeploymentDescriptor() != null);
+    }
+
+    public void createEAR() {
+        String earName = "Test.ear";
+        earFile = getArchiveFactory().createEARFileInitialized(earName);
+        assertTrue(earFile.getDeploymentDescriptor() != null);
+    }
+    
+	public void getWARClient() throws DuplicateObjectException, OpenFailureException {
+		String in = AutomatedBVT.baseDirectory + "testOutput/TestWarEAR14/fooWAR";
+		ArchiveOptions options = new ArchiveOptions();
+		options.setRendererType(options.SAX);
+		warFile = getArchiveFactory().openWARFile(options, in);
+		assertTrue(warFile.getDeploymentDescriptor() != null);
+	}
+
+    public EObject createInstance(EReference ref,EObject eObject) {
+
+        if (WebapplicationPackage.eINSTANCE.getWebType().equals(ref.getEType()))
+            return createWebType();
+        else if (WebapplicationPackage.eINSTANCE.getErrorPage().equals(ref.getEType()))
+            return createErrorPage();
+
+        return super.createInstance(ref, eObject);
+    }
+    /* The web type is abstract.  Alternate between servlet-class
+     * and jsp-file
+     */
+    public WebType createWebType() {
+        createdWebTypes++;
+        if ((createdWebTypes & 1) == 0)
+            return WebapplicationFactory.eINSTANCE.createServletType();
+        else
+            return WebapplicationFactory.eINSTANCE.createJSPType();
+
+    }
+    /* The error page is abstract.  Alternate between exceptiontype
+     * and error code
+     */
+    public ErrorPage createErrorPage() {
+        createdErrorPages++;
+        if ((createdErrorPages & 1) == 0)
+            return WebapplicationFactory.eINSTANCE.createErrorCodeErrorPage();
+        else
+            return WebapplicationFactory.eINSTANCE.createExceptionTypeErrorPage();
+    }
+	/* (non-Javadoc)
+	 * @see com.ibm.etools.archive.emftest.GeneralEMFPopulationTest#populateAttributes(org.eclipse.emf.ecore.EObject)
+	 */
+	protected void populateAttributes(EObject eObject) {
+		if (eObject instanceof FilterMappingImpl){
+			List attributes = eObject.eClass().getEAllAttributes();
+			for (int i = 0; i < attributes.size(); i++) {
+				EAttribute att = (EAttribute) attributes.get(i);
+				if(att.getName().equals("urlPattern") && fmFlag){
+					continue;					
+				}	
+				
+				Object value = createAttributeValue(att, eObject);
+				if (att.isChangeable())
+					eObject.eSet(att, value);
+			} 
+			fmFlag = !fmFlag;
+		}
+		else 
+			super.populateAttributes(eObject);
+	}
+	
+
+	protected void populateSharedReference(EObject eObject, EReference ref) {
+		if(eObject instanceof FilterMappingImpl && ref.getName().equals("servlet")){
+			fmFlag = !fmFlag;
+			//if method permission unchecked ignore roles
+			if(!fmFlag){
+				return;
+			}
+		}
+		super.populateSharedReference(eObject, ref);
+	}
+	
+	protected boolean isValidAuth(ResAuthTypeBase auth) {
+		if (version == VERSION_1_2)
+			return auth == ResAuthTypeBase.SERVLET_LITERAL || auth == ResAuthTypeBase.CONTAINER_LITERAL;
+		else
+			return super.isValidAuth(auth);
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/WebServicesEMFTest.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/WebServicesEMFTest.java
new file mode 100644
index 0000000..5e05513
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/WebServicesEMFTest.java
@@ -0,0 +1,265 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ * Created on Aug 6, 2003
+ *
+ * To change the template for this generated file go to
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+package org.eclipse.jst.j2ee.archive.emftests;
+
+import junit.framework.TestSuite;
+import junit.textui.TestRunner;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.jst.j2ee.archive.testutilities.EMFAttributeFeatureGenerator;
+import org.eclipse.jst.j2ee.common.internal.impl.J2EEResourceFactoryRegistry;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.EARFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.EJBJarFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.DuplicateObjectException;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.OpenFailureException;
+import org.eclipse.jst.j2ee.core.tests.bvt.AutomatedBVT;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.j2ee.webservice.jaxrpcmap.InterfaceMapping;
+import org.eclipse.jst.j2ee.webservice.jaxrpcmap.JavaWSDLMapping;
+import org.eclipse.jst.j2ee.webservice.jaxrpcmap.JaxrpcmapFactory;
+import org.eclipse.jst.j2ee.webservice.jaxrpcmap.JaxrpcmapPackage;
+import org.eclipse.jst.j2ee.webservice.jaxrpcmap.JaxrpcmapResource;
+import org.eclipse.jst.j2ee.webservice.jaxrpcmap.JaxrpcmapResourceFactory;
+import org.eclipse.jst.j2ee.webservice.wsclient.WebServicesResource;
+import org.eclipse.jst.j2ee.webservice.wsdd.WsddFactory;
+import org.eclipse.jst.j2ee.webservice.wsdd.WsddResource;
+import org.eclipse.wst.common.internal.emf.resource.RendererFactory;
+
+
+/**
+ * @author dfholttp
+ *
+ * To change the template for this generated type comment go to
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+public class WebServicesEMFTest extends GeneralEMFPopulationTest {
+	public EARFile earFile;
+	public EJBJarFile ejbFile;
+	int currentVersion = J2EEVersionConstants.J2EE_1_3_ID;
+	private int createdInterfaceMaps = 0;
+
+	public WebServicesEMFTest(String name) {
+		super(name);
+	}
+	
+    public WebServicesEMFTest(String name, RendererFactory factory) {
+    	super(name, factory);
+    }
+
+	public static void main(java.lang.String[] args) {
+		String[] className = { "com.ibm.etools.archive.test.WebServicesEMFTest", "-noloading" };
+		TestRunner.main(className);
+	}
+	public static junit.framework.Test suite(RendererFactory factory) {
+		TestSuite suite = new TestSuite(WebServicesEMFTest.class.getName());
+		suite.addTest(new WebServicesEMFTest("test13WebServicesClientPopulation",factory));
+		suite.addTest(new WebServicesEMFTest("test13WebServicesDDPopulation",factory));
+		suite.addTest(new WebServicesEMFTest("test14WebServicesDDPopulation",factory));
+		suite.addTest(new WebServicesEMFTest("test50WebServicesDDPopulation",factory));
+		suite.addTest(new WebServicesEMFTest("testJaxRPCMapPopulation",factory));
+		return suite;
+	}
+	
+	public void test13WebServicesClientPopulation() throws Exception {
+		currentVersion = J2EEVersionConstants.J2EE_1_3_ID;
+		EMFAttributeFeatureGenerator.reset();
+		createEAR();
+		createEJB();
+		
+
+		WebServicesResource webserDD = (WebServicesResource)ejbFile.getResourceSet().createResource(URI.createURI("META-INF/webservicesclient.xml"));
+		//TODO: individual test for each version
+		webserDD.setVersionID(currentVersion);
+		setVersion(VERSION_1_3);
+		populateRoot(webserDD.getRootObject());
+		
+		String out = AutomatedBVT.baseDirectory +getProjectLocation();
+		earFile.extractTo(out, Archive.EXPAND_ALL);
+		earFile.close();
+
+	}
+
+	public void testJaxRPCMapPopulation() throws Exception {
+		currentVersion = J2EEVersionConstants.J2EE_1_3_ID;
+		EMFAttributeFeatureGenerator.reset();
+		createEAR();
+		createEJB();
+		String mappingFilePathURI = "META-INF/testmap.xml";
+		URI uri = URI.createURI(mappingFilePathURI);
+		ResourceSet resSet = ejbFile.getResourceSet();
+		J2EEResourceFactoryRegistry registry = (J2EEResourceFactoryRegistry) resSet.getResourceFactoryRegistry();
+		registry.registerLastFileSegment(uri.lastSegment(), new JaxrpcmapResourceFactory(RendererFactory.getDefaultRendererFactory()));
+		resSet = earFile.getResourceSet();
+		registry = (J2EEResourceFactoryRegistry) resSet.getResourceFactoryRegistry();
+		registry.registerLastFileSegment(uri.lastSegment(), new JaxrpcmapResourceFactory(RendererFactory.getDefaultRendererFactory()));
+
+		JaxrpcmapResource jaxrpcmapRes = (JaxrpcmapResource) resSet.createResource(uri);
+		
+		jaxrpcmapRes.setVersionID(currentVersion);
+		setVersion(VERSION_1_3);
+		
+		JavaWSDLMapping map = JaxrpcmapFactory.eINSTANCE.createJavaWSDLMapping();
+		jaxrpcmapRes.getContents().add(map);
+		populateRoot(jaxrpcmapRes.getRootObject());
+		
+		String out = AutomatedBVT.baseDirectory +getProjectLocation();
+		earFile.extractTo(out, Archive.EXPAND_ALL);
+		earFile.close();
+
+	}
+	
+	public void test13WebServicesDDPopulation() throws Exception {
+		EMFAttributeFeatureGenerator.reset();
+		currentVersion = J2EEVersionConstants.J2EE_1_3_ID;
+		createEAR();
+		createEJB();
+
+		WsddResource webserDD = (WsddResource)ejbFile.getResourceSet().createResource(URI.createURI("META-INF/webservices.xml"));
+		//TODO: individual test for each version
+		webserDD.setVersionID(currentVersion);
+		setVersion(VERSION_1_3);
+		populateRoot(webserDD.getRootObject());
+		
+		String out = AutomatedBVT.baseDirectory +getProjectLocation();
+		earFile.extractTo(out, Archive.EXPAND_ALL);
+		earFile.close();
+
+	}
+	public void test14WebServicesDDPopulation() throws Exception {
+		EMFAttributeFeatureGenerator.reset();
+		currentVersion = J2EEVersionConstants.J2EE_1_4_ID;
+		createEAR();
+		createEJB();
+
+		WsddResource webserDD = (WsddResource)ejbFile.getResourceSet().createResource(URI.createURI("META-INF/webservices.xml"));
+		webserDD.getContents().add(WsddFactory.eINSTANCE.createWebServices());
+		//TODO: individual test for each version
+		webserDD.setVersionID(currentVersion);
+		setVersion(VERSION_1_4);
+		populateRoot(webserDD.getRootObject());
+		
+		String out = AutomatedBVT.baseDirectory +getProjectLocation();
+		earFile.extractTo(out, Archive.EXPAND_ALL);
+		earFile.close();
+
+	}
+	public void test50WebServicesDDPopulation() throws Exception {
+		EMFAttributeFeatureGenerator.reset();
+		currentVersion = J2EEVersionConstants.JEE_5_0_ID;
+		createEAR();
+		createEJB();
+
+		WsddResource webserDD = (WsddResource)ejbFile.getResourceSet().createResource(URI.createURI("META-INF/webservices.xml"));
+		webserDD.getContents().add(WsddFactory.eINSTANCE.createWebServices());
+		//TODO: individual test for each version
+		webserDD.setVersionID(currentVersion);
+		setVersion(VERSION_5_0);
+		populateRoot(webserDD.getRootObject());
+		
+		String out = AutomatedBVT.baseDirectory +getProjectLocation();
+		earFile.extractTo(out, Archive.EXPAND_ALL);
+		earFile.close();
+
+	}
+
+	public void test60WebServicesDDPopulation() throws Exception {
+		EMFAttributeFeatureGenerator.reset();
+		currentVersion = J2EEVersionConstants.JEE_6_0_ID;
+		createEAR();
+		createEJB();
+
+		WsddResource webserDD = (WsddResource)ejbFile.getResourceSet().createResource(URI.createURI("META-INF/webservices.xml"));
+		webserDD.getContents().add(WsddFactory.eINSTANCE.createWebServices());
+		//TODO: individual test for each version
+		webserDD.setVersionID(currentVersion);
+		setVersion(VERSION_6_0);
+		populateRoot(webserDD.getRootObject());
+		
+		String out = AutomatedBVT.baseDirectory +getProjectLocation();
+		earFile.extractTo(out, Archive.EXPAND_ALL);
+		earFile.close();
+
+	}
+
+	public void test70WebServicesDDPopulation() throws Exception {
+		EMFAttributeFeatureGenerator.reset();
+		currentVersion = J2EEVersionConstants.JEE_7_0_ID;
+		createEAR();
+		createEJB();
+
+		WsddResource webserDD = (WsddResource)ejbFile.getResourceSet().createResource(URI.createURI("META-INF/webservices.xml"));
+		webserDD.getContents().add(WsddFactory.eINSTANCE.createWebServices());
+		//TODO: individual test for each version
+		webserDD.setVersionID(currentVersion);
+		setVersion(VERSION_6_0);
+		populateRoot(webserDD.getRootObject());
+		
+		String out = AutomatedBVT.baseDirectory +getProjectLocation();
+		earFile.extractTo(out, Archive.EXPAND_ALL);
+		earFile.close();
+
+	}
+	
+	public EObject createInstance(EReference ref,EObject eObject) {
+
+        if (JaxrpcmapPackage.eINSTANCE.getInterfaceMapping().equals(ref.getEType()))
+            return createInterfaceMap();
+
+        return super.createInstance(ref, eObject);
+    }
+	
+    /* The web type is abstract.  Alternate between servlet-class
+     * and jsp-file
+     */
+    public InterfaceMapping createInterfaceMap() {
+        createdInterfaceMaps++;
+        if ((createdInterfaceMaps & 1) == 0)
+            return JaxrpcmapFactory.eINSTANCE.createServiceEndpointInterfaceMapping();
+        else
+            return JaxrpcmapFactory.eINSTANCE.createServiceEndpointInterfaceMapping();
+
+    }
+	
+	public String getProjectLocation() {
+		if (currentVersion == J2EEVersionConstants.J2EE_1_3_ID)
+			return "testOutput/TestWebServices";
+		if (currentVersion == J2EEVersionConstants.J2EE_1_4_ID)
+			return "testOutput/TestWebServices14";
+		else
+			return "testOutput/TestWebServices50";
+	}
+	public void getEJB() throws DuplicateObjectException, OpenFailureException {
+		String in = AutomatedBVT.baseDirectory +getProjectLocation() +"/fooWebServices";
+		ejbFile = getArchiveFactory().openEJBJarFile(in);
+		assertTrue(ejbFile.getDeploymentDescriptor() != null);
+	}
+	public void createEJB() throws DuplicateObjectException {
+		ejbFile = getArchiveFactory().createEJBJarFileInitialized("fooWebServices");
+		ejbFile = (EJBJarFile) earFile.addCopy(ejbFile);
+		ejbFile.getDeploymentDescriptor().setDisplayName("fooWebServices");
+		assertTrue(ejbFile.getDeploymentDescriptor() != null);
+	}
+	public void createEAR() {
+		String earName = "Test.ear";
+		earFile = getArchiveFactory().createEARFileInitialized(earName);
+		assertTrue(earFile.getDeploymentDescriptor() != null);
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/AbstractArchiveTest.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/AbstractArchiveTest.java
new file mode 100644
index 0000000..491a319
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/AbstractArchiveTest.java
@@ -0,0 +1,84 @@
+package org.eclipse.jst.j2ee.archive.test;
+
+ /*
+ * Licensed Material - Property of IBM
+ * (C) Copyright IBM Corp. 2001 - All Rights Reserved.
+ * US Government Users Restricted Rights - Use, duplication or disclosure
+ * restricted by GSA ADP Schedule Contract with IBM Corp.
+ */
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.CommonarchiveFactory;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.CommonarchivePackage;
+/**
+ * Insert the type's description here.
+ * Creation date: (02/07/01 1:48:18 PM)
+ * @author: Administrator
+ */
+public class AbstractArchiveTest extends junit.framework.TestCase {
+	private final static String copyright = "(c) Copyright IBM Corporation 2001.";//$NON-NLS-1$
+/**
+ * AbstractArchiveTest constructor comment.
+ * @param name java.lang.String
+ */
+public AbstractArchiveTest(String name) {
+	super(name);
+}
+public Set getAllUnresolvedProxies(EObject root) {
+	Set visited = new HashSet();
+	Set proxies = new HashSet();
+	getAllUnresolvedProxies(root, proxies, visited, root.eResource());
+	return proxies;
+}
+public void getAllUnresolvedProxies(EObject object, Set proxies, Set visitedObjects, Resource originalResource) {
+
+	if (visitedObjects.contains(object))
+		return;
+	else
+		visitedObjects.add(object);
+
+	if (object.eResource() != originalResource) {
+		if (((org.eclipse.emf.ecore.InternalEObject )object).eIsProxy()) {
+			proxies.add(object);
+		}
+		return;
+	}
+
+	List refs = object.eClass().getEAllReferences();
+	if (refs != null) {
+		Iterator ir = refs.iterator();
+		while (ir.hasNext()) {
+			EReference r = (EReference) ir.next();
+			Object value = object.eGet(r);
+			if (value == null)
+				continue;
+
+			if (r.isMany()) {
+				Collection c = (Collection) value;
+				Iterator ir2 = c.iterator();
+				while (ir2.hasNext()) {
+					EObject refObj = (EObject) ir2.next();
+					getAllUnresolvedProxies(refObj, proxies, visitedObjects, originalResource);
+				}
+			} else
+				getAllUnresolvedProxies((EObject) value, proxies, visitedObjects, originalResource);
+		}
+	}
+}
+public static CommonarchiveFactory getArchiveFactory() {
+	return CommonarchivePackage.eINSTANCE.getCommonarchiveFactory();
+}
+public void verifyProxies(EObject root) {
+
+	Set proxies = getAllUnresolvedProxies(root);
+	assertTrue("Some proxies could not be resolved", proxies.isEmpty());
+}
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/AllArchiveTestsEclipse.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/AllArchiveTestsEclipse.java
new file mode 100644
index 0000000..449fc6e
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/AllArchiveTestsEclipse.java
@@ -0,0 +1,20 @@
+/*
+ * Created on Apr 18, 2003
+ *
+ * To change the template for this generated file go to
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+package org.eclipse.jst.j2ee.archive.test;
+
+/**
+ * @author jsholl
+ *
+ * To change the template for this generated type comment go to
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+public class AllArchiveTestsEclipse extends AllArchiveTestsJava {
+
+    public AllArchiveTestsEclipse(String name) {
+        super(name);
+    }
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/AllArchiveTestsJava.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/AllArchiveTestsJava.java
new file mode 100644
index 0000000..a3f4efc
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/AllArchiveTestsJava.java
@@ -0,0 +1,58 @@
+package org.eclipse.jst.j2ee.archive.test;
+
+ /*
+ * Licensed Material - Property of IBM
+ * (C) Copyright IBM Corp. 2001 - All Rights Reserved.
+ * US Government Users Restricted Rights - Use, duplication or disclosure
+ * restricted by GSA ADP Schedule Contract with IBM Corp.
+ */
+
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+import junit.textui.TestRunner;
+/**
+ * Insert the type's description here.
+ * Creation date: (12/19/00 4:44:04 PM)
+ * @author: Administrator
+ */
+public class AllArchiveTestsJava extends TestCase {
+	private final static String copyright = "(c) Copyright IBM Corporation 2001.";//$NON-NLS-1$
+/**
+ * AllTests constructor comment.
+ * @param name java.lang.String
+ */
+public AllArchiveTestsJava(String name) {
+	super(name);
+}
+/**
+ * Starts the application.
+ * @param args an array of command-line arguments
+ */
+public static void main(java.lang.String[] args) {
+	String[] className = {"com.ibm.etools.archive.test.AllTests", "-noloading"};
+	TestRunner.main(className);
+}
+public static junit.framework.Test suite() {
+	TestSuite suite = new TestSuite("Test for com.ibm.etools.archive.test");
+	suite.addTest(DiscriminatorTest.suite());
+	suite.addTest(LooseArchiveTests.suite());
+	suite.addTest(InitializationTests.suite());
+	suite.addTest(SimpleTests.suite());
+	suite.addTest(CopyTests.suite());
+//	suite.addTest(EJBJarConversionTests.suite());
+	suite.addTest(WARFileTests.suite());
+	suite.addTest(SaveTests.suite());
+	suite.addTest(JavaTests.suite());
+//	suite.addTest(IDTests.suite());
+	//suite.addTest(AltDDTests.suite());
+	suite.addTest(SecurityRoleTests.suite());
+	suite.addTest(RarFileTests.suite());
+	suite.addTest(ResourceTests.suite());
+	suite.addTest(ClientContainerResourceLoadTest.suite());
+	suite.addTest(TestModuleClassLoading.suite());
+	suite.addTest(TestInvalidXmlMultiplicity.suite());
+	suite.addTest(DefectVerificationTests.suite());
+	
+	return suite;
+}
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/ClientContainerResourceLoadTest.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/ClientContainerResourceLoadTest.java
new file mode 100644
index 0000000..7466acc
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/ClientContainerResourceLoadTest.java
@@ -0,0 +1,104 @@
+package org.eclipse.jst.j2ee.archive.test;
+
+import java.io.FileNotFoundException;
+import java.util.List;
+
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+import junit.textui.TestRunner;
+
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.ApplicationClientFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.CommonarchiveFactory;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.EARFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.ResourceLoadException;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveInit;
+import org.eclipse.jst.j2ee.core.tests.bvt.AutomatedBVT;
+
+
+
+public class ClientContainerResourceLoadTest extends TestCase{
+	public static EARFile earFile = null;
+	
+	private final static String copyright = "(c) Copyright IBM Corporation 2001."; //$NON-NLS-1$
+	/**
+	 * SimpleTests constructor comment.
+	 * @param name java.lang.String
+	 */
+	public ClientContainerResourceLoadTest(String name) {
+		super(name);
+	}
+
+	protected void setUp() throws Exception {
+		super.setUp();
+		ArchiveInit.init();
+	}
+
+	
+	public static junit.framework.Test suite() {
+		return new TestSuite(ClientContainerResourceLoadTest.class);
+	}
+	/**
+	 * Starts the application.
+	 * @param args an array of command-line arguments
+	 */
+	public static void main(java.lang.String[] args) {
+		String[] className = { "com.ibm.etools.archive.test.ClientContainerResourceLoadTest", "-noloading" };
+		TestRunner.main(className);
+	}
+	
+	public void testClientContainerLoad () throws Exception {
+
+		try {
+
+			CommonarchiveFactory factory = CommonarchiveFactory.eINSTANCE;
+			String in = AutomatedBVT.baseDirectory + "mtapp2.ear";
+			String out = AutomatedBVT.baseDirectory + "mtapp2Finished.ear";
+			earFile = factory.openEARFile (in);
+			System.out.println ("uri: " + earFile.getURI());
+
+			List appClients = earFile.getApplicationClientFiles();
+			boolean exFound1 = false;
+			boolean exFound2 = false;
+			
+			for(int i = 0; i<appClients.size(); i++){
+				ApplicationClientFile file = (ApplicationClientFile)appClients.get(0);
+				Resource res;
+
+				try{
+					res = file.getMofResource("META-INF/FOOclient-resource.xmi");
+				} catch(Exception e){	
+					exFound1 = true;
+					if(!(e instanceof FileNotFoundException)){
+						assertTrue("Expected FileNotFoundException", false);
+					}		
+				}
+				
+				try {
+					res = file.getMofResource("META-INF/client-resource.xmi");
+				} catch (Exception e) {
+					exFound2 = true;
+					if(!(e instanceof ResourceLoadException)){
+						assertTrue("Expected ResourceLoadException", false);
+					}	
+				}
+			}
+			assertTrue("No exception logged for non-existing file", exFound1);
+			assertTrue("No exception logged for existing", exFound2);
+
+			
+			earFile.saveAs(out);
+			earFile.close();
+		}
+		catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+	/* (non-Javadoc)
+	 * @see junit.framework.TestCase#tearDown()
+	 */
+	protected void tearDown() throws Exception {
+		super.tearDown();
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/CopyTests.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/CopyTests.java
new file mode 100644
index 0000000..f4d08f4
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/CopyTests.java
@@ -0,0 +1,234 @@
+package org.eclipse.jst.j2ee.archive.test;
+
+/*
+* Licensed Material - Property of IBM
+* (C) Copyright IBM Corp. 2001 - All Rights Reserved.
+* US Government Users Restricted Rights - Use, duplication or disclosure
+* restricted by GSA ADP Schedule Contract with IBM Corp.
+*/
+
+import java.util.Iterator;
+import java.util.List;
+
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+import junit.textui.TestRunner;
+
+import org.eclipse.jst.j2ee.application.Module;
+import org.eclipse.jst.j2ee.application.WebModule;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.CommonarchiveFactory;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.CommonarchivePackage;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.EARFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.EJBJarFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.EJBModuleRef;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.File;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.ReadOnlyDirectory;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.WARFile;
+import org.eclipse.jst.j2ee.core.tests.bvt.AutomatedBVT;
+import org.eclipse.jst.j2ee.ejb.EjbFactory;
+import org.eclipse.jst.j2ee.ejb.EjbPackage;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.j2ee.webapplication.WebapplicationFactory;
+import org.eclipse.jst.j2ee.webapplication.WebapplicationPackage;
+
+
+/**
+ * Insert the type's description here.
+ * Creation date: (12/14/00 12:10:36 PM)
+ * @author: Administrator
+ */
+public class CopyTests extends TestCase {
+	private final static String copyright = "(c) Copyright IBM Corporation 2001."; //$NON-NLS-1$
+	/**
+	 * CopyTests constructor comment.
+	 * @param name java.lang.String
+	 */
+	public CopyTests(String name) {
+		super(name);
+	}
+	public CommonarchiveFactory getArchiveFactory() {
+		return CommonarchivePackage.eINSTANCE.getCommonarchiveFactory();
+	}
+	public EjbFactory getEJBFactory() {
+		return EjbPackage.eINSTANCE.getEjbFactory();
+	}
+
+	public EjbPackage getEJBPackage() {
+		return EjbPackage.eINSTANCE;
+	}
+	public WebapplicationFactory getWebFactory() {
+		return WebapplicationPackage.eINSTANCE.getWebapplicationFactory();
+	}
+	/**
+	 * Starts the application.
+	 * @param args an array of command-line arguments
+	 */
+	public static void main(java.lang.String[] args) {
+		String[] className = { "com.ibm.etools.archive.test.CopyTests", "-noloading" };
+		TestRunner.main(className);
+	}
+	public static junit.framework.Test suite() {
+		return new TestSuite(CopyTests.class);
+	}
+	/**
+	 * Tests the addCopy(ReadOnlyDirectory) api on archive
+	 */
+	public void testAddCopyDirectory() throws Exception {
+
+		WARFile aWarFile = (WARFile) getArchiveFactory().openArchive(AutomatedBVT.baseDirectory + "example2.war");
+
+		ReadOnlyDirectory sampleDirectory = getArchiveFactory().openReadOnlyDirectory(AutomatedBVT.baseDirectory + "WarTestClasses");
+		
+		int initialSize = aWarFile.getFiles().size();
+
+		aWarFile.addCopy(sampleDirectory);
+		Iterator iter = aWarFile.getFiles().iterator();
+		//For running inside eclipse
+		while (iter.hasNext()) {
+			String uri = ((File)iter.next()).getURI();
+			if (uri.indexOf("CVS") >= 0) 
+				iter.remove();
+		}
+		assertTrue("Wrong number of files ", aWarFile.getFiles().size() == initialSize + 7);
+		aWarFile.saveAsNoReopen(AutomatedBVT.baseDirectory + "testOutput/CopyTests/addCopyDir.war");
+
+	}
+
+	public void testAddCopyModule() throws Exception {
+
+		String in = AutomatedBVT.baseDirectory + "sample.ear";
+		EARFile earFile = (EARFile) getArchiveFactory().openArchive(in);
+		List modules = earFile.getDeploymentDescriptor().getModules();
+		EJBJarFile ejbJarFile = null;
+
+		for (int i = 0; i < modules.size(); i++) {
+			Module aModule = (Module) modules.get(i);
+			if (aModule.isEjbModule()) {
+				ejbJarFile = (EJBJarFile) earFile.getFile(aModule.getUri());
+				break;
+			}
+		}
+
+		assertTrue("EJBJarFile should not be null", ejbJarFile != null);
+		ejbJarFile.getDeploymentDescriptor();
+
+		EARFile newEarFile = getArchiveFactory().createEARFileInitialized(AutomatedBVT.baseDirectory + "testOutput/CopyTests/newEarWithCopiedModule.ear");
+		newEarFile.addCopy(ejbJarFile);
+		EJBJarFile copied = (EJBJarFile) newEarFile.getModuleFiles().get(0);
+		assertTrue(copied.isDeploymentDescriptorSet());
+		assertTrue(copied.getDeploymentDescriptor() == copied.getDeploymentDescriptorResource().getContents().get(0));
+		assertTrue(copied.getDeploymentDescriptor() != ejbJarFile.getDeploymentDescriptor());
+		assertTrue(ejbJarFile.getFiles().size() == copied.getFiles().size());
+
+		newEarFile.saveNoReopen();
+	}
+
+	/**
+	 * Test per CMVC defect report 96197
+	 * Create a new application, open ejb jar file, use addcopy to add the module, and save
+	 * using original ear, get the ejb jar, and modify bindings
+	 * save again
+	 * Result:  bindings not updated
+	 */
+	public void testAddCopyModuleFilesToEAR() throws Exception {
+		String uri = AutomatedBVT.baseDirectory + "testOutput/CopyTests/testAddCopyModuleFilesToEAR.ear";
+		//Create a new ear file, add a standalone ejb jar file and standalone war file, and save
+		EARFile earFile = getArchiveFactory().createEARFileInitialized(uri);
+		earFile.setJ2EEVersion(J2EEVersionConstants.J2EE_1_3_ID);
+		earFile.getDeploymentDescriptor().setDisplayName(uri);
+		EJBJarFile ejbJarFile = getArchiveFactory().openEJBJarFile(AutomatedBVT.baseDirectory + "bankejbs.jar");
+		earFile.addCopy(ejbJarFile);
+		WARFile warFile = getArchiveFactory().openWARFile(AutomatedBVT.baseDirectory + "example2.war");
+		earFile.addCopy(warFile);
+		((WebModule) earFile.getDeploymentDescriptor().getFirstModule(warFile.getURI())).setContextRoot("/");
+		earFile.save();
+
+		ejbJarFile = (EJBJarFile) earFile.getEJBJarFiles().get(0);
+		assertTrue("ejb dd resource not right", ejbJarFile.getDeploymentDescriptor().eResource() == ejbJarFile.getDeploymentDescriptorResource());
+
+		
+
+		warFile = (WARFile) earFile.getWARFiles().get(0);
+		assertTrue("war dd resource not right", warFile.getDeploymentDescriptor().eResource() == warFile.getDeploymentDescriptorResource());
+
+		
+		earFile.saveNoReopen();
+
+		
+		earFile.close();
+
+	}
+	/**
+	 * Tests opening a standalone module with an absolute path, and adding that to a new ear file, per defect report
+	 */
+	public void testAddCopyStandaloneModule() throws Exception {
+		String fileName = AutomatedBVT.baseDirectory + "bankejbs.jar";
+
+		EJBJarFile ejbJarFile = (EJBJarFile) getArchiveFactory().openArchive(fileName);
+		ejbJarFile.getDeploymentDescriptor();
+
+		EARFile newEarFile = getArchiveFactory().createEARFileInitialized(AutomatedBVT.baseDirectory + "testOutput/CopyTests/newEarWithStandAloneModule-out.ear");
+		newEarFile.addCopy(ejbJarFile);
+		EJBJarFile copied = (EJBJarFile) newEarFile.getModuleFiles().get(0);
+		assertTrue(copied.isDeploymentDescriptorSet());
+		assertTrue(copied.getDeploymentDescriptor() == copied.getDeploymentDescriptorResource().getContents().get(0));
+		assertTrue(copied.getDeploymentDescriptor() != ejbJarFile.getDeploymentDescriptor());
+		assertTrue(ejbJarFile.getFiles().size() == copied.getFiles().size());
+
+		newEarFile.saveNoReopen();
+	}
+
+	public void testAddRenameAndDelete() throws Exception {
+
+		String in = AutomatedBVT.baseDirectory + "sample.ear";
+		EARFile earFile = (EARFile) getArchiveFactory().openArchive(in);
+		List modules = earFile.getDeploymentDescriptor().getModules();
+		EJBJarFile ejbJarFile = null;
+
+		for (int i = 0; i < modules.size(); i++) {
+			Module aModule = (Module) modules.get(i);
+			if (aModule.isEjbModule()) {
+				ejbJarFile = (EJBJarFile) earFile.getFile(aModule.getUri());
+				break;
+			}
+		}
+
+		assertTrue("EJBJarFile should not be null", ejbJarFile != null);
+		ejbJarFile.getDeploymentDescriptor();
+
+		EARFile newEarFile = getArchiveFactory().createEARFileInitialized(AutomatedBVT.baseDirectory + "testOutput/CopyTests/newEarWithCopiedModule.ear");
+		EJBModuleRef addedCopy = (EJBModuleRef) newEarFile.addCopyRef(ejbJarFile);
+		assertTrue("Module files should not be empty", !newEarFile.getModuleFiles().isEmpty());
+		assertTrue("Modules should not be empty", !newEarFile.getDeploymentDescriptor().getModules().isEmpty());
+		assertTrue("Module should be accessible and have the same uri as file", addedCopy.getModule().getUri().equals(addedCopy.getModuleFile().getURI()));
+
+		String newURI = "temp/foobar.jar";
+		addedCopy.setURI(newURI);
+		assertTrue("Module should be accessible and have the new renamed uri as well as the file", addedCopy.getModule().getUri().equals(addedCopy.getModuleFile().getURI()) && addedCopy.getModule().getUri().equals(newURI));
+		newEarFile.remove(addedCopy);
+		assertTrue("Module files should be empty", newEarFile.getModuleFiles().isEmpty());
+		assertTrue("Modules should be empty", newEarFile.getDeploymentDescriptor().getModules().isEmpty());
+
+	}
+
+	public void testAddRenameAndDeleteStandalone() throws Exception {
+
+		String fileName = AutomatedBVT.baseDirectory + "bankejbs.jar";
+
+		EJBJarFile ejbJarFile = (EJBJarFile) getArchiveFactory().openArchive(fileName);
+
+		EARFile newEarFile = getArchiveFactory().createEARFileInitialized(AutomatedBVT.baseDirectory + "testOutput/CopyTests/newEarWithCopiedModule.ear");
+		EJBModuleRef addedCopy = (EJBModuleRef) newEarFile.addCopyRef(ejbJarFile);
+		assertTrue("Module files should not be empty", !newEarFile.getModuleFiles().isEmpty());
+		assertTrue("Modules should not be empty", !newEarFile.getDeploymentDescriptor().getModules().isEmpty());
+		assertTrue("Module should be accessible and have the same uri as file", addedCopy.getModule().getUri().equals(addedCopy.getModuleFile().getURI()));
+
+		String newURI = "temp/foobar.jar";
+		addedCopy.setURI(newURI);
+		assertTrue("Module should be accessible and have the new renamed uri as well as the file", addedCopy.getModule().getUri().equals(addedCopy.getModuleFile().getURI()) && addedCopy.getModule().getUri().equals(newURI));
+		newEarFile.remove(addedCopy);
+		assertTrue("Module files should be empty", newEarFile.getModuleFiles().isEmpty());
+		assertTrue("Modules should be empty", newEarFile.getDeploymentDescriptor().getModules().isEmpty());
+
+	}
+}
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/DefectVerificationTests.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/DefectVerificationTests.java
new file mode 100644
index 0000000..205165b
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/DefectVerificationTests.java
@@ -0,0 +1,383 @@
+/*
+ * Created on May 20, 2004
+ */
+package org.eclipse.jst.j2ee.archive.test;
+
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Iterator;
+import java.util.List;
+import java.util.zip.ZipInputStream;
+
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.jem.util.logger.proxy.Logger;
+import org.eclipse.jst.j2ee.application.Application;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.CommonarchiveFactory;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.CommonarchivePackage;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.Container;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.EARFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.EJBModuleRef;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.File;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.ModuleRef;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.WebModuleRef;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveOptions;
+import org.eclipse.jst.j2ee.core.tests.bvt.AutomatedBVT;
+import org.eclipse.jst.j2ee.internal.WrappedException;
+import org.eclipse.jst.j2ee.webapplication.FilterMapping;
+import org.eclipse.jst.j2ee.webapplication.WebApp;
+
+/**
+ * @author mdelder
+ */
+public class DefectVerificationTests extends TestCase {
+
+	/**
+	 *  
+	 */
+	public DefectVerificationTests() {
+		super();
+	}
+
+	/**
+	 * @param name
+	 */
+	public DefectVerificationTests(String name) {
+		super(name);
+	}
+
+	public static junit.framework.Test suite() {
+	    /*TestSuite suite = new TestSuite();
+	    suite.addTest(new DefectVerificationTests("testFilterMappingTranslator"));
+	    return suite;*/
+		return new TestSuite(DefectVerificationTests.class); 
+	}
+	
+
+	public void testFilterMappingTranslator() throws Exception {
+/*		ArchiveOptions options = new ArchiveOptions();
+		options.setRendererType(ArchiveOptions.DOM);
+		final String earPath = AutomatedBVT.baseDirectory + "sample.ear";
+		CommonarchivePackage pkg = CommonarchivePackage.eINSTANCE;
+		EARFile earFile = pkg.getCommonarchiveFactory().openEARFile(options,
+				earPath);
+		// open the ear
+		System.out.println("opening " + archive + " ... ");*/
+	    
+	    String archive = AutomatedBVT.baseDirectory + "QIDefectsNew.ear";
+	    String name = "QIDefects.war";
+		  /*
+		   * crack open the ear file using the common archive:
+		   */
+		  CommonarchiveFactory archiveFactory = (CommonarchiveFactory) CommonarchivePackage.eINSTANCE.getEFactoryInstance();
+		  ArchiveOptions options = new ArchiveOptions();
+		  options.setRendererType(ArchiveOptions.SAX);
+		  options.setUseJavaReflection(false);
+		  //   options.setDiscriminateNestedArchives(extraProcessing);
+		  		
+		  		EARFile earFile = archiveFactory.openEARFile(options, archive);
+				WebModuleRef warFile = null;
+				for (Iterator i = earFile.getModuleRefs().iterator(); i.hasNext();) {
+				    ModuleRef mref = (ModuleRef) i.next();
+				    if (name.equals(mref.getUri())) { 
+				        warFile =  (WebModuleRef) mref;
+				    }
+				}
+   
+				WebApp dd = (WebApp)warFile.getDeploymentDescriptor();
+   
+				EList filterMappings = dd.getFilterMappings();
+				assertTrue("The test requires two filter mappings.", filterMappings.size() == 2); 
+				FilterMapping filterMapping1 = (FilterMapping)filterMappings.get(0);
+				assertNotNull("A URL Pattern was not found for filter with name " + filterMapping1.getFilter().getName(),filterMapping1.getUrlPattern());
+				FilterMapping filterMapping2 = (FilterMapping)filterMappings.get(1);
+				assertNotNull("A Servlet name was not found for filter with name " + filterMapping2.getFilter().getName(),filterMapping2.getServletName());
+				assertNotNull("A Servlet was not found for filter with name " + filterMapping2.getFilter().getName(),filterMapping2.getServlet());
+				      
+	}
+
+	public void testFormerDefect297() throws Exception {
+		ArchiveOptions options = new ArchiveOptions();
+		options.setRendererType(ArchiveOptions.DOM);
+		final String earPath = AutomatedBVT.baseDirectory + "sample.ear";
+		CommonarchivePackage pkg = CommonarchivePackage.eINSTANCE;
+		EARFile earFile = pkg.getCommonarchiveFactory().openEARFile(options,
+				earPath);
+		earFile.extractNoReopen(Archive.EXPAND_ALL);
+	}
+
+	public void testFormerDefect1459() throws Exception {
+		ArchiveOptions options = new ArchiveOptions();
+		options.setRendererType(ArchiveOptions.DOM);
+		CommonarchivePackage pkg = CommonarchivePackage.eINSTANCE;
+		CommonarchiveFactory factory = pkg.getCommonarchiveFactory();
+
+		EARFile earFile = factory.createEARFileInitialized(options, "Test.ear");
+		earFile.saveAs("C:\\Test.ear");
+	}
+
+	/*
+	 * public void testCorruptedEAR() throws Exception { ArchiveOptions options =
+	 * new ArchiveOptions(); options.setRendererType(ArchiveOptions.DOM); final
+	 * String earPath = AutomatedBVT.baseDirectory + "occam.ear";
+	 * CommonarchivePackage pkg = CommonarchivePackage.eINSTANCE;
+	 * CommonarchiveFactory factory = pkg.getCommonarchiveFactory();
+	 * 
+	 * EARFile earFile = factory.openEARFile(options, earPath);
+	 * 
+	 * List files = earFile.getFiles();
+	 * 
+	 * for(int i=0; i <files.size(); i++) { System.err.println(files.get(i));
+	 * readFile( (File) files.get(i)); if(files.get(i) instanceof WARFile) {
+	 * WARFile war = (WARFile) files.get(i); List warFiles = war.getFiles();
+	 * for(int j=0; j <warFiles.size(); j++) {
+	 * System.err.println(warFiles.get(j)); readFile((File)warFiles.get(j)); } } }
+	 * System.out.println("Done"); }
+	 */
+
+	/**
+	 * @param file
+	 * @throws FileNotFoundException
+	 * @throws IOException
+	 */
+	private void readFile(File file) throws FileNotFoundException, IOException {
+		InputStream is = file.getInputStream();
+		ZipInputStream zis = new ZipInputStream(is);
+		try {
+			while (zis.getNextEntry() != null);
+
+		} finally {
+			if (is != null)
+				is.close();
+			if (zis != null)
+				zis.close();
+			is = null;
+			zis = null;
+		}
+	}
+
+	public void testSavingEARWhileDeploying() throws Exception {
+		try {
+			ArchiveOptions options = new ArchiveOptions();
+			options.setRendererType(ArchiveOptions.SAX);
+			options.setUseJavaReflection(true);
+			final String earPath = AutomatedBVT.baseDirectory
+					+ "AuctionApp.ear";
+			CommonarchivePackage pkg = CommonarchivePackage.eINSTANCE;
+			EARFile earFile = pkg.getCommonarchiveFactory().openEARFile(
+					options, earPath);
+			printFiles(earFile);
+			earFile.save();
+
+			earFile.reopen();
+		} catch (WrappedException we) {
+			Logger.getLogger().logError(we);
+			Logger.getLogger().logError(we.getMessage());
+			if (we.getCause() != null)
+				Logger.getLogger().logError(we.getCause());
+			if (we.getNestedException() != null)
+				Logger.getLogger().logError(we.getNestedException());
+			if (we.getNestedException() != null)
+				Logger.getLogger().logError(we.getConcatenatedMessages());
+			throw we;
+		}
+	}
+
+	public void testCreatingEARFile() throws Exception {
+
+		CommonarchivePackage pkg = CommonarchivePackage.eINSTANCE;
+		CommonarchiveFactory factory = pkg.getCommonarchiveFactory();
+		final String earPath = AutomatedBVT.baseDirectory
+				+ "InitializedEAR.ear";
+
+		ArchiveOptions options = new ArchiveOptions();
+		options.setIsReadOnly(true);
+		options.setRendererType(ArchiveOptions.DOM);
+
+		// new ear file
+		EARFile earFile = factory.createEARFileInitialized(options, earPath);
+
+		Application appl = earFile.getDeploymentDescriptor();
+
+	}
+
+	public void testServiceQNameTranslator() throws Exception {
+        try {
+			ArchiveOptions options = new ArchiveOptions();
+			options.setRendererType(ArchiveOptions.SAX); 
+			final String earPath = AutomatedBVT.baseDirectory + "WSSecured_InsuranceServices_EJB_WS.ear";
+			CommonarchivePackage pkg = CommonarchivePackage.eINSTANCE;
+			CommonarchiveFactory factory = pkg.getCommonarchiveFactory();
+			EARFile earFile = factory.openEARFile(options, earPath);
+			printFiles(earFile);
+			String tmp = "C:\\temp\\"+System.currentTimeMillis();
+			earFile.extractTo(tmp, 0);  
+				
+			List ejbModuleRefs = earFile.getEJBModuleRefs();
+
+			for(int i=0; i<ejbModuleRefs.size(); i++) {
+				EJBModuleRef ejbmodref = (EJBModuleRef) ejbModuleRefs.get(i);
+				if(ejbmodref.getUri().equals("WSInsSession20EJB.jar")) {
+					Resource res = ejbmodref.getMofResource("META-INF/webservicesclient.xml"); 
+					System.err.println(res.getURI());
+					 
+				}
+			}
+			/*
+			 * Application app = earFile.getDeploymentDescriptor(); List modules =
+			 * app.getModules(); for(int i=0; i <modules.size(); i++) {
+			 * System.err.println(modules.get(i)); Module
+			 * mod=(Module)modules.get(i); if( mod.isEjbModule() ) { EjbModule
+			 * ejbModule = (EjbModule) mod; EJBJarFile ejbJarFile =
+			 * factory.openEJBJarFile(options, "WSInsSession20EJB.jar"); EJBJar
+			 * ejbjar = ejbJarFile.getDeploymentDescriptor(); }
+			 *  }
+			 */
+		} catch (WrappedException we) {
+			Logger.getLogger().logError(we);
+			Logger.getLogger().logError(we.getMessage());
+			if(we.getCause() != null) 
+				Logger.getLogger().logError(we.getCause());
+			if(we.getNestedException() != null)
+				Logger.getLogger().logError(we.getNestedException());
+			if(we.getNestedException() != null)
+				Logger.getLogger().logError(we.getConcatenatedMessages());
+			throw we;
+		}  
+    }	
+	
+	public void testReadCrimsonCase() throws Exception {
+		try {
+			ArchiveOptions options = new ArchiveOptions();
+			options.setRendererType(ArchiveOptions.DOM); 
+			final String earPath = AutomatedBVT.baseDirectory
+					+ "ejb_sam_Hello.ear";
+			CommonarchivePackage pkg = CommonarchivePackage.eINSTANCE;
+			EARFile earFile = pkg.getCommonarchiveFactory().openEARFile(
+					options, earPath);
+			Application app = earFile.getDeploymentDescriptor();
+			assertNotNull("Could not read deployment descriptor.", app);
+			System.err.println("\n\n******************Printing files from " + app.getDisplayName());
+			assertNotNull("Could not read display name from deployment descriptor.", app.getDisplayName());
+			printFiles(earFile);
+			earFile.extractTo(AutomatedBVT.baseDirectory + "testOutput/temp", 0);
+			earFile.reopen();
+		} catch (WrappedException we) {
+			Logger.getLogger().logError(we);
+			Logger.getLogger().logError(we.getMessage());
+			if (we.getCause() != null)
+				Logger.getLogger().logError(we.getCause());
+			if (we.getNestedException() != null)
+				Logger.getLogger().logError(we.getNestedException());
+			if (we.getNestedException() != null)
+				Logger.getLogger().logError(we.getConcatenatedMessages());
+			throw we;
+		}
+	}
+	
+	/*public void testReadInitParms13() throws Exception {
+	    readInitParms(true);
+	}
+	public void testReadInitParms14() throws Exception{
+	    readInitParms(false);
+	}	*/
+	
+	/*public void readInitParms(boolean is13) throws Exception {
+		try { 
+		    System.out.println("Using J2EE " + (is13?"1.3" :"1.4") );
+			ArchiveOptions options = new ArchiveOptions();
+			options.setRendererType(ArchiveOptions.DOM); 
+			final String earPath = AutomatedBVT.baseDirectory
+					+ ((is13) ? "filter13war.ear" :  "servlet_js_filter.ear");
+			CommonarchivePackage pkg = CommonarchivePackage.eINSTANCE;
+			EARFile earFile = pkg.getCommonarchiveFactory().openEARFile(
+					options, earPath);
+			WARFile warFile = (WARFile) (is13 ? earFile.getFile("FilterWar.war") :earFile.getFile("servlet_js_filter_web.war"));
+			WebApp webapp = warFile.getDeploymentDescriptor(); 
+			assertNotNull("The web app DD could not be located", webapp);
+			EList filters = webapp.getFilters();
+			Filter f = null;
+			EList parms, paramValues;
+			for(int i=0; i<filters.size(); i++) {
+			    f = (Filter) filters.get(i);
+			    System.out.println(f);
+			    EList parms = f.getInitParams();
+			    System.out.println("There are " + parms.size() + " InitParams");
+			    for(int j=0; j<parms.size(); j++) {
+			        InitParam p = (InitParam) parms.get(j);
+			        System.out.println(p);
+			    }
+			    EList paramValues = f.getInitParamValues();
+			    System.out.println("There are " + paramValues.size() + " InitParamValues");
+			    for(int j=0; j<paramValues.size(); j++) {
+			        ParamValue p = (ParamValue) paramValues.get(j);
+			        System.out.println(p);
+			    }
+			    
+			    System.out.println("Demo version case");
+			    
+			    
+			    WebApp container = (WebApp) f.eContainer();
+			    switch(container.getJ2EEVersionID()) {
+			        case J2EEVersionConstants.J2EE_1_2_ID: 
+			        case J2EEVersionConstants.J2EE_1_3_ID:
+
+					    parms = f.getInitParams();
+					    System.out.println("There are " + parms.size() + " InitParams");
+					    assertEquals("There must be 2 Filter Init Params", parms.size(), 2);
+					    for(int j=0; j<parms.size(); j++) {
+					        InitParam ip = (InitParam) parms.get(j);
+					        System.out.println(p);
+					        assertTrue("The param names much match", ("param"+j+"name").equals(ip.getParamName()));
+					        assertTrue("The param values much match", ("param"+j+"value").equals(ip.getParamValue()));
+					    }
+					    break;
+			        case J2EEVersionConstants.J2EE_1_4_ID: default: {
+
+					    paramValues = f.getInitParamValues();
+			        	assertEquals("There must be 1 Filter Init Param Values", paramValues.size(), 1);
+					    System.out.println("There are " + paramValues.size() + " InitParamValues");
+					    
+				        ParamValue pv = (ParamValue) paramValues.get(0); 
+				        System.out.println(pv); 
+				        assertTrue("The param names much match", ("attribute").equals(pv.getName()));
+				        String expectedValue = (i == 0) ? "com.sun.ts.tests.servlet.api.javax_servlet.filter.DoFilter_Filter.SERVLET_MAPPED" : "com.sun.ts.tests.servlet.api.javax_servlet.filter.InitFilter_Filter.SERVLET_MAPPED"; 
+				        assertEquals("The param values much match", expectedValue , pv.getValue());
+			        }
+					    break;
+			    }
+			}
+			
+			    
+		} catch (WrappedException we) {
+			Logger.getLogger().logError(we);
+			Logger.getLogger().logError(we.getMessage());
+			if (we.getCause() != null)
+				Logger.getLogger().logError(we.getCause());
+			if (we.getNestedException() != null)
+				Logger.getLogger().logError(we.getNestedException());
+			if (we.getNestedException() != null)
+				Logger.getLogger().logError(we.getConcatenatedMessages());
+			throw we;
+		}
+	}*/
+	 
+	
+	private void printFiles(Container ar) {
+		List files = ar.getFiles();
+
+		for (int i = 0; i < files.size(); i++) {
+			System.err.println(files.get(i));
+			if (files.get(i) instanceof Container) {
+				Container tainer = (Container) files.get(i);
+				printFiles(tainer);
+			}
+		}
+	}
+
+}
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/DiscriminatorTest.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/DiscriminatorTest.java
new file mode 100644
index 0000000..734786d
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/DiscriminatorTest.java
@@ -0,0 +1,107 @@
+package org.eclipse.jst.j2ee.archive.test;
+
+import java.io.File;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.ArchiveTypeDiscriminatorRegistry;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.CommonarchiveFactory;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.GenericArchiveTypeDiscriminator;
+import org.eclipse.jst.j2ee.core.tests.bvt.AutomatedBVT;
+
+
+/*
+ * Licensed Material - Property of IBM 
+ * (C) Copyright IBM Corp. 2001, 2002 - All Rights Reserved. 
+ * US Government Users Restricted Rights - Use, duplication or disclosure 
+ * restricted by GSA ADP Schedule Contract with IBM Corp. 
+ */
+
+/**
+ * @author mdelder
+ *  
+ */
+public class DiscriminatorTest
+        extends TestCase {
+
+    public boolean assertBarFile = false;
+
+    public DiscriminatorTest(String name) {
+        super(name);
+    }
+
+    public static Test suite() {
+        TestSuite suite = new TestSuite("DiscriminatorTest");
+        suite.addTest(new DiscriminatorTest("testDiscriminator"));
+        return suite;
+    }
+
+    // TODO Implement unit test for discriminator framework
+    public void testDiscriminator() throws Exception {
+        assertBarFile = true;
+        try {
+            ArchiveTypeDiscriminatorRegistry.registorDiscriminator(new BeverageArchiveDiscriminator());
+            Archive archive = CommonarchiveFactory.eINSTANCE.openArchive( AutomatedBVT.baseDirectory + File.separator + "my.bar");
+            assertNotNull("The archive was not found!", archive);
+
+            assertTrue("The archive extension (.bar) was not recognized as a custom extension!", archive.isNestedArchive("my.bar"));
+
+            boolean typeContributedSuccessfully = false;
+            EList types = archive.getTypes();
+            for (int i = 0; i < types.size(); i++) {
+                if (types.get(i).equals(BeverageArchiveDiscriminator.BEVERAGE_ARCHIVE_TYPE_KEY)) {
+                    typeContributedSuccessfully = true;
+                    break;
+                }
+            }
+            assertTrue("The BEVERAGE_ARCHIVE_TYPE_KEY was not found in the list of types of the archive!", typeContributedSuccessfully);
+        } finally {
+            assertBarFile = false;
+        }
+    }
+
+    public class BeverageArchiveDiscriminator
+            extends TestCase implements GenericArchiveTypeDiscriminator {
+
+        public static final String BEVERAGE_ARCHIVE_TYPE_KEY = "com.ibm.beverage.archive";
+
+        /*
+         * (non-Javadoc)
+         * 
+         * @see com.ibm.etools.j2ee.commonarchivecore.GenericArchiveTypeDiscriminator#discriminate(com.ibm.etools.j2ee.commonarchivecore.Archive)
+         */
+        public boolean discriminate(Archive anArchive) {
+            boolean result = anArchive.containsFile("META-INF/adult-beverage-imbibement-options.xml");
+            if (assertBarFile)
+                    assertTrue(
+                            "The BeverageArchiveDiscriminator did not recogniZe the file! (Ensure it contains a file named META-INF/adult-beverage-imbibement-venues.xml)",
+                            result);
+            return result;
+        }
+
+        /*
+         * (non-Javadoc)
+         * 
+         * @see com.ibm.etools.j2ee.commonarchivecore.GenericArchiveTypeDiscriminator#getCustomFileExtensions()
+         */
+        public String[] getCustomFileExtensions() {
+
+            return new String[] { "bar"};
+
+        }
+
+        /*
+         * (non-Javadoc)
+         * 
+         * @see com.ibm.etools.j2ee.commonarchivecore.GenericArchiveTypeDiscriminator#getTypeKey()
+         */
+        public String getTypeKey() {
+
+            return BEVERAGE_ARCHIVE_TYPE_KEY;
+        }
+    }
+}
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/DomComparitor.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/DomComparitor.java
new file mode 100644
index 0000000..454c1e3
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/DomComparitor.java
@@ -0,0 +1,285 @@
+/*
+ * Created on Mar 17, 2003
+ *
+ * To change this generated comment go to 
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+package org.eclipse.jst.j2ee.archive.test;
+
+import java.util.HashSet;
+
+import org.w3c.dom.Attr;
+import org.w3c.dom.CharacterData;
+import org.w3c.dom.Document;
+import org.w3c.dom.DocumentFragment;
+import org.w3c.dom.DocumentType;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.w3c.dom.ProcessingInstruction;
+import org.xml.sax.EntityResolver;
+
+/**
+ * THE MASTER COPY of this class is in com.ibm.etools.commontests
+ * Please update the copy in commontests and then copy this class to
+ * where you need it if you are looking at a different copy
+ * 
+ * @author jsholl
+ *
+ * To change this generated comment go to 
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+public class DomComparitor {
+	private static EntityResolver entityResolver;
+	private static HashSet attributeList;
+// TODO replace this with non xerces	
+//    public static String compareDoms(InputSource source1, InputSource source2, HashSet ignorableAtts) throws Exception {
+//    	attributeList = ignorableAtts;
+//    	DOMParser parser = new DOMParser();
+//    	if (entityResolver == null) {
+//         parser.setEntityResolver(new EntityResolver() {
+//	            public InputSource resolveEntity(String arg0, String arg1) throws SAXException, IOException {
+//	                return null;
+//	            }
+//	
+//	        });
+//    	} else {
+//    		parser.setEntityResolver(entityResolver);
+//    	}
+//        parser.parse(source1);
+//        Document doc1 = parser.getDocument();
+//        parser.parse(source2);
+//        Document doc2 = parser.getDocument();
+//        return compareNodes(doc1, doc2);
+//    }
+
+//	public static String compareDoms(InputSource source1, InputSource source2) throws Exception {
+//		return compareDoms(source1, source2, null);
+//	}
+
+
+    public static String compareNodes(Node node1, Node node2) throws Exception {
+        //        System.out.println("checking A:" + node1);
+        //        System.out.println("checking B:" + node2);
+        //        System.out.println("nodeType=" + node1.getNodeType());
+        //        System.out.println("getNodeName=" + node1.getNodeName());
+        //        System.out.println("getNodeValue=" + node1.getNodeValue());
+
+        //Generic Node Testing 
+        if (node1 == null && node2 == null)
+        	return null; 
+        else if ((node1 != null && node2 == null) || node1 == null && node2 != null)
+        	return nullNodeEncountered(node1, node2);                        
+        else if (node1.getNodeType() != node2.getNodeType()) {
+            return mismatch("Node.getNodeType() " + node1.getNodeType() + " " + node2.getNodeType(), node1, node2);
+        } else if (node1.getNodeName() != node2.getNodeName()) {
+            return mismatch("Node.getNodeName() <" + node1.getNodeName() + "> <" + node2.getNodeName() + ">", node1, node2);
+        } else if (!(node1.getNodeValue() == null && node2.getNodeValue() == null)) {
+            if (node1.getNodeValue() == null) {
+                return mismatch("Node.getNodeValue() node A is null", node1, node2);
+            } else if (node2.getNodeValue() == null) {
+                return mismatch("Node.getNodeValue() node B is null", node1, node2);
+            } else if (!node1.getNodeValue().equals(node2.getNodeValue())) {
+                return mismatch("Node.getNodeValue() <" + node1.getNodeValue() + "> <" + node2.getNodeValue() + ">", node1, node2);
+            }
+        } else if (node1.hasAttributes() != node2.hasAttributes()) {
+            return mismatch("Node.hasAttributes() " + node1.hasAttributes() + " " + node2.hasAttributes(), node1, node2);
+        } else if (node1.hasChildNodes() != node2.hasChildNodes()) {
+            return mismatch("Node.hasChildNodes() " + node1.hasChildNodes() + " " + node2.hasChildNodes(), node1, node2);
+        }
+		//TODO strengthen node comparisons as necessary
+        //Specialized Node Testing
+        switch (node1.getNodeType()) {
+            case Node.TEXT_NODE :
+            case Node.CDATA_SECTION_NODE :
+                CharacterData cdata1 = (CharacterData) node1;
+                CharacterData cdata2 = (CharacterData) node2;
+                if (!cdata1.getData().equals(cdata2.getData())) {
+                    return mismatch("CharacterData.getData() " + cdata1.getData() + " " + cdata2.getData(), node1, node2);
+                }
+                break;
+            case Node.ATTRIBUTE_NODE :
+                Attr attr1 = (Attr) node1;
+                Attr attr2 = (Attr) node2;
+                	if (!attr1.getName().equals(attr2.getName())) {
+	                    return mismatch("Attr.getName() " + attr1.getName() + " " + attr2.getName(), node1, node2);
+	                } 
+	                else if( attributeList != null && !attributeList.contains(attr1.getName()) && !attributeList.contains(attr2.getName())) {
+						if (!attr1.getValue().equals(attr2.getValue())) {
+		                    return mismatch("Attr.getValue() " + attr1.getValue() + " " + attr2.getValue(), node1, node2);
+		                } else if (attr1.getSpecified() != attr2.getSpecified()) {
+		                    return mismatch("Attr.getSpecified() " + attr1.getSpecified() + " " + attr2.getSpecified(), node1, node2);
+		                }
+	                }
+                break;
+            case Node.DOCUMENT_NODE :
+            	Document doc1 = (Document)node1;
+				Document doc2 = (Document)node2;
+				String result = compareNodes(doc1.getDoctype(), doc2.getDoctype());
+				if(result != null){
+					return result;
+				}
+				break;
+			case Node.DOCUMENT_TYPE_NODE:
+				DocumentType docType1 = (DocumentType)node1;
+				DocumentType docType2 = (DocumentType)node2;
+				if(!docType1.getPublicId().equals(docType2.getPublicId())){
+					return mismatch("DocumentType.getPublicId() "+docType1.getPublicId()+ " "+docType2.getPublicId(), node1, node2);
+				}
+				break;
+            case Node.PROCESSING_INSTRUCTION_NODE :
+            	ProcessingInstruction pInst1 = (ProcessingInstruction)node1;
+				ProcessingInstruction pInst2 = (ProcessingInstruction)node2;
+				//System.out.println("ProcessingInstruction todo");
+            	break;
+			case Node.DOCUMENT_FRAGMENT_NODE :
+				DocumentFragment frag1 = (DocumentFragment)node1;
+				DocumentFragment frag2 = (DocumentFragment)node2;
+				//System.out.println("DocumentFragment todo");
+            	break;
+			
+			case Node.ELEMENT_NODE :
+			case Node.COMMENT_NODE :
+            case Node.ENTITY_NODE :
+			case Node.NOTATION_NODE :
+				break;
+
+        }
+
+        //Recursion
+        NamedNodeMap attributes1 = node1.getAttributes();
+        NamedNodeMap attributes2 = node2.getAttributes();
+
+        if (attributes1 != null && attributes2 != null) {
+            if (attributes1.getLength() != attributes2.getLength()) {
+                return mismatch("getAttributes().getLength() " + attributes1.getLength() + " " + attributes2.getLength(), node1, node2);
+            }
+            for (int i = 0; i < attributes1.getLength(); i++) {
+				Attr attr1 = (Attr) attributes1.item(i);
+				Attr attr2 = (Attr) attributes2.item(i);
+				if(!attr1.getName().equals(attr2.getName())){
+					return mismatch("Attr.getName() " + attr1.getName() + " " + attr2.getName(), attr1, attr2);
+				}
+				if(attributeList != null && !attributeList.contains(attr1.getName()) && !attributeList.contains(attr2.getName())) {
+	                String results = compareNodes(attr1, attr2);
+	                if (null != results) {
+	                    return results;
+	                }
+				}
+            }
+
+        } else if (attributes1 != null || attributes2 != null) {
+            return mismatch("getAttributes() null", node1, node2);
+        }
+
+        NodeList children1 = node1.getChildNodes();
+        NodeList children2 = node2.getChildNodes();
+
+        //        if (children1.getLength() != children2.getLength()) {
+        //            return mismatch("getChildNodes().getLength() "+children1.getLength()+" "+children2.getLength(), node1, node2);
+        //        }
+
+        int count1 = 0;
+        int count2 = 0;
+
+        //compare all children, skipping empty text nodes
+        while (count1 < children1.getLength() && count2 < children2.getLength()) {
+            Node child1 = children1.item(count1);
+            Node child2 = children2.item(count2);
+            if (child1.getNodeType() != child2.getNodeType()) {
+                if (child1.getNodeType() == Node.TEXT_NODE && (child1.getNodeValue() == null || child1.getNodeValue().trim().equals(""))) {
+                    count1++;
+                    continue;
+                } else if (child2.getNodeType() == Node.TEXT_NODE && (child2.getNodeValue() != null || child2.getNodeValue().trim().equals(""))) {
+                    count2++;
+                    continue;
+                }
+            }
+            count1++;
+            count2++;
+            String results = compareNodes(child1, child2);
+            if (null != results) {
+                return results;
+            }
+        }
+        //TODO there must be a way to tell the parser to ignore whitespace.
+        //be sure skip any empty text nodes at the end
+        while (count1 < children1.getLength()) {
+            Node child1 = children1.item(count1);
+            if (child1.getNodeType() == Node.TEXT_NODE && child1.getNodeValue() == null || child1.getNodeValue().trim().equals("")) {
+                count1++;
+                continue;
+            }
+            return nodeNotCompared(child1);
+        }
+
+        while (count2 < children2.getLength()) {
+            Node child2 = children2.item(count2);
+            if (child2.getNodeType() == Node.TEXT_NODE && child2.getNodeValue() == null || child2.getNodeValue().trim().equals("")) {
+                count2++;
+                continue;
+            }
+            return nodeNotCompared(child2);
+        }
+
+        //        for (int i = 0; i < children1.getLength(); i++) {
+        //            Node child1 = children1.item(i);
+        //            Node child2 = children2.item(i);
+        //        }
+
+        return null;
+    }
+
+    
+	public static String nullNodeEncountered(Node node1, Node node2) {
+		String message = "Null node encountered";
+		Node nonNullNode = node1 == null ? node2 : node1;
+		char source = node1 == null ? 'B' : 'A';
+		while (nonNullNode != null) {
+			message += source + nonNullNode.getNodeName() + "\n";
+			nonNullNode = nonNullNode.getParentNode();
+		}
+		return message;
+
+		
+	}
+
+	public static String nodeNotCompared(Node node) {
+        String message = "Node node compared:";
+        while (node != null) {
+            message += node.getNodeName() + "\n";
+            node = node.getParentNode();
+        }
+
+        return message;
+    }
+
+    public static String mismatch(String mismatchtype, Node node1, Node node2) throws Exception {
+        String message = "Nodes A and B do not match because of node." + mismatchtype + "\n";
+        while (node1 != null && node2 != null) {
+            message += "A:" + node1.getNodeName() + "\n";
+            message += "B:" + node2.getNodeName() + "\n";
+            node1 = node1.getParentNode();
+            node2 = node2.getParentNode();
+        }
+
+        return message;
+    }
+
+    public static void main(String[] args) {
+    }
+	/**
+	 * @return
+	 */
+	public static EntityResolver getEntityResolver() {
+		return entityResolver;
+	}
+
+	/**
+	 * @param resolver
+	 */
+	public static void setEntityResolver(EntityResolver resolver) {
+		entityResolver = resolver;
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/InitializationTests.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/InitializationTests.java
new file mode 100644
index 0000000..5c66ea4
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/InitializationTests.java
@@ -0,0 +1,90 @@
+package org.eclipse.jst.j2ee.archive.test;
+
+ /*
+ * Licensed Material - Property of IBM
+ * (C) Copyright IBM Corp. 2001 - All Rights Reserved.
+ * US Government Users Restricted Rights - Use, duplication or disclosure
+ * restricted by GSA ADP Schedule Contract with IBM Corp.
+ */
+
+
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+import junit.textui.TestRunner;
+
+import org.eclipse.jst.j2ee.commonarchivecore.internal.ApplicationClientFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.CommonarchiveFactory;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.CommonarchivePackage;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.EARFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.EJBJarFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.EJBModuleRef;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.WARFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.WebModuleRef;
+/**
+ * Insert the type's description here.
+ * Creation date: (12/18/00 7:41:39 PM)
+ * @author: Administrator
+ */
+public class InitializationTests extends TestCase {
+	private final static String copyright = "(c) Copyright IBM Corporation 2001.";//$NON-NLS-1$
+/**
+ * InitializationTests constructor comment.
+ * @param name java.lang.String
+ */
+public InitializationTests(String name) {
+	super(name);
+}
+public CommonarchiveFactory getArchiveFactory() {
+	return CommonarchivePackage.eINSTANCE.getCommonarchiveFactory();
+}
+/**
+ * Starts the application.
+ * @param args an array of command-line arguments
+ */
+public static void main(java.lang.String[] args) {
+	String[] className = {"com.ibm.etools.archive.test.InitializationTests", "-noloading"};
+	TestRunner.main(className);
+}
+public static junit.framework.Test suite() {
+	return new TestSuite(InitializationTests.class);
+}
+public void testNewArchives() throws Exception {
+
+//        Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("*", new XMIResourceFactoryImpl());
+	ApplicationClientFile clientFile = getArchiveFactory().createApplicationClientFileInitialized("foo");
+	assertTrue(clientFile.getDeploymentDescriptor() != null);
+	
+
+	clientFile = getArchiveFactory().createApplicationClientFileInitialized("foo");
+
+	EJBJarFile ejbJarFile = getArchiveFactory().createEJBJarFileInitialized("foo");
+	assertTrue(ejbJarFile.getDeploymentDescriptor() != null);
+	
+	//The next piece is to verify no exceptions occur
+	ejbJarFile = getArchiveFactory().createEJBJarFileInitialized("foo");
+	EJBModuleRef ejbModuleRef = getArchiveFactory().createEJBModuleRef();
+	ejbModuleRef.setModuleFile(ejbJarFile);
+	
+
+	EARFile earFile = getArchiveFactory().createEARFileInitialized("foo");
+	
+	assertTrue(earFile.getDeploymentDescriptor() != null);
+	
+
+	WARFile warFile = getArchiveFactory().createWARFileInitialized("foo");
+	
+	assertTrue(warFile.getDeploymentDescriptor() != null);
+	
+
+	warFile = getArchiveFactory().createWARFileInitialized("foo");
+	WebModuleRef webModuleRef = getArchiveFactory().createWebModuleRef();
+	webModuleRef.setModuleFile(warFile);
+	
+
+}
+	
+	
+
+
+	
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/JavaTests.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/JavaTests.java
new file mode 100644
index 0000000..c18fd59
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/JavaTests.java
@@ -0,0 +1,61 @@
+package org.eclipse.jst.j2ee.archive.test;
+
+ /*
+ * Licensed Material - Property of IBM
+ * (C) Copyright IBM Corp. 2001 - All Rights Reserved.
+ * US Government Users Restricted Rights - Use, duplication or disclosure
+ * restricted by GSA ADP Schedule Contract with IBM Corp.
+ */
+
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+import junit.textui.TestRunner;
+
+import org.eclipse.jst.j2ee.commonarchivecore.internal.CommonarchiveFactory;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.CommonarchivePackage;
+/**
+ * Insert the type's description here.
+ * Creation date: (1/17/2001 10:17:29 AM)
+ * @author: Administrator
+ */
+public class JavaTests extends TestCase {
+	private final static String copyright = "(c) Copyright IBM Corporation 2001.";//$NON-NLS-1$
+/**
+ * JavaTests constructor comment.
+ * @param name java.lang.String
+ */
+public JavaTests(String name) {
+	super(name);
+}
+public CommonarchiveFactory getArchiveFactory() {
+	return CommonarchivePackage.eINSTANCE.getCommonarchiveFactory();
+}
+/**
+ * Starts the application.
+ * @param args an array of command-line arguments
+ */
+public static void main(java.lang.String[] args) {
+	String[] className = {"com.ibm.etools.archive.test.JavaTests", "-noloading"};
+	TestRunner.main(className);
+}
+public static junit.framework.Test suite() {
+	return new TestSuite(JavaTests.class);
+}
+/**
+ * This method verifies that java reflection works on archives, and that
+ * class loading and java reflection is dynamic with changes to the class
+ * path of the archive
+ */
+public void testJavaReflection() throws Exception {
+/*
+	Archive anArchive = getArchiveFactory().primOpenArchive("bank35deployed.jar");
+	JavaClass cls = (JavaClass)org.eclipse.jem.internal.java.impl.JavaClassImpl.reflect("com.ibm.ejb.bank.VapAccountBean", anArchive.getContext());
+	//Ignore the constructor
+	assertTrue("Should not have been able to reflect methods" ,cls.getMethods().size() == 1 && ((Method)cls.getMethods().get(0)).getName().equals(cls.getName()));
+
+	anArchive.setExtraClasspath("ivjejb35.jar");
+
+	assertTrue("Methods should have been reflected", cls.getMethods().size() > 1);
+*/	
+}
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/LooseArchiveTests.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/LooseArchiveTests.java
new file mode 100644
index 0000000..59ebe9e
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/LooseArchiveTests.java
@@ -0,0 +1,282 @@
+package org.eclipse.jst.j2ee.archive.test;
+
+
+import java.util.List;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+import junit.textui.TestRunner;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.jst.j2ee.application.Module;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.EARFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.File;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.ModuleRef;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveInit;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.RuntimeClasspathEntry;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.util.ArchiveUtil;
+import org.eclipse.jst.j2ee.commonarchivecore.looseconfig.internal.LooseApplication;
+import org.eclipse.jst.j2ee.commonarchivecore.looseconfig.internal.LooseConfigRegister;
+import org.eclipse.jst.j2ee.commonarchivecore.looseconfig.internal.LooseConfiguration;
+import org.eclipse.jst.j2ee.commonarchivecore.looseconfig.internal.LooseLibrary;
+import org.eclipse.jst.j2ee.commonarchivecore.looseconfig.internal.LooseModule;
+import org.eclipse.jst.j2ee.commonarchivecore.looseconfig.internal.LooseWARFile;
+import org.eclipse.jst.j2ee.commonarchivecore.looseconfig.internal.LooseconfigFactory;
+import org.eclipse.jst.j2ee.commonarchivecore.looseconfig.internal.LooseconfigPackage;
+import org.eclipse.jst.j2ee.core.tests.bvt.AutomatedBVT;
+
+
+public class LooseArchiveTests extends AbstractArchiveTest {
+
+	/** The current working directory */
+	protected String cwd;
+	protected URI looseConfigLoc;
+	protected URI looseAppLoc;
+	protected String looseModuleWorkspace;
+	protected String looseEARUri;
+	
+	protected static final String EJB_JAR_URI = "LooseEAREjb.jar";
+	protected static final String WAR_URI = "LooseEARWeb.war";
+	protected static final String UTIL_JAR_URI = "util.jar";
+	protected static final String WEBLIB_URI = "WEB-INF/lib/library.jar";
+	protected static final String WEBLIB_FULL_URI = "WEB-INF/lib/library.jar";
+	protected static final String OUTPUT_EAR_FILE_URI = AutomatedBVT.baseDirectory +"testOutput/LooseArchiveTests/LooseApp.ear";
+	protected static char sep = java.io.File.separatorChar;
+	/**
+	 * Constructor for LooseArchiveTests.
+	 * @param name
+	 */
+	public LooseArchiveTests(String name) {
+		super(name);
+	}
+	
+	public void testLooseConfigCreation() throws Exception {
+		Resource resource = Resource.Factory.Registry.INSTANCE.getFactory(looseConfigLoc).createResource(looseConfigLoc);
+		resource.getContents().add(createLooseConfig());
+		resource.save(new java.util.HashMap());
+	}
+	
+	public void testLooseAppCreation() throws Exception {
+		Resource resource = Resource.Factory.Registry.INSTANCE.getFactory(looseAppLoc).createResource(looseAppLoc);
+		resource.getContents().add(createLooseApplication());
+		resource.save(new java.util.HashMap());
+	}
+	
+	public void testLooseConfigOpenAndSave() throws Exception {
+		System.setProperty(LooseConfigRegister.LOOSE_CONFIG_PROPERTY, looseConfigLoc.toString());
+		EARFile ear = getArchiveFactory().openEARFile(looseEARUri);
+		verify(ear);
+		//printClasspaths(ear);
+		ear.saveAs(OUTPUT_EAR_FILE_URI);
+		ear.close();
+		ear = getArchiveFactory().openEARFile(OUTPUT_EAR_FILE_URI);
+		verify(ear);
+		ear.close();
+			
+	}
+	
+
+	
+	public void testLooseConfigUnimodeOpenAndSave() throws Exception {
+		System.setProperty(LooseConfigRegister.LOOSE_CONFIG_PROPERTY, "");
+
+		LooseConfigRegister.singleton().addLooseMapping(looseEARUri, looseAppLoc.toString());
+		EARFile ear = getArchiveFactory().openEARFile(looseEARUri);
+		verify(ear);
+		//printClasspaths(ear);
+		ear.saveAs(OUTPUT_EAR_FILE_URI);
+		ear.close(); 
+
+		ear = getArchiveFactory().openEARFile(OUTPUT_EAR_FILE_URI);
+		verify(ear);
+		ear.close();
+			
+	}
+	
+	public void testLooseConfigOpenAndReOpen() throws Exception {
+		System.setProperty(LooseConfigRegister.LOOSE_CONFIG_PROPERTY, looseConfigLoc.toString());
+		EARFile ear = getArchiveFactory().openEARFile(looseEARUri);
+		ear.close();
+		ear.reopen();
+		List jars = ear.getArchiveFiles();
+		for (int i = 0; i < jars.size(); i++) {
+			Archive archive = (Archive) jars.get(i);
+			archive.close();
+			archive.reopen(ear);
+		}
+		ear.close();
+			
+	}
+
+	protected void verify(EARFile ear) throws Exception {
+		verifyModules(ear);
+		verifyModuleRefs(ear);
+		verifyUtilAndLib(ear);
+	}
+
+	/**
+	 * Another level of verification that for each module, the module files exists
+	 * and the deployment descriptor can be read
+	 */
+	protected void verifyModuleRefs(EARFile ear) throws Exception {
+		List moduleRefs = ear.getModuleRefs();
+		int size = moduleRefs.size();
+		assertEquals("Wrong number of modules", 2, size);
+		for (int i = 0; i < size; i++) {
+			ModuleRef ref = (ModuleRef) moduleRefs.get(i);
+			assertNotNull("ModuleRef should have a module file:"+ref.getModule().getUri(), ref.getModuleFile());
+			assertNotNull("Deployment descriptor should not be null", ref.getDeploymentDescriptor());	
+		}
+	}
+	
+	/**
+	 * Verify that the util jar in the ear and the library in the war exist and are not empty
+	 */
+	protected void verifyUtilAndLib(EARFile ear) throws Exception {
+		verifyJAR(ear, UTIL_JAR_URI);
+		verifyJAR((Archive)ear.getFile(WAR_URI), WEBLIB_FULL_URI);
+	
+	}
+	
+	protected void verifyJAR(Archive parent, String uri) throws Exception {
+		assertTrue("Should contain JAR: "+uri, parent.containsFile(uri));
+		Archive jar = (Archive)parent.getFile(uri);
+		//at lease one file plus the manifest
+		assertTrue("JAR should contain a class file: "+uri, containsClassFile(jar));
+	}
+	
+	protected boolean containsClassFile(Archive jar) {
+		List files = jar.getFiles();
+		for (int i = 0; i < files.size(); i++) {
+			File aFile = (File) files.get(i);
+			if (aFile.getURI().endsWith(".class"));
+				return true;	
+		}
+		return false;
+	}
+	
+	/**
+	 * Make sure {@link Container#containsFile(String) works for loose modules
+	 */
+	public void verifyModules(EARFile ear) throws Exception {
+		List modules = ear.getDeploymentDescriptor().getModules();
+		int size = modules.size();
+		for (int i = 0; i < modules.size(); i++) {
+			Module m = (Module) modules.get(i);
+			assertTrue("EAR file should contain module file: "+m.getUri(), ear.containsFile(m.getUri()));
+		}
+		assertEquals("Wrong number of modules", 2, size);
+		for (int i = 0; i < modules.size(); i++) {
+			Module m = (Module) modules.get(i);
+			assertTrue("EAR file should contain module file: "+m.getUri(), ear.containsFile(m.getUri()));
+		}
+	}
+	
+	protected LooseConfiguration createLooseConfig() {
+		LooseConfiguration config = looseConfigFactory().createLooseConfiguration();
+		config.getApplications().add(createLooseApplication());
+		return config;
+	}
+	
+	protected LooseApplication createLooseApplication() {
+		LooseApplication app = looseConfigFactory().createLooseApplication();
+		app.setUri(looseEARUri);
+		app.setResourcesPath(looseEARUri);
+		app.setBinariesPath(looseEARUri);
+		List looseArchives = app.getLooseArchives();
+		looseArchives.add(createLooseEJB());
+		looseArchives.add(createLooseWEB());
+		looseArchives.add(createLooseUtil());
+		return app;
+	}
+	
+	protected LooseModule createLooseEJB() {
+		LooseModule mod = looseConfigFactory().createLooseModule();
+		mod.setUri(EJB_JAR_URI);
+		String absPath = looseModuleWorkspace+sep+"LooseEAREjb"+sep+"bin";
+		mod.setBinariesPath(absPath);
+		mod.setResourcesPath(absPath);
+		return mod;
+	}
+	
+	protected LooseModule createLooseWEB() {
+		LooseWARFile mod = looseConfigFactory().createLooseWARFile();
+		mod.setUri(WAR_URI);
+		String absPath = looseModuleWorkspace+sep+"LooseEARWeb"+sep+"webApplication";
+		mod.setBinariesPath(absPath);
+		mod.setResourcesPath(absPath);
+		mod.getLooseLibs().add(createLooseWebLib());
+		return mod;
+	}
+	
+	protected LooseLibrary createLooseUtil() {
+		LooseLibrary lib = looseConfigFactory().createLooseLibrary();
+		lib.setUri(UTIL_JAR_URI);
+		String absPath = looseModuleWorkspace+sep+"LooseJavaUtil"+sep+"bin";
+		lib.setBinariesPath(absPath);
+		lib.setResourcesPath(absPath);
+		return lib;
+	}
+	
+	protected LooseLibrary createLooseWebLib() {
+		LooseLibrary lib = looseConfigFactory().createLooseLibrary();
+		lib.setUri(WEBLIB_URI);
+		String absPath = looseModuleWorkspace+sep+"LooseJavaWebLib"+sep+"bin";
+		lib.setBinariesPath(absPath);
+		lib.setResourcesPath(absPath);
+		return lib;
+	}
+	
+	protected LooseconfigFactory looseConfigFactory() {
+		return LooseconfigPackage.eINSTANCE.getLooseconfigFactory();
+	}
+	
+	protected void printClasspaths(EARFile ear) {
+		List archives = ear.getArchiveFiles();
+		for (int i = 0; i < archives.size(); i++) {
+			Archive archive = (Archive) archives.get(i);
+			System.out.println("Local runtime classpath for: "+archive.getURI());
+			RuntimeClasspathEntry[] entries = archive.getLocalRuntimeClassPath();
+			for (int j = 0; j < entries.length; j++) {
+				System.out.println(entries[j]);
+			}
+			System.out.println("Full runtime classpath for: "+archive.getURI());
+			entries = archive.getFullRuntimeClassPath();
+			for (int j = 0; j < entries.length; j++) {
+				System.out.println(entries[j]);
+			}
+		}
+	}
+	
+
+	public static void main(String[] args) {
+		String[] className = { "com.ibm.etools.archive.test.LooseArchiveTests", "-noloading" };
+		TestRunner.main(className);
+	}
+
+	public static Test suite() {
+		TestSuite suite = new TestSuite("LooseArchiveTests");
+		suite.addTest(new LooseArchiveTests("testLooseConfigCreation"));
+		suite.addTest(new LooseArchiveTests("testLooseAppCreation"));
+		suite.addTest(new LooseArchiveTests("testLooseConfigOpenAndSave"));
+		suite.addTest(new LooseArchiveTests("testLooseConfigOpenAndReOpen"));
+		suite.addTest(new LooseArchiveTests("testLooseConfigUnimodeOpenAndSave"));
+		return suite;
+	}
+		/*
+		 * @see TestCase#setUp()
+		 */
+		protected void setUp() throws Exception {
+			super.setUp();
+			ArchiveInit.init();
+			LooseConfigRegister.singleton().flush();
+			cwd = AutomatedBVT.baseDirectory;
+			looseModuleWorkspace = cwd+"loose_module_workspace";
+			looseConfigLoc = URI.createFileURI(looseModuleWorkspace+sep+".metadata"+sep+".plugins"+sep+"com.ibm.etools.j2ee"+sep+"looseConfig.xmi");
+			looseAppLoc = URI.createFileURI(looseModuleWorkspace+sep+".metadata"+sep+".plugins"+sep+"com.ibm.etools.j2ee"+sep+"looseApp.xmi");
+			looseEARUri = ArchiveUtil.getOSUri(looseModuleWorkspace+sep+"LooseEAR");
+		}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/RarFileTests.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/RarFileTests.java
new file mode 100644
index 0000000..b11e969
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/RarFileTests.java
@@ -0,0 +1,207 @@
+package org.eclipse.jst.j2ee.archive.test;
+
+/*
+* Licensed Material - Property of IBM
+* (C) Copyright IBM Corp. 2001 - All Rights Reserved.
+* US Government Users Restricted Rights - Use, duplication or disclosure
+* restricted by GSA ADP Schedule Contract with IBM Corp.
+*/
+
+import java.util.List;
+
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+import junit.textui.TestRunner;
+
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.CommonarchiveFactory;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.CommonarchivePackage;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.EARFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.RARFile;
+import org.eclipse.jst.j2ee.core.tests.bvt.AutomatedBVT;
+import org.eclipse.jst.j2ee.jca.AuthenticationMechanism;
+import org.eclipse.jst.j2ee.jca.ConfigProperty;
+import org.eclipse.jst.j2ee.jca.Connector;
+import org.eclipse.jst.j2ee.jca.ResourceAdapter;
+import org.eclipse.jst.j2ee.jca.SecurityPermission;
+
+/**
+ * Tests for verfication that RAR support works correctly in WCCM.
+ * Creation date: (12/11/00 10:26:11 AM)
+ * @author: Jared Jurkiewicz, et al.
+ */
+public class RarFileTests extends TestCase {
+    private final static String copyright = "(c) Copyright IBM Corporation 2001."; //$NON-NLS-1$
+    /**
+     * SimpleTests constructor comment.
+     * @param name java.lang.String
+     */
+    public RarFileTests(String name) {
+        super(name);
+    }
+    public CommonarchiveFactory getArchiveFactory() {
+        return CommonarchivePackage.eINSTANCE.getCommonarchiveFactory();
+    }
+    /**
+     * Starts the application.
+     * @param args an array of command-line arguments
+     */
+    public static void main(java.lang.String[] args) {
+        String[] className = { "com.ibm.etools.archive.test.RarFileTests", "-noloading" };
+        TestRunner.main(className);
+    }
+    public void printRARToConsole(Connector connector) {
+        ResourceAdapter ra = connector.getResourceAdapter();
+
+        System.out.println("ResourceAdapter from XML Deployment Descriptor");
+        System.out.println("-------------------------------------------------");
+        System.out.println(connector.getDisplayName() + ": " + connector.getDescription());
+        System.out.println("Vendor : " + connector.getVendorName());
+        System.out.println("Version : " + connector.getVersion());
+        System.out.println("Spec Version : " + connector.getSpecVersion());
+        System.out.println("EIS Type : " + connector.getEisType());
+        System.out.println("Reauthentication Support : " + ra.isReauthenticationSupport());
+        System.out.println("Transaction Support : " + ra.getTransactionSupport().getName().toLowerCase());
+
+        if (connector.getLicense() != null) {
+            System.out.println("License Required : " + connector.getLicense().isRequired());
+            System.out.println("License Description : " + connector.getLicense().getDescription());
+        }
+
+        System.out.println("Small Icon : " + connector.getSmallIcon());
+        System.out.println("Large Icon : " + connector.getLargeIcon());
+
+        List authMechs = ra.getAuthenticationMechanisms();
+        for (int i = 0; i < authMechs.size(); i++) {
+            AuthenticationMechanism auth = (AuthenticationMechanism) authMechs.get(i);
+            System.out.println("\nAuthentication Mechanism:");
+            System.out.println("Description : " + auth.getDescription());
+            System.out.println("Type : " + auth.getAuthenticationMechanismType().getName().toLowerCase());
+            System.out.println("Credential Interface : " + auth.getCredentialInterface());
+        }
+        System.out.println("\nRegistered classes:");
+        System.out.println("\t" + ra.getConnectionFactoryImplClass() + " implements ");
+        System.out.println("\t\t" + ra.getConnectionFactoryInterface());
+        System.out.println("\t" + ra.getConnectionImplClass() + " implements ");
+        System.out.println("\t\t" + ra.getConnectionInterface());
+        System.out.println("\tManagedConnectionFactory: " + ra.getManagedConnectionFactoryClass());
+
+        List configs = ra.getConfigProperties();
+        System.out.println("\nConfig-properties:");
+        for (int i = 0; i < configs.size(); i++) {
+            ConfigProperty prop = (ConfigProperty) configs.get(i);
+            System.out.println("\tConfig-property : " + prop.getName());
+            System.out.println("\tType : " + prop.getType() + " / Value : " + prop.getValue());
+            System.out.println("\tDescription : " + prop.getDescription() + "\n");
+        }
+
+        List secs = ra.getSecurityPermissions();
+        System.out.println("\nSecurity-Permissions:");
+        for (int i = 0; i < secs.size(); i++) {
+            SecurityPermission prop = (SecurityPermission) secs.get(i);
+            System.out.println("\tConfig-Description : " + prop.getDescription());
+            System.out.println("\tSpecification : " + prop.getSpecification() + "\n");
+        }
+
+    }
+    public static junit.framework.Test suite() {
+        return new TestSuite(RarFileTests.class);
+    }
+    public void testaddCopyModule() throws Exception {
+
+        String in = AutomatedBVT.baseDirectory + "sample.rar";
+        RARFile rarFile = (RARFile) getArchiveFactory().openArchive(in);
+
+        rarFile.getDeploymentDescriptor();
+
+        EARFile newEarFile = getArchiveFactory().createEARFileInitialized(AutomatedBVT.baseDirectory + "testOutput/CopyTests/newEarWithRarCopiedModule.ear");
+
+        newEarFile.addCopy(rarFile);
+        RARFile copied = (RARFile) newEarFile.getModuleFiles().get(0);
+        assertTrue(copied.isDeploymentDescriptorSet());
+        assertTrue(copied.getDeploymentDescriptor() == copied.getDeploymentDescriptorResource().getContents().get(0));
+        assertTrue(copied.getDeploymentDescriptor() != rarFile.getDeploymentDescriptor());
+        assertTrue(rarFile.getFiles().size() == copied.getFiles().size());
+
+        newEarFile.saveNoReopen();
+    }
+    public void testexpandRarModule() throws Exception {
+
+        String in = AutomatedBVT.baseDirectory + "sample.rar";
+        RARFile rarFile = (RARFile) getArchiveFactory().openArchive(in);
+        rarFile.setURI("sample.rar");
+
+        rarFile.getDeploymentDescriptor();
+
+        EARFile newEarFile = getArchiveFactory().createEARFileInitialized(AutomatedBVT.baseDirectory + "testOutput/RarTests/newEarWithRarModule.ear");
+        newEarFile.addCopy(rarFile);
+
+        newEarFile.saveNoReopen();
+
+        String out = AutomatedBVT.baseDirectory + "testOutput/RarTests/Rar-containing-ear-out.ear";
+        newEarFile.extractTo(out, Archive.EXPAND_RAR_FILES);
+    }
+    
+    /**
+     * Very basic method to open an archive and save it as a directory to a new destination.  Requires visual inspection
+     * for verification.  Nested wars and ejb jars will be exploded but other nested jars will not
+     */
+    public void testOpenAndExtract() throws Exception {
+
+        String in = AutomatedBVT.baseDirectory + "sample.rar";
+        RARFile rarFile = (RARFile) getArchiveFactory().openArchive(in);
+        String out = AutomatedBVT.baseDirectory + "testOutput/Exploded_RAR_Dir/";
+        rarFile.extractToConnectorDirectory(out, Archive.EXPAND_ALL);
+    }
+    /**
+     * Opens an ear file, and for each module, writes it's dd components to the console.  Requires visual inspection
+     * for verification
+     */
+
+    public void testOpenAndRead() throws Exception {
+
+        String in = AutomatedBVT.baseDirectory + "sample.rar";
+        RARFile rarFile = (RARFile) getArchiveFactory().openArchive(in);
+
+		Connector dd = rarFile.getDeploymentDescriptor();
+		//printRARToConsole(dd);
+	}
+	
+	public void testopenRarEar() throws Exception {
+		EARFile earFile = (EARFile) getArchiveFactory().openArchive(AutomatedBVT.baseDirectory + "testrar.ear");
+		assertTrue(earFile.getDeploymentDescriptor().getFirstModule("sample.rar") != null);
+	}
+	
+	public void testSaveRarEar() throws Exception {
+		String in = AutomatedBVT.baseDirectory + "sample.rar";
+		RARFile rarFile = (RARFile) getArchiveFactory().openArchive(in);
+		rarFile.setURI("sample.rar");
+
+        rarFile.getDeploymentDescriptor();
+
+        EARFile newEarFile = getArchiveFactory().createEARFileInitialized(AutomatedBVT.baseDirectory + "testOutput/RarTests/newEarWithRarModule_saved.ear");
+        newEarFile.addCopy(rarFile);
+
+        assertNotNull("Module wasn't found!", newEarFile.getDeploymentDescriptor().getFirstModule("sample.rar"));
+
+        newEarFile.save();
+    }
+
+    public void testJ2Cauth() throws Exception {
+        String in = AutomatedBVT.baseDirectory + "sample.rar";
+        RARFile rarFile = (RARFile) getArchiveFactory().openArchive(in);
+
+        Connector dd = rarFile.getDeploymentDescriptor();
+
+        ResourceAdapter rd = dd.getResourceAdapter();
+
+        EList myAuthList = rd.getAuthenticationMechanisms();
+//        System.out.println("Number of auth mechanisms is: " + myAuthList.size());
+//        for (int i = 0; i < myAuthList.size(); i++) {
+//            System.out.println("Auth type is: " + ((AuthenticationMechanism) myAuthList.get(i)).getAuthenticationMechanismType());
+//            System.out.println("Auth type is: " + ((AuthenticationMechanism) myAuthList.get(i)).getAuthenticationMechanismType().getName());
+//        }
+    }
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/ResourceTests.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/ResourceTests.java
new file mode 100644
index 0000000..0e7557b
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/ResourceTests.java
@@ -0,0 +1,112 @@
+/*
+ * Created on Mar 13, 2003
+ *
+ * To change this generated comment go to 
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+package org.eclipse.jst.j2ee.archive.test;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import junit.framework.TestSuite;
+import junit.textui.TestRunner;
+
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.jst.j2ee.common.CommonPackage;
+import org.eclipse.jst.j2ee.common.EjbRef;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.ApplicationClientFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.EARFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.EJBJarFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveInit;
+import org.eclipse.jst.j2ee.core.tests.bvt.AutomatedBVT;
+import org.eclipse.jst.j2ee.ejb.EnterpriseBean;
+
+
+/**
+ * @author schacher
+ *
+ * To change this generated comment go to 
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+public class ResourceTests extends AbstractArchiveTest {
+
+	/**
+	 * @param name
+	 */
+	public ResourceTests(String name) {
+		super(name);
+	}
+	
+	/**
+	 * Starts the application.
+	 * @param args an array of command-line arguments
+	 */
+	public static void main(java.lang.String[] args) {
+		String[] className = {"com.ibm.etools.archive.test.ResourceTests", "-noloading"};
+		TestRunner.main(className);
+	}
+	public static junit.framework.Test suite() {
+		return new TestSuite(ResourceTests.class);
+	}
+
+	protected List findOccurrences(List resources, String uri) {
+		List result = new ArrayList(1);
+		for (int i = 0; i < resources.size(); i++) {
+			Resource aResource = (Resource) resources.get(i);
+			if (uri.equals(aResource.getURI().toString()))
+				result.add(aResource);
+		}
+		return result;
+	}
+
+	public void testResourceCreation() throws Exception {
+		String uri = "META-INF/client-resource.xmi";
+		ApplicationClientFile appClientFile = getArchiveFactory().createApplicationClientFileInitialized("test.jar");
+		Resource res = null;
+		boolean exceptionCaught = false;
+		try {
+			res = appClientFile.getMofResource(uri);
+		} catch (java.io.FileNotFoundException e) {
+			exceptionCaught = true;
+			List foundResources = findOccurrences(appClientFile.getResourceSet().getResources(), uri);
+			assertTrue("There should exist exactly one resource", foundResources.size() == 1);
+			Resource foundResource = (Resource)foundResources.get(0);
+			assertFalse("The resource should be unloaded", foundResource.isLoaded());
+			res = appClientFile.makeMofResource(uri);
+			assertTrue("Resource should not be null", res != null);
+			foundResources = findOccurrences(appClientFile.getResourceSet().getResources(), uri);
+			assertTrue("There should exist exactly one resource", foundResources.size() == 1);
+			foundResource = (Resource)foundResources.get(0);
+			assertTrue("The resource should exist", foundResource != null);
+			assertFalse("The resource should be unloaded", foundResource.isLoaded());		
+		}
+		assertTrue("Exception should have been caught", exceptionCaught);
+		Collection loadedResources = appClientFile.getLoadedMofResources();
+		assertTrue("Loaded resources should be size 1", loadedResources.size() == 1);
+		EjbRef aRef = CommonPackage.eINSTANCE.getCommonFactory().createEjbRef();
+		res.getContents().add(aRef);
+		loadedResources = appClientFile.getLoadedMofResources();
+		assertTrue("Loaded resources should be size 2", loadedResources.size() == 2);
+	}
+	
+	public void testResourceDirty() throws Exception {
+		EJBJarFile jar = getArchiveFactory().openEJB11JarFile(AutomatedBVT.baseDirectory + "bankejbs.jar");
+		EnterpriseBean bean = (EnterpriseBean)jar.getDeploymentDescriptor().getEnterpriseBeans().get(0);
+		
+		EARFile newEar = getArchiveFactory().createEARFileInitialized("test");
+		EJBJarFile copyJar = (EJBJarFile) newEar.addCopy(jar);
+		
+		assertFalse("dd should not be dirty", copyJar.getDeploymentDescriptorResource().isModified());
+	}
+
+	/* (non-Javadoc)
+	 * @see junit.framework.TestCase#setUp()
+	 */
+	protected void setUp() throws Exception {
+		super.setUp();
+		ArchiveInit.init();
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/SaveTests.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/SaveTests.java
new file mode 100644
index 0000000..41e1be0
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/SaveTests.java
@@ -0,0 +1,106 @@
+package org.eclipse.jst.j2ee.archive.test;
+
+/*
+* Licensed Material - Property of IBM
+* (C) Copyright IBM Corp. 2001 - All Rights Reserved.
+* US Government Users Restricted Rights - Use, duplication or disclosure
+* restricted by GSA ADP Schedule Contract with IBM Corp.
+*/
+
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+import junit.textui.TestRunner;
+
+import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.CommonarchiveFactory;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.CommonarchivePackage;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.EARFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.File;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.ReadOnlyDirectory;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.WARFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveConstants;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.util.ArchiveUtil;
+import org.eclipse.jst.j2ee.core.tests.bvt.AutomatedBVT;
+
+/**
+ * Insert the type's description here.
+ * Creation date: (12/21/00 3:04:36 PM)
+ * @author: Administrator
+ */
+public class SaveTests extends TestCase {
+    private final static String copyright = "(c) Copyright IBM Corporation 2001."; //$NON-NLS-1$
+    /**
+     * SaveTests constructor comment.
+     * @param name java.lang.String
+     */
+    public SaveTests(String name) {
+        super(name);
+    }
+    public CommonarchiveFactory getArchiveFactory() {
+        return CommonarchivePackage.eINSTANCE.getCommonarchiveFactory();
+    }
+    /**
+     * Starts the application.
+     * @param args an array of command-line arguments
+     */
+    public static void main(java.lang.String[] args) {
+        String[] className = { "com.ibm.etools.archive.test.SaveTests", "-noloading" };
+        TestRunner.main(className);
+    }
+    public static junit.framework.Test suite() {
+        return new TestSuite(SaveTests.class);
+    }
+    /**
+     * This scenario tests the case of opening an archive, modifying it's contents, and saving to the same uri from which it was
+     * loaded.  The problem is that the reading of input streams of individual entries in an archive is deferred until requested through
+     * the api or save time; therefore, an open file exists on the source file.  To get around this, the implementation saves the archive
+     * to a temp file, then deletes (or renames, based on setting, to be implemented) the old file, renames the temp file, and does some
+     * housekeeping on the saved archive, with it's load strategy and contained files
+     */
+    public void testSave() throws Exception {
+
+        //First make a copy of our reference file
+        Archive anArchive = getArchiveFactory().openArchive(AutomatedBVT.baseDirectory + "example2.war");
+        anArchive.saveAsNoReopen(AutomatedBVT.baseDirectory + "testOutput/SaveTests/copy.war");
+        anArchive = null;
+
+        WARFile aWarFile = (WARFile) getArchiveFactory().openArchive(AutomatedBVT.baseDirectory + "testOutput/SaveTests/copy.war");
+        ReadOnlyDirectory sampleDirectory = getArchiveFactory().openReadOnlyDirectory(AutomatedBVT.baseDirectory + "WarTestClasses");
+        int initialSize = aWarFile.getClasses().size();
+        File aFile = sampleDirectory.getFileInSelfOrSubdirectory("com/ibm/etools/archive/test/WARFileTests.class");
+        aWarFile.addCopyClass(aFile);
+        assertTrue(aWarFile.getClasses().size() == initialSize + 1);
+
+        String classURI = ArchiveUtil.concatUri(ArchiveConstants.WEBAPP_CLASSES_URI, aFile.getURI(), '/');
+        assertTrue(aWarFile.containsFile(classURI));
+        aWarFile.save();
+
+        File classFile = aWarFile.getFile(classURI);
+        assertTrue("File should not be null", classFile != null);
+        assertTrue("Wrong loading archive", classFile.getLoadingContainer() == aWarFile);
+        assertTrue("Wrong original URI", classFile.getOriginalURI().equals(classURI));
+
+        aWarFile.saveAs("testOutput/SaveTests/copy2.war");
+        aWarFile.save();
+    }
+
+    /**
+     * This scenario is similar to @link #testSave, except that it tests with a directory instead of a jar file
+     */
+    public void testSaveDirectory() throws Exception {
+
+        //First make a copy of our reference file
+        Archive anArchive = getArchiveFactory().openArchive(AutomatedBVT.baseDirectory + "sample.ear");
+        anArchive.saveAsNoReopen(AutomatedBVT.baseDirectory + "testOutput/SaveTests/sample-copied.ear");
+        anArchive = null;
+
+        EARFile anEARFile = (EARFile) getArchiveFactory().openArchive(AutomatedBVT.baseDirectory + "testOutput/SaveTests/sample-copied.ear");
+
+        anEARFile.getDeploymentDescriptor();
+        
+
+        anEARFile.extractNoReopen(Archive.EXPAND_WAR_FILES);
+
+    }
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/SecurityRoleTests.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/SecurityRoleTests.java
new file mode 100644
index 0000000..ee96b63
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/SecurityRoleTests.java
@@ -0,0 +1,119 @@
+package org.eclipse.jst.j2ee.archive.test;
+
+ /*
+ * Licensed Material - Property of IBM
+ * (C) Copyright IBM Corp. 2001 - All Rights Reserved.
+ * US Government Users Restricted Rights - Use, duplication or disclosure
+ * restricted by GSA ADP Schedule Contract with IBM Corp.
+ */
+
+import junit.framework.TestSuite;
+import junit.textui.TestRunner;
+
+import org.eclipse.jst.j2ee.common.CommonFactory;
+import org.eclipse.jst.j2ee.common.CommonPackage;
+import org.eclipse.jst.j2ee.common.SecurityRole;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.EARFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.EJBJarFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.EJBModuleRef;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.WARFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.WebModuleRef;
+import org.eclipse.jst.j2ee.core.tests.bvt.AutomatedBVT;
+
+/**
+ * Insert the type's description here.
+ * Creation date: (02/09/01 12:05:18 AM)
+ * @author: Administrator
+ */
+public class SecurityRoleTests extends AbstractArchiveTest {
+	private final static String copyright = "(c) Copyright IBM Corporation 2001.";//$NON-NLS-1$
+/**
+ * SecurityRoleTests constructor comment.
+ * @param name java.lang.String
+ */
+public SecurityRoleTests(String name) {
+	super(name);
+}
+public CommonFactory getCommonFactory() {
+	return CommonPackage.eINSTANCE.getCommonFactory();
+}
+/**
+ * Starts the application.
+ * @param args an array of command-line arguments
+ */
+public static void main(java.lang.String[] args) {
+	String[] className = {"com.ibm.etools.archive.test.SecurityRoleTests", "-noloading"};
+	TestRunner.main(className);
+}
+public static junit.framework.Test suite() {
+	return new TestSuite(SecurityRoleTests.class);
+}
+public void testPushDownCopy() throws Exception {
+
+	EARFile earFile = getArchiveFactory().openEARFile(AutomatedBVT.baseDirectory + "sample.ear");
+
+	WARFile warFile = (WARFile)earFile.getWARFiles().get(0);
+
+	EJBJarFile ejbJarFile = (EJBJarFile) earFile.getEJBJarFiles().get(0);
+
+	SecurityRole aRole = getCommonFactory().createSecurityRole();
+	aRole.setRoleName("administrator");
+	aRole.setDescription("The all powerful");
+	earFile.getDeploymentDescriptor().getSecurityRoles().add(aRole);
+	earFile.pushDownRole(aRole);
+
+	assertTrue("Push down failed for ejb jar", ejbJarFile.getDeploymentDescriptor().getAssemblyDescriptor().getSecurityRoleNamed("administrator") != null);
+	assertTrue("Push down failed for war", warFile.getDeploymentDescriptor().getSecurityRoleNamed("administrator") != null);
+
+	earFile.close();
+
+}
+public void testRollupAddAndPushDown() throws Exception {
+
+	EARFile earFile = getArchiveFactory().openEARFile(AutomatedBVT.baseDirectory +"sample.ear");
+
+	WebModuleRef webRef = (WebModuleRef)earFile.getWebModuleRefs().get(0);
+
+	EJBModuleRef ejbModRef = (EJBModuleRef) earFile.getEJBModuleRefs().get(0);
+
+	SecurityRole aRole = getCommonFactory().createSecurityRole();
+	aRole.setRoleName("Joe");
+	aRole.setDescription("New description");
+	webRef.getWebApp().getSecurityRoles().add(aRole);
+
+	aRole = getCommonFactory().createSecurityRole();
+	aRole.setRoleName("administrator");
+	aRole.setDescription("The all powerful");
+	
+	webRef.getWebApp().getSecurityRoles().add(aRole);
+
+	//Test the rollup
+	earFile.rollUpRoles();
+	//We cheated here because we already knew there were two roles in the ejb jar
+	//one of which is named Joe, and zero roles in the war file
+	assertTrue("Roll up not right", earFile.getDeploymentDescriptor().getSecurityRoles().size() == 5);
+
+	aRole = getCommonFactory().createSecurityRole();
+	aRole.setRoleName("manager");
+	aRole.setDescription("the manager");
+	earFile.addCopy(aRole, webRef.getModule());
+
+	//Test the add and rollup
+	assertTrue("Add copy not right", earFile.getDeploymentDescriptor().getSecurityRoles().size() == 6 
+		&& earFile.getDeploymentDescriptor().containsSecurityRole(aRole.getRoleName())
+		&& webRef.getWebApp().containsSecurityRole(aRole.getRoleName()));
+
+	//Test the push down
+	earFile.renameSecurityRole("Joe", "guest");
+
+	assertTrue("Push down not right", !earFile.getDeploymentDescriptor().containsSecurityRole("Joe")
+		&& earFile.getDeploymentDescriptor().containsSecurityRole("guest")
+		&& !webRef.getWebApp().containsSecurityRole("Joe")
+		&& webRef.getWebApp().containsSecurityRole("guest")
+		&& !ejbModRef.getEJBJar().containsSecurityRole("Joe")
+		&& ejbModRef.getEJBJar().containsSecurityRole("guest"));
+
+	earFile.saveAsNoReopen(AutomatedBVT.baseDirectory +"testOutput/SecurityRoleTests/newSample.ear");
+	
+}
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/SimpleTests.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/SimpleTests.java
new file mode 100644
index 0000000..7d8a2ca
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/SimpleTests.java
@@ -0,0 +1,433 @@
+package org.eclipse.jst.j2ee.archive.test;
+
+/*
+* Licensed Material - Property of IBM
+* (C) Copyright IBM Corp. 2001 - All Rights Reserved.
+* US Government Users Restricted Rights - Use, duplication or disclosure
+* restricted by GSA ADP Schedule Contract with IBM Corp.
+*/
+
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+import junit.textui.TestRunner;
+
+import org.eclipse.emf.common.command.Command;
+import org.eclipse.jst.j2ee.application.Application;
+import org.eclipse.jst.j2ee.application.Module;
+import org.eclipse.jst.j2ee.common.CommonPackage;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.CommonarchiveFactory;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.CommonarchivePackage;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.EARFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.EJBJarFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.EJBModuleRef;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.File;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.ModuleFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.ModuleRef;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.ValidateXmlCommand;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.WARFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.WebModuleRef;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.XmlValidationResult;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.SaveFailureException;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveInit;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveOptions;
+import org.eclipse.jst.j2ee.core.tests.bvt.AutomatedBVT;
+import org.eclipse.jst.j2ee.ejb.ContainerManagedEntity;
+import org.eclipse.jst.j2ee.ejb.EJBJar;
+import org.eclipse.jst.j2ee.ejb.EjbPackage;
+import org.eclipse.jst.j2ee.ejb.Entity;
+import org.eclipse.jst.j2ee.ejb.Session;
+import org.eclipse.jst.j2ee.webapplication.WebApp;
+import org.eclipse.jst.j2ee.webapplication.WebapplicationPackage;
+
+
+/**
+ * Insert the type's description here.
+ * Creation date: (12/11/00 10:26:11 AM)
+ * @author: Administrator
+ */
+public class SimpleTests extends TestCase {
+    private final static String copyright = "(c) Copyright IBM Corporation 2001."; //$NON-NLS-1$
+    /**
+     * SimpleTests constructor comment.
+     * @param name java.lang.String
+     */
+    public SimpleTests(String name) {
+        super(name);
+    }
+    public boolean isEmpty(Collection adapters) {
+        if (adapters.isEmpty())
+            return true;
+        for (Iterator iter = adapters.iterator(); iter.hasNext();) {
+            if (iter.next() != null)
+                return false;
+        }
+        return true;
+    }
+    public CommonarchiveFactory getArchiveFactory() {
+        return CommonarchivePackage.eINSTANCE.getCommonarchiveFactory();
+    }
+    /**
+     * Starts the application.
+     * @param args an array of command-line arguments
+     */
+    public static void main(java.lang.String[] args) {
+        String[] className = { "com.ibm.etools.archive.test.SimpleTests", "-noloading" };
+        TestRunner.main(className);
+    }
+    public void printApplToConsole(Application appl) {
+
+        List modules = appl.getModules();
+        for (int i = 0; i < modules.size(); i++) {
+            System.out.println(modules.get(i));
+        }
+    }
+    public void printEJBJarToConsole(EJBJar ejbJar) {
+
+        List ejbs = ejbJar.getEnterpriseBeans();
+        for (int i = 0; i < ejbs.size(); i++) {
+            System.out.println(ejbs.get(i));
+        }
+
+    }
+    public void printWebAppToConsole(WebApp webApp) {
+        List servlets = webApp.getServlets();
+
+        for (int i = 0; i < servlets.size(); i++) {
+            System.out.println(servlets.get(i));
+        }
+
+    }
+    public static junit.framework.Test suite() {
+        return new TestSuite(SimpleTests.class);
+    }
+    public void testContainerManagedEntityExtensionRead() throws Exception {
+        CommonarchiveFactory factory = CommonarchivePackage.eINSTANCE.getCommonarchiveFactory();
+        EJBJarFile jarFile = (EJBJarFile) factory.openArchive(AutomatedBVT.baseDirectory + "cmpsample.jar");
+        EJBJar jar = jarFile.getDeploymentDescriptor();
+     
+    }
+    public void testEJB11JarAdd() throws Exception {
+        EARFile _earFile = getArchiveFactory().createEARFileInitialized(AutomatedBVT.baseDirectory + "testOutput/TestEAREJBAdd.ear");
+        CommonarchiveFactory factory = CommonarchivePackage.eINSTANCE.getCommonarchiveFactory();
+        EJBJarFile jar = (EJBJarFile) factory.openArchive(AutomatedBVT.baseDirectory + "ejb_compat_entitycmp.jar");
+        jar.setURI(AutomatedBVT.baseDirectory + "ejb_compat_entitycmp.jar");
+        _earFile.addCopy(jar);
+        _earFile.save();
+    }
+    public void testEJBSetAbstractSchemaName() throws Exception {
+        String testSm = AutomatedBVT.baseDirectory + "TestSchema";
+        CommonarchiveFactory factory = CommonarchivePackage.eINSTANCE.getCommonarchiveFactory();
+        EJBJarFile jarFile = (EJBJarFile) factory.openArchive(AutomatedBVT.baseDirectory + "cmpsample.jar");
+        EJBJar jar = jarFile.getDeploymentDescriptor();
+        List lst = jar.getContainerManagedBeans();
+
+        //I know this will be a CMP, so, lets try set/get on it..
+        ContainerManagedEntity cmp = (ContainerManagedEntity) lst.get(0);
+
+        //System.out.println("Setting Schema name to: " + testSm);
+        cmp.setAbstractSchemaName(testSm);
+        //Retrieve it and see if it matches
+        //System.out.println("Getting schema name: " + cmp.getAbstractSchemaName());
+        assertTrue(cmp.getAbstractSchemaName().equals(testSm));
+    }
+    /**
+     * This excercises the index adapter on Container
+     */
+    public void testIndexing() throws Exception {
+        Archive anArchive = getArchiveFactory().openArchive(AutomatedBVT.baseDirectory + "foo.jar");
+        String uri = "com/ibm/etools/archive/test/SimpleTests.java";
+
+        List files = anArchive.getFiles();
+
+        File aFile = anArchive.getFile(uri);
+        assertTrue("Adapter should be attached to aFile", !isEmpty(aFile.eAdapters()));
+
+        files.remove(aFile);
+
+        assertTrue("Adapter should not be attached to aFile", isEmpty(aFile.eAdapters()));
+
+        assertTrue("Contains should return false", !anArchive.containsFile(uri));
+
+        File copy = anArchive.addCopy(aFile);
+
+        assertTrue("Contains should return true", anArchive.containsFile(uri));
+
+        String renamedURI = "com/ibm/goobledygook";
+        copy.setURI(renamedURI);
+
+        assertTrue("Contains should return false for old uri", !anArchive.containsFile(uri));
+
+        assertTrue("Contains should return true for new uri", anArchive.containsFile(renamedURI));
+
+    }
+    /**
+     * This excercises the index adapter on Container
+     * Tests notifications with add/remove of lists, and that adapters are set post copy
+     */
+    public void testIndexingWithCollections() throws Exception {
+        Archive anArchive = getArchiveFactory().openArchive(AutomatedBVT.baseDirectory + "bankejbs.jar");
+        EARFile earFile = getArchiveFactory().createEARFileInitialized(AutomatedBVT.baseDirectory + "bar.ear");
+        earFile.addCopy(anArchive);
+        anArchive = (Archive) earFile.getFile(AutomatedBVT.baseDirectory + "bankejbs.jar");
+
+        assertTrue("Index out of sync", !anArchive.getFiles().isEmpty() && anArchive.isIndexed());
+        List files = anArchive.getFiles();
+        for (int i = 0; i < files.size(); i++) {
+            File aFile = (File) files.get(i);
+            assertTrue("Index out of whack; containment should be true", anArchive.containsFile(aFile.getURI()));
+            assertTrue("Adapter should be attached to aFile", !isEmpty(aFile.eAdapters()));
+        }
+
+        List filesToAdd = getArchiveFactory().openReadOnlyDirectory(AutomatedBVT.baseDirectory + "WarTestClasses").getFilesRecursive();
+        List addedFiles = anArchive.addCopyFiles(filesToAdd);
+
+        assertTrue("Files added incorrectly", !filesToAdd.isEmpty() && filesToAdd.size() == addedFiles.size());
+
+        for (int i = 0; i < addedFiles.size(); i++) {
+            File aFile = (File) addedFiles.get(i);
+            assertTrue("Contains should be true", anArchive.containsFile(aFile.getURI()));
+            assertTrue("Should be same instance", anArchive.getFile(aFile.getURI()) == aFile);
+            assertTrue("Adapter should be attached to aFile", !isEmpty(aFile.eAdapters()));
+        }
+        anArchive.getFiles().removeAll(addedFiles);
+
+        for (int i = 0; i < addedFiles.size(); i++) {
+            File aFile = (File) addedFiles.get(i);
+            assertTrue("Adapter should not be attached to aFile", isEmpty(aFile.eAdapters()));
+            assertTrue("Contains should return false", !anArchive.containsFile(aFile.getURI()));
+        }
+        getArchiveFactory().closeOpenArchives();
+    }
+    /**
+     * Very basic method to open an archive and save it as a directory to a new destination.  Requires visual inspection
+     * for verification.  Nested jars will not be exploded
+     */
+    public void testOpenAndExtract1() throws Exception {
+
+        String in = AutomatedBVT.baseDirectory + "sample.ear";
+        EARFile earFile = (EARFile) getArchiveFactory().openArchive(in);
+        //System.out.println("EAR spec version " + earFile.getSpecVersion() + " detected.");
+
+        String out = AutomatedBVT.baseDirectory + "testOutput/SimpleTests/sample-expanded-out1.ear";
+        earFile.extractTo(out, Archive.EXPAND_NONE);
+        earFile.close();
+    }
+    /**
+     * Very basic method to open an archive and save it as a directory to a new destination.  Requires visual inspection
+     * for verification.  Nested wars will be exploded but other nested jars will not.  This method emulates the websphere install.
+     * the archive is opened as read only; test that no temp files are created by putting a breakpoint in ArchiveUtil#createTempFile(String, File)
+     * Also the archive is opened with java reflection disabled.  Verify no reflection occurs by putting a breakpoints in the constructors
+     * of JavaJDKAdapterFactory, and the method reflectValues() in each of the subclasses of JdkAdaptor.
+     */
+    public void testOpenAndExtract2() throws Exception {
+
+        String in = AutomatedBVT.baseDirectory + "sample.ear";
+        ArchiveOptions options = new ArchiveOptions();
+        options.setIsReadOnly(true);
+        options.setUseJavaReflection(false);
+        EARFile earFile = (EARFile) getArchiveFactory().openArchive(options, in);
+        //The following code forces the load of all the deployment descriptors, just to make sure java reflection doesn't happen
+        List moduleRefs = earFile.getModuleRefs();
+        for (int i = 0; i < moduleRefs.size(); i++) {
+            ModuleRef m = (ModuleRef) moduleRefs.get(i);
+            m.getDeploymentDescriptor();
+            
+        }
+
+        String out = "testOutput/SimpleTests/sample-expanded-out2.ear";
+        earFile.extractTo(out, Archive.EXPAND_WAR_FILES);
+        earFile.close();
+    }
+    /**
+     * Very basic method to open an archive and save it as a directory to a new destination.  Requires visual inspection
+     * for verification.  Nested wars and ejb jars will be exploded but other nested jars will not
+     */
+    public void testOpenAndExtract3() throws Exception {
+
+        String in = AutomatedBVT.baseDirectory + "sample.ear";
+        EARFile earFile = (EARFile) getArchiveFactory().openArchive(in);
+        String out = AutomatedBVT.baseDirectory + "testOutput/SimpleTests/sample-expanded-out3.ear";
+        earFile.extractTo(out, Archive.EXPAND_WAR_FILES | Archive.EXPAND_EJBJAR_FILES);
+        earFile.close();
+    }
+    /**
+     * Opens an ear file, and for each module, writes it's dd components to the console.  Requires visual inspection
+     * for verification
+     */
+    public void testOpenAndRead() throws Exception {
+
+        String in = AutomatedBVT.baseDirectory + "sample.ear";
+        EARFile earFile = (EARFile) getArchiveFactory().openArchive(in);
+
+        Application appl = earFile.getDeploymentDescriptor();
+        printApplToConsole(appl);
+
+        List moduleRefs = earFile.getModuleRefs();
+
+        for (int i = 0; i < moduleRefs.size(); i++) {
+            ModuleRef aModuleRef = (ModuleRef) moduleRefs.get(i);
+            if (aModuleRef.isWeb()) {
+                WebModuleRef wRef = (WebModuleRef) aModuleRef;
+                printWebAppToConsole(wRef.getWebApp());
+              
+            } else if (aModuleRef.isEJB()) {
+                EJBModuleRef eRef = (EJBModuleRef) aModuleRef;
+                printEJBJarToConsole(eRef.getEJBJar());
+                
+            }
+        }
+    }
+    /**
+     * Very basic method to open an archive and save it as a jar file to a new destination.  Requires visual inspection
+     * for verification
+     */
+    public void testOpenAndSaveAsJarFile() throws Exception {
+
+        String in = AutomatedBVT.baseDirectory + "sample.ear";
+        EARFile earFile = (EARFile) getArchiveFactory().openArchive(in);
+        String out = AutomatedBVT.baseDirectory + "testOutput/SimpleTests/sample-copy.ear";
+        earFile.saveAsNoReopen(out);
+    }
+    /**
+     * Test case created as a result of a defect report that currently cannot be reproduced; open an expanded ear file and save it out
+     * as a jar file
+     */
+    public void testOpenDirectoryAndSaveAsJarFile() throws Exception {
+
+        String in = AutomatedBVT.baseDirectory + "sample_expanded.ear";
+        in = new java.io.File(in).getAbsolutePath();
+        //System.out.println(in);
+        EARFile earFile = (EARFile) getArchiveFactory().openArchive(in);
+        //Added this line to see if loading the dd would make a difference
+        earFile.getDeploymentDescriptor();
+        String out = "testOutput/SimpleTests/sample-jarred.ear";
+        out = new java.io.File(out).getAbsolutePath();
+        //System.out.println(out);
+        earFile.saveAsNoReopen(out);
+    }
+    /**
+     * @see Archive#canClose()
+     */
+    public void testSafeClose() throws Exception {
+
+        String in = AutomatedBVT.baseDirectory + "sample.ear";
+        EARFile earFile = getArchiveFactory().openEARFile(in);
+        List modules = earFile.getDeploymentDescriptor().getModules();
+        EJBJarFile ejbJarFile = null;
+
+        for (int i = 0; i < modules.size(); i++) {
+            Module aModule = (Module) modules.get(i);
+            if (aModule.isEjbModule()) {
+                ejbJarFile = (EJBJarFile) earFile.getFile(aModule.getUri());
+                //System.out.println("EJBJar spec version " + ejbJarFile.getSpecVersion() + " detected.");
+
+                break;
+            }
+        }
+
+        assertTrue("EJBJarFile should not be null", ejbJarFile != null);
+
+        EARFile newEarFile = getArchiveFactory().createEARFileInitialized("testOutput/SimpleTests/safeClose1.ear");
+        newEarFile.addCopy(ejbJarFile);
+        assertTrue(!earFile.getDependentOpenArchives().isEmpty() && !ejbJarFile.getDependentOpenArchives().isEmpty());
+
+        newEarFile.save();
+        assertTrue(earFile.getDependentOpenArchives().isEmpty() && ejbJarFile.getDependentOpenArchives().isEmpty());
+        earFile.close();
+        newEarFile.close();
+    }
+    /**
+     * CMVC defect 99544 - If a save fails and the file didn't exist, one should not
+     * be created
+     */
+    public void testSaveFailure() throws Exception {
+
+        String in = AutomatedBVT.baseDirectory + "sample.ear";
+        String out = AutomatedBVT.baseDirectory + "testOutput/SimpleTests/saveFailure.ear";
+        EARFile earFile = getArchiveFactory().openEARFile(in);
+        List modules = earFile.getDeploymentDescriptor().getModules();
+        EJBJarFile ejbJarFile = null;
+
+        for (int i = 0; i < modules.size(); i++) {
+            Module aModule = (Module) modules.get(i);
+            if (aModule.isEjbModule()) {
+                ejbJarFile = (EJBJarFile) earFile.getFile(aModule.getUri());
+                break;
+            }
+        }
+
+        assertTrue("EJBJarFile should not be null", ejbJarFile != null);
+
+        EARFile newEarFile = getArchiveFactory().createEARFileInitialized(out);
+        newEarFile.addCopy(ejbJarFile);
+        ejbJarFile.close();
+        try {
+            newEarFile.save();
+        } catch (SaveFailureException expected) {
+            System.out.println("Expected save failure occurred");
+            return;
+        } finally {
+            assertTrue("File should not exist", !(new java.io.File(out).exists()));
+            getArchiveFactory().closeOpenArchives();
+        }
+        assertTrue("Save should have failed", false);
+    }
+    /**
+     * Opens an ear file, makes a few changes to ensure the xml is not valid, and validates the xml in all the dds; verifies that
+     * sax exceptions are collected
+     */
+    public void testXmlValidation() throws Exception {
+
+        String in = AutomatedBVT.baseDirectory + "sample.ear";
+        EARFile earFile = getArchiveFactory().openEARFile(in);
+
+        Application appl = earFile.getDeploymentDescriptor();
+        appl.getSecurityRoles().add(CommonPackage.eINSTANCE.getCommonFactory().createSecurityRole());
+
+        List moduleFiles = earFile.getModuleFiles();
+
+        for (int i = 0; i < moduleFiles.size(); i++) {
+            ModuleFile aModuleFile = (ModuleFile) moduleFiles.get(i);
+            if (aModuleFile.isWARFile()) {
+                WARFile aWarFile = (WARFile) aModuleFile;
+                aWarFile.getDeploymentDescriptor().getServlets().add(WebapplicationPackage.eINSTANCE.getWebapplicationFactory().createServlet());
+            } else if (aModuleFile.isEJBJarFile()) {
+                EJBJarFile anEjbJarFile = (EJBJarFile) aModuleFile;
+                anEjbJarFile.getDeploymentDescriptor().getEnterpriseBeans().add(EjbPackage.eINSTANCE.getEjbFactory().createEntity());
+                anEjbJarFile.getDeploymentDescriptor().getAssemblyDescriptor().getSecurityRoles().add(CommonPackage.eINSTANCE.getCommonFactory().createSecurityRole());
+            }
+        }
+        Command cmd = new ValidateXmlCommand(earFile);
+        cmd.execute();
+        List errors = (List) cmd.getResult();
+        assertTrue("Total validation errors should be 3, instead of "+errors.size(), errors.size() == 3);
+        for (int i = 0; i < 3; i++) {
+            XmlValidationResult result = (XmlValidationResult) errors.get(i);
+            if (i == 1)
+                assertTrue("The ejb module should have 2 errors instead of "+ result.getCaughtExceptions().size(), result.getCaughtExceptions().size() == 2);
+            else
+                assertTrue("The web module should have 1 error instead of "+ result.getCaughtExceptions().size(), result.getCaughtExceptions().size() == 1);
+        }
+        earFile.close();
+    }
+    protected void setUp() throws Exception {
+        super.setUp();
+        ArchiveInit.init();
+    }
+    
+   	public void testReadEmptyTags() throws Exception {
+   		String uri = AutomatedBVT.baseDirectory + "CHKJ280X.jar";
+   		EJBJarFile jarfile = getArchiveFactory().openEJBJarFile(uri);
+   		EJBJar jar = jarfile.getDeploymentDescriptor();
+   		Session sess = (Session) jar.getEnterpriseBeans().get(0);
+   		Entity entity = (Entity) jar.getEnterpriseBeans().get(1);
+   		assertFalse("Value should be unset", entity.isSetReentrant());
+		assertFalse("Value should be unset", sess.isSetSessionType());
+		assertFalse("Value should be unset", sess.isSetTransactionType()); 
+}
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/TestInvalidXmlMultiplicity.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/TestInvalidXmlMultiplicity.java
new file mode 100644
index 0000000..be99a15
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/TestInvalidXmlMultiplicity.java
@@ -0,0 +1,79 @@
+/*
+ * Created on Dec 2, 2003
+ *
+ */
+package org.eclipse.jst.j2ee.archive.test;
+
+import junit.framework.TestSuite;
+import junit.textui.TestRunner;
+
+import org.eclipse.jst.j2ee.commonarchivecore.internal.WARFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.DeploymentDescriptorLoadException;
+import org.eclipse.jst.j2ee.core.tests.bvt.AutomatedBVT;
+import org.eclipse.jst.j2ee.internal.IWrappedException;
+
+
+/**
+ * @author schacher
+ */
+public class TestInvalidXmlMultiplicity extends AbstractArchiveTest {
+
+	/**
+	 * @param name
+	 */
+	public TestInvalidXmlMultiplicity(String name) {
+		super(name);
+	}
+
+	/**
+	 * Starts the application.
+	 * @param args an array of command-line arguments
+	 */
+	public static void main(java.lang.String[] args) {
+		String[] className = { "com.ibm.etools.archive.test.TestInvalidXmlMultiplicity", "-noloading" };
+		TestRunner.main(className);
+	}
+	
+	public static junit.framework.Test suite() {
+		return new TestSuite(TestInvalidXmlMultiplicity.class);
+	}
+	
+	public void test1() throws Exception {
+		String uri =  AutomatedBVT.baseDirectory + "BadJspConfig.war";
+		runTest(uri);
+	}
+	
+	public void test2() throws Exception {
+		String uri =  AutomatedBVT.baseDirectory + "BadLoginConfig.war";
+		runTest(uri);
+	}
+	
+	public void test3() throws Exception {
+		String uri =  AutomatedBVT.baseDirectory + "BadSessionConfig.war";
+		runTest(uri);
+	}
+	
+	public void runTest(String uri) throws Exception {
+		IWrappedException ex = null;
+		WARFile war = getArchiveFactory().openWARFile(uri);
+		try {
+			war.getDeploymentDescriptor();
+		} catch (DeploymentDescriptorLoadException ddex) {
+			ex = ddex;
+		}
+		assertNotNull("Exception should have been caught", ex);
+		Exception inner = ex.getNestedException();
+		
+		while (ex != null) {
+			if (inner instanceof IWrappedException) {
+				ex = (IWrappedException)inner;
+				if (ex.getNestedException() != null)
+					inner = ex.getNestedException();
+			} else 
+				ex = null;
+		}
+		
+		assertTrue("The exception should be an IllegalStateException", inner instanceof IllegalStateException);
+		war.close();
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/TestModuleClassLoading.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/TestModuleClassLoading.java
new file mode 100644
index 0000000..9ec2247
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/TestModuleClassLoading.java
@@ -0,0 +1,107 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.archive.test;
+
+import java.util.List;
+
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+import junit.textui.TestRunner;
+
+import org.eclipse.jem.java.JavaClass;
+import org.eclipse.jem.java.internal.impl.JavaClassImpl;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.CommonarchiveFactory;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.CommonarchivePackage;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.EARFile;
+import org.eclipse.jst.j2ee.core.tests.bvt.AutomatedBVT;
+
+
+public class TestModuleClassLoading extends TestCase {
+    static String testClass = "client.Subtract";
+    
+    
+    
+    /**
+     * 
+     */
+    public TestModuleClassLoading() {
+        super();
+    }
+
+    public TestModuleClassLoading(String name) {
+        super(name);
+    }
+
+	public CommonarchiveFactory getArchiveFactory() {
+		return CommonarchivePackage.eINSTANCE.getCommonarchiveFactory();
+	}
+	/**
+	 * Starts the application.
+	 * @param args an array of command-line arguments
+	 */
+	public static void main(java.lang.String[] args) {
+		String[] className = {"com.ibm.etools.archive.test.TestModuleClassLoading", "-noloading"};
+		TestRunner.main(className);
+	}
+	public static junit.framework.Test suite() {
+		return new TestSuite(TestModuleClassLoading.class);
+	}
+    public static void testAddModuleClassLoading() throws Exception {
+		String[] files = { "PROTO.ear","SEIinAnotherJar.ear", "SEIinWEB-INF_lib_jar.ear" };
+
+        if (files.length == 0) {
+            System.out.println("Usage: args specify full path to ear files.");
+        }
+        
+       // com.ibm.websphere.models.config.init.ConfigInit.init();
+        for (int i = 0; i < files.length; i++) {
+            String filename = files[i];   
+			CommonarchiveFactory factory = CommonarchiveFactory.eINSTANCE;
+
+			String in = AutomatedBVT.baseDirectory + files[i];
+            try {
+				EARFile earFile = factory.openEARFile (in);
+				System.out.println ("uri: " + earFile.getURI());
+				System.out.println("Testing " + earFile.getURI());
+                doModules(earFile);
+            } catch (Exception e) {
+                System.out.println(e);
+            }
+        }
+    }
+    
+    
+
+	public static void doModules(EARFile earFile) {
+		List modules = earFile.getModuleFiles();
+		for (int i = 0; i < modules.size(); i++) {
+			Archive module = (Archive) modules.get(i);
+			System.out.print("\tLooking for class " + testClass + " in module " + module.getURI());
+			doLoad(module, testClass);
+		}
+	} // validateModules
+
+	private static void doLoad(Archive module, String testClass) {
+		try {
+			JavaClass javaClass =
+				(JavaClass) JavaClassImpl.reflect(testClass, module.getResourceSet());
+			if (!(javaClass).isExistingType()) {
+				// This is what happens if the class can't be loaded.
+				System.out.println("- NOT FOUND - isExistingType returns false.");
+			} else {
+				System.out.println(" - found: isExistingType returns true.");
+			}
+		} catch (RuntimeException e) {
+			e.printStackTrace();
+		}
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/WARFileTests.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/WARFileTests.java
new file mode 100644
index 0000000..6c617f1
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/WARFileTests.java
@@ -0,0 +1,108 @@
+package org.eclipse.jst.j2ee.archive.test;
+
+ /*
+ * Licensed Material - Property of IBM
+ * (C) Copyright IBM Corp. 2001 - All Rights Reserved.
+ * US Government Users Restricted Rights - Use, duplication or disclosure
+ * restricted by GSA ADP Schedule Contract with IBM Corp.
+ */
+
+import java.util.List;
+
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+import junit.textui.TestRunner;
+
+import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.CommonarchiveFactory;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.CommonarchivePackage;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.File;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.ReadOnlyDirectory;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.WARFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveConstants;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.util.ArchiveUtil;
+import org.eclipse.jst.j2ee.core.tests.bvt.AutomatedBVT;
+
+/**
+ * Insert the type's description here.
+ * Creation date: (12/15/00 2:26:04 PM)
+ * @author: Administrator
+ */
+public class WARFileTests extends TestCase {
+	private final static String copyright = "(c) Copyright IBM Corporation 2001.";//$NON-NLS-1$
+/**
+ * WARFileTests constructor comment.
+ * @param name java.lang.String
+ */
+public WARFileTests(String name) {
+	super(name);
+}
+public CommonarchiveFactory getArchiveFactory() {
+	return CommonarchivePackage.eINSTANCE.getCommonarchiveFactory();
+}
+/**
+ * Starts the application.
+ * @param args an array of command-line arguments
+ */
+public static void main(java.lang.String[] args) {
+	String[] className = {"com.ibm.etools.archive.test.WARFileTests", "-noloading"};
+	TestRunner.main(className);
+}
+public static junit.framework.Test suite() {
+	return new TestSuite(WARFileTests.class);
+}
+public void testAddCopyClass() throws Exception {
+
+	WARFile aWarFile = (WARFile)getArchiveFactory().openArchive(AutomatedBVT.baseDirectory +"example2.war");
+
+	ReadOnlyDirectory sampleDirectory = getArchiveFactory().openReadOnlyDirectory(AutomatedBVT.baseDirectory +"WarTestClasses");
+
+	int initialSize = aWarFile.getClasses().size();
+
+	File aFile = sampleDirectory.getFileInSelfOrSubdirectory("com/ibm/etools/archive/test/WARFileTests.class");
+
+	aWarFile.addCopyClass(aFile);
+	assertTrue(aWarFile.getClasses().size() == initialSize+1);
+
+	String classURI = ArchiveUtil.concatUri(ArchiveConstants.WEBAPP_CLASSES_URI, aFile.getURI(), '/');
+	assertTrue(aWarFile.containsFile(classURI));
+	//System.out.println(aWarFile.getURI()+" contains class "+classURI);
+
+	aWarFile.saveAsNoReopen(AutomatedBVT.baseDirectory +"testOutput/WarTests/addCopyClass.war");
+
+}
+	
+public void testAddCopyLib() throws Exception {
+
+	WARFile aWarFile = (WARFile)getArchiveFactory().openArchive(AutomatedBVT.baseDirectory + "example2.war");
+
+	Archive lib = getArchiveFactory().openArchive(AutomatedBVT.baseDirectory + "foo.jar");
+
+	int initialSize = aWarFile.getLibs().size();
+
+	aWarFile.addCopyLib(lib);
+	assertTrue(aWarFile.getLibs().size() == initialSize+1);
+
+	String libURI = ArchiveUtil.concatUri(ArchiveConstants.WEBAPP_LIB_URI, lib.getURI(), '/');
+	assertTrue(aWarFile.containsFile(libURI));
+	//System.out.println(aWarFile.getURI()+" contains lib "+libURI);
+
+	aWarFile.saveAsNoReopen("testOutput/WarTests/addCopyLib.war");
+
+}
+	
+public void testListClassesAndLibs() throws Exception {
+
+	WARFile aWarFile = (WARFile)getArchiveFactory().openArchive(AutomatedBVT.baseDirectory + "example2.war");
+
+	List libs = aWarFile.getLibs();
+	List classes = aWarFile.getClasses();
+	List resources = aWarFile.getResources();
+//	System.out.println("WAR spec version "+aWarFile.getSpecVersion()+" detected.");
+//	System.out.println("example2.war contains "+classes.size()+ " files in classes");
+//	System.out.println("example2.war contains "+libs.size()+ " libs");
+//	System.out.println("example2.war contains "+resources.size()+ " resources");
+
+}
+	
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/testutilities/EAttributeDescriptor.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/testutilities/EAttributeDescriptor.java
new file mode 100644
index 0000000..d850078
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/testutilities/EAttributeDescriptor.java
@@ -0,0 +1,70 @@
+/*
+ * Created on May 1, 2003
+ *
+ * To change the template for this generated file go to
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+package org.eclipse.jst.j2ee.archive.testutilities;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EStructuralFeature;
+
+/**
+ * @author administrator
+ *
+ * To change the template for this generated type comment go to
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+public class EAttributeDescriptor {
+	
+	EStructuralFeature feature;
+	EClass metaClass;
+	
+	/**
+	 * 
+	 */
+	public EAttributeDescriptor(EStructuralFeature feature, EClass metaClass) {
+		this.feature = feature;
+		this.metaClass = metaClass;
+	}
+
+	/**
+	 * @return
+	 */
+	public EClass getMetaClass() {
+		return metaClass;
+	}
+
+	/**
+	 * @param class1
+	 */
+	public void setMetaClass(EClass class1) {
+		metaClass = class1;
+	}
+	
+	public boolean equals(Object object) {
+		EAttributeDescriptor o = (EAttributeDescriptor)object;
+		return o.getFeature() == getFeature() && o.getMetaClass() == getMetaClass();
+	}
+
+	public int hashCode() {
+		return feature.hashCode() ^ metaClass.hashCode();
+	}
+
+
+	/**
+	 * @return
+	 */
+	public EStructuralFeature getFeature() {
+		return feature;
+	}
+
+	/**
+	 * @param attribute
+	 */
+	public void setFeature(EAttribute attribute) {
+		this.feature = attribute;
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/testutilities/EMFAttributeFeatureGenerator.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/testutilities/EMFAttributeFeatureGenerator.java
new file mode 100644
index 0000000..90046a2
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/testutilities/EMFAttributeFeatureGenerator.java
@@ -0,0 +1,473 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.archive.testutilities;
+
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EClassifier;
+import org.eclipse.emf.ecore.EEnum;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.EcorePackage;
+import org.eclipse.emf.ecore.xml.type.XMLTypePackage;
+import org.eclipse.jem.java.internal.impl.JavaClassImpl;
+import org.eclipse.jst.j2ee.common.CommonPackage;
+import org.eclipse.jst.j2ee.ejb.EjbPackage;
+import org.eclipse.jst.j2ee.webapplication.WebapplicationPackage;
+
+public class EMFAttributeFeatureGenerator {
+	public static String avClass[];
+	protected static int count = 0;
+	protected static Random randomGenerator = new Random();
+	protected static int maxNumberOfProjectsCreated = 1000;
+	protected static Map enumMap = new HashMap();
+	protected static int paramCount;
+	protected static String[] langArray = new String[] { "EN","FR","DE","JP","CN","BR","SP"};
+	protected static int langCount = 0;  
+	protected static Map booleanMap = new HashMap();
+	protected static Map attIndex = new HashMap();
+	protected static boolean specialNumberGen = false;
+	protected static String httpArray[] = null;
+	protected static int httpArrayIndex = 0;
+	
+	public static int version;
+	public static int moduleType;
+	//static versions
+	public static final int VERSION_1_2 = 0;
+	public static final int VERSION_1_3 = 1;
+	public static final int VERSION_1_4 = 2;
+
+	public static final int APPICATION = 0;
+	public static final int APP_CLIENT = 1;
+	public static final int CONNECTOR = 2;
+	public static final int EJB = 3;
+	public static final int WEB = 4;
+	
+    public EMFAttributeFeatureGenerator() {
+        super();
+    }
+    
+    public static void resetCount() {
+    	count = 0;
+    	return;
+    }
+	public static Object createAttribute(EAttribute att, EObject obj){
+		return createAttribute(new EAttributeDescriptor(att,obj.eClass()));
+	}
+	
+	public static Object createAttribute(EAttribute att, EClass eClass){
+		return createAttribute(new EAttributeDescriptor(att,eClass));
+	}
+	
+	public static Object createAttribute(EAttribute att, EObject obj, boolean special){
+		specialNumberGen = special;
+		return createAttribute(new EAttributeDescriptor(att,obj.eClass()));
+	}
+			
+	public static Object createAttribute(EAttribute att, EObject obj,  boolean special, int ver, int modType) {
+	   specialNumberGen = special;
+	   version = ver;
+	   moduleType = modType;
+	   return createAttribute(new EAttributeDescriptor(att,obj.eClass()));
+   }
+
+    protected static Object createAttribute(EAttributeDescriptor att) {
+		EClassifier meta = att.getFeature().getEType();
+		if (meta instanceof EEnum && att.getFeature().isMany()){
+			List collection = new ArrayList();
+			collection.add(createEnum(att));
+			return collection;
+		}
+		else if (meta instanceof EEnum)
+			return createEnum(att);
+		else if ((version == VERSION_1_3 || version == VERSION_1_2) && att.getFeature().equals(WebapplicationPackage.eINSTANCE.getHTTPMethodType_HttpMethod()))
+			return createSpecialHttpMethodsFor13();
+		else if (version == VERSION_1_3 && att.getFeature().equals(CommonPackage.eINSTANCE.getEJBLocalRef_Local()))
+			return generateRandomAttributeString(new EAttributeDescriptor(CommonPackage.eINSTANCE.getEjbRef_Remote(), att.getMetaClass()));
+		else if (version == VERSION_1_3 && att.getFeature().equals(CommonPackage.eINSTANCE.getEJBLocalRef_LocalHome()))
+			return generateRandomAttributeString(new EAttributeDescriptor(CommonPackage.eINSTANCE.getEjbRef_Home(),att.getMetaClass()));
+		else if (att.getFeature().getName().equals("parms"))
+			return createParams(att);
+		else if (att.getFeature().getName().startsWith("location") && version == VERSION_1_4)
+			return createLocation(att);
+		else if (att.getFeature().getName().startsWith("locale") && version == VERSION_1_4)
+			return createLocale();
+		else if (att.getFeature().getName().equals("lang"))
+			return createLang(att);
+		else if (att.getFeature().getName().equals("version"))
+			if (att.getFeature() == EjbPackage.eINSTANCE.getContainerManagedEntity_Version()) 
+				return "2.x";
+			else
+				return createVersion(att);
+		else if (att.getFeature().getName().equals("mimeType") && version == VERSION_1_4)
+			return "text/plain";
+		else if (att.getFeature().getName().equals("errorCode") && version == VERSION_1_4)
+			return "404";
+		else if (att.getFeature().getName().equals("formLoginPage") && version == VERSION_1_4)
+			return "/testFormLoginPage";
+		else if (att.getFeature().getName().equals("formErrorPage") && version == VERSION_1_4)
+			return "/testFormErrorpage";
+		else if(att.getFeature().getName().equals("link") && version == VERSION_1_4)
+			return "roleName_0";
+		else if(att.getFeature().getName().equals("specVersion") && version == VERSION_1_4)
+			return "1.5";
+		else if (att.getFeature().isMany())
+			return createCollection(att);
+		else if (meta.getInstanceClassName().equals("java.lang.String"))
+			return  generateRandomAttributeString(att);
+		else if (meta.getInstanceClassName().equals("java.math.BigInteger"))
+			return  generateRandomBigInteger(att);
+		else if (meta.getInstanceClassName().equals("boolean"))
+			return  generateRandomBoolean(att);
+		else if (meta.getInstanceClassName().equals("java.util.List"))
+			return  createCollection(att);
+		else if(meta.getName().equals("QName")){
+			return generateRandomQName(att);
+		}
+		switch (meta.getClassifierID()) {
+			case EcorePackage.ESTRING:
+				return generateRandomAttributeString(att);
+			case EcorePackage.EBOOLEAN_OBJECT:
+			case EcorePackage.EBOOLEAN:
+				return generateRandomBoolean(att);
+			case EcorePackage.EINTEGER_OBJECT:
+			case EcorePackage.EINT:
+				return generateRandomInteger(att);
+			case EcorePackage.EBIG_INTEGER:
+				return generateRandomBigInteger(att);
+			case EcorePackage.EFLOAT_OBJECT:
+			case EcorePackage.EFLOAT:
+				return generateRandomFloat(att);
+			case EcorePackage.ECHARACTER_OBJECT:
+			case EcorePackage.ECHAR:
+				return generateRandomChar(att);
+			case EcorePackage.ELONG_OBJECT:
+			case EcorePackage.ELONG:
+			case XMLTypePackage.LONG:
+				return generateRandomLong();
+			case EcorePackage.EBYTE_OBJECT:
+			case EcorePackage.EBYTE:
+				return generateRandomByte();
+			case EcorePackage.EDOUBLE_OBJECT:
+			case EcorePackage.EDOUBLE:
+				return generateRandomDouble();
+			case EcorePackage.ESHORT_OBJECT:
+			case EcorePackage.ESHORT:
+				return generateRandomShort(att);
+			case EcorePackage.EJAVA_OBJECT:
+				return generateRandomObject(att);
+			}
+		return null;
+    }
+
+	/**
+     * @return
+     */
+    private static Object createLocale() {
+        return "en_US";
+    }
+
+    /**
+     * @param att
+     * @return
+     */
+    private static Object createLocation(EAttributeDescriptor att) {
+        String temp = generateRandomAttributeString(att);
+        return "/." + temp;
+    }
+
+    public static EObject createJavaClassProxy(EStructuralFeature ref, EObject eObject) {
+		if (avClass == null) {
+			avClass = new String[] { "java.util.HashTable", "java.util.List", "java.sql.Data", "java.lang.Integer", "java.lang.String" };
+		}
+		EAttributeDescriptor feature = new EAttributeDescriptor(ref,eObject.eClass());
+		if (!attIndex.containsKey(feature))
+			attIndex.put(feature, new Integer(0));
+		int classIndex = ((Integer)attIndex.get(feature)).intValue();
+		String name = avClass[classIndex];
+		classIndex++;
+		if (classIndex == 5)
+			classIndex = 0;
+		attIndex.put(feature,new Integer(classIndex));
+		return JavaClassImpl.createClassRef(name);
+	}
+	/**
+	 * @return
+	 */
+	protected static Object createSpecialHttpMethodsFor13() {
+		if (httpArray == null)
+			httpArray = new String[] {
+				"GET",
+				"POST",
+				"PUT",
+				"DELETE",
+				"HEAD",
+				"OPTIONS",
+				"TRACE"
+			};
+		if (httpArrayIndex >= httpArray.length)
+			httpArrayIndex = 0;
+		Object holder = httpArray[httpArrayIndex]; 	
+		httpArrayIndex++;
+		return holder;
+	}
+
+	/**
+     * @param att
+     * @return
+     */
+    protected static String createVersion(EAttributeDescriptor att) {
+		String versionHolder = "";
+		switch (moduleType) {
+		case APPICATION :
+			if(version == VERSION_1_2) {
+				versionHolder = "1.2";
+				break;
+			}
+			else if(version == VERSION_1_3){
+				versionHolder = "1.3";
+				break;
+			}
+			else if(version == VERSION_1_4){
+				versionHolder = "1.4";
+				break;
+			}
+			else {
+				versionHolder = "5.0";
+				break;
+			}
+		case APP_CLIENT :
+			if(version == VERSION_1_2) {
+				versionHolder = "1.2";
+				break;
+			}
+			else if(version == VERSION_1_3) {
+				versionHolder = "1.3";
+				break;
+			}
+			else if(version == VERSION_1_4) {
+				versionHolder = "1.4";
+				break;
+			}
+			else {
+				versionHolder = "5.0";
+				break;
+			}
+		case EJB :
+			if(version == VERSION_1_2) {
+				versionHolder = "1.1";
+				break;
+			}
+			else if(version == VERSION_1_3) {
+				versionHolder = "2.0";
+				break;
+			}
+			else if(version == VERSION_1_4) {
+				versionHolder = "2.1";
+				break;
+			}
+			else {
+				versionHolder = "3.0";
+				break;
+			}
+		case CONNECTOR :
+			if(version == VERSION_1_2) {
+				versionHolder = "1.0";
+				break;
+			}
+			else if(version == VERSION_1_3) {
+				versionHolder = "1.0";
+				break;
+			}
+			else { 
+				versionHolder = "1.5";
+				break;
+			}
+		case WEB :
+			if(version == VERSION_1_2) {
+				versionHolder = "2.2";
+				break;
+			}
+			else if(version == VERSION_1_3) {
+				versionHolder = "2.3";
+				break;
+			}
+			else if(version == VERSION_1_4) {
+				versionHolder = "2.4";
+				break;
+			}
+			else { 
+				versionHolder = "2.5";
+				break;
+			}
+		}
+		
+		return versionHolder;
+    }
+
+    protected static Object createParams(EAttributeDescriptor att) {
+		if (paramCount == 0){
+			paramCount++;
+			return null;
+		}
+		else if (paramCount == 1){
+			paramCount++;
+			return "";
+		}
+		String r = "";
+		for (int i = 1 ; i < paramCount ;i++){
+			r += generateRandomAttributeString(att) + " ";
+		}
+		paramCount++;
+		if (paramCount == 5)
+			paramCount = 0;
+		return r;
+		
+	}
+
+
+	protected static Object createLang(EAttributeDescriptor att) {
+		String name = langArray[langCount];
+		langCount++;
+		if (langCount == 7)
+			langCount = 0;
+		return name;
+	}
+
+	protected static Object createCollection(EAttributeDescriptor att) {
+		ArrayList list = new ArrayList();
+		list.add(generateRandomAttributeString(att));
+		return list;
+	}
+
+
+	protected static Object generateRandomObject(EAttributeDescriptor att) {
+	    return generateRandomAttributeString(att);
+	}
+
+	protected static Object createEnum(EAttributeDescriptor att) {
+		EEnum anEnum = (EEnum) att.getFeature().getEType();
+		if (!enumMap.containsKey(att)){
+			if (att.getFeature().getName().equals("authMethod"))
+				enumMap.put(att,new Integer(1));
+			else 
+				enumMap.put(att,new Integer(0));
+		}
+		int pos = ((Integer)enumMap.get(att)).intValue();
+		EList literals = anEnum.getELiterals();
+		int size = literals.size();
+		if (pos == size)
+			pos = 0;
+		Object holder = anEnum.getEEnumLiteral(pos).getInstance();
+		pos++;
+		enumMap.put(att,new Integer(pos));
+		return holder;
+	    
+	}
+	public static Object generateRandomClassname(EAttributeDescriptor att) {
+		return "com.foo." + generateRandomAttributeString(att);
+	}
+
+	//REVISIT
+    protected static Object generateRandomShort(EAttributeDescriptor att) {
+        return new Short(Short.parseShort(String.valueOf(generateNumber(att))));
+    }
+
+    protected static Object generateRandomDouble() {
+        return new Double(randomGenerator.nextDouble());
+    }
+	//REVISIT
+    protected static Object generateRandomByte() {
+        return new Byte("byte");
+    }
+
+    protected static Object generateRandomLong() {
+        return new Long(randomGenerator.nextLong());
+    }
+
+    protected static Object generateRandomChar(EAttributeDescriptor att) {
+        return new Character(generateRandomAttributeString(att).charAt(0));
+    }
+
+
+    protected static Object generateRandomFloat(EAttributeDescriptor att) {
+        return new Float(randomGenerator.nextFloat());
+    }
+
+    protected static Object generateRandomInteger(EAttributeDescriptor att) {
+    	return new Integer(generateNumber(att));
+    }
+    
+    protected static Object generateRandomBigInteger(EAttributeDescriptor att) {
+    	return new BigInteger(new Long(generateNumber(att)).toString());
+    }
+    
+    protected static char [] intToCharMapping = new char [] { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' };
+    protected static char [] charToIntMapping = new char [] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
+    protected static Object generateRandomQName(EAttributeDescriptor att) {
+    	char [] charArray = Integer.toString(generateNumber(att)).toCharArray();
+    	for(int i=0;i<charArray.length;i++){
+    		for(int j=0;j<charToIntMapping.length; j++){
+    			if (charArray[i] == charToIntMapping[j]){
+    				charArray[i] = intToCharMapping[j];
+    				break;
+    			}
+    		}
+    	}
+    	return new String(charArray);
+    }
+    
+    protected static Object generateRandomBoolean(EAttributeDescriptor att) {
+		if (!booleanMap.containsKey(att)){
+			booleanMap.put(att,new Boolean(true));
+		}
+		Boolean holder = (Boolean)booleanMap.get(att);
+		booleanMap.put(att, new Boolean(!holder.booleanValue()));
+		return holder;
+    }
+
+    public static String generateRandomAttributeString(EAttributeDescriptor att) {
+		return att.getFeature().getName() + "_" + generateNumber(att);
+	}
+	protected static int generateNumber(EAttributeDescriptor att) {
+		if(!specialNumberGen)
+			return count ++;
+		else{
+			if(!attIndex.containsKey(att))
+				attIndex.put(att, new Integer(0));
+			int holder = ((Integer) attIndex.get(att)).intValue();
+			attIndex.put(att, new Integer(holder+1));
+			return holder;
+		}
+	}
+
+	public static void reset(){
+		count = 0;
+		enumMap = new HashMap();
+		httpArrayIndex = 0;
+		paramCount = 0;
+		langCount = 0;  
+		booleanMap = new HashMap();
+		attIndex = new HashMap();
+		specialNumberGen = false;
+		TestUtilities.reset();
+		J2EEVersionCheck.cur_Tags = null;
+
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/testutilities/J2EEVersionCheck.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/testutilities/J2EEVersionCheck.java
new file mode 100644
index 0000000..21a089d
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/testutilities/J2EEVersionCheck.java
@@ -0,0 +1,210 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ * Created on Apr 14, 2003
+ *
+ * To change this generated comment go to 
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+package org.eclipse.jst.j2ee.archive.testutilities;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.jst.j2ee.application.ApplicationPackage;
+import org.eclipse.jst.j2ee.client.ClientPackage;
+import org.eclipse.jst.j2ee.common.CommonPackage;
+import org.eclipse.jst.j2ee.ejb.EjbPackage;
+import org.eclipse.jst.j2ee.jca.JcaPackage;
+import org.eclipse.jst.j2ee.webapplication.WebapplicationPackage;
+
+public class J2EEVersionCheck {
+	public int version;
+	//static versions
+	public static final int VERSION_1_2 = 0;
+	public static final int VERSION_1_3 = 1;
+	public static final int VERSION_1_4 = 2;
+	public static final int VERSION_5_0 = 3;
+	
+	//modules
+	public static final int APPICATION = 0;
+	public static final int APP_CLIENT = 1;
+	public static final int CONNECTOR = 2;
+	public static final int EJB = 3;
+	public static final int WEB = 4;
+
+	public static List cur_Tags;
+	private static CommonPackage COM = CommonPackage.eINSTANCE;
+
+    public J2EEVersionCheck() {
+        super();
+    }
+	public static boolean checkAttributeVersion(EAttribute att, int version, int type){
+		//TODO: Add version 1.2 excludes
+		if(version == VERSION_1_3 || version == VERSION_1_2){
+			if(cur_Tags == null){
+				cur_Tags = new ArrayList();
+				populate_1_3List(type);
+			}
+		}
+		else if(version == VERSION_1_4 || version == VERSION_5_0){
+			return true;
+		}
+		
+		if(cur_Tags.contains(att) || cur_Tags.contains(att.getEType()))
+			return false;
+		return true;
+	}
+    
+     public static boolean checkReferenceVersion(EStructuralFeature ref, int version, int type){
+		//TODO: Add version 1.2 excludes
+		if(version == VERSION_1_3 || version == VERSION_1_2){
+			if(cur_Tags == null){
+				cur_Tags = new ArrayList();
+				populate_1_3List(type);
+			}
+		}
+		else if(version == VERSION_1_4 || version == VERSION_5_0){
+			return true;
+		}
+		
+		if(cur_Tags.contains(ref) || cur_Tags.contains(ref.getEType()))
+			return false;
+		return true;
+    }
+       
+	private static void populate_1_2List(int type) {
+		switch (type) {
+			case APPICATION :
+				populate_1_2Application();
+				break;
+			case APP_CLIENT :
+				populate_1_2AppClient();
+				break;
+			case EJB :
+				populate_1_2EJB();
+				break;
+			case CONNECTOR :
+				populate_1_2EJB();
+				break;
+			case WEB :
+				populate_1_2Web();
+			default :
+				break;
+		}
+	}
+	
+	private static void populate_1_3List(int type) {
+		switch (type) {
+			case APPICATION :
+				populate_1_3Application();
+				break;
+			case APP_CLIENT :
+				populate_1_3AppClient();
+				break;
+			case EJB :
+				populate_1_3EJB();
+				break;
+			case CONNECTOR :
+				populate_1_3EJB();
+				break;
+			case WEB :
+				populate_1_3Web();
+			default :
+				break;
+		}
+	}
+
+    private static void populate_1_2Application(){
+		populate_1_3Application();
+    }
+
+	private static void populate_1_2AppClient(){
+		populate_1_3AppClient();
+	}
+	
+	private static void populate_1_2EJB(){
+		populate_1_3EJB();
+	}
+	
+	private static void populate_1_2Connector(){
+		populate_1_3Connector();
+	}
+	
+	private static void populate_1_2Web(){
+		populate_1_3Web();
+	}
+
+	//1.3
+	private static void populate_1_3Application(){
+		CommonPackage COM = CommonPackage.eINSTANCE;
+		cur_Tags.add(COM.getIconType());
+		cur_Tags.add(COM.getDisplayName());
+		cur_Tags.add(COM.getDescription());
+		cur_Tags.add(COM.getDescriptionGroup());
+		cur_Tags.add(COM.getSecurityIdentity_Descriptions());
+		cur_Tags.add(ApplicationPackage.eINSTANCE.getApplication_Version());	
+	}
+	
+	private static void populate_1_3AppClient(){
+		cur_Tags.add(COM.getIconType());
+		cur_Tags.add(COM.getDisplayName());
+		cur_Tags.add(COM.getDescription());
+		cur_Tags.add(COM.getDescriptionGroup());
+		cur_Tags.add(ClientPackage.eINSTANCE.getApplicationClient_Version());
+		cur_Tags.add(ClientPackage.eINSTANCE.getApplicationClient_ServiceRefs());
+		cur_Tags.add(ClientPackage.eINSTANCE.getApplicationClient_MessageDestinationRefs());
+		cur_Tags.add(ClientPackage.eINSTANCE.getApplicationClient_MessageDestinations());
+		cur_Tags.add(COM.getMessageDestination());
+		cur_Tags.add(COM.getMessageDestinationRef());
+		//cur_Tags.add(ClientPackage.eINSTANCE.getApplicationClient_ServiceRefs());
+	}
+	
+	private static void populate_1_3Connector(){
+		cur_Tags.add(COM.getIconType());
+		cur_Tags.add(COM.getDisplayName());
+		cur_Tags.add(COM.getDescription());
+		cur_Tags.add(COM.getDescriptionGroup());
+		cur_Tags.add(JcaPackage.eINSTANCE.getOutboundResourceAdapter());
+		cur_Tags.add(JcaPackage.eINSTANCE.getInboundResourceAdapter());
+		cur_Tags.add(JcaPackage.eINSTANCE.getAdminObject());
+		cur_Tags.add(JcaPackage.eINSTANCE.getConnector_Version());
+	}
+	
+    private static void populate_1_3EJB() {
+		cur_Tags.add(COM.getIconType());
+		cur_Tags.add(COM.getDisplayName());
+		cur_Tags.add(COM.getDescription());
+		cur_Tags.add(COM.getDescriptionGroup());
+		cur_Tags.add(EjbPackage.eINSTANCE.getEJBJar_Version());
+		cur_Tags.add(EjbPackage.eINSTANCE.getSession_ServiceEndpoint());
+		cur_Tags.add(COM.getJNDIEnvRefsGroup_MessageDestinationRefs());
+		cur_Tags.add(COM.getJNDIEnvRefsGroup_ServiceRefs());
+		cur_Tags.add(EjbPackage.eINSTANCE.getMessageDriven_MessagingType());
+		cur_Tags.add(EjbPackage.eINSTANCE.getMessageDriven_MessageDestination());
+		cur_Tags.add(EjbPackage.eINSTANCE.getMessageDriven_Link());
+		cur_Tags.add(EjbPackage.eINSTANCE.getMessageDriven_ActivationConfig());	
+    }
+
+	private static void populate_1_3Web(){
+		cur_Tags.add(COM.getIconType());
+		cur_Tags.add(COM.getDisplayName());
+		cur_Tags.add(COM.getDescription());
+		cur_Tags.add(COM.getDescriptionGroup());
+		cur_Tags.add(WebapplicationPackage.eINSTANCE.getWebApp_Version());
+		cur_Tags.add(WebapplicationPackage.eINSTANCE.getWebApp_JspConfig());
+		cur_Tags.add(WebapplicationPackage.eINSTANCE.getWebApp_MessageDestinations());
+		cur_Tags.add(WebapplicationPackage.eINSTANCE.getWebApp_LocalEncodingMappingList());
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/testutilities/TestUtilities.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/testutilities/TestUtilities.java
new file mode 100644
index 0000000..5f778ec
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/testutilities/TestUtilities.java
@@ -0,0 +1,115 @@
+/*
+ * Created on Apr 3, 2003
+ *
+ * To change the template for this generated file go to
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+package org.eclipse.jst.j2ee.archive.testutilities;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.emf.ecore.EClassifier;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+
+/**
+ * @author administrator
+ *
+ * To change the template for this generated type comment go to
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+public  class TestUtilities extends EcoreUtil {
+	private static Map objectMap = new HashMap();
+	private static Map subsetMap = new HashMap();
+
+	
+	/**
+		 * Returns the first collection member that {@link EClassifier#isInstance is an instance} of the type.
+		 * @param objects a collection of objects to check.
+		 * @param type the type of object to find.
+		 * @return the first object of the specified type.
+		 */
+		public static Object getObjectByType(Resource res, EClassifier type, boolean isMany) {
+			if (isMany)
+				return getContainedCollectionByType(res.getContents(), type);
+			else
+				return getContainedObjectByType(res.getContents(), type);
+		}
+
+		public static Object getContainedObjectByType(List list, EClassifier type) {
+			Object found;
+			found = getObjectsByType(list, type);
+			if (found != null && !((Collection)found).isEmpty())
+				return extractObject((List) found,type);
+
+			for (int i = 0; i < list.size(); i++) {
+				EObject obj = (EObject) list.get(i);
+				found = getContainedObjectByType(obj.eContents(), type);
+				if (found != null)
+					return found;
+			}
+
+			return null;
+		}
+
+		public static Object getContainedCollectionByType(List list, EClassifier type) {
+			List found;
+			found = (List)getObjectsByType(list, type);
+			if (found != null && !found.isEmpty())
+				return extractSubset(found, type);
+
+			for (int i = 0; i < list.size(); i++) {
+				EObject obj = (EObject) list.get(i);
+				found = (List) getContainedCollectionByType(obj.eContents(), type);
+				if (found != null)
+					return found;
+			}
+
+			return null;
+		
+		
+		
+		}
+	
+		public static List extractSubset(List found, EClassifier type) {
+			if (!subsetMap.containsKey(type)){
+				subsetMap.put(type,new Integer(1));
+			}
+			int pos = ((Integer)subsetMap.get(type)).intValue();
+		
+			if (pos == found.size())
+				pos = 1;
+			List result = new ArrayList();
+			for (int i = 0; i < pos; i++)
+				result.add(found.get(i));
+			pos++;
+			subsetMap.put(type,new Integer(pos));	
+		
+			return result;
+		}
+	
+		public static Object extractObject(List found, EClassifier type) {
+			if (!objectMap.containsKey(type)){
+				objectMap.put(type,new Integer(0));
+			}
+			int pos = ((Integer)objectMap.get(type)).intValue();
+		
+			if (pos == found.size())
+				pos = 0;
+			Object holder = found.get(pos);
+			pos++;
+			objectMap.put(type,new Integer(pos));	
+		
+			return holder;
+		}
+
+	public static void reset(){
+		subsetMap.clear();
+		objectMap.clear();
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/core/tests/bvt/AutomatedBVT.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/core/tests/bvt/AutomatedBVT.java
new file mode 100644
index 0000000..740689a
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/core/tests/bvt/AutomatedBVT.java
@@ -0,0 +1,68 @@
+/*
+ * Created on Apr 1, 2003
+ *
+ * To change this generated comment go to 
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+package org.eclipse.jst.j2ee.core.tests.bvt;
+
+import java.net.URL;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+import junit.textui.TestRunner;
+
+import org.eclipse.core.runtime.IPluginDescriptor;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jst.j2ee.archive.emftests.AllTests;
+
+
+/**
+ * @author jsholl
+ *
+ * To change this generated comment go to 
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+public class AutomatedBVT extends TestSuite {
+
+    public static String baseDirectory = System.getProperty("user.dir") + java.io.File.separatorChar + "commonArchiveResources" + java.io.File.separatorChar;
+    
+    static {
+        try {
+            IPluginDescriptor pluginDescriptor = Platform.getPluginRegistry().getPluginDescriptor("org.eclipse.jst.j2ee.core.tests");
+            URL url = pluginDescriptor.getInstallURL(); 
+        	AutomatedBVT.baseDirectory = Platform.asLocalURL(url).getFile() + "commonArchiveResources"+ java.io.File.separatorChar;
+		} catch (Exception e) { 
+			System.err.println("Using working directory since a workspace URL could not be located.");
+		} 
+    }
+
+    public static int unimplementedMethods;
+
+    public static void main(String[] args) {
+        unimplementedMethods = 0;
+        TestRunner.run(suite());
+        if (unimplementedMethods > 0) {
+            System.out.println("\nCalls to warnUnimpl: " + unimplementedMethods);
+        }
+    }
+
+    public AutomatedBVT() {
+        super();
+        TestSuite suite = (TestSuite) AutomatedBVT.suite();
+        for (int i = 0; i < suite.testCount(); i++) {
+            addTest(suite.testAt(i));
+        }
+    }
+
+    public static Test suite() {
+        TestSuite suite = new TestSuite("Test for org.eclipse.jst.j2ee.core.bvt");
+        //$JUnit-BEGIN$
+        //TODO: Make the Archive Test Work
+       // suite.addTest(AllArchiveTestsJava.suite());
+        suite.addTest(AllTests.suite());
+        //suite.addTest(AllJavaTestsJava.suite());
+        //$JUnit-END$
+        return suite;
+    }
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/core/tests/bvt/AutomatedBVTEclipse.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/core/tests/bvt/AutomatedBVTEclipse.java
new file mode 100644
index 0000000..9fa118a
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/core/tests/bvt/AutomatedBVTEclipse.java
@@ -0,0 +1,33 @@
+/*
+ * Created on Mar 25, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package org.eclipse.jst.j2ee.core.tests.bvt;
+
+import java.io.IOException;
+import java.net.URL;
+
+import org.eclipse.core.runtime.IPluginDescriptor;
+import org.eclipse.core.runtime.Platform;
+
+/**
+ * @author jsholl
+ *
+ * To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+public class AutomatedBVTEclipse extends AutomatedBVT {
+	
+	public AutomatedBVTEclipse(){
+		super();
+		IPluginDescriptor pluginDescriptor = Platform.getPluginRegistry().getPluginDescriptor("org.eclipse.jst.j2ee.core.tests");
+        URL url = pluginDescriptor.getInstallURL();
+        try {
+        	AutomatedBVT.baseDirectory = Platform.asLocalURL(url).getFile() + "commonArchiveResources"+ java.io.File.separatorChar;
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/emfload/LoadJaxRPCMapOutsideWorkspace.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/emfload/LoadJaxRPCMapOutsideWorkspace.java
new file mode 100644
index 0000000..9aef4fb
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/emfload/LoadJaxRPCMapOutsideWorkspace.java
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.emfload;
+
+import java.net.URL;
+import java.util.Iterator;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.runtime.IPluginDescriptor;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.emf.common.util.Diagnostic;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.resource.URIConverter;
+import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
+import org.eclipse.emf.ecore.resource.impl.URIConverterImpl;
+import org.eclipse.jst.j2ee.common.internal.impl.J2EEResourceFactoryRegistry;
+import org.eclipse.jst.j2ee.internal.J2EEInit;
+import org.eclipse.jst.j2ee.webservice.jaxrpcmap.JaxrpcmapResource;
+import org.eclipse.jst.j2ee.webservice.jaxrpcmap.JaxrpcmapResourceFactory;
+import org.eclipse.wst.common.internal.emf.resource.EMF2DOMRendererFactory;
+
+
+public class LoadJaxRPCMapOutsideWorkspace extends TestCase {
+	
+	//public static String baseDirectory = System.getProperty("user.dir")  + java.io.File.separatorChar + "testData" + java.io.File.separatorChar + "webservices" + java.io.File.separatorChar + "META-INF" + java.io.File.separatorChar;
+   
+	/**
+	 * <!-- 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 void testLoadFile() throws Exception {
+		
+		IPluginDescriptor pluginDescriptor = Platform.getPluginRegistry().getPluginDescriptor("org.eclipse.jst.j2ee.core.tests");
+        URL url = pluginDescriptor.getInstallURL(); 
+        String baseDirectory = Platform.asLocalURL(url).getFile() + "testData" + java.io.File.separatorChar + "webservices" + java.io.File.separatorChar + "META-INF" + java.io.File.separatorChar;
+		
+	// Call J2EE Init();
+		
+	J2EEInit.init();
+	// Create a resource set to hold the resources.
+	//
+	ResourceSet resourceSet = new ResourceSetImpl();
+	J2EEResourceFactoryRegistry registry = new J2EEResourceFactoryRegistry();
+	resourceSet.setResourceFactoryRegistry(registry);
+	URIConverter conv = new URIConverterImpl();
+	resourceSet.setURIConverter(conv);
+	EMF2DOMRendererFactory.INSTANCE.setValidating(false);
+	
+			URI uri = URI.createFileURI(baseDirectory + "AnnuityServices_mapping.xml");
+			registry.registerLastFileSegment(uri.lastSegment(), new JaxrpcmapResourceFactory(EMF2DOMRendererFactory.INSTANCE));
+
+			try {
+				// Demand load resource for this file.
+				//
+				JaxrpcmapResource jaxrpcmapRes = (JaxrpcmapResource)resourceSet.getResource(uri, true);
+				System.out.println("Loaded " + uri);
+				jaxrpcmapRes.getContents();
+
+			}
+			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 (Iterator i = diagnostic.getChildren().iterator(); i.hasNext(); ) {
+		printDiagnostic((Diagnostic)i.next(), indent + "  ");
+	}
+}
+	}
+
+
+
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/emfload/LoadWebServicesOutsideWorkspace.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/emfload/LoadWebServicesOutsideWorkspace.java
new file mode 100644
index 0000000..b518a64
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/emfload/LoadWebServicesOutsideWorkspace.java
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.emfload;
+
+import java.util.Iterator;
+
+import junit.framework.TestCase;
+
+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.URIConverter;
+import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
+import org.eclipse.emf.ecore.resource.impl.URIConverterImpl;
+import org.eclipse.emf.ecore.util.Diagnostician;
+import org.eclipse.jst.j2ee.common.internal.impl.J2EEResourceFactoryRegistry;
+import org.eclipse.jst.j2ee.internal.J2EEInit;
+
+
+public class LoadWebServicesOutsideWorkspace extends TestCase {
+	public static String baseDirectory = System.getProperty("user.dir")  + java.io.File.separatorChar + "testData" + java.io.File.separatorChar + "webservices" + java.io.File.separatorChar + "META-INF" + java.io.File.separatorChar;
+   
+	/**
+	 * <!-- 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 void testLoadFile() throws Exception {
+		
+	// Call J2EE Init();
+		
+	J2EEInit.init();
+	// Create a resource set to hold the resources.
+	//
+	ResourceSet resourceSet = new ResourceSetImpl();
+	resourceSet.setResourceFactoryRegistry(new J2EEResourceFactoryRegistry());
+	URIConverter conv = new URIConverterImpl();
+	resourceSet.setURIConverter(conv);
+	
+			URI uri = URI.createFileURI(baseDirectory + "webservices.xml");
+
+			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 (Iterator j = resource.getContents().iterator(); j.hasNext(); ) {
+					EObject eObject = (EObject)j.next();
+					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 (Iterator i = diagnostic.getChildren().iterator(); i.hasNext(); ) {
+		printDiagnostic((Diagnostic)i.next(), indent + "  ");
+	}
+}
+	}
+
+
+
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/application/test/ApplicationFactoryTest.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/application/test/ApplicationFactoryTest.java
new file mode 100644
index 0000000..eaba86b
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/application/test/ApplicationFactoryTest.java
@@ -0,0 +1,76 @@
+package org.eclipse.jst.j2ee.application.test;
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.eclipse.jst.j2ee.application.Application;
+import org.eclipse.jst.j2ee.application.ApplicationFactory;
+import org.eclipse.jst.j2ee.application.ApplicationPackage;
+import org.eclipse.jst.j2ee.application.ConnectorModule;
+import org.eclipse.jst.j2ee.application.EjbModule;
+import org.eclipse.jst.j2ee.application.JavaClientModule;
+import org.eclipse.jst.j2ee.application.Module;
+import org.eclipse.jst.j2ee.application.WebModule;
+
+public class ApplicationFactoryTest extends TestCase {
+
+	 public static Test suite(){
+        return new TestSuite(ApplicationFactoryTest.class);
+    }
+	  
+    public ApplicationFactory getInstance() {
+        return ApplicationPackage.eINSTANCE.getApplicationFactory();
+    }
+
+   
+    public void test_createApplication() {
+
+        ApplicationFactory objApplicationFactory = getInstance();
+        Application retValue = null;
+        retValue = objApplicationFactory.createApplication();
+        assertNotNull(retValue);
+    }
+
+    public void test_createModule() {
+
+        ApplicationFactory objApplicationFactory = getInstance();
+        Module retValue = null;
+        retValue = objApplicationFactory.createModule();
+        assertNotNull(retValue);
+    }
+
+    public void test_createWebModule() {
+
+        ApplicationFactory objApplicationFactory = getInstance();
+        WebModule retValue = null;
+        retValue = objApplicationFactory.createWebModule();
+        assertNotNull(retValue);
+    }
+
+    public void test_createJavaClientModule() {
+
+        ApplicationFactory objApplicationFactory = getInstance();
+        JavaClientModule retValue = null;
+        retValue = objApplicationFactory.createJavaClientModule();
+        assertNotNull(retValue);
+    }
+
+    public void test_createEjbModule() {
+
+        ApplicationFactory objApplicationFactory = getInstance();
+        EjbModule retValue = null;
+        retValue = objApplicationFactory.createEjbModule();
+        assertNotNull(retValue);
+    }
+
+    public void test_createConnectorModule() {
+
+        ApplicationFactory objApplicationFactory = getInstance();
+        ConnectorModule retValue = null;
+        retValue = objApplicationFactory.createConnectorModule();
+        assertNotNull(retValue);
+    }
+
+    
+    
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/application/test/ApplicationTest.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/application/test/ApplicationTest.java
new file mode 100644
index 0000000..0228cb5
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/application/test/ApplicationTest.java
@@ -0,0 +1,247 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.application.test;
+import java.io.FileNotFoundException;
+
+import junit.framework.TestSuite;
+
+import org.eclipse.jst.j2ee.application.Application;
+import org.eclipse.jst.j2ee.application.ApplicationFactory;
+import org.eclipse.jst.j2ee.application.ApplicationPackage;
+import org.eclipse.jst.j2ee.application.ApplicationResource;
+import org.eclipse.jst.j2ee.application.Module;
+import org.eclipse.jst.j2ee.archive.emftests.EarEMFTest;
+import org.eclipse.jst.j2ee.archive.testutilities.EMFAttributeFeatureGenerator;
+import org.eclipse.jst.j2ee.common.CommonFactory;
+import org.eclipse.jst.j2ee.common.CommonPackage;
+import org.eclipse.jst.j2ee.common.SecurityRole;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.DuplicateObjectException;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.ResourceLoadException;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+
+public class ApplicationTest extends EarEMFTest {
+
+	 private static final CommonFactory COMMONFACTORY = CommonPackage.eINSTANCE.getCommonFactory();
+	 public ApplicationFactory getInstance() {
+        return ApplicationPackage.eINSTANCE.getApplicationFactory();
+    }
+    /**
+	 * @param name
+	 */
+	public ApplicationTest(String name) {
+		super(name);
+	}
+	
+	private void init() throws DuplicateObjectException, ResourceLoadException, FileNotFoundException {
+		EMFAttributeFeatureGenerator.reset();
+        createEAR();
+	}
+
+	public void test_containsSecurityRole() {
+		
+        Application objApplication = getInstance().createApplication();
+        String name ="role1" ;
+        String name2 ="role2" ;
+        boolean retValue = false;
+        retValue = objApplication.containsSecurityRole(name);
+        assertEquals(retValue, false) ;
+        SecurityRole role = COMMONFACTORY.createSecurityRole();
+		role.setRoleName(name);
+        objApplication.getSecurityRoles().add(role);
+        retValue = objApplication.containsSecurityRole(name);
+        assertEquals(retValue, true) ;
+        retValue = objApplication.containsSecurityRole(name2);
+        assertEquals(retValue, false) ;
+       
+    }
+
+  /* public void test_getModule() {
+
+        Application objApplication = getInstance().createApplication();
+        String uri = "";
+        Module retValue = null;
+        retValue = objApplication.getModule(uri);
+    }*/
+
+    public void test_getModule_2() {
+
+        Application objApplication = getInstance().createApplication();
+        Module module = getInstance().createModule();
+        String uri = "uri1";
+        String altDD = "altDD1";
+        module.setUri(uri);
+        module.setAltDD(altDD);
+        objApplication.getModules().add(module);
+        Module retValue = null;
+        retValue = objApplication.getModule(uri, altDD);
+        assertEquals(module,retValue);
+    }
+
+    public void test_getFirstModule() {
+
+    	 Application objApplication = getInstance().createApplication();
+         Module module = getInstance().createModule();
+         Module module2 = getInstance().createModule();
+         Module module3 = getInstance().createModule();
+         String uri = "uri1";
+         String uri2 = "uri2" ;
+         String altDD = "altDD1";
+         String altDD2 = "altDD2" ;
+         
+         module.setUri(uri);
+         module.setAltDD(altDD);
+         
+         module2.setUri(uri2);
+         module2.setAltDD(altDD2);
+         
+         module3.setUri(uri2);
+         module3.setAltDD(altDD);
+         
+         objApplication.getModules().add(module);
+         objApplication.getModules().add(module2);
+         objApplication.getModules().add(module3);
+         Module retValue = null;
+         retValue = objApplication.getFirstModule(uri2);
+         assertEquals(module2,retValue);
+         
+    }
+
+    public void test_getModuleHavingAltDD() {
+
+    	 Application objApplication = getInstance().createApplication();
+         Module module = getInstance().createModule();
+         String uri = "uri1";
+         String altDD = "altDD1";
+         module.setUri(uri);
+         module.setAltDD(altDD);
+         objApplication.getModules().add(module);
+         Module retValue = null;
+         retValue = objApplication.getModuleHavingAltDD(altDD);
+         assertEquals(module,retValue);
+    }
+
+    public void test_getSecurityRoleNamed() {
+
+    	 Application objApplication = getInstance().createApplication();
+         String name ="role1" ;
+         String name2 ="role2" ;
+         SecurityRole retValue = null;
+         retValue = objApplication.getSecurityRoleNamed(name);
+         assertNull(retValue);
+         SecurityRole role = COMMONFACTORY.createSecurityRole();
+ 		 role.setRoleName(name);
+         objApplication.getSecurityRoles().add(role);
+         retValue = objApplication.getSecurityRoleNamed(name);
+         assertEquals(retValue, role) ;
+         retValue = objApplication.getSecurityRoleNamed(name2);
+         assertNull(retValue);
+        
+    }
+
+  /*  public void test_isVersion1_2Descriptor() {
+
+        Application objApplication = getInstance().createApplication();
+        boolean retValue = false;
+        retValue = objApplication.isVersion1_2Descriptor();
+    }
+
+    public void test_isVersion1_3Descriptor() {
+
+        Application objApplication = getInstance().createApplication();
+        boolean retValue = false;
+        retValue = objApplication.isVersion1_3Descriptor();
+    }*/
+
+ /*   public void test_getVersion() {
+
+        Application objApplication = getInstance().createApplication();
+        String retValue = "";
+        retValue = objApplication.getVersion();
+    }*/
+
+    public void test_getVersionID() throws Exception {
+        init();
+    	ApplicationResource DD = (ApplicationResource) earFile.getDeploymentDescriptorResource();
+        DD.setVersionID(J2EEVersionConstants.J2EE_1_4_ID);
+		setVersion(VERSION_1_4);
+		setModuleType(APPLICATION);
+		populateRoot(DD.getRootObject());
+        int retValue = 0;
+        retValue = DD.getApplication().getVersionID();
+        assertEquals(retValue,J2EEVersionConstants.VERSION_1_4);
+        DD.setVersionID(J2EEVersionConstants.J2EE_1_3_ID);
+		setVersion(VERSION_1_3);
+		retValue = DD.getApplication().getVersionID();
+	    assertEquals(retValue,J2EEVersionConstants.VERSION_1_3);
+	    DD.setVersionID(J2EEVersionConstants.J2EE_1_2_ID);
+		setVersion(VERSION_1_2);
+		retValue = DD.getApplication().getVersionID();
+	    assertEquals(retValue,J2EEVersionConstants.VERSION_1_2);  
+    }
+
+    public void test_getJ2EEVersionID() throws IllegalStateException, ResourceLoadException, DuplicateObjectException, FileNotFoundException {
+
+    	init();
+     	ApplicationResource DD = (ApplicationResource) earFile.getDeploymentDescriptorResource();
+        DD.setVersionID(J2EEVersionConstants.J2EE_1_4_ID);
+ 		setVersion(VERSION_1_4);
+ 		setModuleType(APPLICATION);
+ 		populateRoot(DD.getRootObject());
+        int retValue = 0;
+        retValue = DD.getApplication().getJ2EEVersionID();
+        assertEquals(retValue,J2EEVersionConstants.VERSION_1_4);
+        DD.setVersionID(J2EEVersionConstants.J2EE_1_3_ID);
+ 		setVersion(VERSION_1_3);
+ 		retValue = DD.getApplication().getJ2EEVersionID();
+ 	    assertEquals(retValue,J2EEVersionConstants.VERSION_1_3);
+ 	    DD.setVersionID(J2EEVersionConstants.J2EE_1_2_ID);
+ 		setVersion(VERSION_1_2);
+ 		retValue = DD.getApplication().getJ2EEVersionID();
+ 	    assertEquals(retValue,J2EEVersionConstants.VERSION_1_2);  
+ 	    
+        
+    }
+
+  /*  public void test_setVersion() {
+
+        Application objApplication = getInstance().createApplication();
+        String newVersion = "";
+        objApplication.setVersion(newVersion);
+    }
+
+    public void test_getSecurityRoles() {
+
+        Application objApplication = getInstance().createApplication();
+        EList retValue = null;
+        retValue = objApplication.getSecurityRoles();
+    }
+
+    public void test_getModules() {
+
+        Application objApplication = getInstance().createApplication();
+        EList retValue = null;
+        retValue = objApplication.getModules();
+    }*/
+    
+    public static junit.framework.Test suite() {
+		TestSuite suite = new TestSuite();
+		suite.addTest(new ApplicationTest("test_getVersionID"));
+		suite.addTest(new ApplicationTest("test_getJ2EEVersionID"));
+		
+		suite.addTest(new ApplicationTest("test_getSecurityRoleNamed"));
+		suite.addTest(new ApplicationTest("test_getModuleHavingAltDD"));
+		suite.addTest(new ApplicationTest("test_containsSecurityRole"));
+		suite.addTest(new ApplicationTest("test_getModule_2"));
+		suite.addTest(new ApplicationTest("test_getFirstModule"));
+		return suite;
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/client/test/ApplicationClientTest.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/client/test/ApplicationClientTest.java
new file mode 100644
index 0000000..7fe3416
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/client/test/ApplicationClientTest.java
@@ -0,0 +1,185 @@
+package org.eclipse.jst.j2ee.client.test;
+
+import java.io.FileNotFoundException;
+
+import junit.framework.TestSuite;
+
+import org.eclipse.jst.j2ee.archive.emftests.AppClientEMFTest;
+import org.eclipse.jst.j2ee.archive.testutilities.EMFAttributeFeatureGenerator;
+import org.eclipse.jst.j2ee.client.ApplicationClient;
+import org.eclipse.jst.j2ee.client.ApplicationClientResource;
+import org.eclipse.jst.j2ee.client.ClientPackage;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.DuplicateObjectException;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.ResourceLoadException;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+
+public class ApplicationClientTest extends AppClientEMFTest {
+
+	/**
+	 * @param name
+	 */
+	public ApplicationClientTest(String name) {
+		super(name);
+		
+	}
+	private void init() throws DuplicateObjectException, ResourceLoadException, FileNotFoundException {
+		EMFAttributeFeatureGenerator.reset();
+        createEAR();
+        createAppClient();
+	}
+	private ApplicationClient getInstance() {
+		return ClientPackage.eINSTANCE.getClientFactory().createApplicationClient();
+	}
+  
+  
+    public static junit.framework.Test suite() {
+		TestSuite suite = new TestSuite();
+		suite.addTest(new ApplicationClientTest("test_getVersionID"));
+		suite.addTest(new ApplicationClientTest("test_getJ2EEVersionID"));
+		
+		suite.addTest(new ApplicationClientTest("test_getCallbackHandlerClassName"));
+		suite.addTest(new ApplicationClientTest("test_setCallbackHandlerClassName"));
+		return suite;
+	}
+
+
+    public void test_getCallbackHandlerClassName() {
+        ApplicationClient objApplicationClient = getInstance();
+        String callBackHandlerName = "TestCallBackHandlerName" ;
+        objApplicationClient.setCallbackHandlerClassName(callBackHandlerName);
+        
+        String retValue = "";
+        retValue = objApplicationClient.getCallbackHandlerClassName();
+        assertEquals(callBackHandlerName, retValue);
+    }
+
+    public void test_setCallbackHandlerClassName() {
+
+    	ApplicationClient objApplicationClient = getInstance();
+        String callBackHandlerName = "TestCallBackHandlerName" ;
+        objApplicationClient.setCallbackHandlerClassName(callBackHandlerName);
+        
+        String retValue = "";
+        retValue = objApplicationClient.getCallbackHandlerClassName();
+        assertEquals(callBackHandlerName, retValue);
+    }
+
+    public void test_getVersionID() throws Exception {
+    	init();
+    	ApplicationClientResource DD = (ApplicationClientResource) appClientFile.getDeploymentDescriptorResource();
+        DD.setVersionID(J2EEVersionConstants.J2EE_1_4_ID);
+		setVersion(VERSION_1_4);
+		setModuleType(APP_CLIENT);
+		populateRoot(DD.getRootObject());
+        int retValue = 0;
+        retValue = DD.getApplicationClient().getVersionID();
+        assertEquals(retValue,J2EEVersionConstants.VERSION_1_4);
+        DD.setVersionID(J2EEVersionConstants.J2EE_1_3_ID);
+		setVersion(VERSION_1_3);
+		retValue = DD.getApplicationClient().getVersionID();
+	    assertEquals(retValue,J2EEVersionConstants.VERSION_1_3);
+	    DD.setVersionID(J2EEVersionConstants.J2EE_1_2_ID);
+		setVersion(VERSION_1_2);
+		retValue = DD.getApplicationClient().getVersionID();
+	    assertEquals(retValue,J2EEVersionConstants.VERSION_1_2);
+        
+    }
+
+    public void test_getJ2EEVersionID() throws Exception {
+    	init();
+    	ApplicationClientResource DD = (ApplicationClientResource) appClientFile.getDeploymentDescriptorResource();
+        DD.setVersionID(J2EEVersionConstants.J2EE_1_4_ID);
+		setVersion(VERSION_1_4);
+		setModuleType(APP_CLIENT);
+		populateRoot(DD.getRootObject());
+        int retValue = 0;
+        retValue = DD.getApplicationClient().getJ2EEVersionID();
+        assertEquals(retValue,J2EEVersionConstants.VERSION_1_4);
+        DD.setVersionID(J2EEVersionConstants.J2EE_1_3_ID);
+		setVersion(VERSION_1_3);
+		retValue = DD.getApplicationClient().getJ2EEVersionID();
+	    assertEquals(retValue,J2EEVersionConstants.VERSION_1_3);
+	    DD.setVersionID(J2EEVersionConstants.J2EE_1_2_ID);
+		setVersion(VERSION_1_2);
+		retValue = DD.getApplicationClient().getJ2EEVersionID();
+	    assertEquals(retValue,J2EEVersionConstants.VERSION_1_2);
+    }
+
+ /*   public void test_getVersion() {
+
+        ApplicationClient objApplicationClient = getInstance();
+        String retValue = "";
+        retValue = objApplicationClient.getVersion();
+    }
+
+    public void test_setVersion() {
+
+        ApplicationClient objApplicationClient = getInstance();
+        String newVersion = "";
+        objApplicationClient.setVersion(newVersion);
+    }*/
+
+    /*public void test_getResourceRefs() {
+
+        ApplicationClient objApplicationClient = getInstance();
+        EList retValue = null;
+        retValue = objApplicationClient.getResourceRefs();
+    }
+*/
+   /* public void test_getEnvironmentProps() {
+
+        ApplicationClient objApplicationClient = getInstance();
+        EList retValue = null;
+        retValue = objApplicationClient.getEnvironmentProps();
+    }*/
+
+  /*  public void test_getEjbReferences() {
+
+        ApplicationClient objApplicationClient = getInstance();
+        EList retValue = null;
+        retValue = objApplicationClient.getEjbReferences();
+    }*/
+
+  /*  public void test_getResourceEnvRefs() {
+
+        ApplicationClient objApplicationClient = getInstance();
+        EList retValue = null;
+        retValue = objApplicationClient.getResourceEnvRefs();
+    }*/
+
+   /* public void test_getCallbackHandler() {
+
+        ApplicationClient objApplicationClient = getInstance();
+        JavaClass retValue = null;
+        retValue = objApplicationClient.getCallbackHandler();
+    }*/
+
+   /* public void test_setCallbackHandler() {
+
+        ApplicationClient objApplicationClient = getInstance();
+        JavaClass newCallbackHandler = null;
+        objApplicationClient.setCallbackHandler(newCallbackHandler);
+    }*/
+
+  /*  public void test_getServiceRefs() {
+
+        ApplicationClient objApplicationClient = getInstance();
+        EList retValue = null;
+        retValue = objApplicationClient.getServiceRefs();
+    }
+
+    public void test_getMessageDestinationRefs() {
+
+        ApplicationClient objApplicationClient = getInstance();
+        EList retValue = null;
+        retValue = objApplicationClient.getMessageDestinationRefs();
+    }
+
+    public void test_getMessageDestinations() {
+
+        ApplicationClient objApplicationClient = getInstance();
+        EList retValue = null;
+        retValue = objApplicationClient.getMessageDestinations();
+    }*/
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/client/test/ClientFactoryTest.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/client/test/ClientFactoryTest.java
new file mode 100644
index 0000000..42541d2
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/client/test/ClientFactoryTest.java
@@ -0,0 +1,37 @@
+package org.eclipse.jst.j2ee.client.test;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.eclipse.jst.j2ee.client.ApplicationClient;
+import org.eclipse.jst.j2ee.client.ClientFactory;
+import org.eclipse.jst.j2ee.client.ClientPackage;
+
+public class ClientFactoryTest extends TestCase {
+
+	private ClientFactory getInstance() {
+		return ClientPackage.eINSTANCE.getClientFactory();
+	}
+    public void test_ClientFactory() {
+        ClientFactory tmpClientFactory = getInstance();
+        assertNotNull(tmpClientFactory);
+    }
+
+   
+    public void test_createApplicationClient() {
+
+        ClientFactory objClientFactory = getInstance();
+        ApplicationClient retValue = null;
+        retValue = objClientFactory.createApplicationClient();
+        assertNotNull(retValue);
+    }
+
+	/**
+	 * @return
+	 */
+	public static Test suite() {
+		return new TestSuite(ClientFactoryTest.class);
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/test/CommonFactoryTest.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/test/CommonFactoryTest.java
new file mode 100644
index 0000000..192869c
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/test/CommonFactoryTest.java
@@ -0,0 +1,218 @@
+package org.eclipse.jst.j2ee.common.test;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.eclipse.jst.j2ee.common.CommonFactory;
+import org.eclipse.jst.j2ee.common.CommonPackage;
+import org.eclipse.jst.j2ee.common.CompatibilityDescriptionGroup;
+import org.eclipse.jst.j2ee.common.Description;
+import org.eclipse.jst.j2ee.common.DescriptionGroup;
+import org.eclipse.jst.j2ee.common.DisplayName;
+import org.eclipse.jst.j2ee.common.EJBLocalRef;
+import org.eclipse.jst.j2ee.common.EjbRef;
+import org.eclipse.jst.j2ee.common.EnvEntry;
+import org.eclipse.jst.j2ee.common.IconType;
+import org.eclipse.jst.j2ee.common.Identity;
+import org.eclipse.jst.j2ee.common.Listener;
+import org.eclipse.jst.j2ee.common.MessageDestination;
+import org.eclipse.jst.j2ee.common.MessageDestinationRef;
+import org.eclipse.jst.j2ee.common.ParamValue;
+import org.eclipse.jst.j2ee.common.QName;
+import org.eclipse.jst.j2ee.common.ResourceEnvRef;
+import org.eclipse.jst.j2ee.common.ResourceRef;
+import org.eclipse.jst.j2ee.common.RunAsSpecifiedIdentity;
+import org.eclipse.jst.j2ee.common.SecurityIdentity;
+import org.eclipse.jst.j2ee.common.SecurityRole;
+import org.eclipse.jst.j2ee.common.SecurityRoleRef;
+import org.eclipse.jst.j2ee.common.UseCallerIdentity;
+
+public class CommonFactoryTest extends TestCase {
+
+	private CommonFactory getInstance() {
+		return CommonPackage.eINSTANCE.getCommonFactory();
+	}
+	
+    public void test_CommonFactory() {
+
+        CommonFactory tmpCommonFactory =getInstance();
+    }
+
+   
+   public void test_createEjbRef() {
+
+        CommonFactory objCommonFactory =getInstance();
+        EjbRef retValue = null;
+        retValue = objCommonFactory.createEjbRef();
+        assertNotNull(retValue);
+    }
+
+    public void test_createEnvEntry() {
+
+        CommonFactory objCommonFactory =getInstance();
+        EnvEntry retValue = null;
+        retValue = objCommonFactory.createEnvEntry();
+        assertNotNull(retValue);
+    }
+
+    public void test_createResourceRef() {
+
+        CommonFactory objCommonFactory =getInstance();
+        ResourceRef retValue = null;
+        retValue = objCommonFactory.createResourceRef();
+        assertNotNull(retValue);
+    }
+
+    public void test_createSecurityRoleRef() {
+
+        CommonFactory objCommonFactory =getInstance();
+        SecurityRoleRef retValue = null;
+        retValue = objCommonFactory.createSecurityRoleRef();
+        assertNotNull(retValue);
+    }
+
+    public void test_createSecurityRole() {
+
+        CommonFactory objCommonFactory =getInstance();
+        SecurityRole retValue = null;
+        retValue = objCommonFactory.createSecurityRole();
+        assertNotNull(retValue);
+    }
+
+    public void test_createResourceEnvRef() {
+
+        CommonFactory objCommonFactory =getInstance();
+        ResourceEnvRef retValue = null;
+        retValue = objCommonFactory.createResourceEnvRef();
+        assertNotNull(retValue);
+    }
+
+    public void test_createEJBLocalRef() {
+
+        CommonFactory objCommonFactory =getInstance();
+        EJBLocalRef retValue = null;
+        retValue = objCommonFactory.createEJBLocalRef();
+        assertNotNull(retValue);
+    }
+
+    public void test_createRunAsSpecifiedIdentity() {
+
+        CommonFactory objCommonFactory =getInstance();
+        RunAsSpecifiedIdentity retValue = null;
+        retValue = objCommonFactory.createRunAsSpecifiedIdentity();
+        assertNotNull(retValue);
+    }
+
+    public void test_createIdentity() {
+
+        CommonFactory objCommonFactory =getInstance();
+        Identity retValue = null;
+        retValue = objCommonFactory.createIdentity();
+        assertNotNull(retValue);
+    }
+
+    public void test_createIconType() {
+
+        CommonFactory objCommonFactory =getInstance();
+        IconType retValue = null;
+        retValue = objCommonFactory.createIconType();
+        assertNotNull(retValue);
+    }
+
+    public void test_createDisplayName() {
+
+        CommonFactory objCommonFactory =getInstance();
+        DisplayName retValue = null;
+        retValue = objCommonFactory.createDisplayName();
+        assertNotNull(retValue);
+    }
+
+    public void test_createMessageDestinationRef() {
+
+        CommonFactory objCommonFactory =getInstance();
+        MessageDestinationRef retValue = null;
+        retValue = objCommonFactory.createMessageDestinationRef();
+        assertNotNull(retValue);
+    }
+
+    public void test_createMessageDestination() {
+
+        CommonFactory objCommonFactory =getInstance();
+        MessageDestination retValue = null;
+        retValue = objCommonFactory.createMessageDestination();
+        assertNotNull(retValue);
+    }
+
+    public void test_createParamValue() {
+
+        CommonFactory objCommonFactory =getInstance();
+        ParamValue retValue = null;
+        retValue = objCommonFactory.createParamValue();
+        assertNotNull(retValue);
+    }
+
+    public void test_createDescriptionGroup() {
+
+        CommonFactory objCommonFactory =getInstance();
+        DescriptionGroup retValue = null;
+        retValue = objCommonFactory.createDescriptionGroup();
+        assertNotNull(retValue);
+    }
+
+    public void test_createSecurityIdentity() {
+
+        CommonFactory objCommonFactory =getInstance();
+        SecurityIdentity retValue = null;
+        retValue = objCommonFactory.createSecurityIdentity();
+        assertNotNull(retValue);
+    }
+
+    public void test_createUseCallerIdentity() {
+
+        CommonFactory objCommonFactory =getInstance();
+        UseCallerIdentity retValue = null;
+        retValue = objCommonFactory.createUseCallerIdentity();
+        assertNotNull(retValue);
+    }
+
+    public void test_createDescription() {
+
+        CommonFactory objCommonFactory =getInstance();
+        Description retValue = null;
+        retValue = objCommonFactory.createDescription();
+        assertNotNull(retValue);
+    }
+
+    public void test_createQName() {
+
+        CommonFactory objCommonFactory =getInstance();
+        QName retValue = null;
+        retValue = objCommonFactory.createQName();
+        assertNotNull(retValue);
+    }
+
+    public void test_createListener() {
+
+        CommonFactory objCommonFactory =getInstance();
+        Listener retValue = null;
+        retValue = objCommonFactory.createListener();
+        assertNotNull(retValue);
+    }
+
+    public void test_createCompatibilityDescriptionGroup() {
+
+        CommonFactory objCommonFactory =getInstance();
+        CompatibilityDescriptionGroup retValue = null;
+        retValue = objCommonFactory.createCompatibilityDescriptionGroup();
+        assertNotNull(retValue);
+    }
+ 
+    
+    /**
+	 * @return
+	 */
+	public static Test suite() {
+		return new TestSuite(CommonFactoryTest.class);
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/test/CompatibilityDescriptionGroupTest.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/test/CompatibilityDescriptionGroupTest.java
new file mode 100644
index 0000000..92d76f6
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/test/CompatibilityDescriptionGroupTest.java
@@ -0,0 +1,99 @@
+package org.eclipse.jst.j2ee.common.test;
+
+import junit.framework.TestCase;
+
+import org.eclipse.jst.j2ee.common.CommonFactory;
+import org.eclipse.jst.j2ee.common.CompatibilityDescriptionGroup;
+
+public class CompatibilityDescriptionGroupTest extends TestCase {
+
+	private CompatibilityDescriptionGroup getInstance() {
+		return CommonFactory.eINSTANCE.createCompatibilityDescriptionGroup();
+	}
+	
+  /*  public void test_getSmallIcon() {
+        CompatibilityDescriptionGroup objCompatibilityDescriptionGroup = getInstance();
+        String retValue = "";
+        retValue = objCompatibilityDescriptionGroup.getSmallIcon();
+    }
+
+    public void test_setSmallIcon() {
+
+        CompatibilityDescriptionGroup objCompatibilityDescriptionGroup =  getInstance();
+        String newSmallIcon = "";
+        objCompatibilityDescriptionGroup.setSmallIcon(newSmallIcon);
+    } */
+
+   /* public void test_setSmallIconGen() {
+
+        CompatibilityDescriptionGroup objCompatibilityDescriptionGroup =  getInstance();
+        String newSmallIcon = "";
+        objCompatibilityDescriptionGroup.setSmallIconGen(newSmallIcon);
+    }*/
+
+  /*  public void test_getLargeIcon() {
+
+        CompatibilityDescriptionGroup objCompatibilityDescriptionGroup =  getInstance();
+        String retValue = "";
+        retValue = objCompatibilityDescriptionGroup.getLargeIcon();
+    }
+
+    public void test_setLargeIcon() {
+
+        CompatibilityDescriptionGroup objCompatibilityDescriptionGroup =  getInstance();
+        String newLargeIcon = "";
+        objCompatibilityDescriptionGroup.setLargeIcon(newLargeIcon);
+    } */
+
+   /*public void test_setLargeIconGen() {
+
+        CompatibilityDescriptionGroup objCompatibilityDescriptionGroup =  getInstance();
+        String newLargeIcon = "";
+        objCompatibilityDescriptionGroup.setLargeIconGen(newLargeIcon);
+    }*/
+
+   /* public void test_getDescription() {
+
+        CompatibilityDescriptionGroup objCompatibilityDescriptionGroup =  getInstance();
+        String retValue = "";
+        retValue = objCompatibilityDescriptionGroup.getDescription();
+    }
+
+    public void test_setDescription() {
+
+        CompatibilityDescriptionGroup objCompatibilityDescriptionGroup =  getInstance();
+        String newDescription = "";
+        objCompatibilityDescriptionGroup.setDescription(newDescription);
+    }
+*/
+   
+   /* public void test_setDescriptionGen() {
+
+        CompatibilityDescriptionGroup objCompatibilityDescriptionGroup =  getInstance();
+        String newDescription = "";
+        objCompatibilityDescriptionGroup.setDescriptionGen(newDescription);
+    }*/
+
+    /* public void test_getDisplayName() {
+
+        CompatibilityDescriptionGroup objCompatibilityDescriptionGroup =  getInstance();
+        String retValue = "";
+        retValue = objCompatibilityDescriptionGroup.getDisplayName();
+    }
+
+    public void test_setDisplayName() {
+
+        CompatibilityDescriptionGroup objCompatibilityDescriptionGroup =  getInstance();
+        String newDisplayName = "";
+        objCompatibilityDescriptionGroup.setDisplayName(newDisplayName);
+    }*/
+
+   /*public void test_setDisplayNameGen() {
+
+        CompatibilityDescriptionGroup objCompatibilityDescriptionGroup =  getInstance();
+        String newDisplayName = "";
+        objCompatibilityDescriptionGroup.setDisplayNameGen(newDisplayName);
+    }*/
+
+   
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/test/EjbRefTest.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/test/EjbRefTest.java
new file mode 100644
index 0000000..1110ade
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/test/EjbRefTest.java
@@ -0,0 +1,257 @@
+package org.eclipse.jst.j2ee.common.test;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.eclipse.jst.j2ee.common.CommonFactory;
+import org.eclipse.jst.j2ee.common.CommonPackage;
+import org.eclipse.jst.j2ee.common.EJBLocalRef;
+import org.eclipse.jst.j2ee.common.EjbRef;
+import org.eclipse.jst.j2ee.ejb.AssemblyDescriptor;
+import org.eclipse.jst.j2ee.ejb.EJBJar;
+import org.eclipse.jst.j2ee.ejb.EjbFactory;
+import org.eclipse.jst.j2ee.ejb.EjbPackage;
+import org.eclipse.jst.j2ee.ejb.EnterpriseBean;
+import org.eclipse.jst.j2ee.ejb.Session;
+
+public class EjbRefTest extends TestCase {
+
+	private static final EjbFactory EJBFACTORY = EjbPackage.eINSTANCE.getEjbFactory();
+	private static final CommonFactory COMMONFACTORY = CommonPackage.eINSTANCE.getCommonFactory();
+	
+	private EjbRef getInstance() {
+		return COMMONFACTORY.createEjbRef();
+	}
+	
+    public void test_EjbRef() {
+        EjbRef tmpEjbRef = getInstance();
+        assertNotNull(tmpEjbRef);
+    }
+
+    public void test_getLinkedEjb() {
+    	
+    	EJBJar objEJBJar = EJBFACTORY.createEJBJar();
+        AssemblyDescriptor descriptor = EJBFACTORY.createAssemblyDescriptor();
+        objEJBJar.setAssemblyDescriptor(descriptor);
+         
+    	EjbRef ejbRef = COMMONFACTORY.createEjbRef();
+    	Session session1 = EJBFACTORY.createSession();
+    	String name1 = "Name1";
+    	session1.setName(name1);
+    	
+    	Session session2 = EJBFACTORY.createSession();
+    	String name2 = "Name2";
+    	session2.setName(name2);
+    	
+    	ejbRef.setLink(name2);
+    	ejbRef.setName("EjbRef_" + name2);
+    	
+    	objEJBJar.getEnterpriseBeans().add(session1);
+    	objEJBJar.getEnterpriseBeans().add(session2);
+        EnterpriseBean retValue = null;
+        retValue = ejbRef.getLinkedEjb(objEJBJar);
+        assertEquals(session2,retValue);
+    }
+
+    public void test_isEquivalent() {
+
+    	EJBJar objEJBJar = EJBFACTORY.createEJBJar();
+        AssemblyDescriptor descriptor = EJBFACTORY.createAssemblyDescriptor();
+        objEJBJar.setAssemblyDescriptor(descriptor);
+         
+    	EjbRef ejbRef1 = COMMONFACTORY.createEjbRef();
+    	EjbRef ejbRef2 = COMMONFACTORY.createEjbRef();
+    	Session session1 = EJBFACTORY.createSession();
+    	String name1 = "Name1";
+    	session1.setName(name1);
+    	
+    	Session session2 = EJBFACTORY.createSession();
+    	String name2 = "Name2";
+    	session2.setName(name2);
+    	
+    	ejbRef1.setLink(name2);
+    	ejbRef1.setName("EjbRef_" + name2);
+    	
+    	ejbRef2.setLink(name2);
+    	ejbRef2.setName("EjbRef_" + name2);
+    	
+    	String home1 = "home1";
+    	String home2 = "home2" ;
+    	String remote1 = "remote1" ;
+    	String remote2 = "remote2";
+    	
+    	ejbRef1.setHome(home1);
+    	ejbRef2.setHome(home1);
+    	
+    	ejbRef1.setRemote(remote1);
+    	ejbRef2.setRemote(remote1);
+    	
+    	objEJBJar.getEnterpriseBeans().add(session1);
+    	objEJBJar.getEnterpriseBeans().add(session2);
+    	
+    	boolean retValue = false;
+        retValue = ejbRef1.isEquivalent(ejbRef2);	
+        assertEquals(retValue,true);
+        
+        ejbRef2.setRemote(remote2);
+        retValue = ejbRef1.isEquivalent(ejbRef2);	
+        assertEquals(retValue,false);
+        
+        ejbRef2.setRemote(remote1);
+        ejbRef2.setHome(home2);
+        retValue = ejbRef1.isEquivalent(ejbRef2);	
+        assertEquals(retValue,false);
+        
+        ejbRef2.setHome(home1);
+        ejbRef2.setLink(name1);
+        retValue = ejbRef1.isEquivalent(ejbRef2);	
+        assertEquals(retValue,false);
+        
+        ejbRef2.setLink(name2);
+        ejbRef2.setName("EjbRef_" + name1);
+        retValue = ejbRef1.isEquivalent(ejbRef2);	
+        assertEquals(retValue,false);
+        
+    }
+
+    public void test_isLinked() {
+
+    	Session session1 = EJBFACTORY.createSession();
+    	String name1 = "Name1";
+    	session1.setName(name1);
+        EjbRef objEjbRef = getInstance();
+       
+        boolean retValue = false;
+        retValue = objEjbRef.isLinked(session1);
+        assertEquals(retValue, false);
+        
+        objEjbRef.setLink(name1);
+        retValue = objEjbRef.isLinked(session1);
+        assertEquals(retValue, true);
+        
+        
+    }
+
+    public void test_isLocal() {
+
+        EjbRef objEjbRef = getInstance();
+        boolean retValue = false;
+        retValue = objEjbRef.isLocal();
+        assertEquals(retValue,false);
+        EJBLocalRef objLocalRef = CommonPackage.eINSTANCE.getCommonFactory().createEJBLocalRef();
+        retValue = objLocalRef.isLocal();
+        assertEquals(retValue,true);
+    }
+
+   /* public void test_getName() {
+
+        EjbRef objEjbRef = getInstance();
+        String retValue = "";
+        retValue = objEjbRef.getName();
+    }
+
+    public void test_setName() {
+
+        EjbRef objEjbRef = getInstance();
+        String newName = "";
+        objEjbRef.setName(newName);
+    }
+
+    public void test_getType() {
+
+        EjbRef objEjbRef = getInstance();
+        EjbRefType retValue = null;
+        retValue = objEjbRef.getType();
+    }
+
+    public void test_setType() {
+
+        EjbRef objEjbRef = getInstance();
+        EjbRefType newType = null;
+        objEjbRef.setType(newType);
+    }
+
+    public void test_unsetType() {
+
+        EjbRef objEjbRef = getInstance();
+        objEjbRef.unsetType();
+    }
+
+    public void test_isSetType() {
+
+        EjbRef objEjbRef = getInstance();
+        boolean retValue = false;
+        retValue = objEjbRef.isSetType();
+    }
+
+    public void test_getHome() {
+
+        EjbRef objEjbRef = getInstance();
+        String retValue = "";
+        retValue = objEjbRef.getHome();
+    }
+
+    public void test_setHome() {
+
+        EjbRef objEjbRef = getInstance();
+        String newHome = "";
+        objEjbRef.setHome(newHome);
+    }
+
+    public void test_getRemote() {
+
+        EjbRef objEjbRef = getInstance();
+        String retValue = "";
+        retValue = objEjbRef.getRemote();
+    }
+
+    public void test_setRemote() {
+
+        EjbRef objEjbRef = getInstance();
+        String newRemote = "";
+        objEjbRef.setRemote(newRemote);
+    }
+
+    public void test_getLink() {
+
+        EjbRef objEjbRef = getInstance();
+        String retValue = "";
+        retValue = objEjbRef.getLink();
+    }
+
+    public void test_setLink() {
+
+        EjbRef objEjbRef = getInstance();
+        String newLink = "";
+        objEjbRef.setLink(newLink);
+    }
+
+    public void test_setDescription() {
+
+        EjbRef objEjbRef = getInstance();
+        String newDescription = "";
+        objEjbRef.setDescription(newDescription);
+    }
+
+    public void test_getDescription() {
+
+        EjbRef objEjbRef = getInstance();
+        String retValue = "";
+        retValue = objEjbRef.getDescription();
+    }
+
+    public void test_getDescriptions() {
+
+        EjbRef objEjbRef = getInstance();
+        EList retValue = null;
+        retValue = objEjbRef.getDescriptions();
+    }*/
+    
+    /**
+	 * @return
+	 */
+	public static Test suite() {
+		return new TestSuite(EjbRefTest.class);
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/test/ListenerTest.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/test/ListenerTest.java
new file mode 100644
index 0000000..54085ec
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/test/ListenerTest.java
@@ -0,0 +1,56 @@
+package org.eclipse.jst.j2ee.common.test;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.eclipse.jst.j2ee.common.CommonFactory;
+import org.eclipse.jst.j2ee.common.Listener;
+
+public class ListenerTest extends TestCase {
+
+	private Listener getInstance() {
+		return CommonFactory.eINSTANCE.createListener();
+	}
+   /* public void test_getListenerClass() {
+        Listener objListener = getInstance();
+        JavaClass retValue = null;
+        retValue = objListener.getListenerClass();
+    } 
+
+    public void test_setListenerClass() {
+
+        Listener objListener = getInstance();
+        JavaClass newListenerClass = null;
+        objListener.setListenerClass(newListenerClass);
+    }*/
+
+
+    public void test_getListenerClassName() {
+
+        Listener objListener = getInstance();
+        String listenerClassName = "org.eclipse.jst.j2ee.common.Listener1" ;
+        objListener.setListenerClassName(listenerClassName);
+        String retValue = "";
+        retValue = objListener.getListenerClassName();
+        assertEquals(listenerClassName, retValue);
+    }
+
+    public void test_setListenerClassName() {
+
+        Listener objListener = getInstance();
+        String listenerClassName = "org.eclipse.jst.j2ee.common.Listener1";
+        objListener.setListenerClassName(listenerClassName);
+        String retValue = "";
+        retValue = objListener.getListenerClassName();
+        assertEquals(listenerClassName, retValue);
+    }
+    
+    /**
+	 * @return
+	 */
+	public static Test suite() {
+		return new TestSuite(ListenerTest.class);
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/test/QNameTest.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/test/QNameTest.java
new file mode 100644
index 0000000..d25bf80
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/test/QNameTest.java
@@ -0,0 +1,96 @@
+package org.eclipse.jst.j2ee.common.test;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.eclipse.jst.j2ee.common.CommonFactory;
+import org.eclipse.jst.j2ee.common.QName;
+
+public class QNameTest extends TestCase {
+	
+	private QName getInstance() {
+		return CommonFactory.eINSTANCE.createQName();
+	}
+
+  /*  public void test_getNamespaceURI() {
+
+        QName objQName = getInstance();
+        String retValue = "";
+        retValue = objQName.getNamespaceURI();
+    }
+
+   
+    public void test_setNamespaceURI() {
+
+        QName objQName = getInstance();
+        String newNamespaceURI = "";
+        objQName.setNamespaceURI(newNamespaceURI);
+    }
+
+    public void test_getLocalPart() {
+
+        QName objQName = getInstance();
+        String retValue = "";
+        retValue = objQName.getLocalPart();
+    }
+
+    public void test_setLocalPart() {
+
+        QName objQName = getInstance();
+        String newLocalPart = "";
+        objQName.setLocalPart(newLocalPart);
+    }
+
+    public void test_getCombinedQName() {
+
+        QName objQName = getInstance();
+        String retValue = "";
+        retValue = objQName.getCombinedQName();
+    }
+
+
+    public void test_setCombinedQName() {
+
+        QName objQName = getInstance();
+        String newCombinedQName = "";
+        objQName.setCombinedQName(newCombinedQName);
+    }
+
+    public void test_getInternalPrefixOrNsURI() {
+
+        QName objQName = getInstance();
+        String retValue = "";
+        retValue = objQName.getInternalPrefixOrNsURI();
+    }
+
+    
+
+    public void test_setInternalPrefixOrNsURI() {
+
+        QName objQName = getInstance();
+        String newInternalPrefixOrNsURI = "";
+        objQName.setInternalPrefixOrNsURI(newInternalPrefixOrNsURI);
+    }*/
+
+
+    public void test_setValues() {
+
+        QName objQName = getInstance();
+        String prefix = "prefix1";
+        String nsURI = "nsURI1";
+        String localPart = "localPart1";
+        objQName.setValues(prefix, nsURI, localPart);
+        assertEquals(prefix,objQName.getInternalPrefixOrNsURI());
+        assertEquals(nsURI,objQName.getNamespaceURI());
+        assertEquals(localPart,objQName.getLocalPart());
+    }
+    
+    /**
+	 * @return
+	 */
+	public static Test suite() {
+		return new TestSuite(QNameTest.class);
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/CommonExample.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/CommonExample.java
new file mode 100644
index 0000000..ac930c6
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/CommonExample.java
@@ -0,0 +1,128 @@
+/**
+ * <copyright>
+ * </copyright>
+ *
+ * $Id: CommonExample.java,v 1.1 2005/08/23 03:31:00 cbridgha Exp $
+ */
+package org.eclipse.jst.j2ee.common.tests;
+
+import java.io.File;
+import java.io.IOException;
+
+import java.util.Iterator;
+
+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.jst.j2ee.common.CommonFactory;
+import org.eclipse.jst.j2ee.common.CommonPackage;
+import org.eclipse.jst.j2ee.common.EjbRef;
+
+/**
+ * <!-- begin-user-doc -->
+ * A sample utility for the '<em><b>common</b></em>' package.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class CommonExample {
+	/**
+	 * <!-- 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 extentions.
+		//
+		resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put
+			(Resource.Factory.Registry.DEFAULT_EXTENSION, 
+			 new XMIResourceFactoryImpl());
+
+		// Register the package to ensure it is available during loading.
+		//
+		resourceSet.getPackageRegistry().put
+			(CommonPackage.eNS_URI, 
+			 CommonPackage.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.common"));
+				EjbRef root = CommonFactory.eINSTANCE.createEjbRef();
+				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[0]);
+				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 (Iterator j = resource.getContents().iterator(); j.hasNext(); ) {
+						EObject eObject = (EObject)j.next();
+						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 (Iterator i = diagnostic.getChildren().iterator(); i.hasNext(); ) {
+			printDiagnostic((Diagnostic)i.next(), indent + "  ");
+		}
+	}
+
+} //CommonExample
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/CommonTests.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/CommonTests.java
new file mode 100644
index 0000000..2b1e930
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/CommonTests.java
@@ -0,0 +1,49 @@
+/**
+ * <copyright>
+ * </copyright>
+ *
+ * $Id: CommonTests.java,v 1.1 2005/08/23 03:31:00 cbridgha Exp $
+ */
+package org.eclipse.jst.j2ee.common.tests;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import junit.textui.TestRunner;
+
+/**
+ * <!-- begin-user-doc -->
+ * A test suite for the '<em><b>common</b></em>' package.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class CommonTests 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 CommonTests("common Tests");
+		return suite;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public CommonTests(String name) {
+		super(name);
+	}
+
+} //CommonTests
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/CompatibilityDescriptionGroupTest.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/CompatibilityDescriptionGroupTest.java
new file mode 100644
index 0000000..5f4ad24
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/CompatibilityDescriptionGroupTest.java
@@ -0,0 +1,70 @@
+/**
+ * <copyright>
+ * </copyright>
+ *
+ * $Id: CompatibilityDescriptionGroupTest.java,v 1.1 2005/08/23 03:31:00 cbridgha Exp $
+ */
+package org.eclipse.jst.j2ee.common.tests;
+
+import junit.textui.TestRunner;
+
+import org.eclipse.jst.j2ee.common.CommonFactory;
+import org.eclipse.jst.j2ee.common.CompatibilityDescriptionGroup;
+
+/**
+ * <!-- begin-user-doc -->
+ * A test case for the model object '<em><b>Compatibility Description Group</b></em>'.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class CompatibilityDescriptionGroupTest extends DescriptionGroupTest {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static void main(String[] args) {
+		TestRunner.run(CompatibilityDescriptionGroupTest.class);
+	}
+
+	/**
+	 * Constructs a new Compatibility Description Group test case with the given name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public CompatibilityDescriptionGroupTest(String name) {
+		super(name);
+	}
+
+	/**
+	 * Returns the fixture for this Compatibility Description Group test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private CompatibilityDescriptionGroup getFixture() {
+		return (CompatibilityDescriptionGroup)fixture;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#setUp()
+	 * @generated
+	 */
+	protected void setUp() throws Exception {
+		setFixture(CommonFactory.eINSTANCE.createCompatibilityDescriptionGroup());
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#tearDown()
+	 * @generated
+	 */
+	protected void tearDown() throws Exception {
+		setFixture(null);
+	}
+
+} //CompatibilityDescriptionGroupTest
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/DescriptionGroupTest.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/DescriptionGroupTest.java
new file mode 100644
index 0000000..50f0271
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/DescriptionGroupTest.java
@@ -0,0 +1,90 @@
+/**
+ * <copyright>
+ * </copyright>
+ *
+ * $Id: DescriptionGroupTest.java,v 1.1 2005/08/23 03:31:00 cbridgha Exp $
+ */
+package org.eclipse.jst.j2ee.common.tests;
+
+import junit.framework.TestCase;
+
+import junit.textui.TestRunner;
+
+import org.eclipse.jst.j2ee.common.CommonFactory;
+import org.eclipse.jst.j2ee.common.DescriptionGroup;
+
+/**
+ * <!-- begin-user-doc -->
+ * A test case for the model object '<em><b>Description Group</b></em>'.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class DescriptionGroupTest extends TestCase {
+	/**
+	 * The fixture for this Description Group test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected DescriptionGroup fixture = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static void main(String[] args) {
+		TestRunner.run(DescriptionGroupTest.class);
+	}
+
+	/**
+	 * Constructs a new Description Group test case with the given name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public DescriptionGroupTest(String name) {
+		super(name);
+	}
+
+	/**
+	 * Sets the fixture for this Description Group test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void setFixture(DescriptionGroup fixture) {
+		this.fixture = fixture;
+	}
+
+	/**
+	 * Returns the fixture for this Description Group test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private DescriptionGroup getFixture() {
+		return fixture;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#setUp()
+	 * @generated
+	 */
+	protected void setUp() throws Exception {
+		setFixture(CommonFactory.eINSTANCE.createDescriptionGroup());
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#tearDown()
+	 * @generated
+	 */
+	protected void tearDown() throws Exception {
+		setFixture(null);
+	}
+
+} //DescriptionGroupTest
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/DescriptionTest.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/DescriptionTest.java
new file mode 100644
index 0000000..daa3d8a
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/DescriptionTest.java
@@ -0,0 +1,90 @@
+/**
+ * <copyright>
+ * </copyright>
+ *
+ * $Id: DescriptionTest.java,v 1.1 2005/08/23 03:31:00 cbridgha Exp $
+ */
+package org.eclipse.jst.j2ee.common.tests;
+
+import junit.framework.TestCase;
+
+import junit.textui.TestRunner;
+
+import org.eclipse.jst.j2ee.common.CommonFactory;
+import org.eclipse.jst.j2ee.common.Description;
+
+/**
+ * <!-- begin-user-doc -->
+ * A test case for the model object '<em><b>Description</b></em>'.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class DescriptionTest extends TestCase {
+	/**
+	 * The fixture for this Description test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected Description fixture = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static void main(String[] args) {
+		TestRunner.run(DescriptionTest.class);
+	}
+
+	/**
+	 * Constructs a new Description test case with the given name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public DescriptionTest(String name) {
+		super(name);
+	}
+
+	/**
+	 * Sets the fixture for this Description test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void setFixture(Description fixture) {
+		this.fixture = fixture;
+	}
+
+	/**
+	 * Returns the fixture for this Description test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private Description getFixture() {
+		return fixture;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#setUp()
+	 * @generated
+	 */
+	protected void setUp() throws Exception {
+		setFixture(CommonFactory.eINSTANCE.createDescription());
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#tearDown()
+	 * @generated
+	 */
+	protected void tearDown() throws Exception {
+		setFixture(null);
+	}
+
+} //DescriptionTest
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/DisplayNameTest.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/DisplayNameTest.java
new file mode 100644
index 0000000..db80391
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/DisplayNameTest.java
@@ -0,0 +1,90 @@
+/**
+ * <copyright>
+ * </copyright>
+ *
+ * $Id: DisplayNameTest.java,v 1.1 2005/08/23 03:31:00 cbridgha Exp $
+ */
+package org.eclipse.jst.j2ee.common.tests;
+
+import junit.framework.TestCase;
+
+import junit.textui.TestRunner;
+
+import org.eclipse.jst.j2ee.common.CommonFactory;
+import org.eclipse.jst.j2ee.common.DisplayName;
+
+/**
+ * <!-- begin-user-doc -->
+ * A test case for the model object '<em><b>Display Name</b></em>'.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class DisplayNameTest extends TestCase {
+	/**
+	 * The fixture for this Display Name test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected DisplayName fixture = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static void main(String[] args) {
+		TestRunner.run(DisplayNameTest.class);
+	}
+
+	/**
+	 * Constructs a new Display Name test case with the given name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public DisplayNameTest(String name) {
+		super(name);
+	}
+
+	/**
+	 * Sets the fixture for this Display Name test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void setFixture(DisplayName fixture) {
+		this.fixture = fixture;
+	}
+
+	/**
+	 * Returns the fixture for this Display Name test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private DisplayName getFixture() {
+		return fixture;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#setUp()
+	 * @generated
+	 */
+	protected void setUp() throws Exception {
+		setFixture(CommonFactory.eINSTANCE.createDisplayName());
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#tearDown()
+	 * @generated
+	 */
+	protected void tearDown() throws Exception {
+		setFixture(null);
+	}
+
+} //DisplayNameTest
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/EJBLocalRefTest.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/EJBLocalRefTest.java
new file mode 100644
index 0000000..3a43d4a
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/EJBLocalRefTest.java
@@ -0,0 +1,70 @@
+/**
+ * <copyright>
+ * </copyright>
+ *
+ * $Id: EJBLocalRefTest.java,v 1.1 2005/08/23 03:31:00 cbridgha Exp $
+ */
+package org.eclipse.jst.j2ee.common.tests;
+
+import junit.textui.TestRunner;
+
+import org.eclipse.jst.j2ee.common.CommonFactory;
+import org.eclipse.jst.j2ee.common.EJBLocalRef;
+
+/**
+ * <!-- begin-user-doc -->
+ * A test case for the model object '<em><b>EJB Local Ref</b></em>'.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class EJBLocalRefTest extends EjbRefTest {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static void main(String[] args) {
+		TestRunner.run(EJBLocalRefTest.class);
+	}
+
+	/**
+	 * Constructs a new EJB Local Ref test case with the given name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EJBLocalRefTest(String name) {
+		super(name);
+	}
+
+	/**
+	 * Returns the fixture for this EJB Local Ref test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EJBLocalRef getFixture() {
+		return (EJBLocalRef)fixture;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#setUp()
+	 * @generated
+	 */
+	protected void setUp() throws Exception {
+		setFixture(CommonFactory.eINSTANCE.createEJBLocalRef());
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#tearDown()
+	 * @generated
+	 */
+	protected void tearDown() throws Exception {
+		setFixture(null);
+	}
+
+} //EJBLocalRefTest
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/EjbRefTest.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/EjbRefTest.java
new file mode 100644
index 0000000..7a587e9
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/EjbRefTest.java
@@ -0,0 +1,90 @@
+/**
+ * <copyright>
+ * </copyright>
+ *
+ * $Id: EjbRefTest.java,v 1.1 2005/08/23 03:31:00 cbridgha Exp $
+ */
+package org.eclipse.jst.j2ee.common.tests;
+
+import junit.framework.TestCase;
+
+import junit.textui.TestRunner;
+
+import org.eclipse.jst.j2ee.common.CommonFactory;
+import org.eclipse.jst.j2ee.common.EjbRef;
+
+/**
+ * <!-- begin-user-doc -->
+ * A test case for the model object '<em><b>Ejb Ref</b></em>'.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class EjbRefTest extends TestCase {
+	/**
+	 * The fixture for this Ejb Ref test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected EjbRef fixture = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static void main(String[] args) {
+		TestRunner.run(EjbRefTest.class);
+	}
+
+	/**
+	 * Constructs a new Ejb Ref test case with the given name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EjbRefTest(String name) {
+		super(name);
+	}
+
+	/**
+	 * Sets the fixture for this Ejb Ref test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void setFixture(EjbRef fixture) {
+		this.fixture = fixture;
+	}
+
+	/**
+	 * Returns the fixture for this Ejb Ref test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EjbRef getFixture() {
+		return fixture;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#setUp()
+	 * @generated
+	 */
+	protected void setUp() throws Exception {
+		setFixture(CommonFactory.eINSTANCE.createEjbRef());
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#tearDown()
+	 * @generated
+	 */
+	protected void tearDown() throws Exception {
+		setFixture(null);
+	}
+
+} //EjbRefTest
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/EnvEntryTest.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/EnvEntryTest.java
new file mode 100644
index 0000000..1e2c0be
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/EnvEntryTest.java
@@ -0,0 +1,90 @@
+/**
+ * <copyright>
+ * </copyright>
+ *
+ * $Id: EnvEntryTest.java,v 1.1 2005/08/23 03:31:00 cbridgha Exp $
+ */
+package org.eclipse.jst.j2ee.common.tests;
+
+import junit.framework.TestCase;
+
+import junit.textui.TestRunner;
+
+import org.eclipse.jst.j2ee.common.CommonFactory;
+import org.eclipse.jst.j2ee.common.EnvEntry;
+
+/**
+ * <!-- begin-user-doc -->
+ * A test case for the model object '<em><b>Env Entry</b></em>'.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class EnvEntryTest extends TestCase {
+	/**
+	 * The fixture for this Env Entry test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected EnvEntry fixture = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static void main(String[] args) {
+		TestRunner.run(EnvEntryTest.class);
+	}
+
+	/**
+	 * Constructs a new Env Entry test case with the given name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EnvEntryTest(String name) {
+		super(name);
+	}
+
+	/**
+	 * Sets the fixture for this Env Entry test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void setFixture(EnvEntry fixture) {
+		this.fixture = fixture;
+	}
+
+	/**
+	 * Returns the fixture for this Env Entry test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EnvEntry getFixture() {
+		return fixture;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#setUp()
+	 * @generated
+	 */
+	protected void setUp() throws Exception {
+		setFixture(CommonFactory.eINSTANCE.createEnvEntry());
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#tearDown()
+	 * @generated
+	 */
+	protected void tearDown() throws Exception {
+		setFixture(null);
+	}
+
+} //EnvEntryTest
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/IconTypeTest.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/IconTypeTest.java
new file mode 100644
index 0000000..70bbfe5
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/IconTypeTest.java
@@ -0,0 +1,90 @@
+/**
+ * <copyright>
+ * </copyright>
+ *
+ * $Id: IconTypeTest.java,v 1.1 2005/08/23 03:31:00 cbridgha Exp $
+ */
+package org.eclipse.jst.j2ee.common.tests;
+
+import junit.framework.TestCase;
+
+import junit.textui.TestRunner;
+
+import org.eclipse.jst.j2ee.common.CommonFactory;
+import org.eclipse.jst.j2ee.common.IconType;
+
+/**
+ * <!-- begin-user-doc -->
+ * A test case for the model object '<em><b>Icon Type</b></em>'.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class IconTypeTest extends TestCase {
+	/**
+	 * The fixture for this Icon Type test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected IconType fixture = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static void main(String[] args) {
+		TestRunner.run(IconTypeTest.class);
+	}
+
+	/**
+	 * Constructs a new Icon Type test case with the given name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public IconTypeTest(String name) {
+		super(name);
+	}
+
+	/**
+	 * Sets the fixture for this Icon Type test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void setFixture(IconType fixture) {
+		this.fixture = fixture;
+	}
+
+	/**
+	 * Returns the fixture for this Icon Type test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private IconType getFixture() {
+		return fixture;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#setUp()
+	 * @generated
+	 */
+	protected void setUp() throws Exception {
+		setFixture(CommonFactory.eINSTANCE.createIconType());
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#tearDown()
+	 * @generated
+	 */
+	protected void tearDown() throws Exception {
+		setFixture(null);
+	}
+
+} //IconTypeTest
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/IdentityTest.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/IdentityTest.java
new file mode 100644
index 0000000..6880dff
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/IdentityTest.java
@@ -0,0 +1,90 @@
+/**
+ * <copyright>
+ * </copyright>
+ *
+ * $Id: IdentityTest.java,v 1.1 2005/08/23 03:31:00 cbridgha Exp $
+ */
+package org.eclipse.jst.j2ee.common.tests;
+
+import junit.framework.TestCase;
+
+import junit.textui.TestRunner;
+
+import org.eclipse.jst.j2ee.common.CommonFactory;
+import org.eclipse.jst.j2ee.common.Identity;
+
+/**
+ * <!-- begin-user-doc -->
+ * A test case for the model object '<em><b>Identity</b></em>'.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class IdentityTest extends TestCase {
+	/**
+	 * The fixture for this Identity test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected Identity fixture = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static void main(String[] args) {
+		TestRunner.run(IdentityTest.class);
+	}
+
+	/**
+	 * Constructs a new Identity test case with the given name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public IdentityTest(String name) {
+		super(name);
+	}
+
+	/**
+	 * Sets the fixture for this Identity test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void setFixture(Identity fixture) {
+		this.fixture = fixture;
+	}
+
+	/**
+	 * Returns the fixture for this Identity test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private Identity getFixture() {
+		return fixture;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#setUp()
+	 * @generated
+	 */
+	protected void setUp() throws Exception {
+		setFixture(CommonFactory.eINSTANCE.createIdentity());
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#tearDown()
+	 * @generated
+	 */
+	protected void tearDown() throws Exception {
+		setFixture(null);
+	}
+
+} //IdentityTest
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/JNDIEnvRefsGroupTest.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/JNDIEnvRefsGroupTest.java
new file mode 100644
index 0000000..dd41c02
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/JNDIEnvRefsGroupTest.java
@@ -0,0 +1,38 @@
+/**
+ * <copyright>
+ * </copyright>
+ *
+ * $Id: JNDIEnvRefsGroupTest.java,v 1.1 2005/08/23 03:31:00 cbridgha Exp $
+ */
+package org.eclipse.jst.j2ee.common.tests;
+
+import org.eclipse.jst.j2ee.common.JNDIEnvRefsGroup;
+
+/**
+ * <!-- begin-user-doc -->
+ * A test case for the model object '<em><b>JNDI Env Refs Group</b></em>'.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public abstract class JNDIEnvRefsGroupTest extends CompatibilityDescriptionGroupTest {
+	/**
+	 * Constructs a new JNDI Env Refs Group test case with the given name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public JNDIEnvRefsGroupTest(String name) {
+		super(name);
+	}
+
+	/**
+	 * Returns the fixture for this JNDI Env Refs Group test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private JNDIEnvRefsGroup getFixture() {
+		return (JNDIEnvRefsGroup)fixture;
+	}
+
+} //JNDIEnvRefsGroupTest
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/ListenerTest.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/ListenerTest.java
new file mode 100644
index 0000000..70cba58
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/ListenerTest.java
@@ -0,0 +1,70 @@
+/**
+ * <copyright>
+ * </copyright>
+ *
+ * $Id: ListenerTest.java,v 1.1 2005/08/23 03:31:00 cbridgha Exp $
+ */
+package org.eclipse.jst.j2ee.common.tests;
+
+import junit.textui.TestRunner;
+
+import org.eclipse.jst.j2ee.common.CommonFactory;
+import org.eclipse.jst.j2ee.common.Listener;
+
+/**
+ * <!-- begin-user-doc -->
+ * A test case for the model object '<em><b>Listener</b></em>'.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class ListenerTest extends CompatibilityDescriptionGroupTest {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static void main(String[] args) {
+		TestRunner.run(ListenerTest.class);
+	}
+
+	/**
+	 * Constructs a new Listener test case with the given name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ListenerTest(String name) {
+		super(name);
+	}
+
+	/**
+	 * Returns the fixture for this Listener test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private Listener getFixture() {
+		return (Listener)fixture;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#setUp()
+	 * @generated
+	 */
+	protected void setUp() throws Exception {
+		setFixture(CommonFactory.eINSTANCE.createListener());
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#tearDown()
+	 * @generated
+	 */
+	protected void tearDown() throws Exception {
+		setFixture(null);
+	}
+
+} //ListenerTest
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/MessageDestinationRefTest.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/MessageDestinationRefTest.java
new file mode 100644
index 0000000..554a682
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/MessageDestinationRefTest.java
@@ -0,0 +1,90 @@
+/**
+ * <copyright>
+ * </copyright>
+ *
+ * $Id: MessageDestinationRefTest.java,v 1.1 2005/08/23 03:31:00 cbridgha Exp $
+ */
+package org.eclipse.jst.j2ee.common.tests;
+
+import junit.framework.TestCase;
+
+import junit.textui.TestRunner;
+
+import org.eclipse.jst.j2ee.common.CommonFactory;
+import org.eclipse.jst.j2ee.common.MessageDestinationRef;
+
+/**
+ * <!-- begin-user-doc -->
+ * A test case for the model object '<em><b>Message Destination Ref</b></em>'.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class MessageDestinationRefTest extends TestCase {
+	/**
+	 * The fixture for this Message Destination Ref test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected MessageDestinationRef fixture = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static void main(String[] args) {
+		TestRunner.run(MessageDestinationRefTest.class);
+	}
+
+	/**
+	 * Constructs a new Message Destination Ref test case with the given name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public MessageDestinationRefTest(String name) {
+		super(name);
+	}
+
+	/**
+	 * Sets the fixture for this Message Destination Ref test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void setFixture(MessageDestinationRef fixture) {
+		this.fixture = fixture;
+	}
+
+	/**
+	 * Returns the fixture for this Message Destination Ref test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private MessageDestinationRef getFixture() {
+		return fixture;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#setUp()
+	 * @generated
+	 */
+	protected void setUp() throws Exception {
+		setFixture(CommonFactory.eINSTANCE.createMessageDestinationRef());
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#tearDown()
+	 * @generated
+	 */
+	protected void tearDown() throws Exception {
+		setFixture(null);
+	}
+
+} //MessageDestinationRefTest
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/MessageDestinationTest.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/MessageDestinationTest.java
new file mode 100644
index 0000000..98bef40
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/MessageDestinationTest.java
@@ -0,0 +1,70 @@
+/**
+ * <copyright>
+ * </copyright>
+ *
+ * $Id: MessageDestinationTest.java,v 1.1 2005/08/23 03:31:00 cbridgha Exp $
+ */
+package org.eclipse.jst.j2ee.common.tests;
+
+import junit.textui.TestRunner;
+
+import org.eclipse.jst.j2ee.common.CommonFactory;
+import org.eclipse.jst.j2ee.common.MessageDestination;
+
+/**
+ * <!-- begin-user-doc -->
+ * A test case for the model object '<em><b>Message Destination</b></em>'.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class MessageDestinationTest extends CompatibilityDescriptionGroupTest {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static void main(String[] args) {
+		TestRunner.run(MessageDestinationTest.class);
+	}
+
+	/**
+	 * Constructs a new Message Destination test case with the given name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public MessageDestinationTest(String name) {
+		super(name);
+	}
+
+	/**
+	 * Returns the fixture for this Message Destination test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private MessageDestination getFixture() {
+		return (MessageDestination)fixture;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#setUp()
+	 * @generated
+	 */
+	protected void setUp() throws Exception {
+		setFixture(CommonFactory.eINSTANCE.createMessageDestination());
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#tearDown()
+	 * @generated
+	 */
+	protected void tearDown() throws Exception {
+		setFixture(null);
+	}
+
+} //MessageDestinationTest
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/ParamValueTest.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/ParamValueTest.java
new file mode 100644
index 0000000..2f68328
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/ParamValueTest.java
@@ -0,0 +1,90 @@
+/**
+ * <copyright>
+ * </copyright>
+ *
+ * $Id: ParamValueTest.java,v 1.1 2005/08/23 03:31:00 cbridgha Exp $
+ */
+package org.eclipse.jst.j2ee.common.tests;
+
+import junit.framework.TestCase;
+
+import junit.textui.TestRunner;
+
+import org.eclipse.jst.j2ee.common.CommonFactory;
+import org.eclipse.jst.j2ee.common.ParamValue;
+
+/**
+ * <!-- begin-user-doc -->
+ * A test case for the model object '<em><b>Param Value</b></em>'.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class ParamValueTest extends TestCase {
+	/**
+	 * The fixture for this Param Value test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ParamValue fixture = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static void main(String[] args) {
+		TestRunner.run(ParamValueTest.class);
+	}
+
+	/**
+	 * Constructs a new Param Value test case with the given name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ParamValueTest(String name) {
+		super(name);
+	}
+
+	/**
+	 * Sets the fixture for this Param Value test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void setFixture(ParamValue fixture) {
+		this.fixture = fixture;
+	}
+
+	/**
+	 * Returns the fixture for this Param Value test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private ParamValue getFixture() {
+		return fixture;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#setUp()
+	 * @generated
+	 */
+	protected void setUp() throws Exception {
+		setFixture(CommonFactory.eINSTANCE.createParamValue());
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#tearDown()
+	 * @generated
+	 */
+	protected void tearDown() throws Exception {
+		setFixture(null);
+	}
+
+} //ParamValueTest
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/QNameTest.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/QNameTest.java
new file mode 100644
index 0000000..f088b1d
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/QNameTest.java
@@ -0,0 +1,90 @@
+/**
+ * <copyright>
+ * </copyright>
+ *
+ * $Id: QNameTest.java,v 1.1 2005/08/23 03:31:00 cbridgha Exp $
+ */
+package org.eclipse.jst.j2ee.common.tests;
+
+import junit.framework.TestCase;
+
+import junit.textui.TestRunner;
+
+import org.eclipse.jst.j2ee.common.CommonFactory;
+import org.eclipse.jst.j2ee.common.QName;
+
+/**
+ * <!-- begin-user-doc -->
+ * A test case for the model object '<em><b>QName</b></em>'.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class QNameTest extends TestCase {
+	/**
+	 * The fixture for this QName test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected QName fixture = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static void main(String[] args) {
+		TestRunner.run(QNameTest.class);
+	}
+
+	/**
+	 * Constructs a new QName test case with the given name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public QNameTest(String name) {
+		super(name);
+	}
+
+	/**
+	 * Sets the fixture for this QName test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void setFixture(QName fixture) {
+		this.fixture = fixture;
+	}
+
+	/**
+	 * Returns the fixture for this QName test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private QName getFixture() {
+		return fixture;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#setUp()
+	 * @generated
+	 */
+	protected void setUp() throws Exception {
+		setFixture(CommonFactory.eINSTANCE.createQName());
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#tearDown()
+	 * @generated
+	 */
+	protected void tearDown() throws Exception {
+		setFixture(null);
+	}
+
+} //QNameTest
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/ResourceEnvRefTest.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/ResourceEnvRefTest.java
new file mode 100644
index 0000000..2ebc470
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/ResourceEnvRefTest.java
@@ -0,0 +1,90 @@
+/**
+ * <copyright>
+ * </copyright>
+ *
+ * $Id: ResourceEnvRefTest.java,v 1.1 2005/08/23 03:31:00 cbridgha Exp $
+ */
+package org.eclipse.jst.j2ee.common.tests;
+
+import junit.framework.TestCase;
+
+import junit.textui.TestRunner;
+
+import org.eclipse.jst.j2ee.common.CommonFactory;
+import org.eclipse.jst.j2ee.common.ResourceEnvRef;
+
+/**
+ * <!-- begin-user-doc -->
+ * A test case for the model object '<em><b>Resource Env Ref</b></em>'.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class ResourceEnvRefTest extends TestCase {
+	/**
+	 * The fixture for this Resource Env Ref test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ResourceEnvRef fixture = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static void main(String[] args) {
+		TestRunner.run(ResourceEnvRefTest.class);
+	}
+
+	/**
+	 * Constructs a new Resource Env Ref test case with the given name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ResourceEnvRefTest(String name) {
+		super(name);
+	}
+
+	/**
+	 * Sets the fixture for this Resource Env Ref test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void setFixture(ResourceEnvRef fixture) {
+		this.fixture = fixture;
+	}
+
+	/**
+	 * Returns the fixture for this Resource Env Ref test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private ResourceEnvRef getFixture() {
+		return fixture;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#setUp()
+	 * @generated
+	 */
+	protected void setUp() throws Exception {
+		setFixture(CommonFactory.eINSTANCE.createResourceEnvRef());
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#tearDown()
+	 * @generated
+	 */
+	protected void tearDown() throws Exception {
+		setFixture(null);
+	}
+
+} //ResourceEnvRefTest
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/ResourceRefTest.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/ResourceRefTest.java
new file mode 100644
index 0000000..21b601d
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/ResourceRefTest.java
@@ -0,0 +1,90 @@
+/**
+ * <copyright>
+ * </copyright>
+ *
+ * $Id: ResourceRefTest.java,v 1.1 2005/08/23 03:31:00 cbridgha Exp $
+ */
+package org.eclipse.jst.j2ee.common.tests;
+
+import junit.framework.TestCase;
+
+import junit.textui.TestRunner;
+
+import org.eclipse.jst.j2ee.common.CommonFactory;
+import org.eclipse.jst.j2ee.common.ResourceRef;
+
+/**
+ * <!-- begin-user-doc -->
+ * A test case for the model object '<em><b>Resource Ref</b></em>'.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class ResourceRefTest extends TestCase {
+	/**
+	 * The fixture for this Resource Ref test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ResourceRef fixture = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static void main(String[] args) {
+		TestRunner.run(ResourceRefTest.class);
+	}
+
+	/**
+	 * Constructs a new Resource Ref test case with the given name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ResourceRefTest(String name) {
+		super(name);
+	}
+
+	/**
+	 * Sets the fixture for this Resource Ref test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void setFixture(ResourceRef fixture) {
+		this.fixture = fixture;
+	}
+
+	/**
+	 * Returns the fixture for this Resource Ref test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private ResourceRef getFixture() {
+		return fixture;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#setUp()
+	 * @generated
+	 */
+	protected void setUp() throws Exception {
+		setFixture(CommonFactory.eINSTANCE.createResourceRef());
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#tearDown()
+	 * @generated
+	 */
+	protected void tearDown() throws Exception {
+		setFixture(null);
+	}
+
+} //ResourceRefTest
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/RunAsSpecifiedIdentityTest.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/RunAsSpecifiedIdentityTest.java
new file mode 100644
index 0000000..3133906
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/RunAsSpecifiedIdentityTest.java
@@ -0,0 +1,70 @@
+/**
+ * <copyright>
+ * </copyright>
+ *
+ * $Id: RunAsSpecifiedIdentityTest.java,v 1.1 2005/08/23 03:31:00 cbridgha Exp $
+ */
+package org.eclipse.jst.j2ee.common.tests;
+
+import junit.textui.TestRunner;
+
+import org.eclipse.jst.j2ee.common.CommonFactory;
+import org.eclipse.jst.j2ee.common.RunAsSpecifiedIdentity;
+
+/**
+ * <!-- begin-user-doc -->
+ * A test case for the model object '<em><b>Run As Specified Identity</b></em>'.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class RunAsSpecifiedIdentityTest extends SecurityIdentityTest {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static void main(String[] args) {
+		TestRunner.run(RunAsSpecifiedIdentityTest.class);
+	}
+
+	/**
+	 * Constructs a new Run As Specified Identity test case with the given name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public RunAsSpecifiedIdentityTest(String name) {
+		super(name);
+	}
+
+	/**
+	 * Returns the fixture for this Run As Specified Identity test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private RunAsSpecifiedIdentity getFixture() {
+		return (RunAsSpecifiedIdentity)fixture;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#setUp()
+	 * @generated
+	 */
+	protected void setUp() throws Exception {
+		setFixture(CommonFactory.eINSTANCE.createRunAsSpecifiedIdentity());
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#tearDown()
+	 * @generated
+	 */
+	protected void tearDown() throws Exception {
+		setFixture(null);
+	}
+
+} //RunAsSpecifiedIdentityTest
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/SecurityIdentityTest.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/SecurityIdentityTest.java
new file mode 100644
index 0000000..8596457
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/SecurityIdentityTest.java
@@ -0,0 +1,90 @@
+/**
+ * <copyright>
+ * </copyright>
+ *
+ * $Id: SecurityIdentityTest.java,v 1.1 2005/08/23 03:31:00 cbridgha Exp $
+ */
+package org.eclipse.jst.j2ee.common.tests;
+
+import junit.framework.TestCase;
+
+import junit.textui.TestRunner;
+
+import org.eclipse.jst.j2ee.common.CommonFactory;
+import org.eclipse.jst.j2ee.common.SecurityIdentity;
+
+/**
+ * <!-- begin-user-doc -->
+ * A test case for the model object '<em><b>Security Identity</b></em>'.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class SecurityIdentityTest extends TestCase {
+	/**
+	 * The fixture for this Security Identity test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected SecurityIdentity fixture = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static void main(String[] args) {
+		TestRunner.run(SecurityIdentityTest.class);
+	}
+
+	/**
+	 * Constructs a new Security Identity test case with the given name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public SecurityIdentityTest(String name) {
+		super(name);
+	}
+
+	/**
+	 * Sets the fixture for this Security Identity test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void setFixture(SecurityIdentity fixture) {
+		this.fixture = fixture;
+	}
+
+	/**
+	 * Returns the fixture for this Security Identity test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private SecurityIdentity getFixture() {
+		return fixture;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#setUp()
+	 * @generated
+	 */
+	protected void setUp() throws Exception {
+		setFixture(CommonFactory.eINSTANCE.createSecurityIdentity());
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#tearDown()
+	 * @generated
+	 */
+	protected void tearDown() throws Exception {
+		setFixture(null);
+	}
+
+} //SecurityIdentityTest
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/SecurityRoleRefTest.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/SecurityRoleRefTest.java
new file mode 100644
index 0000000..d94b633
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/SecurityRoleRefTest.java
@@ -0,0 +1,90 @@
+/**
+ * <copyright>
+ * </copyright>
+ *
+ * $Id: SecurityRoleRefTest.java,v 1.1 2005/08/23 03:31:00 cbridgha Exp $
+ */
+package org.eclipse.jst.j2ee.common.tests;
+
+import junit.framework.TestCase;
+
+import junit.textui.TestRunner;
+
+import org.eclipse.jst.j2ee.common.CommonFactory;
+import org.eclipse.jst.j2ee.common.SecurityRoleRef;
+
+/**
+ * <!-- begin-user-doc -->
+ * A test case for the model object '<em><b>Security Role Ref</b></em>'.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class SecurityRoleRefTest extends TestCase {
+	/**
+	 * The fixture for this Security Role Ref test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected SecurityRoleRef fixture = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static void main(String[] args) {
+		TestRunner.run(SecurityRoleRefTest.class);
+	}
+
+	/**
+	 * Constructs a new Security Role Ref test case with the given name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public SecurityRoleRefTest(String name) {
+		super(name);
+	}
+
+	/**
+	 * Sets the fixture for this Security Role Ref test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void setFixture(SecurityRoleRef fixture) {
+		this.fixture = fixture;
+	}
+
+	/**
+	 * Returns the fixture for this Security Role Ref test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private SecurityRoleRef getFixture() {
+		return fixture;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#setUp()
+	 * @generated
+	 */
+	protected void setUp() throws Exception {
+		setFixture(CommonFactory.eINSTANCE.createSecurityRoleRef());
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#tearDown()
+	 * @generated
+	 */
+	protected void tearDown() throws Exception {
+		setFixture(null);
+	}
+
+} //SecurityRoleRefTest
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/SecurityRoleTest.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/SecurityRoleTest.java
new file mode 100644
index 0000000..8114a3e
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/SecurityRoleTest.java
@@ -0,0 +1,90 @@
+/**
+ * <copyright>
+ * </copyright>
+ *
+ * $Id: SecurityRoleTest.java,v 1.1 2005/08/23 03:31:00 cbridgha Exp $
+ */
+package org.eclipse.jst.j2ee.common.tests;
+
+import junit.framework.TestCase;
+
+import junit.textui.TestRunner;
+
+import org.eclipse.jst.j2ee.common.CommonFactory;
+import org.eclipse.jst.j2ee.common.SecurityRole;
+
+/**
+ * <!-- begin-user-doc -->
+ * A test case for the model object '<em><b>Security Role</b></em>'.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class SecurityRoleTest extends TestCase {
+	/**
+	 * The fixture for this Security Role test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected SecurityRole fixture = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static void main(String[] args) {
+		TestRunner.run(SecurityRoleTest.class);
+	}
+
+	/**
+	 * Constructs a new Security Role test case with the given name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public SecurityRoleTest(String name) {
+		super(name);
+	}
+
+	/**
+	 * Sets the fixture for this Security Role test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void setFixture(SecurityRole fixture) {
+		this.fixture = fixture;
+	}
+
+	/**
+	 * Returns the fixture for this Security Role test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private SecurityRole getFixture() {
+		return fixture;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#setUp()
+	 * @generated
+	 */
+	protected void setUp() throws Exception {
+		setFixture(CommonFactory.eINSTANCE.createSecurityRole());
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#tearDown()
+	 * @generated
+	 */
+	protected void tearDown() throws Exception {
+		setFixture(null);
+	}
+
+} //SecurityRoleTest
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/UseCallerIdentityTest.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/UseCallerIdentityTest.java
new file mode 100644
index 0000000..d3cb3a8
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/tests/UseCallerIdentityTest.java
@@ -0,0 +1,70 @@
+/**
+ * <copyright>
+ * </copyright>
+ *
+ * $Id: UseCallerIdentityTest.java,v 1.1 2005/08/23 03:31:00 cbridgha Exp $
+ */
+package org.eclipse.jst.j2ee.common.tests;
+
+import junit.textui.TestRunner;
+
+import org.eclipse.jst.j2ee.common.CommonFactory;
+import org.eclipse.jst.j2ee.common.UseCallerIdentity;
+
+/**
+ * <!-- begin-user-doc -->
+ * A test case for the model object '<em><b>Use Caller Identity</b></em>'.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class UseCallerIdentityTest extends SecurityIdentityTest {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static void main(String[] args) {
+		TestRunner.run(UseCallerIdentityTest.class);
+	}
+
+	/**
+	 * Constructs a new Use Caller Identity test case with the given name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public UseCallerIdentityTest(String name) {
+		super(name);
+	}
+
+	/**
+	 * Returns the fixture for this Use Caller Identity test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private UseCallerIdentity getFixture() {
+		return (UseCallerIdentity)fixture;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#setUp()
+	 * @generated
+	 */
+	protected void setUp() throws Exception {
+		setFixture(CommonFactory.eINSTANCE.createUseCallerIdentity());
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#tearDown()
+	 * @generated
+	 */
+	protected void tearDown() throws Exception {
+		setFixture(null);
+	}
+
+} //UseCallerIdentityTest
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/core/api/test/AllCoreAPITests.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/core/api/test/AllCoreAPITests.java
new file mode 100644
index 0000000..4dd0130
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/core/api/test/AllCoreAPITests.java
@@ -0,0 +1,33 @@
+/*
+ * Created on Apr 1, 2003
+ *
+ * To change this generated comment go to 
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+package org.eclipse.jst.j2ee.core.api.test;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.jst.j2ee.core.tests.api.AllAPITest;
+
+/**
+ * To change this generated comment go to 
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+public class AllCoreAPITests {
+
+    public static Test suite() {
+        TestSuite suite = new TestSuite("Test for J2EE Core Api Test");
+        //$JUnit-BEGIN$
+		suite.addTest(AllAPITest.suite());
+
+		//$JUnit-END$
+		return suite;
+	}
+	
+	public static void main(java.lang.String[] args) {
+		junit.textui.TestRunner.main(new String[] { AllCoreAPITests.class.getName() });
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/core/api/test/AutomatedAPIBVT.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/core/api/test/AutomatedAPIBVT.java
new file mode 100644
index 0000000..6524afe
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/core/api/test/AutomatedAPIBVT.java
@@ -0,0 +1,64 @@
+/*
+ * Created on Apr 1, 2003
+ *
+ * To change this generated comment go to 
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+package org.eclipse.jst.j2ee.core.api.test;
+
+import java.net.URL;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+import junit.textui.TestRunner;
+
+import org.eclipse.core.runtime.IPluginDescriptor;
+import org.eclipse.core.runtime.Platform;
+
+
+/**
+ * @author jsholl
+ *
+ * To change this generated comment go to 
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+public class AutomatedAPIBVT extends TestSuite {
+
+    public static String baseDirectory = System.getProperty("user.dir") + java.io.File.separatorChar + "commonArchiveResources" + java.io.File.separatorChar;
+    
+    static {
+        try {
+            IPluginDescriptor pluginDescriptor = Platform.getPluginRegistry().getPluginDescriptor("org.eclipse.jst.j2ee.core.tests");
+            URL url = pluginDescriptor.getInstallURL(); 
+        	AutomatedAPIBVT.baseDirectory = Platform.asLocalURL(url).getFile() + "commonArchiveResources"+ java.io.File.separatorChar;
+		} catch (Exception e) { 
+			System.err.println("Using working directory since a workspace URL could not be located.");
+		} 
+    }
+
+    public static int unimplementedMethods;
+
+    public static void main(String[] args) {
+        unimplementedMethods = 0;
+        TestRunner.run(suite());
+        if (unimplementedMethods > 0) {
+            System.out.println("\nCalls to warnUnimpl: " + unimplementedMethods);
+        }
+    }
+
+    public AutomatedAPIBVT() {
+        super();
+        TestSuite suite = (TestSuite) AutomatedAPIBVT.suite();
+        for (int i = 0; i < suite.testCount(); i++) {
+            addTest(suite.testAt(i));
+        }
+    }
+
+    public static Test suite() {
+        TestSuite suite = new TestSuite("Test for org.eclipse.jst.j2ee.core.api.bvt");
+        //$JUnit-BEGIN$
+        suite.addTest(AllCoreAPITests.suite());
+        //$JUnit-END$
+        return suite;
+    }
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/core/tests/api/AllAPITest.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/core/tests/api/AllAPITest.java
new file mode 100644
index 0000000..59c2e80
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/core/tests/api/AllAPITest.java
@@ -0,0 +1,75 @@
+/*
+ * Created on Mar 18, 2005
+ */
+package org.eclipse.jst.j2ee.core.tests.api;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.jst.j2ee.application.test.ApplicationFactoryTest;
+import org.eclipse.jst.j2ee.application.test.ApplicationTest;
+import org.eclipse.jst.j2ee.client.test.ApplicationClientTest;
+import org.eclipse.jst.j2ee.client.test.ClientFactoryTest;
+import org.eclipse.jst.j2ee.common.test.CommonFactoryTest;
+import org.eclipse.jst.j2ee.common.test.EjbRefTest;
+import org.eclipse.jst.j2ee.common.test.ListenerTest;
+import org.eclipse.jst.j2ee.common.test.QNameTest;
+import org.eclipse.jst.j2ee.ejb.test.AssemblyDescriptorTest;
+import org.eclipse.jst.j2ee.ejb.test.CMPAttributeTest;
+import org.eclipse.jst.j2ee.ejb.test.CMRFieldTest;
+import org.eclipse.jst.j2ee.ejb.test.ContainerManagedEntityTest;
+import org.eclipse.jst.j2ee.ejb.test.EJBRelationTest;
+import org.eclipse.jst.j2ee.ejb.test.EJBRelationshipRoleTest;
+import org.eclipse.jst.j2ee.ejb.test.EjbFactoryTest;
+import org.eclipse.jst.j2ee.ejb.test.EntityTest;
+import org.eclipse.jst.j2ee.ejb.test.MethodElementTest;
+import org.eclipse.jst.j2ee.ejb.test.MethodPermissionTest;
+import org.eclipse.jst.j2ee.ejb.test.QueryMethodTest;
+import org.eclipse.jst.j2ee.ejb.test.QueryTest;
+import org.eclipse.jst.j2ee.ejb.test.SessionTest;
+import org.eclipse.jst.j2ee.jca.test.ConnectorTest;
+import org.eclipse.jst.j2ee.jca.test.JcaFactoryTest;
+import org.eclipse.jst.j2ee.jsp.test.JspFactoryTest;
+import org.eclipse.jst.j2ee.webapplication.test.WebapplicationFactoryTest;
+import org.eclipse.jst.j2ee.webservice.wscommon.test.WscommonFactoryTest;
+import org.eclipse.jst.j2ee.webservice.wsdd.test.WsddFactoryTest;
+
+public class AllAPITest  extends TestSuite {
+
+	 public static Test suite(){
+        return new AllAPITest();
+    }
+    
+    public AllAPITest(){
+        super("J2EE Core API Tests");
+        addTest(ApplicationFactoryTest.suite());
+        addTest(ApplicationTest.suite());
+        addTest(ApplicationClientTest.suite());
+        addTest(ClientFactoryTest.suite());
+        addTest(CommonFactoryTest.suite());
+        addTest(EjbRefTest.suite());
+        addTest(ListenerTest.suite());
+        addTest(QNameTest.suite());
+        addTest(AssemblyDescriptorTest.suite());
+        addTest(CMPAttributeTest.suite());
+        addTest(CMRFieldTest.suite());
+        addTest(ContainerManagedEntityTest.suite());
+        addTest(EjbFactoryTest.suite());
+        addTest(EJBRelationshipRoleTest.suite());
+        addTest(EJBRelationTest.suite());
+        addTest(EntityTest.suite());
+        addTest(MethodElementTest.suite());
+        addTest(MethodPermissionTest.suite());
+        addTest(QueryMethodTest.suite());
+        addTest(QueryTest.suite());
+        addTest(SessionTest.suite());
+        addTest(ConnectorTest.suite());
+        addTest(JcaFactoryTest.suite());
+        addTest(JspFactoryTest.suite());
+        addTest(WebapplicationFactoryTest.suite());
+        addTest(WscommonFactoryTest.suite());
+        addTest(WsddFactoryTest.suite());
+        
+    }
+	
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/AssemblyDescriptorTest.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/AssemblyDescriptorTest.java
new file mode 100644
index 0000000..1876e42
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/AssemblyDescriptorTest.java
@@ -0,0 +1,220 @@
+package org.eclipse.jst.j2ee.ejb.test;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.TestSuite;
+
+import org.eclipse.jst.j2ee.common.CommonPackage;
+import org.eclipse.jst.j2ee.common.SecurityRole;
+import org.eclipse.jst.j2ee.ejb.AssemblyDescriptor;
+import org.eclipse.jst.j2ee.ejb.EJBResource;
+import org.eclipse.jst.j2ee.ejb.EnterpriseBean;
+import org.eclipse.jst.j2ee.ejb.MethodPermission;
+import org.eclipse.jst.j2ee.ejb.MethodTransaction;
+
+public class AssemblyDescriptorTest extends EjbEMFTestBase {
+
+    /**
+	 * @param name
+	 */
+	public AssemblyDescriptorTest(String name) {
+		super(name);
+	}
+	
+		
+	public void test_getMethodPermissionMethodElements() throws Exception {
+		init();
+		EJBResource DD = (EJBResource) ejbFile.getDeploymentDescriptorResource();
+		AssemblyDescriptor assemblyDescriptor = DD.getEJBJar().getAssemblyDescriptor();
+		assertNotNull(assemblyDescriptor);
+		List enterpriseBeans = DD.getEJBJar().getEnterpriseBeans();
+		EnterpriseBean eb1 = (EnterpriseBean)enterpriseBeans.get(0);
+		List methodPermissionList = assemblyDescriptor.getMethodPermissionMethodElements(eb1);
+		
+		
+		List allMethodElements = new ArrayList();
+		List permissions = assemblyDescriptor.getMethodPermissions();
+		MethodPermission permission;
+		for (int i = 0; i < permissions.size(); i++){
+			permission = (MethodPermission) permissions.get(i);
+			allMethodElements.addAll(permission.getMethodElements(eb1)); 
+		}
+		assertEquals(methodPermissionList,allMethodElements);
+		
+	}
+	
+	/**
+	 * @param expected
+	 * @param actual
+	 */
+	public static void assertEquals(List expected, List actual) {
+		assertEquals(actual.size(), expected.size());
+		for (int x=0; x< expected.size(); ++x) {
+			Object o = expected.get(x);
+			assertEquals(actual.contains(o), true);
+		}
+
+	}
+	
+    public static junit.framework.Test suite() {
+		TestSuite suite = new TestSuite();
+		suite.addTest(new AssemblyDescriptorTest("test_getMethodPermissionMethodElements"));
+		suite.addTest(new AssemblyDescriptorTest("test_getMethodTransactionMethodElements"));
+		suite.addTest(new AssemblyDescriptorTest("test_getSecurityRoleNamed"));
+		suite.addTest(new AssemblyDescriptorTest("test_renameSecurityRole"));
+		suite.addTest(new AssemblyDescriptorTest("test_removeData"));
+		
+		
+		return suite;
+	}
+
+	
+  /*  public void test_getMethodPermission() {
+
+        AssemblyDescriptor objAssemblyDescriptor = getInstance();
+        List securityRolesList = null;
+        MethodPermission retValue = null;
+        retValue = objAssemblyDescriptor
+                .getMethodPermission(securityRolesList);
+    } */
+
+ 
+
+    public void test_getMethodTransactionMethodElements() throws Exception {
+    	init();
+    	EJBResource DD = (EJBResource) ejbFile.getDeploymentDescriptorResource();
+		AssemblyDescriptor assemblyDescriptor = DD.getEJBJar().getAssemblyDescriptor();
+		assertNotNull(assemblyDescriptor);
+		List enterpriseBeans = DD.getEJBJar().getEnterpriseBeans();
+		EnterpriseBean eb1 = (EnterpriseBean)enterpriseBeans.get(0);
+		List methodTransactionList = assemblyDescriptor.getMethodTransactionMethodElements(eb1);
+		
+		
+		List allMethodElements = new ArrayList();
+		List transactions = assemblyDescriptor.getMethodTransactions();
+		MethodTransaction transaction;
+		for (int i = 0; i < transactions.size(); i++){
+			transaction = (MethodTransaction) transactions.get(i);
+			allMethodElements.addAll(transaction.getMethodElements(eb1)); 
+		}
+		assertEquals(methodTransactionList,allMethodElements);
+    }
+
+
+
+	public void test_getSecurityRoleNamed()throws Exception {
+		init();
+		EJBResource DD = (EJBResource) ejbFile.getDeploymentDescriptorResource();
+		AssemblyDescriptor assemblyDescriptor = DD.getEJBJar().getAssemblyDescriptor();
+		assertNotNull(assemblyDescriptor);
+		SecurityRole securityRole= CommonPackage.eINSTANCE.getCommonFactory().createSecurityRole();
+		String securityRoleName = "testRole";
+		securityRole.setRoleName(securityRoleName);
+		assemblyDescriptor.getSecurityRoles().add(securityRole);
+		SecurityRole retValue = assemblyDescriptor.getSecurityRoleNamed(securityRoleName) ;
+		assertEquals(retValue,securityRole);
+	}
+
+    public void test_renameSecurityRole() throws Exception {
+    	init();
+    	EJBResource DD = (EJBResource) ejbFile.getDeploymentDescriptorResource();
+		AssemblyDescriptor assemblyDescriptor = DD.getEJBJar().getAssemblyDescriptor();
+		assertNotNull(assemblyDescriptor);
+		String securityRoleName = "testRole";
+		
+		SecurityRole securityRole= CommonPackage.eINSTANCE.getCommonFactory().createSecurityRole();
+		
+		securityRole.setRoleName(securityRoleName);
+		assemblyDescriptor.getSecurityRoles().add(securityRole);
+		String newSecurityRoleName = "newTestRole" ;
+		SecurityRole retValue = assemblyDescriptor.getSecurityRoleNamed(newSecurityRoleName) ;
+		assertNull(retValue);
+		assemblyDescriptor.renameSecurityRole(securityRoleName,
+					newSecurityRoleName);
+		retValue = assemblyDescriptor.getSecurityRoleNamed(newSecurityRoleName) ;
+		assertNotNull(retValue);
+		
+    }
+
+   /* public void test_getMethodPermissions() {
+
+        AssemblyDescriptor objAssemblyDescriptor = getInstance();
+        EList retValue = null;
+        retValue = objAssemblyDescriptor.getMethodPermissions();
+    }*/
+
+   /* public void test_getMethodTransactions() {
+
+        AssemblyDescriptor objAssemblyDescriptor = getInstance();
+        EList retValue = null;
+        retValue = objAssemblyDescriptor.getMethodTransactions();
+    } */
+
+  /*  public void test_getEjbJar() {
+
+        AssemblyDescriptor objAssemblyDescriptor = getInstance();
+        EJBJar retValue = null;
+        retValue = objAssemblyDescriptor.getEjbJar();
+    }
+
+    public void test_setEjbJar() {
+
+        AssemblyDescriptor objAssemblyDescriptor = getInstance();
+        EJBJar newEjbJar = null;
+        objAssemblyDescriptor.setEjbJar(newEjbJar);
+    } */
+
+  /*  public void test_getSecurityRoles() {
+
+        AssemblyDescriptor objAssemblyDescriptor = getInstance();
+        EList retValue = null;
+        retValue = objAssemblyDescriptor.getSecurityRoles();
+    }*/
+
+ /*   public void test_getExcludeList() {
+
+        AssemblyDescriptor objAssemblyDescriptor = getInstance();
+        ExcludeList retValue = null;
+        retValue = objAssemblyDescriptor.getExcludeList();
+    } */
+
+   
+
+   /* public void test_setExcludeList() {
+
+        AssemblyDescriptor objAssemblyDescriptor = getInstance();
+        ExcludeList newExcludeList = null;
+        objAssemblyDescriptor.setExcludeList(newExcludeList);
+    } */
+
+ /*   public void test_getMessageDestinations() {
+
+        AssemblyDescriptor objAssemblyDescriptor = getInstance();
+        EList retValue = null;
+        retValue = objAssemblyDescriptor.getMessageDestinations();
+    } */
+
+    public void test_removeData() throws Exception {
+    	init();
+    	EJBResource DD = (EJBResource) ejbFile.getDeploymentDescriptorResource();
+		AssemblyDescriptor assemblyDescriptor = DD.getEJBJar().getAssemblyDescriptor();
+		assertNotNull(assemblyDescriptor);
+		List enterpriseBeans = DD.getEJBJar().getEnterpriseBeans();
+		EnterpriseBean eb1 = (EnterpriseBean)enterpriseBeans.get(0);
+		List methodTransactionList = assemblyDescriptor.getMethodTransactionMethodElements(eb1);
+		List methodPermissionList = assemblyDescriptor.getMethodPermissionMethodElements(eb1);
+		assertEquals(methodTransactionList.size() > 0, true);
+		assertEquals(methodPermissionList.size() > 0, true); 
+		
+		assemblyDescriptor.removeData(eb1);
+		
+		methodTransactionList = assemblyDescriptor.getMethodTransactionMethodElements(eb1);
+		methodPermissionList = assemblyDescriptor.getMethodPermissionMethodElements(eb1);
+		assertEquals(methodTransactionList.size() == 0, true);
+		assertEquals(methodPermissionList.size() == 0, true); 
+        
+    	
+    }
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/CMPAttributeTest.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/CMPAttributeTest.java
new file mode 100644
index 0000000..dcafc0d
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/CMPAttributeTest.java
@@ -0,0 +1,186 @@
+package org.eclipse.jst.j2ee.ejb.test;
+
+import java.util.List;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.eclipse.jem.java.JavaHelpers;
+import org.eclipse.jem.java.JavaRefFactory;
+import org.eclipse.jst.j2ee.ejb.CMPAttribute;
+import org.eclipse.jst.j2ee.ejb.ContainerManagedEntity;
+import org.eclipse.jst.j2ee.ejb.EJBJar;
+import org.eclipse.jst.j2ee.ejb.EjbFactory;
+import org.eclipse.jst.j2ee.ejb.EjbPackage;
+
+public class CMPAttributeTest extends TestCase {
+
+	private EjbFactory EJBFACTORY = EjbPackage.eINSTANCE.getEjbFactory();
+	
+	public CMPAttributeTest(String name) {
+		super(name);
+	}
+	
+	private CMPAttribute getInstance() {
+		return EjbPackage.eINSTANCE.getEjbFactory().createCMPAttribute();
+	
+	}  
+   /* public void test_getField() {
+
+        CMPAttribute objCMPAttribute = getInstance();
+        Field retValue = null;
+        retValue = objCMPAttribute.getField();
+    } */
+
+    public void test_getGetterName() {
+        CMPAttribute objCMPAttribute = getInstance();
+        String name = "attrName" ;
+        String getterName = "get" + name.substring(0, 1).toUpperCase() + (name.length() > 1 ? name.substring(1) : "");
+        objCMPAttribute.setName(name);
+        String retValue = objCMPAttribute.getGetterName();
+        assertEquals(getterName,retValue);
+    }
+
+    public void test_getOriginatingType() {
+        CMPAttribute objCMPAttribute = getInstance();
+        JavaHelpers retValue = null;
+        retValue = objCMPAttribute.getOriginatingType();
+        assertNull(retValue);
+        JavaHelpers newValue = JavaRefFactory.eINSTANCE.createClassRef("java.lang.String");
+        objCMPAttribute.setOriginatingType(newValue);
+        retValue = objCMPAttribute.getOriginatingType();
+        assertEquals(retValue,newValue);
+    }
+
+    public void test_getSetterName() {
+    	  CMPAttribute objCMPAttribute = getInstance();
+          String name = "attrName" ;
+          String setterName = "set" + name.substring(0, 1).toUpperCase() + (name.length() > 1 ? name.substring(1) : "");
+          objCMPAttribute.setName(name);
+          String retValue = objCMPAttribute.getSetterName();
+          assertEquals(setterName,retValue);
+    }
+
+    public void test_getType() throws Exception {
+		CMPAttribute objCMPAttribute = getInstance();
+		String name = "attrName" ;
+        objCMPAttribute.setName(name);
+       JavaHelpers newValue = JavaRefFactory.eINSTANCE.createClassRef("java.lang.String");
+        objCMPAttribute.setEType(newValue);
+        JavaHelpers retValue = null;
+        retValue = objCMPAttribute.getType();
+        assertEquals(newValue,retValue);
+        
+		
+    }
+
+  
+
+
+    public void test_isCMRField() {
+    	CMPAttribute objCMPAttribute = getInstance();
+    	boolean retValue = objCMPAttribute.isCMRField();
+        assertEquals(retValue,false);
+        objCMPAttribute = EJBFACTORY.createCMRField();
+        retValue = objCMPAttribute.isCMRField();
+        assertEquals(retValue,true);
+        
+    }
+
+    public void test_isKey() {
+    	EJBJar jar = EJBFACTORY.createEJBJar();
+    	ContainerManagedEntity entity = EJBFACTORY.createContainerManagedEntity();
+    	entity.setName("Foo");
+    	jar.getEnterpriseBeans().add(entity);
+        CMPAttribute objCMPAttribute = getInstance();
+        objCMPAttribute.setName("fooAttr");
+        entity.getPersistentAttributes().add(objCMPAttribute);
+        JavaHelpers newValue = JavaRefFactory.eINSTANCE.createClassRef("java.lang.String");
+        objCMPAttribute.setEType(newValue);
+        ((ContainerManagedEntity)jar.getEnterpriseBeanNamed(entity.getName())).getCMPAttribute().add(objCMPAttribute);
+        CMPAttribute retAttribute = (CMPAttribute)entity.getCMPAttribute().get(0);
+        boolean retValue = false;
+        retValue = retAttribute.isKey();
+        assertEquals(retValue,false);
+        List list = entity.getKeyAttributes();
+        list.add(objCMPAttribute);
+        retValue = retAttribute.isKey();
+        assertEquals(retValue,true);
+    }
+
+    public void test_isPrimKeyField() {
+    	ContainerManagedEntity entity = EJBFACTORY.createContainerManagedEntity();
+        CMPAttribute objCMPAttribute = getInstance();
+        List list = entity.getCMPAttribute();
+        entity.getPersistentAttributes().add(objCMPAttribute);
+        list.add(objCMPAttribute);
+        boolean retValue = false;
+        retValue = objCMPAttribute.isPrimKeyField();
+        assertEquals(retValue,false);
+        entity.setPrimKeyField(objCMPAttribute);
+        retValue = false;
+        retValue = objCMPAttribute.isPrimKeyField();
+        assertEquals(retValue,true);
+    }
+
+    public void test_setOriginatingType() {
+
+    	CMPAttribute objCMPAttribute = getInstance();
+        JavaHelpers retValue = null;
+        retValue = objCMPAttribute.getOriginatingType();
+        assertNull(retValue);
+        JavaHelpers newValue = JavaRefFactory.eINSTANCE.createClassRef("java.lang.String");
+        objCMPAttribute.setOriginatingType(newValue);
+        retValue = objCMPAttribute.getOriginatingType();
+        assertEquals(retValue,newValue);
+    }
+
+   /* public void test_getDescription() {
+
+        CMPAttribute objCMPAttribute = getInstance();
+        String retValue = "";
+        retValue = objCMPAttribute.getDescription();
+    }
+
+    public void test_setDescription() {
+
+        CMPAttribute objCMPAttribute = getInstance();
+        String newDescription = "";
+        objCMPAttribute.setDescription(newDescription);
+    }*/
+
+  
+    
+    public void test_isDerived() {
+
+    	 CMPAttribute objCMPAttribute = getInstance();
+         boolean aBoolean = false;
+         objCMPAttribute.setDerived(aBoolean);
+         boolean retVal = objCMPAttribute.isDerived();
+         assertEquals(retVal,aBoolean);
+         aBoolean = true;
+         objCMPAttribute.setDerived(aBoolean);
+         retVal = objCMPAttribute.isDerived();
+         assertEquals(retVal,aBoolean);
+    }
+
+    public void test_setDerived() {
+
+        CMPAttribute objCMPAttribute = getInstance();
+        boolean aBoolean = false;
+        objCMPAttribute.setDerived(aBoolean);
+        boolean retVal = objCMPAttribute.isDerived();
+        assertEquals(retVal,aBoolean);
+        aBoolean = true;
+        objCMPAttribute.setDerived(aBoolean);
+        retVal = objCMPAttribute.isDerived();
+        assertEquals(retVal,aBoolean);
+    }
+
+    public static Test suite() {
+		return new TestSuite(CMPAttributeTest.class);
+	}
+
+   
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/CMRFieldTest.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/CMRFieldTest.java
new file mode 100644
index 0000000..8dc74b0
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/CMRFieldTest.java
@@ -0,0 +1,87 @@
+package org.eclipse.jst.j2ee.ejb.test;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.eclipse.jem.java.JavaClass;
+import org.eclipse.jem.java.JavaRefFactory;
+import org.eclipse.jst.j2ee.ejb.CMRField;
+import org.eclipse.jst.j2ee.ejb.EJBRelationshipRole;
+import org.eclipse.jst.j2ee.ejb.EjbFactory;
+import org.eclipse.jst.j2ee.ejb.EjbPackage;
+
+public class CMRFieldTest extends TestCase {
+	protected EjbFactory EJBFACTORY = EjbPackage.eINSTANCE.getEjbFactory();
+
+	private CMRField getInstance() {
+		return EJBFACTORY.createCMRField();
+	}
+	
+   public void test_getCollectionTypeName() {
+	   	CMRField objCMRField = getInstance();
+	    String typeName = "testName";
+	    objCMRField.setCollectionTypeName(typeName);
+	    String retValue = "";
+	    retValue = objCMRField.getCollectionTypeName();
+	    assertEquals(typeName,retValue);
+    }
+
+ 
+    public void test_setCollectionTypeName() {
+
+        CMRField objCMRField = getInstance();
+        String typeName = "testName";
+        objCMRField.setCollectionTypeName(typeName);
+        String retValue = "";
+        retValue = objCMRField.getCollectionTypeName();
+        assertEquals(typeName,retValue);
+    }
+
+    public void test_getRole() {
+    	 CMRField objCMRField = getInstance();
+         EJBRelationshipRole newRole = EJBFACTORY.createEJBRelationshipRole();
+         newRole.setName("Role1");
+         objCMRField.setRole(newRole);
+         EJBRelationshipRole retValue = objCMRField.getRole();
+         assertEquals(newRole,retValue);
+    }
+
+    public void test_setRole() {
+        CMRField objCMRField = getInstance();
+        EJBRelationshipRole newRole = EJBFACTORY.createEJBRelationshipRole();
+        newRole.setName("Role1");
+        objCMRField.setRole(newRole);
+        EJBRelationshipRole retValue = objCMRField.getRole();
+        assertEquals(newRole,retValue);
+        
+    }
+
+    public void test_getCollectionType() {
+
+    	 CMRField objCMRField = getInstance();
+         JavaClass newCollectionType = JavaRefFactory.eINSTANCE.createJavaClass();
+         objCMRField.setCollectionType(newCollectionType);
+         JavaClass retVal = objCMRField.getCollectionType();
+         assertEquals(newCollectionType,retVal);
+    }
+
+   
+    public void test_setCollectionType() {
+
+        CMRField objCMRField = getInstance();
+        JavaClass newCollectionType = JavaRefFactory.eINSTANCE.createJavaClass();
+        objCMRField.setCollectionType(newCollectionType);
+        JavaClass retVal = objCMRField.getCollectionType();
+        assertEquals(newCollectionType,retVal);
+    }
+    
+    public static Test suite() {
+		return new TestSuite(CMRFieldTest.class);
+	}
+
+
+   
+    
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/ContainerManagedEntityTest.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/ContainerManagedEntityTest.java
new file mode 100644
index 0000000..464df5c
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/ContainerManagedEntityTest.java
@@ -0,0 +1,398 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.ejb.test;
+
+import java.util.List;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.eclipse.jem.java.Field;
+import org.eclipse.jem.java.internal.impl.JavaRefFactoryImpl;
+import org.eclipse.jst.j2ee.ejb.CMPAttribute;
+import org.eclipse.jst.j2ee.ejb.ContainerManagedEntity;
+import org.eclipse.jst.j2ee.ejb.EjbFactory;
+import org.eclipse.jst.j2ee.ejb.EjbPackage;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+
+public class ContainerManagedEntityTest extends TestCase {
+	
+	private static final EjbFactory EJBFACTORY = EjbPackage.eINSTANCE.getEjbFactory();
+
+	public static Test suite() {
+		return new TestSuite(ContainerManagedEntityTest.class);
+	}
+	
+	private ContainerManagedEntity getInstance() {
+		return EJBFACTORY.createContainerManagedEntity();
+	}
+    public void test_addKeyAttributeName() {
+    	ContainerManagedEntity objContainerManagedEntity = getInstance();
+        CMPAttribute cmpAttribute = EJBFACTORY.createCMPAttribute();
+        List persistentAttributes = objContainerManagedEntity.getPersistentAttributes();
+        persistentAttributes.add(cmpAttribute);
+        String attrName = "attr1" ;
+        cmpAttribute.setName(attrName);
+        objContainerManagedEntity.addKeyAttributeName(attrName);
+        List keys = objContainerManagedEntity.getKeyAttributes();
+        boolean retValue = keys.contains(cmpAttribute);
+        assertEquals(retValue,true);
+   }
+
+   
+    public void test_addPersistentAttribute() {
+        ContainerManagedEntity objContainerManagedEntity = getInstance();
+        Field aField = JavaRefFactoryImpl.getActiveFactory().createField();
+        String name ="attr1" ;
+        aField.setName(name);
+        CMPAttribute retValue = null;
+        retValue = objContainerManagedEntity.addPersistentAttribute(aField);
+        assertNotNull(retValue);
+        retValue = objContainerManagedEntity.getPersistentAttribute(name);
+        assertNotNull(retValue);
+    }
+
+    public void test_addPersistentAttributeName() {
+
+        ContainerManagedEntity objContainerManagedEntity = getInstance();
+        String name ="attr1" ;
+        CMPAttribute retValue = null;
+        retValue = objContainerManagedEntity.addPersistentAttributeName(name);
+        assertNotNull(retValue);
+        retValue = objContainerManagedEntity.getPersistentAttribute(name);
+        assertNotNull(retValue);
+    }
+
+   
+    public void test_getKeyAttribute() {
+        ContainerManagedEntity objContainerManagedEntity = getInstance();
+        CMPAttribute cmpAttribute = EJBFACTORY.createCMPAttribute();
+        List persistentAttributes = objContainerManagedEntity.getPersistentAttributes();
+        persistentAttributes.add(cmpAttribute);
+        String attrName = "attr1" ;
+        cmpAttribute.setName(attrName);
+        objContainerManagedEntity.addKeyAttributeName(attrName);
+        CMPAttribute retValue = objContainerManagedEntity.getKeyAttribute(attrName);
+       
+        assertEquals(retValue,cmpAttribute);
+        
+    }
+
+  
+    public void test_getPrimaryKeyAttribute() {
+
+	  ContainerManagedEntity objContainerManagedEntity = getInstance();
+      CMPAttribute cmpAttribute = EJBFACTORY.createCMPAttribute();
+      List persistentAttributes = objContainerManagedEntity.getPersistentAttributes();
+      persistentAttributes.add(cmpAttribute);
+      String attrName = "attr1" ;
+      cmpAttribute.setName(attrName);
+      CMPAttribute retValue = objContainerManagedEntity.getPrimaryKeyAttribute();
+      assertNotSame(retValue,cmpAttribute);
+      objContainerManagedEntity.setPrimKeyField(cmpAttribute);
+      retValue = objContainerManagedEntity.getPrimaryKeyAttribute();
+      assertEquals(retValue,cmpAttribute);
+    }
+
+    public void test_isContainerManagedEntity() {
+
+        ContainerManagedEntity objContainerManagedEntity = getInstance();
+        boolean retValue = false;
+        retValue = objContainerManagedEntity.isContainerManagedEntity();
+        assertEquals(retValue,true);
+    }
+
+    public void test_isKeyAttribute() {
+
+    	ContainerManagedEntity objContainerManagedEntity = getInstance();
+        CMPAttribute cmpAttribute = EJBFACTORY.createCMPAttribute();
+        List persistentAttributes = objContainerManagedEntity.getPersistentAttributes();
+        persistentAttributes.add(cmpAttribute);
+        String attrName = "attr1" ;
+        cmpAttribute.setName(attrName);
+        boolean retValue = objContainerManagedEntity.isKeyAttribute(cmpAttribute);
+        assertEquals(retValue,false);
+        objContainerManagedEntity.addKeyAttributeName(attrName);
+        retValue = objContainerManagedEntity.isKeyAttribute(cmpAttribute);
+        assertEquals(retValue,true);
+        
+    }
+    
+    public void test_removePersistentAttribute_2() {
+    	ContainerManagedEntity objContainerManagedEntity = getInstance();
+        CMPAttribute cmpAttribute = EJBFACTORY.createCMPAttribute();
+        List persistentAttributes = objContainerManagedEntity.getPersistentAttributes();
+        persistentAttributes.add(cmpAttribute);
+        String attrName = "attr1" ;
+        cmpAttribute.setName(attrName);
+        CMPAttribute retValue = objContainerManagedEntity.getPersistentAttribute(attrName);
+        assertNotNull(retValue);
+        retValue = objContainerManagedEntity.removePersistentAttribute(attrName);
+        assertNotNull(retValue);
+        retValue = objContainerManagedEntity.getPersistentAttribute(attrName);
+        assertNull(retValue);
+    }
+    
+    
+    public void test_removePersistentAttribute() {
+
+    	 ContainerManagedEntity objContainerManagedEntity = getInstance();
+         Field aField = JavaRefFactoryImpl.getActiveFactory().createField();
+         String name ="attr1" ;
+         aField.setName(name);
+         CMPAttribute retValue = null;
+         retValue = objContainerManagedEntity.addPersistentAttribute(aField);
+         assertNotNull(retValue);
+         
+         retValue = objContainerManagedEntity.getPersistentAttribute(name);
+         assertNotNull(retValue);
+         
+         retValue = objContainerManagedEntity.removePersistentAttribute(aField);
+         assertNotNull(retValue);
+         
+         retValue = objContainerManagedEntity.getPersistentAttribute(name);
+         assertNull(retValue);
+    }
+    
+    public void test_setPrimKeyField() {
+
+  	  ContainerManagedEntity objContainerManagedEntity = getInstance();
+        CMPAttribute cmpAttribute = EJBFACTORY.createCMPAttribute();
+        List persistentAttributes = objContainerManagedEntity.getPersistentAttributes();
+        persistentAttributes.add(cmpAttribute);
+        String attrName = "attr1" ;
+        cmpAttribute.setName(attrName);
+        CMPAttribute retValue = objContainerManagedEntity.getPrimKeyField();
+        assertNotSame(retValue,cmpAttribute);
+        objContainerManagedEntity.setPrimKeyField(cmpAttribute);
+        retValue = objContainerManagedEntity.getPrimKeyField();
+        assertEquals(retValue,cmpAttribute);
+  }
+
+   
+    public void test_isVersion1_X() {
+        ContainerManagedEntity objContainerManagedEntity = getInstance();
+        objContainerManagedEntity.setVersion(ContainerManagedEntity.VERSION_1_X);
+        boolean retValue = false;
+        retValue = objContainerManagedEntity.isVersion1_X();
+        assertEquals(retValue,true);
+        objContainerManagedEntity.setVersion(ContainerManagedEntity.VERSION_2_X);
+        retValue = objContainerManagedEntity.isVersion1_X();
+        assertEquals(retValue,false);
+    }
+
+    public void test_isVersion2_X() {
+
+    	 ContainerManagedEntity objContainerManagedEntity = getInstance();
+         objContainerManagedEntity.setVersion(ContainerManagedEntity.VERSION_2_X);
+         boolean retValue = false;
+         retValue = objContainerManagedEntity.isVersion2_X();
+         assertEquals(retValue,true);
+         objContainerManagedEntity.setVersion(ContainerManagedEntity.VERSION_1_X);
+         retValue = objContainerManagedEntity.isVersion2_X();
+         assertEquals(retValue,false);
+    }
+    
+    public void test_listPersistentFieldNames() {
+
+    	ContainerManagedEntity objContainerManagedEntity = getInstance();
+        CMPAttribute cmpAttribute1 = EJBFACTORY.createCMPAttribute();
+        String attrName1 = "attr1" ;
+        cmpAttribute1.setName(attrName1);
+        
+        CMPAttribute cmpAttribute2 = EJBFACTORY.createCMPAttribute();
+        String attrName2 = "attr2" ;
+        cmpAttribute2.setName(attrName2);
+        
+        List persistentAttributes = objContainerManagedEntity.getPersistentAttributes();
+        persistentAttributes.add(cmpAttribute1);
+        persistentAttributes.add(cmpAttribute2);
+        
+        String[] retValue = null;
+        retValue = objContainerManagedEntity.listPersistentFieldNames();
+        assertNotNull(retValue);
+        assertEquals(retValue.length == 2, true);
+        assertEquals((retValue[0]==attrName1 || retValue[1]==attrName1) , true);
+        assertEquals((retValue[0]==attrName2 || retValue[1]==attrName2) , true);
+         
+    }
+
+    public void test_isUnknownPrimaryKey() {
+
+        ContainerManagedEntity objContainerManagedEntity = getInstance();
+        objContainerManagedEntity.setPrimaryKeyName("java.lang.String");
+        
+        boolean retValue = false;
+        retValue = objContainerManagedEntity.isUnknownPrimaryKey();
+        assertEquals(retValue,false);
+        
+        objContainerManagedEntity.setPrimaryKeyName("java.lang.Object");
+        retValue = objContainerManagedEntity.isUnknownPrimaryKey();
+        assertEquals(retValue,true);
+        
+        
+    }
+  
+    // TODO
+   /* public void test_makePrimKeyFieldProxy() {
+
+        ContainerManagedEntity objContainerManagedEntity = getInstance();
+        objContainerManagedEntity.makePrimKeyFieldProxy();
+    }
+
+    public void test_getAllAvailableQueryMethods() {
+
+        ContainerManagedEntity objContainerManagedEntity = getInstance();
+        List retValue = null;
+        retValue = objContainerManagedEntity.getAllAvailableQueryMethods();
+    }
+
+    public void test_getAvailableSelectQueryMethods() {
+
+        ContainerManagedEntity objContainerManagedEntity = getInstance();
+        List retValue = null;
+        retValue = objContainerManagedEntity
+                .getAvailableSelectQueryMethods();
+    }
+
+    public void test_getAvailableFindQueryMethods() {
+
+        ContainerManagedEntity objContainerManagedEntity = getInstance();
+        List retValue = null;
+        retValue = objContainerManagedEntity.getAvailableFindQueryMethods();
+    } */
+
+    public void test_getCMPVersionID() throws IllegalStateException {
+
+        ContainerManagedEntity objContainerManagedEntity = getInstance();
+        objContainerManagedEntity.setVersion(ContainerManagedEntity.VERSION_1_X);
+        int retValue = 0;
+        retValue = objContainerManagedEntity.getCMPVersionID();
+        assertEquals(J2EEVersionConstants.EJB_1_1_ID, retValue);
+        objContainerManagedEntity.setVersion(ContainerManagedEntity.VERSION_2_X);
+        
+        retValue = objContainerManagedEntity.getCMPVersionID();
+        assertEquals(J2EEVersionConstants.EJB_2_0_ID, retValue);
+        
+    }
+  
+   
+
+  /*  public void test_getCMRFields() {
+
+        ContainerManagedEntity objContainerManagedEntity = getInstance();
+        List retValue = null;
+        retValue = objContainerManagedEntity.getCMRFields();
+    }
+
+   
+    public void test_getRoles() {
+
+        ContainerManagedEntity objContainerManagedEntity = getInstance();
+        List retValue = null;
+        retValue = objContainerManagedEntity.getRoles();
+    }
+
+    public void test_getRole() {
+        ContainerManagedEntity objContainerManagedEntity = getInstance();
+        EJBRelationshipRole role = EJBFACTORY.createEJBRelationshipRole();
+        String roleName = "role1";
+        role.setName(roleName);
+        CommonRelationshipRole retValue = null;
+        retValue = objContainerManagedEntity.getRole(roleName);
+        assertNull(retValue);
+        objContainerManagedEntity.getRoles().add(role);
+        retValue = objContainerManagedEntity.getRole(roleName);
+        assertNotNull(retValue);
+    }
+    public void test_getFilteredFeatures() {
+
+        ContainerManagedEntity objContainerManagedEntity = getInstance();
+        EJBExtensionFilter aFilter = null;
+        List retValue = null;
+        retValue = objContainerManagedEntity.getFilteredFeatures(aFilter);
+    } */
+
+    /* public void test_getPersistentAttribute() {
+
+    ContainerManagedEntity objContainerManagedEntity = getInstance();
+    String aName = "";
+    CMPAttribute retValue = null;
+    retValue = objContainerManagedEntity.getPersistentAttribute(aName);
+}*/
+
+    
+    /* public void test_getVersion() {
+
+    ContainerManagedEntity objContainerManagedEntity = getInstance();
+    String retValue = "";
+    retValue = objContainerManagedEntity.getVersion();
+}
+
+public void test_setVersion() {
+
+    ContainerManagedEntity objContainerManagedEntity = getInstance();
+    String newVersion = "";
+    objContainerManagedEntity.setVersion(newVersion);
+}*/
+
+/* public void test_getAbstractSchemaName() {
+
+    ContainerManagedEntity objContainerManagedEntity = getInstance();
+    String retValue = "";
+    retValue = objContainerManagedEntity.getAbstractSchemaName();
+}
+
+public void test_setAbstractSchemaName() {
+
+    ContainerManagedEntity objContainerManagedEntity = getInstance();
+    String newAbstractSchemaName = "";
+    objContainerManagedEntity
+            .setAbstractSchemaName(newAbstractSchemaName);
+}*/
+
+/*  public void test_getPersistentAttributes() {
+
+    ContainerManagedEntity objContainerManagedEntity = getInstance();
+    EList retValue = null;
+    retValue = objContainerManagedEntity.getPersistentAttributes();
+}*/
+
+/*public void test_getKeyAttributes() {
+
+    ContainerManagedEntity objContainerManagedEntity = getInstance();
+    EList retValue = null;
+    retValue = objContainerManagedEntity.getKeyAttributes();
+}*/
+
+/* public void test_getQueries() {
+
+    ContainerManagedEntity objContainerManagedEntity = getInstance();
+    EList retValue = null;
+    retValue = objContainerManagedEntity.getQueries();
+}*/
+
+/*  public void test_getCMPAttribute() {
+
+    ContainerManagedEntity objContainerManagedEntity = getInstance();
+    EList retValue = null;
+    retValue = objContainerManagedEntity.getCMPAttribute();
+}*/
+
+/*  public void test_getPrimKeyField() {
+
+    ContainerManagedEntity objContainerManagedEntity = getInstance();
+    CMPAttribute retValue = null;
+    retValue = objContainerManagedEntity.getPrimKeyField();
+}*/
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/EJBJarTest.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/EJBJarTest.java
new file mode 100644
index 0000000..584f290
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/EJBJarTest.java
@@ -0,0 +1,589 @@
+package org.eclipse.jst.j2ee.ejb.test;
+
+import java.util.List;
+
+import junit.framework.TestSuite;
+
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.jem.java.JavaClass;
+import org.eclipse.jem.java.JavaRefFactory;
+import org.eclipse.jst.j2ee.common.CommonFactory;
+import org.eclipse.jst.j2ee.common.CommonPackage;
+import org.eclipse.jst.j2ee.common.EjbRef;
+import org.eclipse.jst.j2ee.common.SecurityRole;
+import org.eclipse.jst.j2ee.ejb.AssemblyDescriptor;
+import org.eclipse.jst.j2ee.ejb.ContainerManagedEntity;
+import org.eclipse.jst.j2ee.ejb.EJBJar;
+import org.eclipse.jst.j2ee.ejb.EJBRelation;
+import org.eclipse.jst.j2ee.ejb.EJBRelationshipRole;
+import org.eclipse.jst.j2ee.ejb.EJBResource;
+import org.eclipse.jst.j2ee.ejb.EnterpriseBean;
+import org.eclipse.jst.j2ee.ejb.Entity;
+import org.eclipse.jst.j2ee.ejb.MessageDriven;
+import org.eclipse.jst.j2ee.ejb.Relationships;
+import org.eclipse.jst.j2ee.ejb.RoleSource;
+import org.eclipse.jst.j2ee.ejb.Session;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+
+public class EJBJarTest extends  EjbEMFTestBase {
+
+	private static final CommonFactory COMMONFACTORY = CommonPackage.eINSTANCE.getCommonFactory();
+	public EJBJarTest(String name) {
+		super(name);
+	}
+	private EJBJar getInstance() {
+		return getEjbFactory().createEJBJar();
+	}
+    public void test_EJBJar() {
+        EJBJar tmpEJBJar = getInstance();
+        assertNotNull(tmpEJBJar);
+    }
+    
+   
+    
+
+    public void test_containsContainerManagedBeans() {
+
+        EJBJar objEJBJar = getInstance();
+        Session session = getEjbFactory().createSession();
+        objEJBJar.getEnterpriseBeans().add(session);
+        
+        boolean retValue = false;
+        retValue = objEJBJar.containsContainerManagedBeans();
+        assertEquals(retValue,false);
+        
+        ContainerManagedEntity entity = getEjbFactory().createContainerManagedEntity();
+        objEJBJar.getEnterpriseBeans().add(entity);
+        
+        retValue = objEJBJar.containsContainerManagedBeans();
+        assertEquals(retValue,true);
+    }
+
+    public void test_containsSecurityRole() {
+
+        EJBJar objEJBJar = getInstance();
+        AssemblyDescriptor descriptor = getEjbFactory().createAssemblyDescriptor();
+        objEJBJar.setAssemblyDescriptor(descriptor);
+        
+        String securityRoleName = "testRole";
+        boolean retValue = false;
+        retValue = objEJBJar.containsSecurityRole(securityRoleName);
+        assertEquals(retValue, false);
+        
+        
+        SecurityRole securityRole= CommonPackage.eINSTANCE.getCommonFactory().createSecurityRole();
+		securityRole.setRoleName(securityRoleName);
+		descriptor.getSecurityRoles().add(securityRole);
+		retValue = objEJBJar.containsSecurityRole(securityRoleName) ;
+		assertEquals(retValue,true);
+    }
+    
+    
+
+    public void test_getBeanManagedBeans() {
+        EJBJar objEJBJar = getInstance();
+        Session session = getEjbFactory().createSession();
+        objEJBJar.getEnterpriseBeans().add(session);
+        
+        List retValue = null;
+        retValue = objEJBJar.getBeanManagedBeans();
+        assertEquals(retValue.size()==0,true);
+        
+        Entity entity = getEjbFactory().createEntity();
+        objEJBJar.getEnterpriseBeans().add(entity);
+        
+        retValue = objEJBJar.getBeanManagedBeans();
+        assertEquals(retValue.size()==1,true);
+        assertEquals(retValue.get(0),entity);
+    }
+
+    public void test_getContainerManagedBeans() {
+    	
+        EJBJar objEJBJar = getInstance();
+        Session session = getEjbFactory().createSession();
+        objEJBJar.getEnterpriseBeans().add(session);
+        
+        List retValue = null;
+        retValue = objEJBJar.getContainerManagedBeans();
+        assertEquals(retValue.size()==0,true);
+        
+        ContainerManagedEntity entity = getEjbFactory().createContainerManagedEntity();
+        objEJBJar.getEnterpriseBeans().add(entity);
+        
+        retValue = objEJBJar.getContainerManagedBeans();
+        assertEquals(retValue.size()==1,true);
+        assertEquals(retValue.get(0),entity);
+    }
+    
+   
+    
+
+    public void test_getEJB11ContainerManagedBeans() {
+
+    	  EJBJar objEJBJar = getInstance();
+          Session session = getEjbFactory().createSession();
+          objEJBJar.getEnterpriseBeans().add(session);
+          
+          List retValue = null;
+          retValue = objEJBJar.getEJB11ContainerManagedBeans();
+          assertEquals(retValue.size()==0,true);
+          
+          ContainerManagedEntity entity1 = getEjbFactory().createContainerManagedEntity();
+          objEJBJar.getEnterpriseBeans().add(entity1);
+          entity1.setVersion(ContainerManagedEntity.VERSION_1_X);
+          
+          ContainerManagedEntity entity2 = getEjbFactory().createContainerManagedEntity();
+          objEJBJar.getEnterpriseBeans().add(entity2);
+          entity2.setVersion(ContainerManagedEntity.VERSION_2_X);
+          
+          
+          retValue = objEJBJar.getEJB11ContainerManagedBeans();
+          assertEquals(retValue.size()==1,true);
+          assertEquals(retValue.get(0),entity1);
+    }
+       
+    public void test_getEJB20ContainerManagedBeans() {
+
+  	  EJBJar objEJBJar = getInstance();
+      Session session = getEjbFactory().createSession();
+      objEJBJar.getEnterpriseBeans().add(session);
+      
+      List retValue = null;
+      retValue = objEJBJar.getEJB20ContainerManagedBeans();
+      assertEquals(retValue.size()==0,true);
+      
+      ContainerManagedEntity entity1 = getEjbFactory().createContainerManagedEntity();
+      objEJBJar.getEnterpriseBeans().add(entity1);
+      entity1.setVersion(ContainerManagedEntity.VERSION_1_X);
+      
+      ContainerManagedEntity entity2 = getEjbFactory().createContainerManagedEntity();
+      objEJBJar.getEnterpriseBeans().add(entity2);
+      entity2.setVersion(ContainerManagedEntity.VERSION_2_X);
+      
+      
+      retValue = objEJBJar.getEJB20ContainerManagedBeans();
+      assertEquals(retValue.size()==1,true);
+      assertEquals(retValue.get(0),entity2);
+    }
+
+    
+    public void test_getMessageDrivenBeans() {
+        EJBJar objEJBJar = getInstance();
+        Session session = getEjbFactory().createSession();
+        objEJBJar.getEnterpriseBeans().add(session);
+        
+        List retValue = null;
+        retValue = objEJBJar.getMessageDrivenBeans();
+        assertEquals(retValue.size()==0,true);
+        
+        MessageDriven messageDriven = getEjbFactory().createMessageDriven();
+        objEJBJar.getEnterpriseBeans().add(messageDriven);
+        
+        retValue = objEJBJar.getMessageDrivenBeans();
+        assertEquals(retValue.size()==1,true);
+        assertEquals(retValue.get(0),messageDriven);
+    }
+
+    public void test_getEjbRelations() {
+
+        EJBJar objEJBJar = getInstance();
+        Relationships relationships = getEjbFactory().createRelationships();
+        objEJBJar.setRelationshipList(relationships);
+        relationships.setEjbJar(objEJBJar);
+        EList ejbRelations = relationships.getEjbRelations();
+        List retValue = null;
+        retValue = objEJBJar.getEjbRelations();
+        
+        assertEquals(ejbRelations,retValue);
+    }
+    
+
+   
+
+    public void test_getEnterpiseBeanFromRef() {
+    	
+    	EJBJar objEJBJar = getInstance();
+        AssemblyDescriptor descriptor = getEjbFactory().createAssemblyDescriptor();
+        objEJBJar.setAssemblyDescriptor(descriptor);
+         
+    	EjbRef ejbRef = COMMONFACTORY.createEjbRef();
+    	Session session1 = getEjbFactory().createSession();
+    	String name1 = "Name1";
+    	session1.setName(name1);
+    	
+    	Session session2 = getEjbFactory().createSession();
+    	String name2 = "Name2";
+    	session2.setName(name2);
+    	
+    	ejbRef.setLink(name2);
+    	ejbRef.setName("EjbRef_" + name2);
+    	
+    	objEJBJar.getEnterpriseBeans().add(session1);
+    	objEJBJar.getEnterpriseBeans().add(session2);
+    	
+        EnterpriseBean retValue = objEJBJar.getEnterpiseBeanFromRef(ejbRef);
+        assertEquals(session2,retValue);
+    }
+
+    public void test_getEnterpriseBeanNamed() {
+
+    	EJBJar objEJBJar = getInstance();
+        AssemblyDescriptor descriptor = getEjbFactory().createAssemblyDescriptor();
+        objEJBJar.setAssemblyDescriptor(descriptor);
+         
+    	Session session1 = getEjbFactory().createSession();
+    	String name1 = "Name1";
+    	session1.setName(name1);
+    	
+    	Session session2 = getEjbFactory().createSession();
+    	String name2 = "Name2";
+    	session2.setName(name2);
+    	
+        	
+    	objEJBJar.getEnterpriseBeans().add(session1);
+    	objEJBJar.getEnterpriseBeans().add(session2);
+    	
+        EnterpriseBean retValue = objEJBJar.getEnterpriseBeanNamed(name2);
+        assertEquals(session2,retValue);
+    }
+
+    public void test_getEnterpriseBeansWithReference() {
+
+    	EJBJar objEJBJar = getInstance();
+        AssemblyDescriptor descriptor = getEjbFactory().createAssemblyDescriptor();
+        objEJBJar.setAssemblyDescriptor(descriptor);
+         
+    	Session session1 = getEjbFactory().createSession();
+    	String name1 = "Name1";
+    	session1.setName(name1);
+    	
+    	Session session2 = getEjbFactory().createSession();
+    	String name2 = "Name2";
+    	session2.setName(name2);
+    	
+        	
+    	objEJBJar.getEnterpriseBeans().add(session1);
+    	objEJBJar.getEnterpriseBeans().add(session2);
+    	
+    	JavaClass javaClass1 = JavaRefFactory.eINSTANCE.createClassRef("java.lang.String") ;
+    	JavaClass javaClass2 = JavaRefFactory.eINSTANCE.createClassRef("java.util.List") ;
+    	
+    	session1.setEjbClass(javaClass1);
+    	session2.setEjbClass(javaClass2);
+    	
+         java.util.List retValue = null;
+         retValue = objEJBJar.getEnterpriseBeansWithReference(javaClass1);
+         assertEquals(retValue.size()==1, true);
+         assertEquals(retValue.contains(session1), true);
+         
+         session2.setHomeInterface(javaClass1);
+         retValue = objEJBJar.getEnterpriseBeansWithReference(javaClass1);
+         assertEquals(retValue.size()==2, true);
+         assertEquals(retValue.contains(session1), true);
+         assertEquals(retValue.contains(session2), true);
+         
+    }
+    
+  
+
+    public void test_getEnterpriseBeanWithReference() {
+    	
+    	EJBJar objEJBJar = getInstance();
+        AssemblyDescriptor descriptor = getEjbFactory().createAssemblyDescriptor();
+        objEJBJar.setAssemblyDescriptor(descriptor);
+         
+    	Session session1 = getEjbFactory().createSession();
+    	String name1 = "Name1";
+    	session1.setName(name1);
+    	
+    	Session session2 = getEjbFactory().createSession();
+    	String name2 = "Name2";
+    	session2.setName(name2);
+    	
+        	
+    	objEJBJar.getEnterpriseBeans().add(session1);
+    	objEJBJar.getEnterpriseBeans().add(session2);
+    	
+    	JavaClass javaClass1 = JavaRefFactory.eINSTANCE.createClassRef("java.lang.String") ;
+    	
+    	session1.setEjbClass(javaClass1);
+    	session2.setEjbClass(javaClass1);
+    	
+    	EnterpriseBean retValue = null;
+        retValue = objEJBJar.getEnterpriseBeanWithReference(javaClass1);
+        assertEquals(retValue, session1);
+        
+    }
+
+    public void test_getSessionBeans() {     
+        EJBJar objEJBJar = getInstance();
+        MessageDriven messageDriven = getEjbFactory().createMessageDriven();
+        objEJBJar.getEnterpriseBeans().add(messageDriven);
+        
+        
+        List retValue = null;
+        retValue = objEJBJar.getSessionBeans();
+        assertEquals(retValue.size()==0,true);
+        
+        Session session = getEjbFactory().createSession();
+        objEJBJar.getEnterpriseBeans().add(session);
+        
+        
+        retValue = objEJBJar.getSessionBeans();
+        assertEquals(retValue.size()==1,true);
+        assertEquals(retValue.contains(session), true);
+        
+    }
+
+
+   /* public void test_renameSecurityRole() {
+        EJBJar objEJBJar = getInstance();
+        java.lang.String existingRoleName = "";
+        java.lang.String newRoleName = "";
+        objEJBJar.renameSecurityRole(existingRoleName, newRoleName);
+    } */
+
+  /* public void test_getEjbClientJar() {
+
+        EJBJar objEJBJar = getInstance();
+        String retValue = "";
+        retValue = objEJBJar.getEjbClientJar();
+    }
+
+    public void test_setEjbClientJar() {
+
+        EJBJar objEJBJar = getInstance();
+        String newEjbClientJar = "";
+        objEJBJar.setEjbClientJar(newEjbClientJar);
+    }*/
+
+  /*  public void test_getVersion() {
+
+        EJBJar objEJBJar = getInstance();
+        String retValue = "";
+        retValue = objEJBJar.getVersion();
+    }*/
+    
+   
+    
+
+    public void test_getVersionID() throws Exception {
+
+    	init();
+    	EJBResource DD = (EJBResource) ejbFile.getDeploymentDescriptorResource();
+        DD.setVersionID(J2EEVersionConstants.J2EE_1_4_ID);
+		setVersion(VERSION_1_4);
+		setModuleType(EJB);
+		populateRoot(DD.getRootObject());
+        int retValue = 0;
+        retValue = DD.getEJBJar().getVersionID();
+        assertEquals(retValue,J2EEVersionConstants.EJB_2_1_ID);
+        
+        DD.setVersionID(J2EEVersionConstants.J2EE_1_3_ID);
+		setVersion(VERSION_1_3);
+		retValue = DD.getEJBJar().getVersionID();
+	    assertEquals(retValue,J2EEVersionConstants.EJB_2_0_ID);
+	    
+	    DD.setVersionID(J2EEVersionConstants.J2EE_1_2_ID);
+		setVersion(VERSION_1_2);
+		retValue = DD.getEJBJar().getVersionID();
+	    assertEquals(retValue,J2EEVersionConstants.EJB_1_1_ID);	    
+    }
+
+    public void test_getJ2EEVersionID() throws Exception {
+
+    	init();
+    	EJBResource DD = (EJBResource) ejbFile.getDeploymentDescriptorResource();
+        DD.setVersionID(J2EEVersionConstants.J2EE_1_4_ID);
+		setVersion(VERSION_1_4);
+		setModuleType(EJB);
+		populateRoot(DD.getRootObject());
+        int retValue = 0;
+        retValue = DD.getEJBJar().getJ2EEVersionID();
+        assertEquals(retValue,J2EEVersionConstants.J2EE_1_4_ID);
+        
+        DD.setVersionID(J2EEVersionConstants.J2EE_1_3_ID);
+		setVersion(VERSION_1_3);
+		retValue = DD.getEJBJar().getJ2EEVersionID();
+	    assertEquals(retValue,J2EEVersionConstants.J2EE_1_3_ID);
+	    
+	    DD.setVersionID(J2EEVersionConstants.J2EE_1_2_ID);
+		setVersion(VERSION_1_2);
+		retValue = DD.getEJBJar().getJ2EEVersionID();
+	    assertEquals(retValue,J2EEVersionConstants.J2EE_1_2_ID);
+    }
+
+  /*  public void test_setVersion() {
+
+        EJBJar objEJBJar = getInstance();
+        String newVersion = "";
+        objEJBJar.setVersion(newVersion);
+    }*/
+
+  /*  public void test_getAssemblyDescriptor() {
+
+        EJBJar objEJBJar = getInstance();
+        AssemblyDescriptor retValue = null;
+        retValue = objEJBJar.getAssemblyDescriptor();
+    }
+
+ 
+
+    public void test_setAssemblyDescriptor() {
+
+        EJBJar objEJBJar = getInstance();
+        AssemblyDescriptor newAssemblyDescriptor = null;
+        objEJBJar.setAssemblyDescriptor(newAssemblyDescriptor);
+    }*/
+
+   /* public void test_getEnterpriseBeans() {
+
+        EJBJar objEJBJar = getInstance();
+        EList retValue = null;
+        retValue = objEJBJar.getEnterpriseBeans();
+    }*/
+
+   /* public void test_getRelationshipList() {
+
+        EJBJar objEJBJar = getInstance();
+        Relationships retValue = null;
+        retValue = objEJBJar.getRelationshipList();
+    }
+
+ 
+
+    public void test_setRelationshipList() {
+
+        EJBJar objEJBJar = getInstance();
+        Relationships newRelationshipList = null;
+        objEJBJar.setRelationshipList(newRelationshipList);
+    }
+*/
+   
+
+    public void test_getEJBRelation() {
+    	 EJBJar objEJBJar = getInstance();
+         Relationships relationships = getEjbFactory().createRelationships();
+         objEJBJar.setRelationshipList(relationships);
+         relationships.setEjbJar(objEJBJar);
+       
+         EJBRelation relation = getEjbFactory().createEJBRelation();
+         String aRelationName = "Relation1";
+         relation.setName(aRelationName);
+         
+         relationships.getEjbRelations().add(relation);
+         EJBRelation retValue = null;
+         retValue = objEJBJar.getEJBRelation(aRelationName);
+         assertEquals(retValue, relation);
+    }
+    
+   
+
+    public void test_getEJBRelationsForSource() {
+    	
+    	EJBJar objEJBJar = getInstance();
+        Relationships relationships = getEjbFactory().createRelationships();
+        objEJBJar.setRelationshipList(relationships);
+        relationships.setEjbJar(objEJBJar);
+      
+        EJBRelation relation = getEjbFactory().createEJBRelation();
+        String aRelationName = "Relation1";
+        relation.setName(aRelationName);
+        
+        EJBRelationshipRole role1 = getEjbFactory().createEJBRelationshipRole();
+    	EJBRelationshipRole role2 = getEjbFactory().createEJBRelationshipRole();
+       
+    	List roleList = relation.getRelationshipRoles();
+        roleList.add(role1);
+        roleList.add(role2);
+        
+        ContainerManagedEntity entity = getEjbFactory().createContainerManagedEntity();
+        ContainerManagedEntity targetEntity = getEjbFactory().createContainerManagedEntity();
+        
+	    RoleSource roleSource = getEjbFactory().createRoleSource();
+	    roleSource.setEntityBean(entity);
+	    roleSource.setRole(role1);
+	    role1.setSource(roleSource);
+	    
+	    RoleSource targetRoleSource = getEjbFactory().createRoleSource();
+	    targetRoleSource.setEntityBean(targetEntity);
+	    targetRoleSource.setRole(role2);
+	    role2.setSource(targetRoleSource);
+        
+        List retValue = null;
+        retValue = objEJBJar.getEJBRelationsForSource(entity);
+        
+        assertNotNull(retValue);
+        assertEquals(retValue.size(),1);
+        assertEquals(retValue.contains(relation),true);
+        
+    }
+
+    public void test_getEJBRelationshipRolesForType() {
+
+    	EJBJar objEJBJar = getInstance();
+        Relationships relationships = getEjbFactory().createRelationships();
+        objEJBJar.setRelationshipList(relationships);
+        relationships.setEjbJar(objEJBJar);
+      
+        EJBRelation relation = getEjbFactory().createEJBRelation();
+        String aRelationName = "Relation1";
+        relation.setName(aRelationName);
+        
+        EJBRelationshipRole role1 = getEjbFactory().createEJBRelationshipRole();
+    	EJBRelationshipRole role2 = getEjbFactory().createEJBRelationshipRole();
+       
+    	List roleList = relation.getRelationshipRoles();
+        roleList.add(role1);
+        roleList.add(role2);
+        
+        ContainerManagedEntity entity = getEjbFactory().createContainerManagedEntity();
+        ContainerManagedEntity targetEntity = getEjbFactory().createContainerManagedEntity();
+        
+	    RoleSource roleSource = getEjbFactory().createRoleSource();
+	    roleSource.setEntityBean(entity);
+	    roleSource.setRole(role1);
+	    role1.setSource(roleSource);
+	    
+	    RoleSource targetRoleSource = getEjbFactory().createRoleSource();
+	    targetRoleSource.setEntityBean(targetEntity);
+	    targetRoleSource.setRole(role2);
+	    role2.setSource(targetRoleSource);
+        
+        List retValue = null;
+        retValue = objEJBJar.getEJBRelationshipRolesForType(targetEntity);
+        
+        assertNotNull(retValue);
+        assertEquals(retValue.size(),1);
+        assertEquals(retValue.contains(relation),true);
+    }
+    
+    public static junit.framework.Test suite() {
+		TestSuite suite = new TestSuite();
+		suite.addTest(new EJBJarTest("test_EJBJar"));
+		suite.addTest(new EJBJarTest("test_containsContainerManagedBeans"));
+		suite.addTest(new EJBJarTest("test_containsSecurityRole"));
+		suite.addTest(new EJBJarTest("test_getBeanManagedBeans"));
+		suite.addTest(new EJBJarTest("test_getContainerManagedBeans"));
+		
+		suite.addTest(new EJBJarTest("test_getEJB11ContainerManagedBeans"));
+		suite.addTest(new EJBJarTest("test_getEJB20ContainerManagedBeans"));
+		suite.addTest(new EJBJarTest("test_getMessageDrivenBeans"));
+		suite.addTest(new EJBJarTest("test_getEjbRelations"));
+		suite.addTest(new EJBJarTest("test_getEnterpiseBeanFromRef"));
+		
+		suite.addTest(new EJBJarTest("test_getEnterpriseBeanNamed"));
+		suite.addTest(new EJBJarTest("test_getEnterpriseBeansWithReference"));
+		suite.addTest(new EJBJarTest("test_getEnterpriseBeanWithReference"));
+		suite.addTest(new EJBJarTest("test_getSessionBeans"));
+		suite.addTest(new EJBJarTest("test_getVersionID"));
+		
+		suite.addTest(new EJBJarTest("test_getJ2EEVersionID"));
+		suite.addTest(new EJBJarTest("test_getEJBRelation"));
+		suite.addTest(new EJBJarTest("test_getEJBRelationsForSource"));
+		suite.addTest(new EJBJarTest("test_getEJBRelationshipRolesForType"));
+		
+		return suite;
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/EJBRelationTest.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/EJBRelationTest.java
new file mode 100644
index 0000000..05ccec4
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/EJBRelationTest.java
@@ -0,0 +1,154 @@
+package org.eclipse.jst.j2ee.ejb.test;
+
+import java.util.List;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.eclipse.jst.j2ee.ejb.EJBRelation;
+import org.eclipse.jst.j2ee.ejb.EJBRelationshipRole;
+import org.eclipse.jst.j2ee.ejb.EjbFactory;
+import org.eclipse.jst.j2ee.ejb.EjbPackage;
+
+public class EJBRelationTest extends TestCase {
+
+	private EjbFactory EJBFACTORY = EjbPackage.eINSTANCE.getEjbFactory();
+	private EJBRelation getInstance() {
+		return EjbFactory.eINSTANCE.createEJBRelation();
+	}
+	 public static Test suite() {
+		return new TestSuite(EJBRelationTest.class);
+	}
+	 
+    public void test_EJBRelation() {
+
+        EJBRelation tmpEJBRelation = getInstance();
+        assertNotNull(tmpEJBRelation);
+    }
+
+    public void test_containsRelationshipRole() {
+    	EJBRelationshipRole role1 = EJBFACTORY.createEJBRelationshipRole();
+    	EJBRelationshipRole role2 = EJBFACTORY.createEJBRelationshipRole();
+        EJBRelation objEJBRelation = getInstance();
+        boolean retValue = false;
+        retValue = objEJBRelation.containsRelationshipRole(role1);
+        assertEquals(false,retValue);
+        List roleList = objEJBRelation.getRelationshipRoles();
+        roleList.add(role1);
+        roleList.add(role2);
+        retValue = objEJBRelation.containsRelationshipRole(role1);
+        assertEquals(true,retValue);
+    }
+
+
+    public void test_getFirstRole() {
+    	EJBRelationshipRole role1 = EJBFACTORY.createEJBRelationshipRole();
+    	EJBRelationshipRole role2 = EJBFACTORY.createEJBRelationshipRole();
+        EJBRelation objEJBRelation = getInstance();
+        List roleList = objEJBRelation.getRelationshipRoles();
+        roleList.add(role1);
+        roleList.add(role2);
+        EJBRelationshipRole retValue = null;
+        retValue = objEJBRelation.getFirstRole();
+        assertEquals(role1,retValue);
+    }
+
+    public void test_getOppositeRole() {
+    	
+    	EJBRelationshipRole role1 = EJBFACTORY.createEJBRelationshipRole();
+    	EJBRelationshipRole role2 = EJBFACTORY.createEJBRelationshipRole();
+        EJBRelation objEJBRelation = getInstance();
+        EJBRelationshipRole oppRole = objEJBRelation.getOppositeRole(role1);
+        assertNull(oppRole);
+        
+        List roleList = objEJBRelation.getRelationshipRoles();
+        roleList.add(role1);
+        roleList.add(role2);
+        
+        oppRole = objEJBRelation.getOppositeRole(role1);
+        assertEquals(role2,oppRole);
+        
+        oppRole = objEJBRelation.getOppositeRole(role2);
+        assertEquals(role1,oppRole);
+    }
+
+  
+    public void test_getSecondRole() {
+
+    	EJBRelationshipRole role1 = EJBFACTORY.createEJBRelationshipRole();
+    	EJBRelationshipRole role2 = EJBFACTORY.createEJBRelationshipRole();
+        EJBRelation objEJBRelation = getInstance();
+        List roleList = objEJBRelation.getRelationshipRoles();
+        roleList.add(role1);
+        roleList.add(role2);
+        EJBRelationshipRole retValue = null;
+        retValue = objEJBRelation.getSecondRole();
+        assertEquals(role2,retValue);
+    }
+
+    public void test_setFoward() {
+
+    	EJBRelationshipRole role1 = EJBFACTORY.createEJBRelationshipRole();
+    	EJBRelationshipRole role2 = EJBFACTORY.createEJBRelationshipRole();
+        EJBRelation objEJBRelation = getInstance();
+        List roleList = objEJBRelation.getRelationshipRoles();
+        roleList.add(role1);
+        roleList.add(role2);
+        
+        objEJBRelation.setFoward(role2);
+        EJBRelationshipRole retValue = null;
+        retValue = objEJBRelation.getFirstRole();
+        assertEquals(role2,retValue);
+    }
+
+  /*  public void test_getDescription() {
+
+        EJBRelation objEJBRelation = getInstance();
+        String retValue = "";
+        retValue = objEJBRelation.getDescription();
+    }
+
+    public void test_setDescription() {
+
+        EJBRelation objEJBRelation = getInstance();
+        String newDescription = "";
+        objEJBRelation.setDescription(newDescription);
+    }*/
+
+  /* public void test_getName() {
+
+        EJBRelation objEJBRelation = getInstance();
+        String retValue = "";
+        retValue = objEJBRelation.getName();
+    }
+
+    public void test_setName() {
+
+        EJBRelation objEJBRelation = getInstance();
+        String newName = "";
+        objEJBRelation.setName(newName);
+    }*/
+
+   /* public void test_getRelationshipList() {
+
+        EJBRelation objEJBRelation = getInstance();
+        Relationships retValue = null;
+        retValue = objEJBRelation.getRelationshipList();
+    }
+
+    public void test_setRelationshipList() {
+
+        EJBRelation objEJBRelation = getInstance();
+        Relationships newRelationshipList = null;
+        objEJBRelation.setRelationshipList(newRelationshipList);
+    }
+
+ 
+    public void test_getDescriptions() {
+
+        EJBRelation objEJBRelation = getInstance();
+        EList retValue = null;
+        retValue = objEJBRelation.getDescriptions();
+    }*/
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/EJBRelationshipRoleTest.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/EJBRelationshipRoleTest.java
new file mode 100644
index 0000000..432c058
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/EJBRelationshipRoleTest.java
@@ -0,0 +1,307 @@
+package org.eclipse.jst.j2ee.ejb.test;
+
+import java.util.List;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.eclipse.jst.j2ee.ejb.CMRField;
+import org.eclipse.jst.j2ee.ejb.ContainerManagedEntity;
+import org.eclipse.jst.j2ee.ejb.EJBRelation;
+import org.eclipse.jst.j2ee.ejb.EJBRelationshipRole;
+import org.eclipse.jst.j2ee.ejb.EjbFactory;
+import org.eclipse.jst.j2ee.ejb.EjbPackage;
+import org.eclipse.jst.j2ee.ejb.MultiplicityKind;
+import org.eclipse.jst.j2ee.ejb.RoleSource;
+
+public class EJBRelationshipRoleTest extends TestCase {
+
+	private EjbFactory EJBFACTORY = EjbPackage.eINSTANCE.getEjbFactory();
+	EJBRelationshipRole role1 = null, role2 = null;
+	ContainerManagedEntity entity = null;
+	EJBRelation ejbRelation = null ;
+	
+	 public static Test suite() {
+		return new TestSuite(EJBRelationshipRoleTest.class);
+	}
+	 
+	private EJBRelationshipRole getInstance() {
+		return EJBFACTORY.createEJBRelationshipRole();
+	}
+	
+    public void test_EJBRelationshipRole() {
+
+        EJBRelationshipRole tmpEJBRelationshipRole = getInstance();
+        assertNotNull(tmpEJBRelationshipRole);
+    }
+
+   public void test_getLogicalName() {
+
+       /* EJBRelationshipRole objEJBRelationshipRole = getInstance();
+        String retValue = "";
+        retValue = objEJBRelationshipRole.getLogicalName();*/
+    }
+
+    public void test_getName() {
+
+        EJBRelationshipRole objEJBRelationshipRole = getInstance();
+        String name = "role1";
+        objEJBRelationshipRole.setName(name);
+        String retValue = "";
+        retValue = objEJBRelationshipRole.getName();
+        assertEquals(name,retValue);
+    }
+
+    public void test_getOpposite() {
+    	init();
+        EJBRelationshipRole retValue = null;
+        retValue = role1.getOpposite();
+        assertEquals(retValue,role2);
+        retValue = role2.getOpposite();
+        assertEquals(retValue,role1);
+    }
+
+   public void test_getSourceEntity() {
+	    init();
+	    ContainerManagedEntity retValue = role1.getSourceEntity();
+	    assertEquals(retValue,entity);
+    }
+
+    public void test_isForward() {
+       	init();
+	    boolean retValue = role2.isForward();
+	    assertEquals(retValue,false);
+	    role2.setFoward();
+	    retValue = role2.isForward();
+	    assertEquals(retValue,true);
+	    
+    }
+
+    public void test_isKey() {
+    	init();
+	    boolean retValue = role2.isKey();
+	    assertEquals(retValue,false);
+	    role2.setKey(true);
+	    retValue = role2.isKey();
+	    assertEquals(retValue,true);
+    }
+
+    public void test_setKey() {
+
+    	init();
+	    boolean retValue = role2.isKey();
+	    assertEquals(retValue,false);
+	    role2.setKey(true);
+	    retValue = role2.isKey();
+	    assertEquals(retValue,true);
+    }
+    
+    private void init() {
+    	role1 = EJBFACTORY.createEJBRelationshipRole();
+		role2 = EJBFACTORY.createEJBRelationshipRole();
+	    ejbRelation = EJBFACTORY.createEJBRelation();
+	    entity = EJBFACTORY.createContainerManagedEntity();
+	    RoleSource roleSource = EJBFACTORY.createRoleSource();
+	    roleSource.setEntityBean(entity);
+	    roleSource.setRole(role1);
+	    role1.setSource(roleSource);
+	    List roleList = ejbRelation.getRelationshipRoles();
+	    roleList.add(role1);
+	    roleList.add(role2);
+    }
+
+    public void test_isMany() {
+    	init();
+	    boolean retValue = false;
+	    retValue = role1.isMany();
+	    assertEquals(retValue,false) ;
+	    role2.setMultiplicity(MultiplicityKind.MANY_LITERAL);
+	    retValue = role1.isMany();
+	    assertEquals(retValue,true) ;
+    }
+
+    public void test_isNavigable() {
+    	init();
+    	boolean retValue = role1.isNavigable();
+    	assertEquals(retValue,false);
+    	CMRField cmrField = EJBFACTORY.createCMRField();
+    	role1.setCmrField(cmrField);
+    	retValue = role1.isNavigable();
+    	assertEquals(retValue,true);
+    }
+
+  
+    public void test_setFoward() {
+    	init();
+	    boolean retValue = role2.isForward();
+	    assertEquals(retValue,false);
+	    role2.setFoward();
+	    retValue = role2.isForward();
+	    assertEquals(retValue,true);
+    }
+
+    public void test_setName() {
+
+    	 EJBRelationshipRole objEJBRelationshipRole = getInstance();
+         String name = "role1";
+         objEJBRelationshipRole.setName(name);
+         String retValue = "";
+         retValue = objEJBRelationshipRole.getName();
+         assertEquals(name,retValue);
+    }
+
+  /* public void test_getDescription() {
+
+        EJBRelationshipRole objEJBRelationshipRole = getInstance();
+        String retValue = "";
+        retValue = objEJBRelationshipRole.getDescription();
+    }
+
+    public void test_setDescription() {
+
+        EJBRelationshipRole objEJBRelationshipRole = getInstance();
+        String newDescription = "";
+        objEJBRelationshipRole.setDescription(newDescription);
+    }*/
+
+   /* public void test_getRoleName() {
+
+        EJBRelationshipRole objEJBRelationshipRole = getInstance();
+        String retValue = "";
+        retValue = objEJBRelationshipRole.getRoleName();
+    }
+
+    public void test_setRoleName() {
+
+        EJBRelationshipRole objEJBRelationshipRole = getInstance();
+        String newRoleName = "";
+        objEJBRelationshipRole.setRoleName(newRoleName);
+    }*/
+
+  /*  public void test_getMultiplicity() {
+
+        EJBRelationshipRole objEJBRelationshipRole = getInstance();
+        MultiplicityKind retValue = null;
+        retValue = objEJBRelationshipRole.getMultiplicity();
+    }
+
+    public void test_setMultiplicity() {
+
+        EJBRelationshipRole objEJBRelationshipRole = getInstance();
+        MultiplicityKind newMultiplicity = null;
+        objEJBRelationshipRole.setMultiplicity(newMultiplicity);
+    }*/
+
+   /* public void test_unsetMultiplicity() {
+
+        EJBRelationshipRole objEJBRelationshipRole = getInstance();
+        objEJBRelationshipRole.unsetMultiplicity();
+    }
+
+    public void test_isSetMultiplicity() {
+
+        EJBRelationshipRole objEJBRelationshipRole = getInstance();
+        boolean retValue = false;
+        retValue = objEJBRelationshipRole.isSetMultiplicity();
+    }*/
+
+   /* public void test_isCascadeDelete() {
+
+        EJBRelationshipRole objEJBRelationshipRole = getInstance();
+        boolean retValue = false;
+        retValue = objEJBRelationshipRole.isCascadeDelete();
+    }
+
+    public void test_setCascadeDelete() {
+
+        EJBRelationshipRole objEJBRelationshipRole = getInstance();
+        boolean newCascadeDelete = false;
+        objEJBRelationshipRole.setCascadeDelete(newCascadeDelete);
+    }*/
+
+ /*   public void test_unsetCascadeDelete() {
+
+        EJBRelationshipRole objEJBRelationshipRole = getInstance();
+        objEJBRelationshipRole.unsetCascadeDelete();
+    }
+
+    public void test_isSetCascadeDelete() {
+
+        EJBRelationshipRole objEJBRelationshipRole = getInstance();
+        boolean retValue = false;
+        retValue = objEJBRelationshipRole.isSetCascadeDelete();
+    }*/
+
+    /* public void test_getRelationship() {
+
+        EJBRelationshipRole objEJBRelationshipRole = getInstance();
+        EJBRelation retValue = null;
+        retValue = objEJBRelationshipRole.getRelationship();
+    }
+
+    public void test_setRelationship() {
+
+        EJBRelationshipRole objEJBRelationshipRole = getInstance();
+        EJBRelation newContainer = null;
+        objEJBRelationshipRole.setRelationship(newContainer);
+    }*/
+
+   /*public void test_getSource() {
+
+        EJBRelationshipRole objEJBRelationshipRole = getInstance();
+        RoleSource retValue = null;
+        retValue = objEJBRelationshipRole.getSource();
+    }
+
+    
+    public void test_setSource() {
+
+        EJBRelationshipRole objEJBRelationshipRole = getInstance();
+        RoleSource newSource = null;
+        objEJBRelationshipRole.setSource(newSource);
+    }*/
+
+   /* public void test_getCmrField() {
+
+        EJBRelationshipRole objEJBRelationshipRole = getInstance();
+        CMRField retValue = null;
+        retValue = objEJBRelationshipRole.getCmrField();
+    }
+
+   
+    public void test_setCmrField() {
+
+        EJBRelationshipRole objEJBRelationshipRole = getInstance();
+        CMRField newCmrField = null;
+        objEJBRelationshipRole.setCmrField(newCmrField);
+    }*/
+
+   /* public void test_getDescriptions() {
+
+        EJBRelationshipRole objEJBRelationshipRole = getInstance();
+        EList retValue = null;
+        retValue = objEJBRelationshipRole.getDescriptions();
+    }*/
+
+   
+    public void test_setRequired() {
+
+        EJBRelationshipRole objEJBRelationshipRole = getInstance();
+        Boolean isRequired = Boolean.FALSE;
+        objEJBRelationshipRole.setRequired(isRequired);
+        assertEquals(false,objEJBRelationshipRole.isRequired());
+        isRequired = Boolean.TRUE;
+        objEJBRelationshipRole.setRequired(isRequired);
+        assertEquals(true,objEJBRelationshipRole.isRequired());
+    }
+    
+   /* public void test_reconcileAttributes() {
+
+        EJBRelationshipRole objEJBRelationshipRole = getInstance();
+        objEJBRelationshipRole.reconcileAttributes();
+    } */
+
+
+   
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/EjbEMFTestBase.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/EjbEMFTestBase.java
new file mode 100644
index 0000000..da57d36
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/EjbEMFTestBase.java
@@ -0,0 +1,40 @@
+/*
+ * Created on Mar 14, 2005
+ */
+package org.eclipse.jst.j2ee.ejb.test;
+
+import org.eclipse.jst.j2ee.archive.emftests.EjbEMFTest;
+import org.eclipse.jst.j2ee.archive.testutilities.EMFAttributeFeatureGenerator;
+import org.eclipse.jst.j2ee.ejb.EJBResource;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+
+public class EjbEMFTestBase extends EjbEMFTest {
+
+	/**
+	 * @param name
+	 */
+	public EjbEMFTestBase(String name) {
+		super(name);
+	}
+
+	protected void init() throws Exception{
+		EMFAttributeFeatureGenerator.reset();
+		createEAR();
+		createEJB();
+
+		EJBResource DD = (EJBResource) ejbFile.getDeploymentDescriptorResource();
+		//TODO: individual test for each version
+		DD.setVersionID(J2EEVersionConstants.J2EE_1_4_ID);
+		setVersion(VERSION_1_4);
+		setModuleType(EJB);
+		populateRoot(DD.getRootObject());
+	}
+	
+	public void testEJBJarPopulation() throws Exception {
+		// dont test the base functions
+	}
+	
+	public void test14EJBJarPopulation() throws Exception {
+		//		 dont test the base functions
+	}	
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/EjbFactoryTest.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/EjbFactoryTest.java
new file mode 100644
index 0000000..32bc1ab
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/EjbFactoryTest.java
@@ -0,0 +1,285 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.ejb.test;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.eclipse.jem.java.JavaHelpers;
+import org.eclipse.jem.java.JavaParameter;
+import org.eclipse.jem.java.JavaRefFactory;
+import org.eclipse.jem.java.Method;
+import org.eclipse.jem.java.internal.impl.JavaRefFactoryImpl;
+import org.eclipse.jst.j2ee.ejb.ActivationConfig;
+import org.eclipse.jst.j2ee.ejb.ActivationConfigProperty;
+import org.eclipse.jst.j2ee.ejb.AssemblyDescriptor;
+import org.eclipse.jst.j2ee.ejb.CMPAttribute;
+import org.eclipse.jst.j2ee.ejb.CMRField;
+import org.eclipse.jst.j2ee.ejb.ContainerManagedEntity;
+import org.eclipse.jst.j2ee.ejb.EJBJar;
+import org.eclipse.jst.j2ee.ejb.EJBMethodCategory;
+import org.eclipse.jst.j2ee.ejb.EJBRelation;
+import org.eclipse.jst.j2ee.ejb.EJBRelationshipRole;
+import org.eclipse.jst.j2ee.ejb.EjbFactory;
+import org.eclipse.jst.j2ee.ejb.EjbPackage;
+import org.eclipse.jst.j2ee.ejb.Entity;
+import org.eclipse.jst.j2ee.ejb.ExcludeList;
+import org.eclipse.jst.j2ee.ejb.MessageDriven;
+import org.eclipse.jst.j2ee.ejb.MessageDrivenDestination;
+import org.eclipse.jst.j2ee.ejb.MethodElement;
+import org.eclipse.jst.j2ee.ejb.MethodPermission;
+import org.eclipse.jst.j2ee.ejb.MethodTransaction;
+import org.eclipse.jst.j2ee.ejb.Query;
+import org.eclipse.jst.j2ee.ejb.QueryMethod;
+import org.eclipse.jst.j2ee.ejb.Relationships;
+import org.eclipse.jst.j2ee.ejb.RoleSource;
+import org.eclipse.jst.j2ee.ejb.Session;
+
+public class EjbFactoryTest extends TestCase {
+
+	private EjbFactory getInstance() {
+		return EjbPackage.eINSTANCE.getEjbFactory();
+	}
+	
+
+	public static Test suite() {
+		return new TestSuite(EjbFactoryTest.class);
+	}
+	
+    public void test_EjbFactory() {
+
+        EjbFactory tmpEjbFactory = getInstance();
+    }
+
+    public void test_createMethodElement() {
+
+        EjbFactory objEjbFactory = getInstance();
+        String aSignature = "";
+        MethodElement retValue = null;
+        retValue = objEjbFactory.createMethodElement(aSignature);
+        assertNotNull(retValue);
+    }
+
+    public void test_createMethodElementFrom() {
+
+        EjbFactory objEjbFactory = getInstance();
+        Method aMethod =  JavaRefFactoryImpl.getActiveFactory().createMethod();
+        
+        String name = "setTwoParamMethod";
+        JavaParameter javaParameter1 = JavaRefFactory.eINSTANCE.createJavaParameter();
+        JavaHelpers type1 = JavaRefFactory.eINSTANCE.createClassRef("java.lang.String");
+        javaParameter1.setEType(type1);
+        
+        JavaParameter javaParameter2 = JavaRefFactory.eINSTANCE.createJavaParameter();
+        JavaHelpers type2 = JavaRefFactory.eINSTANCE.createClassRef("java.util.List");
+        javaParameter2.setEType(type2);
+        
+        aMethod.setName(name);
+        aMethod.getParameters().add(javaParameter1);
+        aMethod.getParameters().add(javaParameter2);
+        
+        MethodElement retValue = null;
+        retValue = objEjbFactory.createMethodElementFrom(aMethod);
+        assertNotNull(retValue);
+    }
+
+    public void test_createMethodElementFrom_2() {
+
+        EjbFactory objEjbFactory = getInstance();
+        java.lang.reflect.Method method = null;
+        MethodElement retValue = null;
+        retValue = objEjbFactory.createMethodElementFrom(method);
+        assertNotNull(retValue);
+    }
+
+  
+    public void test_createMethodPermission() {
+
+        EjbFactory objEjbFactory = getInstance();
+        MethodPermission retValue = null;
+        retValue = objEjbFactory.createMethodPermission();
+        assertNotNull(retValue);
+    }
+
+    public void test_createAssemblyDescriptor() {
+
+        EjbFactory objEjbFactory = getInstance();
+        AssemblyDescriptor retValue = null;
+        retValue = objEjbFactory.createAssemblyDescriptor();
+        assertNotNull(retValue);
+    }
+
+    public void test_createMethodTransaction() {
+
+        EjbFactory objEjbFactory = getInstance();
+        MethodTransaction retValue = null;
+        retValue = objEjbFactory.createMethodTransaction();
+        assertNotNull(retValue);
+    }
+
+    public void test_createEntity() {
+
+        EjbFactory objEjbFactory = getInstance();
+        Entity retValue = null;
+        retValue = objEjbFactory.createEntity();
+        assertNotNull(retValue);
+    }
+
+    
+
+    public void test_createContainerManagedEntity() {
+
+        EjbFactory objEjbFactory = getInstance();
+        ContainerManagedEntity retValue = null;
+        retValue = objEjbFactory.createContainerManagedEntity();
+        assertNotNull(retValue);
+    }
+
+    public void test_createCMPAttribute() {
+
+        EjbFactory objEjbFactory = getInstance();
+        CMPAttribute retValue = null;
+        retValue = objEjbFactory.createCMPAttribute();
+        assertNotNull(retValue);
+    }
+
+    public void test_createCMRField() {
+
+        EjbFactory objEjbFactory = getInstance();
+        CMRField retValue = null;
+        retValue = objEjbFactory.createCMRField();
+        assertNotNull(retValue);
+    }
+
+    public void test_createEJBRelationshipRole() {
+
+        EjbFactory objEjbFactory = getInstance();
+        EJBRelationshipRole retValue = null;
+        retValue = objEjbFactory.createEJBRelationshipRole();
+        assertNotNull(retValue);
+    }
+
+   
+    public void test_createEJBRelation() {
+
+        EjbFactory objEjbFactory = getInstance();
+        EJBRelation retValue = null;
+        retValue = objEjbFactory.createEJBRelation();
+        assertNotNull(retValue);
+    }
+
+
+    public void test_createRelationships() {
+
+        EjbFactory objEjbFactory = getInstance();
+        Relationships retValue = null;
+        retValue = objEjbFactory.createRelationships();
+        assertNotNull(retValue);
+    }
+
+    public void test_createEJBJar() {
+
+        EjbFactory objEjbFactory = getInstance();
+        EJBJar retValue = null;
+        retValue = objEjbFactory.createEJBJar();
+        assertNotNull(retValue);
+    }
+
+    public void test_createRoleSource() {
+
+        EjbFactory objEjbFactory = getInstance();
+        RoleSource retValue = null;
+        retValue = objEjbFactory.createRoleSource();
+        assertNotNull(retValue);
+    }
+
+    public void test_createQuery() {
+
+        EjbFactory objEjbFactory = getInstance();
+        Query retValue = null;
+        retValue = objEjbFactory.createQuery();
+        assertNotNull(retValue);
+    }
+
+    public void test_createQueryMethod() {
+
+        EjbFactory objEjbFactory = getInstance();
+        QueryMethod retValue = null;
+        retValue = objEjbFactory.createQueryMethod();
+        assertNotNull(retValue);
+    }
+
+    public void test_createActivationConfigProperty() {
+
+        EjbFactory objEjbFactory = getInstance();
+        ActivationConfigProperty retValue = null;
+        retValue = objEjbFactory.createActivationConfigProperty();
+        assertNotNull(retValue);
+    }
+
+    public void test_createActivationConfig() {
+
+        EjbFactory objEjbFactory = getInstance();
+        ActivationConfig retValue = null;
+        retValue = objEjbFactory.createActivationConfig();
+        assertNotNull(retValue);
+    }
+
+    public void test_createMethodElement_2() {
+
+        EjbFactory objEjbFactory = getInstance();
+        MethodElement retValue = null;
+        retValue = objEjbFactory.createMethodElement();
+        assertNotNull(retValue);
+    }
+
+    public void test_createExcludeList() {
+
+        EjbFactory objEjbFactory = getInstance();
+        ExcludeList retValue = null;
+        retValue = objEjbFactory.createExcludeList();
+        assertNotNull(retValue);
+    }
+
+    public void test_createSession() {
+
+        EjbFactory objEjbFactory = getInstance();
+        Session retValue = null;
+        retValue = objEjbFactory.createSession();
+        assertNotNull(retValue);
+    }
+
+    public void test_createMessageDriven() {
+
+        EjbFactory objEjbFactory = getInstance();
+        MessageDriven retValue = null;
+        retValue = objEjbFactory.createMessageDriven();
+        assertNotNull(retValue);
+    }
+
+    public void test_createMessageDrivenDestination() {
+
+        EjbFactory objEjbFactory = getInstance();
+        MessageDrivenDestination retValue = null;
+        retValue = objEjbFactory.createMessageDrivenDestination();
+        assertNotNull(retValue);
+    }
+
+    public void test_createEJBMethodCategory() {
+
+        EjbFactory objEjbFactory = getInstance();
+        EJBMethodCategory retValue = null;
+        retValue = objEjbFactory.createEJBMethodCategory();
+        assertNotNull(retValue);
+    }
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/EntityTest.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/EntityTest.java
new file mode 100644
index 0000000..110a329
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/EntityTest.java
@@ -0,0 +1,141 @@
+package org.eclipse.jst.j2ee.ejb.test;
+
+import java.util.List;
+
+import junit.framework.TestSuite;
+
+import org.eclipse.jst.j2ee.ejb.AssemblyDescriptor;
+import org.eclipse.jst.j2ee.ejb.ContainerManagedEntity;
+import org.eclipse.jst.j2ee.ejb.EJBResource;
+import org.eclipse.jst.j2ee.ejb.EjbFactory;
+import org.eclipse.jst.j2ee.ejb.EnterpriseBean;
+import org.eclipse.jst.j2ee.ejb.Entity;
+
+public class EntityTest extends EjbEMFTestBase{
+
+	/**
+	 * @param name
+	 */
+	public EntityTest(String name) {
+		super(name);
+	}
+	
+	private Entity getInstance() {
+		return EjbFactory.eINSTANCE.createEntity();
+	}
+    public void test_Entity() {
+        Entity tmpEntity = getInstance();
+        assertNotNull(tmpEntity);
+    }
+    
+    /* (non-Javadoc)
+	 * @see junit.framework.TestCase#setUp()
+	 */
+	protected void setUp() throws Exception {
+		super.setUp();
+	}
+
+    public void test_getPrimaryKeyName() throws Exception{
+    	init();
+    	EJBResource DD = (EJBResource) ejbFile.getDeploymentDescriptorResource();
+    	
+    	AssemblyDescriptor assemblyDescriptor = DD.getEJBJar().getAssemblyDescriptor();
+		List enterpriseBeans = DD.getEJBJar().getEnterpriseBeans();
+		ContainerManagedEntity entityBean = null;
+		EnterpriseBean bean = null;
+		for (int x=0; x< enterpriseBeans.size(); ++x) {
+			bean = (EnterpriseBean) enterpriseBeans.get(x);
+			if (bean.isEntity() && bean.isContainerManagedEntity()) {
+				entityBean = (ContainerManagedEntity) bean;
+				break;
+			}
+		}
+		if (entityBean != null) {
+			String name = entityBean.getPrimaryKeyName();
+			String primKeyName = entityBean.getPrimaryKey().getQualifiedName();
+			assertEquals(name,primKeyName);
+			
+		}
+    }
+
+    
+   /* public void test_isContainerManagedEntity() {
+        Entity objEntity = getInstance();
+        boolean retValue = false;
+        retValue = objEntity.isContainerManagedEntity();
+    }*/
+
+    public void test_setPrimaryKeyName() throws Exception {
+    	init();
+    	EJBResource DD = (EJBResource) ejbFile.getDeploymentDescriptorResource();
+    	
+    	AssemblyDescriptor assemblyDescriptor = DD.getEJBJar().getAssemblyDescriptor();
+		List enterpriseBeans = DD.getEJBJar().getEnterpriseBeans();
+		ContainerManagedEntity entityBean = null;
+		EnterpriseBean bean = null;
+		for (int x=0; x< enterpriseBeans.size(); ++x) {
+			bean = (EnterpriseBean) enterpriseBeans.get(x);
+			if (bean.isEntity() && bean.isContainerManagedEntity()) {
+				entityBean = (ContainerManagedEntity) bean;
+				break;
+			}
+		}
+		if (entityBean != null) {
+			String name = entityBean.getPrimaryKeyName();
+			String newName = "NewName" ;
+			entityBean.setPrimaryKeyName(newName);
+			assertEquals(newName,entityBean.getPrimaryKeyName());
+		}    
+    }
+
+  /* public void test_isReentrant() {
+
+        Entity objEntity = getInstance();
+        boolean retValue = false;
+        retValue = objEntity.isReentrant();
+    }
+
+    public void test_setReentrant() {
+
+        Entity objEntity = getInstance();
+        boolean newReentrant = false;
+        objEntity.setReentrant(newReentrant);
+    }*/
+
+  /*  public void test_unsetReentrant() {
+
+        Entity objEntity = getInstance();
+        objEntity.unsetReentrant();
+    } */
+
+   /* public void test_isSetReentrant() {
+
+        Entity objEntity = getInstance();
+        boolean retValue = false;
+        retValue = objEntity.isSetReentrant();
+    } */
+
+  /*  public void test_getPrimaryKey() {
+
+        Entity objEntity = getInstance();
+        JavaClass retValue = null;
+        retValue = objEntity.getPrimaryKey();
+    }
+
+    public void test_setPrimaryKey() {
+
+        Entity objEntity = getInstance();
+        JavaClass newPrimaryKey = null;
+        objEntity.setPrimaryKey(newPrimaryKey);
+    } */
+    
+    public static junit.framework.Test suite() {
+		TestSuite suite = new TestSuite();
+		suite.addTest(new EntityTest("test_setPrimaryKeyName"));
+		suite.addTest(new EntityTest("test_getPrimaryKeyName"));
+		return suite;
+	}
+
+
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/MethodElementTest.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/MethodElementTest.java
new file mode 100644
index 0000000..2aa81eb
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/MethodElementTest.java
@@ -0,0 +1,527 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.ejb.test;
+
+import java.util.List;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.jem.java.JavaClass;
+import org.eclipse.jem.java.JavaHelpers;
+import org.eclipse.jem.java.JavaParameter;
+import org.eclipse.jem.java.JavaRefFactory;
+import org.eclipse.jem.java.Method;
+import org.eclipse.jem.java.internal.impl.JavaRefFactoryImpl;
+import org.eclipse.jst.j2ee.ejb.EJBResource;
+import org.eclipse.jst.j2ee.ejb.EjbPackage;
+import org.eclipse.jst.j2ee.ejb.EnterpriseBean;
+import org.eclipse.jst.j2ee.ejb.MethodElement;
+import org.eclipse.jst.j2ee.ejb.MethodElementKind;
+import org.eclipse.jst.j2ee.ejb.Session;
+
+public class MethodElementTest extends EjbEMFTestBase {
+	private final int SESSION =0;
+	private final int ENTITY = 1;
+	private final int CONTAINER_MANAGED_ENTITY =2;
+	
+	
+
+	/**
+	 * @param name
+	 */
+	public MethodElementTest(String name) {
+		super(name);
+		
+	}
+
+	private MethodElement getInstance() {
+		return EjbPackage.eINSTANCE.getEjbFactory().createMethodElement();
+	}
+	
+    public void test_MethodElement() {
+        MethodElement tmpMethodElement = getInstance();
+        assertNotNull(tmpMethodElement);
+    }
+
+    public void test_addMethodParams() {
+        MethodElement objMethodElement = getInstance();
+        String param1 = "param1";
+        String param2= "param2";
+        boolean retValue = false;
+        objMethodElement.addMethodParams(param1);
+        objMethodElement.addMethodParams(param2);
+        List list = objMethodElement.getMethodParams();
+        retValue = list.contains(param1);
+        assertEquals(retValue,true);
+    }
+
+    public void test_applyZeroParams() {
+    	MethodElement objMethodElement = getInstance();
+        String param1 = "param1";
+        String param2= "param2";
+        boolean retValue = false;
+        objMethodElement.addMethodParams(param1);
+        objMethodElement.addMethodParams(param2);
+        List list = objMethodElement.getMethodParams();
+        assertEquals(list.size()==2, true) ;
+        objMethodElement.applyZeroParams();
+        list = objMethodElement.getMethodParams();
+        assertEquals(list.size()==0, true) ;
+        
+    }
+
+    public void test_equalSignature() {
+
+        MethodElement objMethodElement1 = getInstance();
+        MethodElement objMethodElement2 = getInstance();
+        MethodElement objMethodElement3 = getInstance();
+        
+        objMethodElement1.setName("name");
+        objMethodElement2.setName("name");
+        objMethodElement3.setName("name");
+        
+        String param1 = "param1";
+        String param2= "param2";
+        String param3 = "param3";
+        String param4= "param4";
+        
+        objMethodElement1.addMethodParams(param1);
+        objMethodElement1.addMethodParams(param2);
+        
+        objMethodElement2.addMethodParams(param1);
+        objMethodElement2.addMethodParams(param2);
+        
+        objMethodElement3.addMethodParams(param1);
+        objMethodElement3.addMethodParams(param2);
+        
+        objMethodElement1.setType(MethodElementKind.LOCAL_LITERAL);
+        objMethodElement2.setType(MethodElementKind.LOCAL_LITERAL);
+        objMethodElement3.setType(MethodElementKind.LOCAL_LITERAL);
+        
+        boolean retValue = false;
+        retValue = objMethodElement1.equalSignature(objMethodElement2);
+        assertEquals(retValue,true);
+        retValue = objMethodElement2.equalSignature(objMethodElement3);
+        assertEquals(retValue,true);
+        
+        objMethodElement3.setName("nameDiff");
+        retValue = objMethodElement2.equalSignature(objMethodElement3);
+        assertEquals(retValue,false);
+        
+        objMethodElement2.addMethodParams(param3);
+        retValue = objMethodElement1.equalSignature(objMethodElement2);
+        assertEquals(retValue,false);
+        
+        objMethodElement3.setName("name");
+        retValue = objMethodElement1.equalSignature(objMethodElement3);
+        assertEquals(retValue,true);
+        
+        objMethodElement3.setType(MethodElementKind.HOME_LITERAL);
+        retValue = objMethodElement1.equalSignature(objMethodElement3);
+        assertEquals(retValue,false);
+    }
+
+    public void test_getMethodParams() {
+
+    	MethodElement objMethodElement = getInstance();
+        String param1 = "param1";
+        String param2= "param2";
+        boolean retValue = false;
+        objMethodElement.addMethodParams(param1);
+        objMethodElement.addMethodParams(param2);
+        List list = objMethodElement.getMethodParams();
+        assertEquals(list.size()==2, true) ;
+        assertEquals(list.contains(param1),true);
+        assertEquals(list.contains(param2),true);
+    }
+
+    
+
+    public void test_getSignature() {
+
+    	MethodElement objMethodElement = getInstance();
+    	String name = "test";
+        objMethodElement.setName(name);
+        
+        String param1 = "param1";
+        String param2= "param2";
+        
+        objMethodElement.addMethodParams(param1);
+        objMethodElement.addMethodParams(param2);
+        
+        String signature = name + "(" + param1 + "," + param2 + ")";
+        String retValue = objMethodElement.getSignature();
+        assertEquals(signature,retValue);
+        
+      
+    }
+    
+    
+    
+   
+    public void test_getTypeJavaClass() throws Exception {
+    	init();
+    	EJBResource DD = (EJBResource) ejbFile.getDeploymentDescriptorResource();
+    	List enterpriseBeans = DD.getEJBJar().getEnterpriseBeans();
+    	EnterpriseBean eb = (EnterpriseBean)enterpriseBeans.get(0);
+        MethodElement objMethodElement = getInstance();
+        objMethodElement.setEnterpriseBean(eb);
+        JavaClass retValue = null;
+        if (eb.hasRemoteClient()) {
+        	objMethodElement.setType(MethodElementKind.HOME_LITERAL);
+            retValue = objMethodElement.getTypeJavaClass();
+            assertEquals(retValue,eb.getHomeInterface());
+            objMethodElement.setType(MethodElementKind.REMOTE_LITERAL);
+            retValue = objMethodElement.getTypeJavaClass();
+            assertEquals(retValue,eb.getRemoteInterface());
+            
+        } 
+        if (eb.hasLocalClient()){
+        	objMethodElement.setType(MethodElementKind.LOCAL_HOME_LITERAL);
+            retValue = objMethodElement.getTypeJavaClass();
+            assertEquals(retValue,eb.getLocalHomeInterface());
+            objMethodElement.setType(MethodElementKind.LOCAL_LITERAL);
+            retValue = objMethodElement.getTypeJavaClass();
+            assertEquals(retValue,eb.getLocalInterface());
+            
+        } 
+        if (eb.isMessageDriven()) {
+        	objMethodElement.setType(MethodElementKind.UNSPECIFIED_LITERAL);
+        	retValue = objMethodElement.getTypeJavaClass();
+            assertEquals(retValue,eb.getEjbClass());
+        }
+  
+    }
+    
+   
+
+   /* public void test_getMethods() {
+    
+    }
+
+    public void test_getMostSpecific() {
+
+        MethodElement objMethodElement = getInstance();
+        MethodElement aMethodElement = null;
+        JavaClass aClass = null;
+        MethodElement retValue = null;
+        retValue = objMethodElement.getMostSpecific(aMethodElement, aClass);
+    }*/
+    
+    public void test_hasMethodParams() {
+        MethodElement objMethodElement = getInstance();
+        boolean retValue = false;
+        retValue = objMethodElement.hasMethodParams();
+        assertEquals(retValue,false);
+        String param1 = "param1";
+        objMethodElement.addMethodParams(param1);
+        retValue = objMethodElement.hasMethodParams();
+        assertEquals(retValue,true);
+        String param2 = "param2";
+        objMethodElement.addMethodParams(param2);
+        retValue = objMethodElement.hasMethodParams();
+        assertEquals(retValue,true);
+    }
+
+    public void test_initializeFromSignature() {
+        MethodElement objMethodElement = getInstance();
+        String signature = "setTwoParamMethod(java.lang.String,java.util.List)";
+        objMethodElement.initializeFromSignature(signature);
+        List list = objMethodElement.getMethodParams();
+        assertEquals(list.size()==2, true) ;
+        String name = "setTwoParamMethod";
+        assertEquals(list.contains("java.lang.String"),true);
+        assertEquals(list.contains("java.util.List"),true);
+        assertEquals(objMethodElement.getName(), "setTwoParamMethod");
+        
+    }
+
+    public void test_isDefault() {
+        MethodElement objMethodElement = getInstance();
+        objMethodElement.setName("test");
+        boolean retValue = false;
+        retValue = objMethodElement.isDefault();
+        assertEquals(retValue,false);
+        objMethodElement.setName(JavaClass.DEFAULT_METHOD_NAME);
+        retValue = objMethodElement.isDefault();
+        assertEquals(retValue,true);
+        
+    }
+
+    public void test_isEquivalent() {
+
+        MethodElement objMethodElement1 = getInstance();
+        MethodElement objMethodElement2 = getInstance();
+        
+        Session session1 = getEjbFactory().createSession();
+        Session session2 = getEjbFactory().createSession();
+        objMethodElement1.setEnterpriseBean(session1);
+        objMethodElement2.setEnterpriseBean(session1);
+        String signature1 = "setTwoParamMethod(java.lang.String,java.util.List)";
+        String signature2 = "setTwoParamMethod2(java.lang.String,java.util.List)";
+        objMethodElement1.initializeFromSignature(signature1);
+        objMethodElement2.initializeFromSignature(signature1);
+        boolean retValue = false;
+        retValue = objMethodElement1.isEquivalent(objMethodElement2);
+        assertEquals(retValue,true);
+        objMethodElement2.initializeFromSignature(signature2);
+        retValue = objMethodElement1.isEquivalent(objMethodElement2);
+        assertEquals(retValue,false);
+        
+        objMethodElement2.initializeFromSignature(signature1);
+        objMethodElement2.setEnterpriseBean(session2);
+        retValue = objMethodElement1.isEquivalent(objMethodElement2);
+        assertEquals(retValue,false);
+    }
+
+    public void test_isHome() {
+
+        MethodElement objMethodElement = getInstance();
+        objMethodElement.setType(MethodElementKind.HOME_LITERAL);
+        boolean retValue = false;
+        retValue = objMethodElement.isHome();
+        assertEquals(retValue,true);
+        objMethodElement.setType(MethodElementKind.LOCAL_HOME_LITERAL);
+        retValue = objMethodElement.isHome();
+        assertEquals(retValue,false);
+        
+    }
+
+    public void test_isRemote() {
+    	 MethodElement objMethodElement = getInstance();
+         objMethodElement.setType(MethodElementKind.REMOTE_LITERAL);
+         boolean retValue = false;
+         retValue = objMethodElement.isRemote();
+         assertEquals(retValue,true);
+         objMethodElement.setType(MethodElementKind.LOCAL_HOME_LITERAL);
+         retValue = objMethodElement.isRemote();
+         assertEquals(retValue,false);
+    }
+
+    public void test_isUnspecified() {
+    	 MethodElement objMethodElement = getInstance();
+         objMethodElement.setType(MethodElementKind.UNSPECIFIED_LITERAL);
+         boolean retValue = false;
+         retValue = objMethodElement.isUnspecified();
+         assertEquals(retValue,true);
+         objMethodElement.setType(MethodElementKind.LOCAL_HOME_LITERAL);
+         retValue = objMethodElement.isUnspecified();
+         assertEquals(retValue,false);
+        
+    }
+
+    public void test_isLocalHome() {
+
+    	 MethodElement objMethodElement = getInstance();
+         objMethodElement.setType(MethodElementKind.LOCAL_HOME_LITERAL );
+         boolean retValue = false;
+         retValue = objMethodElement.isLocalHome();
+         assertEquals(retValue,true);
+         objMethodElement.setType(MethodElementKind.UNSPECIFIED_LITERAL);
+         retValue = objMethodElement.isLocalHome();
+         assertEquals(retValue,false);
+    }
+
+    public void test_isLocal() {
+    	 MethodElement objMethodElement = getInstance();
+         objMethodElement.setType(MethodElementKind.LOCAL_LITERAL );
+         boolean retValue = false;
+         retValue = objMethodElement.isLocal();
+         assertEquals(retValue,true);
+         objMethodElement.setType(MethodElementKind.UNSPECIFIED_LITERAL);
+         retValue = objMethodElement.isLocal();
+         assertEquals(retValue,false);
+    }
+
+    public void test_isValid() {
+        MethodElement objMethodElement = getInstance();
+        boolean retValue = false;
+        retValue = objMethodElement.isValid();
+    }
+
+  
+    public void test_nameAndParamsEquals() {
+
+        MethodElement objMethodElement = getInstance();
+        Method aMethod =  JavaRefFactoryImpl.getActiveFactory().createMethod();
+        String name = "setTwoParamMethod";
+        String param1 = "java.lang.String";
+        String param2 = "java.util.List";
+        
+        JavaParameter javaParameter1 = JavaRefFactory.eINSTANCE.createJavaParameter();
+        JavaHelpers type1 = JavaRefFactory.eINSTANCE.createClassRef("java.lang.String");
+        javaParameter1.setEType(type1);
+        
+        JavaParameter javaParameter2 = JavaRefFactory.eINSTANCE.createJavaParameter();
+        JavaHelpers type2 = JavaRefFactory.eINSTANCE.createClassRef("java.util.List");
+        javaParameter2.setEType(type2);
+        
+        aMethod.setName(name);
+        aMethod.getParameters().add(javaParameter1);
+        aMethod.getParameters().add(javaParameter2);
+        
+        objMethodElement.setName(name);
+        objMethodElement.addMethodParams(param1);
+        objMethodElement.addMethodParams(param2);
+       
+        boolean retValue = false;
+        retValue = objMethodElement.nameAndParamsEquals(aMethod);
+        assertEquals(retValue,true);
+        
+        String name2 = "setTwoParamMethod2";
+        objMethodElement.setName(name2);
+        retValue = objMethodElement.nameAndParamsEquals(aMethod);
+        assertEquals(retValue,false);
+        
+        objMethodElement.setName(name);
+        String param3 = "java.util.List";
+        objMethodElement.addMethodParams(param3);
+        retValue = objMethodElement.nameAndParamsEquals(aMethod);
+        assertEquals(retValue,false);
+        
+    }
+
+    public void test_removeMethodParams() {
+
+    	 MethodElement objMethodElement = getInstance();
+         String param1 = "param1";
+         String param2= "param2";
+         boolean retValue = false;
+         objMethodElement.addMethodParams(param1);
+         objMethodElement.addMethodParams(param2);
+         List list = objMethodElement.getMethodParams();
+         retValue = list.contains(param1);
+         assertEquals(retValue,true);
+         objMethodElement.removeMethodParams(param1);
+         list = objMethodElement.getMethodParams();
+         retValue = list.contains(param1);
+         assertEquals(retValue,false);
+    }
+
+ /*   public void test_represents() {
+
+        MethodElement objMethodElement = getInstance();
+        Method aMethod = null;
+        boolean retValue = false;
+        retValue = objMethodElement.represents(aMethod);
+    }
+
+    public void test_setIdToReadableString() {
+
+        MethodElement objMethodElement = getInstance();
+        objMethodElement.setIdToReadableString();
+    }
+
+    public void test_uniquelyIdentifies() {
+
+        MethodElement objMethodElement = getInstance();
+        Method aMethod = null;
+        boolean retValue = false;
+        retValue = objMethodElement.uniquelyIdentifies(aMethod);
+    } */
+
+   /* public void test_getName() {
+
+        MethodElement objMethodElement = getInstance();
+        String retValue = "";
+        retValue = objMethodElement.getName();
+    }*/
+
+   /* public void test_setName() {
+
+        MethodElement objMethodElement = getInstance();
+        String newName = "";
+        objMethodElement.setName(newName);
+    }*/
+
+   /* public void test_getParms() {
+
+        MethodElement objMethodElement = getInstance();
+        String retValue = "";
+        retValue = objMethodElement.getParms();
+    }
+
+    public void test_setParms() {
+
+        MethodElement objMethodElement = getInstance();
+        String newParms = "";
+        objMethodElement.setParms(newParms);
+    }*/
+
+  /*  public void test_getType() {
+
+        MethodElement objMethodElement = getInstance();
+        MethodElementKind retValue = null;
+        retValue = objMethodElement.getType();
+    }
+
+    public void test_setType() {
+
+        MethodElement objMethodElement = getInstance();
+        MethodElementKind newType = null;
+        objMethodElement.setType(newType);
+    }
+
+    public void test_unsetType() {
+
+        MethodElement objMethodElement = getInstance();
+        objMethodElement.unsetType();
+    }
+
+    public void test_isSetType() {
+
+        MethodElement objMethodElement = getInstance();
+        boolean retValue = false;
+        retValue = objMethodElement.isSetType();
+    }*/
+
+  /*  public void test_getDescription() {
+
+        MethodElement objMethodElement = getInstance();
+        String retValue = "";
+        retValue = objMethodElement.getDescription();
+    }
+
+    public void test_setDescription() {
+
+        MethodElement objMethodElement = getInstance();
+        String newDescription = "";
+        objMethodElement.setDescription(newDescription);
+    }*/
+
+   /* public void test_getEnterpriseBean() {
+
+        MethodElement objMethodElement = getInstance();
+        EnterpriseBean retValue = null;
+        retValue = objMethodElement.getEnterpriseBean();
+    }
+
+  
+    public void test_setEnterpriseBean() {
+
+        MethodElement objMethodElement = getInstance();
+        EnterpriseBean newEnterpriseBean = null;
+        objMethodElement.setEnterpriseBean(newEnterpriseBean);
+    }*/
+
+   /* public void test_getDescriptions() {
+
+        MethodElement objMethodElement = getInstance();
+        EList retValue = null;
+        retValue = objMethodElement.getDescriptions();
+    }*/
+    
+    public static Test suite() {
+		return new TestSuite(MethodElementTest.class);
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/MethodPermissionTest.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/MethodPermissionTest.java
new file mode 100644
index 0000000..f034570
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/MethodPermissionTest.java
@@ -0,0 +1,187 @@
+package org.eclipse.jst.j2ee.ejb.test;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.eclipse.jst.j2ee.common.CommonFactory;
+import org.eclipse.jst.j2ee.common.CommonPackage;
+import org.eclipse.jst.j2ee.common.SecurityRole;
+import org.eclipse.jst.j2ee.ejb.EjbFactory;
+import org.eclipse.jst.j2ee.ejb.EjbPackage;
+import org.eclipse.jst.j2ee.ejb.MethodPermission;
+
+public class MethodPermissionTest extends TestCase {
+
+	private static final EjbFactory EJBFACTORY = EjbPackage.eINSTANCE.getEjbFactory();
+	private static final CommonFactory COMMONFACTORY = CommonPackage.eINSTANCE.getCommonFactory();
+	private MethodPermission getInstance() {
+		return EJBFACTORY.createMethodPermission();
+	}
+	
+	
+    public void test_MethodPermission() {
+        MethodPermission tmpMethodPermission = getInstance();
+        assertNotNull(tmpMethodPermission);
+    }
+
+   /*public void test_getMethodElements() {
+
+        MethodPermission objMethodPermission = getInstance();
+        EnterpriseBean anEJB = null;
+        List retValue = null;
+        retValue = objMethodPermission.getMethodElements(anEJB);
+    }*/
+
+    public void test_getSecurityRole() {
+
+        MethodPermission objMethodPermission = getInstance();
+        SecurityRole securityRole= COMMONFACTORY.createSecurityRole();
+		String securityRoleName = "testRole";
+		securityRole.setRoleName(securityRoleName);
+		objMethodPermission.getRoles().add(securityRole);
+		
+        SecurityRole retValue = null;
+        retValue = objMethodPermission.getSecurityRole(securityRoleName);
+        assertEquals(securityRole,retValue);
+    }
+
+    public void test_hasSecurityRole() {
+        MethodPermission objMethodPermission = getInstance();
+        SecurityRole securityRole= COMMONFACTORY.createSecurityRole();
+		String securityRoleName = "testRole";
+		securityRole.setRoleName(securityRoleName);
+		objMethodPermission.getRoles().add(securityRole);
+        boolean retValue = objMethodPermission.hasSecurityRole(securityRole);
+        assertEquals(retValue, true);
+        SecurityRole securityRole2= COMMONFACTORY.createSecurityRole();
+        retValue = objMethodPermission.hasSecurityRole(securityRole2);
+        assertEquals(retValue, false);
+    }
+
+    public void test_hasSecurityRole_2() {
+
+    	MethodPermission objMethodPermission = getInstance();
+        SecurityRole securityRole= COMMONFACTORY.createSecurityRole();
+		String securityRoleName = "testRole";
+		securityRole.setRoleName(securityRoleName);
+		objMethodPermission.getRoles().add(securityRole);
+        boolean retValue = objMethodPermission.hasSecurityRole(securityRoleName);
+        assertEquals(retValue, true);
+        String securityRoleNameDoesNotExist = "testRoleDoesNotExist";
+        retValue = objMethodPermission.hasSecurityRole(securityRoleNameDoesNotExist);
+        assertEquals(retValue, false);
+    }
+
+    public void test_isEquivalent() {
+
+    	MethodPermission objMethodPermission1 = getInstance();
+    	MethodPermission objMethodPermission2 = getInstance();
+    	
+        SecurityRole securityRole1= COMMONFACTORY.createSecurityRole();
+        securityRole1.setRoleName("testRole1");
+        SecurityRole securityRole2= COMMONFACTORY.createSecurityRole();
+        securityRole2.setRoleName("testRole2");
+        SecurityRole securityRole3= COMMONFACTORY.createSecurityRole();
+        securityRole3.setRoleName("testRole3");
+        
+		
+        objMethodPermission1.getRoles().add(securityRole1);
+        objMethodPermission1.getRoles().add(securityRole2);
+        
+        objMethodPermission2.getRoles().add(securityRole1);
+        objMethodPermission2.getRoles().add(securityRole2);
+        
+        
+        boolean retValue = objMethodPermission1.isEquivalent(objMethodPermission2);
+        assertEquals(retValue, true);
+        
+        objMethodPermission1.getRoles().add(securityRole3);
+        retValue = objMethodPermission1.isEquivalent(objMethodPermission2);
+        assertEquals(retValue, false);
+        
+        
+    }
+
+ /*  public void test_getDescription() {
+
+        MethodPermission objMethodPermission = getInstance();
+        String retValue = "";
+        retValue = objMethodPermission.getDescription();
+    }
+
+    public void test_setDescription() {
+
+        MethodPermission objMethodPermission = getInstance();
+        String newDescription = "";
+        objMethodPermission.setDescription(newDescription);
+    }*/
+
+  /* public void test_isUnchecked() {
+
+        MethodPermission objMethodPermission = getInstance();
+        boolean retValue = false;
+        retValue = objMethodPermission.isUnchecked();
+    }*/
+
+   /* public void test_setUnchecked() {
+
+        MethodPermission objMethodPermission = getInstance();
+        boolean newUnchecked = false;
+        objMethodPermission.setUnchecked(newUnchecked);
+    }*/
+
+   /* public void test_unsetUnchecked() {
+
+        MethodPermission objMethodPermission = getInstance();
+        objMethodPermission.unsetUnchecked();
+    }*/
+
+    /*public void test_isSetUnchecked() {
+
+        MethodPermission objMethodPermission = getInstance();
+        boolean retValue = false;
+        retValue = objMethodPermission.isSetUnchecked();
+    }*/
+
+   /* public void test_getAssemblyDescriptor() {
+
+        MethodPermission objMethodPermission = getInstance();
+        AssemblyDescriptor retValue = null;
+        retValue = objMethodPermission.getAssemblyDescriptor();
+    }
+
+    public void test_setAssemblyDescriptor() {
+
+        MethodPermission objMethodPermission = getInstance();
+        AssemblyDescriptor newAssemblyDescriptor = null;
+        objMethodPermission.setAssemblyDescriptor(newAssemblyDescriptor);
+    }*/
+
+   /* public void test_getRoles() {
+
+        MethodPermission objMethodPermission = getInstance();
+        EList retValue = null;
+        retValue = objMethodPermission.getRoles();
+    }*/
+
+   /* public void test_getMethodElements_2() {
+
+        MethodPermission objMethodPermission = getInstance();
+        EList retValue = null;
+        retValue = objMethodPermission.getMethodElements();
+    }*/
+
+  /* public void test_getDescriptions() {
+
+        MethodPermission objMethodPermission = getInstance();
+        EList retValue = null;
+        retValue = objMethodPermission.getDescriptions();
+    }*/   
+    
+    public static Test suite() {
+		return new TestSuite(MethodPermissionTest.class);
+	}
+
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/MethodTransactionTest.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/MethodTransactionTest.java
new file mode 100644
index 0000000..17dd98d
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/MethodTransactionTest.java
@@ -0,0 +1,160 @@
+package org.eclipse.jst.j2ee.ejb.test;
+
+import java.util.List;
+
+import junit.framework.TestSuite;
+
+import org.eclipse.jst.j2ee.ejb.AssemblyDescriptor;
+import org.eclipse.jst.j2ee.ejb.EJBResource;
+import org.eclipse.jst.j2ee.ejb.EjbFactory;
+import org.eclipse.jst.j2ee.ejb.EnterpriseBean;
+import org.eclipse.jst.j2ee.ejb.MethodElement;
+import org.eclipse.jst.j2ee.ejb.MethodTransaction;
+import org.eclipse.jst.j2ee.ejb.TransactionAttributeType;
+
+public class MethodTransactionTest extends EjbEMFTestBase {
+
+    /**
+	 * @param name
+	 */
+	public MethodTransactionTest(String name) {
+		super(name);
+	}
+
+	public void test_MethodTransaction() {
+        MethodTransaction tmpMethodTransaction = EjbFactory.eINSTANCE.createMethodTransaction();
+        assertNotNull(tmpMethodTransaction);
+    }   
+    
+    
+    public void test_getMethodElements() throws Exception{
+    	init();
+    	EJBResource DD = (EJBResource) ejbFile.getDeploymentDescriptorResource();
+		AssemblyDescriptor assemblyDescriptor = DD.getEJBJar().getAssemblyDescriptor();
+		assertNotNull(assemblyDescriptor);
+		List enterpriseBeans = DD.getEJBJar().getEnterpriseBeans();
+		EnterpriseBean eb1 = (EnterpriseBean)enterpriseBeans.get(0);
+		// create a method transaction
+		MethodTransaction methodTransaction = getEjbFactory().createMethodTransaction();
+		List methodTransactions = assemblyDescriptor.getMethodTransactions();
+		methodTransactions.add(methodTransaction);
+		// create a method element
+		MethodElement methodElement = getEjbFactory().createMethodElement();
+		methodElement.setEnterpriseBean(eb1);
+		methodTransaction.getMethodElements().add(methodElement);
+		// get the method element for the enterprise bean
+		List methodElements = methodTransaction.getMethodElements(eb1);
+		assertEquals(methodElements.contains(methodElement), true);
+	}
+    
+    /**
+     *  
+     * [issue : SA - getMostSpecificMethodElement() - does it need to be an API as it calls
+     *  to the static member of MethodElementImpl ]
+     *
+     */
+
+  /*  public void test_getMostSpecificMethodElement() {
+
+        MethodTransaction objMethodTransaction = EjbFactory.eINSTANCE.createMethodTransaction();
+        Method aMethod = null;
+        MethodElement retValue = null;
+        retValue = objMethodTransaction
+                .getMostSpecificMethodElement(aMethod);
+    } */
+
+    public void test_isEquivalent() {
+
+        MethodTransaction objMethodTransaction1 = getEjbFactory().createMethodTransaction();
+        MethodTransaction objMethodTransaction2 = getEjbFactory().createMethodTransaction();
+
+        objMethodTransaction1.setTransactionAttribute(TransactionAttributeType.SUPPORTS_LITERAL);
+        objMethodTransaction2.setTransactionAttribute(TransactionAttributeType.SUPPORTS_LITERAL);
+     
+        boolean retValue = objMethodTransaction1.isEquivalent(objMethodTransaction2);
+        assertEquals(retValue,true);
+        objMethodTransaction2.setTransactionAttribute(TransactionAttributeType.REQUIRED_LITERAL);
+        
+        retValue = objMethodTransaction1.isEquivalent(objMethodTransaction2);
+        assertEquals(retValue,false);
+    }
+
+  /*  public void test_getTransactionAttribute() {
+
+        MethodTransaction objMethodTransaction = EjbFactory.eINSTANCE.createMethodTransaction();
+        TransactionAttributeType retValue = null;
+        retValue = objMethodTransaction.getTransactionAttribute();
+    }
+
+    public void test_setTransactionAttribute() {
+
+        MethodTransaction objMethodTransaction = EjbFactory.eINSTANCE.createMethodTransaction();
+        TransactionAttributeType newTransactionAttribute = null;
+        objMethodTransaction
+                .setTransactionAttribute(newTransactionAttribute);
+    }
+
+    public void test_unsetTransactionAttribute() {
+
+        MethodTransaction objMethodTransaction = EjbFactory.eINSTANCE.createMethodTransaction();
+        objMethodTransaction.unsetTransactionAttribute();
+    } 
+
+    public void test_isSetTransactionAttribute() {
+
+        MethodTransaction objMethodTransaction = EjbFactory.eINSTANCE.createMethodTransaction();
+        boolean retValue = false;
+        retValue = objMethodTransaction.isSetTransactionAttribute();
+    }
+*/
+ /*   public void test_getDescription() {
+
+        MethodTransaction objMethodTransaction = EjbFactory.eINSTANCE.createMethodTransaction();
+        String retValue = "";
+        retValue = objMethodTransaction.getDescription();
+    }
+
+    public void test_setDescription() {
+
+        MethodTransaction objMethodTransaction = EjbFactory.eINSTANCE.createMethodTransaction();
+        String newDescription = "";
+        objMethodTransaction.setDescription(newDescription);
+    }*/
+
+ /*   public void test_getAssemblyDescriptor() {
+
+        MethodTransaction objMethodTransaction = EjbFactory.eINSTANCE.createMethodTransaction();
+        AssemblyDescriptor retValue = null;
+        retValue = objMethodTransaction.getAssemblyDescriptor();
+    }
+
+    public void test_setAssemblyDescriptor() {
+
+        MethodTransaction objMethodTransaction = EjbFactory.eINSTANCE.createMethodTransaction();
+        AssemblyDescriptor newAssemblyDescriptor = null;
+        objMethodTransaction.setAssemblyDescriptor(newAssemblyDescriptor);
+    } */
+
+  /*  public void test_getMethodElements_2() {
+
+        MethodTransaction objMethodTransaction = EjbFactory.eINSTANCE.createMethodTransaction();
+        EList retValue = null;
+        retValue = objMethodTransaction.getMethodElements();
+    }
+
+    public void test_getDescriptions() {
+
+        MethodTransaction objMethodTransaction = EjbFactory.eINSTANCE.createMethodTransaction();
+        EList retValue = null;
+        retValue = objMethodTransaction.getDescriptions();
+    } */
+    
+    public static junit.framework.Test suite() {
+		TestSuite suite = new TestSuite();
+		suite.addTest(new MethodTransactionTest("test_isEquivalent"));
+		suite.addTest(new MethodTransactionTest("test_getMethodElements"));
+		return suite;
+	}
+   
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/QueryMethodTest.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/QueryMethodTest.java
new file mode 100644
index 0000000..23a6ffd
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/QueryMethodTest.java
@@ -0,0 +1,96 @@
+package org.eclipse.jst.j2ee.ejb.test;
+
+import java.util.List;
+
+import junit.framework.TestSuite;
+
+import org.eclipse.jem.java.JavaClass;
+import org.eclipse.jst.j2ee.ejb.AssemblyDescriptor;
+import org.eclipse.jst.j2ee.ejb.ContainerManagedEntity;
+import org.eclipse.jst.j2ee.ejb.EJBResource;
+import org.eclipse.jst.j2ee.ejb.EnterpriseBean;
+import org.eclipse.jst.j2ee.ejb.QueryMethod;
+
+public class QueryMethodTest extends EjbEMFTestBase {
+
+	/**
+	 * @param name
+	 */
+	public QueryMethodTest(String name) {
+		super(name);
+	}
+	
+   
+  /*  public void test_getQuery() {
+
+        QueryMethod objQueryMethod = EjbFactory.eINSTANCE.createQueryMethod();
+        Query retValue = null;
+        retValue = objQueryMethod.getQuery();
+    }
+
+    public void test_setQuery() {
+
+        QueryMethod objQueryMethod = EjbFactory.eINSTANCE.createQueryMethod();
+        Query newQuery = null;
+        objQueryMethod.setQuery(newQuery);
+    } */
+    
+
+    
+    public void test_getClientTypeJavaClasses() throws Exception {
+		init();
+		EJBResource DD = (EJBResource) ejbFile.getDeploymentDescriptorResource();
+		
+		AssemblyDescriptor assemblyDescriptor = DD.getEJBJar().getAssemblyDescriptor();
+		List enterpriseBeans = DD.getEJBJar().getEnterpriseBeans();
+		ContainerManagedEntity entityBean = null;
+		EnterpriseBean bean = null;
+		for (int x=0; x< enterpriseBeans.size(); ++x) {
+			bean = (EnterpriseBean) enterpriseBeans.get(x);
+			if (bean.isEntity() && bean.isContainerManagedEntity()) {
+				entityBean = (ContainerManagedEntity) bean;
+				break;
+			}
+		}
+		assertNotNull(entityBean);
+		QueryMethod objQueryMethod =getEjbFactory().createQueryMethod();
+		objQueryMethod.setName(QueryMethod.SELECT_PREFIX+"Test");
+		objQueryMethod.setEnterpriseBean(entityBean);
+		JavaClass[] retValue = objQueryMethod.getClientTypeJavaClasses();
+		assertNotNull(retValue);
+		assertEquals(retValue.length==1,true );
+		assertEquals(retValue[0],entityBean.getEjbClass());
+		
+		objQueryMethod.setName(QueryMethod.FIND_PREFIX+"Test");
+		
+		if (entityBean.hasLocalClient() && !entityBean.hasRemoteClient()) {
+			retValue = objQueryMethod.getClientTypeJavaClasses();
+			assertNotNull(retValue);
+			assertEquals(retValue.length==1,true );
+			assertEquals(retValue[0],entityBean.getLocalHomeInterface());
+		}	
+		if (entityBean.hasRemoteClient() && !entityBean.hasLocalClient()) {
+			retValue = objQueryMethod.getClientTypeJavaClasses();
+			assertNotNull(retValue);
+			assertEquals(retValue.length==1,true );
+			assertEquals(retValue[0],entityBean.getHomeInterface());
+		}
+		if (entityBean.hasRemoteClient() && entityBean.hasLocalClient()) {
+			retValue = objQueryMethod.getClientTypeJavaClasses();
+			assertNotNull(retValue);
+			assertEquals(retValue.length==2,true );
+			assertEquals(retValue[0],entityBean.getLocalHomeInterface());
+			assertEquals(retValue[1],entityBean.getHomeInterface());
+		}  
+	}
+    
+    public static junit.framework.Test suite() {
+		TestSuite suite = new TestSuite();
+		suite.addTest(new QueryMethodTest("test_getClientTypeJavaClasses"));
+		return suite;
+	}		
+		
+	
+	
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/QueryTest.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/QueryTest.java
new file mode 100644
index 0000000..f62d646
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/QueryTest.java
@@ -0,0 +1,130 @@
+package org.eclipse.jst.j2ee.ejb.test;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.eclipse.jst.j2ee.ejb.EjbFactory;
+import org.eclipse.jst.j2ee.ejb.Query;
+import org.eclipse.jst.j2ee.ejb.ReturnTypeMapping;
+
+public class QueryTest extends TestCase {
+
+    public void test_Query() {
+        Query tmpQuery = EjbFactory.eINSTANCE.createQuery();
+        assertNotNull(tmpQuery);
+    }
+    public static Test suite() {
+		return new TestSuite(QueryTest.class);
+	}
+
+    public void test_isLocalResultMapping() {
+
+        Query objQuery = EjbFactory.eINSTANCE.createQuery();
+        objQuery.setReturnTypeMapping(ReturnTypeMapping.LOCAL_LITERAL);
+        assertEquals(objQuery.isLocalResultMapping(),true);
+        objQuery.setReturnTypeMapping(ReturnTypeMapping.REMOTE_LITERAL);
+        assertEquals(objQuery.isLocalResultMapping(),false);
+       
+    }
+
+    public void test_isRemoteResultMapping() {
+
+    	 Query objQuery = EjbFactory.eINSTANCE.createQuery();
+         objQuery.setReturnTypeMapping(ReturnTypeMapping.REMOTE_LITERAL);
+         assertEquals(objQuery.isLocalResultMapping(),false);
+         objQuery.setReturnTypeMapping(ReturnTypeMapping.LOCAL_LITERAL);
+         assertEquals(objQuery.isLocalResultMapping(),true);
+     
+    }
+
+ /*   public void test_getDescription() {
+
+        Query objQuery = EjbFactory.eINSTANCE.createQuery();
+        String retValue = "";
+        retValue = objQuery.getDescription();
+    }
+
+    public void test_setDescription() {
+
+        Query objQuery = EjbFactory.eINSTANCE.createQuery();
+        String newDescription = "";
+        objQuery.setDescription(newDescription);
+    }
+
+    public void test_getEjbQL() {
+
+        Query objQuery = EjbFactory.eINSTANCE.createQuery();
+        String retValue = "";
+        retValue = objQuery.getEjbQL();
+    }
+
+    public void test_setEjbQL() {
+
+        Query objQuery = EjbFactory.eINSTANCE.createQuery();
+        String newEjbQL = "";
+        objQuery.setEjbQL(newEjbQL);
+    } */
+
+  /*  public void test_getReturnTypeMapping() {
+
+        Query objQuery = EjbFactory.eINSTANCE.createQuery();
+        ReturnTypeMapping retValue = null;
+        retValue = objQuery.getReturnTypeMapping();
+    }
+
+    public void test_setReturnTypeMapping() {
+
+        Query objQuery = EjbFactory.eINSTANCE.createQuery();
+        ReturnTypeMapping newReturnTypeMapping = null;
+        objQuery.setReturnTypeMapping(newReturnTypeMapping);
+    }
+
+    public void test_unsetReturnTypeMapping() {
+
+        Query objQuery = EjbFactory.eINSTANCE.createQuery();
+        objQuery.unsetReturnTypeMapping();
+    }
+
+    public void test_isSetReturnTypeMapping() {
+
+        Query objQuery = EjbFactory.eINSTANCE.createQuery();
+        boolean retValue = false;
+        retValue = objQuery.isSetReturnTypeMapping();
+    }*/
+
+ /*   public void test_getQueryMethod() {
+
+        Query objQuery = EjbFactory.eINSTANCE.createQuery();
+        QueryMethod retValue = null;
+        retValue = objQuery.getQueryMethod();
+    }
+
+    public void test_setQueryMethod() {
+
+        Query objQuery = EjbFactory.eINSTANCE.createQuery();
+        QueryMethod newQueryMethod = null;
+        objQuery.setQueryMethod(newQueryMethod);
+    }*/
+
+  /*  public void test_getEntity() {
+
+        Query objQuery = EjbFactory.eINSTANCE.createQuery();
+        ContainerManagedEntity retValue = null;
+        retValue = objQuery.getEntity();
+    }
+
+    public void test_setEntity() {
+
+        Query objQuery = EjbFactory.eINSTANCE.createQuery();
+        ContainerManagedEntity newEntity = null;
+        objQuery.setEntity(newEntity);
+    }*/
+
+    /*public void test_getDescriptions() {
+
+        Query objQuery = EjbFactory.eINSTANCE.createQuery();
+        EList retValue = null;
+        retValue = objQuery.getDescriptions();
+    }*/
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/SessionTest.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/SessionTest.java
new file mode 100644
index 0000000..4077fd0
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/SessionTest.java
@@ -0,0 +1,116 @@
+package org.eclipse.jst.j2ee.ejb.test;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.eclipse.jst.j2ee.ejb.EjbFactory;
+import org.eclipse.jst.j2ee.ejb.EjbPackage;
+import org.eclipse.jst.j2ee.ejb.Session;
+
+public class SessionTest extends TestCase {
+
+	  public static Test suite() {
+		return new TestSuite(SessionTest.class);
+	}
+ 
+  /*  public void test_getTransactionType() {
+
+        Session objSession =  EjbFactory.eINSTANCE.createSession();
+        TransactionType retValue = null;
+        retValue = objSession.getTransactionType();
+    }
+
+    public void test_setTransactionType() {
+
+        Session objSession =  EjbFactory.eINSTANCE.createSession();
+        TransactionType newTransactionType = null;
+        objSession.setTransactionType(newTransactionType);
+    }
+
+    public void test_unsetTransactionType() {
+
+        Session objSession =  EjbFactory.eINSTANCE.createSession();
+        objSession.unsetTransactionType();
+    }
+
+    public void test_isSetTransactionType() {
+
+        Session objSession =  EjbFactory.eINSTANCE.createSession();
+        boolean retValue = false;
+        retValue = objSession.isSetTransactionType();
+    }*/
+
+   /* public void test_getSessionType() {
+
+        Session objSession =  EjbFactory.eINSTANCE.createSession();
+        SessionType retValue = null;
+        retValue = objSession.getSessionType();
+    }
+
+    public void test_setSessionType() {
+
+        Session objSession =  EjbFactory.eINSTANCE.createSession();
+        SessionType newSessionType = null;
+        objSession.setSessionType(newSessionType);
+    }
+
+    public void test_unsetSessionType() {
+
+        Session objSession =  EjbFactory.eINSTANCE.createSession();
+        objSession.unsetSessionType();
+    }
+
+    public void test_isSetSessionType() {
+
+        Session objSession =  EjbFactory.eINSTANCE.createSession();
+        boolean retValue = false;
+        retValue = objSession.isSetSessionType();
+    }*/
+
+  /*  public void test_getServiceEndpoint() {
+
+        Session objSession =  EjbFactory.eINSTANCE.createSession();
+        JavaClass retValue = null;
+        retValue = objSession.getServiceEndpoint();
+    }
+
+   
+    public void test_setServiceEndpoint() {
+
+        Session objSession =  EjbFactory.eINSTANCE.createSession();
+        JavaClass newServiceEndpoint = null;
+        objSession.setServiceEndpoint(newServiceEndpoint);
+    }*/
+    
+    public void test_setServiceEndpointName() {
+
+        Session objSession =  EjbPackage.eINSTANCE.getEjbFactory().createSession();
+        String serviceEndpointName = "SessionEndPoint1";
+        objSession.setServiceEndpointName(serviceEndpointName);
+        assertEquals(serviceEndpointName,objSession.getServiceEndpointName());
+       
+    }
+
+    public void test_hasServiceEndpoint() {
+
+        Session objSession =  EjbFactory.eINSTANCE.createSession();
+        assertEquals(objSession.hasServiceEndpoint(),false);
+        boolean retValue = false;
+        String serviceEndpointName = "SessionEndPoint1";
+        objSession.setServiceEndpointName(serviceEndpointName);
+        retValue = objSession.hasServiceEndpoint();
+        assertEquals(objSession.hasServiceEndpoint(),true);
+        
+    }
+
+    public void test_getServiceEndpointName() {
+
+	   Session objSession =  EjbPackage.eINSTANCE.getEjbFactory().createSession();
+       String serviceEndpointName = "SessionEndPoint1";
+       objSession.setServiceEndpointName(serviceEndpointName);
+       assertEquals(serviceEndpointName,objSession.getServiceEndpointName());
+     
+    }
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/jca/test/ConnectorTest.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/jca/test/ConnectorTest.java
new file mode 100644
index 0000000..317c8d5
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/jca/test/ConnectorTest.java
@@ -0,0 +1,45 @@
+package org.eclipse.jst.j2ee.jca.test;
+
+import junit.framework.TestSuite;
+
+import org.eclipse.jst.j2ee.archive.emftests.RarEMFTest;
+import org.eclipse.jst.j2ee.archive.testutilities.EMFAttributeFeatureGenerator;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.j2ee.jca.Connector;
+import org.eclipse.jst.j2ee.jca.ConnectorResource;
+import org.eclipse.jst.j2ee.jca.JcaPackage;
+
+public class ConnectorTest extends RarEMFTest {
+
+    /**
+	 * @param name
+	 */
+	public ConnectorTest(String name) {
+		super(name);
+	}
+
+	public Connector getInstance() {
+    	return JcaPackage.eINSTANCE.getJcaFactory().createConnector();
+    }
+
+    public void test_getVersionID() throws Exception {
+    	EMFAttributeFeatureGenerator.reset();
+		createEAR();
+		createRAR();
+
+		ConnectorResource DD = (ConnectorResource) rarFile.getDeploymentDescriptorResource();
+		DD.setVersionID(J2EEVersionConstants.J2EE_1_4_ID);
+		setVersion(VERSION_1_4);
+		int versionID = DD.getConnector().getVersionID();
+		assertEquals(versionID,J2EEVersionConstants.JCA_1_5_ID);
+		
+    }
+    
+    public static junit.framework.Test suite() {
+		TestSuite suite = new TestSuite();
+		suite.addTest(new ConnectorTest("test_getVersionID"));
+		return suite;
+	}
+
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/jca/test/JcaFactoryTest.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/jca/test/JcaFactoryTest.java
new file mode 100644
index 0000000..4890593
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/jca/test/JcaFactoryTest.java
@@ -0,0 +1,159 @@
+package org.eclipse.jst.j2ee.jca.test;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.eclipse.jst.j2ee.jca.ActivationSpec;
+import org.eclipse.jst.j2ee.jca.AdminObject;
+import org.eclipse.jst.j2ee.jca.AuthenticationMechanism;
+import org.eclipse.jst.j2ee.jca.ConfigProperty;
+import org.eclipse.jst.j2ee.jca.ConnectionDefinition;
+import org.eclipse.jst.j2ee.jca.Connector;
+import org.eclipse.jst.j2ee.jca.InboundResourceAdapter;
+import org.eclipse.jst.j2ee.jca.JcaFactory;
+import org.eclipse.jst.j2ee.jca.JcaPackage;
+import org.eclipse.jst.j2ee.jca.License;
+import org.eclipse.jst.j2ee.jca.MessageAdapter;
+import org.eclipse.jst.j2ee.jca.MessageListener;
+import org.eclipse.jst.j2ee.jca.OutboundResourceAdapter;
+import org.eclipse.jst.j2ee.jca.RequiredConfigPropertyType;
+import org.eclipse.jst.j2ee.jca.ResourceAdapter;
+import org.eclipse.jst.j2ee.jca.SecurityPermission;
+
+public class JcaFactoryTest extends TestCase {
+
+	private JcaFactory getInstance() {
+		return JcaPackage.eINSTANCE.getJcaFactory();
+	}
+    public void test_JcaFactory() {
+
+        JcaFactory tmpJcaFactory = getInstance();
+    }
+    
+    public static Test suite() {
+		return new TestSuite(JcaFactoryTest.class);
+	}
+
+    public void test_createConnector() {
+
+        JcaFactory objJcaFactory = getInstance();
+        Connector retValue = null;
+        retValue = objJcaFactory.createConnector();
+        assertNotNull(retValue);
+    }
+
+    public void test_createLicense() {
+
+        JcaFactory objJcaFactory = getInstance();
+        License retValue = null;
+        retValue = objJcaFactory.createLicense();
+        assertNotNull(retValue);
+    }
+
+    public void test_createInboundResourceAdapter() {
+
+        JcaFactory objJcaFactory = getInstance();
+        InboundResourceAdapter retValue = null;
+        retValue = objJcaFactory.createInboundResourceAdapter();
+        assertNotNull(retValue);
+    }
+
+    public void test_createOutboundResourceAdapter() {
+
+        JcaFactory objJcaFactory = getInstance();
+        OutboundResourceAdapter retValue = null;
+        retValue = objJcaFactory.createOutboundResourceAdapter();
+        assertNotNull(retValue);
+    }
+
+    public void test_createMessageAdapter() {
+
+        JcaFactory objJcaFactory = getInstance();
+        MessageAdapter retValue = null;
+        retValue = objJcaFactory.createMessageAdapter();
+        assertNotNull(retValue);
+    }
+
+    public void test_createConnectionDefinition() {
+
+        JcaFactory objJcaFactory = getInstance();
+        ConnectionDefinition retValue = null;
+        retValue = objJcaFactory.createConnectionDefinition();
+        assertNotNull(retValue);
+    }
+
+    public void test_createAdminObject() {
+
+        JcaFactory objJcaFactory = getInstance();
+        AdminObject retValue = null;
+        retValue = objJcaFactory.createAdminObject();
+        assertNotNull(retValue);
+    }
+
+    public void test_createMessageListener() {
+
+        JcaFactory objJcaFactory = getInstance();
+        MessageListener retValue = null;
+        retValue = objJcaFactory.createMessageListener();
+        assertNotNull(retValue);
+    }
+
+    public void test_createActivationSpec() {
+
+        JcaFactory objJcaFactory = getInstance();
+        ActivationSpec retValue = null;
+        retValue = objJcaFactory.createActivationSpec();
+        assertNotNull(retValue);
+    }
+
+    public void test_createRequiredConfigPropertyType() {
+
+        JcaFactory objJcaFactory = getInstance();
+        RequiredConfigPropertyType retValue = null;
+        retValue = objJcaFactory.createRequiredConfigPropertyType();
+        assertNotNull(retValue);
+    }
+
+    public void test_createResourceAdapter() {
+
+        JcaFactory objJcaFactory = getInstance();
+        ResourceAdapter retValue = null;
+        retValue = objJcaFactory.createResourceAdapter();
+        assertNotNull(retValue);
+    }
+
+    public void test_createSecurityPermission() {
+
+        JcaFactory objJcaFactory = getInstance();
+        SecurityPermission retValue = null;
+        retValue = objJcaFactory.createSecurityPermission();
+        assertNotNull(retValue);
+    }
+
+    public void test_createAuthenticationMechanism() {
+
+        JcaFactory objJcaFactory = getInstance();
+        AuthenticationMechanism retValue = null;
+        retValue = objJcaFactory.createAuthenticationMechanism();
+        assertNotNull(retValue);
+    }
+
+    public void test_createConfigProperty() {
+
+        JcaFactory objJcaFactory = getInstance();
+        ConfigProperty retValue = null;
+        retValue = objJcaFactory.createConfigProperty();
+        assertNotNull(retValue);
+    }
+
+    public void test_getJcaPackage() {
+
+        JcaFactory objJcaFactory = getInstance();
+        JcaPackage retValue = null;
+        retValue = objJcaFactory.getJcaPackage();
+       
+        assertNotNull(retValue);
+    }
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/jsp/test/JspFactoryTest.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/jsp/test/JspFactoryTest.java
new file mode 100644
index 0000000..7b1f987
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/jsp/test/JspFactoryTest.java
@@ -0,0 +1,56 @@
+package org.eclipse.jst.j2ee.jsp.test;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.eclipse.jst.j2ee.jca.test.JcaFactoryTest;
+import org.eclipse.jst.j2ee.jsp.JSPConfig;
+import org.eclipse.jst.j2ee.jsp.JSPPropertyGroup;
+import org.eclipse.jst.j2ee.jsp.JspFactory;
+import org.eclipse.jst.j2ee.jsp.JspPackage;
+import org.eclipse.jst.j2ee.jsp.TagLibRefType;
+
+public class JspFactoryTest extends TestCase {
+
+	public static Test suite() {
+		return new TestSuite(JcaFactoryTest.class);
+	}
+	
+	private JspFactory getInstance() {
+		return JspPackage.eINSTANCE.getJspFactory();
+	}
+    public void test_createJSPConfig() {
+
+        JspFactory objJspFactory = getInstance();
+        JSPConfig retValue = null;
+        retValue = objJspFactory.createJSPConfig();
+        assertNotNull(retValue);
+    }
+
+    public void test_createJSPPropertyGroup() {
+
+        JspFactory objJspFactory = getInstance();
+        JSPPropertyGroup retValue = null;
+        retValue = objJspFactory.createJSPPropertyGroup();
+        assertNotNull(retValue);
+    }
+
+    public void test_createTagLibRefType() {
+
+        JspFactory objJspFactory = getInstance();
+        TagLibRefType retValue = null;
+        retValue = objJspFactory.createTagLibRefType();
+        assertNotNull(retValue);
+    }
+
+    public void test_getJspPackage() {
+
+        JspFactory objJspFactory = getInstance();
+        JspPackage retValue = null;
+        retValue = objJspFactory.getJspPackage();
+        // TODO getWsddPackage method always return null
+        assertNotNull(retValue);
+    }
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/webapplication/test/WebapplicationFactoryTest.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/webapplication/test/WebapplicationFactoryTest.java
new file mode 100644
index 0000000..03d0a1d
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/webapplication/test/WebapplicationFactoryTest.java
@@ -0,0 +1,281 @@
+package org.eclipse.jst.j2ee.webapplication.test;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.eclipse.jst.j2ee.webapplication.AuthConstraint;
+import org.eclipse.jst.j2ee.webapplication.ContextParam;
+import org.eclipse.jst.j2ee.webapplication.ErrorCodeErrorPage;
+import org.eclipse.jst.j2ee.webapplication.ErrorPage;
+import org.eclipse.jst.j2ee.webapplication.ExceptionTypeErrorPage;
+import org.eclipse.jst.j2ee.webapplication.Filter;
+import org.eclipse.jst.j2ee.webapplication.FilterMapping;
+import org.eclipse.jst.j2ee.webapplication.FormLoginConfig;
+import org.eclipse.jst.j2ee.webapplication.HTTPMethodType;
+import org.eclipse.jst.j2ee.webapplication.InitParam;
+import org.eclipse.jst.j2ee.webapplication.JSPType;
+import org.eclipse.jst.j2ee.webapplication.LocalEncodingMapping;
+import org.eclipse.jst.j2ee.webapplication.LocalEncodingMappingList;
+import org.eclipse.jst.j2ee.webapplication.LoginConfig;
+import org.eclipse.jst.j2ee.webapplication.MimeMapping;
+import org.eclipse.jst.j2ee.webapplication.RoleNameType;
+import org.eclipse.jst.j2ee.webapplication.SecurityConstraint;
+import org.eclipse.jst.j2ee.webapplication.Servlet;
+import org.eclipse.jst.j2ee.webapplication.ServletMapping;
+import org.eclipse.jst.j2ee.webapplication.ServletType;
+import org.eclipse.jst.j2ee.webapplication.SessionConfig;
+import org.eclipse.jst.j2ee.webapplication.TagLibRef;
+import org.eclipse.jst.j2ee.webapplication.URLPatternType;
+import org.eclipse.jst.j2ee.webapplication.UserDataConstraint;
+import org.eclipse.jst.j2ee.webapplication.WebApp;
+import org.eclipse.jst.j2ee.webapplication.WebResourceCollection;
+import org.eclipse.jst.j2ee.webapplication.WebapplicationFactory;
+import org.eclipse.jst.j2ee.webapplication.WebapplicationPackage;
+import org.eclipse.jst.j2ee.webapplication.WelcomeFile;
+import org.eclipse.jst.j2ee.webapplication.WelcomeFileList;
+
+public class WebapplicationFactoryTest extends TestCase {
+
+	public static Test suite() {
+		return new TestSuite(WebapplicationFactoryTest.class);
+	}
+	
+	private WebapplicationFactory getInstance() {
+		return WebapplicationPackage.eINSTANCE.getWebapplicationFactory();
+	}
+	
+    public void test_createWebApp() {
+
+        WebapplicationFactory objWebapplicationFactory = getInstance();
+        WebApp retValue = null;
+        retValue = objWebapplicationFactory.createWebApp();
+        assertNotNull(retValue);
+    }
+
+    public void test_createContextParam() {
+
+        WebapplicationFactory objWebapplicationFactory = getInstance();
+        ContextParam retValue = null;
+        retValue = objWebapplicationFactory.createContextParam();
+        assertNotNull(retValue);
+    }
+
+    public void test_createErrorPage() {
+
+        WebapplicationFactory objWebapplicationFactory = getInstance();
+        ErrorPage retValue = null;
+        retValue = objWebapplicationFactory.createErrorPage();
+        assertNotNull(retValue);
+    }
+
+    public void test_createTagLibRef() {
+
+        WebapplicationFactory objWebapplicationFactory = getInstance();
+        TagLibRef retValue = null;
+        retValue = objWebapplicationFactory.createTagLibRef();
+        assertNotNull(retValue);
+    }
+
+    public void test_createExceptionTypeErrorPage() {
+
+        WebapplicationFactory objWebapplicationFactory = getInstance();
+        ExceptionTypeErrorPage retValue = null;
+        retValue = objWebapplicationFactory.createExceptionTypeErrorPage();
+        assertNotNull(retValue);
+    }
+
+    public void test_createErrorCodeErrorPage() {
+
+        WebapplicationFactory objWebapplicationFactory = getInstance();
+        ErrorCodeErrorPage retValue = null;
+        retValue = objWebapplicationFactory.createErrorCodeErrorPage();
+        assertNotNull(retValue);
+    }
+
+    public void test_createWelcomeFileList() {
+
+        WebapplicationFactory objWebapplicationFactory = getInstance();
+        WelcomeFileList retValue = null;
+        retValue = objWebapplicationFactory.createWelcomeFileList();
+        assertNotNull(retValue);
+    }
+
+    public void test_createWelcomeFile() {
+
+        WebapplicationFactory objWebapplicationFactory = getInstance();
+        WelcomeFile retValue = null;
+        retValue = objWebapplicationFactory.createWelcomeFile();
+        assertNotNull(retValue);
+    }
+
+    public void test_createSecurityConstraint() {
+
+        WebapplicationFactory objWebapplicationFactory = getInstance();
+        SecurityConstraint retValue = null;
+        retValue = objWebapplicationFactory.createSecurityConstraint();
+        assertNotNull(retValue);
+    }
+
+    public void test_createWebResourceCollection() {
+
+        WebapplicationFactory objWebapplicationFactory = getInstance();
+        WebResourceCollection retValue = null;
+        retValue = objWebapplicationFactory.createWebResourceCollection();
+        assertNotNull(retValue);
+    }
+
+    public void test_createURLPatternType() {
+
+        WebapplicationFactory objWebapplicationFactory = getInstance();
+        URLPatternType retValue = null;
+        retValue = objWebapplicationFactory.createURLPatternType();
+        assertNotNull(retValue);
+    }
+
+    public void test_createAuthConstraint() {
+
+        WebapplicationFactory objWebapplicationFactory = getInstance();
+        AuthConstraint retValue = null;
+        retValue = objWebapplicationFactory.createAuthConstraint();
+        assertNotNull(retValue);
+    }
+
+    public void test_createUserDataConstraint() {
+
+        WebapplicationFactory objWebapplicationFactory = getInstance();
+        UserDataConstraint retValue = null;
+        retValue = objWebapplicationFactory.createUserDataConstraint();
+        assertNotNull(retValue);
+    }
+
+    public void test_createLoginConfig() {
+
+        WebapplicationFactory objWebapplicationFactory = getInstance();
+        LoginConfig retValue = null;
+        retValue = objWebapplicationFactory.createLoginConfig();
+        assertNotNull(retValue);
+    }
+
+    public void test_createFormLoginConfig() {
+
+        WebapplicationFactory objWebapplicationFactory = getInstance();
+        FormLoginConfig retValue = null;
+        retValue = objWebapplicationFactory.createFormLoginConfig();
+        assertNotNull(retValue);
+    }
+
+    public void test_createMimeMapping() {
+
+        WebapplicationFactory objWebapplicationFactory = getInstance();
+        MimeMapping retValue = null;
+        retValue = objWebapplicationFactory.createMimeMapping();
+        assertNotNull(retValue);
+    }
+
+    public void test_createSessionConfig() {
+
+        WebapplicationFactory objWebapplicationFactory = getInstance();
+        SessionConfig retValue = null;
+        retValue = objWebapplicationFactory.createSessionConfig();
+        assertNotNull(retValue);
+    }
+
+    public void test_createServletMapping() {
+
+        WebapplicationFactory objWebapplicationFactory = getInstance();
+        ServletMapping retValue = null;
+        retValue = objWebapplicationFactory.createServletMapping();
+        assertNotNull(retValue);
+    }
+
+    public void test_createServlet() {
+
+        WebapplicationFactory objWebapplicationFactory = getInstance();
+        Servlet retValue = null;
+        retValue = objWebapplicationFactory.createServlet();
+        assertNotNull(retValue);
+    }
+
+    public void test_createServletType() {
+
+        WebapplicationFactory objWebapplicationFactory = getInstance();
+        ServletType retValue = null;
+        retValue = objWebapplicationFactory.createServletType();
+        assertNotNull(retValue);
+    }
+
+    public void test_createJSPType() {
+
+        WebapplicationFactory objWebapplicationFactory = getInstance();
+        JSPType retValue = null;
+        retValue = objWebapplicationFactory.createJSPType();
+        assertNotNull(retValue);
+    }
+
+    public void test_createInitParam() {
+
+        WebapplicationFactory objWebapplicationFactory = getInstance();
+        InitParam retValue = null;
+        retValue = objWebapplicationFactory.createInitParam();
+        assertNotNull(retValue);
+    }
+
+    public void test_createFilter() {
+
+        WebapplicationFactory objWebapplicationFactory = getInstance();
+        Filter retValue = null;
+        retValue = objWebapplicationFactory.createFilter();
+        assertNotNull(retValue);
+    }
+
+    public void test_createFilterMapping() {
+
+        WebapplicationFactory objWebapplicationFactory = getInstance();
+        FilterMapping retValue = null;
+        retValue = objWebapplicationFactory.createFilterMapping();
+        assertNotNull(retValue);
+    }
+
+    public void test_createLocalEncodingMappingList() {
+
+        WebapplicationFactory objWebapplicationFactory = getInstance();
+        LocalEncodingMappingList retValue = null;
+        retValue = objWebapplicationFactory
+                .createLocalEncodingMappingList();
+        assertNotNull(retValue);
+    }
+
+    public void test_createLocalEncodingMapping() {
+
+        WebapplicationFactory objWebapplicationFactory = getInstance();
+        LocalEncodingMapping retValue = null;
+        retValue = objWebapplicationFactory.createLocalEncodingMapping();
+        assertNotNull(retValue);
+    }
+
+    public void test_createHTTPMethodType() {
+
+        WebapplicationFactory objWebapplicationFactory = getInstance();
+        HTTPMethodType retValue = null;
+        retValue = objWebapplicationFactory.createHTTPMethodType();
+        assertNotNull(retValue);
+    }
+
+    public void test_createRoleNameType() {
+
+        WebapplicationFactory objWebapplicationFactory = getInstance();
+        RoleNameType retValue = null;
+        retValue = objWebapplicationFactory.createRoleNameType();
+        assertNotNull(retValue);
+    }
+
+    public void test_getWebapplicationPackage() {
+
+        WebapplicationFactory objWebapplicationFactory = getInstance();
+        WebapplicationPackage retValue = null;
+        retValue = objWebapplicationFactory.getWebapplicationPackage();
+        assertNotNull(retValue);
+    }
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/webservice/wscommon/test/WscommonFactoryTest.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/webservice/wscommon/test/WscommonFactoryTest.java
new file mode 100644
index 0000000..fa764fe
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/webservice/wscommon/test/WscommonFactoryTest.java
@@ -0,0 +1,82 @@
+package org.eclipse.jst.j2ee.webservice.wscommon.test;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.eclipse.jst.j2ee.webservice.wscommon.DescriptionType;
+import org.eclipse.jst.j2ee.webservice.wscommon.DisplayNameType;
+import org.eclipse.jst.j2ee.webservice.wscommon.InitParam;
+import org.eclipse.jst.j2ee.webservice.wscommon.PortName;
+import org.eclipse.jst.j2ee.webservice.wscommon.SOAPHeader;
+import org.eclipse.jst.j2ee.webservice.wscommon.SOAPRole;
+import org.eclipse.jst.j2ee.webservice.wscommon.WscommonFactory;
+import org.eclipse.jst.j2ee.webservice.wscommon.WscommonPackage;
+
+public class WscommonFactoryTest extends TestCase {
+
+	public static Test suite() {
+		return new TestSuite(WscommonFactoryTest.class);
+	}
+	
+	private WscommonFactory getInstance() {
+		return WscommonPackage.eINSTANCE.getWscommonFactory();
+	}
+    public void test_createInitParam() {
+
+        WscommonFactory objWscommonFactory = getInstance();
+        InitParam retValue = null;
+        retValue = objWscommonFactory.createInitParam();
+        assertNotNull(retValue);
+    }
+
+    public void test_createSOAPHeader() {
+
+        WscommonFactory objWscommonFactory = getInstance();
+        SOAPHeader retValue = null;
+        retValue = objWscommonFactory.createSOAPHeader();
+        assertNotNull(retValue);
+    }
+
+    public void test_createSOAPRole() {
+
+        WscommonFactory objWscommonFactory = getInstance();
+        SOAPRole retValue = null;
+        retValue = objWscommonFactory.createSOAPRole();
+        assertNotNull(retValue);
+    }
+
+    public void test_createPortName() {
+
+        WscommonFactory objWscommonFactory = getInstance();
+        PortName retValue = null;
+        retValue = objWscommonFactory.createPortName();
+        assertNotNull(retValue);
+    }
+
+    public void test_createDescriptionType() {
+
+        WscommonFactory objWscommonFactory = getInstance();
+        DescriptionType retValue = null;
+        retValue = objWscommonFactory.createDescriptionType();
+        assertNotNull(retValue);
+    }
+
+    public void test_createDisplayNameType() {
+
+        WscommonFactory objWscommonFactory = getInstance();
+        DisplayNameType retValue = null;
+        retValue = objWscommonFactory.createDisplayNameType();
+        assertNotNull(retValue);
+    }
+
+    public void test_getWscommonPackage() {
+
+        WscommonFactory objWscommonFactory = getInstance();
+        WscommonPackage retValue = null;
+        retValue = objWscommonFactory.getWscommonPackage();
+        
+        assertNotNull(retValue);
+    }
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/webservice/wsdd/test/WsddFactoryTest.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/webservice/wsdd/test/WsddFactoryTest.java
new file mode 100644
index 0000000..6210ab8
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/webservice/wsdd/test/WsddFactoryTest.java
@@ -0,0 +1,101 @@
+package org.eclipse.jst.j2ee.webservice.wsdd.test;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.eclipse.jst.j2ee.webservice.wsdd.BeanLink;
+import org.eclipse.jst.j2ee.webservice.wsdd.EJBLink;
+import org.eclipse.jst.j2ee.webservice.wsdd.Handler;
+import org.eclipse.jst.j2ee.webservice.wsdd.PortComponent;
+import org.eclipse.jst.j2ee.webservice.wsdd.ServiceImplBean;
+import org.eclipse.jst.j2ee.webservice.wsdd.ServletLink;
+import org.eclipse.jst.j2ee.webservice.wsdd.WSDLPort;
+import org.eclipse.jst.j2ee.webservice.wsdd.WebServiceDescription;
+import org.eclipse.jst.j2ee.webservice.wsdd.WebServices;
+import org.eclipse.jst.j2ee.webservice.wsdd.WsddFactory;
+import org.eclipse.jst.j2ee.webservice.wsdd.WsddPackage;
+
+public class WsddFactoryTest extends TestCase {
+
+	public static Test suite() {
+		return new TestSuite(WsddFactoryTest.class);
+	}
+	
+	private WsddFactory getInstance() {
+		return WsddPackage.eINSTANCE.getWsddFactory();
+	}
+    public void test_createWebServices() {
+
+        WsddFactory objWsddFactory = getInstance();
+        WebServices retValue = null;
+        retValue = objWsddFactory.createWebServices();
+        assertNotNull(retValue);
+    }
+
+    public void test_createWebServiceDescription() {
+
+        WsddFactory objWsddFactory = getInstance();
+        WebServiceDescription retValue = null;
+        retValue = objWsddFactory.createWebServiceDescription();
+        assertNotNull(retValue);
+    }
+
+    public void test_createPortComponent() {
+
+        WsddFactory objWsddFactory = getInstance();
+        PortComponent retValue = null;
+        retValue = objWsddFactory.createPortComponent();
+        assertNotNull(retValue);
+    }
+
+    public void test_createWSDLPort() {
+
+        WsddFactory objWsddFactory = getInstance();
+        WSDLPort retValue = null;
+        retValue = objWsddFactory.createWSDLPort();
+        assertNotNull(retValue);
+    }
+
+    public void test_createServiceImplBean() {
+
+        WsddFactory objWsddFactory = getInstance();
+        ServiceImplBean retValue = null;
+        retValue = objWsddFactory.createServiceImplBean();
+        assertNotNull(retValue);
+    }
+
+    public void test_createServletLink() {
+
+        WsddFactory objWsddFactory = getInstance();
+        ServletLink retValue = null;
+        retValue = objWsddFactory.createServletLink();
+        assertNotNull(retValue);
+    }
+
+    public void test_createEJBLink() {
+
+        WsddFactory objWsddFactory = getInstance();
+        EJBLink retValue = null;
+        retValue = objWsddFactory.createEJBLink();
+        assertNotNull(retValue);
+    }
+
+    public void test_createHandler() {
+
+        WsddFactory objWsddFactory = getInstance();
+        Handler retValue = null;
+        retValue = objWsddFactory.createHandler();
+        assertNotNull(retValue);
+    }
+
+    public void test_createBeanLink() {
+
+        WsddFactory objWsddFactory = getInstance();
+        BeanLink retValue = null;
+        retValue = objWsddFactory.createBeanLink();
+        assertNotNull(retValue);
+    }
+
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/out.xmi b/tests/org.eclipse.jst.j2ee.core.tests/out.xmi
new file mode 100644
index 0000000..47d30c3
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/out.xmi
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="ASCII"?>

+<org.eclipse.jem.internal.java:JavaClass xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:org.eclipse.jem.internal.java="java.xmi" name="A" kind="CLASS" public="true">

+  <eSuperTypes href="java:/java.lang#Object"/>

+  <implementsInterfaces href="java:/com.ibm.etools.java.stressSample#IA"/>

+  <fields name="anA" eType="/"/>

+  <fields name="aB">

+    <eType xsi:type="org.eclipse.jem.internal.java:JavaClass" href="java:/com.ibm.etools.java.stressSample#B"/>

+  </fields>

+  <fields name="bees">

+    <eType xsi:type="org.eclipse.jem.internal.java:ArrayType" href="java:/com.ibm.etools.java.stressSample#B[]"/>

+  </fields>

+  <fields name="bees_and_bees">

+    <eType xsi:type="org.eclipse.jem.internal.java:ArrayType" href="java:/com.ibm.etools.java.stressSample#B[][]"/>

+  </fields>

+  <fields name="ints">

+    <eType xsi:type="org.eclipse.jem.internal.java:ArrayType" href="java:/#int[]"/>

+  </fields>

+  <fields name="ints2">

+    <eType xsi:type="org.eclipse.jem.internal.java:ArrayType" href="java:/#int[][]"/>

+  </fields>

+  <fields name="ints3">

+    <eType xsi:type="org.eclipse.jem.internal.java:ArrayType" href="java:/#int[][][]"/>

+  </fields>

+  <fields name="chars">

+    <eType xsi:type="org.eclipse.jem.internal.java:ArrayType" href="java:/#char[]"/>

+  </fields>

+  <fields name="floats">

+    <eType xsi:type="org.eclipse.jem.internal.java:ArrayType" href="java:/#float[]"/>

+  </fields>

+  <fields name="cools">

+    <eType xsi:type="org.eclipse.jem.internal.java:ArrayType" href="java:/#boolean[]"/>

+  </fields>

+  <fields name="doubles">

+    <eType xsi:type="org.eclipse.jem.internal.java:ArrayType" href="java:/#double[]"/>

+  </fields>

+  <fields name="longs">

+    <eType xsi:type="org.eclipse.jem.internal.java:ArrayType" href="java:/#long[]"/>

+  </fields>

+  <fields name="shorts">

+    <eType xsi:type="org.eclipse.jem.internal.java:ArrayType" href="java:/#short[]"/>

+  </fields>

+  <fields name="bytes">

+    <eType xsi:type="org.eclipse.jem.internal.java:ArrayType" href="java:/#byte[]"/>

+  </fields>

+  <fields name="testString" final="true" static="true">

+    <eType xsi:type="org.eclipse.jem.internal.java:JavaClass" href="java:/java.lang#String"/>

+    <initializer source="&quot;testing&quot;" name="testString_block"/>

+  </fields>

+  <methods name="doAllPrimitives">

+    <eType xsi:type="org.eclipse.jem.internal.java:JavaDataType" href="java:/#void"/>

+    <parameters name="arg0">

+      <eType xsi:type="org.eclipse.jem.internal.java:ArrayType" href="java:/#int[]"/>

+    </parameters>

+    <parameters name="arg1">

+      <eType xsi:type="org.eclipse.jem.internal.java:ArrayType" href="java:/#int[][]"/>

+    </parameters>

+    <parameters name="arg2">

+      <eType xsi:type="org.eclipse.jem.internal.java:ArrayType" href="java:/#int[][][]"/>

+    </parameters>

+    <parameters name="arg3">

+      <eType xsi:type="org.eclipse.jem.internal.java:ArrayType" href="java:/#char[]"/>

+    </parameters>

+    <parameters name="arg4">

+      <eType xsi:type="org.eclipse.jem.internal.java:ArrayType" href="java:/#float[]"/>

+    </parameters>

+    <parameters name="arg5">

+      <eType xsi:type="org.eclipse.jem.internal.java:ArrayType" href="java:/#boolean[]"/>

+    </parameters>

+    <parameters name="arg6">

+      <eType xsi:type="org.eclipse.jem.internal.java:ArrayType" href="java:/#double[]"/>

+    </parameters>

+    <parameters name="arg7">

+      <eType xsi:type="org.eclipse.jem.internal.java:ArrayType" href="java:/#long[]"/>

+    </parameters>

+    <parameters name="arg8">

+      <eType xsi:type="org.eclipse.jem.internal.java:ArrayType" href="java:/#short[]"/>

+    </parameters>

+    <parameters name="arg9">

+      <eType xsi:type="org.eclipse.jem.internal.java:ArrayType" href="java:/#byte[]"/>

+    </parameters>

+  </methods>

+  <methods name="doSomething">

+    <eType xsi:type="org.eclipse.jem.internal.java:JavaClass" href="java:/com.ibm.etools.java.stressSample#C"/>

+  </methods>

+  <methods name="getBytes">

+    <eType xsi:type="org.eclipse.jem.internal.java:ArrayType" href="java:/#byte[]"/>

+  </methods>

+  <methods name="getChar">

+    <eType xsi:type="org.eclipse.jem.internal.java:ArrayType" href="java:/#char[]"/>

+  </methods>

+  <methods name="getFloats">

+    <eType xsi:type="org.eclipse.jem.internal.java:ArrayType" href="java:/#float[]"/>

+  </methods>

+  <methods name="getInts">

+    <eType xsi:type="org.eclipse.jem.internal.java:ArrayType" href="java:/#int[]"/>

+  </methods>

+  <methods name="getLongs">

+    <eType xsi:type="org.eclipse.jem.internal.java:ArrayType" href="java:/#long[]"/>

+  </methods>

+  <methods name="getShorts">

+    <eType xsi:type="org.eclipse.jem.internal.java:ArrayType" href="java:/#short[]"/>

+  </methods>

+  <methods name="returnAs">

+    <eType xsi:type="org.eclipse.jem.internal.java:ArrayType" href="java:/com.ibm.etools.java.stressSample#A[]"/>

+    <parameters name="arg0">

+      <eType xsi:type="org.eclipse.jem.internal.java:ArrayType" href="java:/com.ibm.etools.java.stressSample#C[]"/>

+    </parameters>

+  </methods>

+  <methods name="A" constructor="true"/>

+</org.eclipse.jem.internal.java:JavaClass>

diff --git a/tests/org.eclipse.jst.j2ee.core.tests/plugin.properties b/tests/org.eclipse.jst.j2ee.core.tests/plugin.properties
new file mode 100644
index 0000000..9f0e051
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/plugin.properties
@@ -0,0 +1,13 @@
+###############################################################################
+# Copyright (c) 2005, 2007 IBM 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:
+#     IBM Corporation - initial API and implementation
+###############################################################################
+# properties file for org.eclipse.jst.j2ee.core.tests
+Bundle-Name.0 = J2EE Core Tests Component
+Bundle-Vendor.0 = Eclipse Web Tools Platform
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/pom.xml b/tests/org.eclipse.jst.j2ee.core.tests/pom.xml
new file mode 100644
index 0000000..5e03e69
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/pom.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Copyright (c) 2012, 2013 Eclipse Foundation and others.
+  All rights reserved. This program and the accompanying materials
+  are made available under the terms of the Eclipse Distribution License v1.0
+  which accompanies this distribution, and is available at
+  http://www.eclipse.org/org/documents/edl-v10.php
+ 
+  Contributors:
+    Thanh Ha (Eclipse Foundation) - initial implementation
+-->
+
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.eclipse.webtools.javaee</groupId>
+    <artifactId>javaee.tests</artifactId>
+    <version>3.6.0-SNAPSHOT</version>
+  </parent>
+
+  <groupId>org.eclipse.webtools.javaee</groupId>
+  <artifactId>org.eclipse.jst.j2ee.core.tests</artifactId>
+  <version>1.1.500-SNAPSHOT</version>
+  <packaging>eclipse-plugin</packaging>
+  
+  <!-- Do not sign inner jars, see bug 274743 - Some unit tests are sensitive to details of build -->
+  <profiles>
+   <profile>
+     <id>eclipse-sign</id>
+     <build>
+       <plugins>
+         <plugin>
+           <groupId>org.eclipse.cbi.maven.plugins</groupId>
+           <artifactId>eclipse-jarsigner-plugin</artifactId>
+           <version>${cbi-plugins.version}</version>
+           <executions>
+             <execution>
+               <id>sign</id>
+               <phase>verify</phase>
+               <goals>
+                 <goal>sign</goal>
+               </goals>
+               <configuration>
+                 <excludeInnerJars>true</excludeInnerJars>
+               </configuration>
+             </execution>
+           </executions>
+         </plugin>
+       </plugins>
+     </build>
+   </profile>
+ </profiles>
+ 
+</project>
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/test.xml b/tests/org.eclipse.jst.j2ee.core.tests/test.xml
new file mode 100644
index 0000000..79f2b20
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/test.xml
@@ -0,0 +1,58 @@
+<?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.j2ee.core.tests"/>
+  <property name="library-file" value="${eclipse-home}/plugins/org.eclipse.test_3.1.0/library.xml"/>
+  <property name="extraVMargs" value="-Xmx700M"/>
+
+  <!-- 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*.xml"/>
+    </delete>
+  </target>
+
+  <!-- This target defines the tests that need to be run. -->
+  <target name="suite">
+    <property name="jst-folder" value="${eclipse-home}/jst_folder"/>
+    <delete dir="${jst-folder}" quiet="true"/>
+    <ant target="core-test" antfile="${library-file}" dir="${eclipse-home}">
+      <property name="data-dir" value="${jst-folder}"/>
+      <property name="plugin-name" value="${plugin-name}"/>
+      <property name="classname" value="org.eclipse.jst.j2ee.core.tests.bvt.AutomatedBVT" />
+   	  <property name="plugin-path" value="${eclipse-home}/plugins/${plugin-name}"/>
+   	  <property name="extraVMargs" value="${extraVMargs}"/>
+    </ant>
+    <ant target="core-test" antfile="${library-file}" dir="${eclipse-home}">
+      <property name="data-dir" value="${jst-folder}"/>
+      <property name="plugin-name" value="${plugin-name}"/>
+      <property name="classname" value="org.eclipse.jst.j2ee.core.api.test.AutomatedAPIBVT" />
+   	  <property name="plugin-path" value="${eclipse-home}/plugins/${plugin-name}"/>
+   	  <property name="extraVMargs" value="${extraVMargs}"/>
+    </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*.xml"/>
+      <property name="output-file" value="${plugin-name}.xml"/>
+    </ant>
+  </target>
+</project>
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/testData/ejb/META-INF/MANIFEST.MF b/tests/org.eclipse.jst.j2ee.core.tests/testData/ejb/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..1041650
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/testData/ejb/META-INF/MANIFEST.MF
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0
+Ant-Version: Apache Ant 1.5.4 
+Created-By: 1.3.0 (IBM Corporation)
+Main-Class: null
+
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/testData/ejb/META-INF/Table.ddl b/tests/org.eclipse.jst.j2ee.core.tests/testData/ejb/META-INF/Table.ddl
new file mode 100644
index 0000000..5780861
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/testData/ejb/META-INF/Table.ddl
@@ -0,0 +1,13 @@
+

+

+-- Generated by Relational Schema Center on Fri Mar 12 14:32:14 CST 2004

+

+

+CREATE TABLE ACCOUNT

+  (ACCOUNTID VARCHAR(250) NOT NULL,

+   TYPE1 INTEGER NOT NULL,

+   BALANCE DOUBLE PRECISION NOT NULL,

+   APR DOUBLE PRECISION NOT NULL);

+

+ALTER TABLE ACCOUNT

+  ADD CONSTRAINT PK_ACCOUNT PRIMARY KEY (ACCOUNTID);
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/testData/ejb/META-INF/backends/CLOUDSCAPE_V50_1/Map.mapxmi b/tests/org.eclipse.jst.j2ee.core.tests/testData/ejb/META-INF/backends/CLOUDSCAPE_V50_1/Map.mapxmi
new file mode 100644
index 0000000..a19a98e
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/testData/ejb/META-INF/backends/CLOUDSCAPE_V50_1/Map.mapxmi
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<ejbrdbmapping:EjbRdbDocumentRoot xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:RDBSchema="RDBSchema.xmi" xmlns:ejb="ejb.xmi" xmlns:ejbrdbmapping="ejbrdbmapping.xmi" xmlns:Mapping="Mapping.xmi" xmi:id="EjbRdbDocumentRoot_1079123516907" topToBottom="true" commandStack="&lt;collection>&lt;command-creation-record>&lt;class name=&quot;com.ibm.etools.ejbrdbmapping.command.TopDownEjbJarCommand&quot;/>&lt;command-parameter>&lt;ref-object href=&quot;platform:/resource/b63748ba/ejbModule/META-INF/ejb-jar.xml#ejb-jar_ID&quot;/>&lt;null/>&lt;collection>&lt;string value=&quot;TopDownDB&quot;/>&lt;null/>&lt;int value=&quot;18&quot;/>&lt;hashtable>&lt;/hashtable>&lt;hashtable>&lt;/hashtable>&lt;boolean value=&quot;false&quot;/>&lt;boolean value=&quot;false&quot;/>&lt;/collection>&lt;null/>&lt;int value=&quot;-1&quot;/>&lt;/command-parameter>&lt;/command-creation-record>&lt;/collection>">

+  <helper xmi:type="ejbrdbmapping:RdbSchemaProperies" xmi:id="RdbSchemaProperies_1079123516907" primitivesDocument="CLOUDSCAPE_V50"/>

+  <nested xmi:type="ejbrdbmapping:RDBEjbMapper" xmi:id="RDBEjbMapper_1079123516907">

+    <helper xmi:type="ejbrdbmapping:PrimaryTableStrategy" xmi:id="PrimaryTableStrategy_1079123516907">

+      <table href="META-INF/backends/CLOUDSCAPE_V50_1/TopDownDB_NULLID_ACCOUNT.tblxmi#ACCOUNT"/>

+    </helper>

+    <nested xmi:type="ejbrdbmapping:RDBEjbFieldMapper" xmi:id="RDBEjbFieldMapper_1079123516907">

+      <inputs xmi:type="ejb:CMPAttribute" href="META-INF/ejb-jar.xml#Account_accountid"/>

+      <outputs xmi:type="RDBSchema:RDBColumn" href="META-INF/backends/CLOUDSCAPE_V50_1/TopDownDB_NULLID_ACCOUNT.tblxmi#ACCOUNTID"/>

+      <typeMapping href="JavatoCLOUDSCAPE_V50TypeMaps.xmi#String-VARCHAR"/>

+    </nested>

+    <nested xmi:type="ejbrdbmapping:RDBEjbFieldMapper" xmi:id="RDBEjbFieldMapper_1079123516908" optimistic="true">

+      <inputs xmi:type="ejb:CMPAttribute" href="META-INF/ejb-jar.xml#Account_type"/>

+      <outputs xmi:type="RDBSchema:RDBColumn" href="META-INF/backends/CLOUDSCAPE_V50_1/TopDownDB_NULLID_ACCOUNT.tblxmi#TYPE1"/>

+      <typeMapping href="JavatoCLOUDSCAPE_V50TypeMaps.xmi#int-INTEGER"/>

+    </nested>

+    <nested xmi:type="ejbrdbmapping:RDBEjbFieldMapper" xmi:id="RDBEjbFieldMapper_1079123516909" optimistic="true">

+      <inputs xmi:type="ejb:CMPAttribute" href="META-INF/ejb-jar.xml#Account_balance"/>

+      <outputs xmi:type="RDBSchema:RDBColumn" href="META-INF/backends/CLOUDSCAPE_V50_1/TopDownDB_NULLID_ACCOUNT.tblxmi#BALANCE"/>

+      <typeMapping href="JavatoCLOUDSCAPE_V50TypeMaps.xmi#double-DOUBLE"/>

+    </nested>

+    <nested xmi:type="ejbrdbmapping:RDBEjbFieldMapper" xmi:id="RDBEjbFieldMapper_1079123516910" optimistic="true">

+      <inputs xmi:type="ejb:CMPAttribute" href="META-INF/ejb-jar.xml#Account_apr"/>

+      <outputs xmi:type="RDBSchema:RDBColumn" href="META-INF/backends/CLOUDSCAPE_V50_1/TopDownDB_NULLID_ACCOUNT.tblxmi#APR"/>

+      <typeMapping href="JavatoCLOUDSCAPE_V50TypeMaps.xmi#double-DOUBLE"/>

+    </nested>

+    <inputs xmi:type="ejb:ContainerManagedEntity" href="META-INF/ejb-jar.xml#ContainerManagedEntity_1"/>

+    <outputs xmi:type="RDBSchema:RDBTable" href="META-INF/backends/CLOUDSCAPE_V50_1/TopDownDB_NULLID_ACCOUNT.tblxmi#ACCOUNT"/>

+  </nested>

+  <inputs xmi:type="ejb:EJBJar" href="META-INF/ejb-jar.xml#ejb-jar_ID"/>

+  <outputs xmi:type="RDBSchema:RDBDatabase" href="META-INF/backends/CLOUDSCAPE_V50_1/TopDownDB.dbxmi#TopDownDB"/>

+  <typeMapping xmi:type="Mapping:MappingRoot" href="JavatoCLOUDSCAPE_V50TypeMaps.xmi#Java_to_CLOUDSCAPE_V50_TypeMaps"/>

+</ejbrdbmapping:EjbRdbDocumentRoot>

diff --git a/tests/org.eclipse.jst.j2ee.core.tests/testData/ejb/META-INF/backends/CLOUDSCAPE_V50_1/Table.ddl b/tests/org.eclipse.jst.j2ee.core.tests/testData/ejb/META-INF/backends/CLOUDSCAPE_V50_1/Table.ddl
new file mode 100644
index 0000000..5780861
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/testData/ejb/META-INF/backends/CLOUDSCAPE_V50_1/Table.ddl
@@ -0,0 +1,13 @@
+

+

+-- Generated by Relational Schema Center on Fri Mar 12 14:32:14 CST 2004

+

+

+CREATE TABLE ACCOUNT

+  (ACCOUNTID VARCHAR(250) NOT NULL,

+   TYPE1 INTEGER NOT NULL,

+   BALANCE DOUBLE PRECISION NOT NULL,

+   APR DOUBLE PRECISION NOT NULL);

+

+ALTER TABLE ACCOUNT

+  ADD CONSTRAINT PK_ACCOUNT PRIMARY KEY (ACCOUNTID);
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/testData/ejb/META-INF/backends/CLOUDSCAPE_V50_1/TopDownDB.dbxmi b/tests/org.eclipse.jst.j2ee.core.tests/testData/ejb/META-INF/backends/CLOUDSCAPE_V50_1/TopDownDB.dbxmi
new file mode 100644
index 0000000..914bdee
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/testData/ejb/META-INF/backends/CLOUDSCAPE_V50_1/TopDownDB.dbxmi
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<RDBSchema:RDBDatabase xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:RDBSchema="RDBSchema.xmi" xmi:id="TopDownDB" name="TopDownDB">

+  <schemata href="META-INF/backends/CLOUDSCAPE_V50_1/TopDownDB_NULLID.schxmi#NULLID"/>

+  <tableGroup xmi:type="RDBSchema:RDBTable" href="META-INF/backends/CLOUDSCAPE_V50_1/TopDownDB_NULLID_ACCOUNT.tblxmi#ACCOUNT"/>

+  <domain href="CLOUDSCAPE_V50_Domain.xmi#SQLVendor_1"/>

+</RDBSchema:RDBDatabase>

diff --git a/tests/org.eclipse.jst.j2ee.core.tests/testData/ejb/META-INF/backends/CLOUDSCAPE_V50_1/TopDownDB_NULLID.schxmi b/tests/org.eclipse.jst.j2ee.core.tests/testData/ejb/META-INF/backends/CLOUDSCAPE_V50_1/TopDownDB_NULLID.schxmi
new file mode 100644
index 0000000..ca20a40
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/testData/ejb/META-INF/backends/CLOUDSCAPE_V50_1/TopDownDB_NULLID.schxmi
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<RDBSchema:RDBSchema xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:RDBSchema="RDBSchema.xmi" xmi:id="NULLID" name="NULLID">

+  <database href="META-INF/backends/CLOUDSCAPE_V50_1/TopDownDB.dbxmi#TopDownDB"/>

+  <tables xmi:type="RDBSchema:RDBTable" href="META-INF/backends/CLOUDSCAPE_V50_1/TopDownDB_NULLID_ACCOUNT.tblxmi#ACCOUNT"/>

+</RDBSchema:RDBSchema>

diff --git a/tests/org.eclipse.jst.j2ee.core.tests/testData/ejb/META-INF/backends/CLOUDSCAPE_V50_1/TopDownDB_NULLID_ACCOUNT.tblxmi b/tests/org.eclipse.jst.j2ee.core.tests/testData/ejb/META-INF/backends/CLOUDSCAPE_V50_1/TopDownDB_NULLID_ACCOUNT.tblxmi
new file mode 100644
index 0000000..adf1d75
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/testData/ejb/META-INF/backends/CLOUDSCAPE_V50_1/TopDownDB_NULLID_ACCOUNT.tblxmi
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<RDBSchema:RDBTable xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:RDBSchema="RDBSchema.xmi" xmi:id="ACCOUNT" name="ACCOUNT" primaryKey="PK_ACCOUNT">

+  <database href="META-INF/backends/CLOUDSCAPE_V50_1/TopDownDB.dbxmi#TopDownDB"/>

+  <schema href="META-INF/backends/CLOUDSCAPE_V50_1/TopDownDB_NULLID.schxmi#NULLID"/>

+  <columns xmi:type="RDBSchema:RDBColumn" xmi:id="ACCOUNTID" name="ACCOUNTID">

+    <type xmi:type="RDBSchema:SQLCharacterStringType" xmi:id="SQLCharacterStringType_1079123516977" length="250">

+      <originatingType xmi:type="RDBSchema:SQLCharacterStringType" href="JavatoCLOUDSCAPE_V50TypeMaps.xmi#SQLCharacterStringType_250"/>

+    </type>

+  </columns>

+  <columns xmi:type="RDBSchema:RDBColumn" xmi:id="TYPE1" name="TYPE1">

+    <type xmi:type="RDBSchema:SQLExactNumeric" xmi:id="SQLExactNumeric_1079123516977">

+      <originatingType xmi:type="RDBSchema:SQLExactNumeric" href="CLOUDSCAPE_V50_Primitives.xmi#SQLExactNumeric_1"/>

+    </type>

+  </columns>

+  <columns xmi:type="RDBSchema:RDBColumn" xmi:id="BALANCE" name="BALANCE">

+    <type xmi:type="RDBSchema:SQLApproximateNumeric" xmi:id="SQLApproximateNumeric_1079123516977">

+      <originatingType xmi:type="RDBSchema:SQLApproximateNumeric" href="CLOUDSCAPE_V50_Primitives.xmi#SQLApproximateNumeric_1"/>

+    </type>

+  </columns>

+  <columns xmi:type="RDBSchema:RDBColumn" xmi:id="APR" name="APR">

+    <type xmi:type="RDBSchema:SQLApproximateNumeric" xmi:id="SQLApproximateNumeric_1079123516978">

+      <originatingType xmi:type="RDBSchema:SQLApproximateNumeric" href="CLOUDSCAPE_V50_Primitives.xmi#SQLApproximateNumeric_1"/>

+    </type>

+  </columns>

+  <namedGroup xmi:type="RDBSchema:SQLReference" xmi:id="PK_ACCOUNT" name="PK_ACCOUNT" members="ACCOUNTID" constraint="SQLConstraint_1079123516977"/>

+  <constraints xmi:id="SQLConstraint_1079123516977" name="PK_ACCOUNT" type="PRIMARYKEY" primaryKey="PK_ACCOUNT"/>

+</RDBSchema:RDBTable>

diff --git a/tests/org.eclipse.jst.j2ee.core.tests/testData/ejb/META-INF/backends/CLOUDSCAPE_V50_1/ibm_pmbab.properties b/tests/org.eclipse.jst.j2ee.core.tests/testData/ejb/META-INF/backends/CLOUDSCAPE_V50_1/ibm_pmbab.properties
new file mode 100644
index 0000000..d6f62d3
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/testData/ejb/META-INF/backends/CLOUDSCAPE_V50_1/ibm_pmbab.properties
@@ -0,0 +1,2 @@
+#Fri Mar 12 14:32:01 CST 2004
+Account=com.ibm.websphere.samples.appprofile.accountmanagementejb.websphere_deploy.CLOUDSCAPE_V50_1.AccountBeanAdaptorBinding_0c182135
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/testData/ejb/META-INF/ejb-jar.xml b/tests/org.eclipse.jst.j2ee.core.tests/testData/ejb/META-INF/ejb-jar.xml
new file mode 100644
index 0000000..9d9860f
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/testData/ejb/META-INF/ejb-jar.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd">
+
+   <ejb-jar id="ejb-jar_ID">
+      <display-name>AppProfileSampleEJBModule</display-name>
+      <enterprise-beans>
+         <entity id="ContainerManagedEntity_1">
+            <ejb-name>Account</ejb-name>
+            <home>com.ibm.websphere.samples.appprofile.accountmanagementejb.AccountHome</home>
+            <remote>com.ibm.websphere.samples.appprofile.accountmanagementejb.Account</remote>
+            <local-home>com.ibm.websphere.samples.appprofile.accountmanagementejb.LocalAccountHome</local-home>
+            <local>com.ibm.websphere.samples.appprofile.accountmanagementejb.LocalAccount</local>
+            <ejb-class>com.ibm.websphere.samples.appprofile.accountmanagementejb.AccountBean</ejb-class>
+            <persistence-type>Container</persistence-type>
+            <prim-key-class>java.lang.String</prim-key-class>
+            <reentrant>False</reentrant>
+            <cmp-version>2.x</cmp-version>
+            <abstract-schema-name>Account</abstract-schema-name>
+            <cmp-field id="Account_accountid">
+               <field-name>accountid</field-name>
+            </cmp-field>
+            <cmp-field id="Account_type">
+               <field-name>type</field-name>
+            </cmp-field>
+            <cmp-field id="Account_balance">
+               <field-name>balance</field-name>
+            </cmp-field>
+            <cmp-field id="Account_apr">
+               <field-name>apr</field-name>
+            </cmp-field>
+            <primkey-field>accountid</primkey-field>
+            <query id="Query_1">
+               <query-method id="QueryMethod_1">
+                  <method-name>findLargeAccounts</method-name>
+                  <method-params>
+                     <method-param>double</method-param>
+                  </method-params>
+               </query-method>
+               <ejb-ql>SELECT OBJECT(a) FROM Account a WHERE a.balance >= ?1</ejb-ql>
+            </query>
+            <query id="Query_2">
+               <query-method id="QueryMethod_2">
+                  <method-name>findByAccountId</method-name>
+                  <method-params>
+                     <method-param>java.lang.String</method-param>
+                  </method-params>
+               </query-method>
+               <ejb-ql>SELECT OBJECT(a) FROM Account a WHERE a.accountid  = ?1</ejb-ql>
+            </query>
+            <query id="Query_3">
+               <query-method id="QueryMethod_3">
+                  <method-name>findAllAccounts</method-name>
+                  <method-params>
+                     <method-param></method-param>
+                  </method-params>
+               </query-method>
+               <ejb-ql>SELECT OBJECT(a) FROM Account a</ejb-ql>
+            </query>
+         </entity>
+         <session id="Session_1">
+            <display-name>AccountManager</display-name>
+            <ejb-name>AccountManager</ejb-name>
+            <home>com.ibm.websphere.samples.appprofile.accountmanagementejb.AccountManagerHome</home>
+            <remote>com.ibm.websphere.samples.appprofile.accountmanagementejb.AccountManager</remote>
+            <ejb-class>com.ibm.websphere.samples.appprofile.accountmanagementejb.AccountManagerBean</ejb-class>
+            <session-type>Stateless</session-type>
+            <transaction-type>Container</transaction-type>
+            <ejb-local-ref id="EJBLocalRef_1">
+               <ejb-ref-name>ejb/AppProfileSample-AccountHome</ejb-ref-name>
+               <ejb-ref-type>Entity</ejb-ref-type>
+               <local-home>com.ibm.websphere.samples.appprofile.accountmanagementejb.LocalAccountHome</local-home>
+               <local>com.ibm.websphere.samples.appprofile.accountmanagementejb.LocalAccount</local>
+               <ejb-link>Account</ejb-link>
+            </ejb-local-ref>
+         </session>
+      </enterprise-beans>
+   </ejb-jar>
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/testData/ejb/META-INF/ibm-ejb-jar-bnd.xmi b/tests/org.eclipse.jst.j2ee.core.tests/testData/ejb/META-INF/ibm-ejb-jar-bnd.xmi
new file mode 100644
index 0000000..d690d43
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/testData/ejb/META-INF/ibm-ejb-jar-bnd.xmi
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<ejbbnd:EJBJarBinding xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:ejbbnd="ejbbnd.xmi" xmlns:ejb="ejb.xmi" xmlns:common="common.xmi" xmi:id="ejb-jar_ID_Bnd" currentBackendId="CLOUDSCAPE_V50_1">

+  <ejbJar href="META-INF/ejb-jar.xml#ejb-jar_ID"/>

+  <ejbBindings xmi:id="ContainerManagedEntity_1_Bnd" jndiName="AppProfileSample-AccountHome">

+    <enterpriseBean xmi:type="ejb:ContainerManagedEntity" href="META-INF/ejb-jar.xml#ContainerManagedEntity_1"/>

+  </ejbBindings>

+  <ejbBindings xmi:id="EnterpriseBeanBinding_1" jndiName="AppProfileSample-AccountManagerHome">

+    <enterpriseBean xmi:type="ejb:Session" href="META-INF/ejb-jar.xml#Session_1"/>

+    <ejbRefBindings xmi:id="EjbRefBinding_1" jndiName="AppProfileSample-AccountHome">

+      <bindingEjbRef xmi:type="common:EJBLocalRef" href="META-INF/ejb-jar.xml#EJBLocalRef_1"/>

+    </ejbRefBindings>

+  </ejbBindings>

+  <defaultCMPConnectionFactory xmi:id="CMPConnectionFactoryBinding_2" jndiName="eis/jdbc/AppProfileSampleDB_CMP" resAuth="Per_Connection_Factory"/>

+</ejbbnd:EJBJarBinding>

diff --git a/tests/org.eclipse.jst.j2ee.core.tests/testData/ejb/META-INF/ibm-ejb-jar-ext-pme.xmi b/tests/org.eclipse.jst.j2ee.core.tests/testData/ejb/META-INF/ibm-ejb-jar-ext-pme.xmi
new file mode 100644
index 0000000..3eeecb1
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/testData/ejb/META-INF/ibm-ejb-jar-ext-pme.xmi
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<pmeext:PMEEJBJarExtension xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:appprofileejbext="http://www.ibm.com/websphere/appserver/schemas/5.0/appprofileejbext.xmi" xmlns:ejbext="ejbext.xmi" xmlns:ejb="ejb.xmi" xmlns:pmeext="http://www.ibm.com/websphere/appserver/schemas/5.0/pmeext.xmi" xmi:id="PMEEJBJarExtension_1">

+  <appProfileEJBJarExtension xmi:id="AppProfileEJBJarExtension_1">

+    <applicationProfiles xmi:id="EJBModuleProfile_1" name="Read-only" description="This profile will apply a read-only access-intent policy to the multifinder for the Account entity bean.">

+      <appliedAccessIntents xmi:id="AppliedAccessIntent_1072828753424" name="com.ibm.websphere.ejbquery.Default" description="All methods of the Account bean are set for read only." accessIntentName="wsPessimisticRead">

+        <methodElements xmi:id="MethodElement_1072828753424" type="Unspecified">

+          <enterpriseBean xmi:type="ejb:ContainerManagedEntity" href="META-INF/ejb-jar.xml#ContainerManagedEntity_1"/>

+        </methodElements>

+      </appliedAccessIntents>

+      <tasks xmi:id="Task_1071093415784" name="getLargeAccounts" description="This task will be used by AccountManager session bean for read-only intent."/>

+    </applicationProfiles>

+    <ejbJarExtension href="META-INF/ibm-ejb-jar-ext.xmi#ejb-jar_ID_Ext"/>

+    <definedAccessIntentPolicies xmi:id="DefinedAccessIntentPolicy_1" name="PessimisticUpdate - Increment 10" description="This is a custom policy that keeps all the attributes of wsPessimisiticUpdate except for collection increment, which is set to 10.">

+      <accessIntentEntries xmi:type="ejbext:PessimisticUpdate" xmi:id="PessimisticUpdate_1072824290817"/>

+      <accessIntentEntries xmi:type="ejbext:CollectionIncrement" xmi:id="CollectionIncrement_1072824290817" collectionIncrement="10"/>

+      <accessIntentEntries xmi:type="ejbext:ResourceManagerPreFetchIncrement" xmi:id="ResourceManagerPreFetchIncrement_1072824290817" preFetchIncrement="0"/>

+      <accessIntentEntries xmi:type="ejbext:TransactionScope" xmi:id="TransactionScope_1072824290817"/>

+    </definedAccessIntentPolicies>

+    <runAsTasks xmi:id="RunAsTask_2" name="getLargeAcounts">

+      <taskRunAsKind xmi:type="appprofileejbext:RunAsSpecifiedTask" xmi:id="RunAsSpecifiedTask_2">

+        <task xmi:id="Task_5" name="getLargeAccounts" description="for viewing account data only"/>

+      </taskRunAsKind>

+      <methodElements xmi:id="MethodElement_3" name="getLargeAccounts" parms="double " type="Remote">

+        <enterpriseBean xmi:type="ejb:Session" href="META-INF/ejb-jar.xml#Session_1"/>

+      </methodElements>

+    </runAsTasks>

+    <appProfileComponentExtensions xmi:id="AppProfileComponentExtension_1">

+      <componentExtension xmi:type="ejbext:SessionExtension" href="META-INF/ibm-ejb-jar-ext.xmi#SessionExtension_1"/>

+    </appProfileComponentExtensions>

+    <appProfileComponentExtensions xmi:id="AppProfileComponentExtension_2">

+      <componentExtension xmi:type="ejbext:ContainerManagedEntityExtension" href="META-INF/ibm-ejb-jar-ext.xmi#ContainerManagedEntity_1_Ext"/>

+    </appProfileComponentExtensions>

+  </appProfileEJBJarExtension>

+</pmeext:PMEEJBJarExtension>

diff --git a/tests/org.eclipse.jst.j2ee.core.tests/testData/ejb/META-INF/ibm-ejb-jar-ext.xmi b/tests/org.eclipse.jst.j2ee.core.tests/testData/ejb/META-INF/ibm-ejb-jar-ext.xmi
new file mode 100644
index 0000000..673264f
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/testData/ejb/META-INF/ibm-ejb-jar-ext.xmi
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<ejbext:EJBJarExtension xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:ejbext="ejbext.xmi" xmlns:ejb="ejb.xmi" xmi:id="ejb-jar_ID_Ext">

+  <ejbExtensions xmi:type="ejbext:ContainerManagedEntityExtension" xmi:id="ContainerManagedEntity_1_Ext" concurrencyControl="pessimistic">

+    <enterpriseBean xmi:type="ejb:ContainerManagedEntity" href="META-INF/ejb-jar.xml#ContainerManagedEntity_1"/>

+    <structure xmi:id="BeanStructure_1" inheritenceRoot="false"/>

+    <beanCache xmi:id="BeanCache_1" activateAt="TRANSACTION" loadAt="TRANSACTION"/>

+    <localTran xmi:id="LocalTran_1" boundary="BEAN_METHOD" unresolvedAction="ROLLBACK"/>

+    <dataCache xmi:id="DataCache_1" lifetimeInCache="0" lifetimeInCacheUsage="OFF"/>

+  </ejbExtensions>

+  <ejbExtensions xmi:type="ejbext:SessionExtension" xmi:id="SessionExtension_1" timeout="600">

+    <enterpriseBean xmi:type="ejb:Session" href="META-INF/ejb-jar.xml#Session_1"/>

+    <structure xmi:id="BeanStructure_2" inheritenceRoot="false"/>

+    <beanCache xmi:id="BeanCache_2" activateAt="ONCE"/>

+    <localTran xmi:id="LocalTran_2" boundary="BEAN_METHOD" unresolvedAction="ROLLBACK"/>

+  </ejbExtensions>

+  <ejbJar href="META-INF/ejb-jar.xml#ejb-jar_ID"/>

+  <appliedAccessIntents xmi:id="AppliedAccessIntent_1071093415744" name="com.ibm.websphere.ejbquery.Default" description="" accessIntentName="PessimisticUpdate - Increment 10">

+    <methodElements xmi:id="MethodElement_1071093415744" type="Unspecified">

+      <enterpriseBean xmi:type="ejb:ContainerManagedEntity" href="META-INF/ejb-jar.xml#ContainerManagedEntity_1"/>

+    </methodElements>

+  </appliedAccessIntents>

+</ejbext:EJBJarExtension>

diff --git a/tests/org.eclipse.jst.j2ee.core.tests/testData/no-sl/META-INF/MANIFEST.MF b/tests/org.eclipse.jst.j2ee.core.tests/testData/no-sl/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..59499bc
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/testData/no-sl/META-INF/MANIFEST.MF
@@ -0,0 +1,2 @@
+Manifest-Version: 1.0
+
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/testData/no-sl/META-INF/ejb-jar.xml b/tests/org.eclipse.jst.j2ee.core.tests/testData/no-sl/META-INF/ejb-jar.xml
new file mode 100644
index 0000000..2693c86
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/testData/no-sl/META-INF/ejb-jar.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ejb-jar id="ejb-jar_ID" version="2.1" 
+	xmlns="http://java.sun.com/xml/ns/j2ee" >
+	<display-name>
+	TestEJB</display-name>
+	<enterprise-beans>
+		<session id="T1">
+			<ejb-name>T1</ejb-name>
+			<home>ejbs.T1Home</home>
+			<remote>ejbs.T1</remote>
+			<ejb-class>ejbs.T1Bean</ejb-class>
+			<session-type>Stateless</session-type>
+			<transaction-type>Container</transaction-type>
+		</session>
+	</enterprise-beans>
+</ejb-jar>
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/testData/no-sl/ejbs/T1.class b/tests/org.eclipse.jst.j2ee.core.tests/testData/no-sl/ejbs/T1.class
new file mode 100644
index 0000000..cda4e08
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/testData/no-sl/ejbs/T1.class
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/testData/no-sl/ejbs/T1Bean.class b/tests/org.eclipse.jst.j2ee.core.tests/testData/no-sl/ejbs/T1Bean.class
new file mode 100644
index 0000000..51cb4f6
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/testData/no-sl/ejbs/T1Bean.class
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/testData/no-sl/ejbs/T1Home.class b/tests/org.eclipse.jst.j2ee.core.tests/testData/no-sl/ejbs/T1Home.class
new file mode 100644
index 0000000..a579832
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/testData/no-sl/ejbs/T1Home.class
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/testData/sl/META-INF/MANIFEST.MF b/tests/org.eclipse.jst.j2ee.core.tests/testData/sl/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..59499bc
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/testData/sl/META-INF/MANIFEST.MF
@@ -0,0 +1,2 @@
+Manifest-Version: 1.0
+
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/testData/sl/META-INF/ejb-jar.xml b/tests/org.eclipse.jst.j2ee.core.tests/testData/sl/META-INF/ejb-jar.xml
new file mode 100644
index 0000000..af37a03
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/testData/sl/META-INF/ejb-jar.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ejb-jar id="ejb-jar_ID" version="2.1" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd">
+	<display-name>
+	TestEJB</display-name>
+	<enterprise-beans>
+		<session id="T1">
+			<ejb-name>T1</ejb-name>
+			<home>ejbs.T1Home</home>
+			<remote>ejbs.T1</remote>
+			<ejb-class>ejbs.T1Bean</ejb-class>
+			<session-type>Stateless</session-type>
+			<transaction-type>Container</transaction-type>
+		</session>
+	</enterprise-beans>
+</ejb-jar>
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/testData/sl/ejbs/T1.class b/tests/org.eclipse.jst.j2ee.core.tests/testData/sl/ejbs/T1.class
new file mode 100644
index 0000000..cda4e08
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/testData/sl/ejbs/T1.class
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/testData/sl/ejbs/T1Bean.class b/tests/org.eclipse.jst.j2ee.core.tests/testData/sl/ejbs/T1Bean.class
new file mode 100644
index 0000000..51cb4f6
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/testData/sl/ejbs/T1Bean.class
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/testData/sl/ejbs/T1Home.class b/tests/org.eclipse.jst.j2ee.core.tests/testData/sl/ejbs/T1Home.class
new file mode 100644
index 0000000..a579832
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/testData/sl/ejbs/T1Home.class
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/testData/webservices/META-INF/AnnuityServices_mapping.xml b/tests/org.eclipse.jst.j2ee.core.tests/testData/webservices/META-INF/AnnuityServices_mapping.xml
new file mode 100644
index 0000000..e2fdcbd
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/testData/webservices/META-INF/AnnuityServices_mapping.xml
@@ -0,0 +1,461 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<java-wsdl-mapping xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.1" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://www.ibm.com/webservices/xsd/j2ee_jaxrpc_mapping_1_1.xsd">
+    <package-mapping>
+        <package-type>com.ibm.wssvt.tc.pli.data</package-type>
+        <namespaceURI>http://data.pli.tc.wssvt.ibm.com</namespaceURI>
+    </package-mapping>
+    <package-mapping>
+        <package-type>com.ibm.wssvt.acme.annuity.ws</package-type>
+        <namespaceURI>http://ws.annuity.acme.wssvt.ibm.com</namespaceURI>
+    </package-mapping>
+    <java-xml-type-mapping>
+        <java-type>double</java-type>
+        <root-type-qname xmlns:rtq="http://www.w3.org/2001/XMLSchema">rtq:double</root-type-qname>
+        <qname-scope>simpleType</qname-scope>
+    </java-xml-type-mapping>
+    <java-xml-type-mapping>
+        <java-type>java.util.Vector</java-type>
+        <root-type-qname xmlns:rtq="http://xml.apache.org/xml-soap">rtq:Vector</root-type-qname>
+        <qname-scope>simpleType</qname-scope>
+    </java-xml-type-mapping>
+    <java-xml-type-mapping>
+        <java-type>java.lang.String</java-type>
+        <root-type-qname xmlns:rtq="http://www.w3.org/2001/XMLSchema">rtq:string</root-type-qname>
+        <qname-scope>simpleType</qname-scope>
+    </java-xml-type-mapping>
+    <java-xml-type-mapping>
+        <java-type>com.ibm.wssvt.tc.pli.data.WSAnnuityCompositeData</java-type>
+        <root-type-qname xmlns:rtq="http://data.pli.tc.wssvt.ibm.com">rtq:WSAnnuityCompositeData</root-type-qname>
+        <qname-scope>complexType</qname-scope>
+        <variable-mapping>
+            <java-variable-name>WSAnnuity    Data</java-variable-name>
+            <xml-element-name>WSAnnuity    Data</xml-element-name>
+        </variable-mapping>
+        <variable-mapping>
+            <java-variable-name>subAccounts</java-variable-name>
+            <xml-element-name>subAccounts</xml-element-name>
+        </variable-mapping>
+    </java-xml-type-mapping>
+    <java-xml-type-mapping>
+        <java-type>com.ibm.wssvt.tc.pli.data.WSAnnuityData</java-type>
+        <root-type-qname xmlns:rtq="http://data.pli.tc.wssvt.ibm.com">rtq:WSAnnuityData</root-type-qname>
+        <qname-scope>complexType</qname-scope>
+        <variable-mapping>
+            <java-variable-name>taxStatus</java-variable-name>
+            <xml-element-name>taxStatus</xml-element-name>
+        </variable-mapping>
+        <variable-mapping>
+            <java-variable-name>type</java-variable-name>
+            <xml-element-name>type</xml-element-name>
+        </variable-mapping>
+        <variable-mapping>
+            <java-variable-name>amount</java-variable-name>
+            <xml-element-name>amount</xml-element-name>
+        </variable-mapping>
+        <variable-mapping>
+            <java-variable-name>endDate</java-variable-name>
+            <xml-element-name>endDate</xml-element-name>
+        </variable-mapping>
+        <variable-mapping>
+            <java-variable-name>custNumber</java-variable-name>
+            <xml-element-name>custNumber</xml-element-name>
+        </variable-mapping>
+        <variable-mapping>
+            <java-variable-name>custName</java-variable-name>
+            <xml-element-name>custName</xml-element-name>
+        </variable-mapping>
+        <variable-mapping>
+            <java-variable-name>custSSNum</java-variable-name>
+            <xml-element-name>custSSNum</xml-element-name>
+        </variable-mapping>
+        <variable-mapping>
+            <java-variable-name>EMail</java-variable-name>
+            <xml-element-name>EMail</xml-element-name>
+        </variable-mapping>
+        <variable-mapping>
+            <java-variable-name>annuityNo</java-variable-name>
+            <xml-element-name>annuityNo</xml-element-name>
+        </variable-mapping>
+        <variable-mapping>
+            <java-variable-name>premium</java-variable-name>
+            <xml-element-name>premium</xml-element-name>
+        </variable-mapping>
+        <variable-mapping>
+            <java-variable-name>beginDate</java-variable-name>
+            <xml-element-name>beginDate</xml-element-name>
+        </variable-mapping>
+        <variable-mapping>
+            <java-variable-name>status</java-variable-name>
+            <xml-element-name>status</xml-element-name>
+        </variable-mapping>
+        <variable-mapping>
+            <java-variable-name>fixedPeriod</java-variable-name>
+            <xml-element-name>fixedPeriod</xml-element-name>
+        </variable-mapping>
+        <variable-mapping>
+            <java-variable-name>fixedAmount</java-variable-name>
+            <xml-element-name>fixedAmount</xml-element-name>
+        </variable-mapping>
+        <variable-mapping>
+            <java-variable-name>life</java-variable-name>
+            <xml-element-name>life</xml-element-name>
+        </variable-mapping>
+        <variable-mapping>
+            <java-variable-name>lifeWithPeriod</java-variable-name>
+            <xml-element-name>lifeWithPeriod</xml-element-name>
+        </variable-mapping>
+        <variable-mapping>
+            <java-variable-name>fixedPercent</java-variable-name>
+            <xml-element-name>fixedPercent</xml-element-name>
+        </variable-mapping>
+        <variable-mapping>
+            <java-variable-name>actualPercent</java-variable-name>
+            <xml-element-name>actualPercent</xml-element-name>
+        </variable-mapping>
+        <variable-mapping>
+            <java-variable-name>benefitOptions</java-variable-name>
+            <xml-element-name>benefitOptions</xml-element-name>
+        </variable-mapping>
+        <variable-mapping>
+            <java-variable-name>premiumSched</java-variable-name>
+            <xml-element-name>premiumSched</xml-element-name>
+        </variable-mapping>
+        <variable-mapping>
+            <java-variable-name>investCategory</java-variable-name>
+            <xml-element-name>investCategory</xml-element-name>
+        </variable-mapping>
+        <variable-mapping>
+            <java-variable-name>payoutOptions</java-variable-name>
+            <xml-element-name>payoutOptions</xml-element-name>
+        </variable-mapping>
+        <variable-mapping>
+            <java-variable-name>guarPayout</java-variable-name>
+            <xml-element-name>guarPayout</xml-element-name>
+        </variable-mapping>
+        <variable-mapping>
+            <java-variable-name>numSubAccts</java-variable-name>
+            <xml-element-name>numSubAccts</xml-element-name>
+        </variable-mapping>
+        <variable-mapping>
+            <java-variable-name>extraCredits</java-variable-name>
+            <xml-element-name>extraCredits</xml-element-name>
+        </variable-mapping>
+        <variable-mapping>
+            <java-variable-name>cellNodeServerName</java-variable-name>
+            <xml-element-name>cellNodeServerName</xml-element-name>
+        </variable-mapping>
+        <variable-mapping>
+            <java-variable-name>clientId</java-variable-name>
+            <xml-element-name>clientId</xml-element-name>
+        </variable-mapping>
+    </java-xml-type-mapping>
+    <java-xml-type-mapping>
+        <java-type>int</java-type>
+        <root-type-qname xmlns:rtq="http://www.w3.org/2001/XMLSchema">rtq:int</root-type-qname>
+        <qname-scope>simpleType</qname-scope>
+    </java-xml-type-mapping>
+    <java-xml-type-mapping>
+        <java-type>java.util.Calendar</java-type>
+        <root-type-qname xmlns:rtq="http://www.w3.org/2001/XMLSchema">rtq:dateTime</root-type-qname>
+        <qname-scope>simpleType</qname-scope>
+    </java-xml-type-mapping>
+    <java-xml-type-mapping>
+        <java-type>com.ibm.wssvt.tc.pli.data.SubAcctData[]</java-type>
+        <anonymous-type-qname>http://data.pli.tc.wssvt.ibm.com:SubAcctData[0,unbounded]</anonymous-type-qname>
+        <qname-scope>complexType</qname-scope>
+    </java-xml-type-mapping>
+    <java-xml-type-mapping>
+        <java-type>com.ibm.wssvt.tc.pli.data.SubAcctData</java-type>
+        <root-type-qname xmlns:rtq="http://data.pli.tc.wssvt.ibm.com">rtq:SubAcctData</root-type-qname>
+        <qname-scope>complexType</qname-scope>
+        <variable-mapping>
+            <java-variable-name>type</java-variable-name>
+            <xml-element-name>type</xml-element-name>
+        </variable-mapping>
+        <variable-mapping>
+            <java-variable-name>value</java-variable-name>
+            <xml-element-name>value</xml-element-name>
+        </variable-mapping>
+        <variable-mapping>
+            <java-variable-name>annuityId</java-variable-name>
+            <xml-element-name>annuityId</xml-element-name>
+        </variable-mapping>
+        <variable-mapping>
+            <java-variable-name>id</java-variable-name>
+            <xml-element-name>id</xml-element-name>
+        </variable-mapping>
+        <variable-mapping>
+            <java-variable-name>name</java-variable-name>
+            <xml-element-name>name</xml-element-name>
+        </variable-mapping>
+        <variable-mapping>
+            <java-variable-name>cellNodeServerName</java-variable-name>
+            <xml-element-name>cellNodeServerName</xml-element-name>
+        </variable-mapping>
+        <variable-mapping>
+            <java-variable-name>clientId</java-variable-name>
+            <xml-element-name>clientId</xml-element-name>
+        </variable-mapping>
+    </java-xml-type-mapping>
+    <java-xml-type-mapping>
+        <java-type>boolean</java-type>
+        <root-type-qname xmlns:rtq="http://www.w3.org/2001/XMLSchema">rtq:boolean</root-type-qname>
+        <qname-scope>simpleType</qname-scope>
+    </java-xml-type-mapping>
+    <java-xml-type-mapping>
+        <java-type>com.ibm.wssvt.tc.pli.data.SubAcctData[]</java-type>
+        <root-type-qname xmlns:rtq="http://ws.annuity.acme.wssvt.ibm.com">rtq:ArrayOf_tns2_nillable_SubAcctData</root-type-qname>
+        <qname-scope>complexType</qname-scope>
+        <variable-mapping>
+            <java-variable-name>subAcctData</java-variable-name>
+            <xml-element-name>SubAcctData</xml-element-name>
+        </variable-mapping>
+    </java-xml-type-mapping>
+    <java-xml-type-mapping>
+        <java-type>com.ibm.wssvt.tc.pli.data.SubAcctData[]</java-type>
+        <anonymous-type-qname>http://ws.annuity.acme.wssvt.ibm.com:ArrayOf_tns2_nillable_SubAcctData&gt;SubAcctData[0,unbounded]</anonymous-type-qname>
+        <qname-scope>complexType</qname-scope>
+    </java-xml-type-mapping>
+    <java-xml-type-mapping>
+        <java-type>java.lang.Object[]</java-type>
+        <anonymous-type-qname>http://xml.apache.org/xml-soap:Vector&gt;item[0,unbounded]</anonymous-type-qname>
+        <qname-scope>complexType</qname-scope>
+    </java-xml-type-mapping>
+    <service-interface-mapping>
+        <service-interface>com.ibm.wssvt.acme.annuity.ws.WSTAnnuityService</service-interface>
+        <wsdl-service-name xmlns:sim="http://ws.annuity.acme.wssvt.ibm.com">sim:WSTAnnuityService</wsdl-service-name>
+        <port-mapping>
+            <port-name>WSTAnnuityService</port-name>
+            <java-port-name>WSTAnnuityService</java-port-name>
+        </port-mapping>
+    </service-interface-mapping>
+    <service-endpoint-interface-mapping>
+        <service-endpoint-interface>com.ibm.wssvt.acme.annuity.ws.AnnuityServicePortType</service-endpoint-interface>
+        <wsdl-port-type xmlns:seimwpt="http://ws.annuity.acme.wssvt.ibm.com">seimwpt:AnnuityServicePortType</wsdl-port-type>
+        <wsdl-binding xmlns:seimwb="http://ws.annuity.acme.wssvt.ibm.com">seimwb:AnnuityServiceBinding</wsdl-binding>
+        <service-endpoint-method-mapping>
+            <java-method-name>wsListAnnuityByHolder</java-method-name>
+            <wsdl-operation>wsListAnnuityByHolder</wsdl-operation>
+            <wrapped-element></wrapped-element>
+            <method-param-parts-mapping>
+                <param-position>0</param-position>
+                <param-type>java.lang.String</param-type>
+                <wsdl-message-mapping>
+                    <wsdl-message xmlns:mppm="http://ws.annuity.acme.wssvt.ibm.com">mppm:wsListAnnuityByHolderRequest</wsdl-message>
+                    <wsdl-message-part-name>holderSSN</wsdl-message-part-name>
+                    <parameter-mode>IN</parameter-mode>
+                </wsdl-message-mapping>
+            </method-param-parts-mapping>
+            <wsdl-return-value-mapping>
+                <method-return-value>java.util.Vector</method-return-value>
+                <wsdl-message xmlns:wrvm="http://ws.annuity.acme.wssvt.ibm.com">wrvm:wsListAnnuityByHolderResponse</wsdl-message>
+                <wsdl-message-part-name>wsListAnnuityByHolderReturn</wsdl-message-part-name>
+            </wsdl-return-value-mapping>
+        </service-endpoint-method-mapping>
+        <service-endpoint-method-mapping>
+            <java-method-name>wsAddSubAccounts</java-method-name>
+            <wsdl-operation>wsAddSubAccounts</wsdl-operation>
+            <wrapped-element></wrapped-element>
+            <method-param-parts-mapping>
+                <param-position>0</param-position>
+                <param-type>com.ibm.wssvt.tc.pli.data.WSAnnuityCompositeData</param-type>
+                <wsdl-message-mapping>
+                    <wsdl-message xmlns:mppm="http://ws.annuity.acme.wssvt.ibm.com">mppm:wsAddSubAccountsRequest</wsdl-message>
+                    <wsdl-message-part-name>aCD</wsdl-message-part-name>
+                    <parameter-mode>IN</parameter-mode>
+                </wsdl-message-mapping>
+            </method-param-parts-mapping>
+            <method-param-parts-mapping>
+                <param-position>1</param-position>
+                <param-type>com.ibm.wssvt.tc.pli.data.SubAcctData[]</param-type>
+                <wsdl-message-mapping>
+                    <wsdl-message xmlns:mppm="http://ws.annuity.acme.wssvt.ibm.com">mppm:wsAddSubAccountsRequest</wsdl-message>
+                    <wsdl-message-part-name>sAD</wsdl-message-part-name>
+                    <parameter-mode>IN</parameter-mode>
+                </wsdl-message-mapping>
+            </method-param-parts-mapping>
+            <wsdl-return-value-mapping>
+                <method-return-value>com.ibm.wssvt.tc.pli.data.WSAnnuityCompositeData</method-return-value>
+                <wsdl-message xmlns:wrvm="http://ws.annuity.acme.wssvt.ibm.com">wrvm:wsAddSubAccountsResponse</wsdl-message>
+                <wsdl-message-part-name>wsAddSubAccountsReturn</wsdl-message-part-name>
+            </wsdl-return-value-mapping>
+        </service-endpoint-method-mapping>
+        <service-endpoint-method-mapping>
+            <java-method-name>wsCreateAnnuity</java-method-name>
+            <wsdl-operation>wsCreateAnnuity</wsdl-operation>
+            <wrapped-element></wrapped-element>
+            <method-param-parts-mapping>
+                <param-position>0</param-position>
+                <param-type>com.ibm.wssvt.tc.pli.data.WSAnnuityCompositeData</param-type>
+                <wsdl-message-mapping>
+                    <wsdl-message xmlns:mppm="http://ws.annuity.acme.wssvt.ibm.com">mppm:wsCreateAnnuityRequest</wsdl-message>
+                    <wsdl-message-part-name>aCD</wsdl-message-part-name>
+                    <parameter-mode>IN</parameter-mode>
+                </wsdl-message-mapping>
+            </method-param-parts-mapping>
+            <wsdl-return-value-mapping>
+                <method-return-value>com.ibm.wssvt.tc.pli.data.WSAnnuityCompositeData</method-return-value>
+                <wsdl-message xmlns:wrvm="http://ws.annuity.acme.wssvt.ibm.com">wrvm:wsCreateAnnuityResponse</wsdl-message>
+                <wsdl-message-part-name>wsCreateAnnuityReturn</wsdl-message-part-name>
+            </wsdl-return-value-mapping>
+        </service-endpoint-method-mapping>
+    </service-endpoint-interface-mapping>
+    <service-interface-mapping>
+        <service-interface>com.ibm.wssvt.acme.annuity.ws.AnnuityService</service-interface>
+        <wsdl-service-name xmlns:sim="http://ws.annuity.acme.wssvt.ibm.com">sim:AnnuityService</wsdl-service-name>
+        <port-mapping>
+            <port-name>AnnuityService</port-name>
+            <java-port-name>AnnuityService</java-port-name>
+        </port-mapping>
+    </service-interface-mapping>
+    <service-endpoint-interface-mapping>
+        <service-endpoint-interface>com.ibm.wssvt.acme.annuity.ws.AnnuityServicePortType</service-endpoint-interface>
+        <wsdl-port-type xmlns:seimwpt="http://ws.annuity.acme.wssvt.ibm.com">seimwpt:AnnuityServicePortType</wsdl-port-type>
+        <wsdl-binding xmlns:seimwb="http://ws.annuity.acme.wssvt.ibm.com">seimwb:AnnuityServiceBinding</wsdl-binding>
+        <service-endpoint-method-mapping>
+            <java-method-name>wsListAnnuityByHolder</java-method-name>
+            <wsdl-operation>wsListAnnuityByHolder</wsdl-operation>
+            <wrapped-element></wrapped-element>
+            <method-param-parts-mapping>
+                <param-position>0</param-position>
+                <param-type>java.lang.String</param-type>
+                <wsdl-message-mapping>
+                    <wsdl-message xmlns:mppm="http://ws.annuity.acme.wssvt.ibm.com">mppm:wsListAnnuityByHolderRequest</wsdl-message>
+                    <wsdl-message-part-name>holderSSN</wsdl-message-part-name>
+                    <parameter-mode>IN</parameter-mode>
+                </wsdl-message-mapping>
+            </method-param-parts-mapping>
+            <wsdl-return-value-mapping>
+                <method-return-value>java.util.Vector</method-return-value>
+                <wsdl-message xmlns:wrvm="http://ws.annuity.acme.wssvt.ibm.com">wrvm:wsListAnnuityByHolderResponse</wsdl-message>
+                <wsdl-message-part-name>wsListAnnuityByHolderReturn</wsdl-message-part-name>
+            </wsdl-return-value-mapping>
+        </service-endpoint-method-mapping>
+        <service-endpoint-method-mapping>
+            <java-method-name>wsAddSubAccounts</java-method-name>
+            <wsdl-operation>wsAddSubAccounts</wsdl-operation>
+            <wrapped-element></wrapped-element>
+            <method-param-parts-mapping>
+                <param-position>0</param-position>
+                <param-type>com.ibm.wssvt.tc.pli.data.WSAnnuityCompositeData</param-type>
+                <wsdl-message-mapping>
+                    <wsdl-message xmlns:mppm="http://ws.annuity.acme.wssvt.ibm.com">mppm:wsAddSubAccountsRequest</wsdl-message>
+                    <wsdl-message-part-name>aCD</wsdl-message-part-name>
+                    <parameter-mode>IN</parameter-mode>
+                </wsdl-message-mapping>
+            </method-param-parts-mapping>
+            <method-param-parts-mapping>
+                <param-position>1</param-position>
+                <param-type>com.ibm.wssvt.tc.pli.data.SubAcctData[]</param-type>
+                <wsdl-message-mapping>
+                    <wsdl-message xmlns:mppm="http://ws.annuity.acme.wssvt.ibm.com">mppm:wsAddSubAccountsRequest</wsdl-message>
+                    <wsdl-message-part-name>sAD</wsdl-message-part-name>
+                    <parameter-mode>IN</parameter-mode>
+                </wsdl-message-mapping>
+            </method-param-parts-mapping>
+            <wsdl-return-value-mapping>
+                <method-return-value>com.ibm.wssvt.tc.pli.data.WSAnnuityCompositeData</method-return-value>
+                <wsdl-message xmlns:wrvm="http://ws.annuity.acme.wssvt.ibm.com">wrvm:wsAddSubAccountsResponse</wsdl-message>
+                <wsdl-message-part-name>wsAddSubAccountsReturn</wsdl-message-part-name>
+            </wsdl-return-value-mapping>
+        </service-endpoint-method-mapping>
+        <service-endpoint-method-mapping>
+            <java-method-name>wsCreateAnnuity</java-method-name>
+            <wsdl-operation>wsCreateAnnuity</wsdl-operation>
+            <wrapped-element></wrapped-element>
+            <method-param-parts-mapping>
+                <param-position>0</param-position>
+                <param-type>com.ibm.wssvt.tc.pli.data.WSAnnuityCompositeData</param-type>
+                <wsdl-message-mapping>
+                    <wsdl-message xmlns:mppm="http://ws.annuity.acme.wssvt.ibm.com">mppm:wsCreateAnnuityRequest</wsdl-message>
+                    <wsdl-message-part-name>aCD</wsdl-message-part-name>
+                    <parameter-mode>IN</parameter-mode>
+                </wsdl-message-mapping>
+            </method-param-parts-mapping>
+            <wsdl-return-value-mapping>
+                <method-return-value>com.ibm.wssvt.tc.pli.data.WSAnnuityCompositeData</method-return-value>
+                <wsdl-message xmlns:wrvm="http://ws.annuity.acme.wssvt.ibm.com">wrvm:wsCreateAnnuityResponse</wsdl-message>
+                <wsdl-message-part-name>wsCreateAnnuityReturn</wsdl-message-part-name>
+            </wsdl-return-value-mapping>
+        </service-endpoint-method-mapping>
+    </service-endpoint-interface-mapping>
+    <service-interface-mapping>
+        <service-interface>com.ibm.wssvt.acme.annuity.ws.AnnuityService2</service-interface>
+        <wsdl-service-name xmlns:sim="http://ws.annuity.acme.wssvt.ibm.com">sim:AnnuityService2</wsdl-service-name>
+        <port-mapping>
+            <port-name>AnnuityService2</port-name>
+            <java-port-name>AnnuityService2</java-port-name>
+        </port-mapping>
+    </service-interface-mapping>
+    <service-endpoint-interface-mapping>
+        <service-endpoint-interface>com.ibm.wssvt.acme.annuity.ws.AnnuityServicePortType</service-endpoint-interface>
+        <wsdl-port-type xmlns:seimwpt="http://ws.annuity.acme.wssvt.ibm.com">seimwpt:AnnuityServicePortType</wsdl-port-type>
+        <wsdl-binding xmlns:seimwb="http://ws.annuity.acme.wssvt.ibm.com">seimwb:AnnuityServiceBinding</wsdl-binding>
+        <service-endpoint-method-mapping>
+            <java-method-name>wsListAnnuityByHolder</java-method-name>
+            <wsdl-operation>wsListAnnuityByHolder</wsdl-operation>
+            <wrapped-element></wrapped-element>
+            <method-param-parts-mapping>
+                <param-position>0</param-position>
+                <param-type>java.lang.String</param-type>
+                <wsdl-message-mapping>
+                    <wsdl-message xmlns:mppm="http://ws.annuity.acme.wssvt.ibm.com">mppm:wsListAnnuityByHolderRequest</wsdl-message>
+                    <wsdl-message-part-name>holderSSN</wsdl-message-part-name>
+                    <parameter-mode>IN</parameter-mode>
+                </wsdl-message-mapping>
+            </method-param-parts-mapping>
+            <wsdl-return-value-mapping>
+                <method-return-value>java.util.Vector</method-return-value>
+                <wsdl-message xmlns:wrvm="http://ws.annuity.acme.wssvt.ibm.com">wrvm:wsListAnnuityByHolderResponse</wsdl-message>
+                <wsdl-message-part-name>wsListAnnuityByHolderReturn</wsdl-message-part-name>
+            </wsdl-return-value-mapping>
+        </service-endpoint-method-mapping>
+        <service-endpoint-method-mapping>
+            <java-method-name>wsAddSubAccounts</java-method-name>
+            <wsdl-operation>wsAddSubAccounts</wsdl-operation>
+            <wrapped-element></wrapped-element>
+            <method-param-parts-mapping>
+                <param-position>0</param-position>
+                <param-type>com.ibm.wssvt.tc.pli.data.WSAnnuityCompositeData</param-type>
+                <wsdl-message-mapping>
+                    <wsdl-message xmlns:mppm="http://ws.annuity.acme.wssvt.ibm.com">mppm:wsAddSubAccountsRequest</wsdl-message>
+                    <wsdl-message-part-name>aCD</wsdl-message-part-name>
+                    <parameter-mode>IN</parameter-mode>
+                </wsdl-message-mapping>
+            </method-param-parts-mapping>
+            <method-param-parts-mapping>
+                <param-position>1</param-position>
+                <param-type>com.ibm.wssvt.tc.pli.data.SubAcctData[]</param-type>
+                <wsdl-message-mapping>
+                    <wsdl-message xmlns:mppm="http://ws.annuity.acme.wssvt.ibm.com">mppm:wsAddSubAccountsRequest</wsdl-message>
+                    <wsdl-message-part-name>sAD</wsdl-message-part-name>
+                    <parameter-mode>IN</parameter-mode>
+                </wsdl-message-mapping>
+            </method-param-parts-mapping>
+            <wsdl-return-value-mapping>
+                <method-return-value>com.ibm.wssvt.tc.pli.data.WSAnnuityCompositeData</method-return-value>
+                <wsdl-message xmlns:wrvm="http://ws.annuity.acme.wssvt.ibm.com">wrvm:wsAddSubAccountsResponse</wsdl-message>
+                <wsdl-message-part-name>wsAddSubAccountsReturn</wsdl-message-part-name>
+            </wsdl-return-value-mapping>
+        </service-endpoint-method-mapping>
+        <service-endpoint-method-mapping>
+            <java-method-name>wsCreateAnnuity</java-method-name>
+            <wsdl-operation>wsCreateAnnuity</wsdl-operation>
+            <wrapped-element></wrapped-element>
+            <method-param-parts-mapping>
+                <param-position>0</param-position>
+                <param-type>com.ibm.wssvt.tc.pli.data.WSAnnuityCompositeData</param-type>
+                <wsdl-message-mapping>
+                    <wsdl-message xmlns:mppm="http://ws.annuity.acme.wssvt.ibm.com">mppm:wsCreateAnnuityRequest</wsdl-message>
+                    <wsdl-message-part-name>aCD</wsdl-message-part-name>
+                    <parameter-mode>IN</parameter-mode>
+                </wsdl-message-mapping>
+            </method-param-parts-mapping>
+            <wsdl-return-value-mapping>
+                <method-return-value>com.ibm.wssvt.tc.pli.data.WSAnnuityCompositeData</method-return-value>
+                <wsdl-message xmlns:wrvm="http://ws.annuity.acme.wssvt.ibm.com">wrvm:wsCreateAnnuityResponse</wsdl-message>
+                <wsdl-message-part-name>wsCreateAnnuityReturn</wsdl-message-part-name>
+            </wsdl-return-value-mapping>
+        </service-endpoint-method-mapping>
+    </service-endpoint-interface-mapping>
+</java-wsdl-mapping>
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/testData/webservices/META-INF/ibm-webservices-bnd.xmi b/tests/org.eclipse.jst.j2ee.core.tests/testData/webservices/META-INF/ibm-webservices-bnd.xmi
new file mode 100644
index 0000000..d5dcf6c
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/testData/webservices/META-INF/ibm-webservices-bnd.xmi
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<com.ibm.etools.webservice.wsbnd:WSBinding xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:com.ibm.etools.webservice.wsbnd="http://www.ibm.com/websphere/appserver/schemas/5.0.2/wsbnd.xmi" xmi:id="WSBinding_1055737241797">
+  <wsdescBindings xmi:id="WSDescBinding_1055737241797" wsDescNameLink="StockQuoteFetcher">
+    <pcBindings xmi:id="PCBinding_1055737241797" pcNameLink="urn:xmltoday-delayed-quotes" scope="Session"/>
+  </wsdescBindings>
+  <routerModules xmi:id="RouterModule_1055737241797" transport="http" name="StockQuote.war"/>
+</com.ibm.etools.webservice.wsbnd:WSBinding>
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/testData/webservices/META-INF/ibm-webservices-ext.xmi b/tests/org.eclipse.jst.j2ee.core.tests/testData/webservices/META-INF/ibm-webservices-ext.xmi
new file mode 100644
index 0000000..170500f
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/testData/webservices/META-INF/ibm-webservices-ext.xmi
@@ -0,0 +1,6 @@
+<com.ibm.etools.webservice.wsext:WsExtension xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:com.ibm.etools.webservice.wsext="http://www.ibm.com/websphere/appserver/schemas/5.0.2/wsext.xmi" xmi:id="WsExtension_1053484615054">
+  <wsDescExt xmi:id="WsDescExt_1053484615054" wsDescNameLink="StockQuoteFetcher">
+    <pcBinding xmi:id="PcBinding_1053484615054" pcNameLink="urn:xmltoday-delayed-quotes">
+    </pcBinding>
+  </wsDescExt>
+</com.ibm.etools.webservice.wsext:WsExtension>
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/testData/webservices/META-INF/webservices.xml b/tests/org.eclipse.jst.j2ee.core.tests/testData/webservices/META-INF/webservices.xml
new file mode 100644
index 0000000..7269077
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.core.tests/testData/webservices/META-INF/webservices.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE webservices PUBLIC "-//IBM Corporation, Inc.//DTD J2EE Web services 1.0//EN" "http://www.ibm.com/webservices/dtd/j2ee_web_services_1_0.dtd">
+
+   <webservices id="WebServices_1055737241672">
+      <webservice-description id="WebServiceDescription_1055737241688">
+         <webservice-description-name>StockQuoteFetcher</webservice-description-name>
+         <wsdl-file>META-INF/wsdl/StockQuoteFetcher.wsdl</wsdl-file>
+         <jaxrpc-mapping-file>META-INF/StockQuoteFetcher_mapping.xml</jaxrpc-mapping-file>
+         <port-component id="PortComponent_1055737241734">
+            <port-component-name>urn:xmltoday-delayed-quotes</port-component-name>
+            <wsdl-port id="WSDLPort_1055737241734">
+               <namespaceURI>http://stock.webservices.samples.websphere.ibm.com</namespaceURI>
+               <localpart>StockQuote</localpart>
+            </wsdl-port>
+            <service-endpoint-interface>com.ibm.websphere.samples.webservices.stock.StockQuote</service-endpoint-interface>
+            <service-impl-bean id="ServiceImplBean_1055737241734">
+               <ejb-link>com_ibm_websphere_samples_webservices_stock_StockQuote</ejb-link>
+            </service-impl-bean>
+         </port-component>
+      </webservice-description>
+   </webservices>
diff --git a/tests/org.eclipse.jst.j2ee.ejb.generation.tests/.classpath b/tests/org.eclipse.jst.j2ee.ejb.generation.tests/.classpath
new file mode 100644
index 0000000..065ac06
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.ejb.generation.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"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/tests/org.eclipse.jst.j2ee.ejb.generation.tests/.cvsignore b/tests/org.eclipse.jst.j2ee.ejb.generation.tests/.cvsignore
new file mode 100644
index 0000000..ba077a4
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.ejb.generation.tests/.cvsignore
@@ -0,0 +1 @@
+bin
diff --git a/tests/org.eclipse.jst.j2ee.ejb.generation.tests/.project b/tests/org.eclipse.jst.j2ee.ejb.generation.tests/.project
new file mode 100644
index 0000000..93e1bac
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.ejb.generation.tests/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.jst.j2ee.ejb.generation.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/tests/org.eclipse.jst.j2ee.ejb.generation.tests/about.html b/tests/org.eclipse.jst.j2ee.ejb.generation.tests/about.html
new file mode 100644
index 0000000..4ec5989
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.ejb.generation.tests/about.html
@@ -0,0 +1,34 @@
+<!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">
+
+<H3>About This Content</H3>
+
+<P>May 2, 2006</P>
+
+<H3>License</H3>
+
+<P>The Eclipse Foundation makes available all content in this plug-in 
+("Content"). Unless otherwise indicated below, the Content is provided to you 
+under the terms and conditions of the Eclipse Public License Version 1.0 
+("EPL"). A copy of the EPL is available at
+<A href="http://www.eclipse.org/org/documents/epl-v10.php">http://www.eclipse.org/org/documents/epl-v10.php</A>. 
+For purposes of the EPL, "Program" 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 ("Redistributor") 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 
+and such source code may be obtained at
+<A href="http://www.eclipse.org/">http://www.eclipse.org/</A>.</P>
+
+</BODY>
+</HTML>
diff --git a/tests/org.eclipse.jst.j2ee.ejb.generation.tests/build.properties b/tests/org.eclipse.jst.j2ee.ejb.generation.tests/build.properties
new file mode 100644
index 0000000..357dfc4
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.ejb.generation.tests/build.properties
@@ -0,0 +1,6 @@
+source.annotationtests.jar = src/
+output.annotationtests.jar = bin/
+bin.includes = plugin.xml,\
+               annotationtests.jar,\
+               about.html,\
+               test.xml
diff --git a/tests/org.eclipse.jst.j2ee.ejb.generation.tests/plugin.xml b/tests/org.eclipse.jst.j2ee.ejb.generation.tests/plugin.xml
new file mode 100644
index 0000000..13ea1cd
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.ejb.generation.tests/plugin.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin
+   id="org.eclipse.jst.j2ee.ejb.generation.tests"
+   name="Tests Plug-in"
+   version="1.0.0.qualifier"
+   provider-name="Eclipse.org"
+   class="org.eclipse.jst.j2ee.ejb.generation.tests.TestsPlugin">
+
+   <runtime>
+      <library name="annotationtests.jar"/>
+   </runtime>
+
+   <requires>
+      <import plugin="org.eclipse.core.runtime"/>
+      <import plugin="org.junit"/>
+      <import plugin="org.eclipse.jst.j2ee.ejb.annotation.model"/>
+      <import plugin="org.eclipse.jst.j2ee.ejb.annotations.emitter"/>
+      <import plugin="org.eclipse.jst.j2ee.ejb.annotations.ui"/>
+      <import plugin="org.eclipse.jst.j2ee.ejb.annotations.xdoclet"/>
+      <import plugin="org.eclipse.jdt.core"/>
+      <import plugin="org.eclipse.core.resources"/>
+      <import plugin="org.eclipse.jdt.launching"/>
+      <import plugin="org.eclipse.jst.j2ee.core"/>
+      <import plugin="org.eclipse.jst.ejb.ui"/>
+      <import plugin="org.eclipse.jst.j2ee.ejb"/>
+      <import plugin="org.eclipse.jst.j2ee.ui"/>
+      <import plugin="org.eclipse.jst.j2ee"/>
+      <import plugin="org.eclipse.wst.common.frameworks"/>
+      <import plugin="org.eclipse.jst.server.core"/>
+      <import plugin="org.eclipse.jst.server.generic.core"/>
+      <import plugin="org.eclipse.jst.server.generic.ui"/>
+      <import plugin="org.eclipse.wst.server.core"/>
+      <import plugin="org.eclipse.emf"/>
+      <import plugin="org.eclipse.emf.ecore"/>
+      <import plugin="org.eclipse.ui"/>
+      <import plugin="org.eclipse.jst.common.frameworks"/>
+   </requires>
+
+</plugin>
diff --git a/tests/org.eclipse.jst.j2ee.ejb.generation.tests/pom.xml b/tests/org.eclipse.jst.j2ee.ejb.generation.tests/pom.xml
new file mode 100644
index 0000000..4077e44
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.ejb.generation.tests/pom.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Copyright (c) 2012, 2013 Eclipse Foundation and others.
+  All rights reserved. This program and the accompanying materials
+  are made available under the terms of the Eclipse Distribution License v1.0
+  which accompanies this distribution, and is available at
+  http://www.eclipse.org/org/documents/edl-v10.php
+ 
+  Contributors:
+    Thanh Ha (Eclipse Foundation) - initial implementation
+-->
+
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.eclipse.webtools.javaee</groupId>
+    <artifactId>javaee.tests</artifactId>
+    <version>3.6.0-SNAPSHOT</version>
+  </parent>
+
+  <groupId>org.eclipse.webtools.ejb</groupId>
+  <artifactId>org.eclipse.jst.j2ee.ejb.generation.tests</artifactId>
+  <version>1.0.0-SNAPSHOT</version>
+  <packaging>eclipse-plugin</packaging>
+</project>
diff --git a/tests/org.eclipse.jst.j2ee.ejb.generation.tests/src/org/eclipse/jst/j2ee/ejb/generation/tests/AllTests.java b/tests/org.eclipse.jst.j2ee.ejb.generation.tests/src/org/eclipse/jst/j2ee/ejb/generation/tests/AllTests.java
new file mode 100644
index 0000000..cb9216a
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.ejb.generation.tests/src/org/eclipse/jst/j2ee/ejb/generation/tests/AllTests.java
@@ -0,0 +1,54 @@
+/**********************************************************************
+ * Copyright (c) 2004, 2005 IBM 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:
+ *    IBM Corporation - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.jst.j2ee.ejb.generation.tests;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.jst.j2ee.ejb.generation.tests.common.EjbModuleCreationTest;
+import org.eclipse.jst.j2ee.ejb.generation.tests.common.EnterpriseBeanModelTest;
+import org.eclipse.jst.j2ee.ejb.generation.tests.common.ExistenceTest;
+import org.eclipse.jst.j2ee.ejb.generation.tests.common.TestSettings;
+
+public class AllTests {
+	public static Test suite() {
+		TestSuite suite = new TestSuite("Test for org.eclipse.jst.j2ee.ejb.generation.tests");
+		//$JUnit-BEGIN$
+		System.setProperty("wtp.autotest.noninteractive", "true");
+		
+		//$JUnit-BEGIN$
+		String s = System.getProperty(TestSettings.runtimeid); 
+		//s = "D:\\Tools\\tomcat\\jakarta-tomcat-3.2.4";
+		if (s != null && s.length() > 0) {
+			TestSettings.serverlocation = s;
+		}
+		s = System.getProperty("org.eclipse.jst.xdoclet.version"); 
+		//s = "1.2.3";
+		if (s != null && s.length() > 0) {
+			TestSettings.xdocletversion = s;
+		}
+		
+		s = System.getProperty("org.eclipse.jst.xdoclet.location"); 
+		//s = "D:\\Tools\\tomcat\\jakarta-tomcat-3.2.4";
+		if (s != null && s.length() > 0) {
+			TestSettings.xdocletlocation = s;
+		}
+
+		suite.addTestSuite(EnterpriseBeanModelTest.class);
+		suite.addTest(new OrderedTestSuite(EjbModuleCreationTest.class));
+		suite.addTestSuite(ExistenceTest.class);
+		
+		s = System.getProperty("org.eclipse.jst.server.generic.jonas4"); 
+		if (s != null && s.length() > 0) {
+		} 
+		return suite;
+	}
+}
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.j2ee.ejb.generation.tests/src/org/eclipse/jst/j2ee/ejb/generation/tests/OrderedTestSuite.java b/tests/org.eclipse.jst.j2ee.ejb.generation.tests/src/org/eclipse/jst/j2ee/ejb/generation/tests/OrderedTestSuite.java
new file mode 100644
index 0000000..dd96fb8
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.ejb.generation.tests/src/org/eclipse/jst/j2ee/ejb/generation/tests/OrderedTestSuite.java
@@ -0,0 +1,92 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 IBM 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:
+ *     IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.ejb.generation.tests;
+
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.Vector;
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+public class OrderedTestSuite extends TestSuite {
+	public OrderedTestSuite(Class theClass, String name) {
+		this(theClass);
+		setName(name);
+	}
+
+	public OrderedTestSuite(final Class theClass) {
+		super();
+		setName(theClass.getName());
+		try {
+			getTestConstructor(theClass); // Avoid generating multiple error messages
+		} catch (NoSuchMethodException e) {
+			addTest(warning("Class " + theClass.getName()
+					+ " has no public constructor TestCase(String name) or TestCase()"));
+			return;
+		}
+		if (!Modifier.isPublic(theClass.getModifiers())) {
+			addTest(warning("Class " + theClass.getName() + " is not public"));
+			return;
+		}
+		Class superClass = theClass;
+		Vector names = new Vector();
+		
+		Method[] methods = superClass.getMethods();
+		int size = methods.length;
+		for (int i = 0; i < size - 1; i++) {
+			for (int j = i + 1; j < size; j++) {
+				if (methods[i].getName().compareTo(methods[j].getName()) > 0) {
+					Method m = methods[i];
+					methods[i] = methods[j];
+					methods[j] = m;
+				}
+			}
+		}
+		for (int i = 0; i < size; i++) {
+			addTestMethod(methods[i], names, theClass);
+		}
+		if (!tests().hasMoreElements())
+			addTest(warning("No tests found in " + theClass.getName()));
+	}
+
+	private void addTestMethod(Method m, Vector names, Class theClass) {
+		String name = m.getName();
+		if (names.contains(name))
+			return;
+		if (!isPublicTestMethod(m)) {
+			if (isTestMethod(m))
+				addTest(warning("Test method isn't public: " + m.getName()));
+			return;
+		}
+		names.addElement(name);
+		addTest(createTest(theClass, name));
+	}
+
+	private boolean isPublicTestMethod(Method m) {
+		return isTestMethod(m) && Modifier.isPublic(m.getModifiers());
+	}
+
+	private boolean isTestMethod(Method m) {
+		String name = m.getName();
+		Class[] parameters = m.getParameterTypes();
+		Class returnType = m.getReturnType();
+		return parameters.length == 0 && name.startsWith("test") && returnType.equals(Void.TYPE);
+	}
+
+	private Test warning(final String message) {
+		return new TestCase("warning") {
+			protected void runTest() {
+				fail(message);
+			}
+		};
+	}
+}
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.j2ee.ejb.generation.tests/src/org/eclipse/jst/j2ee/ejb/generation/tests/TestsPlugin.java b/tests/org.eclipse.jst.j2ee.ejb.generation.tests/src/org/eclipse/jst/j2ee/ejb/generation/tests/TestsPlugin.java
new file mode 100644
index 0000000..03ccdd4
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.ejb.generation.tests/src/org/eclipse/jst/j2ee/ejb/generation/tests/TestsPlugin.java
@@ -0,0 +1,73 @@
+package org.eclipse.jst.j2ee.ejb.generation.tests;
+
+import org.eclipse.core.runtime.Plugin;
+import org.osgi.framework.BundleContext;
+import java.util.*;
+
+/**
+ * The main plugin class to be used in the desktop.
+ */
+public class TestsPlugin extends Plugin {
+	//The shared instance.
+	private static TestsPlugin plugin;
+	//Resource bundle.
+	private ResourceBundle resourceBundle;
+	
+	/**
+	 * The constructor.
+	 */
+	public TestsPlugin() {
+		super();
+		plugin = this;
+	}
+
+	/**
+	 * This method is called upon plug-in activation
+	 */
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+	}
+
+	/**
+	 * This method is called when the plug-in is stopped
+	 */
+	public void stop(BundleContext context) throws Exception {
+		super.stop(context);
+		plugin = null;
+		resourceBundle = null;
+	}
+
+	/**
+	 * Returns the shared instance.
+	 */
+	public static TestsPlugin getDefault() {
+		return plugin;
+	}
+
+	/**
+	 * Returns the string from the plugin's resource bundle,
+	 * or 'key' if not found.
+	 */
+	public static String getResourceString(String key) {
+		ResourceBundle bundle = TestsPlugin.getDefault().getResourceBundle();
+		try {
+			return (bundle != null) ? bundle.getString(key) : key;
+		} catch (MissingResourceException e) {
+			return key;
+		}
+	}
+
+	/**
+	 * Returns the plugin's resource bundle,
+	 */
+	public ResourceBundle getResourceBundle() {
+		try {
+			if (resourceBundle == null)
+				resourceBundle = ResourceBundle.getBundle("org.eclipse.jst.j2ee.ejb.generation.tests.TestsPluginResources");
+		} catch (MissingResourceException x) {
+			resourceBundle = null;
+		}
+		return resourceBundle;
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.ejb.generation.tests/src/org/eclipse/jst/j2ee/ejb/generation/tests/common/AnnotationTest.java b/tests/org.eclipse.jst.j2ee.ejb.generation.tests/src/org/eclipse/jst/j2ee/ejb/generation/tests/common/AnnotationTest.java
new file mode 100644
index 0000000..86cfef5
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.ejb.generation.tests/src/org/eclipse/jst/j2ee/ejb/generation/tests/common/AnnotationTest.java
@@ -0,0 +1,228 @@
+/*******************************************************************************
+ * Copyright (c) 2002, 2003 Eteration Bilisim A.S., Naci Dai and others.
+ * All rights reserved. This program and the accompanying materials 
+ * are made available under the terms of the GNU Lesser General Public License (LGPL)
+ * which accompanies this distribution, and is available at
+ *  http://www.gnu.org/licenses/lgpl.html
+ * 
+ * Contributors:
+ *     Eteration Bilisim A.S. - initial API and implementation
+ *     Naci M. Dai
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ *    any, must include the following acknowlegement:
+ *       "This product includes software developed by the
+ *        Eteration Bilisim A.S and Naci Dai (http://www.eteration.com/)."
+ *    Alternately, this acknowlegement may appear in the software itself,
+ *    if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "Lomboz", "ObjectLearn" and "Eteration" must not be used to endorse or promote products derived
+ *    from this software without prior written permission. For written
+ *    permission, please contact info@eteration.com.
+ *
+ * 5. Products derived from this software may not be called "Lomboz"
+ *    nor may "Lomboz" appear in their names without prior written
+ *    permission of the Eteration Bilisim A.S.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Eteration Bilisim A.S.  For more
+ * information on eteration, please see
+ * <http://www.eteration.com/>.
+ ***************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.generation.tests.common;
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.util.HashMap;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jst.common.jdt.internal.integration.JavaProjectCreationDataModelProvider;
+import org.eclipse.jst.j2ee.application.internal.operations.FlexibleJavaProjectCreationDataModelProvider;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.model.SessionBeanDataModelProvider;
+import org.eclipse.jst.j2ee.internal.ejb.archiveoperations.EjbComponentCreationDataModelProvider;
+import org.eclipse.jst.j2ee.internal.servertarget.J2EEProjectServerTargetDataModelProvider;
+import org.eclipse.jst.server.generic.core.internal.GenericServerRuntime;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
+import org.eclipse.wst.server.core.IRuntime;
+import org.eclipse.wst.server.core.IRuntimeType;
+import org.eclipse.wst.server.core.IRuntimeWorkingCopy;
+import org.eclipse.wst.server.core.IServerType;
+import org.eclipse.wst.server.core.IServerWorkingCopy;
+import org.eclipse.wst.server.core.ServerCore;
+import org.eclipse.wst.server.core.ServerUtil;
+import org.eclipse.wst.server.core.model.RuntimeDelegate;
+
+public abstract class AnnotationTest extends TestCase {
+
+	protected static final String EJB_NAME = "Cow";
+	protected static final String MODULE_NAME = "zoo";
+	protected static final String PROJECT_NAME = "TestEjbProject";
+	protected static final String SOURCE_FOLDER = "/"+MODULE_NAME+"/ejbModule";
+	public static final String BEAN_PACKAGE = "com.farm";
+	public static final String BEAN_CLASS = "CowBean";
+
+	/**
+	 * 
+	 */
+	public AnnotationTest() {
+		super();
+	}
+
+	/**
+	 * @param name
+	 */
+	public AnnotationTest(String name) {
+		super(name);
+	}
+
+	public static final String XDOCLET = "XDoclet";
+
+	protected IDataModelOperation createFlexibleProject() throws Exception {
+		FlexibleJavaProjectCreationDataModelProvider provider = new FlexibleJavaProjectCreationDataModelProvider();
+		DataModelFactory.createDataModel(provider);
+
+		IDataModel creationDataModel = provider.getDataModel();
+		creationDataModel.setProperty(FlexibleJavaProjectCreationDataModelProvider.PROJECT_NAME, PROJECT_NAME);
+		creationDataModel.setProperty(JavaProjectCreationDataModelProvider.SOURCE_FOLDERS, new String[] { "ejbModules" });
+		IRuntime runtime = getRuntimeTarget();
+		creationDataModel.setProperty(J2EEProjectServerTargetDataModelProvider.RUNTIME_TARGET_ID, runtime.getId());
+
+		return provider.getDefaultOperation();
+	}
+
+	public IRuntime getRuntimeTarget() throws Exception {
+
+		// Finds the generic server type
+		IServerType[] sTypes = ServerCore.getServerTypes();
+		IServerType serverType = null;
+		for (int i = 0; i < sTypes.length; i++) {
+			IServerType sType = sTypes[i];
+			if (TestSettings.runtimeid.equals(sType.getId()))
+				serverType = sType;
+		}
+		assertNotNull("Could not find " + TestSettings.runtimeid + " server type", serverType);
+
+		// Finds the generic server runtime type
+		IRuntimeType runtimeType = serverType.getRuntimeType();
+		assertNotNull("Could not find runtime type for the generic server type", runtimeType);
+
+		// Create a new server instance from the type
+		IServerWorkingCopy server = serverType.createServer(TestSettings.runtimeid + ".Jonas.Server", null, (IRuntime) null, null);
+		assertNotNull("Could not create server", server);
+
+		// Create a new runtime instance from the type
+		IRuntime runtime = runtimeType.createRuntime(TestSettings.runtimeid + ".Jonas.Runtime", null);
+
+		assertNotNull("Could not create runtime", runtime);
+
+		// Set the runtime for the server
+		server.setRuntime(runtime);
+
+		// Save the server
+		server.save(false, null);
+
+		// Set properties for the runtime
+		IRuntimeWorkingCopy runtimeWorkingCopy = runtime.createWorkingCopy();
+		assertNotNull("Could not create runtime working copy", runtimeWorkingCopy);
+
+		// Set the JONAS runtime as the default runtime
+		ServerUtil.setRuntimeDefaultName(runtimeWorkingCopy);
+		assertNotNull("Runtime working copy has no name", runtimeWorkingCopy.getName());
+
+		// Set properties for the JONAS runtime
+		GenericServerRuntime runtimeDelegate = (GenericServerRuntime) runtimeWorkingCopy.loadAdapter(RuntimeDelegate.class,
+				new NullProgressMonitor());
+		assertNotNull("Could not obtain runtime delegate", runtimeDelegate);
+
+		HashMap props = new HashMap();
+		props.put("mappernames", "");
+		props.put("classPathVariableName", "JONAS");
+		props.put("serverAddress", "127.0.0.1");
+		props.put("jonasBase", TestSettings.serverlocation);
+		props.put("jonasRoot", TestSettings.serverlocation);
+		props.put("classPath", TestSettings.serverlocation);
+		props.put("protocols", TestSettings.serverlocation);
+		props.put("port", "9000");
+		runtimeDelegate.setServerInstanceProperties(props);
+
+		// Save the runtime working copy
+		runtimeWorkingCopy.save(false, null);
+
+		return runtime;
+	}
+
+	protected IDataModel createDefaultSessionModel() {
+		SessionBeanDataModelProvider provider = new SessionBeanDataModelProvider();
+		DataModelFactory.createDataModel(provider);
+		IDataModel model = provider.getDataModel();
+		model.setProperty(SessionBeanDataModelProvider.ANNOTATIONPROVIDER, XDOCLET);
+
+		model.setBooleanProperty(SessionBeanDataModelProvider.MODIFIER_ABSTRACT, true);
+		model.setProperty(SessionBeanDataModelProvider.CLASS_NAME, BEAN_CLASS);
+		model.setProperty(SessionBeanDataModelProvider.JAVA_PACKAGE, BEAN_PACKAGE);
+
+		model.setProperty(SessionBeanDataModelProvider.PROJECT_NAME, PROJECT_NAME);
+		model.setProperty(SessionBeanDataModelProvider.SOURCE_FOLDER, SOURCE_FOLDER);
+		//model.setProperty(SessionBeanDataModelProvider.JAVA_SOURCE_FOLDER, SOURCE_FOLDER);
+		model.setProperty(SessionBeanDataModelProvider.COMPONENT_NAME, MODULE_NAME);
+		model.setProperty(SessionBeanDataModelProvider.EJB_NAME, EJB_NAME);
+		model.setProperty(SessionBeanDataModelProvider.JNDI_NAME, EJB_NAME);
+		model.setProperty(SessionBeanDataModelProvider.DISPLAY_NAME, EJB_NAME);
+		return model;
+	}
+
+	protected IDataModelOperation createEjbModuleAndProject() throws Exception {
+
+		//IDataModelOperation flexibleJavaProjectCreationOperation = createFlexibleProject();
+		//flexibleJavaProjectCreationOperation.execute(new NullProgressMonitor(), null);
+		EjbComponentCreationDataModelProvider aProvider = new EjbComponentCreationDataModelProvider();
+		DataModelFactory.createDataModel(aProvider);
+		IDataModel a = aProvider.getDataModel();
+		IRuntime runtime = getRuntimeTarget();
+		
+		a.setProperty(J2EEProjectServerTargetDataModelProvider.RUNTIME_TARGET_ID, runtime.getId());
+		a.setBooleanProperty(EjbComponentCreationDataModelProvider.ADD_TO_EAR, false);
+		a.setProperty(EjbComponentCreationDataModelProvider.JAVASOURCE_FOLDER, SOURCE_FOLDER);
+		a.setProperty(EjbComponentCreationDataModelProvider.COMPONENT_NAME, MODULE_NAME);
+		a.setProperty(EjbComponentCreationDataModelProvider.PROJECT_NAME, PROJECT_NAME);
+
+		a.setProperty(EjbComponentCreationDataModelProvider.COMPONENT_DEPLOY_NAME, MODULE_NAME);
+		a.setBooleanProperty(EjbComponentCreationDataModelProvider.CREATE_CLIENT, false);
+		a.getDefaultOperation().execute(new NullProgressMonitor(), null);
+
+		return a.getDefaultOperation();
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.ejb.generation.tests/src/org/eclipse/jst/j2ee/ejb/generation/tests/common/EjbModuleCreationTest.java b/tests/org.eclipse.jst.j2ee.ejb.generation.tests/src/org/eclipse/jst/j2ee/ejb/generation/tests/common/EjbModuleCreationTest.java
new file mode 100644
index 0000000..766a593
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.ejb.generation.tests/src/org/eclipse/jst/j2ee/ejb/generation/tests/common/EjbModuleCreationTest.java
@@ -0,0 +1,75 @@
+/**
+ * 
+ */
+package org.eclipse.jst.j2ee.ejb.generation.tests.common;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.operations.AddSessionBeanOperation;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.preferences.AnnotationPreferenceStore;
+import org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.XDocletAntProjectBuilder;
+import org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.XDocletPreferenceStore;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.resources.IVirtualResource;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+/**
+ * @author naci
+ */
+public class EjbModuleCreationTest extends AnnotationTest {
+	
+	
+	public void test01CreateEjbModule() throws Exception {
+		this.createEjbModuleAndProject();
+		IProject project = (IProject) ResourcesPlugin.getWorkspace().getRoot().findMember(PROJECT_NAME); // Project.ge.getProject(PROJECT_NAME);
+		assertNotNull(project);
+	}
+	
+	public void test04TestXDocletBuilder(){
+		
+		IProject project = (IProject) ResourcesPlugin.getWorkspace().getRoot().findMember(PROJECT_NAME); // Project.ge.getProject(PROJECT_NAME);
+		assertNotNull(project);
+		IFile bean = project.getFile(new Path(SOURCE_FOLDER+"/com/farm/CowBean.java"));
+		assertNotNull(bean);
+
+		IVirtualResource[] vResources = ComponentCore.createResources(bean);
+		assertTrue(vResources.length > 0);
+		assertNotNull(vResources[0].getComponent());
+
+		XDocletAntProjectBuilder antProjectBuilder = XDocletAntProjectBuilder.Factory.newInstance(bean);
+		antProjectBuilder.buildUsingAnt(bean, new NullProgressMonitor());
+
+		IFile bean2 = project.getFile(new Path(SOURCE_FOLDER+"/com/farm/CowUtilities.java"));
+		assertNotNull(bean2);
+	}	
+	public void test02SetXDocletPreferences() throws Exception {
+		IProject project = (IProject) ResourcesPlugin.getWorkspace().getRoot().findMember(PROJECT_NAME); // Project.ge.getProject(PROJECT_NAME);
+		assertNotNull(project);
+
+		XDocletPreferenceStore store = new XDocletPreferenceStore(project);
+		AnnotationPreferenceStore.setProperty(AnnotationPreferenceStore.ANNOTATIONPROVIDER, XDOCLET);
+		store.setProperty(XDocletPreferenceStore.XDOCLETBUILDERACTIVE, true);
+		store.setProperty(XDocletPreferenceStore.XDOCLETUSEGLOBAL,false);
+		store.setProperty(XDocletPreferenceStore.XDOCLETVERSION, TestSettings.xdocletversion);
+		store.setProperty(XDocletPreferenceStore.XDOCLETHOME, TestSettings.xdocletlocation);
+		store.save();
+		assertEquals(store.getProperty(XDocletPreferenceStore.XDOCLETHOME),TestSettings.xdocletlocation);
+	}
+	
+	
+	public void test03CreateSessionBean() throws Exception {
+		IProject project = (IProject) ResourcesPlugin.getWorkspace().getRoot().findMember(PROJECT_NAME); // Project.ge.getProject(PROJECT_NAME);
+		assertNotNull(project);
+		IDataModel commonDataModel = createDefaultSessionModel();
+		AddSessionBeanOperation sessionBeanOperation = new AddSessionBeanOperation(commonDataModel);
+		sessionBeanOperation.execute(new NullProgressMonitor(), null);
+
+		IFile bean = project.getFile(new Path(SOURCE_FOLDER+"/com/farm/CowBean.java"));
+		assertNotNull(bean);
+	}
+
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.ejb.generation.tests/src/org/eclipse/jst/j2ee/ejb/generation/tests/common/EnterpriseBeanModelTest.java b/tests/org.eclipse.jst.j2ee.ejb.generation.tests/src/org/eclipse/jst/j2ee/ejb/generation/tests/common/EnterpriseBeanModelTest.java
new file mode 100644
index 0000000..041c3e4
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.ejb.generation.tests/src/org/eclipse/jst/j2ee/ejb/generation/tests/common/EnterpriseBeanModelTest.java
@@ -0,0 +1,44 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.generation.tests.common;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jst.j2ee.ejb.annotation.internal.model.SessionBeanDataModelProvider;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+/**
+ * @author naci
+ *
+ */
+public class EnterpriseBeanModelTest extends AnnotationTest {
+	
+	
+	public void testSessionBeanDataModel() throws Exception
+	{
+		createEjbModuleAndProject();
+		
+		IDataModel dataModel = createDefaultSessionModel();
+		
+		assertNotNull(dataModel);
+		IStatus status = dataModel.validate();
+		assertTrue(status.isOK() );
+		
+		assertEquals(PROJECT_NAME,dataModel.getStringProperty(SessionBeanDataModelProvider.PROJECT_NAME));
+		
+		
+		assertEquals(BEAN_CLASS, dataModel.getProperty(SessionBeanDataModelProvider.CLASS_NAME));
+		String[] interfaces = (String[])dataModel.getProperty(SessionBeanDataModelProvider.EJB_INTERFACES);
+		assertEquals(1, interfaces.length);
+		assertEquals("javax.ejb.SessionBean", interfaces[0]);
+		
+		
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.ejb.generation.tests/src/org/eclipse/jst/j2ee/ejb/generation/tests/common/ExistenceTest.java b/tests/org.eclipse.jst.j2ee.ejb.generation.tests/src/org/eclipse/jst/j2ee/ejb/generation/tests/common/ExistenceTest.java
new file mode 100644
index 0000000..2536474
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.ejb.generation.tests/src/org/eclipse/jst/j2ee/ejb/generation/tests/common/ExistenceTest.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 IBM 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:
+ *     IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.ejb.generation.tests.common;
+
+import org.eclipse.jst.j2ee.ejb.annotation.internal.model.ModelPlugin;
+import org.eclipse.jst.j2ee.ejb.annotation.ui.internal.EjbAnnotationsUiPlugin;
+import org.eclipse.jst.j2ee.ejb.annotations.internal.emitter.EjbEmitterPlugin;
+import org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet.XDocletAnnotationPlugin;
+
+import junit.framework.TestCase;
+
+public class ExistenceTest extends TestCase {
+	public void testModelPluginExists() {
+		assertNotNull(ModelPlugin.getDefault());
+	}
+	public void testEmitterPluginExists() {
+		assertNotNull(EjbEmitterPlugin.getDefault());
+	}
+	public void testEjbUIPluginExists() {
+		assertNotNull(EjbAnnotationsUiPlugin.getDefault());
+	}
+	public void testXDocletPluginExists() {
+		assertNotNull(XDocletAnnotationPlugin.getDefault());
+	}
+}
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.j2ee.ejb.generation.tests/src/org/eclipse/jst/j2ee/ejb/generation/tests/common/TestSettings.java b/tests/org.eclipse.jst.j2ee.ejb.generation.tests/src/org/eclipse/jst/j2ee/ejb/generation/tests/common/TestSettings.java
new file mode 100644
index 0000000..f533306
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.ejb.generation.tests/src/org/eclipse/jst/j2ee/ejb/generation/tests/common/TestSettings.java
@@ -0,0 +1,24 @@
+/***************************************************************************************************
+ * Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
+ **************************************************************************************************/
+
+package org.eclipse.jst.j2ee.ejb.generation.tests.common;
+
+/**
+ * @author naci
+ *
+ */
+public class TestSettings {
+	
+	public static String runtimeid = "org.eclipse.jst.server.generic.jonas4";
+	public static String serverlocation = "C:\\nmd\\dev\\java\\appservers\\JOnAS-4.1.4";
+	public static String xdocletlocation = "c:\\downloads\\xdoclet-1.2.2";
+	public static String xdocletversion = "1.2.2";
+	
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.ejb.generation.tests/test.xml b/tests/org.eclipse.jst.j2ee.ejb.generation.tests/test.xml
new file mode 100644
index 0000000..6fdd602
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.ejb.generation.tests/test.xml
@@ -0,0 +1,51 @@
+<?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.j2ee.ejb.generation.tests"/>
+  <property name="library-file" value="${eclipse-home}/plugins/org.eclipse.test_3.1.0/library.xml"/>
+  <property name="extraVMargs" value="-Dorg.eclipse.jst.server.generic.jonas414=${testDir}/${jonas432DirName} -Dorg.eclipse.jst.xdoclet.location=${testDir}/${xdocletDirName} -Dorg.eclipse.jst.xdoclet.version=${xdocletVersion}"/>
+
+  <!-- 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*.xml"/>
+    </delete>
+  </target>
+
+  <!-- This target defines the tests that need to be run. -->
+  <target name="suite">
+    <property name="jst-folder" value="${eclipse-home}/jst_folder"/>
+    <delete dir="${jst-folder}" quiet="true"/>
+    <ant target="core-test" antfile="${library-file}" dir="${eclipse-home}">
+      <property name="data-dir" value="${jst-folder}"/>
+      <property name="plugin-name" value="${plugin-name}"/>
+      <property name="classname" value="org.eclipse.jst.j2ee.ejb.generation.tests.common.AllEJBGenerationTests"/>
+   	  <property name="plugin-path" value="${eclipse-home}/plugins/${plugin-name}"/>
+   	  <property name="extraVMargs" value="${extraVMargs}"/>
+    </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*.xml"/>
+      <property name="output-file" value="${plugin-name}.xml"/>
+    </ant>
+  </target>
+</project>
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.j2ee.tests.performance/.classpath b/tests/org.eclipse.jst.j2ee.tests.performance/.classpath
new file mode 100644
index 0000000..8bf670e
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests.performance/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="common/"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/tests/org.eclipse.jst.j2ee.tests.performance/.cvsignore b/tests/org.eclipse.jst.j2ee.tests.performance/.cvsignore
new file mode 100644
index 0000000..43ac606
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests.performance/.cvsignore
@@ -0,0 +1,4 @@
+bin
+temp.folder
+build.xml
+performance.jar
diff --git a/tests/org.eclipse.jst.j2ee.tests.performance/.project b/tests/org.eclipse.jst.j2ee.tests.performance/.project
new file mode 100644
index 0000000..2aed33e
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests.performance/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.jst.j2ee.tests.performance</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/docs/org.eclipse.wst.web.ui.infopop/about.html b/tests/org.eclipse.jst.j2ee.tests.performance/about.html
similarity index 100%
copy from docs/org.eclipse.wst.web.ui.infopop/about.html
copy to tests/org.eclipse.jst.j2ee.tests.performance/about.html
diff --git a/tests/org.eclipse.jst.j2ee.tests.performance/build.properties b/tests/org.eclipse.jst.j2ee.tests.performance/build.properties
new file mode 100644
index 0000000..21d4547
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests.performance/build.properties
@@ -0,0 +1,5 @@
+source.performance.jar = common/
+output.performance.jar = bin/
+bin.includes = plugin.xml,\
+               performance.jar,\
+               about.html
diff --git a/tests/org.eclipse.jst.j2ee.tests.performance/common/org/eclipse/jst/j2ee/tests/performance/BasePerformanceTestCase.java b/tests/org.eclipse.jst.j2ee.tests.performance/common/org/eclipse/jst/j2ee/tests/performance/BasePerformanceTestCase.java
new file mode 100644
index 0000000..ce756af
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests.performance/common/org/eclipse/jst/j2ee/tests/performance/BasePerformanceTestCase.java
@@ -0,0 +1,166 @@
+/*
+ * Created on Dec 6, 2004
+ *
+ * TODO To change the template for this generated file go to
+ * Window - Preferences - Java - Code Style - Code Templates
+ */
+package org.eclipse.jst.j2ee.tests.performance;
+
+import java.io.File;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.eclipse.wst.common.tests.BaseTestCase;
+
+/**
+ * @author Admin
+ *
+ * TODO To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Style - Code Templates
+ */
+public abstract class BasePerformanceTestCase extends BaseTestCase {
+	protected static Map performanceClass = null;
+	static ClassLoader clazzLoader = null;
+	protected static String file= null; 
+	public static Test suite() {
+		performanceClass = null;
+		return createTestSuites() ;
+	}
+	/**
+	 * 
+	 */
+	private static Test createTestSuites() {
+		createPerformanceClass();
+		TestSuite suite = new TestSuite();
+		for (Iterator iter = performanceClass.keySet().iterator(); iter.hasNext();) {
+			Class clazz = (Class) iter.next();
+			List methodList = (List)performanceClass.get(clazz);
+			for (int x=0; x< methodList.size(); ++x) {
+				PerformanceTestObject testObject = (PerformanceTestObject)methodList.get(x);
+				Test test = createTest(clazz,testObject.getName());
+				if (test instanceof BaseTestCase) {
+					suite.addTest(new PerformanceTestCaseWrapper((BaseTestCase)test, testObject.getTagging() , testObject.getShortName()));
+				}
+			}
+		}		
+		return suite;
+	}
+	
+	static public Test createTest(Class theClass, String name) {
+		Constructor constructor;
+		try {
+			constructor= getTestConstructor(theClass);
+		} catch (NoSuchMethodException e) {
+			return warning("Class "+theClass.getName()+" has no public constructor TestCase(String name) or TestCase()");
+		}
+		Object test;
+		try {
+			if (constructor.getParameterTypes().length == 0) {
+				test= constructor.newInstance(new Object[0]);
+				if (test instanceof TestCase)
+					((TestCase) test).setName(name);
+			} else {
+				test= constructor.newInstance(new Object[]{name});
+			}
+		} catch (InstantiationException e) {
+			return(warning("Cannot instantiate test case: "+name+" ("+exceptionToString(e)+")"));
+		} catch (InvocationTargetException e) {
+			return(warning("Exception in constructor: "+name+" ("+exceptionToString(e.getTargetException())+")"));
+		} catch (IllegalAccessException e) {
+			return(warning("Cannot access test case: "+name+" ("+exceptionToString(e)+")"));
+		}
+		return (Test) test;
+	}
+	
+	/**
+	 * Returns a test which will fail and log a warning message.
+	 */
+	private static Test warning(final String message) {
+		return new TestCase("warning") {
+			protected void runTest() {
+				fail(message);
+			}
+		};
+	}
+	
+	public static Constructor getTestConstructor(Class theClass) throws NoSuchMethodException {
+		Class[] args= { String.class };
+		try {
+			return theClass.getConstructor(args);	
+		} catch (NoSuchMethodException e) {
+			// fall through
+		}
+		return theClass.getConstructor(new Class[0]);
+	}
+	
+	private static String exceptionToString(Throwable t) {
+		StringWriter stringWriter= new StringWriter();
+		PrintWriter writer= new PrintWriter(stringWriter);
+		t.printStackTrace(writer);
+		return stringWriter.toString();
+
+	}
+	/**
+	 * @param performanceClass2
+	 */
+	
+	public static Map getPerformanceClass() {
+		if (performanceClass == null) {
+			createPerformanceClass();
+		}
+		return performanceClass;
+	}
+	
+		
+	protected static void createPerformanceClass() {
+		if (performanceClass == null) {
+			performanceClass = new TestCaseSAXParser().doLoad(new File(file));
+		}
+	}
+	
+
+	/**
+	 * @return Returns the clazzLoader.
+	 */
+	public static ClassLoader getClassLoader() {
+		return clazzLoader;
+	}
+	/**
+	 * @param clazzLoader The clazzLoader to set.
+	 */
+	public static void setClassLoader(ClassLoader clazzLoader) {
+		BasePerformanceTestCase.clazzLoader = clazzLoader;
+	}
+	/**
+	 * @return Returns the file.
+	 */
+	public static String getFile() {
+		return file;
+	}
+	/**
+	 * @param file The file to set.
+	 */
+	public static void setFile(String file) {
+		BasePerformanceTestCase.file = file;
+	}
+	
+	/**
+	 * @param suite
+	 * @param test
+	 * @param global
+	 * @param string
+	 */
+	protected static void addPerformanceTest(TestSuite suite, BaseTestCase test, int tagging, String shortName) {
+		PerformanceTestCaseWrapper testCase = new PerformanceTestCaseWrapper(test, tagging , shortName);
+		suite.addTest(testCase);
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests.performance/common/org/eclipse/jst/j2ee/tests/performance/EJBProjectCreationTestCase.java b/tests/org.eclipse.jst.j2ee.tests.performance/common/org/eclipse/jst/j2ee/tests/performance/EJBProjectCreationTestCase.java
new file mode 100644
index 0000000..f6d4dc4
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests.performance/common/org/eclipse/jst/j2ee/tests/performance/EJBProjectCreationTestCase.java
@@ -0,0 +1,30 @@
+package org.eclipse.jst.j2ee.tests.performance;
+
+import org.eclipse.test.performance.Dimension;
+import org.eclipse.test.performance.PerformanceTestCase;
+import org.eclipse.wtp.j2ee.headless.tests.ejb.operations.EJBProjectCreationOperationTest;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.JavaEEFacetConstants;
+
+public class EJBProjectCreationTestCase extends PerformanceTestCase {
+
+	public void testEJB30_Defaults() throws Exception {
+		Dimension[] dims = new Dimension[] { Dimension.ELAPSED_PROCESS, Dimension.USED_JAVA_HEAP };
+		tagAsGlobalSummary("EJB project creation", dims);
+		startMeasuring();
+		
+		// Create an EJB 3.0 project with default settings
+		EJBProjectCreationOperationTest.
+			getEJBDataModel("ejb30_defaults",            /* projName */
+							null,                        /* clientName */
+							null,                        /* clientSourceFolder */
+							null,                        /* earName */
+							JavaEEFacetConstants.EJB_3,  /* version */
+							false                        /* createDD */
+			);
+		
+		stopMeasuring();
+		commitMeasurements();
+		assertPerformance();
+	}
+	
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests.performance/common/org/eclipse/jst/j2ee/tests/performance/HeaderParserPerformanceTest.java b/tests/org.eclipse.jst.j2ee.tests.performance/common/org/eclipse/jst/j2ee/tests/performance/HeaderParserPerformanceTest.java
new file mode 100644
index 0000000..33a76e1
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests.performance/common/org/eclipse/jst/j2ee/tests/performance/HeaderParserPerformanceTest.java
@@ -0,0 +1,132 @@
+package org.eclipse.jst.j2ee.tests.performance;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import junit.framework.Assert;
+
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.jee.util.internal.JavaEEQuickPeek;
+import org.eclipse.wst.common.tests.ProjectUtility;
+import org.eclipse.wtp.j2ee.headless.tests.plugin.HeadlessTestsPlugin;
+
+public class HeaderParserPerformanceTest {
+	private static final String DATA_DIR = "TestData" + java.io.File.separatorChar + "headerParserTestData" + java.io.File.separatorChar;
+	
+	public void testSpeed() throws Exception {
+		List data = getXMLData();
+		long[] times = new long[data.size()];
+		InputStream in = null;
+
+		for (int i = 0; i < data.size(); i++) {
+			try {
+				TestData testData = (TestData) data.get(i);
+				in = new FileInputStream(new File(getDataPath(testData.fileName)));
+				long start = System.currentTimeMillis();
+				JavaEEQuickPeek peek = new JavaEEQuickPeek(in);
+				long end = System.currentTimeMillis();
+				times[i] = end - start;
+				if (times[i] == 0) {
+					times[i] = 10; // stub in a minimum time
+				}
+				Assert.assertEquals(testData.type, peek.getType());
+				Assert.assertEquals(testData.modVersion, peek.getVersion());
+				Assert.assertEquals(testData.eeVersion, peek.getJavaEEVersion());
+			} finally {
+				if (in != null) {
+					in.close();
+				}
+			}
+		}
+		// all times should be the same
+		Arrays.sort(times);
+		if (times[0] * 2 < times[times.length - 1]) {
+			Assert.fail();
+		}
+	}
+	
+	private List getXMLData() {
+		List data = new ArrayList();
+		data.add(new TestData("application-client12.xml", J2EEVersionConstants.APPLICATION_CLIENT_TYPE, J2EEVersionConstants.J2EE_1_2_ID, J2EEVersionConstants.J2EE_1_2_ID));
+		data.add(new TestData("application-client13.xml", J2EEVersionConstants.APPLICATION_CLIENT_TYPE, J2EEVersionConstants.J2EE_1_3_ID, J2EEVersionConstants.J2EE_1_3_ID));
+		data.add(new TestData("application-client14.xml", J2EEVersionConstants.APPLICATION_CLIENT_TYPE, J2EEVersionConstants.J2EE_1_4_ID, J2EEVersionConstants.J2EE_1_4_ID));
+		data.add(new TestData("application-client5.xml", J2EEVersionConstants.APPLICATION_CLIENT_TYPE, J2EEVersionConstants.JEE_5_0_ID, J2EEVersionConstants.JEE_5_0_ID));
+
+		data.add(new TestData("application12.xml", J2EEVersionConstants.APPLICATION_TYPE, J2EEVersionConstants.J2EE_1_2_ID, J2EEVersionConstants.J2EE_1_2_ID));
+		data.add(new TestData("application13.xml", J2EEVersionConstants.APPLICATION_TYPE, J2EEVersionConstants.J2EE_1_3_ID, J2EEVersionConstants.J2EE_1_3_ID));
+		data.add(new TestData("application14.xml", J2EEVersionConstants.APPLICATION_TYPE, J2EEVersionConstants.J2EE_1_4_ID, J2EEVersionConstants.J2EE_1_4_ID));
+		data.add(new TestData("application5.xml", J2EEVersionConstants.APPLICATION_TYPE, J2EEVersionConstants.JEE_5_0_ID, J2EEVersionConstants.JEE_5_0_ID));
+
+		data.add(new TestData("ejb-jar11.xml", J2EEVersionConstants.EJB_TYPE, J2EEVersionConstants.EJB_1_1_ID, J2EEVersionConstants.J2EE_1_2_ID));
+		data.add(new TestData("ejb-jar20.xml", J2EEVersionConstants.EJB_TYPE, J2EEVersionConstants.EJB_2_0_ID, J2EEVersionConstants.J2EE_1_3_ID));
+		data.add(new TestData("ejb-jar21.xml", J2EEVersionConstants.EJB_TYPE, J2EEVersionConstants.EJB_2_1_ID, J2EEVersionConstants.J2EE_1_4_ID));
+		data.add(new TestData("ejb-jar30.xml", J2EEVersionConstants.EJB_TYPE, J2EEVersionConstants.EJB_3_0_ID, J2EEVersionConstants.JEE_5_0_ID));
+
+		data.add(new TestData("ra10.xml", J2EEVersionConstants.CONNECTOR_TYPE, J2EEVersionConstants.JCA_1_0_ID, J2EEVersionConstants.J2EE_1_3_ID));
+		data.add(new TestData("ra15.xml", J2EEVersionConstants.CONNECTOR_TYPE, J2EEVersionConstants.JCA_1_5_ID, J2EEVersionConstants.J2EE_1_4_ID));
+
+		data.add(new TestData("web22.xml", J2EEVersionConstants.WEB_TYPE, J2EEVersionConstants.WEB_2_2_ID, J2EEVersionConstants.J2EE_1_2_ID));
+		data.add(new TestData("web23.xml", J2EEVersionConstants.WEB_TYPE, J2EEVersionConstants.WEB_2_3_ID, J2EEVersionConstants.J2EE_1_3_ID));
+		data.add(new TestData("web24.xml", J2EEVersionConstants.WEB_TYPE, J2EEVersionConstants.WEB_2_4_ID, J2EEVersionConstants.J2EE_1_4_ID));
+		data.add(new TestData("web25.xml", J2EEVersionConstants.WEB_TYPE, J2EEVersionConstants.WEB_2_5_ID, J2EEVersionConstants.JEE_5_0_ID));
+
+		// test some bogus dds as well
+		data.add(new TestData("notxml.xml", J2EEVersionConstants.UNKNOWN, J2EEVersionConstants.UNKNOWN, J2EEVersionConstants.UNKNOWN));
+		data.add(new TestData("notjavaee.xml", J2EEVersionConstants.UNKNOWN, J2EEVersionConstants.UNKNOWN, J2EEVersionConstants.UNKNOWN));
+
+		data.add(new TestData("application-client0.xml", J2EEVersionConstants.APPLICATION_CLIENT_TYPE, J2EEVersionConstants.UNKNOWN, J2EEVersionConstants.UNKNOWN));
+		data.add(new TestData("application-client00.xml", J2EEVersionConstants.APPLICATION_CLIENT_TYPE, J2EEVersionConstants.UNKNOWN, J2EEVersionConstants.UNKNOWN));
+		data.add(new TestData("application-client000.xml", J2EEVersionConstants.APPLICATION_CLIENT_TYPE, J2EEVersionConstants.UNKNOWN, J2EEVersionConstants.UNKNOWN));
+
+		data.add(new TestData("application0.xml", J2EEVersionConstants.APPLICATION_TYPE, J2EEVersionConstants.UNKNOWN, J2EEVersionConstants.UNKNOWN));
+		data.add(new TestData("application00.xml", J2EEVersionConstants.APPLICATION_TYPE, J2EEVersionConstants.UNKNOWN, J2EEVersionConstants.UNKNOWN));
+		data.add(new TestData("application000.xml", J2EEVersionConstants.APPLICATION_TYPE, J2EEVersionConstants.UNKNOWN, J2EEVersionConstants.UNKNOWN));
+
+		data.add(new TestData("ejb-jar0.xml", J2EEVersionConstants.EJB_TYPE, J2EEVersionConstants.UNKNOWN, J2EEVersionConstants.UNKNOWN));
+		data.add(new TestData("ejb-jar00.xml", J2EEVersionConstants.EJB_TYPE, J2EEVersionConstants.UNKNOWN, J2EEVersionConstants.UNKNOWN));
+		data.add(new TestData("ejb-jar000.xml", J2EEVersionConstants.EJB_TYPE, J2EEVersionConstants.UNKNOWN, J2EEVersionConstants.UNKNOWN));
+
+		data.add(new TestData("ra0.xml", J2EEVersionConstants.CONNECTOR_TYPE, J2EEVersionConstants.UNKNOWN, J2EEVersionConstants.UNKNOWN));
+		data.add(new TestData("ra00.xml", J2EEVersionConstants.CONNECTOR_TYPE, J2EEVersionConstants.UNKNOWN, J2EEVersionConstants.UNKNOWN));
+		data.add(new TestData("ra000.xml", J2EEVersionConstants.CONNECTOR_TYPE, J2EEVersionConstants.UNKNOWN, J2EEVersionConstants.UNKNOWN));
+
+		data.add(new TestData("web0.xml", J2EEVersionConstants.WEB_TYPE, J2EEVersionConstants.UNKNOWN, J2EEVersionConstants.UNKNOWN));
+		data.add(new TestData("web00.xml", J2EEVersionConstants.WEB_TYPE, J2EEVersionConstants.UNKNOWN, J2EEVersionConstants.UNKNOWN));
+		data.add(new TestData("web000.xml", J2EEVersionConstants.WEB_TYPE, J2EEVersionConstants.UNKNOWN, J2EEVersionConstants.UNKNOWN));
+		return data;
+	}
+	
+	protected String getDataPath(String shortName) throws Exception {
+		HeadlessTestsPlugin plugin = HeadlessTestsPlugin.getDefault();
+		String pluginRelativeFileName = DATA_DIR + java.io.File.separatorChar + shortName;
+		return ProjectUtility.getFullFileName(plugin, pluginRelativeFileName);
+	}
+	
+	private class TestData {
+		String fileName;
+
+		int type;
+
+		int modVersion;
+
+		int eeVersion;
+
+		Class modelObjectInterface;
+
+		public TestData(String fileName, int type, int modVersion, int eeVersion) {
+			this.fileName = fileName;
+			this.type = type;
+			this.modVersion = modVersion;
+			this.eeVersion = eeVersion;
+		}
+
+		public TestData(String fileName, int type, int modVersion, int eeVersion, Class modelTypeClass) {
+			this(fileName, type, modVersion, eeVersion);
+			this.modelObjectInterface = modelTypeClass;
+		}
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests.performance/common/org/eclipse/jst/j2ee/tests/performance/PerformancePlugin.java b/tests/org.eclipse.jst.j2ee.tests.performance/common/org/eclipse/jst/j2ee/tests/performance/PerformancePlugin.java
new file mode 100644
index 0000000..cd55b79
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests.performance/common/org/eclipse/jst/j2ee/tests/performance/PerformancePlugin.java
@@ -0,0 +1,74 @@
+package org.eclipse.jst.j2ee.tests.performance;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The main plugin class to be used in the desktop.
+ */
+public class PerformancePlugin extends AbstractUIPlugin {
+	//The shared instance.
+	private static PerformancePlugin plugin;
+	//Resource bundle.
+	private ResourceBundle resourceBundle;
+	
+	/**
+	 * The constructor.
+	 */
+	public PerformancePlugin() {
+		super();
+		plugin = this;
+	}
+
+	/**
+	 * This method is called upon plug-in activation
+	 */
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+	}
+
+	/**
+	 * This method is called when the plug-in is stopped
+	 */
+	public void stop(BundleContext context) throws Exception {
+		super.stop(context);
+		plugin = null;
+		resourceBundle = null;
+	}
+
+	/**
+	 * Returns the shared instance.
+	 */
+	public static PerformancePlugin getDefault() {
+		return plugin;
+	}
+
+	/**
+	 * Returns the string from the plugin's resource bundle,
+	 * or 'key' if not found.
+	 */
+	public static String getResourceString(String key) {
+		ResourceBundle bundle = PerformancePlugin.getDefault().getResourceBundle();
+		try {
+			return (bundle != null) ? bundle.getString(key) : key;
+		} catch (MissingResourceException e) {
+			return key;
+		}
+	}
+
+	/**
+	 * Returns the plugin's resource bundle,
+	 */
+	public ResourceBundle getResourceBundle() {
+		try {
+			if (resourceBundle == null)
+				resourceBundle = ResourceBundle.getBundle("org.eclipse.jst.j2ee.tests.performance.PerformancePluginResources");
+		} catch (MissingResourceException x) {
+			resourceBundle = null;
+		}
+		return resourceBundle;
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests.performance/common/org/eclipse/jst/j2ee/tests/performance/PerformanceTestCaseWrapper.java b/tests/org.eclipse.jst.j2ee.tests.performance/common/org/eclipse/jst/j2ee/tests/performance/PerformanceTestCaseWrapper.java
new file mode 100644
index 0000000..df87c89
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests.performance/common/org/eclipse/jst/j2ee/tests/performance/PerformanceTestCaseWrapper.java
@@ -0,0 +1,162 @@
+/*
+ * Created on Nov 24, 2004
+ *
+ * TODO To change the template for this generated file go to
+ * Window - Preferences - Java - Code Style - Code Templates
+ */
+package org.eclipse.jst.j2ee.tests.performance;
+
+import junit.framework.Test;
+
+import org.eclipse.test.performance.Dimension;
+import org.eclipse.test.performance.Performance;
+import org.eclipse.test.performance.PerformanceTestCase;
+import org.eclipse.wst.common.tests.BaseTestCase;
+
+/**
+ * @author Admin
+ *
+ * TODO To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Style - Code Templates
+ */
+public  class PerformanceTestCaseWrapper extends PerformanceTestCase {
+	protected BaseTestCase fTest;
+	public static final int NONE = 0;
+	public static final int LOCAL = 1;
+	public static final int GLOBAL = 2;	
+	
+	private boolean tagAsGlobalSummary;
+	private boolean tagAsSummary;
+	private String shortName;
+	
+	public static final int ITERATIONS = 10;
+
+	public PerformanceTestCaseWrapper(BaseTestCase test, 
+									int tagging,
+									String shortName) {
+		fTest=test;
+		tagAsGlobalSummary = ((tagging & GLOBAL) != 0);
+	    tagAsSummary = ((tagging & LOCAL) != 0);
+	    this.shortName =  shortName;
+	}
+	
+	public int countTestCases() {
+		return fTest.countTestCases();
+	}
+	
+	public String toString() {
+		return fTest.toString();
+	}
+
+	public Test getTest() {
+		return fTest;
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.test.performance.PerformanceTestCase#setUp()
+	 */
+	protected void setUp() throws Exception {
+		fTest.setUpTest();
+	}
+	
+	protected void basicSetUp() throws Exception {
+		Performance performance= Performance.getDefault();
+		fPerformanceMeter= performance.createPerformanceMeter(performance.getDefaultScenarioId(fTest));
+	}
+
+	
+	/**
+	 * Runs the bare test sequence.
+	 * @exception Throwable if any exception is thrown
+	 */
+	public void runBare() throws Throwable {
+		basicSetUp();
+		tagIfNecessary(shortName, Dimension.CPU_TIME);
+		try {
+			for (int i= 0; i < ITERATIONS; i++) {
+				setUp();
+				startMeasuring();
+				runTest();
+				stopMeasuring();
+			}
+		} catch (Throwable t) {
+			// log the error, thrown by the JUnit test, in the console and re-throw it
+			t.printStackTrace();
+			throw t;
+		} finally {
+			commitMeasurements();
+			assertPerformance();
+			tearDown();
+		}
+	}
+	
+	/* (non-Javadoc)
+	 * @see junit.framework.TestCase#runTest()
+	 */
+	protected void runTest() throws Throwable {
+		// TODO Auto-generated method stub
+		fTest.runCoreTest();
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.test.performance.PerformanceTestCase#tearDown()
+	 */
+	protected void tearDown() throws Exception {
+		// TODO Auto-generated method stub
+		fTest.tearDownTest();
+	}
+	
+	/* (non-Javadoc)
+	 * @see junit.framework.TestCase#setName(java.lang.String)
+	 */
+	public void setName(String name) {
+		// TODO Auto-generated method stub
+		fTest.setName(name);
+	}
+	
+	/* (non-Javadoc)
+	 * @see junit.framework.TestCase#getName()
+	 */
+	public String getName() {
+		// TODO Auto-generated method stub
+		return fTest.getName();
+	}
+	
+    /**
+     * Answers whether this test should be tagged globally.
+     * 
+     * @return whether this test should be tagged globally
+     */
+    private boolean shouldGloballyTag() {
+    	return tagAsGlobalSummary;
+    }
+    
+    /**
+     * Answers whether this test should be tagged locally.
+     * 
+     * @return whether this test should be tagged locally
+     */
+    private boolean shouldLocallyTag() {
+    	return tagAsSummary;
+    }
+    
+    public void tagIfNecessary(String shortName, Dimension dimension) {
+		if (shouldGloballyTag()) {
+			tagAsGlobalSummary(shortName, dimension);
+		}
+		if (shouldLocallyTag()) {
+			tagAsSummary(shortName, dimension);
+		}
+	}
+	
+	public void tagIfNecessary(String shortName, Dimension [] dimensions) {
+		if (shouldGloballyTag()) {
+			tagAsGlobalSummary(shortName, dimensions);
+		}
+		if (shouldLocallyTag()) {
+			tagAsSummary(shortName, dimensions);
+		}
+	}
+	
+	
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests.performance/common/org/eclipse/jst/j2ee/tests/performance/PerformanceTestObject.java b/tests/org.eclipse.jst.j2ee.tests.performance/common/org/eclipse/jst/j2ee/tests/performance/PerformanceTestObject.java
new file mode 100644
index 0000000..803934e
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests.performance/common/org/eclipse/jst/j2ee/tests/performance/PerformanceTestObject.java
@@ -0,0 +1,47 @@
+/*
+ * Created on Nov 26, 2004
+ *
+ * TODO To change the template for this generated file go to
+ * Window - Preferences - Java - Code Style - Code Templates
+ */
+package org.eclipse.jst.j2ee.tests.performance;
+
+/**
+ * @author Admin
+ *
+ * TODO To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Style - Code Templates
+ */
+public class PerformanceTestObject {
+	int tagging;
+	String shortName;
+	String name;
+	/**
+	 * 
+	 */
+	public PerformanceTestObject(String name,int tagging, String shortname) {
+		super();
+		this.tagging = tagging;
+		this.name = name;
+		this.shortName = shortname;
+	}
+
+	/**
+	 * @return Returns the name.
+	 */
+	public String getName() {
+		return name;
+	}
+	/**
+	 * @return Returns the shortName.
+	 */
+	public String getShortName() {
+		return shortName;
+	}
+	/**
+	 * @return Returns the tagging.
+	 */
+	public int getTagging() {
+		return tagging;
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests.performance/common/org/eclipse/jst/j2ee/tests/performance/PerformanceTestSuite.java b/tests/org.eclipse.jst.j2ee.tests.performance/common/org/eclipse/jst/j2ee/tests/performance/PerformanceTestSuite.java
new file mode 100644
index 0000000..ca28315
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests.performance/common/org/eclipse/jst/j2ee/tests/performance/PerformanceTestSuite.java
@@ -0,0 +1,46 @@
+/**
+ * 
+ */
+package org.eclipse.jst.j2ee.tests.performance;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.wst.common.tests.BaseTestCase;
+
+/**
+ * @author itewk
+ *
+ */
+public class PerformanceTestSuite extends TestSuite {
+	private static final String DEFAULT_SIMPLE_NAME = "Performance Test";
+	
+	/**
+	 * 
+	 * @param name
+	 */
+	public PerformanceTestSuite(String name) {
+		super(name);
+	}
+	
+	public void addTest(Test test) {
+		//must be a BaseTestCase so it can be wrapped in a PerformanceTestCaseWrapper
+		if(test instanceof BaseTestCase) {
+			PerformanceTestCaseWrapper performanceTest = new PerformanceTestCaseWrapper(
+					(BaseTestCase)test,PerformanceTestCaseWrapper.GLOBAL,DEFAULT_SIMPLE_NAME);
+			super.addTest(performanceTest);
+		}
+	}
+	
+	/**
+	 * 
+	 */
+	public void addTest(Test test, String simpleName) {
+		//must be a BaseTestCase so it can be wrapped in a PerformanceTestCaseWrapper
+		if(test instanceof BaseTestCase) {
+			PerformanceTestCaseWrapper performanceTest = new PerformanceTestCaseWrapper(
+					(BaseTestCase)test,PerformanceTestCaseWrapper.GLOBAL,simpleName);
+			super.addTest(performanceTest);
+		}
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests.performance/common/org/eclipse/jst/j2ee/tests/performance/TestCaseSAXParser.java b/tests/org.eclipse.jst.j2ee.tests.performance/common/org/eclipse/jst/j2ee/tests/performance/TestCaseSAXParser.java
new file mode 100644
index 0000000..3189ea0
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests.performance/common/org/eclipse/jst/j2ee/tests/performance/TestCaseSAXParser.java
@@ -0,0 +1,139 @@
+/*
+ * Created on Nov 29, 2004
+ *
+ * TODO To change the template for this generated file go to
+ * Window - Preferences - Java - Code Style - Code Templates
+ */
+package org.eclipse.jst.j2ee.tests.performance;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+/**
+ * @author Admin
+ *
+ * TODO To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Style - Code Templates
+ */
+public class TestCaseSAXParser extends DefaultHandler {
+	private static Map performanceCases = null;
+	private static final String TEST_CASE = "testCase";
+	private static final String CLASS = "class";
+	private static final String METHOD = "method";
+	private static final String SHORT_NAME = "shortName";
+	private static final String TAGGING = "tagging";
+	private static final String METHOD_NAME = "name";
+	private static final String GLOBAL = "GLOBAL";
+	private static final String LOCAL = "LOCAL";
+	private static Class currentClazz = null;
+	
+
+	
+	public Map doLoad(File file) {
+		 performanceCases = new HashMap();
+		 DefaultHandler handler = new TestCaseSAXParser();
+		 SAXParserFactory factory = SAXParserFactory.newInstance();
+		 try {
+		  SAXParser saxParser = factory.newSAXParser();
+		  saxParser.parse(file , handler );
+		 }
+		 catch (ParserConfigurationException ex) {
+		  System.err.println ("Failed to create SAX parser:" + ex);
+		 }
+		 catch (SAXException ex) {
+		  System.err.println ("SAX parser exceeption:" + ex);
+		 }
+		 catch (IOException ex) {
+		  System.err.println ("IO exeception:" + ex);
+		 }
+		 catch (IllegalArgumentException ex) {
+		  System.err.println ("Invalid file argument" + ex);
+		 }
+		 return performanceCases;
+	 }
+	
+	 public void startElement(String uri, String localName, 
+	  String qualifiedName, Attributes attributes) throws SAXException {
+	 	if (qualifiedName.equals(TEST_CASE)) {
+		  for (int i = 0; i< attributes.getLength(); i++) {
+		    if (attributes.getQName(i).equalsIgnoreCase(CLASS)) {
+		    	try {
+		    		currentClazz = loadClass(attributes.getValue(i));
+					if (performanceCases.get(currentClazz) == null) {
+			    		ArrayList methodList = new ArrayList();
+			    		performanceCases.put(currentClazz,methodList);
+		    		}
+				} catch (ClassNotFoundException e) {
+					currentClazz = null;
+					 System.err.println ("Failed to load class:" + attributes.getValue(i));
+					//e.printStackTrace();
+				}
+		    } // end of if
+		  } // end of for
+	 	} // end of if TEST_CASE
+	 	else if (qualifiedName.equalsIgnoreCase(METHOD)) {
+	 		 String methodName = null;
+	 		 int tagging = 0;
+	 		 String shortName = null;
+	 		 
+	 		 if (currentClazz == null) return;
+	 		 
+	 		 for (int i = 0; i< attributes.getLength(); i++) {
+	 		    if (attributes.getQName(i).equalsIgnoreCase(METHOD_NAME)) {
+	 		    	methodName = attributes.getValue(i);
+	 		    } 
+	 		    else if (attributes.getQName(i).equalsIgnoreCase(TAGGING)){
+	 		    	if (attributes.getValue(i).equalsIgnoreCase(GLOBAL)) {
+	 		    		tagging = PerformanceTestCaseWrapper.GLOBAL;
+	 		    	} else if (attributes.getValue(i).equalsIgnoreCase(LOCAL)) {
+	 		    		tagging = PerformanceTestCaseWrapper.LOCAL;
+	 		    	} else {
+	 		    		tagging = PerformanceTestCaseWrapper.NONE;
+	 		    	}
+	 		 	} else if(attributes.getQName(i).equalsIgnoreCase(SHORT_NAME)) {
+	 		 		shortName = attributes.getValue(i);
+	 			}
+	 		 } // end of for
+	 		 List methodList = (List) performanceCases.get(currentClazz);
+	 		 methodList.add(new PerformanceTestObject(methodName,tagging,shortName));
+	 	 }
+	 }
+
+	 public void endElement(String uri, String localName, String qualifiedName)
+	     throws SAXException {
+	    if (qualifiedName.equals(TEST_CASE)) {
+	  		currentClazz = null;
+	  	}
+	 }
+	 
+	 /**
+	 * Loads the test suite class.
+	 */
+	 private Class loadClass(String className) throws ClassNotFoundException {
+		if (className == null) 
+			return null;
+		return getClassLoader().loadClass(className);
+	 }
+	 
+	 /**
+	 * The class loader to be used for loading tests.
+	 * Subclasses may override to use another class loader.
+	 */
+	 protected ClassLoader getClassLoader() {
+		return BasePerformanceTestCase.getClassLoader();
+	 }
+	 
+}
+
diff --git a/tests/org.eclipse.jst.j2ee.tests.performance/common/org/eclipse/jst/j2ee/tests/performance/WTPHeadlessPerformanceTests.java b/tests/org.eclipse.jst.j2ee.tests.performance/common/org/eclipse/jst/j2ee/tests/performance/WTPHeadlessPerformanceTests.java
new file mode 100644
index 0000000..518cdc0
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests.performance/common/org/eclipse/jst/j2ee/tests/performance/WTPHeadlessPerformanceTests.java
@@ -0,0 +1,24 @@
+/**
+ * 
+ */
+package org.eclipse.jst.j2ee.tests.performance;
+
+import junit.framework.Test;
+
+import org.eclipse.wtp.j2ee.headless.tests.ear.operations.EARProjectCreationOperationTest;
+
+/**
+ * @author itewk
+ *
+ */
+public class WTPHeadlessPerformanceTests extends PerformanceTestSuite {
+	public WTPHeadlessPerformanceTests() {
+		super("All WTP Headless Performances Tests");
+		
+		addTest(new EARProjectCreationOperationTest("testEAR14_WithDependencies"), "Test EAR 1.4 Project Creation with Dependincies");
+	}
+	
+	public static Test suite(){
+		return new WTPHeadlessPerformanceTests();
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests.performance/plugin.xml b/tests/org.eclipse.jst.j2ee.tests.performance/plugin.xml
new file mode 100644
index 0000000..87396d6
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests.performance/plugin.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin
+   id="org.eclipse.jst.j2ee.tests.performance"
+   name="Performance Plug-in"
+   version="1.1.0.qualifier"
+   provider-name=""
+   class="org.eclipse.jst.j2ee.tests.performance.PerformancePlugin">
+
+   <runtime>
+      <library name="performance.jar">
+         <export name="*"/>
+      </library>
+   </runtime>
+
+   <requires>
+      <import plugin="org.eclipse.ui"/>
+      <import plugin="org.eclipse.core.runtime"/>
+      <import plugin="org.eclipse.test.performance"/>
+      <import plugin="org.junit"/>
+      <import plugin="org.eclipse.wst.common.tests"/>
+      <import plugin="org.eclipse.jst.j2ee.core"/>
+      <import plugin="org.eclipse.jst.j2ee.tests"/>
+      <import plugin="org.eclipse.wst.common.project.facet.core"/>
+   </requires>
+
+</plugin>
diff --git a/tests/org.eclipse.jst.j2ee.tests.performance/pom.xml b/tests/org.eclipse.jst.j2ee.tests.performance/pom.xml
new file mode 100644
index 0000000..1c36d28
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests.performance/pom.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Copyright (c) 2012, 2013 Eclipse Foundation and others.
+  All rights reserved. This program and the accompanying materials
+  are made available under the terms of the Eclipse Distribution License v1.0
+  which accompanies this distribution, and is available at
+  http://www.eclipse.org/org/documents/edl-v10.php
+ 
+  Contributors:
+    Thanh Ha (Eclipse Foundation) - initial implementation
+-->
+
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.eclipse.webtools.javaee</groupId>
+    <artifactId>javaee.tests</artifactId>
+    <version>3.6.0-SNAPSHOT</version>
+  </parent>
+
+  <groupId>org.eclipse.webtools.javaee</groupId>
+  <artifactId>org.eclipse.jst.j2ee.tests.performance</artifactId>
+  <version>1.1.0-SNAPSHOT</version>
+  <packaging>eclipse-plugin</packaging>
+</project>
diff --git a/tests/org.eclipse.jst.j2ee.tests/.classpath b/tests/org.eclipse.jst.j2ee.tests/.classpath
new file mode 100644
index 0000000..a13b1ce
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/.classpath
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="defect-tests"/>
+	<classpathentry kind="src" path="webmodule-tests"/>
+	<classpathentry kind="src" path="savestrategy-tests"/>
+	<classpathentry kind="src" path="j2ee-tests"/>
+	<classpathentry kind="src" path="j2ee-verifiers"/>
+	<classpathentry kind="src" path="exportmodel-tests"/>
+	<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="output" path="bin"/>
+</classpath>
diff --git a/tests/org.eclipse.jst.j2ee.tests/.cvsignore b/tests/org.eclipse.jst.j2ee.tests/.cvsignore
new file mode 100644
index 0000000..4a8c6e2
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/.cvsignore
@@ -0,0 +1,4 @@
+bin
+build.xml
+temp.folder
+j2ee-tests.jar
diff --git a/tests/org.eclipse.jst.j2ee.tests/.project b/tests/org.eclipse.jst.j2ee.tests/.project
new file mode 100644
index 0000000..ffec9c0
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.jst.j2ee.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/tests/org.eclipse.jst.j2ee.tests/.settings/org.eclipse.jdt.core.prefs b/tests/org.eclipse.jst.j2ee.tests/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..2a57aff
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,59 @@
+#Thu May 10 18:35:31 EDT 2007
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=disabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nullReference=ignore
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=error
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
diff --git a/tests/org.eclipse.jst.j2ee.tests/.settings/org.eclipse.jdt.ui.prefs b/tests/org.eclipse.jst.j2ee.tests/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..5993ccb
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,3 @@
+#Sat Mar 24 11:01:21 EDT 2007
+eclipse.preferences.version=1
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates/>
diff --git a/tests/org.eclipse.jst.j2ee.tests/.settings/org.eclipse.pde.prefs b/tests/org.eclipse.jst.j2ee.tests/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..ed07971
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,15 @@
+#Sat Mar 24 10:56:39 EDT 2007
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=1
+compilers.p.unknown-attribute=1
+compilers.p.unknown-class=1
+compilers.p.unknown-element=1
+compilers.p.unknown-resource=1
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/tests/org.eclipse.jst.j2ee.tests/DefectTestData/149995.ear b/tests/org.eclipse.jst.j2ee.tests/DefectTestData/149995.ear
new file mode 100644
index 0000000..eecabd6
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/DefectTestData/149995.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/DefectTestData/149995BinaryClasspathTest.ear b/tests/org.eclipse.jst.j2ee.tests/DefectTestData/149995BinaryClasspathTest.ear
new file mode 100644
index 0000000..5be9ce7
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/DefectTestData/149995BinaryClasspathTest.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/DefectTestData/BeenThere.ear b/tests/org.eclipse.jst.j2ee.tests/DefectTestData/BeenThere.ear
new file mode 100644
index 0000000..ad26fae
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/DefectTestData/BeenThere.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/DefectTestData/Collision.ear b/tests/org.eclipse.jst.j2ee.tests/DefectTestData/Collision.ear
new file mode 100644
index 0000000..9013a12
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/DefectTestData/Collision.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/DefectTestData/EAR121158.ear/EAR121158Client.jar b/tests/org.eclipse.jst.j2ee.tests/DefectTestData/EAR121158.ear/EAR121158Client.jar
new file mode 100644
index 0000000..df66102
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/DefectTestData/EAR121158.ear/EAR121158Client.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/DefectTestData/EAR121158.ear/EAR121158Connector.rar b/tests/org.eclipse.jst.j2ee.tests/DefectTestData/EAR121158.ear/EAR121158Connector.rar
new file mode 100644
index 0000000..59ba234
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/DefectTestData/EAR121158.ear/EAR121158Connector.rar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/DefectTestData/EAR121158.ear/EAR121158EJB.jar b/tests/org.eclipse.jst.j2ee.tests/DefectTestData/EAR121158.ear/EAR121158EJB.jar
new file mode 100644
index 0000000..b7d5653
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/DefectTestData/EAR121158.ear/EAR121158EJB.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/DefectTestData/EAR121158.ear/EAR121158Util.jar b/tests/org.eclipse.jst.j2ee.tests/DefectTestData/EAR121158.ear/EAR121158Util.jar
new file mode 100644
index 0000000..895c31c
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/DefectTestData/EAR121158.ear/EAR121158Util.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/DefectTestData/EAR121158.ear/EAR121158Web.war b/tests/org.eclipse.jst.j2ee.tests/DefectTestData/EAR121158.ear/EAR121158Web.war
new file mode 100644
index 0000000..0a26939
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/DefectTestData/EAR121158.ear/EAR121158Web.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/DefectTestData/EAR121158.ear/META-INF/MANIFEST.MF b/tests/org.eclipse.jst.j2ee.tests/DefectTestData/EAR121158.ear/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..59499bc
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/DefectTestData/EAR121158.ear/META-INF/MANIFEST.MF
@@ -0,0 +1,2 @@
+Manifest-Version: 1.0
+
diff --git a/tests/org.eclipse.jst.j2ee.tests/DefectTestData/EAR121158.ear/META-INF/application.xml b/tests/org.eclipse.jst.j2ee.tests/DefectTestData/EAR121158.ear/META-INF/application.xml
new file mode 100644
index 0000000..a801dd9
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/DefectTestData/EAR121158.ear/META-INF/application.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<application id="Application_ID" version="1.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/application_1_4.xsd">
+	<display-name>
+	EAR121158</display-name>
+	<module id="WebModule_1144784925194">
+		<web>
+			<web-uri>EAR121158Web.war</web-uri>
+			<context-root>EAR121158Web</context-root>
+		</web>
+	</module>
+	<module id="EjbModule_1144784925224">
+		<ejb>EAR121158EJB.jar</ejb>
+	</module>
+	<module id="JavaClientModule_1144784925234">
+		<java>EAR121158Client.jar</java>
+	</module>
+	<module id="ConnectorModule_1144784925244">
+		<connector>EAR121158Connector.rar</connector>
+	</module>
+</application>
diff --git a/tests/org.eclipse.jst.j2ee.tests/DefectTestData/EARForLibDep.ear b/tests/org.eclipse.jst.j2ee.tests/DefectTestData/EARForLibDep.ear
new file mode 100644
index 0000000..607c538
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/DefectTestData/EARForLibDep.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/DefectTestData/EJBLocalAndRemoteRefEARWithClientJars.ear b/tests/org.eclipse.jst.j2ee.tests/DefectTestData/EJBLocalAndRemoteRefEARWithClientJars.ear
new file mode 100644
index 0000000..129f385
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/DefectTestData/EJBLocalAndRemoteRefEARWithClientJars.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/DefectTestData/Example1.war b/tests/org.eclipse.jst.j2ee.tests/DefectTestData/Example1.war
new file mode 100644
index 0000000..9c30a38
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/DefectTestData/Example1.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/DefectTestData/JarTest.auto.jar b/tests/org.eclipse.jst.j2ee.tests/DefectTestData/JarTest.auto.jar
new file mode 100644
index 0000000..1c607fe
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/DefectTestData/JarTest.auto.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/DefectTestData/JarTest.man.jar b/tests/org.eclipse.jst.j2ee.tests/DefectTestData/JarTest.man.jar
new file mode 100644
index 0000000..fe9e252
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/DefectTestData/JarTest.man.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/DefectTestData/TestCaseSourceNotExported.zip b/tests/org.eclipse.jst.j2ee.tests/DefectTestData/TestCaseSourceNotExported.zip
new file mode 100644
index 0000000..8835354
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/DefectTestData/TestCaseSourceNotExported.zip
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/DefectTestData/WebDavTest.war b/tests/org.eclipse.jst.j2ee.tests/DefectTestData/WebDavTest.war
new file mode 100644
index 0000000..b6c2dc0
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/DefectTestData/WebDavTest.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/DefectTestData/WorkAreaFvtApp.ear b/tests/org.eclipse.jst.j2ee.tests/DefectTestData/WorkAreaFvtApp.ear
new file mode 100644
index 0000000..e28784b
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/DefectTestData/WorkAreaFvtApp.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/DefectTestData/componentLoadAdapterTestData/testblah.war b/tests/org.eclipse.jst.j2ee.tests/DefectTestData/componentLoadAdapterTestData/testblah.war
new file mode 100644
index 0000000..1437373
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/DefectTestData/componentLoadAdapterTestData/testblah.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/DefectTestData/sib.test.mediations.m5.JsMBR.ear b/tests/org.eclipse.jst.j2ee.tests/DefectTestData/sib.test.mediations.m5.JsMBR.ear
new file mode 100644
index 0000000..fe9776b
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/DefectTestData/sib.test.mediations.m5.JsMBR.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/DefectTestData/undeployed_DefaultApplication.ear b/tests/org.eclipse.jst.j2ee.tests/DefectTestData/undeployed_DefaultApplication.ear
new file mode 100644
index 0000000..74b10cf
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/DefectTestData/undeployed_DefaultApplication.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/META-INF/MANIFEST.MF b/tests/org.eclipse.jst.j2ee.tests/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..81a5b5f
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/META-INF/MANIFEST.MF
@@ -0,0 +1,73 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: J2EE Tests Plug-in
+Bundle-SymbolicName: org.eclipse.jst.j2ee.tests; singleton:=true
+Bundle-Version: 1.1.700.qualifier
+Bundle-ClassPath: j2ee-tests.jar
+Bundle-Activator: org.eclipse.wtp.j2ee.headless.tests.plugin.HeadlessTestsPlugin
+Bundle-Localization: plugin
+Export-Package: org.eclipse.jst.common.annotations.tests,
+ org.eclipse.jst.j2ee.bindingshelper.tests,
+ org.eclipse.jst.j2ee.classpath.tests,
+ org.eclipse.jst.j2ee.classpath.tests.util,
+ org.eclipse.jst.j2ee.defect.tests,
+ org.eclipse.jst.j2ee.dependency.tests,
+ org.eclipse.jst.j2ee.dependency.tests.util,
+ org.eclipse.jst.j2ee.flexible.project.apitests.artifactedit,
+ org.eclipse.jst.j2ee.flexible.project.fvtests,
+ org.eclipse.jst.j2ee.flexible.project.tests,
+ org.eclipse.jst.j2ee.project.facet.tests,
+ org.eclipse.jst.j2ee.tests.bvt,
+ org.eclipse.jst.j2ee.tests.modulecore,
+ org.eclipse.jst.jee.model.tests,
+ org.eclipse.wtp.headless.tests.savestrategy,
+ org.eclipse.wtp.j2ee.headless.tests.appclient.operations,
+ org.eclipse.wtp.j2ee.headless.tests.ear.operations,
+ org.eclipse.wtp.j2ee.headless.tests.ejb.operations,
+ org.eclipse.wtp.j2ee.headless.tests.ejb.verifiers,
+ org.eclipse.wtp.j2ee.headless.tests.j2ee.operations,
+ org.eclipse.wtp.j2ee.headless.tests.j2ee.verifiers,
+ org.eclipse.wtp.j2ee.headless.tests.jca.operations,
+ org.eclipse.wtp.j2ee.headless.tests.jca.verifiers,
+ org.eclipse.wtp.j2ee.headless.tests.plugin,
+ org.eclipse.wtp.j2ee.headless.tests.web.container,
+ org.eclipse.wtp.j2ee.headless.tests.web.operations,
+ org.eclipse.wtp.j2ee.headless.tests.web.verifiers
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.core.resources,
+ org.eclipse.core.commands,
+ org.eclipse.jst.common.frameworks,
+ org.eclipse.wst.common.emfworkbench.integration,
+ org.eclipse.wst.common.frameworks,
+ org.eclipse.jst.j2ee.core,
+ org.eclipse.jst.j2ee.web,
+ org.junit,
+ org.eclipse.emf.common,
+ org.eclipse.emf.ecore,
+ org.eclipse.jst.j2ee,
+ org.eclipse.wst.common.modulecore,
+ org.eclipse.jst.j2ee.ejb,
+ org.eclipse.jst.j2ee.jca,
+ org.eclipse.wst.common.tests,
+ org.eclipse.jst.j2ee.core.tests,
+ org.eclipse.wst.server.core,
+ org.eclipse.emf.ecore.xmi,
+ org.eclipse.wst.common.emf,
+ org.eclipse.jst.j2ee.webservice,
+ org.eclipse.jem.util,
+ org.eclipse.jdt.core,
+ org.eclipse.jdt.launching,
+ org.eclipse.wst.web,
+ org.eclipse.wst.common.project.facet.core,
+ org.eclipse.jst.server.core,
+ org.eclipse.jst.common.annotations.core,
+ org.eclipse.wst.validation,
+ org.eclipse.jst.jee,
+ org.eclipse.jst.jee.ejb,
+ org.eclipse.jface.text,
+ org.eclipse.core.filebuffers,
+ org.eclipse.jst.jee.web,
+ org.eclipse.wst.xml.core,
+ org.eclipse.wst.sse.core
+Eclipse-LazyStart: true
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/tests/org.eclipse.jst.j2ee.tests/META-INF/eclipse.inf b/tests/org.eclipse.jst.j2ee.tests/META-INF/eclipse.inf
new file mode 100644
index 0000000..d988f4d
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/META-INF/eclipse.inf
@@ -0,0 +1,5 @@
+# We do not want any nested jars 
+# signed or normalized for packing
+# see bug 274743 Some unit tests are sensitive to details of build
+# https://bugs.eclipse.org/bugs/show_bug.cgi?id=274743
+jarprocessor.exclude=true
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/.cvsignore b/tests/org.eclipse.jst.j2ee.tests/TestData/.cvsignore
new file mode 100644
index 0000000..d30e719
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/.cvsignore
@@ -0,0 +1 @@
+tempOutput
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/AppClientTests/12AppClientTest.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/AppClientTests/12AppClientTest.jar
new file mode 100644
index 0000000..8cce112
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/AppClientTests/12AppClientTest.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/AppClientTests/13AppClient.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/AppClientTests/13AppClient.jar
new file mode 100644
index 0000000..79957c4
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/AppClientTests/13AppClient.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/AppClientTests/13AppClientTest.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/AppClientTests/13AppClientTest.jar
new file mode 100644
index 0000000..f00cf8b
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/AppClientTests/13AppClientTest.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/AppClientTests/AppClientExpTest.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/AppClientTests/AppClientExpTest.jar
new file mode 100644
index 0000000..b3c7ede
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/AppClientTests/AppClientExpTest.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/AppClientTests/AppClientNoSource.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/AppClientTests/AppClientNoSource.jar
new file mode 100644
index 0000000..dbe7dfb
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/AppClientTests/AppClientNoSource.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/AppClientTests/AppClientSomeSource.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/AppClientTests/AppClientSomeSource.jar
new file mode 100644
index 0000000..def98f6
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/AppClientTests/AppClientSomeSource.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/AppClientTests/AppClientSource.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/AppClientTests/AppClientSource.jar
new file mode 100644
index 0000000..eaac33a
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/AppClientTests/AppClientSource.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/BindingsHelperTests/BindingsTestEAR.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/BindingsHelperTests/BindingsTestEAR.ear
new file mode 100644
index 0000000..cbedada
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/BindingsHelperTests/BindingsTestEAR.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/ClasspathDependencyTests/Test1.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/ClasspathDependencyTests/Test1.jar
new file mode 100644
index 0000000..80f089d
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/ClasspathDependencyTests/Test1.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/ClasspathDependencyTests/Test2.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/ClasspathDependencyTests/Test2.jar
new file mode 100644
index 0000000..66c077d
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/ClasspathDependencyTests/Test2.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/ClasspathDependencyTests/Test3.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/ClasspathDependencyTests/Test3.jar
new file mode 100644
index 0000000..7e59767
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/ClasspathDependencyTests/Test3.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/ClasspathDependencyTests/Test3_bin/test/Test3.class b/tests/org.eclipse.jst.j2ee.tests/TestData/ClasspathDependencyTests/Test3_bin/test/Test3.class
new file mode 100644
index 0000000..b0c3c88
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/ClasspathDependencyTests/Test3_bin/test/Test3.class
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/ClasspathDependencyTests/other/Test3.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/ClasspathDependencyTests/other/Test3.jar
new file mode 100644
index 0000000..7e59767
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/ClasspathDependencyTests/other/Test3.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/DefectTests/EJB100441NoClient.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/DefectTests/EJB100441NoClient.jar
new file mode 100644
index 0000000..cb921c6
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/DefectTests/EJB100441NoClient.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/EARImportTests/SimpleEAR.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/EARImportTests/SimpleEAR.ear
new file mode 100644
index 0000000..3bf23c1
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/EARImportTests/SimpleEAR.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/EARImportTests/Test12EJBEAR.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/EARImportTests/Test12EJBEAR.ear
new file mode 100644
index 0000000..e7c8dc9
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/EARImportTests/Test12EJBEAR.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/EARImportTests/Test12WEBEJBEAR.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/EARImportTests/Test12WEBEJBEAR.ear
new file mode 100644
index 0000000..c16da2a
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/EARImportTests/Test12WEBEJBEAR.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/EARImportTests/Test13EJBEAR.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/EARImportTests/Test13EJBEAR.ear
new file mode 100644
index 0000000..edc7beb
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/EARImportTests/Test13EJBEAR.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/EARImportTests/Test13WEBEJBEAR.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/EARImportTests/Test13WEBEJBEAR.ear
new file mode 100644
index 0000000..e932509
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/EARImportTests/Test13WEBEJBEAR.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/EARImportTests/Test14EJBEAR.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/EARImportTests/Test14EJBEAR.ear
new file mode 100644
index 0000000..fd22028
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/EARImportTests/Test14EJBEAR.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/EARImportTests/Test14WEBEJBEAR.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/EARImportTests/Test14WEBEJBEAR.ear
new file mode 100644
index 0000000..86cb493
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/EARImportTests/Test14WEBEJBEAR.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/EARImportTests/Test14WEBEJBEARWithMetaData.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/EARImportTests/Test14WEBEJBEARWithMetaData.ear
new file mode 100644
index 0000000..17b981a
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/EARImportTests/Test14WEBEJBEARWithMetaData.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/EARImportTests/UtilityJarTestEAR.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/EARImportTests/UtilityJarTestEAR.ear
new file mode 100644
index 0000000..cb83101
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/EARImportTests/UtilityJarTestEAR.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/EARImportTests/UtilityJarWebLibWithMetaDataFilesEAR.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/EARImportTests/UtilityJarWebLibWithMetaDataFilesEAR.ear
new file mode 100644
index 0000000..5debb3b
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/EARImportTests/UtilityJarWebLibWithMetaDataFilesEAR.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/EJBImportTests/Test13EJB.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/EJBImportTests/Test13EJB.jar
new file mode 100644
index 0000000..be00332
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/EJBImportTests/Test13EJB.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/EJBImportTests/Test14EJB.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/EJBImportTests/Test14EJB.jar
new file mode 100644
index 0000000..f06f754
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/EJBImportTests/Test14EJB.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/EJBImportTests/TestEJB3.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/EJBImportTests/TestEJB3.jar
new file mode 100644
index 0000000..8980df3
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/EJBImportTests/TestEJB3.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/GenralArtifactTest/J2EEArtifactEditTestProjects.zip b/tests/org.eclipse.jst.j2ee.tests/TestData/GenralArtifactTest/J2EEArtifactEditTestProjects.zip
new file mode 100644
index 0000000..b0a4cf3
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/GenralArtifactTest/J2EEArtifactEditTestProjects.zip
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/GenralArtifactTest/perfWAR.zip b/tests/org.eclipse.jst.j2ee.tests/TestData/GenralArtifactTest/perfWAR.zip
new file mode 100644
index 0000000..98c4b2a
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/GenralArtifactTest/perfWAR.zip
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_AddToEAR_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_AddToEAR_Defaults.jar
new file mode 100644
index 0000000..9278663
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_AddToEAR_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_AddToEAR_InterestingName_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_AddToEAR_InterestingName_Defaults.jar
new file mode 100644
index 0000000..32a4ab4
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_AddToEAR_InterestingName_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_AddToEAR_InterestingName_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_AddToEAR_InterestingName_NoBuild.jar
new file mode 100644
index 0000000..32a4ab4
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_AddToEAR_InterestingName_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_AddToEAR_InterestingName_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_AddToEAR_InterestingName_Source.jar
new file mode 100644
index 0000000..9818ea0
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_AddToEAR_InterestingName_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_AddToEAR_InterestingName_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_AddToEAR_InterestingName_Source_NoBuild.jar
new file mode 100644
index 0000000..9818ea0
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_AddToEAR_InterestingName_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_AddToEAR_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_AddToEAR_NoBuild.jar
new file mode 100644
index 0000000..9278663
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_AddToEAR_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_AddToEAR_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_AddToEAR_Source.jar
new file mode 100644
index 0000000..1474ac0
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_AddToEAR_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_AddToEAR_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_AddToEAR_Source_NoBuild.jar
new file mode 100644
index 0000000..1474ac0
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_AddToEAR_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_Defaults_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_Defaults_Defaults.jar
new file mode 100644
index 0000000..bde3461
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_Defaults_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_Defaults_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_Defaults_NoBuild.jar
new file mode 100644
index 0000000..bde3461
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_Defaults_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_Defaults_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_Defaults_Source.jar
new file mode 100644
index 0000000..636ab26
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_Defaults_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_Defaults_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_Defaults_Source_NoBuild.jar
new file mode 100644
index 0000000..5a7ae5b
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_Defaults_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_InterestingName_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_InterestingName_Defaults.jar
new file mode 100644
index 0000000..68a5d5f
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_InterestingName_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_InterestingName_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_InterestingName_NoBuild.jar
new file mode 100644
index 0000000..68a5d5f
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_InterestingName_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_InterestingName_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_InterestingName_Source.jar
new file mode 100644
index 0000000..6de1dfc
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_InterestingName_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_InterestingName_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_InterestingName_Source_NoBuild.jar
new file mode 100644
index 0000000..6de1dfc
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_InterestingName_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_NoDefaultClass_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_NoDefaultClass_Defaults.jar
new file mode 100644
index 0000000..04b2f24
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_NoDefaultClass_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_NoDefaultClass_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_NoDefaultClass_NoBuild.jar
new file mode 100644
index 0000000..04b2f24
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_NoDefaultClass_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_NoDefaultClass_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_NoDefaultClass_Source.jar
new file mode 100644
index 0000000..b806fae
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_NoDefaultClass_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_NoDefaultClass_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_NoDefaultClass_Source_NoBuild.jar
new file mode 100644
index 0000000..b806fae
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC12_NoDefaultClass_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_AddToEAR_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_AddToEAR_Defaults.jar
new file mode 100644
index 0000000..56cad7d
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_AddToEAR_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_AddToEAR_InterestingName_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_AddToEAR_InterestingName_Defaults.jar
new file mode 100644
index 0000000..7662c87
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_AddToEAR_InterestingName_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_AddToEAR_InterestingName_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_AddToEAR_InterestingName_NoBuild.jar
new file mode 100644
index 0000000..7662c87
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_AddToEAR_InterestingName_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_AddToEAR_InterestingName_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_AddToEAR_InterestingName_Source.jar
new file mode 100644
index 0000000..2e17021
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_AddToEAR_InterestingName_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_AddToEAR_InterestingName_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_AddToEAR_InterestingName_Source_NoBuild.jar
new file mode 100644
index 0000000..2e17021
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_AddToEAR_InterestingName_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_AddToEAR_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_AddToEAR_NoBuild.jar
new file mode 100644
index 0000000..56cad7d
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_AddToEAR_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_AddToEAR_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_AddToEAR_Source.jar
new file mode 100644
index 0000000..e4af3ac
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_AddToEAR_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_AddToEAR_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_AddToEAR_Source_NoBuild.jar
new file mode 100644
index 0000000..e4af3ac
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_AddToEAR_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_Defaults_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_Defaults_Defaults.jar
new file mode 100644
index 0000000..efc6136
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_Defaults_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_Defaults_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_Defaults_NoBuild.jar
new file mode 100644
index 0000000..efc6136
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_Defaults_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_Defaults_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_Defaults_Source.jar
new file mode 100644
index 0000000..4f29ca2
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_Defaults_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_Defaults_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_Defaults_Source_NoBuild.jar
new file mode 100644
index 0000000..4f29ca2
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_Defaults_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_InterestingName_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_InterestingName_Defaults.jar
new file mode 100644
index 0000000..8f19ba9
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_InterestingName_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_InterestingName_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_InterestingName_NoBuild.jar
new file mode 100644
index 0000000..8f19ba9
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_InterestingName_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_InterestingName_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_InterestingName_Source.jar
new file mode 100644
index 0000000..9c3af02
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_InterestingName_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_InterestingName_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_InterestingName_Source_NoBuild.jar
new file mode 100644
index 0000000..9c3af02
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_InterestingName_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_NoDefaultClass_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_NoDefaultClass_Defaults.jar
new file mode 100644
index 0000000..b6fdbfa
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_NoDefaultClass_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_NoDefaultClass_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_NoDefaultClass_NoBuild.jar
new file mode 100644
index 0000000..b6fdbfa
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_NoDefaultClass_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_NoDefaultClass_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_NoDefaultClass_Source.jar
new file mode 100644
index 0000000..c261ea9
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_NoDefaultClass_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_NoDefaultClass_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_NoDefaultClass_Source_NoBuild.jar
new file mode 100644
index 0000000..c261ea9
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC13_NoDefaultClass_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_AddToEAR_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_AddToEAR_Defaults.jar
new file mode 100644
index 0000000..f2f6856
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_AddToEAR_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_AddToEAR_InterestingName_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_AddToEAR_InterestingName_Defaults.jar
new file mode 100644
index 0000000..b859e0b
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_AddToEAR_InterestingName_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_AddToEAR_InterestingName_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_AddToEAR_InterestingName_NoBuild.jar
new file mode 100644
index 0000000..b859e0b
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_AddToEAR_InterestingName_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_AddToEAR_InterestingName_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_AddToEAR_InterestingName_Source.jar
new file mode 100644
index 0000000..2feac4c
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_AddToEAR_InterestingName_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_AddToEAR_InterestingName_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_AddToEAR_InterestingName_Source_NoBuild.jar
new file mode 100644
index 0000000..2feac4c
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_AddToEAR_InterestingName_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_AddToEAR_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_AddToEAR_NoBuild.jar
new file mode 100644
index 0000000..f2f6856
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_AddToEAR_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_AddToEAR_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_AddToEAR_Source.jar
new file mode 100644
index 0000000..cb274be
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_AddToEAR_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_AddToEAR_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_AddToEAR_Source_NoBuild.jar
new file mode 100644
index 0000000..cb274be
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_AddToEAR_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_Defaults_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_Defaults_Defaults.jar
new file mode 100644
index 0000000..2984fb5
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_Defaults_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_Defaults_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_Defaults_NoBuild.jar
new file mode 100644
index 0000000..2984fb5
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_Defaults_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_Defaults_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_Defaults_Source.jar
new file mode 100644
index 0000000..f1ac0d0
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_Defaults_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_Defaults_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_Defaults_Source_NoBuild.jar
new file mode 100644
index 0000000..f1ac0d0
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_Defaults_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_InterestingName_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_InterestingName_Defaults.jar
new file mode 100644
index 0000000..3165ae7
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_InterestingName_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_InterestingName_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_InterestingName_NoBuild.jar
new file mode 100644
index 0000000..3165ae7
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_InterestingName_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_InterestingName_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_InterestingName_Source.jar
new file mode 100644
index 0000000..a566f68
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_InterestingName_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_InterestingName_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_InterestingName_Source_NoBuild.jar
new file mode 100644
index 0000000..a566f68
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_InterestingName_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_NoDefaultClass_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_NoDefaultClass_Defaults.jar
new file mode 100644
index 0000000..78f79ef
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_NoDefaultClass_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_NoDefaultClass_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_NoDefaultClass_NoBuild.jar
new file mode 100644
index 0000000..121a8fa
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_NoDefaultClass_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_NoDefaultClass_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_NoDefaultClass_Source.jar
new file mode 100644
index 0000000..9827b05
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_NoDefaultClass_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_NoDefaultClass_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_NoDefaultClass_Source_NoBuild.jar
new file mode 100644
index 0000000..9827b05
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC14_NoDefaultClass_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_Defaults.jar
new file mode 100644
index 0000000..2d6a578
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_InterestingName_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_InterestingName_Defaults.jar
new file mode 100644
index 0000000..1be3b0e
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_InterestingName_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_InterestingName_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_InterestingName_NoBuild.jar
new file mode 100644
index 0000000..1be3b0e
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_InterestingName_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_InterestingName_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_InterestingName_Source.jar
new file mode 100644
index 0000000..1be3b0e
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_InterestingName_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_InterestingName_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_InterestingName_Source_NoBuild.jar
new file mode 100644
index 0000000..1be3b0e
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_InterestingName_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_InterestingName_WithDD_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_InterestingName_WithDD_Defaults.jar
new file mode 100644
index 0000000..fdf8e88
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_InterestingName_WithDD_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_InterestingName_WithDD_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_InterestingName_WithDD_NoBuild.jar
new file mode 100644
index 0000000..fdf8e88
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_InterestingName_WithDD_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_InterestingName_WithDD_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_InterestingName_WithDD_Source.jar
new file mode 100644
index 0000000..fdf8e88
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_InterestingName_WithDD_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_InterestingName_WithDD_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_InterestingName_WithDD_Source_NoBuild.jar
new file mode 100644
index 0000000..fdf8e88
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_InterestingName_WithDD_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_NoBuild.jar
new file mode 100644
index 0000000..2d6a578
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_Source.jar
new file mode 100644
index 0000000..2d6a578
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_Source_NoBuild.jar
new file mode 100644
index 0000000..2d6a578
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_WithDD_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_WithDD_Defaults.jar
new file mode 100644
index 0000000..b8e2462
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_WithDD_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_WithDD_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_WithDD_NoBuild.jar
new file mode 100644
index 0000000..b8e2462
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_WithDD_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_WithDD_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_WithDD_Source.jar
new file mode 100644
index 0000000..b8e2462
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_WithDD_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_WithDD_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_WithDD_Source_NoBuild.jar
new file mode 100644
index 0000000..b8e2462
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_WithDD_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_Defaults_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_Defaults_Defaults.jar
new file mode 100644
index 0000000..8f4fee5
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_Defaults_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_Defaults_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_Defaults_NoBuild.jar
new file mode 100644
index 0000000..8f4fee5
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_Defaults_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_Defaults_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_Defaults_Source.jar
new file mode 100644
index 0000000..8f4fee5
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_Defaults_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_Defaults_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_Defaults_Source_NoBuild.jar
new file mode 100644
index 0000000..8f4fee5
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_Defaults_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_InterestingName_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_InterestingName_Defaults.jar
new file mode 100644
index 0000000..c5d2706
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_InterestingName_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_InterestingName_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_InterestingName_NoBuild.jar
new file mode 100644
index 0000000..c5d2706
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_InterestingName_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_InterestingName_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_InterestingName_Source.jar
new file mode 100644
index 0000000..c5d2706
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_InterestingName_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_InterestingName_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_InterestingName_Source_NoBuild.jar
new file mode 100644
index 0000000..c5d2706
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_InterestingName_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_NoDefaultClass_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_NoDefaultClass_Defaults.jar
new file mode 100644
index 0000000..1d17147
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_NoDefaultClass_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_NoDefaultClass_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_NoDefaultClass_NoBuild.jar
new file mode 100644
index 0000000..1d17147
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_NoDefaultClass_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_NoDefaultClass_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_NoDefaultClass_Source.jar
new file mode 100644
index 0000000..1d17147
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_NoDefaultClass_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_NoDefaultClass_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_NoDefaultClass_Source_NoBuild.jar
new file mode 100644
index 0000000..1d17147
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_NoDefaultClass_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_NoDefaultClass_WithDD_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_NoDefaultClass_WithDD_Defaults.jar
new file mode 100644
index 0000000..9b07492
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_NoDefaultClass_WithDD_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_NoDefaultClass_WithDD_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_NoDefaultClass_WithDD_NoBuild.jar
new file mode 100644
index 0000000..9b07492
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_NoDefaultClass_WithDD_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_NoDefaultClass_WithDD_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_NoDefaultClass_WithDD_Source.jar
new file mode 100644
index 0000000..9b07492
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_NoDefaultClass_WithDD_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_NoDefaultClass_WithDD_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_NoDefaultClass_WithDD_Source_NoBuild.jar
new file mode 100644
index 0000000..9b07492
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_NoDefaultClass_WithDD_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_WithDD_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_WithDD_Defaults.jar
new file mode 100644
index 0000000..3138c11
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_WithDD_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_WithDD_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_WithDD_NoBuild.jar
new file mode 100644
index 0000000..3138c11
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_WithDD_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_WithDD_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_WithDD_Source.jar
new file mode 100644
index 0000000..3138c11
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_WithDD_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_WithDD_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_WithDD_Source_NoBuild.jar
new file mode 100644
index 0000000..3138c11
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_WithDD_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_AddToEAR_InterestingName_WithDD_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_AddToEAR_InterestingName_WithDD_Defaults.jar
new file mode 100644
index 0000000..a6350a2
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_AddToEAR_InterestingName_WithDD_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_AddToEAR_InterestingName_WithDD_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_AddToEAR_InterestingName_WithDD_NoBuild.jar
new file mode 100644
index 0000000..6319172
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_AddToEAR_InterestingName_WithDD_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_AddToEAR_InterestingName_WithDD_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_AddToEAR_InterestingName_WithDD_Source.jar
new file mode 100644
index 0000000..8afc75c
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_AddToEAR_InterestingName_WithDD_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_AddToEAR_InterestingName_WithDD_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_AddToEAR_InterestingName_WithDD_Source_NoBuild.jar
new file mode 100644
index 0000000..fbc1719
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_AddToEAR_InterestingName_WithDD_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_AddToEAR_WithDD_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_AddToEAR_WithDD_Defaults.jar
new file mode 100644
index 0000000..fd2e0a9
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_AddToEAR_WithDD_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_AddToEAR_WithDD_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_AddToEAR_WithDD_NoBuild.jar
new file mode 100644
index 0000000..a4ec26d
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_AddToEAR_WithDD_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_AddToEAR_WithDD_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_AddToEAR_WithDD_Source.jar
new file mode 100644
index 0000000..7cf87d2
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_AddToEAR_WithDD_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_AddToEAR_WithDD_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_AddToEAR_WithDD_Source_NoBuild.jar
new file mode 100644
index 0000000..5eb844e
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_AddToEAR_WithDD_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_NoDefaultClass_WithDD_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_NoDefaultClass_WithDD_Defaults.jar
new file mode 100644
index 0000000..30abbed
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_NoDefaultClass_WithDD_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_NoDefaultClass_WithDD_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_NoDefaultClass_WithDD_NoBuild.jar
new file mode 100644
index 0000000..9e98f9b
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_NoDefaultClass_WithDD_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_NoDefaultClass_WithDD_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_NoDefaultClass_WithDD_Source.jar
new file mode 100644
index 0000000..8160341
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_NoDefaultClass_WithDD_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_NoDefaultClass_WithDD_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_NoDefaultClass_WithDD_Source_NoBuild.jar
new file mode 100644
index 0000000..4e10e37
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_NoDefaultClass_WithDD_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_WithDD_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_WithDD_Defaults.jar
new file mode 100644
index 0000000..cacb37c
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_WithDD_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_WithDD_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_WithDD_NoBuild.jar
new file mode 100644
index 0000000..de17b04
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_WithDD_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_WithDD_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_WithDD_Source.jar
new file mode 100644
index 0000000..fd4e308
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_WithDD_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_WithDD_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_WithDD_Source_NoBuild.jar
new file mode 100644
index 0000000..6849c8c
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_WithDD_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/288180.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/288180.ear
new file mode 100644
index 0000000..9b158b5
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/288180.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR12_ChangedContentDir_Defaults.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR12_ChangedContentDir_Defaults.ear
new file mode 100644
index 0000000..5ad79f0
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR12_ChangedContentDir_Defaults.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR12_ChangedContentDir_NoBuild.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR12_ChangedContentDir_NoBuild.ear
new file mode 100644
index 0000000..5ad79f0
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR12_ChangedContentDir_NoBuild.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR12_ChangedContentDir_Source.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR12_ChangedContentDir_Source.ear
new file mode 100644
index 0000000..3c7aab1
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR12_ChangedContentDir_Source.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR12_ChangedContentDir_Source_NoBuild.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR12_ChangedContentDir_Source_NoBuild.ear
new file mode 100644
index 0000000..3c7aab1
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR12_ChangedContentDir_Source_NoBuild.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR12_Defaults.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR12_Defaults.ear
new file mode 100644
index 0000000..aeb6f5b
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR12_Defaults.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR12_NoBuild.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR12_NoBuild.ear
new file mode 100644
index 0000000..aeb6f5b
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR12_NoBuild.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR12_Source.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR12_Source.ear
new file mode 100644
index 0000000..21fa565
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR12_Source.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR12_Source_NoBuild.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR12_Source_NoBuild.ear
new file mode 100644
index 0000000..21fa565
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR12_Source_NoBuild.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR13_ChangedContentDir_Defaults.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR13_ChangedContentDir_Defaults.ear
new file mode 100644
index 0000000..ff457d9
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR13_ChangedContentDir_Defaults.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR13_ChangedContentDir_NoBuild.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR13_ChangedContentDir_NoBuild.ear
new file mode 100644
index 0000000..b653464
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR13_ChangedContentDir_NoBuild.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR13_ChangedContentDir_Source.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR13_ChangedContentDir_Source.ear
new file mode 100644
index 0000000..49aad0c
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR13_ChangedContentDir_Source.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR13_ChangedContentDir_Source_NoBuild.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR13_ChangedContentDir_Source_NoBuild.ear
new file mode 100644
index 0000000..9527306
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR13_ChangedContentDir_Source_NoBuild.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR13_Defaults.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR13_Defaults.ear
new file mode 100644
index 0000000..6f31632
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR13_Defaults.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR13_NoBuild.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR13_NoBuild.ear
new file mode 100644
index 0000000..294e7ad
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR13_NoBuild.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR13_Source.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR13_Source.ear
new file mode 100644
index 0000000..b50752e
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR13_Source.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR13_Source_NoBuild.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR13_Source_NoBuild.ear
new file mode 100644
index 0000000..df3a167
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR13_Source_NoBuild.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR14_ChangedContentDir_Defaults.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR14_ChangedContentDir_Defaults.ear
new file mode 100644
index 0000000..a5e4aa5
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR14_ChangedContentDir_Defaults.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR14_ChangedContentDir_NoBuild.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR14_ChangedContentDir_NoBuild.ear
new file mode 100644
index 0000000..e0d0bac
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR14_ChangedContentDir_NoBuild.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR14_ChangedContentDir_Source.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR14_ChangedContentDir_Source.ear
new file mode 100644
index 0000000..d198108
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR14_ChangedContentDir_Source.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR14_ChangedContentDir_Source_NoBuild.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR14_ChangedContentDir_Source_NoBuild.ear
new file mode 100644
index 0000000..e6f515e
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR14_ChangedContentDir_Source_NoBuild.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR14_Defaults.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR14_Defaults.ear
new file mode 100644
index 0000000..fb635f1
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR14_Defaults.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR14_NoBuild.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR14_NoBuild.ear
new file mode 100644
index 0000000..0725a27
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR14_NoBuild.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR14_Source.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR14_Source.ear
new file mode 100644
index 0000000..380f825
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR14_Source.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR14_Source_NoBuild.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR14_Source_NoBuild.ear
new file mode 100644
index 0000000..5a11637
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR14_Source_NoBuild.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR50_ChangedContentDir_Defaults.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR50_ChangedContentDir_Defaults.ear
new file mode 100644
index 0000000..363bf9c
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR50_ChangedContentDir_Defaults.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR50_ChangedContentDir_NoBuild.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR50_ChangedContentDir_NoBuild.ear
new file mode 100644
index 0000000..47a6608
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR50_ChangedContentDir_NoBuild.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR50_ChangedContentDir_Source.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR50_ChangedContentDir_Source.ear
new file mode 100644
index 0000000..f6e1d06
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR50_ChangedContentDir_Source.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR50_ChangedContentDir_Source_NoBuild.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR50_ChangedContentDir_Source_NoBuild.ear
new file mode 100644
index 0000000..2119e36
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR50_ChangedContentDir_Source_NoBuild.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR50_ChangedContentDir_WithDD_Defaults.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR50_ChangedContentDir_WithDD_Defaults.ear
new file mode 100644
index 0000000..87522a2
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR50_ChangedContentDir_WithDD_Defaults.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR50_ChangedContentDir_WithDD_NoBuild.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR50_ChangedContentDir_WithDD_NoBuild.ear
new file mode 100644
index 0000000..19fb5a7
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR50_ChangedContentDir_WithDD_NoBuild.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR50_ChangedContentDir_WithDD_Source.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR50_ChangedContentDir_WithDD_Source.ear
new file mode 100644
index 0000000..2ff4724
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR50_ChangedContentDir_WithDD_Source.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR50_ChangedContentDir_WithDD_Source_NoBuild.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR50_ChangedContentDir_WithDD_Source_NoBuild.ear
new file mode 100644
index 0000000..6bf0da0
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR50_ChangedContentDir_WithDD_Source_NoBuild.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR50_Defaults.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR50_Defaults.ear
new file mode 100644
index 0000000..f060fac
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR50_Defaults.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR50_NoBuild.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR50_NoBuild.ear
new file mode 100644
index 0000000..07e01fa
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR50_NoBuild.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR50_Source.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR50_Source.ear
new file mode 100644
index 0000000..02a80d8
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR50_Source.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR50_Source_NoBuild.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR50_Source_NoBuild.ear
new file mode 100644
index 0000000..ad4e0a6
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR50_Source_NoBuild.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR50_WithDD_Defaults.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR50_WithDD_Defaults.ear
new file mode 100644
index 0000000..ebf22ff
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR50_WithDD_Defaults.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR50_WithDD_NoBuild.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR50_WithDD_NoBuild.ear
new file mode 100644
index 0000000..aa81cc6
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR50_WithDD_NoBuild.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR50_WithDD_Source.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR50_WithDD_Source.ear
new file mode 100644
index 0000000..862ec0c
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR50_WithDD_Source.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR50_WithDD_Source_NoBuild.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR50_WithDD_Source_NoBuild.ear
new file mode 100644
index 0000000..28b573a
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR50_WithDD_Source_NoBuild.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR5NoDD_DependincesNoDDs.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR5NoDD_DependincesNoDDs.ear
new file mode 100644
index 0000000..fd46af6
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR5NoDD_DependincesNoDDs.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR5NoDD_DependincesNoDDsAndWithDDs.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR5NoDD_DependincesNoDDsAndWithDDs.ear
new file mode 100644
index 0000000..a6a5662
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR5NoDD_DependincesNoDDsAndWithDDs.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR5NoDD_DependincesNoDDsAndWithDDs_WithUtil.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR5NoDD_DependincesNoDDsAndWithDDs_WithUtil.ear
new file mode 100644
index 0000000..d6b473f
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR5NoDD_DependincesNoDDsAndWithDDs_WithUtil.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR5NoDD_DependincesNoDDs_WithUtil.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR5NoDD_DependincesNoDDs_WithUtil.ear
new file mode 100644
index 0000000..4fd5821
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR5NoDD_DependincesNoDDs_WithUtil.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR5NoDD_DependincesWithDDs.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR5NoDD_DependincesWithDDs.ear
new file mode 100644
index 0000000..b6c3f5b
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR5NoDD_DependincesWithDDs.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR5NoDD_DependincesWithDDs_WithUtil.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR5NoDD_DependincesWithDDs_WithUtil.ear
new file mode 100644
index 0000000..8e0850d
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR5NoDD_DependincesWithDDs_WithUtil.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR5WithDD_DependincesNoDDs.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR5WithDD_DependincesNoDDs.ear
new file mode 100644
index 0000000..a7d57d9
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR5WithDD_DependincesNoDDs.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR5WithDD_DependincesNoDDsAndWithDDs.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR5WithDD_DependincesNoDDsAndWithDDs.ear
new file mode 100644
index 0000000..d7abc11
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR5WithDD_DependincesNoDDsAndWithDDs.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR5WithDD_DependincesNoDDsAndWithDDs_WithUtil.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR5WithDD_DependincesNoDDsAndWithDDs_WithUtil.ear
new file mode 100644
index 0000000..7334028
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR5WithDD_DependincesNoDDsAndWithDDs_WithUtil.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR5WithDD_DependincesNoDDs_WithUtil.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR5WithDD_DependincesNoDDs_WithUtil.ear
new file mode 100644
index 0000000..655737c
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR5WithDD_DependincesNoDDs_WithUtil.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR5WithDD_DependincesWithDDs.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR5WithDD_DependincesWithDDs.ear
new file mode 100644
index 0000000..790c5cc
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR5WithDD_DependincesWithDDs.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR5WithDD_DependincesWithDDs_WithUtil.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR5WithDD_DependincesWithDDs_WithUtil.ear
new file mode 100644
index 0000000..134505e
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EARImportOperationTest/EAR5WithDD_DependincesWithDDs_WithUtil.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_ChangedEJBClientName_WithSource_DontRunBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_ChangedEJBClientName_WithSource_DontRunBuild.jar
new file mode 100644
index 0000000..c3da7c3
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_ChangedEJBClientName_WithSource_DontRunBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_Defaults_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_Defaults_Defaults.jar
new file mode 100644
index 0000000..ef19d09
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_Defaults_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_Defaults_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_Defaults_NoBuild.jar
new file mode 100644
index 0000000..ef19d09
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_Defaults_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_Defaults_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_Defaults_Source.jar
new file mode 100644
index 0000000..77f5fd2
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_Defaults_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_Defaults_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_Defaults_Source_NoBuild.jar
new file mode 100644
index 0000000..77f5fd2
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_Defaults_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_DiffClientName_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_DiffClientName_Defaults.jar
new file mode 100644
index 0000000..af093f8
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_DiffClientName_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_DiffClientName_DiffClientSourceFolder_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_DiffClientName_DiffClientSourceFolder_Defaults.jar
new file mode 100644
index 0000000..26c9e7f
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_DiffClientName_DiffClientSourceFolder_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_DiffClientName_DiffClientSourceFolder_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_DiffClientName_DiffClientSourceFolder_NoBuild.jar
new file mode 100644
index 0000000..26c9e7f
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_DiffClientName_DiffClientSourceFolder_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_DiffClientName_DiffClientSourceFolder_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_DiffClientName_DiffClientSourceFolder_Source.jar
new file mode 100644
index 0000000..aa96083
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_DiffClientName_DiffClientSourceFolder_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_DiffClientName_DiffClientSourceFolder_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_DiffClientName_DiffClientSourceFolder_Source_NoBuild.jar
new file mode 100644
index 0000000..aa96083
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_DiffClientName_DiffClientSourceFolder_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_DiffClientName_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_DiffClientName_NoBuild.jar
new file mode 100644
index 0000000..af093f8
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_DiffClientName_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_DiffClientName_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_DiffClientName_Source.jar
new file mode 100644
index 0000000..c3da7c3
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_DiffClientName_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_DiffClientName_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_DiffClientName_Source_NoBuild.jar
new file mode 100644
index 0000000..c3da7c3
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_DiffClientName_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_DiffClientSourceFolder_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_DiffClientSourceFolder_Defaults.jar
new file mode 100644
index 0000000..28e57b0
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_DiffClientSourceFolder_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_DiffClientSourceFolder_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_DiffClientSourceFolder_NoBuild.jar
new file mode 100644
index 0000000..28e57b0
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_DiffClientSourceFolder_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_DiffClientSourceFolder_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_DiffClientSourceFolder_Source.jar
new file mode 100644
index 0000000..7f4dcd4
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_DiffClientSourceFolder_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_DiffClientSourceFolder_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_DiffClientSourceFolder_Source_NoBuild.jar
new file mode 100644
index 0000000..7f4dcd4
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_DiffClientSourceFolder_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_NoClient_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_NoClient_Defaults.jar
new file mode 100644
index 0000000..f414ec8
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_NoClient_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_NoClient_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_NoClient_NoBuild.jar
new file mode 100644
index 0000000..f414ec8
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_NoClient_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_NoClient_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_NoClient_Source.jar
new file mode 100644
index 0000000..3b60d44
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_NoClient_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_NoClient_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_NoClient_Source_NoBuild.jar
new file mode 100644
index 0000000..3b60d44
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_AddToEAR_NoClient_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_Defaults_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_Defaults_Defaults.jar
new file mode 100644
index 0000000..cc772d9
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_Defaults_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_Defaults_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_Defaults_NoBuild.jar
new file mode 100644
index 0000000..0871820
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_Defaults_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_Defaults_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_Defaults_Source.jar
new file mode 100644
index 0000000..e7e7ff3
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_Defaults_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_Defaults_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_Defaults_Source_NoBuild.jar
new file mode 100644
index 0000000..65262e2
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB11_Defaults_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_Defaults_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_Defaults_Defaults.jar
new file mode 100644
index 0000000..bb53172
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_Defaults_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_Defaults_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_Defaults_NoBuild.jar
new file mode 100644
index 0000000..bb53172
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_Defaults_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_Defaults_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_Defaults_Source.jar
new file mode 100644
index 0000000..08e2d29
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_Defaults_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_Defaults_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_Defaults_Source_NoBuild.jar
new file mode 100644
index 0000000..08e2d29
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_Defaults_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_DiffClientName_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_DiffClientName_Defaults.jar
new file mode 100644
index 0000000..467ac40
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_DiffClientName_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_DiffClientName_DiffClientSourceFolder_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_DiffClientName_DiffClientSourceFolder_Defaults.jar
new file mode 100644
index 0000000..b0e0e79
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_DiffClientName_DiffClientSourceFolder_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_DiffClientName_DiffClientSourceFolder_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_DiffClientName_DiffClientSourceFolder_NoBuild.jar
new file mode 100644
index 0000000..b0e0e79
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_DiffClientName_DiffClientSourceFolder_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_DiffClientName_DiffClientSourceFolder_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_DiffClientName_DiffClientSourceFolder_Source.jar
new file mode 100644
index 0000000..243122c
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_DiffClientName_DiffClientSourceFolder_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_DiffClientName_DiffClientSourceFolder_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_DiffClientName_DiffClientSourceFolder_Source_NoBuild.jar
new file mode 100644
index 0000000..243122c
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_DiffClientName_DiffClientSourceFolder_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_DiffClientName_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_DiffClientName_NoBuild.jar
new file mode 100644
index 0000000..467ac40
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_DiffClientName_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_DiffClientName_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_DiffClientName_Source.jar
new file mode 100644
index 0000000..b0c17fa
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_DiffClientName_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_DiffClientName_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_DiffClientName_Source_NoBuild.jar
new file mode 100644
index 0000000..b0c17fa
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_DiffClientName_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_DiffClientSourceFolder_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_DiffClientSourceFolder_Defaults.jar
new file mode 100644
index 0000000..6fa6d96
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_DiffClientSourceFolder_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_DiffClientSourceFolder_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_DiffClientSourceFolder_NoBuild.jar
new file mode 100644
index 0000000..6fa6d96
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_DiffClientSourceFolder_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_DiffClientSourceFolder_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_DiffClientSourceFolder_Source.jar
new file mode 100644
index 0000000..2d10a5c
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_DiffClientSourceFolder_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_DiffClientSourceFolder_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_DiffClientSourceFolder_Source_NoBuild.jar
new file mode 100644
index 0000000..2d10a5c
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_DiffClientSourceFolder_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_NoClient_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_NoClient_Defaults.jar
new file mode 100644
index 0000000..a662a82
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_NoClient_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_NoClient_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_NoClient_NoBuild.jar
new file mode 100644
index 0000000..a662a82
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_NoClient_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_NoClient_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_NoClient_Source.jar
new file mode 100644
index 0000000..33ca119
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_NoClient_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_NoClient_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_NoClient_Source_NoBuild.jar
new file mode 100644
index 0000000..33ca119
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_AddToEAR_NoClient_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_Defaults_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_Defaults_Defaults.jar
new file mode 100644
index 0000000..cbb0a80
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_Defaults_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_Defaults_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_Defaults_NoBuild.jar
new file mode 100644
index 0000000..cbb0a80
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_Defaults_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_Defaults_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_Defaults_Source.jar
new file mode 100644
index 0000000..3b429d4
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_Defaults_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_Defaults_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_Defaults_Source_NoBuild.jar
new file mode 100644
index 0000000..3b429d4
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB20_Defaults_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_Defaults_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_Defaults_Defaults.jar
new file mode 100644
index 0000000..24ceea3
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_Defaults_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_Defaults_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_Defaults_NoBuild.jar
new file mode 100644
index 0000000..24ceea3
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_Defaults_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_Defaults_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_Defaults_Source.jar
new file mode 100644
index 0000000..3ef57cd
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_Defaults_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_Defaults_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_Defaults_Source_NoBuild.jar
new file mode 100644
index 0000000..3ef57cd
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_Defaults_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_DiffClientName_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_DiffClientName_Defaults.jar
new file mode 100644
index 0000000..3e89dad
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_DiffClientName_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_DiffClientName_DiffClientSourceFolder_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_DiffClientName_DiffClientSourceFolder_Defaults.jar
new file mode 100644
index 0000000..2748913
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_DiffClientName_DiffClientSourceFolder_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_DiffClientName_DiffClientSourceFolder_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_DiffClientName_DiffClientSourceFolder_NoBuild.jar
new file mode 100644
index 0000000..2748913
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_DiffClientName_DiffClientSourceFolder_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_DiffClientName_DiffClientSourceFolder_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_DiffClientName_DiffClientSourceFolder_Source.jar
new file mode 100644
index 0000000..82ff7a7
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_DiffClientName_DiffClientSourceFolder_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_DiffClientName_DiffClientSourceFolder_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_DiffClientName_DiffClientSourceFolder_Source_NoBuild.jar
new file mode 100644
index 0000000..82ff7a7
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_DiffClientName_DiffClientSourceFolder_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_DiffClientName_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_DiffClientName_NoBuild.jar
new file mode 100644
index 0000000..3e89dad
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_DiffClientName_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_DiffClientName_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_DiffClientName_Source.jar
new file mode 100644
index 0000000..7245974
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_DiffClientName_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_DiffClientName_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_DiffClientName_Source_NoBuild.jar
new file mode 100644
index 0000000..7245974
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_DiffClientName_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_DiffClientSourceFolder_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_DiffClientSourceFolder_Defaults.jar
new file mode 100644
index 0000000..e4b6574
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_DiffClientSourceFolder_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_DiffClientSourceFolder_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_DiffClientSourceFolder_NoBuild.jar
new file mode 100644
index 0000000..e4b6574
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_DiffClientSourceFolder_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_DiffClientSourceFolder_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_DiffClientSourceFolder_Source.jar
new file mode 100644
index 0000000..ffcf785
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_DiffClientSourceFolder_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_DiffClientSourceFolder_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_DiffClientSourceFolder_Source_NoBuild.jar
new file mode 100644
index 0000000..ffcf785
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_DiffClientSourceFolder_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_NoClient_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_NoClient_Defaults.jar
new file mode 100644
index 0000000..1c17815
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_NoClient_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_NoClient_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_NoClient_NoBuild.jar
new file mode 100644
index 0000000..1c17815
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_NoClient_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_NoClient_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_NoClient_Source.jar
new file mode 100644
index 0000000..252c0bb
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_NoClient_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_NoClient_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_NoClient_Source_NoBuild.jar
new file mode 100644
index 0000000..252c0bb
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_AddToEAR_NoClient_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_Defaults_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_Defaults_Defaults.jar
new file mode 100644
index 0000000..e81c497
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_Defaults_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_Defaults_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_Defaults_NoBuild.jar
new file mode 100644
index 0000000..e81c497
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_Defaults_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_Defaults_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_Defaults_Source.jar
new file mode 100644
index 0000000..fd864ff
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_Defaults_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_Defaults_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_Defaults_Source_NoBuild.jar
new file mode 100644
index 0000000..fd864ff
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB21_Defaults_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_Defaults_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_Defaults_Defaults.jar
new file mode 100644
index 0000000..b09afce
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_Defaults_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_Defaults_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_Defaults_NoBuild.jar
new file mode 100644
index 0000000..da70bea
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_Defaults_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_Defaults_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_Defaults_Source.jar
new file mode 100644
index 0000000..da70bea
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_Defaults_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_Defaults_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_Defaults_Source_NoBuild.jar
new file mode 100644
index 0000000..da70bea
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_Defaults_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_Defaults_WithDD_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_Defaults_WithDD_Defaults.jar
new file mode 100644
index 0000000..68b41b9
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_Defaults_WithDD_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_Defaults_WithDD_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_Defaults_WithDD_NoBuild.jar
new file mode 100644
index 0000000..68b41b9
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_Defaults_WithDD_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_Defaults_WithDD_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_Defaults_WithDD_Source.jar
new file mode 100644
index 0000000..68b41b9
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_Defaults_WithDD_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_Defaults_WithDD_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_Defaults_WithDD_Source_NoBuild.jar
new file mode 100644
index 0000000..68b41b9
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_Defaults_WithDD_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_Defaults.jar
new file mode 100644
index 0000000..0b4213a
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_DiffClientSourceFolder_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_DiffClientSourceFolder_Defaults.jar
new file mode 100644
index 0000000..bce64a3
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_DiffClientSourceFolder_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_DiffClientSourceFolder_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_DiffClientSourceFolder_NoBuild.jar
new file mode 100644
index 0000000..bce64a3
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_DiffClientSourceFolder_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_DiffClientSourceFolder_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_DiffClientSourceFolder_Source.jar
new file mode 100644
index 0000000..bce64a3
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_DiffClientSourceFolder_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_DiffClientSourceFolder_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_DiffClientSourceFolder_Source_NoBuild.jar
new file mode 100644
index 0000000..bce64a3
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_DiffClientSourceFolder_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_DiffClientSourceFolder_WithDD_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_DiffClientSourceFolder_WithDD_Defaults.jar
new file mode 100644
index 0000000..9bc5576
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_DiffClientSourceFolder_WithDD_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_DiffClientSourceFolder_WithDD_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_DiffClientSourceFolder_WithDD_NoBuild.jar
new file mode 100644
index 0000000..9bc5576
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_DiffClientSourceFolder_WithDD_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_DiffClientSourceFolder_WithDD_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_DiffClientSourceFolder_WithDD_Source.jar
new file mode 100644
index 0000000..9bc5576
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_DiffClientSourceFolder_WithDD_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_DiffClientSourceFolder_WithDD_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_DiffClientSourceFolder_WithDD_Source_NoBuild.jar
new file mode 100644
index 0000000..9bc5576
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_DiffClientSourceFolder_WithDD_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_NoBuild.jar
new file mode 100644
index 0000000..0b4213a
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_Source.jar
new file mode 100644
index 0000000..0b4213a
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_Source_NoBuild.jar
new file mode 100644
index 0000000..0b4213a
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_WithDD_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_WithDD_Defaults.jar
new file mode 100644
index 0000000..5709ab3
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_WithDD_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_WithDD_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_WithDD_NoBuild.jar
new file mode 100644
index 0000000..5709ab3
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_WithDD_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_WithDD_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_WithDD_Source.jar
new file mode 100644
index 0000000..5709ab3
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_WithDD_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_WithDD_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_WithDD_Source_NoBuild.jar
new file mode 100644
index 0000000..5709ab3
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_WithDD_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientSourceFolder_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientSourceFolder_Defaults.jar
new file mode 100644
index 0000000..7a3f0bd
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientSourceFolder_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientSourceFolder_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientSourceFolder_NoBuild.jar
new file mode 100644
index 0000000..7a3f0bd
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientSourceFolder_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientSourceFolder_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientSourceFolder_Source.jar
new file mode 100644
index 0000000..7a3f0bd
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientSourceFolder_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientSourceFolder_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientSourceFolder_Source_NoBuild.jar
new file mode 100644
index 0000000..7a3f0bd
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientSourceFolder_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientSourceFolder_WithDD_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientSourceFolder_WithDD_Defaults.jar
new file mode 100644
index 0000000..0a5644c
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientSourceFolder_WithDD_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientSourceFolder_WithDD_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientSourceFolder_WithDD_NoBuild.jar
new file mode 100644
index 0000000..0a5644c
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientSourceFolder_WithDD_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientSourceFolder_WithDD_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientSourceFolder_WithDD_Source.jar
new file mode 100644
index 0000000..0a5644c
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientSourceFolder_WithDD_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientSourceFolder_WithDD_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientSourceFolder_WithDD_Source_NoBuild.jar
new file mode 100644
index 0000000..0a5644c
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientSourceFolder_WithDD_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_NoClient_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_NoClient_Defaults.jar
new file mode 100644
index 0000000..ee27df2
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_NoClient_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_NoClient_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_NoClient_NoBuild.jar
new file mode 100644
index 0000000..ee27df2
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_NoClient_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_NoClient_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_NoClient_Source.jar
new file mode 100644
index 0000000..ee27df2
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_NoClient_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_NoClient_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_NoClient_Source_NoBuild.jar
new file mode 100644
index 0000000..ee27df2
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_NoClient_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_NoClient_WithDD_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_NoClient_WithDD_Defaults.jar
new file mode 100644
index 0000000..98ef23c
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_NoClient_WithDD_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_NoClient_WithDD_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_NoClient_WithDD_NoBuild.jar
new file mode 100644
index 0000000..98ef23c
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_NoClient_WithDD_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_NoClient_WithDD_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_NoClient_WithDD_Source.jar
new file mode 100644
index 0000000..98ef23c
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_NoClient_WithDD_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_NoClient_WithDD_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_NoClient_WithDD_Source_NoBuild.jar
new file mode 100644
index 0000000..98ef23c
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_NoClient_WithDD_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_Defaults_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_Defaults_Defaults.jar
new file mode 100644
index 0000000..ae70f7a
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_Defaults_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_Defaults_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_Defaults_NoBuild.jar
new file mode 100644
index 0000000..ae70f7a
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_Defaults_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_Defaults_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_Defaults_Source.jar
new file mode 100644
index 0000000..ae70f7a
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_Defaults_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_Defaults_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_Defaults_Source_NoBuild.jar
new file mode 100644
index 0000000..ae70f7a
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_Defaults_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_Defaults_WithDD_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_Defaults_WithDD_Defaults.jar
new file mode 100644
index 0000000..6a2cadc
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_Defaults_WithDD_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_Defaults_WithDD_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_Defaults_WithDD_NoBuild.jar
new file mode 100644
index 0000000..6a2cadc
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_Defaults_WithDD_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_Defaults_WithDD_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_Defaults_WithDD_Source.jar
new file mode 100644
index 0000000..6a2cadc
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_Defaults_WithDD_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_Defaults_WithDD_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_Defaults_WithDD_Source_NoBuild.jar
new file mode 100644
index 0000000..6a2cadc
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_Defaults_WithDD_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_Defaults_WithDD_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_Defaults_WithDD_Defaults.jar
new file mode 100644
index 0000000..183137e
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_Defaults_WithDD_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_Defaults_WithDD_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_Defaults_WithDD_NoBuild.jar
new file mode 100644
index 0000000..99e278a
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_Defaults_WithDD_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_Defaults_WithDD_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_Defaults_WithDD_Source.jar
new file mode 100644
index 0000000..3fdead6
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_Defaults_WithDD_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_Defaults_WithDD_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_Defaults_WithDD_Source_NoBuild.jar
new file mode 100644
index 0000000..aa208aa
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_Defaults_WithDD_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientName_DiffClientSourceFolder_WithDD_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientName_DiffClientSourceFolder_WithDD_Defaults.jar
new file mode 100644
index 0000000..17d5b5c
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientName_DiffClientSourceFolder_WithDD_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientName_DiffClientSourceFolder_WithDD_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientName_DiffClientSourceFolder_WithDD_NoBuild.jar
new file mode 100644
index 0000000..0422489
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientName_DiffClientSourceFolder_WithDD_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientName_DiffClientSourceFolder_WithDD_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientName_DiffClientSourceFolder_WithDD_Source.jar
new file mode 100644
index 0000000..274aaf5
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientName_DiffClientSourceFolder_WithDD_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientName_DiffClientSourceFolder_WithDD_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientName_DiffClientSourceFolder_WithDD_Source_NoBuild.jar
new file mode 100644
index 0000000..9fd3d2c
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientName_DiffClientSourceFolder_WithDD_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientName_WithDD_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientName_WithDD_Defaults.jar
new file mode 100644
index 0000000..af93e19
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientName_WithDD_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientName_WithDD_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientName_WithDD_NoBuild.jar
new file mode 100644
index 0000000..8342436
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientName_WithDD_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientName_WithDD_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientName_WithDD_Source.jar
new file mode 100644
index 0000000..a88a79e
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientName_WithDD_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientName_WithDD_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientName_WithDD_Source_NoBuild.jar
new file mode 100644
index 0000000..d19297e
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientName_WithDD_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientSourceFolder_WithDD_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientSourceFolder_WithDD_Defaults.jar
new file mode 100644
index 0000000..c9f8808
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientSourceFolder_WithDD_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientSourceFolder_WithDD_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientSourceFolder_WithDD_NoBuild.jar
new file mode 100644
index 0000000..46f09c5
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientSourceFolder_WithDD_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientSourceFolder_WithDD_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientSourceFolder_WithDD_Source.jar
new file mode 100644
index 0000000..2346692
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientSourceFolder_WithDD_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientSourceFolder_WithDD_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientSourceFolder_WithDD_Source_NoBuild.jar
new file mode 100644
index 0000000..da365c3
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientSourceFolder_WithDD_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_NoClient_WithDD_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_NoClient_WithDD_Defaults.jar
new file mode 100644
index 0000000..ffcaa28
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_NoClient_WithDD_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_NoClient_WithDD_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_NoClient_WithDD_NoBuild.jar
new file mode 100644
index 0000000..5f7dde6
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_NoClient_WithDD_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_NoClient_WithDD_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_NoClient_WithDD_Source.jar
new file mode 100644
index 0000000..26cb865
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_NoClient_WithDD_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_NoClient_WithDD_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_NoClient_WithDD_Source_NoBuild.jar
new file mode 100644
index 0000000..38db407
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_NoClient_WithDD_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_Defaults_WithDD_Defaults.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_Defaults_WithDD_Defaults.jar
new file mode 100644
index 0000000..dd0647d
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_Defaults_WithDD_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_Defaults_WithDD_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_Defaults_WithDD_NoBuild.jar
new file mode 100644
index 0000000..2592c8b
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_Defaults_WithDD_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_Defaults_WithDD_Source.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_Defaults_WithDD_Source.jar
new file mode 100644
index 0000000..731966f
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_Defaults_WithDD_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_Defaults_WithDD_Source_NoBuild.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_Defaults_WithDD_Source_NoBuild.jar
new file mode 100644
index 0000000..2e2d5c3
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_Defaults_WithDD_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector10_Defaults_Defaults.rar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector10_Defaults_Defaults.rar
new file mode 100644
index 0000000..3f56492
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector10_Defaults_Defaults.rar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector10_Defaults_NoBuild.rar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector10_Defaults_NoBuild.rar
new file mode 100644
index 0000000..742c03d
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector10_Defaults_NoBuild.rar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector10_Defaults_Source.rar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector10_Defaults_Source.rar
new file mode 100644
index 0000000..1caa2b3
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector10_Defaults_Source.rar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector10_Defaults_Source_NoBuild.rar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector10_Defaults_Source_NoBuild.rar
new file mode 100644
index 0000000..1caa2b3
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector10_Defaults_Source_NoBuild.rar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector10_DiffSourceFolder_Defaults.rar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector10_DiffSourceFolder_Defaults.rar
new file mode 100644
index 0000000..b63fb89
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector10_DiffSourceFolder_Defaults.rar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector10_DiffSourceFolder_NoBuild.rar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector10_DiffSourceFolder_NoBuild.rar
new file mode 100644
index 0000000..b63fb89
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector10_DiffSourceFolder_NoBuild.rar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector10_DiffSourceFolder_Source.rar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector10_DiffSourceFolder_Source.rar
new file mode 100644
index 0000000..a09685f
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector10_DiffSourceFolder_Source.rar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector10_DiffSourceFolder_Source_NoBuild.rar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector10_DiffSourceFolder_Source_NoBuild.rar
new file mode 100644
index 0000000..a09685f
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector10_DiffSourceFolder_Source_NoBuild.rar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector10_DiffSourceFolder_WithEAR_Defaults.rar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector10_DiffSourceFolder_WithEAR_Defaults.rar
new file mode 100644
index 0000000..f03ca40
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector10_DiffSourceFolder_WithEAR_Defaults.rar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector10_DiffSourceFolder_WithEAR_NoBuild.rar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector10_DiffSourceFolder_WithEAR_NoBuild.rar
new file mode 100644
index 0000000..f03ca40
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector10_DiffSourceFolder_WithEAR_NoBuild.rar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector10_DiffSourceFolder_WithEAR_Source.rar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector10_DiffSourceFolder_WithEAR_Source.rar
new file mode 100644
index 0000000..68d4fb3
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector10_DiffSourceFolder_WithEAR_Source.rar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector10_DiffSourceFolder_WithEAR_Source_NoBuild.rar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector10_DiffSourceFolder_WithEAR_Source_NoBuild.rar
new file mode 100644
index 0000000..68d4fb3
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector10_DiffSourceFolder_WithEAR_Source_NoBuild.rar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector10_WithEAR_Defaults.rar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector10_WithEAR_Defaults.rar
new file mode 100644
index 0000000..9505a63
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector10_WithEAR_Defaults.rar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector10_WithEAR_NoBuild.rar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector10_WithEAR_NoBuild.rar
new file mode 100644
index 0000000..9505a63
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector10_WithEAR_NoBuild.rar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector10_WithEAR_Source.rar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector10_WithEAR_Source.rar
new file mode 100644
index 0000000..0fc6936
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector10_WithEAR_Source.rar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector10_WithEAR_Source_NoBuild.rar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector10_WithEAR_Source_NoBuild.rar
new file mode 100644
index 0000000..0fc6936
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector10_WithEAR_Source_NoBuild.rar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector15_Defaults_Defaults.rar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector15_Defaults_Defaults.rar
new file mode 100644
index 0000000..8fbe6a0
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector15_Defaults_Defaults.rar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector15_Defaults_NoBuild.rar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector15_Defaults_NoBuild.rar
new file mode 100644
index 0000000..8fbe6a0
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector15_Defaults_NoBuild.rar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector15_Defaults_Source.rar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector15_Defaults_Source.rar
new file mode 100644
index 0000000..6efe066
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector15_Defaults_Source.rar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector15_Defaults_Source_NoBuild.rar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector15_Defaults_Source_NoBuild.rar
new file mode 100644
index 0000000..6efe066
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector15_Defaults_Source_NoBuild.rar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector15_DiffSourceFolder_Defaults.rar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector15_DiffSourceFolder_Defaults.rar
new file mode 100644
index 0000000..d4860d0
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector15_DiffSourceFolder_Defaults.rar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector15_DiffSourceFolder_NoBuild.rar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector15_DiffSourceFolder_NoBuild.rar
new file mode 100644
index 0000000..25aeecb
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector15_DiffSourceFolder_NoBuild.rar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector15_DiffSourceFolder_Source.rar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector15_DiffSourceFolder_Source.rar
new file mode 100644
index 0000000..5c4a27f
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector15_DiffSourceFolder_Source.rar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector15_DiffSourceFolder_Source_NoBuild.rar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector15_DiffSourceFolder_Source_NoBuild.rar
new file mode 100644
index 0000000..1e812b0
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector15_DiffSourceFolder_Source_NoBuild.rar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector15_DiffSourceFolder_WithEAR_Defaults.rar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector15_DiffSourceFolder_WithEAR_Defaults.rar
new file mode 100644
index 0000000..4a6626f
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector15_DiffSourceFolder_WithEAR_Defaults.rar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector15_DiffSourceFolder_WithEAR_NoBuild.rar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector15_DiffSourceFolder_WithEAR_NoBuild.rar
new file mode 100644
index 0000000..4a6626f
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector15_DiffSourceFolder_WithEAR_NoBuild.rar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector15_DiffSourceFolder_WithEAR_Source.rar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector15_DiffSourceFolder_WithEAR_Source.rar
new file mode 100644
index 0000000..f3a9b5a
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector15_DiffSourceFolder_WithEAR_Source.rar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector15_DiffSourceFolder_WithEAR_Source_NoBuild.rar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector15_DiffSourceFolder_WithEAR_Source_NoBuild.rar
new file mode 100644
index 0000000..f3a9b5a
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector15_DiffSourceFolder_WithEAR_Source_NoBuild.rar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector15_WithEAR_Defaults.rar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector15_WithEAR_Defaults.rar
new file mode 100644
index 0000000..5f0cabe
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector15_WithEAR_Defaults.rar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector15_WithEAR_NoBuild.rar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector15_WithEAR_NoBuild.rar
new file mode 100644
index 0000000..5f0cabe
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector15_WithEAR_NoBuild.rar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector15_WithEAR_Source.rar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector15_WithEAR_Source.rar
new file mode 100644
index 0000000..32134db
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector15_WithEAR_Source.rar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector15_WithEAR_Source_NoBuild.rar b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector15_WithEAR_Source_NoBuild.rar
new file mode 100644
index 0000000..32134db
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/JCAImportOperationTest/Connector15_WithEAR_Source_NoBuild.rar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR12_Defaults.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR12_Defaults.ear
new file mode 100644
index 0000000..097894a
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR12_Defaults.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR12_NoBuild.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR12_NoBuild.ear
new file mode 100644
index 0000000..097894a
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR12_NoBuild.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR12_Source.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR12_Source.ear
new file mode 100644
index 0000000..59911a0
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR12_Source.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR12_Source_NoBuild.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR12_Source_NoBuild.ear
new file mode 100644
index 0000000..59911a0
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR12_Source_NoBuild.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR13_Defaults.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR13_Defaults.ear
new file mode 100644
index 0000000..a03cf0f
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR13_Defaults.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR13_NoBuild.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR13_NoBuild.ear
new file mode 100644
index 0000000..a03cf0f
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR13_NoBuild.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR13_Source.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR13_Source.ear
new file mode 100644
index 0000000..ef9c07a
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR13_Source.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR13_Source_NoBuild.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR13_Source_NoBuild.ear
new file mode 100644
index 0000000..ef9c07a
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR13_Source_NoBuild.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR14_Defaults.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR14_Defaults.ear
new file mode 100644
index 0000000..a7601ca
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR14_Defaults.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR14_NoBuild.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR14_NoBuild.ear
new file mode 100644
index 0000000..a7601ca
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR14_NoBuild.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR14_Source.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR14_Source.ear
new file mode 100644
index 0000000..ef49a27
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR14_Source.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR14_Source_NoBuild.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR14_Source_NoBuild.ear
new file mode 100644
index 0000000..ef49a27
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR14_Source_NoBuild.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR5_WithDD_Defaults.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR5_WithDD_Defaults.ear
new file mode 100644
index 0000000..269458f
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR5_WithDD_Defaults.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR5_WithDD_NoBuild.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR5_WithDD_NoBuild.ear
new file mode 100644
index 0000000..269458f
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR5_WithDD_NoBuild.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR5_WithDD_Source.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR5_WithDD_Source.ear
new file mode 100644
index 0000000..269458f
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR5_WithDD_Source.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR5_WithDD_Source_NoBuild.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR5_WithDD_Source_NoBuild.ear
new file mode 100644
index 0000000..269458f
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR5_WithDD_Source_NoBuild.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR5_WithoutDD_Defaults.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR5_WithoutDD_Defaults.ear
new file mode 100644
index 0000000..4f80b48
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR5_WithoutDD_Defaults.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR5_WithoutDD_NoBuild.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR5_WithoutDD_NoBuild.ear
new file mode 100644
index 0000000..4f80b48
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR5_WithoutDD_NoBuild.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR5_WithoutDD_Source.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR5_WithoutDD_Source.ear
new file mode 100644
index 0000000..4f80b48
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR5_WithoutDD_Source.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR5_WithoutDD_Source_NoBuild.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR5_WithoutDD_Source_NoBuild.ear
new file mode 100644
index 0000000..4f80b48
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_AddToExisitingEAR5_WithoutDD_Source_NoBuild.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_Defaults_Defaults.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_Defaults_Defaults.ear
new file mode 100644
index 0000000..e89d68d
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_Defaults_Defaults.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_Defaults_NoBuild.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_Defaults_NoBuild.ear
new file mode 100644
index 0000000..e89d68d
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_Defaults_NoBuild.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_Defaults_Source.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_Defaults_Source.ear
new file mode 100644
index 0000000..79e59b2
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_Defaults_Source.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_Defaults_Source_NoBuild.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_Defaults_Source_NoBuild.ear
new file mode 100644
index 0000000..79e59b2
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/UtilityImportOperationTest/Utility_Defaults_Source_NoBuild.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_Defaults_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_Defaults_Defaults.war
new file mode 100644
index 0000000..d947270
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_Defaults_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_Defaults_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_Defaults_NoBuild.war
new file mode 100644
index 0000000..3bc9b6b
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_Defaults_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_Defaults_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_Defaults_Source.war
new file mode 100644
index 0000000..02148ff
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_Defaults_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_Defaults_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_Defaults_Source_NoBuild.war
new file mode 100644
index 0000000..2a18030
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_Defaults_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_Defaults_WithEAR_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_Defaults_WithEAR_Defaults.war
new file mode 100644
index 0000000..ba96964
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_Defaults_WithEAR_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_Defaults_WithEAR_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_Defaults_WithEAR_NoBuild.war
new file mode 100644
index 0000000..ba96964
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_Defaults_WithEAR_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_Defaults_WithEAR_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_Defaults_WithEAR_Source.war
new file mode 100644
index 0000000..2619b31
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_Defaults_WithEAR_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_Defaults_WithEAR_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_Defaults_WithEAR_Source_NoBuild.war
new file mode 100644
index 0000000..2619b31
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_Defaults_WithEAR_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContentDir_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContentDir_Defaults.war
new file mode 100644
index 0000000..d42f505
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContentDir_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContentDir_DiffSrcDir_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContentDir_DiffSrcDir_Defaults.war
new file mode 100644
index 0000000..c769162
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContentDir_DiffSrcDir_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContentDir_DiffSrcDir_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContentDir_DiffSrcDir_NoBuild.war
new file mode 100644
index 0000000..c769162
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContentDir_DiffSrcDir_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContentDir_DiffSrcDir_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContentDir_DiffSrcDir_Source.war
new file mode 100644
index 0000000..3a9f3ff
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContentDir_DiffSrcDir_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContentDir_DiffSrcDir_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContentDir_DiffSrcDir_Source_NoBuild.war
new file mode 100644
index 0000000..3a9f3ff
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContentDir_DiffSrcDir_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContentDir_DiffSrcDir_WithEAR_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContentDir_DiffSrcDir_WithEAR_Defaults.war
new file mode 100644
index 0000000..98715f3
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContentDir_DiffSrcDir_WithEAR_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContentDir_DiffSrcDir_WithEAR_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContentDir_DiffSrcDir_WithEAR_NoBuild.war
new file mode 100644
index 0000000..98715f3
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContentDir_DiffSrcDir_WithEAR_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContentDir_DiffSrcDir_WithEAR_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContentDir_DiffSrcDir_WithEAR_Source.war
new file mode 100644
index 0000000..1d1e5af
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContentDir_DiffSrcDir_WithEAR_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContentDir_DiffSrcDir_WithEAR_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContentDir_DiffSrcDir_WithEAR_Source_NoBuild.war
new file mode 100644
index 0000000..1d1e5af
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContentDir_DiffSrcDir_WithEAR_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContentDir_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContentDir_NoBuild.war
new file mode 100644
index 0000000..d42f505
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContentDir_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContentDir_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContentDir_Source.war
new file mode 100644
index 0000000..064b9ba
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContentDir_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContentDir_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContentDir_Source_NoBuild.war
new file mode 100644
index 0000000..064b9ba
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContentDir_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContentDir_WithEAR_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContentDir_WithEAR_Defaults.war
new file mode 100644
index 0000000..f0073cc
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContentDir_WithEAR_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContentDir_WithEAR_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContentDir_WithEAR_NoBuild.war
new file mode 100644
index 0000000..f0073cc
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContentDir_WithEAR_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContentDir_WithEAR_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContentDir_WithEAR_Source.war
new file mode 100644
index 0000000..8172345
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContentDir_WithEAR_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContentDir_WithEAR_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContentDir_WithEAR_Source_NoBuild.war
new file mode 100644
index 0000000..8172345
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContentDir_WithEAR_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_Defaults.war
new file mode 100644
index 0000000..6807fd9
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_NoBuild.war
new file mode 100644
index 0000000..d6ee342
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_Source.war
new file mode 100644
index 0000000..d1def2e
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_Source_NoBuild.war
new file mode 100644
index 0000000..d1def2e
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContextRoot_DiffContentDir_WithEAR_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContextRoot_DiffContentDir_WithEAR_Defaults.war
new file mode 100644
index 0000000..0023bd1
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContextRoot_DiffContentDir_WithEAR_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContextRoot_DiffContentDir_WithEAR_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContextRoot_DiffContentDir_WithEAR_NoBuild.war
new file mode 100644
index 0000000..0023bd1
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContextRoot_DiffContentDir_WithEAR_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContextRoot_DiffContentDir_WithEAR_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContextRoot_DiffContentDir_WithEAR_Source.war
new file mode 100644
index 0000000..8b24b78
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContextRoot_DiffContentDir_WithEAR_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContextRoot_DiffContentDir_WithEAR_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContextRoot_DiffContentDir_WithEAR_Source_NoBuild.war
new file mode 100644
index 0000000..8b24b78
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContextRoot_DiffContentDir_WithEAR_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContextRoot_DiffSrcDir_WithEAR_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContextRoot_DiffSrcDir_WithEAR_Defaults.war
new file mode 100644
index 0000000..f3c84a6
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContextRoot_DiffSrcDir_WithEAR_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContextRoot_DiffSrcDir_WithEAR_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContextRoot_DiffSrcDir_WithEAR_NoBuild.war
new file mode 100644
index 0000000..f3c84a6
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContextRoot_DiffSrcDir_WithEAR_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContextRoot_DiffSrcDir_WithEAR_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContextRoot_DiffSrcDir_WithEAR_Source.war
new file mode 100644
index 0000000..895033e
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContextRoot_DiffSrcDir_WithEAR_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContextRoot_DiffSrcDir_WithEAR_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContextRoot_DiffSrcDir_WithEAR_Source_NoBuild.war
new file mode 100644
index 0000000..895033e
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContextRoot_DiffSrcDir_WithEAR_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContextRoot_WithEAR_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContextRoot_WithEAR_Defaults.war
new file mode 100644
index 0000000..c19007e
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContextRoot_WithEAR_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContextRoot_WithEAR_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContextRoot_WithEAR_NoBuild.war
new file mode 100644
index 0000000..c19007e
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContextRoot_WithEAR_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContextRoot_WithEAR_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContextRoot_WithEAR_Source.war
new file mode 100644
index 0000000..9746525
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContextRoot_WithEAR_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContextRoot_WithEAR_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContextRoot_WithEAR_Source_NoBuild.war
new file mode 100644
index 0000000..9746525
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffContextRoot_WithEAR_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffSrcDir_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffSrcDir_Defaults.war
new file mode 100644
index 0000000..a439906
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffSrcDir_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffSrcDir_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffSrcDir_NoBuild.war
new file mode 100644
index 0000000..a439906
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffSrcDir_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffSrcDir_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffSrcDir_Source.war
new file mode 100644
index 0000000..36a5615
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffSrcDir_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffSrcDir_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffSrcDir_Source_NoBuild.war
new file mode 100644
index 0000000..36a5615
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffSrcDir_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffSrcDir_WithEAR_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffSrcDir_WithEAR_Defaults.war
new file mode 100644
index 0000000..0121b0d
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffSrcDir_WithEAR_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffSrcDir_WithEAR_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffSrcDir_WithEAR_NoBuild.war
new file mode 100644
index 0000000..0121b0d
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffSrcDir_WithEAR_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffSrcDir_WithEAR_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffSrcDir_WithEAR_Source.war
new file mode 100644
index 0000000..e301881
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffSrcDir_WithEAR_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffSrcDir_WithEAR_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffSrcDir_WithEAR_Source_NoBuild.war
new file mode 100644
index 0000000..e301881
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web22_DiffSrcDir_WithEAR_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_Defaults_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_Defaults_Defaults.war
new file mode 100644
index 0000000..afb939b
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_Defaults_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_Defaults_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_Defaults_NoBuild.war
new file mode 100644
index 0000000..afb939b
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_Defaults_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_Defaults_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_Defaults_Source.war
new file mode 100644
index 0000000..cfbb400
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_Defaults_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_Defaults_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_Defaults_Source_NoBuild.war
new file mode 100644
index 0000000..cfbb400
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_Defaults_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_Defaults_WithEAR_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_Defaults_WithEAR_Defaults.war
new file mode 100644
index 0000000..a336b13
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_Defaults_WithEAR_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_Defaults_WithEAR_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_Defaults_WithEAR_NoBuild.war
new file mode 100644
index 0000000..a336b13
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_Defaults_WithEAR_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_Defaults_WithEAR_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_Defaults_WithEAR_Source.war
new file mode 100644
index 0000000..3b14fc4
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_Defaults_WithEAR_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_Defaults_WithEAR_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_Defaults_WithEAR_Source_NoBuild.war
new file mode 100644
index 0000000..3b14fc4
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_Defaults_WithEAR_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContentDir_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContentDir_Defaults.war
new file mode 100644
index 0000000..fd9e050
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContentDir_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContentDir_DiffSrcDir_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContentDir_DiffSrcDir_Defaults.war
new file mode 100644
index 0000000..e0aa27d
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContentDir_DiffSrcDir_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContentDir_DiffSrcDir_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContentDir_DiffSrcDir_NoBuild.war
new file mode 100644
index 0000000..e0aa27d
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContentDir_DiffSrcDir_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContentDir_DiffSrcDir_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContentDir_DiffSrcDir_Source.war
new file mode 100644
index 0000000..96d3b93
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContentDir_DiffSrcDir_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContentDir_DiffSrcDir_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContentDir_DiffSrcDir_Source_NoBuild.war
new file mode 100644
index 0000000..96d3b93
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContentDir_DiffSrcDir_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContentDir_DiffSrcDir_WithEAR_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContentDir_DiffSrcDir_WithEAR_Defaults.war
new file mode 100644
index 0000000..2000597
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContentDir_DiffSrcDir_WithEAR_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContentDir_DiffSrcDir_WithEAR_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContentDir_DiffSrcDir_WithEAR_NoBuild.war
new file mode 100644
index 0000000..2000597
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContentDir_DiffSrcDir_WithEAR_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContentDir_DiffSrcDir_WithEAR_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContentDir_DiffSrcDir_WithEAR_Source.war
new file mode 100644
index 0000000..5166d7e
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContentDir_DiffSrcDir_WithEAR_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContentDir_DiffSrcDir_WithEAR_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContentDir_DiffSrcDir_WithEAR_Source_NoBuild.war
new file mode 100644
index 0000000..5166d7e
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContentDir_DiffSrcDir_WithEAR_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContentDir_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContentDir_NoBuild.war
new file mode 100644
index 0000000..fd9e050
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContentDir_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContentDir_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContentDir_Source.war
new file mode 100644
index 0000000..1f1fb39
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContentDir_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContentDir_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContentDir_Source_NoBuild.war
new file mode 100644
index 0000000..1f1fb39
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContentDir_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContentDir_WithEAR_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContentDir_WithEAR_Defaults.war
new file mode 100644
index 0000000..a8b1146
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContentDir_WithEAR_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContentDir_WithEAR_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContentDir_WithEAR_NoBuild.war
new file mode 100644
index 0000000..a8b1146
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContentDir_WithEAR_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContentDir_WithEAR_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContentDir_WithEAR_Source.war
new file mode 100644
index 0000000..964b1de
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContentDir_WithEAR_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContentDir_WithEAR_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContentDir_WithEAR_Source_NoBuild.war
new file mode 100644
index 0000000..964b1de
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContentDir_WithEAR_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_Defaults.war
new file mode 100644
index 0000000..3e6e3d7
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_NoBuild.war
new file mode 100644
index 0000000..3e6e3d7
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_Source.war
new file mode 100644
index 0000000..91306b5
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_Source_NoBuild.war
new file mode 100644
index 0000000..91306b5
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContextRoot_DiffContentDir_WithEAR_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContextRoot_DiffContentDir_WithEAR_Defaults.war
new file mode 100644
index 0000000..5afa072
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContextRoot_DiffContentDir_WithEAR_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContextRoot_DiffContentDir_WithEAR_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContextRoot_DiffContentDir_WithEAR_NoBuild.war
new file mode 100644
index 0000000..5afa072
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContextRoot_DiffContentDir_WithEAR_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContextRoot_DiffContentDir_WithEAR_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContextRoot_DiffContentDir_WithEAR_Source.war
new file mode 100644
index 0000000..80158fd
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContextRoot_DiffContentDir_WithEAR_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContextRoot_DiffContentDir_WithEAR_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContextRoot_DiffContentDir_WithEAR_Source_NoBuild.war
new file mode 100644
index 0000000..80158fd
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContextRoot_DiffContentDir_WithEAR_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContextRoot_DiffSrcDir_WithEAR_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContextRoot_DiffSrcDir_WithEAR_Defaults.war
new file mode 100644
index 0000000..ad3ce65
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContextRoot_DiffSrcDir_WithEAR_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContextRoot_DiffSrcDir_WithEAR_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContextRoot_DiffSrcDir_WithEAR_NoBuild.war
new file mode 100644
index 0000000..ad3ce65
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContextRoot_DiffSrcDir_WithEAR_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContextRoot_DiffSrcDir_WithEAR_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContextRoot_DiffSrcDir_WithEAR_Source.war
new file mode 100644
index 0000000..218edf6
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContextRoot_DiffSrcDir_WithEAR_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContextRoot_DiffSrcDir_WithEAR_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContextRoot_DiffSrcDir_WithEAR_Source_NoBuild.war
new file mode 100644
index 0000000..218edf6
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContextRoot_DiffSrcDir_WithEAR_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContextRoot_WithEAR_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContextRoot_WithEAR_Defaults.war
new file mode 100644
index 0000000..6f8d388
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContextRoot_WithEAR_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContextRoot_WithEAR_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContextRoot_WithEAR_NoBuild.war
new file mode 100644
index 0000000..6f8d388
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContextRoot_WithEAR_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContextRoot_WithEAR_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContextRoot_WithEAR_Source.war
new file mode 100644
index 0000000..117d9af
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContextRoot_WithEAR_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContextRoot_WithEAR_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContextRoot_WithEAR_Source_NoBuild.war
new file mode 100644
index 0000000..117d9af
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffContextRoot_WithEAR_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffSrcDir_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffSrcDir_Defaults.war
new file mode 100644
index 0000000..ccd1b4a
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffSrcDir_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffSrcDir_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffSrcDir_NoBuild.war
new file mode 100644
index 0000000..ccd1b4a
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffSrcDir_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffSrcDir_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffSrcDir_Source.war
new file mode 100644
index 0000000..4d056f2
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffSrcDir_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffSrcDir_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffSrcDir_Source_NoBuild.war
new file mode 100644
index 0000000..4d056f2
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffSrcDir_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffSrcDir_WithEAR_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffSrcDir_WithEAR_Defaults.war
new file mode 100644
index 0000000..080c3d3
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffSrcDir_WithEAR_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffSrcDir_WithEAR_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffSrcDir_WithEAR_NoBuild.war
new file mode 100644
index 0000000..080c3d3
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffSrcDir_WithEAR_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffSrcDir_WithEAR_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffSrcDir_WithEAR_Source.war
new file mode 100644
index 0000000..8d636c8
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffSrcDir_WithEAR_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffSrcDir_WithEAR_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffSrcDir_WithEAR_Source_NoBuild.war
new file mode 100644
index 0000000..8d636c8
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web23_DiffSrcDir_WithEAR_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_Defaults_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_Defaults_Defaults.war
new file mode 100644
index 0000000..9667191
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_Defaults_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_Defaults_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_Defaults_NoBuild.war
new file mode 100644
index 0000000..9667191
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_Defaults_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_Defaults_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_Defaults_Source.war
new file mode 100644
index 0000000..e52373e
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_Defaults_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_Defaults_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_Defaults_Source_NoBuild.war
new file mode 100644
index 0000000..e52373e
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_Defaults_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_Defaults_WithEAR_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_Defaults_WithEAR_Defaults.war
new file mode 100644
index 0000000..441a343
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_Defaults_WithEAR_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_Defaults_WithEAR_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_Defaults_WithEAR_NoBuild.war
new file mode 100644
index 0000000..441a343
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_Defaults_WithEAR_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_Defaults_WithEAR_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_Defaults_WithEAR_Source.war
new file mode 100644
index 0000000..66989ba
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_Defaults_WithEAR_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_Defaults_WithEAR_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_Defaults_WithEAR_Source_NoBuild.war
new file mode 100644
index 0000000..66989ba
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_Defaults_WithEAR_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContentDir_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContentDir_Defaults.war
new file mode 100644
index 0000000..75f6175
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContentDir_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContentDir_DiffSrcDir_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContentDir_DiffSrcDir_Defaults.war
new file mode 100644
index 0000000..93bf4e7
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContentDir_DiffSrcDir_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContentDir_DiffSrcDir_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContentDir_DiffSrcDir_NoBuild.war
new file mode 100644
index 0000000..93bf4e7
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContentDir_DiffSrcDir_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContentDir_DiffSrcDir_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContentDir_DiffSrcDir_Source.war
new file mode 100644
index 0000000..ced5825
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContentDir_DiffSrcDir_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContentDir_DiffSrcDir_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContentDir_DiffSrcDir_Source_NoBuild.war
new file mode 100644
index 0000000..ced5825
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContentDir_DiffSrcDir_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContentDir_DiffSrcDir_WithEAR_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContentDir_DiffSrcDir_WithEAR_Defaults.war
new file mode 100644
index 0000000..d3aac3f
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContentDir_DiffSrcDir_WithEAR_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContentDir_DiffSrcDir_WithEAR_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContentDir_DiffSrcDir_WithEAR_NoBuild.war
new file mode 100644
index 0000000..d3aac3f
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContentDir_DiffSrcDir_WithEAR_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContentDir_DiffSrcDir_WithEAR_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContentDir_DiffSrcDir_WithEAR_Source.war
new file mode 100644
index 0000000..9b07888
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContentDir_DiffSrcDir_WithEAR_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContentDir_DiffSrcDir_WithEAR_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContentDir_DiffSrcDir_WithEAR_Source_NoBuild.war
new file mode 100644
index 0000000..9b07888
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContentDir_DiffSrcDir_WithEAR_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContentDir_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContentDir_NoBuild.war
new file mode 100644
index 0000000..75f6175
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContentDir_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContentDir_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContentDir_Source.war
new file mode 100644
index 0000000..771919a
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContentDir_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContentDir_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContentDir_Source_NoBuild.war
new file mode 100644
index 0000000..771919a
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContentDir_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContentDir_WithEAR_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContentDir_WithEAR_Defaults.war
new file mode 100644
index 0000000..8426484
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContentDir_WithEAR_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContentDir_WithEAR_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContentDir_WithEAR_NoBuild.war
new file mode 100644
index 0000000..f93be32
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContentDir_WithEAR_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContentDir_WithEAR_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContentDir_WithEAR_Source.war
new file mode 100644
index 0000000..b119bd9
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContentDir_WithEAR_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContentDir_WithEAR_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContentDir_WithEAR_Source_NoBuild.war
new file mode 100644
index 0000000..4e73193
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContentDir_WithEAR_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_Defaults.war
new file mode 100644
index 0000000..d050a88
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_NoBuild.war
new file mode 100644
index 0000000..d050a88
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_Source.war
new file mode 100644
index 0000000..361d88e
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_Source_NoBuild.war
new file mode 100644
index 0000000..361d88e
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContextRoot_DiffContentDir_WithEAR_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContextRoot_DiffContentDir_WithEAR_Defaults.war
new file mode 100644
index 0000000..525ecd6
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContextRoot_DiffContentDir_WithEAR_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContextRoot_DiffContentDir_WithEAR_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContextRoot_DiffContentDir_WithEAR_NoBuild.war
new file mode 100644
index 0000000..525ecd6
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContextRoot_DiffContentDir_WithEAR_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContextRoot_DiffContentDir_WithEAR_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContextRoot_DiffContentDir_WithEAR_Source.war
new file mode 100644
index 0000000..e17942f
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContextRoot_DiffContentDir_WithEAR_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContextRoot_DiffContentDir_WithEAR_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContextRoot_DiffContentDir_WithEAR_Source_NoBuild.war
new file mode 100644
index 0000000..e17942f
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContextRoot_DiffContentDir_WithEAR_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContextRoot_DiffSrcDir_WithEAR_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContextRoot_DiffSrcDir_WithEAR_Defaults.war
new file mode 100644
index 0000000..1ed9ac1
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContextRoot_DiffSrcDir_WithEAR_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContextRoot_DiffSrcDir_WithEAR_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContextRoot_DiffSrcDir_WithEAR_NoBuild.war
new file mode 100644
index 0000000..1ed9ac1
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContextRoot_DiffSrcDir_WithEAR_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContextRoot_DiffSrcDir_WithEAR_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContextRoot_DiffSrcDir_WithEAR_Source.war
new file mode 100644
index 0000000..c1c6b6e
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContextRoot_DiffSrcDir_WithEAR_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContextRoot_DiffSrcDir_WithEAR_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContextRoot_DiffSrcDir_WithEAR_Source_NoBuild.war
new file mode 100644
index 0000000..c1c6b6e
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContextRoot_DiffSrcDir_WithEAR_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContextRoot_WithEAR_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContextRoot_WithEAR_Defaults.war
new file mode 100644
index 0000000..f85e116
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContextRoot_WithEAR_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContextRoot_WithEAR_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContextRoot_WithEAR_NoBuild.war
new file mode 100644
index 0000000..f85e116
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContextRoot_WithEAR_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContextRoot_WithEAR_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContextRoot_WithEAR_Source.war
new file mode 100644
index 0000000..98cbd95
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContextRoot_WithEAR_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContextRoot_WithEAR_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContextRoot_WithEAR_Source_NoBuild.war
new file mode 100644
index 0000000..98cbd95
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffContextRoot_WithEAR_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffSrcDir_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffSrcDir_Defaults.war
new file mode 100644
index 0000000..e312c38
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffSrcDir_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffSrcDir_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffSrcDir_NoBuild.war
new file mode 100644
index 0000000..e312c38
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffSrcDir_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffSrcDir_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffSrcDir_Source.war
new file mode 100644
index 0000000..6a15b33
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffSrcDir_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffSrcDir_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffSrcDir_Source_NoBuild.war
new file mode 100644
index 0000000..6a15b33
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffSrcDir_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffSrcDir_WithEAR_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffSrcDir_WithEAR_Defaults.war
new file mode 100644
index 0000000..ab3b2a3
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffSrcDir_WithEAR_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffSrcDir_WithEAR_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffSrcDir_WithEAR_NoBuild.war
new file mode 100644
index 0000000..ab3b2a3
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffSrcDir_WithEAR_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffSrcDir_WithEAR_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffSrcDir_WithEAR_Source.war
new file mode 100644
index 0000000..c901deb
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffSrcDir_WithEAR_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffSrcDir_WithEAR_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffSrcDir_WithEAR_Source_NoBuild.war
new file mode 100644
index 0000000..c901deb
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web24_DiffSrcDir_WithEAR_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_Defaults.war
new file mode 100644
index 0000000..ac74c9c
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_NoBuild.war
new file mode 100644
index 0000000..ac74c9c
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_Source.war
new file mode 100644
index 0000000..ac74c9c
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_Source_NoBuild.war
new file mode 100644
index 0000000..ac74c9c
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_WithDD_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_WithDD_Defaults.war
new file mode 100644
index 0000000..b8ad6e9
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_WithDD_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_WithDD_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_WithDD_NoBuild.war
new file mode 100644
index 0000000..b8ad6e9
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_WithDD_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_WithDD_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_WithDD_Source.war
new file mode 100644
index 0000000..b8ad6e9
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_WithDD_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_WithDD_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_WithDD_Source_NoBuild.war
new file mode 100644
index 0000000..b8ad6e9
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_WithDD_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_WithEAR_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_WithEAR_Defaults.war
new file mode 100644
index 0000000..1a24ade
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_WithEAR_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_WithEAR_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_WithEAR_NoBuild.war
new file mode 100644
index 0000000..1a24ade
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_WithEAR_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_WithEAR_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_WithEAR_Source.war
new file mode 100644
index 0000000..1a24ade
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_WithEAR_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_WithEAR_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_WithEAR_Source_NoBuild.war
new file mode 100644
index 0000000..1a24ade
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_WithEAR_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_WithEAR_WithDD_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_WithEAR_WithDD_Defaults.war
new file mode 100644
index 0000000..0743d1a
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_WithEAR_WithDD_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_WithEAR_WithDD_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_WithEAR_WithDD_NoBuild.war
new file mode 100644
index 0000000..0743d1a
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_WithEAR_WithDD_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_WithEAR_WithDD_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_WithEAR_WithDD_Source.war
new file mode 100644
index 0000000..0743d1a
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_WithEAR_WithDD_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_WithEAR_WithDD_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_WithEAR_WithDD_Source_NoBuild.war
new file mode 100644
index 0000000..0743d1a
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_WithEAR_WithDD_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_Defaults.war
new file mode 100644
index 0000000..95687f8
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_Defaults.war
new file mode 100644
index 0000000..2aaf30e
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_NoBuild.war
new file mode 100644
index 0000000..2aaf30e
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_Source.war
new file mode 100644
index 0000000..2aaf30e
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_Source_NoBuild.war
new file mode 100644
index 0000000..2aaf30e
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_WithDD_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_WithDD_Defaults.war
new file mode 100644
index 0000000..f70cbdb
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_WithDD_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_WithDD_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_WithDD_NoBuild.war
new file mode 100644
index 0000000..f70cbdb
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_WithDD_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_WithDD_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_WithDD_Source.war
new file mode 100644
index 0000000..f70cbdb
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_WithDD_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_WithDD_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_WithDD_Source_NoBuild.war
new file mode 100644
index 0000000..f70cbdb
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_WithDD_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_WithEAR_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_WithEAR_Defaults.war
new file mode 100644
index 0000000..5d22dac
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_WithEAR_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_WithEAR_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_WithEAR_NoBuild.war
new file mode 100644
index 0000000..5d22dac
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_WithEAR_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_WithEAR_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_WithEAR_Source.war
new file mode 100644
index 0000000..5d22dac
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_WithEAR_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_WithEAR_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_WithEAR_Source_NoBuild.war
new file mode 100644
index 0000000..5d22dac
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_WithEAR_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_WithEAR_WithDD_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_WithEAR_WithDD_Defaults.war
new file mode 100644
index 0000000..2e26606
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_WithEAR_WithDD_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_WithEAR_WithDD_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_WithEAR_WithDD_NoBuild.war
new file mode 100644
index 0000000..2e26606
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_WithEAR_WithDD_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_WithEAR_WithDD_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_WithEAR_WithDD_Source.war
new file mode 100644
index 0000000..2e26606
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_WithEAR_WithDD_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_WithEAR_WithDD_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_WithEAR_WithDD_Source_NoBuild.war
new file mode 100644
index 0000000..2e26606
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_WithEAR_WithDD_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_NoBuild.war
new file mode 100644
index 0000000..95687f8
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_Source.war
new file mode 100644
index 0000000..95687f8
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_Source_NoBuild.war
new file mode 100644
index 0000000..95687f8
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_WithDD_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_WithDD_Defaults.war
new file mode 100644
index 0000000..e024284
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_WithDD_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_WithDD_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_WithDD_NoBuild.war
new file mode 100644
index 0000000..e024284
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_WithDD_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_WithDD_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_WithDD_Source.war
new file mode 100644
index 0000000..e024284
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_WithDD_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_WithDD_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_WithDD_Source_NoBuild.war
new file mode 100644
index 0000000..e024284
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_WithDD_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_WithEAR_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_WithEAR_Defaults.war
new file mode 100644
index 0000000..5080a4b
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_WithEAR_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_WithEAR_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_WithEAR_NoBuild.war
new file mode 100644
index 0000000..5080a4b
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_WithEAR_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_WithEAR_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_WithEAR_Source.war
new file mode 100644
index 0000000..5080a4b
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_WithEAR_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_WithEAR_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_WithEAR_Source_NoBuild.war
new file mode 100644
index 0000000..5080a4b
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_WithEAR_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_WithEAR_WithDD_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_WithEAR_WithDD_Defaults.war
new file mode 100644
index 0000000..ea85c0b
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_WithEAR_WithDD_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_WithEAR_WithDD_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_WithEAR_WithDD_NoBuild.war
new file mode 100644
index 0000000..ea85c0b
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_WithEAR_WithDD_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_WithEAR_WithDD_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_WithEAR_WithDD_Source.war
new file mode 100644
index 0000000..ea85c0b
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_WithEAR_WithDD_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_WithEAR_WithDD_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_WithEAR_WithDD_Source_NoBuild.war
new file mode 100644
index 0000000..ea85c0b
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_WithEAR_WithDD_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_DiffSrcDir_WithDD_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_DiffSrcDir_WithDD_Defaults.war
new file mode 100644
index 0000000..14b2ac7
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_DiffSrcDir_WithDD_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_DiffSrcDir_WithDD_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_DiffSrcDir_WithDD_NoBuild.war
new file mode 100644
index 0000000..14b2ac7
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_DiffSrcDir_WithDD_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_DiffSrcDir_WithDD_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_DiffSrcDir_WithDD_Source.war
new file mode 100644
index 0000000..14b2ac7
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_DiffSrcDir_WithDD_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_DiffSrcDir_WithDD_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_DiffSrcDir_WithDD_Source_NoBuild.war
new file mode 100644
index 0000000..14b2ac7
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_DiffSrcDir_WithDD_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_Defaults.war
new file mode 100644
index 0000000..81ad6ea
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_NoBuild.war
new file mode 100644
index 0000000..81ad6ea
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_Source.war
new file mode 100644
index 0000000..81ad6ea
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_Source_NoBuild.war
new file mode 100644
index 0000000..81ad6ea
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_WithDD_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_WithDD_Defaults.war
new file mode 100644
index 0000000..819dd96
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_WithDD_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_WithDD_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_WithDD_NoBuild.war
new file mode 100644
index 0000000..819dd96
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_WithDD_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_WithDD_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_WithDD_Source.war
new file mode 100644
index 0000000..819dd96
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_WithDD_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_WithDD_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_WithDD_Source_NoBuild.war
new file mode 100644
index 0000000..819dd96
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_WithDD_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_WithDD_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_WithDD_Defaults.war
new file mode 100644
index 0000000..831b207
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_WithDD_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_WithDD_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_WithDD_NoBuild.war
new file mode 100644
index 0000000..831b207
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_WithDD_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_WithDD_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_WithDD_Source.war
new file mode 100644
index 0000000..831b207
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_WithDD_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_WithDD_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_WithDD_Source_NoBuild.war
new file mode 100644
index 0000000..831b207
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_WithDD_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_WithEAR_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_WithEAR_Defaults.war
new file mode 100644
index 0000000..5ae3c0b
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_WithEAR_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_WithEAR_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_WithEAR_NoBuild.war
new file mode 100644
index 0000000..5ae3c0b
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_WithEAR_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_WithEAR_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_WithEAR_Source.war
new file mode 100644
index 0000000..5ae3c0b
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_WithEAR_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_WithEAR_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_WithEAR_Source_NoBuild.war
new file mode 100644
index 0000000..5ae3c0b
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_WithEAR_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_WithEAR_WithDD_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_WithEAR_WithDD_Defaults.war
new file mode 100644
index 0000000..8824f3f
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_WithEAR_WithDD_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_WithEAR_WithDD_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_WithEAR_WithDD_NoBuild.war
new file mode 100644
index 0000000..8824f3f
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_WithEAR_WithDD_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_WithEAR_WithDD_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_WithEAR_WithDD_Source.war
new file mode 100644
index 0000000..8824f3f
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_WithEAR_WithDD_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_WithEAR_WithDD_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_WithEAR_WithDD_Source_NoBuild.war
new file mode 100644
index 0000000..8824f3f
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_WithEAR_WithDD_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffSrcDir_WithDD_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffSrcDir_WithDD_Defaults.war
new file mode 100644
index 0000000..68f8244
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffSrcDir_WithDD_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffSrcDir_WithDD_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffSrcDir_WithDD_NoBuild.war
new file mode 100644
index 0000000..68f8244
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffSrcDir_WithDD_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffSrcDir_WithDD_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffSrcDir_WithDD_Source.war
new file mode 100644
index 0000000..68f8244
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffSrcDir_WithDD_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffSrcDir_WithDD_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffSrcDir_WithDD_Source_NoBuild.war
new file mode 100644
index 0000000..68f8244
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffSrcDir_WithDD_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffSrcDir_WithEAR_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffSrcDir_WithEAR_Defaults.war
new file mode 100644
index 0000000..fb15fca
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffSrcDir_WithEAR_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffSrcDir_WithEAR_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffSrcDir_WithEAR_NoBuild.war
new file mode 100644
index 0000000..fb15fca
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffSrcDir_WithEAR_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffSrcDir_WithEAR_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffSrcDir_WithEAR_Source.war
new file mode 100644
index 0000000..fb15fca
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffSrcDir_WithEAR_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffSrcDir_WithEAR_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffSrcDir_WithEAR_Source_NoBuild.war
new file mode 100644
index 0000000..fb15fca
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffSrcDir_WithEAR_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffSrcDir_WithEAR_WithDD_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffSrcDir_WithEAR_WithDD_Defaults.war
new file mode 100644
index 0000000..4fd6ec0
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffSrcDir_WithEAR_WithDD_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffSrcDir_WithEAR_WithDD_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffSrcDir_WithEAR_WithDD_NoBuild.war
new file mode 100644
index 0000000..4fd6ec0
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffSrcDir_WithEAR_WithDD_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffSrcDir_WithEAR_WithDD_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffSrcDir_WithEAR_WithDD_Source.war
new file mode 100644
index 0000000..4fd6ec0
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffSrcDir_WithEAR_WithDD_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffSrcDir_WithEAR_WithDD_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffSrcDir_WithEAR_WithDD_Source_NoBuild.war
new file mode 100644
index 0000000..4fd6ec0
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffSrcDir_WithEAR_WithDD_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_WithDD_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_WithDD_Defaults.war
new file mode 100644
index 0000000..e024284
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_WithDD_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_WithDD_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_WithDD_NoBuild.war
new file mode 100644
index 0000000..e024284
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_WithDD_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_WithDD_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_WithDD_Source.war
new file mode 100644
index 0000000..e024284
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_WithDD_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_WithDD_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_WithDD_Source_NoBuild.war
new file mode 100644
index 0000000..e024284
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_WithDD_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_WithEAR_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_WithEAR_Defaults.war
new file mode 100644
index 0000000..30c1bf4
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_WithEAR_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_WithEAR_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_WithEAR_NoBuild.war
new file mode 100644
index 0000000..30c1bf4
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_WithEAR_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_WithEAR_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_WithEAR_Source.war
new file mode 100644
index 0000000..30c1bf4
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_WithEAR_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_WithEAR_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_WithEAR_Source_NoBuild.war
new file mode 100644
index 0000000..30c1bf4
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_WithEAR_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_WithEAR_WithDD_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_WithEAR_WithDD_Defaults.war
new file mode 100644
index 0000000..9946610
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_WithEAR_WithDD_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_WithEAR_WithDD_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_WithEAR_WithDD_NoBuild.war
new file mode 100644
index 0000000..9946610
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_WithEAR_WithDD_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_WithEAR_WithDD_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_WithEAR_WithDD_Source.war
new file mode 100644
index 0000000..9946610
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_WithEAR_WithDD_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_WithEAR_WithDD_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_WithEAR_WithDD_Source_NoBuild.war
new file mode 100644
index 0000000..9946610
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_WithEAR_WithDD_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_Defaults.war
new file mode 100644
index 0000000..119beda
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_NoBuild.war
new file mode 100644
index 0000000..119beda
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_Source.war
new file mode 100644
index 0000000..119beda
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_Source_NoBuild.war
new file mode 100644
index 0000000..119beda
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_WithDD_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_WithDD_Defaults.war
new file mode 100644
index 0000000..d7dc4ee
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_WithDD_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_WithDD_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_WithDD_NoBuild.war
new file mode 100644
index 0000000..d7dc4ee
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_WithDD_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_WithDD_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_WithDD_Source.war
new file mode 100644
index 0000000..d7dc4ee
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_WithDD_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_WithDD_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_WithDD_Source_NoBuild.war
new file mode 100644
index 0000000..d7dc4ee
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_WithDD_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_WithEAR_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_WithEAR_Defaults.war
new file mode 100644
index 0000000..3fad1a9
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_WithEAR_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_WithEAR_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_WithEAR_NoBuild.war
new file mode 100644
index 0000000..3fad1a9
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_WithEAR_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_WithEAR_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_WithEAR_Source.war
new file mode 100644
index 0000000..3fad1a9
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_WithEAR_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_WithEAR_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_WithEAR_Source_NoBuild.war
new file mode 100644
index 0000000..3fad1a9
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_WithEAR_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_WithEAR_WithDD_Defaults.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_WithEAR_WithDD_Defaults.war
new file mode 100644
index 0000000..0e22715
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_WithEAR_WithDD_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_WithEAR_WithDD_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_WithEAR_WithDD_NoBuild.war
new file mode 100644
index 0000000..0e22715
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_WithEAR_WithDD_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_WithEAR_WithDD_Source.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_WithEAR_WithDD_Source.war
new file mode 100644
index 0000000..0e22715
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_WithEAR_WithDD_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_WithEAR_WithDD_Source_NoBuild.war b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_WithEAR_WithDD_Source_NoBuild.war
new file mode 100644
index 0000000..0e22715
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_WithEAR_WithDD_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/RARImportTests/JDEConnector.rar b/tests/org.eclipse.jst.j2ee.tests/TestData/RARImportTests/JDEConnector.rar
new file mode 100644
index 0000000..f1fb89d
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/RARImportTests/JDEConnector.rar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/SaveStrategyTests/AppClient.zip b/tests/org.eclipse.jst.j2ee.tests/TestData/SaveStrategyTests/AppClient.zip
new file mode 100644
index 0000000..3817287
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/SaveStrategyTests/AppClient.zip
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/SaveStrategyTests/WarImportFlexProject.zip b/tests/org.eclipse.jst.j2ee.tests/TestData/SaveStrategyTests/WarImportFlexProject.zip
new file mode 100644
index 0000000..eb51480
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/SaveStrategyTests/WarImportFlexProject.zip
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/WARImportTests/Bug311542.war b/tests/org.eclipse.jst.j2ee.tests/TestData/WARImportTests/Bug311542.war
new file mode 100644
index 0000000..a3bac0f
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/WARImportTests/Bug311542.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/WARImportTests/Example1.war b/tests/org.eclipse.jst.j2ee.tests/TestData/WARImportTests/Example1.war
new file mode 100644
index 0000000..9c30a38
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/WARImportTests/Example1.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/WARImportTests/InvalidWebXML1.war b/tests/org.eclipse.jst.j2ee.tests/TestData/WARImportTests/InvalidWebXML1.war
new file mode 100644
index 0000000..95b1bf8
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/WARImportTests/InvalidWebXML1.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/WARImportTests/InvalidWebXML14_1.war b/tests/org.eclipse.jst.j2ee.tests/TestData/WARImportTests/InvalidWebXML14_1.war
new file mode 100644
index 0000000..bfd2b4e
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/WARImportTests/InvalidWebXML14_1.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/WARImportTests/InvalidWebXML14_2.war b/tests/org.eclipse.jst.j2ee.tests/TestData/WARImportTests/InvalidWebXML14_2.war
new file mode 100644
index 0000000..e253f36
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/WARImportTests/InvalidWebXML14_2.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/WARImportTests/InvalidWebXML2.war b/tests/org.eclipse.jst.j2ee.tests/TestData/WARImportTests/InvalidWebXML2.war
new file mode 100644
index 0000000..ac126f5
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/WARImportTests/InvalidWebXML2.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/WARImportTests/Test12Web.war b/tests/org.eclipse.jst.j2ee.tests/TestData/WARImportTests/Test12Web.war
new file mode 100644
index 0000000..ba220b1
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/WARImportTests/Test12Web.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/WARImportTests/Test13Web.war b/tests/org.eclipse.jst.j2ee.tests/TestData/WARImportTests/Test13Web.war
new file mode 100644
index 0000000..22aa926
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/WARImportTests/Test13Web.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/WARImportTests/Test14Web.war b/tests/org.eclipse.jst.j2ee.tests/TestData/WARImportTests/Test14Web.war
new file mode 100644
index 0000000..1eb2a3f
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/WARImportTests/Test14Web.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/WARImportTests/WebContainerClientApp.war b/tests/org.eclipse.jst.j2ee.tests/TestData/WARImportTests/WebContainerClientApp.war
new file mode 100644
index 0000000..860a219
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/WARImportTests/WebContainerClientApp.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/WARImportTests/WebNoSource.war b/tests/org.eclipse.jst.j2ee.tests/TestData/WARImportTests/WebNoSource.war
new file mode 100644
index 0000000..a4a7597
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/WARImportTests/WebNoSource.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/WARImportTests/WebSomeSource.war b/tests/org.eclipse.jst.j2ee.tests/TestData/WARImportTests/WebSomeSource.war
new file mode 100644
index 0000000..533b000
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/WARImportTests/WebSomeSource.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/WARImportTests/WebSource.war b/tests/org.eclipse.jst.j2ee.tests/TestData/WARImportTests/WebSource.war
new file mode 100644
index 0000000..6b71a0e
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/WARImportTests/WebSource.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/WebAppLibrariesContainerTests/abc.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/WebAppLibrariesContainerTests/abc.jar
new file mode 100644
index 0000000..27d1aba
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/WebAppLibrariesContainerTests/abc.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/WebAppLibrariesContainerTests/foo.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/WebAppLibrariesContainerTests/foo.jar
new file mode 100644
index 0000000..6edac25
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/WebAppLibrariesContainerTests/foo.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/WebDeployTests/WebDeployTest.zip b/tests/org.eclipse.jst.j2ee.tests/TestData/WebDeployTests/WebDeployTest.zip
new file mode 100644
index 0000000..2504ebc
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/WebDeployTests/WebDeployTest.zip
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/WebEditDdExternal/TestJSTL_Web25.zip b/tests/org.eclipse.jst.j2ee.tests/TestData/WebEditDdExternal/TestJSTL_Web25.zip
new file mode 100644
index 0000000..dccb30f
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/WebEditDdExternal/TestJSTL_Web25.zip
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/EAR5_NoDD.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/EAR5_NoDD.ear
new file mode 100644
index 0000000..06dcc92
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/EAR5_NoDD.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/EAR5_WithDD.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/EAR5_WithDD.ear
new file mode 100644
index 0000000..c3b5700
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/EAR5_WithDD.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application-client0.xml b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application-client0.xml
new file mode 100644
index 0000000..8ebf1ac
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application-client0.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<application-client id="Application-client_ID">
+	<display-name>EAR12Client</display-name>
+</application-client>
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application-client00.xml b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application-client00.xml
new file mode 100644
index 0000000..80a05cd
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application-client00.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE application-client PUBLIC "test" "test">
+<application-client id="Application-client_ID">
+	<display-name>EAR12Client</display-name>
+</application-client>
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application-client000.xml b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application-client000.xml
new file mode 100644
index 0000000..2d13d7a
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application-client000.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<application-client id="Application-client_ID" version="1.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="test">
+	<display-name>
+	EAR14Client</display-name>
+</application-client>
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application-client12.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application-client12.jar
new file mode 100644
index 0000000..1ac9235
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application-client12.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application-client12.xml b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application-client12.xml
new file mode 100644
index 0000000..add0ffc
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application-client12.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE application-client PUBLIC "-//Sun Microsystems, Inc.//DTD J2EE Application Client 1.2//EN" "http://java.sun.com/j2ee/dtds/application-client_1_2.dtd">
+<application-client id="Application-client_ID">
+	<display-name>EAR12Client</display-name>
+</application-client>
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application-client13.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application-client13.jar
new file mode 100644
index 0000000..c7202f2
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application-client13.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application-client13.xml b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application-client13.xml
new file mode 100644
index 0000000..1db7260
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application-client13.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE application-client PUBLIC "-//Sun Microsystems, Inc.//DTD J2EE Application Client 1.3//EN" "http://java.sun.com/dtd/application-client_1_3.dtd">
+<application-client id="Application-client_ID">
+	<display-name>EAR13Client</display-name>
+</application-client>
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application-client14.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application-client14.jar
new file mode 100644
index 0000000..ae270c9
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application-client14.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application-client14.xml b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application-client14.xml
new file mode 100644
index 0000000..496b578
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application-client14.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<application-client id="Application-client_ID" version="1.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/application-client_1_4.xsd">
+	<display-name>
+	EAR14Client</display-name>
+</application-client>
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application-client5.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application-client5.jar
new file mode 100644
index 0000000..e6accb4
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application-client5.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application-client5.xml b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application-client5.xml
new file mode 100644
index 0000000..76e9060
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application-client5.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<application-client id="Application-client_ID" version="5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application-client_5.xsd">
+	<display-name>
+	EAR15Client</display-name>
+</application-client>
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application0.xml b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application0.xml
new file mode 100644
index 0000000..7b94cd6
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application0.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<application id="Application_ID">
+	<display-name>EAR12</display-name>
+	<module id="JavaClientModule_1176405650468">
+		<java>EAR12Client.jar</java>
+	</module>
+	<module id="EjbModule_1176405650484">
+		<ejb>EAR12EJB.jar</ejb>
+	</module>
+	<module id="WebModule_1176405650484">
+		<web>
+			<web-uri>EAR12Web.war</web-uri>
+			<context-root>EAR12Web</context-root>
+		</web>
+	</module>
+</application>
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application00.xml b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application00.xml
new file mode 100644
index 0000000..c4c7cdd
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application00.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE application PUBLIC "test" "test">
+<application id="Application_ID">
+	<display-name>EAR12</display-name>
+	<module id="JavaClientModule_1176405650468">
+		<java>EAR12Client.jar</java>
+	</module>
+	<module id="EjbModule_1176405650484">
+		<ejb>EAR12EJB.jar</ejb>
+	</module>
+	<module id="WebModule_1176405650484">
+		<web>
+			<web-uri>EAR12Web.war</web-uri>
+			<context-root>EAR12Web</context-root>
+		</web>
+	</module>
+</application>
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application000.xml b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application000.xml
new file mode 100644
index 0000000..24644d6
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application000.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<application id="Application_ID" version="1.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="test">
+	<display-name>
+	EAR14</display-name>
+	<module id="ConnectorModule_1176405694468">
+		<connector>EAR14Connector.rar</connector>
+	</module>
+	<module id="JavaClientModule_1176405694578">
+		<java>EAR14Client.jar</java>
+	</module>
+	<module id="EjbModule_1176405694578">
+		<ejb>EAR14EJB.jar</ejb>
+	</module>
+	<module id="WebModule_1176405694578">
+		<web>
+			<web-uri>EAR14Web.war</web-uri>
+			<context-root>EAR14Web</context-root>
+		</web>
+	</module>
+</application>
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application12.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application12.ear
new file mode 100644
index 0000000..2271c19
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application12.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application12.xml b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application12.xml
new file mode 100644
index 0000000..b28f4a1
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application12.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE application PUBLIC "-//Sun Microsystems, Inc.//DTD J2EE Application 1.2//EN" "http://java.sun.com/j2ee/dtds/application_1_2.dtd">
+<application id="Application_ID">
+	<display-name>EAR12</display-name>
+	<module id="JavaClientModule_1176405650468">
+		<java>EAR12Client.jar</java>
+	</module>
+	<module id="EjbModule_1176405650484">
+		<ejb>EAR12EJB.jar</ejb>
+	</module>
+	<module id="WebModule_1176405650484">
+		<web>
+			<web-uri>EAR12Web.war</web-uri>
+			<context-root>EAR12Web</context-root>
+		</web>
+	</module>
+</application>
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application13.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application13.ear
new file mode 100644
index 0000000..6cf7458
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application13.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application13.xml b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application13.xml
new file mode 100644
index 0000000..0b195f5
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application13.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE application PUBLIC "-//Sun Microsystems, Inc.//DTD J2EE Application 1.3//EN" "http://java.sun.com/dtd/application_1_3.dtd">
+<application id="Application_ID">
+	<display-name>EAR13</display-name>
+	<module id="WebModule_1176405672843">
+		<web>
+			<web-uri>EAR13Web.war</web-uri>
+			<context-root>EAR13Web</context-root>
+		</web>
+	</module>
+	<module id="ConnectorModule_1176405672859">
+		<connector>EAR13Connector.rar</connector>
+	</module>
+	<module id="JavaClientModule_1176405672875">
+		<java>EAR13Client.jar</java>
+	</module>
+	<module id="EjbModule_1176405672875">
+		<ejb>EAR13EJB.jar</ejb>
+	</module>
+</application>
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application14.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application14.ear
new file mode 100644
index 0000000..47e3d23
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application14.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application14.xml b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application14.xml
new file mode 100644
index 0000000..12be258
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application14.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<application id="Application_ID" version="1.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/application_1_4.xsd">
+	<display-name>
+	EAR14</display-name>
+	<module id="ConnectorModule_1176405694468">
+		<connector>EAR14Connector.rar</connector>
+	</module>
+	<module id="JavaClientModule_1176405694578">
+		<java>EAR14Client.jar</java>
+	</module>
+	<module id="EjbModule_1176405694578">
+		<ejb>EAR14EJB.jar</ejb>
+	</module>
+	<module id="WebModule_1176405694578">
+		<web>
+			<web-uri>EAR14Web.war</web-uri>
+			<context-root>EAR14Web</context-root>
+		</web>
+	</module>
+</application>
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application5.ear b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application5.ear
new file mode 100644
index 0000000..b5dd57d
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application5.ear
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application5.xml b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application5.xml
new file mode 100644
index 0000000..51bd3fb
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/application5.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<application id="Application_ID" version="5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_5.xsd">
+	<display-name>
+	EAR50</display-name>
+	<module id="ConnectorModule_1176405694468">
+		<connector>EAR14Connector.rar</connector>
+	</module>
+	<module id="JavaClientModule_1176405694578">
+		<java>EAR14Client.jar</java>
+	</module>
+	<module id="EjbModule_1176405694578">
+		<ejb>EAR14EJB.jar</ejb>
+	</module>
+	<module id="WebModule_1176405694578">
+		<web>
+			<web-uri>EAR14Web.war</web-uri>
+			<context-root>EAR14Web</context-root>
+		</web>
+	</module>
+</application>
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/ejb-jar0.xml b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/ejb-jar0.xml
new file mode 100644
index 0000000..cae4d20
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/ejb-jar0.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ejb-jar id="ejb-jar_ID">
+	<display-name>EAR12EJB</display-name>
+	<enterprise-beans>
+		<session id="S">
+			<ejb-name>S</ejb-name>
+			<home>ejbs.SHome</home>
+			<remote>ejbs.S</remote>
+			<ejb-class>ejbs.SBean</ejb-class>
+			<session-type>Stateless</session-type>
+			<transaction-type>Container</transaction-type>
+		</session>
+	</enterprise-beans>
+</ejb-jar>
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/ejb-jar00.xml b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/ejb-jar00.xml
new file mode 100644
index 0000000..464538d
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/ejb-jar00.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE ejb-jar PUBLIC "test" "test">
+<ejb-jar id="ejb-jar_ID">
+	<display-name>EAR12EJB</display-name>
+	<enterprise-beans>
+		<session id="S">
+			<ejb-name>S</ejb-name>
+			<home>ejbs.SHome</home>
+			<remote>ejbs.S</remote>
+			<ejb-class>ejbs.SBean</ejb-class>
+			<session-type>Stateless</session-type>
+			<transaction-type>Container</transaction-type>
+		</session>
+	</enterprise-beans>
+</ejb-jar>
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/ejb-jar000.xml b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/ejb-jar000.xml
new file mode 100644
index 0000000..afc230c
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/ejb-jar000.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ejb-jar id="ejb-jar_ID" version="2.1" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="test">
+	<display-name>
+	EAR14EJB</display-name>
+	<enterprise-beans>
+		<session id="S">
+			<ejb-name>S</ejb-name>
+			<home>ejbs.SHome</home>
+			<remote>ejbs.S</remote>
+			<ejb-class>ejbs.SBean</ejb-class>
+			<session-type>Stateless</session-type>
+			<transaction-type>Container</transaction-type>
+		</session>
+	</enterprise-beans>
+</ejb-jar>
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/ejb-jar11.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/ejb-jar11.jar
new file mode 100644
index 0000000..35b3aec
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/ejb-jar11.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/ejb-jar11.xml b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/ejb-jar11.xml
new file mode 100644
index 0000000..e8d6fe7
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/ejb-jar11.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 1.1//EN" "http://java.sun.com/j2ee/dtds/ejb-jar_1_1.dtd">
+<ejb-jar id="ejb-jar_ID">
+	<display-name>EAR12EJB</display-name>
+	<enterprise-beans>
+		<session id="S">
+			<ejb-name>S</ejb-name>
+			<home>ejbs.SHome</home>
+			<remote>ejbs.S</remote>
+			<ejb-class>ejbs.SBean</ejb-class>
+			<session-type>Stateless</session-type>
+			<transaction-type>Container</transaction-type>
+		</session>
+	</enterprise-beans>
+</ejb-jar>
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/ejb-jar20.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/ejb-jar20.jar
new file mode 100644
index 0000000..b6d04ab
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/ejb-jar20.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/ejb-jar20.xml b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/ejb-jar20.xml
new file mode 100644
index 0000000..bcbffd6
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/ejb-jar20.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd">
+<ejb-jar id="ejb-jar_ID">
+	<display-name>EAR13EJB</display-name>
+	<enterprise-beans>
+		<session id="S">
+			<ejb-name>S</ejb-name>
+			<home>ejbs.SHome</home>
+			<remote>ejbs.S</remote>
+			<ejb-class>ejbs.SBean</ejb-class>
+			<session-type>Stateless</session-type>
+			<transaction-type>Container</transaction-type>
+		</session>
+	</enterprise-beans>
+</ejb-jar>
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/ejb-jar21.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/ejb-jar21.jar
new file mode 100644
index 0000000..b5f1d8e
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/ejb-jar21.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/ejb-jar21.xml b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/ejb-jar21.xml
new file mode 100644
index 0000000..22b655e
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/ejb-jar21.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ejb-jar id="ejb-jar_ID" version="2.1" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd">
+	<display-name>
+	EAR14EJB</display-name>
+	<enterprise-beans>
+		<session id="S">
+			<ejb-name>S</ejb-name>
+			<home>ejbs.SHome</home>
+			<remote>ejbs.S</remote>
+			<ejb-class>ejbs.SBean</ejb-class>
+			<session-type>Stateless</session-type>
+			<transaction-type>Container</transaction-type>
+		</session>
+	</enterprise-beans>
+</ejb-jar>
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/ejb-jar30.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/ejb-jar30.jar
new file mode 100644
index 0000000..79d4c6a
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/ejb-jar30.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/ejb-jar30.xml b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/ejb-jar30.xml
new file mode 100644
index 0000000..b8451bd
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/ejb-jar30.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ejb-jar id="ejb-jar_ID" version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd">
+	<display-name>
+	EAR5EJB</display-name>
+	<enterprise-beans>
+		<session id="S">
+			<ejb-name>S</ejb-name>
+			<home>ejbs.SHome</home>
+			<remote>ejbs.S</remote>
+			<ejb-class>ejbs.SBean</ejb-class>
+			<session-type>Stateless</session-type>
+			<transaction-type>Container</transaction-type>
+		</session>
+	</enterprise-beans>
+</ejb-jar>
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/notjavaee.xml b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/notjavaee.xml
new file mode 100644
index 0000000..c0312d0
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/notjavaee.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<test id="Application-client_ID">
+	<display-name>EAR12Client</display-name>
+</test>
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/notxml.xml b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/notxml.xml
new file mode 100644
index 0000000..b8ce116
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/notxml.xml
@@ -0,0 +1 @@
+this is not xml
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/ra0.xml b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/ra0.xml
new file mode 100644
index 0000000..cd1dcbf
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/ra0.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<connector>
+	<display-name>EAR13Connector</display-name>
+	<description></description>
+ 	<vendor-name></vendor-name>
+  	<spec-version></spec-version>
+  	<eis-type></eis-type>
+  	<version></version>
+  	<license>
+  		<description></description>   
+    	<license-required>false</license-required>   
+    </license>                                      
+  	<resourceadapter>
+  		<managedconnectionfactory-class></managedconnectionfactory-class>
+  		<connectionfactory-interface></connectionfactory-interface>
+    	<connectionfactory-impl-class></connectionfactory-impl-class>
+    	<connection-interface></connection-interface>
+    	<connection-impl-class></connection-impl-class>
+    	<transaction-support></transaction-support>
+  		<config-property>
+     		<description></description>
+      		<config-property-name></config-property-name>
+      		<config-property-type></config-property-type>
+      		<config-property-value></config-property-value>
+    	 </config-property>
+    	<authentication-mechanism>
+      	 	<description></description>
+      	 	<authentication-mechanism-type></authentication-mechanism-type>
+     	 	<credential-interface></credential-interface>
+    	</authentication-mechanism>
+    	<reauthentication-support>false</reauthentication-support>
+    	<security-permission>
+    		<description></description>
+    		<security-permission-spec>
+      		</security-permission-spec>
+    	</security-permission>
+  	</resourceadapter>
+</connector>
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/ra00.xml b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/ra00.xml
new file mode 100644
index 0000000..ac63c72
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/ra00.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE connector PUBLIC "test" "test">
+<connector>
+	<display-name>EAR13Connector</display-name>
+	<description></description>
+ 	<vendor-name></vendor-name>
+  	<spec-version></spec-version>
+  	<eis-type></eis-type>
+  	<version></version>
+  	<license>
+  		<description></description>   
+    	<license-required>false</license-required>   
+    </license>                                      
+  	<resourceadapter>
+  		<managedconnectionfactory-class></managedconnectionfactory-class>
+  		<connectionfactory-interface></connectionfactory-interface>
+    	<connectionfactory-impl-class></connectionfactory-impl-class>
+    	<connection-interface></connection-interface>
+    	<connection-impl-class></connection-impl-class>
+    	<transaction-support></transaction-support>
+  		<config-property>
+     		<description></description>
+      		<config-property-name></config-property-name>
+      		<config-property-type></config-property-type>
+      		<config-property-value></config-property-value>
+    	 </config-property>
+    	<authentication-mechanism>
+      	 	<description></description>
+      	 	<authentication-mechanism-type></authentication-mechanism-type>
+     	 	<credential-interface></credential-interface>
+    	</authentication-mechanism>
+    	<reauthentication-support>false</reauthentication-support>
+    	<security-permission>
+    		<description></description>
+    		<security-permission-spec>
+      		</security-permission-spec>
+    	</security-permission>
+  	</resourceadapter>
+</connector>
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/ra000.xml b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/ra000.xml
new file mode 100644
index 0000000..214edb3
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/ra000.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<connector id="Connector_ID" version="1.5" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="test"> 
+	<description></description>
+	<display-name>EAR14Connector</display-name>
+ 	<vendor-name></vendor-name>
+  	<eis-type></eis-type>
+  	<resourceadapter-version></resourceadapter-version>                                  
+  	<resourceadapter>
+  	</resourceadapter>
+</connector>
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/ra10.rar b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/ra10.rar
new file mode 100644
index 0000000..1e0848a
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/ra10.rar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/ra10.xml b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/ra10.xml
new file mode 100644
index 0000000..63d848b
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/ra10.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE connector PUBLIC "-//Sun Microsystems, Inc.//DTD Connector 1.0//EN" "http://java.sun.com/dtd/connector_1_0.dtd">
+<connector>
+	<display-name>EAR13Connector</display-name>
+	<description></description>
+ 	<vendor-name></vendor-name>
+  	<spec-version></spec-version>
+  	<eis-type></eis-type>
+  	<version></version>
+  	<license>
+  		<description></description>   
+    	<license-required>false</license-required>   
+    </license>                                      
+  	<resourceadapter>
+  		<managedconnectionfactory-class></managedconnectionfactory-class>
+  		<connectionfactory-interface></connectionfactory-interface>
+    	<connectionfactory-impl-class></connectionfactory-impl-class>
+    	<connection-interface></connection-interface>
+    	<connection-impl-class></connection-impl-class>
+    	<transaction-support></transaction-support>
+  		<config-property>
+     		<description></description>
+      		<config-property-name></config-property-name>
+      		<config-property-type></config-property-type>
+      		<config-property-value></config-property-value>
+    	 </config-property>
+    	<authentication-mechanism>
+      	 	<description></description>
+      	 	<authentication-mechanism-type></authentication-mechanism-type>
+     	 	<credential-interface></credential-interface>
+    	</authentication-mechanism>
+    	<reauthentication-support>false</reauthentication-support>
+    	<security-permission>
+    		<description></description>
+    		<security-permission-spec>
+      		</security-permission-spec>
+    	</security-permission>
+  	</resourceadapter>
+</connector>
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/ra15.rar b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/ra15.rar
new file mode 100644
index 0000000..dbdad49
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/ra15.rar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/ra15.xml b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/ra15.xml
new file mode 100644
index 0000000..127636f
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/ra15.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<connector id="Connector_ID" version="1.5" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/connector_1_5.xsd"> 
+	<description></description>
+	<display-name>EAR14Connector</display-name>
+ 	<vendor-name></vendor-name>
+  	<eis-type></eis-type>
+  	<resourceadapter-version></resourceadapter-version>                                  
+  	<resourceadapter>
+  	</resourceadapter>
+</connector>
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/web0.xml b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/web0.xml
new file mode 100644
index 0000000..b954cdc
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/web0.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<web-app id="WebApp_ID">
+	<display-name>EAR12Web</display-name>
+	<welcome-file-list>
+		<welcome-file>index.html</welcome-file>
+		<welcome-file>index.htm</welcome-file>
+		<welcome-file>index.jsp</welcome-file>
+		<welcome-file>default.html</welcome-file>
+		<welcome-file>default.htm</welcome-file>
+		<welcome-file>default.jsp</welcome-file>
+	</welcome-file-list>
+</web-app>
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/web00.xml b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/web00.xml
new file mode 100644
index 0000000..9611477
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/web00.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE web-app PUBLIC "test" "test">
+<web-app id="WebApp_ID">
+	<display-name>EAR12Web</display-name>
+	<welcome-file-list>
+		<welcome-file>index.html</welcome-file>
+		<welcome-file>index.htm</welcome-file>
+		<welcome-file>index.jsp</welcome-file>
+		<welcome-file>default.html</welcome-file>
+		<welcome-file>default.htm</welcome-file>
+		<welcome-file>default.jsp</welcome-file>
+	</welcome-file-list>
+</web-app>
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/web000.xml b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/web000.xml
new file mode 100644
index 0000000..bdd3f00
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/web000.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="test">
+	<display-name>
+	EAR14Web</display-name>
+	<welcome-file-list>
+		<welcome-file>index.html</welcome-file>
+		<welcome-file>index.htm</welcome-file>
+		<welcome-file>index.jsp</welcome-file>
+		<welcome-file>default.html</welcome-file>
+		<welcome-file>default.htm</welcome-file>
+		<welcome-file>default.jsp</welcome-file>
+	</welcome-file-list>
+</web-app>
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/web22.war b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/web22.war
new file mode 100644
index 0000000..7678e1c
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/web22.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/web22.xml b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/web22.xml
new file mode 100644
index 0000000..f9ac38d
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/web22.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN" "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
+<web-app id="WebApp_ID">
+	<display-name>EAR12Web</display-name>
+	<welcome-file-list>
+		<welcome-file>index.html</welcome-file>
+		<welcome-file>index.htm</welcome-file>
+		<welcome-file>index.jsp</welcome-file>
+		<welcome-file>default.html</welcome-file>
+		<welcome-file>default.htm</welcome-file>
+		<welcome-file>default.jsp</welcome-file>
+	</welcome-file-list>
+</web-app>
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/web23.war b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/web23.war
new file mode 100644
index 0000000..d89fda2
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/web23.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/web23.xml b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/web23.xml
new file mode 100644
index 0000000..36f56e0
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/web23.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
+<web-app id="WebApp_ID">
+	<display-name>EAR13Web</display-name>
+	<welcome-file-list>
+		<welcome-file>index.html</welcome-file>
+		<welcome-file>index.htm</welcome-file>
+		<welcome-file>index.jsp</welcome-file>
+		<welcome-file>default.html</welcome-file>
+		<welcome-file>default.htm</welcome-file>
+		<welcome-file>default.jsp</welcome-file>
+	</welcome-file-list>
+</web-app>
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/web24.war b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/web24.war
new file mode 100644
index 0000000..9ef73f6
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/web24.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/web24.xml b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/web24.xml
new file mode 100644
index 0000000..54f82b5
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/web24.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
+	<display-name>
+	EAR14Web</display-name>
+	<welcome-file-list>
+		<welcome-file>index.html</welcome-file>
+		<welcome-file>index.htm</welcome-file>
+		<welcome-file>index.jsp</welcome-file>
+		<welcome-file>default.html</welcome-file>
+		<welcome-file>default.htm</welcome-file>
+		<welcome-file>default.jsp</welcome-file>
+	</welcome-file-list>
+</web-app>
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/web25.war b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/web25.war
new file mode 100644
index 0000000..37f3001
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/web25.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/web25.xml b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/web25.xml
new file mode 100644
index 0000000..6ccdda7
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/headerParserTestData/web25.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<web-app id="WebApp_ID" version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
+	<display-name>
+	EAR5Web</display-name>
+	<welcome-file-list>
+		<welcome-file>index.html</welcome-file>
+		<welcome-file>index.htm</welcome-file>
+		<welcome-file>index.jsp</welcome-file>
+		<welcome-file>default.html</welcome-file>
+		<welcome-file>default.htm</welcome-file>
+		<welcome-file>default.jsp</welcome-file>
+	</welcome-file-list>
+</web-app>
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/testOutputs/12AppClientTest_withoutSource.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/testOutputs/12AppClientTest_withoutSource.jar
new file mode 100644
index 0000000..b2d7eed
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/testOutputs/12AppClientTest_withoutSource.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/testOutputs/13AppClientTest_withoutSource.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/testOutputs/13AppClientTest_withoutSource.jar
new file mode 100644
index 0000000..b07d371
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/testOutputs/13AppClientTest_withoutSource.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/testOutputs/13AppClient_withoutSource.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/testOutputs/13AppClient_withoutSource.jar
new file mode 100644
index 0000000..69f4ee4
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/testOutputs/13AppClient_withoutSource.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/testOutputs/AppClientExpTest_withoutSource.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/testOutputs/AppClientExpTest_withoutSource.jar
new file mode 100644
index 0000000..fb54025
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/testOutputs/AppClientExpTest_withoutSource.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/testOutputs/AppClientNoSource_withoutSource.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/testOutputs/AppClientNoSource_withoutSource.jar
new file mode 100644
index 0000000..2b2168c
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/testOutputs/AppClientNoSource_withoutSource.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/testOutputs/AppClientSomeSource_withoutSource.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/testOutputs/AppClientSomeSource_withoutSource.jar
new file mode 100644
index 0000000..0348d59
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/testOutputs/AppClientSomeSource_withoutSource.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/testOutputs/AppClientSource_withoutSource.jar b/tests/org.eclipse.jst.j2ee.tests/TestData/testOutputs/AppClientSource_withoutSource.jar
new file mode 100644
index 0000000..421f0dd
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/testOutputs/AppClientSource_withoutSource.jar
Binary files differ
diff --git a/docs/org.eclipse.wst.web.ui.infopop/about.html b/tests/org.eclipse.jst.j2ee.tests/about.html
similarity index 100%
copy from docs/org.eclipse.wst.web.ui.infopop/about.html
copy to tests/org.eclipse.jst.j2ee.tests/about.html
diff --git a/tests/org.eclipse.jst.j2ee.tests/build.properties b/tests/org.eclipse.jst.j2ee.tests/build.properties
new file mode 100644
index 0000000..d7fb32c
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/build.properties
@@ -0,0 +1,30 @@
+###############################################################################
+# Copyright (c) 2005, 2007 IBM 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:
+#     IBM Corporation - initial API and implementation
+###############################################################################
+source.j2ee-tests.jar = j2ee-tests/,\
+                        webmodule-tests/,\
+                        defect-tests/,\
+                        savestrategy-tests/,\
+                        j2ee-verifiers/
+output.j2ee-tests.jar = bin/
+bin.includes = plugin.xml,\
+               j2ee-tests.jar,\
+               TestData/,\
+               testHOLD.xml,\
+               about.html,\
+               DefectTestData/,\
+               META-INF/,\
+               bvt.properties
+src.includes = build.properties,\
+               testHOLD.xml,\
+               plugin.xml,\
+               TestData/,\
+               DefectTestData/,\
+               bvt.properties
diff --git a/tests/org.eclipse.jst.j2ee.tests/bvt.properties b/tests/org.eclipse.jst.j2ee.tests/bvt.properties
new file mode 100644
index 0000000..762b351
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/bvt.properties
@@ -0,0 +1,23 @@
+###############################################################################
+# Copyright (c) 2010 IBM 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:
+#     IBM Corporation - initial API and implementation
+###############################################################################
+
+# To run all the buckets in the BVT, uncomment org.eclipse.jst.j2ee.tests.bvt.ALL (the rest of the
+# properties will be ignored). 
+# To run individual buckets, comment out org.eclipse.jst.j2ee.tests.bvt.ALL and
+# uncomment the corresponding properties.
+
+#org.eclipse.jst.j2ee.tests.bvt.ALL = true
+org.eclipse.jst.j2ee.tests.bvt.EnterpriseBVT = true
+org.eclipse.jst.j2ee.tests.bvt.EJBBVT = true
+org.eclipse.jst.j2ee.tests.bvt.WebBVT = true
+org.eclipse.jst.j2ee.tests.bvt.CoreInfrastructureBVT = true
+org.eclipse.jst.j2ee.tests.bvt.ModelProviderBVT = true
+org.eclipse.jst.j2ee.tests.bvt.ExtendedModelProviderBVT = true
diff --git a/tests/org.eclipse.jst.j2ee.tests/defect-tests/org/eclipse/jst/j2ee/defect/tests/ClasspathContainerThreading.java b/tests/org.eclipse.jst.j2ee.tests/defect-tests/org/eclipse/jst/j2ee/defect/tests/ClasspathContainerThreading.java
new file mode 100644
index 0000000..c95a98c
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/defect-tests/org/eclipse/jst/j2ee/defect/tests/ClasspathContainerThreading.java
@@ -0,0 +1,166 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.defect.tests;
+
+import java.io.InputStream;
+import java.io.StringBufferInputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveManifest;
+import org.eclipse.jst.j2ee.internal.common.classpath.J2EEComponentClasspathUpdater;
+import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
+import org.eclipse.jst.j2ee.project.JavaEEProjectUtilities;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualFile;
+
+public class ClasspathContainerThreading {
+
+	public final int LOOPS = 10;
+	private final List threads = new ArrayList();
+
+	class EARRunnable implements Runnable {
+		IProject project;
+
+		public EARRunnable(IProject earProject) {
+			this.project = earProject;
+		}
+
+		public void run() {
+			try {
+				for (int i = 0; i < LOOPS; i++) {
+					IVirtualComponent comp = ComponentCore.createComponent(project);
+					IVirtualFile vFile = comp.getRootFolder().getFile("foo.jar");
+					IFile iFile = vFile.getUnderlyingFile();
+					InputStream in = new StringBufferInputStream("foo.jar");
+					iFile.create(in, true, null);
+					Thread.sleep(10);
+					iFile.delete(true, null);
+					Thread.sleep(10);
+				}
+			} catch (Exception e) {
+				e.printStackTrace();
+			} finally {
+				synchronized (threads) {
+					threads.remove(Thread.currentThread());
+				}
+			}
+		}
+	};
+
+	class ForceUpdateRunnable implements Runnable {
+		IProject project;
+
+		public ForceUpdateRunnable(IProject project) {
+			this.project = project;
+		}
+
+		public void run() {
+			try {
+				for (int i = 0; i < LOOPS * 2; i++) {
+					J2EEComponentClasspathUpdater.getInstance().queueUpdate(project);
+					Thread.sleep(10);
+				}
+			} catch (Exception e) {
+				e.printStackTrace();
+			} finally {
+				synchronized (threads) {
+					threads.remove(Thread.currentThread());
+				}
+			}
+		}
+	};
+
+	class ModuleRunnable implements Runnable {
+		IProject project;
+
+		public ModuleRunnable(IProject project) {
+			this.project = project;
+		}
+
+		public void run() {
+			try {
+				for (int i = 0; i < LOOPS; i++) {
+					ArchiveManifest manifest = J2EEProjectUtilities.readManifest(project);
+					manifest.addEntry("foo.jar");
+					J2EEProjectUtilities.writeManifest(project, manifest);
+					Thread.sleep(10);
+					manifest = J2EEProjectUtilities.readManifest(project);
+					manifest.removeEntry("foo.jar");
+					J2EEProjectUtilities.writeManifest(project, manifest);
+					Thread.sleep(10);
+				}
+			} catch (Exception e) {
+				e.printStackTrace();
+			} finally {
+				synchronized (threads) {
+					threads.remove(Thread.currentThread());
+				}
+			}
+		}
+	};
+
+
+	public ClasspathContainerThreading() {
+
+	}
+
+	public void testDeadlock() {
+		IProject[] allProjects = J2EEProjectUtilities.getAllProjects();
+		List earProjects = new ArrayList();
+		List modulesProjects = new ArrayList();
+		for (int i = 0; i < allProjects.length; i++) {
+			if (JavaEEProjectUtilities.isEARProject(allProjects[i])) {
+				earProjects.add(allProjects[i]);
+			} else {
+				IVirtualComponent comp = ComponentCore.createComponent(allProjects[i]);
+				if (comp != null) {
+					modulesProjects.add(allProjects[i]);
+				}
+			}
+		}
+
+
+
+		for (int i = 0; i < earProjects.size(); i++) {
+			threads.add(new Thread(new EARRunnable((IProject) earProjects.get(i))));
+			threads.add(new Thread(new ForceUpdateRunnable((IProject) earProjects.get(i))));
+		}
+		for (int i = 0; i < modulesProjects.size(); i++) {
+			threads.add(new Thread(new ModuleRunnable((IProject) modulesProjects.get(i))));
+			threads.add(new Thread(new ForceUpdateRunnable((IProject) modulesProjects.get(i))));
+		}
+
+		synchronized (threads) {
+			for (int i = 0; i < threads.size(); i++) {
+				((Thread) threads.get(i)).start();
+			}
+		}
+
+		boolean shouldContinue = true;
+		while (shouldContinue) {
+			try {
+				Thread.sleep(100);
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+			synchronized (threads) {
+				shouldContinue = !threads.isEmpty();
+			}
+		}
+
+
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/defect-tests/org/eclipse/jst/j2ee/defect/tests/DefectVerificationTests.java b/tests/org.eclipse.jst.j2ee.tests/defect-tests/org/eclipse/jst/j2ee/defect/tests/DefectVerificationTests.java
new file mode 100644
index 0000000..500b539
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/defect-tests/org/eclipse/jst/j2ee/defect/tests/DefectVerificationTests.java
@@ -0,0 +1,875 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2012 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.defect.tests;
+
+//import java.io.File;
+import java.io.File;
+import java.io.StringBufferInputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.Assert;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.jobs.IJobManager;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.etools.common.test.apitools.ProjectUnzipUtil;
+import org.eclipse.jdt.core.IClasspathContainer;
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jem.util.logger.proxy.Logger;
+import org.eclipse.jst.j2ee.application.internal.operations.EARComponentExportDataModelProvider;
+import org.eclipse.jst.j2ee.application.internal.operations.EARComponentImportDataModelProvider;
+import org.eclipse.jst.j2ee.application.internal.operations.J2EEComponentExportDataModelProvider;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.CommonarchiveFactory;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.CommonarchivePackage;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.EARFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.ModuleFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.WARFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveOptions;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.RuntimeClasspathEntry;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.util.ArchiveUtil;
+import org.eclipse.jst.j2ee.componentcore.EnterpriseArtifactEdit;
+import org.eclipse.jst.j2ee.componentcore.J2EEModuleVirtualArchiveComponent;
+import org.eclipse.jst.j2ee.componentcore.util.EARArtifactEdit;
+import org.eclipse.jst.j2ee.datamodel.properties.IEARComponentExportDataModelProperties;
+import org.eclipse.jst.j2ee.datamodel.properties.IEARComponentImportDataModelProperties;
+import org.eclipse.jst.j2ee.datamodel.properties.IJ2EEComponentExportDataModelProperties;
+import org.eclipse.jst.j2ee.dependency.tests.util.ProjectUtil;
+import org.eclipse.jst.j2ee.ejb.project.operations.IEjbFacetInstallDataModelProperties;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.j2ee.internal.archive.JavaEEArchiveUtilities;
+import org.eclipse.jst.j2ee.internal.common.J2EEVersionUtil;
+import org.eclipse.jst.j2ee.internal.common.classpath.J2EEComponentClasspathUpdater;
+import org.eclipse.jst.j2ee.internal.plugin.IJ2EEModuleConstants;
+import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
+import org.eclipse.jst.j2ee.internal.web.archive.operations.WebComponentExportDataModelProvider;
+import org.eclipse.jst.j2ee.internal.web.archive.operations.WebComponentImportDataModelProvider;
+import org.eclipse.jst.j2ee.internal.web.archive.operations.WebFacetProjectCreationDataModelProvider;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetProjectCreationDataModelProperties;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEModuleFacetInstallDataModelProperties;
+import org.eclipse.jst.j2ee.project.facet.IJavaProjectMigrationDataModelProperties;
+import org.eclipse.jst.j2ee.project.facet.JavaProjectMigrationDataModelProvider;
+import org.eclipse.jst.j2ee.web.datamodel.properties.IWebComponentImportDataModelProperties;
+import org.eclipse.jst.j2ee.web.project.facet.IWebFacetInstallDataModelProperties;
+import org.eclipse.jst.j2ee.webapplication.WebApp;
+import org.eclipse.jst.jee.archive.IArchive;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.datamodel.properties.ICreateReferenceComponentsDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetInstallDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties.FacetDataModelMap;
+import org.eclipse.wst.common.componentcore.internal.operation.CreateReferenceComponentsDataModelProvider;
+import org.eclipse.wst.common.componentcore.internal.util.ComponentUtilities;
+import org.eclipse.wst.common.componentcore.internal.util.IModuleConstants;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
+import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
+import org.eclipse.wst.common.componentcore.resources.IVirtualResource;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.project.facet.core.IProjectFacet;
+import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
+import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
+import org.eclipse.wst.common.tests.OperationTestCase;
+import org.eclipse.wst.common.tests.ProjectUtility;
+import org.eclipse.wtp.j2ee.headless.tests.plugin.HeadlessTestsPlugin;
+import org.eclipse.wtp.j2ee.headless.tests.web.operations.WebImportOperationTest;
+
+public class DefectVerificationTests extends OperationTestCase {
+
+	public static String BASE_DATA_DIRECTORY = System.getProperty("user.dir") + java.io.File.separatorChar + "DefectTestData" + java.io.File.separatorChar;
+	private static final String TEST_DATA_PATH = System.getProperty("user.dir") + java.io.File.separatorChar + "TestData" + java.io.File.separatorChar;
+	
+	
+	private static String getDataPath(String suffix) {
+		return BASE_DATA_DIRECTORY + "componentLoadAdapterTestData" + java.io.File.separatorChar + suffix;
+	}
+	
+	public static String getFullTestDataPath(String dataPath) {
+		try {
+			String defectTestDataPath = "DefectTestData" + fileSep + dataPath;
+			HeadlessTestsPlugin plugin = HeadlessTestsPlugin.getDefault();
+			if (plugin != null) {
+				return ProjectUtility.getFullFileName(plugin, defectTestDataPath);
+			}
+			return System.getProperty("user.dir") + java.io.File.separatorChar + defectTestDataPath;
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return "";
+	}
+	
+	
+	public void _test261508() throws Exception {
+		String earFileName = getFullTestDataPath("EARForLibDep.ear");
+		IDataModel model = DataModelFactory.createDataModel(new EARComponentImportDataModelProvider());
+		model.setProperty(IEARComponentImportDataModelProperties.FILE_NAME, earFileName);
+		runAndVerify(model);
+	
+		IVirtualComponent webComponent = ComponentCore.createComponent(J2EEProjectUtilities.getProject("WebForLibDep"));
+		IVirtualReference[] refs = webComponent.getReferences();
+		Assert.assertTrue(refs.length == 2);
+		for( IVirtualReference ref : refs ){
+			IVirtualComponent refComponent = ref.getReferencedComponent();
+			if ( refComponent instanceof J2EEModuleVirtualArchiveComponent ){
+				J2EEModuleVirtualArchiveComponent j2eeVirtualArchive = (J2EEModuleVirtualArchiveComponent)refComponent;
+				Assert.assertTrue( j2eeVirtualArchive.getName().endsWith("EjbTestClient.jar"));
+			}
+		}
+	}
+	
+	/**
+	 * Test for https://bugs.eclipse.org/bugs/show_bug.cgi?id=130657
+	 */
+	public void test130657() throws Exception {
+		IDataModel model = DataModelFactory.createDataModel(new WebFacetProjectCreationDataModelProvider());
+		model.setProperty(IWebFacetInstallDataModelProperties.FACET_PROJECT_NAME, "Test120018");
+		model.getDefaultOperation().execute(null, null);
+
+		IVirtualComponent component = ComponentUtilities.getComponent("Test120018");
+
+		IFolder folder = component.getProject().getFolder("imported_classes");
+		folder.create(true,true,null);
+		IFile fakeClassFile = folder.getFile("Fake.class");
+		fakeClassFile.create(new StringBufferInputStream(""),true,null);
+		Assert.assertTrue("Class file should have been created in project.",component.getProject().exists(fakeClassFile.getProjectRelativePath()));
+
+		final IVirtualFolder jsrc = component.getRootFolder().getFolder("/WEB-INF/classes");
+		jsrc.createLink(folder.getProjectRelativePath(), 0, null);
+		Assert.assertEquals("Should be a link for each class in imported_classes.",folder.members().length, jsrc.members().length);
+		
+		//Export war
+		IDataModel dataModel = DataModelFactory.createDataModel(new WebComponentExportDataModelProvider());
+		dataModel.setProperty(J2EEComponentExportDataModelProvider.ARCHIVE_DESTINATION, getDataPath("testblah.war"));
+		dataModel.setProperty(J2EEComponentExportDataModelProvider.COMPONENT, component);
+		dataModel.setBooleanProperty(J2EEComponentExportDataModelProvider.EXPORT_SOURCE_FILES, true);
+		dataModel.setBooleanProperty(J2EEComponentExportDataModelProvider.OVERWRITE_EXISTING, true);
+		IStatus status = dataModel.getDefaultOperation().execute(null, null);
+		Assert.assertEquals("Creating WAR failed " + status.getMessage(), IStatus.OK, status.getSeverity());
+		
+		IArchive archiveWAR = JavaEEArchiveUtilities.INSTANCE.openArchive(new Path(getDataPath("testblah.war")));
+		for(int i=0; i<jsrc.members().length; i++) {
+			Assert.assertTrue("Archive does not contain resource for each linked imported class.",
+				archiveWAR.containsArchiveResource((jsrc.members())[i].getRuntimePath().makeRelative()));
+		}
+		
+		//archiveWAR.
+		JavaEEArchiveUtilities.INSTANCE.closeArchive(archiveWAR);
+	}
+
+
+	/**
+	 * Test for https://bugs.eclipse.org/bugs/show_bug.cgi?id=120018
+	 */
+	public void test120018() throws Exception {
+		IDataModel model = DataModelFactory.createDataModel(new WebFacetProjectCreationDataModelProvider());
+		model.setProperty(IWebFacetInstallDataModelProperties.FACET_PROJECT_NAME, "Test120018");
+		model.getDefaultOperation().execute(null, null);
+
+		IVirtualComponent component = ComponentUtilities.getComponent("Test120018");
+
+		
+		IVirtualFolder folder = component.getRootFolder().getFolder("imported_classes");
+		folder.create(IResource.NONE, null);
+		IPath folderPath = folder.getProjectRelativePath();
+	
+		final IVirtualFolder jsrc = component.getRootFolder().getFolder("/WEB-INF/classes");
+		jsrc.createLink(folder.getProjectRelativePath(), 0, null);
+		
+		J2EEComponentClasspathUpdater.getInstance().forceUpdate(Collections.singleton(component.getProject()));
+		IJobManager manager = Job.getJobManager(); 
+		Job [] jobs = manager.find(J2EEComponentClasspathUpdater.MODULE_UPDATE_JOB_NAME);
+		if(jobs.length > 0){
+			try {
+				for (int i = 0; i < jobs.length; i++){
+					if(jobs[i].getName().equals(J2EEComponentClasspathUpdater.MODULE_UPDATE_JOB_NAME))
+						jobs[i].join();
+				}
+			} catch (InterruptedException e) {
+				Logger.getLogger().log(e);
+			}
+		}
+
+		IJavaProject javaProject = JavaCore.create(component.getProject());
+		IClasspathEntry[] entries = javaProject.getRawClasspath();
+		boolean foundImportedClasses = false;
+		for (int i = 0; i < entries.length && !foundImportedClasses; i++) {
+			if (IClasspathEntry.CPE_CONTAINER == entries[i].getEntryKind()) {
+				IClasspathContainer container = JavaCore.getClasspathContainer(entries[i].getPath(), javaProject);
+				IClasspathEntry[] containerEntries = container.getClasspathEntries();
+				for (int j = 0; j < containerEntries.length && !foundImportedClasses; j++) {
+					IPath entryPath = containerEntries[j].getPath().removeFirstSegments(1);
+					foundImportedClasses = folderPath.equals(entryPath);
+					if (foundImportedClasses) break;
+				}
+			}
+
+		}
+		Assert.assertTrue(foundImportedClasses);
+	}
+
+	/**
+	 * Test for https://bugs.eclipse.org/bugs/show_bug.cgi?id=105901
+	 */
+	public void test105901() throws Exception {
+		String earFileName = getFullTestDataPath("Collision.ear");
+		IDataModel model = DataModelFactory.createDataModel(new EARComponentImportDataModelProvider());
+		model.setProperty(IEARComponentImportDataModelProperties.FILE_NAME, earFileName);
+		runAndVerify(model);
+		IVirtualComponent comp = (IVirtualComponent) model.getProperty(IEARComponentImportDataModelProperties.COMPONENT);
+		IVirtualReference[] refs = comp.getReferences();
+		assertEquals(3, refs.length);
+	}
+
+	/**
+	 * Test for https://bugs.eclipse.org/bugs/show_bug.cgi?id=109430
+	 */
+	public void test109430() throws Exception {
+		String earFileName = getFullTestDataPath("EJBLocalAndRemoteRefEARWithClientJars.ear");
+		IDataModel model = DataModelFactory.createDataModel(new EARComponentImportDataModelProvider());
+		model.setProperty(IEARComponentImportDataModelProperties.FILE_NAME, earFileName);
+		List moduleList = (List) model.getProperty(IEARComponentImportDataModelProperties.SELECTED_MODELS_LIST);
+
+		runAndVerify(model);
+		IVirtualComponent component = (IVirtualComponent) model.getProperty(IEARComponentImportDataModelProperties.COMPONENT);
+		EnterpriseArtifactEdit artifactEdit = null;
+		try {
+			artifactEdit = EARArtifactEdit.getEARArtifactEditForRead(component);
+			EARFile earFile = null;
+			try {
+				earFile = (EARFile) artifactEdit.asArchive(true);
+				earFile.getEJBReferences(false, false);
+			} finally {
+				if (earFile != null) {
+					earFile.close();
+				}
+			}
+		} finally {
+			if (artifactEdit != null) {
+				artifactEdit.dispose();
+			}
+		}
+	}
+
+	/**
+	 * Test for https://bugs.eclipse.org/bugs/show_bug.cgi?id=112636
+	 */
+	public void test112636() throws Exception {
+		checkDeploy("BeenThere.ear");
+	}
+
+	/**
+	 * Test for https://bugs.eclipse.org/bugs/show_bug.cgi?id=112835
+	 */
+	public void test112835() throws Exception {
+		checkDeploy("sib.test.mediations.m5.JsMBR.ear");
+	}
+
+
+	/**
+	 * Test for https://bugs.eclipse.org/bugs/show_bug.cgi?id=121158
+	 */
+	public void test121158() throws Exception {
+		String earFileName = getFullTestDataPath("EAR121158.ear"); //$NON-NLS-1$
+		EARFile earFile = null;
+		try {
+			ArchiveOptions opts = new ArchiveOptions();
+			opts.setIsReadOnly(true);
+			earFile = CommonarchiveFactory.eINSTANCE.openEARFile(opts, earFileName);
+
+			List moduleList = earFile.getModuleFiles();
+			for (int i = 0; i < moduleList.size(); i++) {
+				ModuleFile module = (ModuleFile) moduleList.get(i);
+				RuntimeClasspathEntry[] entries = module.getFullRuntimeClassPath();
+				assertEquals(2, entries.length);
+				assertTrue(entries[0].toString().endsWith(module.getURI()));
+				assertTrue(entries[1].toString().endsWith("EAR121158Util.jar")); //$NON-NLS-1$
+			}
+
+		} finally {
+			if (earFile != null && earFile.isOpen()) {
+				earFile.close();
+				earFile = null;
+			}
+		}
+	}
+
+	protected void checkDeploy(String earName) throws Exception {
+		String earFileName = getFullTestDataPath(earName);
+		IDataModel model = DataModelFactory.createDataModel(new EARComponentImportDataModelProvider());
+		model.setProperty(IEARComponentImportDataModelProperties.FILE_NAME, earFileName);
+
+		runAndVerify(model);
+		IVirtualComponent comp = (IVirtualComponent) model.getProperty(IEARComponentImportDataModelProperties.COMPONENT);
+		EnterpriseArtifactEdit earEdit = EARArtifactEdit.getEARArtifactEditForRead(comp);
+		EARFile earFile = (EARFile) earEdit.asArchive(false);
+		earFile.getEJBReferences(true, true);
+		earFile.getEJBReferences(true, false);
+		earFile.getEJBReferences(false, true);
+		earFile.getEJBReferences(false, false);
+		earFile.close();
+		earFile = null;
+
+		Thread.sleep(5000);
+
+		String earOutputName = "c:\\temp\\Output" + System.currentTimeMillis() + ".ear";
+		IDataModel export = DataModelFactory.createDataModel(new EARComponentExportDataModelProvider());
+		export.setProperty(IEARComponentExportDataModelProperties.PROJECT_NAME, comp.getProject().getName());
+		export.setProperty(IEARComponentExportDataModelProperties.ARCHIVE_DESTINATION, earOutputName);
+		runAndVerify(export);
+
+
+	}
+	
+	/**
+	 * Test for https://bugs.eclipse.org/bugs/show_bug.cgi?id=143483
+	 */
+	public void test143483() throws Exception {
+		checkDeploy("undeployed_DefaultApplication.ear");//$NON-NLS-1$
+	}
+
+	/**
+	 * Test for https://bugs.eclipse.org/bugs/show_bug.cgi?id=144288
+
+	public void test144288() throws Exception {
+		String earName = "WorkAreaFvtApp.ear";//$NON-NLS-1$
+		String earFileName = getFullTestDataPath(earName);
+		IDataModel model = DataModelFactory.createDataModel(new EARComponentImportDataModelProvider());
+		model.setProperty(IEARComponentImportDataModelProperties.FILE_NAME, earFileName);
+
+		List moduleList = (List) model.getProperty(IEARComponentImportDataModelProperties.SELECTED_MODELS_LIST);
+		for (int i = moduleList.size() - 1; i > -1; i--) {
+			IDataModel aModel = (IDataModel) moduleList.get(i);
+			Object file = aModel.getProperty(IEARComponentImportDataModelProperties.FILE);
+			if (file instanceof ModuleFile) {
+				ModuleFile moduleFile = (ModuleFile) file;
+				if (moduleFile.isWARFile())
+					moduleList.remove(aModel);
+				if (moduleFile.isApplicationClientFile())
+					moduleList.remove(aModel);
+			}
+		}
+
+		runAndVerify(model);
+		IVirtualComponent comp = (IVirtualComponent) model.getProperty(IEARComponentImportDataModelProperties.COMPONENT);
+		String appClientURI = "WorkAreaFvtClient.jar";//$NON-NLS-1$
+
+		IFile file = ComponentUtilities.findFile(comp, new Path(appClientURI));
+		ApplicationClientFile appClientJar = CommonarchiveFactoryImpl.getActiveFactory().openApplicationClientFile(file.getLocation().toOSString());
+		ArchiveManifest manf = appClientJar.getManifest();
+		String existingEntries[] = manf.getClassPathTokenized();
+		manf.appendClassPath("foo.jar");//$NON-NLS-1$
+		appClientJar.saveNoReopen();
+
+		String earOutputName = "d:\\temp\\Output" + System.currentTimeMillis() + ".ear";
+		IDataModel export = DataModelFactory.createDataModel(new EARComponentExportDataModelProvider());
+		export.setProperty(IEARComponentExportDataModelProperties.PROJECT_NAME, comp.getProject().getName());
+		export.setProperty(IEARComponentExportDataModelProperties.ARCHIVE_DESTINATION, earOutputName);
+		runAndVerify(export);
+	}
+	*/
+
+	/**
+	 * Test for https://bugs.eclipse.org/bugs/show_bug.cgi?id=145460
+	 */
+	public void test145460() throws Exception {
+		String warName = "Example1.war"; //$NON-NLS-1$
+		String warFileName = getFullTestDataPath(warName);
+
+		IDataModel dataModel = DataModelFactory.createDataModel(new WebComponentImportDataModelProvider());
+		dataModel.setProperty(IJ2EEFacetProjectCreationDataModelProperties.EAR_PROJECT_NAME, "AN_EAR");
+		dataModel.setBooleanProperty(IJ2EEFacetProjectCreationDataModelProperties.ADD_TO_EAR, true);
+		dataModel.setProperty(IWebComponentImportDataModelProperties.FILE_NAME, warFileName);
+		dataModel.setProperty(IWebComponentImportDataModelProperties.PROJECT_NAME, "A_WAR");
+		runAndVerify(dataModel);
+	}
+
+	/**
+	 * Test for https://bugs.eclipse.org/bugs/show_bug.cgi?id=149995
+	 */
+	public void test149995() throws Exception {
+		String earName = "149995.ear";//$NON-NLS-1$
+		String earFileName = getFullTestDataPath(earName);
+		IDataModel model = DataModelFactory.createDataModel(new EARComponentImportDataModelProvider());
+		model.setProperty(IEARComponentImportDataModelProperties.FILE_NAME, earFileName);
+		runAndVerify(model);
+		
+		IVirtualComponent earComponent = ComponentCore.createComponent(J2EEProjectUtilities.getProject("149995"));
+		IVirtualResource [] members = earComponent.getRootFolder().members();
+		Assert.assertEquals(5, members.length);
+		
+		setUp();
+		
+		model = DataModelFactory.createDataModel(new EARComponentImportDataModelProvider());
+		model.setProperty(IEARComponentImportDataModelProperties.FILE_NAME, earFileName);
+		model.setProperty(IEARComponentImportDataModelProperties.MODULE_MODELS_LIST, Collections.EMPTY_LIST);
+		runAndVerify(model);
+		
+		earComponent = ComponentCore.createComponent(J2EEProjectUtilities.getProject("149995"));
+		members = earComponent.getRootFolder().members();
+		Assert.assertEquals(5, members.length);
+	}	
+		
+	/**
+	 * The following code checks to ensure classpaths are being setup properly for dependent projects
+	 * In the ear there is one AppClient which depends directly on the utility jar C which contains class test.C.
+	 * The utility jar C depends on the utility jar B which contains class test.B
+	 * The utility jar B depends on the utility jar A which contains class test.A
+	 * 
+	 * This portion of the test ensures the classpath is setup properly by importing every combination of the 
+	 * A, B, and C utility jars along with AppClient.  Then the types test.A, test.B, and test.C are opened through
+	 * AppClient to ensure they are pulled from the correct location (the utility jars in the EAR, or the expanded projects)
+	 * 
+	 */
+	public void test149995_BinaryClaspathTest() throws Exception {	
+//		int A = 1;
+//		int B = 2;
+//		int C = 4;
+//		
+//		String earName = "149995BinaryClasspathTest.ear";//$NON-NLS-1$
+//		String earFileName = getFullTestDataPath(earName);
+//		
+//		for(int i=0; i<8; i++){
+//			setUp();
+//			
+//			IDataModel model = DataModelFactory.createDataModel(new EARComponentImportDataModelProvider());
+//			model.setProperty(IEARComponentImportDataModelProperties.FILE_NAME, earFileName);
+//			List utilityArchives = EARComponentImportDataModelProvider.getAllUtilities((EARFile) model.getProperty(IEARComponentImportDataModelProperties.FILE));
+//			List utilsList = new ArrayList();
+//			
+//			for(int j =0;j<utilityArchives.size(); j++){
+//				Archive archive = (Archive)utilityArchives.get(j);
+//				String projectName = archive.getName();
+//				if((i & A) == A && "A.jar".equals(projectName)){
+//					utilsList.add(archive);
+//				} else if((i & B) == B && "B.jar".equals(projectName)){
+//					utilsList.add(archive);
+//				} else if((i & C) == C && "C.jar".equals(projectName)){
+//					utilsList.add(archive);
+//				}
+//			}
+//			model.setProperty(IEARComponentImportDataModelProperties.UTILITY_LIST, utilsList);
+//			runAndVerify(model);
+//			
+//			IJavaProject appClient = JavaCore.create(J2EEProjectUtilities.getProject("AppClient"));
+//			IType aType = appClient.findType("test.A");
+//			Assert.assertNotNull(aType);
+//			if((i & A) == A ){
+//				Assert.assertTrue(aType instanceof SourceType);
+//			} else {
+//				Assert.assertTrue(aType instanceof BinaryType);
+//			}
+//			
+//			IType bType = appClient.findType("test.B");
+//			Assert.assertNotNull(bType);
+//			if((i & B) == B ){
+//				Assert.assertTrue(bType instanceof SourceType);
+//			} else {
+//				Assert.assertTrue(bType instanceof BinaryType);
+//			}
+//			
+//			IType cType = appClient.findType("test.C");
+//			Assert.assertNotNull(cType);
+//			if((i & C) == C ){
+//				Assert.assertTrue(cType instanceof SourceType);
+//			} else {
+//				Assert.assertTrue(cType instanceof BinaryType);
+//			}
+//		}
+	}
+	
+	/**
+	 * Test for https://bugs.eclipse.org/bugs/show_bug.cgi?id=145031
+	 */
+	/*
+	public void test145031() throws Exception {
+		String [] shortNames = new String [] { "JarTest.man.jar", "JarTest.auto.jar"};
+		
+		for (int i = 0; i < shortNames.length; i++) {
+			//System.out.println("trying shortName ="+shortNames[i]);
+			String longName = getFullTestDataPath(shortNames[i]);
+			//System.out.println("longName ="+longName);
+			URLClassLoader jarCL = new URLClassLoader(new URL[] { new URL("file:\\"+longName) });
+			Enumeration resources = jarCL.getResources("META-INF/");
+			boolean foundResource = false;
+			while(resources.hasMoreElements()){
+				URL url = (URL)resources.nextElement();
+				
+				if(url.toString().indexOf(shortNames[i]) != -1){
+					//System.out.println("  Found URL with URLClassLoader.getResources(\"META-INF/\") ");
+					//System.out.println("  url = "+ url);
+					foundResource = true;
+				}
+			}
+			
+			//this is cheating because we know the the manual archive is first and does not have the directory info
+			// and that second index is auto and should have the directory info
+			if(i == 0) {
+				Assert.assertFalse("Should not have found URL with URLClassLoader.getResources(\"META-INF/\") ", foundResource);
+			} else if(i == 1) {
+				Assert.assertTrue("Didn't find URL with URLClassLoader.getResources(\"META-INF/\") ", foundResource);
+			}
+			
+			if(!foundResource){
+				System.out.println("  Didn't find URL with URLClassLoader.getResources(\"META-INF/\") ");
+			}
+
+			ZipFile zipFile = new ZipFile(longName);
+			Enumeration entries = zipFile.entries();
+			while(entries.hasMoreElements()){
+				ZipEntry entry = (ZipEntry)entries.nextElement();
+				System.out.println("  Entry found = "+entry);
+			}
+			
+		}
+	}
+	*/
+	
+	/**
+	 * Test for https://bugs.eclipse.org/bugs/show_bug.cgi?id=159481
+	 */
+	public void test159481() throws Exception {
+		ArchiveOptions options = new ArchiveOptions();
+		options.setRendererType(ArchiveOptions.DOM);
+		final String earPath = getFullTestDataPath("WebDavTest.war"); //$NON-NLS-1$
+		CommonarchivePackage pkg = CommonarchivePackage.eINSTANCE;
+		WARFile warFile = pkg.getCommonarchiveFactory().openWARFile(options, earPath);
+		warFile.getDeploymentDescriptor();
+
+	}
+	
+	
+	/**
+	 * To run this test, first override setUp() to do nothing, and then import a
+	 * few ear projects containing modules.
+	 * 
+	 * @throws Exception
+	 */
+	public void test145805() throws Exception {
+		ClasspathContainerThreading threading = new ClasspathContainerThreading();
+		threading.testDeadlock();
+	}
+	
+	public void test160562() throws Exception {
+		Assert.assertEquals("A.jar", ArchiveUtil.deriveEARRelativeURI("A.jar", "B.jar"));
+		Assert.assertEquals("A.jar", ArchiveUtil.deriveEARRelativeURI("./A.jar", "B.jar"));
+		Assert.assertEquals("A.jar", ArchiveUtil.deriveEARRelativeURI("A.jar", "./B.jar"));
+		Assert.assertEquals("A.jar", ArchiveUtil.deriveEARRelativeURI("././././A.jar", "B.jar"));
+		Assert.assertEquals("A.jar", ArchiveUtil.deriveEARRelativeURI("A.jar", "././././B.jar"));
+		Assert.assertEquals("A.jar", ArchiveUtil.deriveEARRelativeURI("././././A.jar", "././././B.jar"));
+		Assert.assertEquals("lib/A.jar", ArchiveUtil.deriveEARRelativeURI("A.jar", "lib/B.jar"));
+		Assert.assertEquals("lib/A.jar", ArchiveUtil.deriveEARRelativeURI("./A.jar", "lib/B.jar"));
+		Assert.assertEquals("A.jar", ArchiveUtil.deriveEARRelativeURI("../A.jar", "lib/B.jar"));
+		Assert.assertEquals("lib/A.jar", ArchiveUtil.deriveEARRelativeURI("../lib/A.jar", "lib/B.jar"));
+		Assert.assertEquals("A.jar", ArchiveUtil.deriveEARRelativeURI("../../../A.jar", "lib/foo/bar/B.jar"));
+		Assert.assertEquals("lib/A.jar", ArchiveUtil.deriveEARRelativeURI("../../A.jar", "lib/foo/bar/B.jar"));
+		Assert.assertEquals("lib/foo/A.jar", ArchiveUtil.deriveEARRelativeURI("../A.jar", "lib/foo/bar/B.jar"));
+		Assert.assertEquals("lib/foo/bar/A.jar", ArchiveUtil.deriveEARRelativeURI("A.jar", "lib/foo/bar/B.jar"));
+		Assert.assertEquals("lib/foo/bar/A.jar", ArchiveUtil.deriveEARRelativeURI("./A.jar", "lib/foo/bar/B.jar"));
+		Assert.assertEquals("lib/foo/bar/A.jar", ArchiveUtil.deriveEARRelativeURI("./A.jar", "lib/foo/bar/B.jar"));
+		Assert.assertEquals("lib/foo/bar/A.jar", ArchiveUtil.deriveEARRelativeURI("./../bar/../../foo/./bar/A.jar", "lib/foo/bar/B.jar"));
+		Assert.assertEquals("lib/foo/bar/A.jar", ArchiveUtil.deriveEARRelativeURI("./A.jar", "lib/foo/bar/B.jar"));
+	}
+	
+	/**
+	 * Test for https://bugs.eclipse.org/bugs/show_bug.cgi?id=184154
+	 */
+	public void test184154() throws Exception {
+
+		// Scenario 1 - create ejb project with add to ear and ejb client
+		
+		IDataModel dataModel = DataModelFactory.createDataModel(IEjbFacetInstallDataModelProperties.class);
+		
+		String projName = "TestAPIEjbProject";//$NON-NLS-1$
+		String ejbVersionString = J2EEVersionUtil.convertVersionIntToString(J2EEVersionConstants.EJB_2_1_ID);
+		IProjectFacet ejbFacet = ProjectFacetsManager.getProjectFacet(IModuleConstants.JST_EJB_MODULE);
+		IProjectFacetVersion ejbFacetVersion = ejbFacet.getVersion(ejbVersionString); //$NON-NLS-1$
+
+
+		dataModel.setProperty(IFacetDataModelProperties.FACET_PROJECT_NAME, projName);
+		FacetDataModelMap map = (FacetDataModelMap) dataModel
+				.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
+		IDataModel appmodel = (IDataModel) map.get(IModuleConstants.JST_EJB_MODULE);
+		appmodel.setProperty(IFacetInstallDataModelProperties.FACET_VERSION, ejbFacetVersion);
+		appmodel.setStringProperty(IJ2EEModuleFacetInstallDataModelProperties.CONFIG_FOLDER,"ejb333"); //$NON-NLS-1$
+
+		String ejbClientName =  projName + "Client"; //$NON-NLS-1$
+
+		map = (FacetDataModelMap) dataModel
+		.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
+		appmodel = (IDataModel) map.get(IModuleConstants.JST_EJB_MODULE);
+
+		appmodel.setBooleanProperty(IEjbFacetInstallDataModelProperties.CREATE_CLIENT, true);
+		appmodel.setStringProperty(IEjbFacetInstallDataModelProperties.CLIENT_NAME, ejbClientName);
+		
+		String clientURI = ejbClientName+"zzzzz"+IJ2EEModuleConstants.JAR_EXT;
+		
+		appmodel.setStringProperty(IEjbFacetInstallDataModelProperties.CLIENT_URI, clientURI);
+
+		String earProjName =  projName + "EAR"; //$NON-NLS-1$
+
+		dataModel.setBooleanProperty(IJ2EEFacetProjectCreationDataModelProperties.ADD_TO_EAR, true);
+		
+		dataModel.setProperty(IJ2EEFacetProjectCreationDataModelProperties.EAR_PROJECT_NAME, earProjName);
+
+	    runAndVerify(dataModel);
+
+	    IVirtualComponent component = ComponentUtilities.getComponent(earProjName);
+	    
+	    IVirtualComponent ejbClientComponent = ComponentUtilities.getComponent(ejbClientName);
+		
+	    IVirtualReference reference = component.getReference(ejbClientComponent.getName());
+		
+	    Assert.assertEquals(reference.getReferencedComponent(), ejbClientComponent);
+	    
+	    Assert.assertEquals(reference.getArchiveName(), clientURI);
+		
+		// Scenario 2 - create utility project with add to ear
+		
+	    String utilityProjectName = "TestUtilityProject";
+	    String utilEarProjectName     = utilityProjectName + "EAR"; //$NON-NLS-1$
+	    String utilityURI =  utilityProjectName + IJ2EEModuleConstants.JAR_EXT;
+	    
+        ProjectUtil.createUtilityProject(utilityProjectName	, utilEarProjectName);
+        
+	    IVirtualComponent earComponent = ComponentUtilities.getComponent(utilEarProjectName);
+	    
+	    IVirtualComponent utilClientComponent = ComponentUtilities.getComponent(utilityProjectName);
+		
+	    IVirtualReference reference1 = earComponent.getReference(utilClientComponent.getName());
+		
+	    Assert.assertEquals(reference1.getReferencedComponent(), utilClientComponent);
+	    
+	    Assert.assertEquals(reference1.getArchiveName(), utilityURI);
+       
+	    String javaProjectName = "TestJavaProject";
+	    
+	    // Scenario 3 - create java project add it as a j2ee module dependency for an ear project
+	    
+	    IProject proj = ResourcesPlugin.getWorkspace().getRoot().getProject(javaProjectName);
+	    proj.create(null);
+	    proj.open(null);
+	    
+	    IProjectDescription description = proj.getDescription();
+	    List natureList = new ArrayList();
+	    natureList.add(JavaCore.NATURE_ID);
+	    natureList.addAll(Arrays.asList(description.getNatureIds()));
+	    description.setNatureIds((String[]) natureList.toArray(new String[natureList.size()]));
+	    proj.setDescription(description, null);
+	    
+	    IJavaProject javaProject = JavaCore.create(proj);
+	    
+	    IDataModel migrationdm = DataModelFactory.createDataModel(new JavaProjectMigrationDataModelProvider());
+		migrationdm.setProperty(IJavaProjectMigrationDataModelProperties.PROJECT_NAME, proj.getName());
+		
+		runAndVerify(migrationdm);
+
+		String javaProjectURI = proj.getName() + IJ2EEModuleConstants.JAR_EXT;
+
+		IDataModel refdm = DataModelFactory.createDataModel(new CreateReferenceComponentsDataModelProvider());
+		List targetCompList = (List) refdm.getProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENT_LIST);
+
+		IVirtualComponent targetcomponent = ComponentCore.createComponent(proj);
+		targetCompList.add(targetcomponent);
+
+		refdm.setProperty(ICreateReferenceComponentsDataModelProperties.SOURCE_COMPONENT, earComponent);
+		refdm.setProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENT_LIST, targetCompList);
+		
+		// referenced java projects should have archiveName attribute
+		((Map)refdm.getProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENTS_TO_URI_MAP)).put(targetcomponent, javaProjectURI);
+
+		runAndVerify(refdm, true, true, null, true, true);
+
+	    IVirtualReference reference2 = earComponent.getReference(targetcomponent.getName());
+		
+	    Assert.assertEquals(reference2.getReferencedComponent(), targetcomponent);
+	    
+	    Assert.assertEquals(reference2.getArchiveName(), javaProjectURI);
+
+
+	}
+
+	/*
+	public void test192752() throws Exception {
+		String warPath = null;
+		String projectName = null;
+		WebArtifactEdit webArtifactEditForRead = null;
+		IDataModel model = null;
+		
+
+		warPath = getWarFile("InvalidWebXML1.war");
+		projectName = warPath.substring(warPath.lastIndexOf(File.separator) + 1, warPath.length() - 4);
+		model = WebImportOperationTest.getWebImportDataModel(warPath, projectName, null, null, true, null, null);
+		OperationTestCase.runAndVerify(model);
+		webArtifactEditForRead = WebArtifactEdit.getWebArtifactEditForRead(ProjectUtil.getProject(projectName));
+		checkIfModelIsParsed(webArtifactEditForRead.getWebApp());
+
+		warPath = getWarFile("InvalidWebXML2.war");
+		projectName = warPath.substring(warPath.lastIndexOf(File.separator) + 1, warPath.length() - 4);
+		model = WebImportOperationTest.getWebImportDataModel(warPath, projectName, null, null, true, null, null);
+		OperationTestCase.runAndVerify(model);
+		webArtifactEditForRead = WebArtifactEdit.getWebArtifactEditForRead(ProjectUtil.getProject(projectName));
+		checkIfModelIsParsed(webArtifactEditForRead.getWebApp());
+
+		warPath = getWarFile("InvalidWebXML14_1.war");
+		projectName = warPath.substring(warPath.lastIndexOf(File.separator) + 1, warPath.length() - 4);
+		model = WebImportOperationTest.getWebImportDataModel(warPath, projectName, null, null, true, null, null);
+		OperationTestCase.runAndVerify(model);
+		webArtifactEditForRead = WebArtifactEdit.getWebArtifactEditForRead(ProjectUtil.getProject(projectName));
+		checkIfModelIsParsed(webArtifactEditForRead.getWebApp());
+
+		warPath = getWarFile("InvalidWebXML14_2.war");
+		projectName = warPath.substring(warPath.lastIndexOf(File.separator) + 1, warPath.length() - 4);
+		model = WebImportOperationTest.getWebImportDataModel(warPath, projectName, null, null, true, null, null);
+		OperationTestCase.runAndVerify(model);
+		webArtifactEditForRead = WebArtifactEdit.getWebArtifactEditForRead(ProjectUtil.getProject(projectName));
+		checkIfModelIsParsed(webArtifactEditForRead.getWebApp());
+	}
+	*/
+
+	/**
+	 * Test for https://bugs.eclipse.org/bugs/show_bug.cgi?id=376643
+	 */
+	public void test376643() throws Exception {
+		final String[] projectNames = {"EAR", "Web"};
+		final String zipLocation = getFullTestDataPath("TestCaseSourceNotExported.zip");
+		final Path servletJavaFilePath = new Path("com/test/TestServlet1.java");
+		
+		// Import projects
+		ProjectUnzipUtil util = new ProjectUnzipUtil(new Path(zipLocation), projectNames);
+		util.createProjects();
+		IVirtualComponent webComponent = ComponentCore.createComponent(J2EEProjectUtilities.getProject("Web"));
+		
+		final IVirtualFolder jsrc = webComponent.getRootFolder().getFolder("/WEB-INF/classes");
+	
+		//Export WAR including source
+		IDataModel dataModel = DataModelFactory.createDataModel(new WebComponentExportDataModelProvider());
+		dataModel.setProperty(IJ2EEComponentExportDataModelProperties.PROJECT_NAME, projectNames[1]);
+		dataModel.setProperty(J2EEComponentExportDataModelProvider.ARCHIVE_DESTINATION, getDataPath("Web.war"));
+		dataModel.setBooleanProperty(J2EEComponentExportDataModelProvider.EXPORT_SOURCE_FILES, true);
+		dataModel.setBooleanProperty(J2EEComponentExportDataModelProvider.OVERWRITE_EXISTING, true);
+		dataModel.setProperty(IJ2EEComponentExportDataModelProperties.RUN_BUILD, true);
+		IStatus status = dataModel.getDefaultOperation().execute(null, null);
+		Assert.assertEquals("Exporting WAR failed " + status.getMessage(), IStatus.OK, status.getSeverity());
+		
+		// Verify source was exported in the WAR
+		IArchive archiveWAR = JavaEEArchiveUtilities.INSTANCE.openArchive(new Path(getDataPath("Web.war")));
+		Assert.assertTrue("Archive does not contain file " + servletJavaFilePath,
+						archiveWAR.containsArchiveResource(jsrc.getRuntimePath().append(servletJavaFilePath).makeRelative())); 
+												
+		//archiveWAR.
+		JavaEEArchiveUtilities.INSTANCE.closeArchive(archiveWAR);
+		
+	}
+	
+	
+	/**
+	 * Test for https://bugs.eclipse.org/bugs/show_bug.cgi?id=311542
+	 */
+	public void test311542() throws Exception {
+		String warPath = null;
+		String projectName = null;
+		IDataModel model = null;
+		
+
+		warPath = getWarFile("Bug311542.war");
+		projectName = warPath.substring(warPath.lastIndexOf(File.separator) + 1, warPath.length() - 4);
+		model = WebImportOperationTest.getWebImportDataModel(warPath, projectName, null, true, null, null);
+		OperationTestCase.runAndVerify(model);
+	}
+
+	private String getWarFile(String fileName) {
+		return TEST_DATA_PATH + "WARImportTests" + java.io.File.separatorChar + fileName;
+	}
+
+	private void checkIfModelIsParsed(WebApp deploymentDescriptor1) {
+		// tests to ensure model is usable to a degree
+		Assert.assertNotNull(deploymentDescriptor1);
+		Assert.assertNotNull(deploymentDescriptor1.getConstraints());
+		Assert.assertFalse(deploymentDescriptor1.getConstraints().isEmpty());
+		Assert.assertNotNull(deploymentDescriptor1.getSecurityRoles());
+		Assert.assertFalse(deploymentDescriptor1.getSecurityRoles().isEmpty());
+	}
+
+	
+	/**
+	 * This defect was canceled.
+	public void test147917() throws Exception {
+		
+		Assert.assertEquals("Lib/A.jar", ArchiveUtil.deriveEARRelativeURI("Lib/A.jar", "B.jar"));
+		
+		
+		String workingDir = new java.io.File(".").getCanonicalPath(); //$NON-NLS-1$
+		if(workingDir.lastIndexOf(java.io.File.separatorChar) == -1){
+			return;
+		}
+		
+		List prefixes = new ArrayList();
+		String lastSegment = workingDir.substring(workingDir.lastIndexOf(java.io.File.separatorChar)+1);
+		prefixes.add(lastSegment);
+		String lower = lastSegment.toLowerCase();
+		prefixes.add(lower);
+		String upper = lastSegment.toUpperCase();
+		prefixes.add(upper);
+		//switch each charactor
+		for(int i=0;i<lastSegment.length(); i++){
+			char [] newValue = lastSegment.toCharArray();
+			char c = Character.toUpperCase(newValue[i]);
+			if(c == newValue[i]){
+				c = Character.toLowerCase(c);
+			}
+			if(c != newValue[i]){
+				newValue[i] = c;
+				String newString = new String(newValue);
+				prefixes.add(newString);	
+			}
+		}
+		
+		for(Iterator itr = prefixes.iterator(); itr.hasNext();){
+			String prefix = (String)itr.next();
+			Assert.assertEquals("A.jar", ArchiveUtil.deriveEARRelativeURI("/A.jar", "B.jar"));
+			Assert.assertEquals(prefix+"/A.jar", ArchiveUtil.deriveEARRelativeURI(prefix+"/A.jar", "B.jar"));
+			Assert.assertEquals(prefix+"/A.jar", ArchiveUtil.deriveEARRelativeURI("/"+prefix+"/A.jar", "B.jar"));
+			Assert.assertEquals(prefix+"/A.jar", ArchiveUtil.deriveEARRelativeURI(prefix+"/A.jar", "./B.jar"));
+			Assert.assertEquals(prefix+"/A.jar", ArchiveUtil.deriveEARRelativeURI("A.jar", prefix+"/B.jar"));
+			Assert.assertEquals(prefix+"/A.jar", ArchiveUtil.deriveEARRelativeURI("/A.jar", prefix+"/B.jar"));
+			Assert.assertEquals(prefix+"/A.jar", ArchiveUtil.deriveEARRelativeURI("./A.jar", prefix+"/B.jar"));
+			Assert.assertEquals("A.jar", ArchiveUtil.deriveEARRelativeURI("../A.jar", prefix+"/B.jar"));
+			Assert.assertEquals("A.jar", ArchiveUtil.deriveEARRelativeURI("/../A.jar", prefix+"/B.jar"));
+			Assert.assertEquals("A.jar", ArchiveUtil.deriveEARRelativeURI(prefix+"/../../A.jar", prefix+"/B.jar"));
+			Assert.assertEquals("A.jar", ArchiveUtil.deriveEARRelativeURI("/"+prefix+"/../../A.jar", prefix+"/B.jar"));
+			Assert.assertEquals(prefix+"/A.jar", ArchiveUtil.deriveEARRelativeURI(prefix+"/../A.jar", prefix+"/B.jar"));
+			Assert.assertEquals(prefix+"/A.jar", ArchiveUtil.deriveEARRelativeURI("/"+prefix+"/../A.jar", prefix+"/B.jar"));
+			Assert.assertEquals(prefix+"/"+prefix+"/A.jar", ArchiveUtil.deriveEARRelativeURI(prefix+"/A.jar", prefix+"/B.jar"));
+			Assert.assertEquals(prefix+"/"+prefix+"/A.jar", ArchiveUtil.deriveEARRelativeURI("/"+prefix+"/A.jar", prefix+"/B.jar"));
+			
+			
+		}
+	}
+	**/
+	
+	
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/defect-tests/org/eclipse/jst/j2ee/defect/tests/DefectVerificationTestsSuite.java b/tests/org.eclipse.jst.j2ee.tests/defect-tests/org/eclipse/jst/j2ee/defect/tests/DefectVerificationTestsSuite.java
new file mode 100644
index 0000000..f019554
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/defect-tests/org/eclipse/jst/j2ee/defect/tests/DefectVerificationTestsSuite.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.defect.tests;
+
+import org.eclipse.wst.common.tests.SimpleTestSuite;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+public class DefectVerificationTestsSuite extends TestSuite {
+
+	public static Test suite() {
+		return new DefectVerificationTestsSuite();
+	}
+
+	public DefectVerificationTestsSuite() {
+		super("Defect Verification Tests");
+		addTest(new SimpleTestSuite(DefectVerificationTests.class));
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/exportmodel-tests/org/eclipse/wtp/j2ee/headless/tests/exportmodel/ExportModelTest.java b/tests/org.eclipse.jst.j2ee.tests/exportmodel-tests/org/eclipse/wtp/j2ee/headless/tests/exportmodel/ExportModelTest.java
new file mode 100644
index 0000000..55685e3
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/exportmodel-tests/org/eclipse/wtp/j2ee/headless/tests/exportmodel/ExportModelTest.java
@@ -0,0 +1,212 @@
+package org.eclipse.wtp.j2ee.headless.tests.exportmodel;
+
+import java.io.ByteArrayInputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.datamodel.properties.ICreateReferenceComponentsDataModelProperties;
+import org.eclipse.wst.common.componentcore.internal.ComponentResource;
+import org.eclipse.wst.common.componentcore.internal.StructureEdit;
+import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent;
+import org.eclipse.wst.common.componentcore.internal.flat.FilterResourceParticipant;
+import org.eclipse.wst.common.componentcore.internal.flat.FlatVirtualComponent;
+import org.eclipse.wst.common.componentcore.internal.flat.IFlatFolder;
+import org.eclipse.wst.common.componentcore.internal.flat.IFlatResource;
+import org.eclipse.wst.common.componentcore.internal.flat.IFlatVirtualComponent;
+import org.eclipse.wst.common.componentcore.internal.flat.IFlattenParticipant;
+import org.eclipse.wst.common.componentcore.internal.flat.FlatVirtualComponent.FlatComponentTaskModel;
+import org.eclipse.wst.common.componentcore.internal.operation.CreateReferenceComponentsDataModelProvider;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider;
+import org.eclipse.wst.common.tests.OperationTestCase;
+import org.eclipse.wtp.j2ee.headless.tests.ear.operations.EARProjectCreationOperationTest;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.JavaEEFacetConstants;
+
+public class ExportModelTest extends TestCase {
+    public void testSimpleExportModel() throws Exception{
+    	IDataModel dm = EARProjectCreationOperationTest.getEARDataModel("aEAR", null, null, null, JavaEEFacetConstants.EAR_5, true);
+    	OperationTestCase.runAndVerify(dm);
+    	IProject p = ResourcesPlugin.getWorkspace().getRoot().getProject("aEAR");
+    	assertTrue(p.exists());
+    	runVerify(p);
+    	assertEquals(2, countRecurse(p));
+    	p.getFolder("garbage").create(true, true, null);
+    	runVerify(p);
+    	assertEquals(2, countRecurse(p));
+    	IFile f = p.getFile(new Path("garbage/file.txt"));
+    	f.create(new ByteArrayInputStream("hello".getBytes()), true, null);
+    	runVerify(p);
+    	assertEquals(2, countRecurse(p));
+    	IFile f2 = p.getFile(new Path("EarContent/file.txt"));
+    	f2.create(new ByteArrayInputStream("hello2".getBytes()), true, null);
+    	runVerify(p);
+    	assertEquals(3, countRecurse(p));
+    	addMapping(p, new Path("/garbage"), new Path("some/output"));
+    	assertEquals(6, countRecurse(p)); // (added some, some/output, and some/output/file.txt)
+    	p.delete(true, null);
+    }
+    
+    public void testConsumesExportModel() throws Exception{
+    	IDataModel dm = EARProjectCreationOperationTest.getEARDataModel("bEAR", null, null, null, JavaEEFacetConstants.EAR_5, true);
+    	OperationTestCase.runAndVerify(dm);
+    	IProject ear = ResourcesPlugin.getWorkspace().getRoot().getProject("bEAR");
+    	assertTrue(ear.exists());
+    	runVerify(ear);
+    	assertEquals(2, countRecurse(ear));
+    	IVirtualComponent earComponent = ComponentCore.createComponent(ear);
+    	IProject pojp = ResourcesPlugin.getWorkspace().getRoot().getProject("pojp");
+    	pojp.create(null);
+    	assertTrue(pojp.exists());
+    	pojp.open(null);
+    	IFile pojpTxt = pojp.getFile(new Path("pojp.txt"));
+    	pojpTxt.create(new ByteArrayInputStream("pojp".getBytes()), true, null);
+    	assertTrue(pojpTxt.exists());
+    	assertEquals(2, countRecurse(ear));
+    	TestExportVirtualComponent pojpComponent = new TestExportVirtualComponent(pojpTxt);
+    	addReference(earComponent, pojpComponent, "path/to", "");
+    	assertEquals(5, countRecurse(ear)); // META-INF, META-INF/application.xml, path, path/to, path/to/pojp.txt
+    	ear.delete(true, null);
+    	pojp.delete(true, null);
+    }
+    
+	protected void addReference(IVirtualComponent parent, IVirtualComponent child, 
+			String path, String archiveName) throws CoreException {
+		IDataModelProvider provider = new CreateReferenceComponentsDataModelProvider();
+		IDataModel dm = DataModelFactory.createDataModel(provider);
+		
+		dm.setProperty(ICreateReferenceComponentsDataModelProperties.SOURCE_COMPONENT, parent);
+		dm.setProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENT_LIST, Arrays.asList(child));
+		
+		//[Bug 238264] the uri map needs to be manually set correctly
+		Map<IVirtualComponent, String> uriMap = new HashMap<IVirtualComponent, String>();
+		uriMap.put(child, archiveName);
+		dm.setProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENTS_TO_URI_MAP, uriMap);
+        dm.setProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENTS_DEPLOY_PATH, path);
+
+		IStatus stat = dm.validateProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENT_LIST);
+		if (!stat.isOK())
+			throw new CoreException(stat);
+		try {
+			dm.getDefaultOperation().execute(new NullProgressMonitor(), null);
+		} catch (ExecutionException e) {
+		}	
+	}
+    
+    public void testSuffixFilterExportModel() throws Exception{
+    	IDataModel dm = EARProjectCreationOperationTest.getEARDataModel("aEAR", null, null, null, JavaEEFacetConstants.EAR_5, true);
+    	OperationTestCase.runAndVerify(dm);
+    	IProject p = ResourcesPlugin.getWorkspace().getRoot().getProject("aEAR");
+    	assertTrue(p.exists());
+    	runVerify(p);
+    	assertEquals(2, countRecurse(p));
+    	IFile f = p.getFile(new Path("EarContent/file.txt"));
+    	f.create(new ByteArrayInputStream("hello".getBytes()), true, null);
+    	IFile f2 = p.getFile(new Path("EarContent/file.java"));
+    	f2.create(new ByteArrayInputStream("hello2".getBytes()), true, null);
+    	runVerify(p);
+    	assertEquals(4, countRecurse(p));
+    	assertEquals(4, countRecurse(p, FilterResourceParticipant.createSuffixFilterParticipant(new String[]{})));
+    	assertEquals(3, countRecurse(p, FilterResourceParticipant.createSuffixFilterParticipant(new String[]{".txt"})));
+    	assertEquals(3, countRecurse(p, FilterResourceParticipant.createSuffixFilterParticipant(new String[]{".java"})));
+    	assertEquals(2, countRecurse(p, FilterResourceParticipant.createSuffixFilterParticipant(new String[]{".java", ".txt"})));
+    	assertEquals(1, countRecurse(p, FilterResourceParticipant.createSuffixFilterParticipant(new String[]{".java", ".txt", ".xml"})));
+    }
+    
+    protected static void runVerify(IProject p) throws Exception {
+    	IVirtualComponent component = ComponentCore.createComponent(p);
+    	assertTrue(component.exists());
+    	IFlatVirtualComponent model = new FlatVirtualComponent(component);
+    	IFlatResource[] resources = model.fetchResources();
+    	ComponentResource[] mappings = getMappings(p);
+    	verifyMappingsAndOutput(p, resources, mappings);
+    }
+    
+    protected static int countRecurse(IProject p) throws Exception {
+    	IVirtualComponent component = ComponentCore.createComponent(p);
+    	assertTrue(component.exists());
+    	IFlatVirtualComponent model = new FlatVirtualComponent(component);
+    	IFlatResource[] resources = model.fetchResources();
+    	return countRecurse(resources);
+    }
+    
+    protected static int countRecurse(IProject p, IFlattenParticipant participant) throws Exception {
+    	IVirtualComponent component = ComponentCore.createComponent(p);
+    	assertTrue(component.exists());
+    	FlatComponentTaskModel tm = new FlatComponentTaskModel();
+    	tm.put(IFlatVirtualComponent.PARTICIPANT_LIST, participant);
+    	IFlatVirtualComponent model = new FlatVirtualComponent(component, tm);
+    	IFlatResource[] resources = model.fetchResources();
+    	return countRecurse(resources);
+    }
+    
+    
+    
+    protected static int countRecurse(IFlatResource[] resources) {
+    	int count = 0;
+    	for( int i = 0; i < resources.length; i++ ) {
+    		if( resources[i] != null ) {
+    			count++;
+    			if( resources[i] instanceof IFlatFolder)
+    				count += countRecurse(((IFlatFolder)resources[i]).members());
+    		}
+    	}
+    	return count;
+    }
+    
+    protected static void verifyMappingsAndOutput(IProject p, IFlatResource[] resources, ComponentResource[] mappings) {
+    	for( int i = 0; i < resources.length; i++ ) {
+    		IPath deployPath = resources[i].getModuleRelativePath().append(resources[i].getName());
+    		IResource workspaceResource = (IResource)resources[i].getAdapter(IResource.class);
+    		IPath workspacePath = workspaceResource.getFullPath();
+    		assertNotNull(workspaceResource);
+    		boolean found = false;
+    		for( int j = 0; j < mappings.length && !found; j++ ) {
+    			IPath tmp = new Path(p.getName()).makeAbsolute().append(mappings[j].getSourcePath()).append(deployPath);
+    			found |= (tmp.equals(workspacePath));
+    		}
+    		assertTrue(found);
+    		if( resources[i] instanceof IFlatFolder)
+    			verifyMappingsAndOutput(p, ((IFlatFolder)resources[i]).members(), mappings);
+    	}
+    }
+    
+    protected static ComponentResource[] getMappings(IProject project) {
+		StructureEdit structureEdit = null;
+		structureEdit = StructureEdit.getStructureEditForRead(project);
+		WorkbenchComponent component = structureEdit.getComponent();
+		EList list = component.getResources();
+		List<ComponentResource> newList = new ArrayList<ComponentResource>();
+		for(Iterator i = list.iterator(); i.hasNext();) {
+			newList.add((ComponentResource)i.next());
+		}
+		return (ComponentResource[]) newList.toArray(new ComponentResource[newList
+				.size()]);
+    }
+    
+    protected static void addMapping(IProject project, IPath src, IPath runtime) throws CoreException {
+    	IVirtualComponent vc = ComponentCore.createComponent(project);
+    	IVirtualFolder vf = vc.getRootFolder();
+    	vf.getFolder(runtime).createLink(src, 0, null);
+    }
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/exportmodel-tests/org/eclipse/wtp/j2ee/headless/tests/exportmodel/TestExportReferenceResolver.java b/tests/org.eclipse.jst.j2ee.tests/exportmodel-tests/org/eclipse/wtp/j2ee/headless/tests/exportmodel/TestExportReferenceResolver.java
new file mode 100644
index 0000000..8b1de0e
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/exportmodel-tests/org/eclipse/wtp/j2ee/headless/tests/exportmodel/TestExportReferenceResolver.java
@@ -0,0 +1,66 @@
+package org.eclipse.wtp.j2ee.headless.tests.exportmodel;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.internal.ComponentcorePackage;
+import org.eclipse.wst.common.componentcore.internal.DependencyType;
+import org.eclipse.wst.common.componentcore.internal.ReferencedComponent;
+import org.eclipse.wst.common.componentcore.internal.impl.PlatformURLModuleConnection;
+import org.eclipse.wst.common.componentcore.resolvers.IReferenceResolver;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
+
+public class TestExportReferenceResolver implements IReferenceResolver {
+	private static final String FIRST_SEGMENT = "org.eclipse.wtp.j2ee.exportTestResolver";
+	public static final String PROTOCOL = PlatformURLModuleConnection.MODULE_PROTOCOL
+		+IPath.SEPARATOR + FIRST_SEGMENT + IPath.SEPARATOR;
+
+	public boolean canResolve(IVirtualReference reference) {
+		if( reference.getReferencedComponent() 
+				instanceof TestExportVirtualComponent )
+			return true;
+		return false;
+	}
+
+	public ReferencedComponent resolve(IVirtualReference reference) {
+		TestExportVirtualComponent vc = (TestExportVirtualComponent)reference.getReferencedComponent();
+        ReferencedComponent rc = ComponentcorePackage.eINSTANCE.getComponentcoreFactory().createReferencedComponent();
+        rc.setArchiveName(reference.getArchiveName());
+        rc.setRuntimePath(reference.getRuntimePath());
+        rc.setHandle(URI.createURI(PROTOCOL + vc.getFullPath().toString()));
+        rc.setDependencyType(DependencyType.CONSUMES_LITERAL);
+        return rc;
+	}
+
+	public boolean canResolve(IVirtualComponent context,
+			ReferencedComponent referencedComponent) {
+		URI uri = referencedComponent.getHandle();
+		if( uri.segmentCount() >= 1 && FIRST_SEGMENT.equals(uri.segment(0))) 
+			return true;
+		return false;
+	}
+
+	public IVirtualReference resolve(IVirtualComponent context,
+			ReferencedComponent referencedComponent) {
+		URI uri = referencedComponent.getHandle();
+		if( uri.segmentCount() >= 1 && FIRST_SEGMENT.equals(uri.segment(0))) {
+			String path = uri.toString().substring(PROTOCOL.length());
+			IPath filePath = new Path(path);
+			IProject proj = ResourcesPlugin.getWorkspace().getRoot().getProject(filePath.segment(0));
+			IFile f = proj.getFile(filePath.removeFirstSegments(1));
+            IVirtualReference ref = ComponentCore.createReference(context, 
+            		new TestExportVirtualComponent(f));
+            ref.setArchiveName(referencedComponent.getArchiveName());
+            ref.setRuntimePath(referencedComponent.getRuntimePath());
+            ref.setDependencyType(referencedComponent.getDependencyType().getValue());
+            return ref;
+		}
+		return null;
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/exportmodel-tests/org/eclipse/wtp/j2ee/headless/tests/exportmodel/TestExportVirtualComponent.java b/tests/org.eclipse.jst.j2ee.tests/exportmodel-tests/org/eclipse/wtp/j2ee/headless/tests/exportmodel/TestExportVirtualComponent.java
new file mode 100644
index 0000000..c277522
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/exportmodel-tests/org/eclipse/wtp/j2ee/headless/tests/exportmodel/TestExportVirtualComponent.java
@@ -0,0 +1,45 @@
+package org.eclipse.wtp.j2ee.headless.tests.exportmodel;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.wst.common.componentcore.internal.resources.VirtualComponent;
+import org.eclipse.wst.common.componentcore.internal.resources.VirtualFile;
+import org.eclipse.wst.common.componentcore.internal.resources.VirtualFolder;
+import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
+import org.eclipse.wst.common.componentcore.resources.IVirtualResource;
+
+public class TestExportVirtualComponent extends VirtualComponent {
+	private IFile file;
+	public TestExportVirtualComponent(IFile file) {
+		super(file.getProject(), new Path(""));
+		this.file = file;
+	}
+
+	public boolean exists() { 
+		return true;
+	}
+
+	public IPath getFullPath() {
+		return file.getFullPath();
+	}
+	public IVirtualFolder getRootFolder() {
+		return new TestExportVirtualFolder(file.getProject());
+	}
+	
+	public class TestExportVirtualFolder extends VirtualFolder {
+		public TestExportVirtualFolder(IProject aComponentProject) {
+			super(aComponentProject, new Path("/"));
+		}
+		
+		public IVirtualResource[] members(int memberFlags) throws CoreException {
+			return new IVirtualResource[] { 
+					new VirtualFile(file.getProject(), new Path("inside"), file)
+			};
+		}
+
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/common/annotations/tests/AnnotationProviderTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/common/annotations/tests/AnnotationProviderTest.java
new file mode 100644
index 0000000..a05a041
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/common/annotations/tests/AnnotationProviderTest.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.common.annotations.tests;
+
+import java.util.List;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+
+import org.eclipse.jst.common.internal.annotations.core.AnnotationsProviderManager;
+import org.eclipse.jst.common.internal.annotations.core.IAnnotationsProvider;
+import org.eclipse.wst.common.tests.SimpleTestSuite;
+
+public class AnnotationProviderTest extends TestCase {
+
+	public AnnotationProviderTest() {
+		super();
+	}
+
+	public AnnotationProviderTest(String name) {
+		super(name);
+	}
+	
+	public static Test suite() {
+	    return new SimpleTestSuite(AnnotationProviderTest.class);
+	}
+	
+	public void testAnnotationProviderFramework() throws Exception {
+		List providers = AnnotationsProviderManager.INSTANCE.getAnnotationsProviders();
+		boolean success = false;
+		for (int i=0; i<providers.size(); i++) {
+			IAnnotationsProvider provider = (IAnnotationsProvider) providers.get(i);
+			provider.isAnnotated(null);
+			provider.getPrimaryAnnotatedCompilationUnit(null);
+			provider.getPrimaryTagset(null);
+			success = true;
+		}
+		assertTrue(success);
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/common/annotations/tests/TestAnnotationProvider.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/common/annotations/tests/TestAnnotationProvider.java
new file mode 100644
index 0000000..d7cf554
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/common/annotations/tests/TestAnnotationProvider.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.common.annotations.tests;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jst.common.internal.annotations.core.IAnnotationsProvider;
+
+public class TestAnnotationProvider implements IAnnotationsProvider {
+
+	public TestAnnotationProvider() {
+		super();
+	}
+
+	public boolean isAnnotated(EObject eObject) {
+		return false;
+	}
+
+	public ICompilationUnit getPrimaryAnnotatedCompilationUnit(EObject eObject) {
+		return null;
+	}
+
+	public String getPrimaryTagset(EObject eObject) {
+		return null;
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/bindingshelper/tests/BarBindingsHelper.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/bindingshelper/tests/BarBindingsHelper.java
new file mode 100644
index 0000000..72a9531
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/bindingshelper/tests/BarBindingsHelper.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2006 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.bindingshelper.tests;
+
+public class BarBindingsHelper extends TestBindingsHelper {
+
+	public static String getFileName(){
+		return "bar.txt"; //$NON-NLS-1$
+	}
+	
+	public String getBindingsFileName() {
+		return getFileName();
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/bindingshelper/tests/BindingsHelperTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/bindingshelper/tests/BindingsHelperTest.java
new file mode 100644
index 0000000..b8ab630
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/bindingshelper/tests/BindingsHelperTest.java
@@ -0,0 +1,223 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2007 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.bindingshelper.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.jem.util.emf.workbench.ProjectUtilities;
+import org.eclipse.jst.j2ee.application.internal.operations.EARComponentImportDataModelProvider;
+import org.eclipse.jst.j2ee.common.ResourceEnvRef;
+import org.eclipse.jst.j2ee.common.ResourceRef;
+import org.eclipse.jst.j2ee.common.SecurityRoleRef;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.EARFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.EJBJarFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.WARFile;
+import org.eclipse.jst.j2ee.componentcore.EnterpriseArtifactEdit;
+import org.eclipse.jst.j2ee.componentcore.util.EARArtifactEdit;
+import org.eclipse.jst.j2ee.core.internal.bindings.IJNDIBindingsHelper;
+import org.eclipse.jst.j2ee.core.internal.bindings.JNDIBindingsHelperManager;
+import org.eclipse.jst.j2ee.datamodel.properties.IEARComponentImportDataModelProperties;
+import org.eclipse.jst.j2ee.ejb.ContainerManagedEntity;
+import org.eclipse.jst.j2ee.ejb.EJBJar;
+import org.eclipse.jst.j2ee.ejb.Session;
+import org.eclipse.jst.j2ee.webapplication.WebApp;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.tests.ProjectUtility;
+import org.eclipse.wtp.j2ee.headless.tests.plugin.HeadlessTestsPlugin;
+
+public class BindingsHelperTest extends TestCase {
+
+	public static String fileSep = System.getProperty("file.separator"); //$NON-NLS-1$
+
+	public static String getFullTestDataPath(String dataPath) {
+		try {
+			String defectTestDataPath = "TestData" + fileSep + "BindingsHelperTests" + fileSep + dataPath; //$NON-NLS-1$ //$NON-NLS-2$
+			HeadlessTestsPlugin plugin = HeadlessTestsPlugin.getDefault();
+			if (plugin != null) {
+				return ProjectUtility.getFullFileName(plugin, defectTestDataPath);
+			}
+			return System.getProperty("user.dir") + java.io.File.separatorChar + defectTestDataPath; //$NON-NLS-1$
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return ""; //$NON-NLS-1$
+	}
+
+	private IProject earProject;
+	private IVirtualComponent earComponent;
+
+	protected void setUp() throws Exception {
+		super.setUp();
+		IDataModel model = importEar(getFullTestDataPath("BindingsTestEAR.ear")); //$NON-NLS-1$
+		earProject = ProjectUtilities.getProject(model.getStringProperty(IEARComponentImportDataModelProperties.PROJECT_NAME));
+		earComponent = ComponentCore.createComponent(earProject);
+	}
+
+	protected EARFile getEarFile() throws Exception {
+		EnterpriseArtifactEdit edit = null;
+		try {
+			edit = EARArtifactEdit.getEARArtifactEditForRead(earProject);
+			return (EARFile) edit.asArchive(true);
+		} finally {
+			if (null != edit) {
+				edit.dispose();
+			}
+		}
+	}
+
+	public static IDataModel importEar(String earPath) throws Exception {
+		IDataModel model = DataModelFactory.createDataModel(new EARComponentImportDataModelProvider());
+		model.setProperty(IEARComponentImportDataModelProperties.FILE_NAME, earPath);
+		model.getDefaultOperation().execute(null, null);
+		return model;
+	}
+
+	protected void tearDown() throws Exception {
+		super.tearDown();
+		IProject[] projects = ProjectUtilities.getAllProjects();
+		for (int i = 0; i < projects.length; i++) {
+			projects[i].delete(true, null);
+		}
+	}
+
+	protected String getSourceFileName() {
+		return "test.txt"; //$NON-NLS-1$
+	}
+
+	public void testHelpers() throws Exception {
+		// First check the default helper; i.e. no helpers enabled
+		IJNDIBindingsHelper[] helpers = checkHelper(null);
+		checkBindings(getEarFile(), helpers[0], ""); //$NON-NLS-1$
+
+		// Now check fooHelper (barHelper disabled)
+		IFile srcFile = earComponent.getRootFolder().getFile(getSourceFileName()).getUnderlyingFile();
+		IFile fooFile = earComponent.getRootFolder().getFile(FooBindingsHelper.getFileName()).getUnderlyingFile();
+		srcFile.copy(new Path(fooFile.getFullPath().lastSegment()), true, null);
+		assertTrue(fooFile.exists());
+
+		helpers = checkHelper(FooBindingsHelper.class);
+		checkBindings(getEarFile(), helpers[0], FooBindingsHelper.getFileName());
+
+		// Now check barHelper (fooHelper disabled)
+		fooFile.delete(true, null);
+		assertFalse(fooFile.exists());
+
+		IFile barFile = earComponent.getRootFolder().getFile(BarBindingsHelper.getFileName()).getUnderlyingFile();
+		srcFile.copy(new Path(barFile.getFullPath().lastSegment()), true, null);
+		assertTrue(barFile.exists());
+
+		helpers = checkHelper(BarBindingsHelper.class);
+		checkBindings(getEarFile(), helpers[0], BarBindingsHelper.getFileName());
+
+		// Now check both fooHelper and barHelper (both enabled)
+		srcFile.copy(new Path(fooFile.getFullPath().lastSegment()), true, null);
+		assertTrue(fooFile.exists());
+
+		helpers = JNDIBindingsHelperManager.getInstance().getBindingsHelpers(earProject);
+		assertEquals(2, helpers.length);
+		int fooIndex = (helpers[0].getClass() == FooBindingsHelper.class) ? 0 : 1;
+		int barIndex = (fooIndex == 0) ? 1 : 0;
+		assertTrue(helpers[fooIndex].getClass() == FooBindingsHelper.class);
+		assertTrue(helpers[barIndex].getClass() == BarBindingsHelper.class);
+		EARFile earFile = getEarFile();
+		IJNDIBindingsHelper[] tempHelpers = JNDIBindingsHelperManager.getInstance().getBindingsHelpers(earFile);
+		assertEquals(2, tempHelpers.length);
+		assertTrue(helpers[0] == tempHelpers[0]);
+		assertTrue(helpers[1] == tempHelpers[1]);
+
+		checkBindings(getEarFile(), helpers[fooIndex], FooBindingsHelper.getFileName());
+		checkBindings(getEarFile(), helpers[barIndex], BarBindingsHelper.getFileName());
+	}
+
+	private IJNDIBindingsHelper[] checkHelper(Class clazz) throws Exception {
+		IJNDIBindingsHelper[] helpers = JNDIBindingsHelperManager.getInstance().getBindingsHelpers(earProject);
+		assertEquals(1, helpers.length);
+		if (null != clazz) {
+			assertTrue(helpers[0].getClass() == clazz);
+		} else {
+			assertTrue(helpers[0].getClass() != FooBindingsHelper.class);
+			assertTrue(helpers[0].getClass() != BarBindingsHelper.class);
+		}
+		EARFile earFile = getEarFile();
+		IJNDIBindingsHelper[] tempHelpers = JNDIBindingsHelperManager.getInstance().getBindingsHelpers(earFile);
+		assertEquals(1, tempHelpers.length);
+		assertTrue(helpers[0] == tempHelpers[0]);
+		return helpers;
+	}
+
+	private void checkBindings(EARFile earFile, IJNDIBindingsHelper helper, String prefix) {
+		List ejbJarFiles = earFile.getEJBJarFiles();
+		EJBJarFile ejbJarFile = (EJBJarFile) ejbJarFiles.get(0);
+		EJBJar ejbJar = ejbJarFile.getDeploymentDescriptor();
+
+		List cmps = ejbJar.getContainerManagedBeans();
+		ContainerManagedEntity cmp = (ContainerManagedEntity) cmps.get(0);
+		String jndiName = helper.getJNDIName(cmp);
+		String suffix = prefix.length() > 0 ? TestBindingsHelper.EJB : prefix;
+		assertEquals(prefix + cmp.getName() + suffix, jndiName);
+
+		jndiName = helper.getJNDINameForDefaultDataSource(cmp);
+		suffix = prefix.length() > 0 ? TestBindingsHelper.CMP : prefix;
+		assertEquals(prefix + ejbJar.getDisplayName() + suffix, jndiName);
+
+		List sessions = ejbJar.getSessionBeans();
+
+		Session session = (Session) sessions.get(0);
+		// TODO
+		// List ejbRefs = session.getEjbRefs();
+		// EjbRef ejbRef = (EjbRef) ejbRefs.get(0);
+
+		List resRefs = session.getResourceRefs();
+		ResourceRef resRef = (ResourceRef) resRefs.get(0);
+		jndiName = helper.getJNDINameForRef(session, resRef);
+		suffix = prefix.length() > 0 ? TestBindingsHelper.EJB_RES_REF : prefix;
+		assertEquals(prefix + resRef.getName() + suffix, jndiName);
+
+		List resEnvRefs = session.getResourceEnvRefs();
+		ResourceEnvRef resEnvRef = (ResourceEnvRef) resEnvRefs.get(0);
+		jndiName = helper.getJNDINameForRef(session, resEnvRef);
+		suffix = prefix.length() > 0 ? TestBindingsHelper.EJB_RES_ENV_REF : prefix;
+		assertEquals(prefix + resEnvRef.getName() + suffix, jndiName);
+
+		List securityRoleRefs = session.getSecurityRoleRefs();
+		SecurityRoleRef securityRoleRef = (SecurityRoleRef) securityRoleRefs.get(0);
+		jndiName = helper.getJNDINameForRef(session, securityRoleRef);
+		suffix = prefix.length() > 0 ? TestBindingsHelper.EJB_SEC_ROLE_REF : prefix;
+		assertEquals(prefix + securityRoleRef.getName() + suffix, jndiName);
+
+		List warFiles = earFile.getWARFiles();
+		WARFile warFile = (WARFile) warFiles.get(0);
+		WebApp webApp = warFile.getDeploymentDescriptor();
+
+		resRefs = webApp.getResourceRefs();
+		resRef = (ResourceRef) resRefs.get(0);
+		jndiName = helper.getJNDINameForRef(webApp, resRef);
+		suffix = prefix.length() > 0 ? TestBindingsHelper.WEB_RES_REF : prefix;
+		assertEquals(prefix + resRef.getName() + suffix, jndiName);
+
+		resEnvRefs = session.getResourceEnvRefs();
+		resEnvRef = (ResourceEnvRef) resEnvRefs.get(0);
+		jndiName = helper.getJNDINameForRef(webApp, resEnvRef);
+		suffix = prefix.length() > 0 ? TestBindingsHelper.WEB_RES_ENV_REF : prefix;
+		assertEquals(prefix + resEnvRef.getName() + suffix, jndiName);
+
+	}
+
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/bindingshelper/tests/FooBindingsHelper.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/bindingshelper/tests/FooBindingsHelper.java
new file mode 100644
index 0000000..445356c
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/bindingshelper/tests/FooBindingsHelper.java
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2006 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.bindingshelper.tests;
+
+public class FooBindingsHelper extends TestBindingsHelper {
+
+	public static String getFileName(){
+		return "foo.txt"; //$NON-NLS-1$
+	}
+	
+	public String getBindingsFileName() {
+		return getFileName();
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/bindingshelper/tests/TestBindingsHelper.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/bindingshelper/tests/TestBindingsHelper.java
new file mode 100644
index 0000000..273f99d
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/bindingshelper/tests/TestBindingsHelper.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2006 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.bindingshelper.tests;
+
+import java.io.FileNotFoundException;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jst.j2ee.common.ResourceEnvRef;
+import org.eclipse.jst.j2ee.common.ResourceRef;
+import org.eclipse.jst.j2ee.common.SecurityRoleRef;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive;
+import org.eclipse.jst.j2ee.core.internal.bindings.AbstractJNDIBindingsHelper;
+import org.eclipse.jst.j2ee.ejb.ContainerManagedEntity;
+import org.eclipse.jst.j2ee.ejb.EnterpriseBean;
+import org.eclipse.jst.j2ee.webapplication.WebApp;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+
+public abstract class TestBindingsHelper extends AbstractJNDIBindingsHelper {
+
+	public abstract String getBindingsFileName();
+
+	public boolean appliesFor(IProject project) {
+		IVirtualComponent component = ComponentCore.createComponent(project);
+		if (null == component) {
+			return false;
+		}
+		IFile bindingsFile = component.getRootFolder().getFile(getBindingsFileName()).getUnderlyingFile();
+		return bindingsFile.exists();
+	}
+
+	public boolean appliesFor(Archive archive) {
+		try {
+			archive.getFile(getBindingsFileName());
+			return true;
+		} catch (FileNotFoundException e) {
+			return false;
+		}
+	}
+
+	public static final String OBJ = "obj";//$NON-NLS-1$
+	public static final String EJB = "ejb";//$NON-NLS-1$
+	public static final String EJB_RES_REF = "ejbResRef";//$NON-NLS-1$
+	public static final String EJB_RES_ENV_REF = "ejbResEnvRef";//$NON-NLS-1$
+	public static final String EJB_SEC_ROLE_REF = "ejbSecRoleRef";//$NON-NLS-1$
+	public static final String WEB_RES_REF = "webResRef";//$NON-NLS-1$
+	public static final String WEB_RES_ENV_REF = "webResEnvRef";//$NON-NLS-1$
+	public static final String CMP = "cmp";//$NON-NLS-1$
+
+	public String getJNDIName(Object object) {
+		return getBindingsFileName() + super.getJNDIName(object) + OBJ;
+	}
+
+	public String getJNDIName(EnterpriseBean bean) {
+		return getBindingsFileName() + super.getJNDIName(bean) + EJB;
+	}
+
+	public String getJNDINameForRef(EnterpriseBean bean, ResourceRef resourceRef) {
+		return getBindingsFileName() + super.getJNDINameForRef(bean, resourceRef) + EJB_RES_REF;
+	}
+
+	public String getJNDINameForRef(EnterpriseBean bean, ResourceEnvRef resourceEnvRef) {
+		return getBindingsFileName() + super.getJNDINameForRef(bean, resourceEnvRef) + EJB_RES_ENV_REF;
+	}
+
+	public String getJNDINameForRef(EnterpriseBean bean, SecurityRoleRef securityRoleRef) {
+		return getBindingsFileName() + super.getJNDINameForRef(bean, securityRoleRef) + EJB_SEC_ROLE_REF;
+	}
+
+	public String getJNDINameForRef(WebApp webApp, ResourceRef resourceRef) {
+		return getBindingsFileName() + super.getJNDINameForRef(webApp, resourceRef) + WEB_RES_REF;
+	}
+
+	public String getJNDINameForRef(WebApp webApp, ResourceEnvRef resourceEnvRef) {
+		return getBindingsFileName() + super.getJNDINameForRef(webApp, resourceEnvRef) + WEB_RES_ENV_REF;
+	}
+
+	public String getJNDINameForDefaultDataSource(ContainerManagedEntity bean) {
+		return getBindingsFileName() + super.getJNDINameForDefaultDataSource(bean) + CMP;
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/classpath/tests/AbstractTests.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/classpath/tests/AbstractTests.java
new file mode 100644
index 0000000..d2f35b8
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/classpath/tests/AbstractTests.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2007 BEA Systems, Inc 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:
+ *    BEA Systems, Inc - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.classpath.tests;
+
+import org.eclipse.wst.common.tests.OperationTestCase;
+
+/**
+ * Abstract base class for classpath dependency unit tests
+ * 
+ * @author rfrost@bea.com
+ */
+public abstract class AbstractTests extends OperationTestCase {
+    
+    protected AbstractTests(final String name) {
+        super(name);
+    }
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/classpath/tests/AllTests.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/classpath/tests/AllTests.java
new file mode 100644
index 0000000..3fee11e
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/classpath/tests/AllTests.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2007 BEA Systems, Inc 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:
+ *    BEA Systems, Inc - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.classpath.tests;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+public class AllTests extends TestCase {
+    public static Test suite() {
+        final TestSuite suite = new TestSuite();
+        
+        suite.setName("All Classpath Dependency Tests");
+        suite.addTest(ClasspathDependencyCreationTests.suite());
+        //suite.addTest(ClasspathDependencyValidationTests.suite());
+        suite.addTest(ClasspathDependencyEARTests.suite());
+        suite.addTest(ClasspathDependencyWebTests.suite());
+        
+        return suite;
+    }
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/classpath/tests/ClasspathDependencyCreationTests.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/classpath/tests/ClasspathDependencyCreationTests.java
new file mode 100644
index 0000000..d1c9d19
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/classpath/tests/ClasspathDependencyCreationTests.java
@@ -0,0 +1,151 @@
+/*******************************************************************************
+ * Copyright (c) 2007 BEA Systems, Inc 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:
+ *    BEA Systems, Inc - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.classpath.tests;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jst.j2ee.classpath.tests.util.ClasspathDependencyTestUtil;
+import org.eclipse.jst.j2ee.classpathdep.UpdateClasspathAttributeUtil;
+import org.eclipse.jst.j2ee.dependency.tests.util.ProjectUtil;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * Tests creation of classpath component dependencies via addition of the
+ * classpath entry attribute.
+ */
+public class ClasspathDependencyCreationTests extends AbstractTests {
+
+    private ClasspathDependencyCreationTests(final String name) {
+        super(name);
+    }
+    
+    public static Test suite(){
+        final TestSuite suite = new TestSuite();
+        suite.setName("Classpath Component Dependency Creation Tests" );
+        suite.addTest(new ClasspathDependencyCreationTests("testNoClasspathDependencies"));
+        suite.addTest(new ClasspathDependencyCreationTests("testAddRemoveClasspathDependency"));
+        suite.addTest(new ClasspathDependencyCreationTests("testLibraryClasspathDependency"));
+        suite.addTest(new ClasspathDependencyCreationTests("testClassFolderDependency"));
+        return suite;
+    }
+    
+    public void testNoClasspathDependencies() throws Exception {
+    	final IProject project = ProjectUtil.createUtilityProject("TestUtil", "TestEAR");
+    	final IJavaProject javaProject = JavaCore.create(project);
+    	final IVirtualComponent comp = ComponentCore.createComponent(project);
+    	ClasspathDependencyTestUtil.verifyNoClasspathAttributes(javaProject);
+    	ClasspathDependencyTestUtil.verifyNoPotentialClasspathEntries(javaProject);
+    	ClasspathDependencyTestUtil.verifyNoClasspathDependencies(comp);
+    }
+    
+    public void testAddRemoveClasspathDependency() throws Exception {
+    	final IProject project = ProjectUtil.createUtilityProject("TestUtil", "TestEAR");
+    	final IJavaProject javaProject = JavaCore.create(project);
+    	final IVirtualComponent comp = ComponentCore.createComponent(project);
+    	
+    	ClasspathDependencyTestUtil.verifyNoClasspathAttributes(javaProject);
+    	ClasspathDependencyTestUtil.verifyNoPotentialClasspathEntries(javaProject);
+    	ClasspathDependencyTestUtil.verifyNoClasspathDependencies(comp);
+    	
+    	ClasspathDependencyTestUtil.addCustomClasspathContainer(javaProject);
+    	
+    	final Set entryPaths = new HashSet();
+    	entryPaths.add(ClasspathDependencyTestUtil.CUSTOM_CLASSPATH_CONTAINER);
+    	List entries = ClasspathDependencyTestUtil.verifyPotentialClasspathEntries(javaProject, entryPaths);
+    	ClasspathDependencyTestUtil.verifyNoClasspathAttributes(javaProject);
+    	ClasspathDependencyTestUtil.verifyNoClasspathDependencies(comp);
+    	
+    	IClasspathEntry entry = (IClasspathEntry) entries.get(0);
+    	UpdateClasspathAttributeUtil.addDependencyAttribute(null, project.getName(), entry);
+    	
+    	ClasspathDependencyTestUtil.verifyNoPotentialClasspathEntries(javaProject);
+    	ClasspathDependencyTestUtil.verifyClasspathAttributes(javaProject, entryPaths);
+    	final Set archiveNames = new HashSet();
+    	archiveNames.add(ClasspathDependencyTestUtil.TEST1_JAR);
+    	archiveNames.add(ClasspathDependencyTestUtil.TEST2_JAR);
+    	ClasspathDependencyTestUtil.verifyClasspathDependencies(comp, archiveNames);
+    	
+    	UpdateClasspathAttributeUtil.removeDependencyAttribute(null, project.getName(), entry);
+    	
+    	ClasspathDependencyTestUtil.verifyPotentialClasspathEntries(javaProject, entryPaths);
+    	ClasspathDependencyTestUtil.verifyNoClasspathAttributes(javaProject);
+    	ClasspathDependencyTestUtil.verifyNoClasspathDependencies(comp);
+    }
+    
+    public void testLibraryClasspathDependency() throws Exception {
+    	final IProject project = ProjectUtil.createWebProject("TestWeb", "TestEAR");
+    	final IJavaProject javaProject = JavaCore.create(project);
+    	final IVirtualComponent comp = ComponentCore.createComponent(project);
+    	
+    	ClasspathDependencyTestUtil.verifyNoClasspathAttributes(javaProject);
+    	ClasspathDependencyTestUtil.verifyNoPotentialClasspathEntries(javaProject);
+    	ClasspathDependencyTestUtil.verifyNoClasspathDependencies(comp);
+    	
+    	ClasspathDependencyTestUtil.addLibraryEntry(javaProject, ClasspathDependencyTestUtil.TEST3_JAR_PATH, true);
+    	
+    	final Set entryPaths = new HashSet();
+    	entryPaths.add(ClasspathDependencyTestUtil.TEST3_JAR_PATH);
+    	List entries = ClasspathDependencyTestUtil.verifyPotentialClasspathEntries(javaProject, entryPaths);
+    	ClasspathDependencyTestUtil.verifyNoClasspathAttributes(javaProject);
+    	ClasspathDependencyTestUtil.verifyNoClasspathDependencies(comp);
+    	
+    	IClasspathEntry entry = (IClasspathEntry) entries.get(0);
+    	UpdateClasspathAttributeUtil.addDependencyAttribute(null, project.getName(), entry);
+    	
+    	ClasspathDependencyTestUtil.verifyNoPotentialClasspathEntries(javaProject);
+    	ClasspathDependencyTestUtil.verifyClasspathAttributes(javaProject, entryPaths);
+    	final Set archiveNames = new HashSet();
+    	archiveNames.add(ClasspathDependencyTestUtil.TEST3_JAR);
+    	ClasspathDependencyTestUtil.verifyClasspathDependencies(comp, archiveNames);    	
+    }
+    
+    public void testClassFolderDependency() throws Exception {
+    	final IProject project = ProjectUtil.createWebProject("TestWeb", "TestEAR");
+    	final IJavaProject javaProject = JavaCore.create(project);
+    	final IVirtualComponent comp = ComponentCore.createComponent(project);
+    	final IPath binPath = new Path("bin");
+    	final IPath fullBinPath = project.getFullPath().append(binPath);
+    	project.getFolder(binPath).create(true, true, null);
+    	
+    	ClasspathDependencyTestUtil.verifyNoClasspathAttributes(javaProject);
+    	ClasspathDependencyTestUtil.verifyNoPotentialClasspathEntries(javaProject);
+    	ClasspathDependencyTestUtil.verifyNoClasspathDependencies(comp);
+    	
+    	ClasspathDependencyTestUtil.addLibraryEntry(javaProject, fullBinPath, true);
+    	
+    	final Set entryPaths = new HashSet();
+    	entryPaths.add(fullBinPath);
+    	List entries = ClasspathDependencyTestUtil.verifyPotentialClasspathEntries(javaProject, entryPaths);
+    	ClasspathDependencyTestUtil.verifyNoClasspathAttributes(javaProject);
+    	ClasspathDependencyTestUtil.verifyNoClasspathDependencies(comp);
+    	
+    	IClasspathEntry entry = (IClasspathEntry) entries.get(0);
+    	UpdateClasspathAttributeUtil.addDependencyAttribute(null, project.getName(), entry);
+    	
+    	ClasspathDependencyTestUtil.verifyNoPotentialClasspathEntries(javaProject);
+    	ClasspathDependencyTestUtil.verifyClasspathAttributes(javaProject, entryPaths);
+    	final Set archiveNames = new HashSet();
+    	archiveNames.add(fullBinPath.toString());
+    	ClasspathDependencyTestUtil.verifyClasspathDependencies(comp, archiveNames);    	
+    }
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/classpath/tests/ClasspathDependencyEARTests.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/classpath/tests/ClasspathDependencyEARTests.java
new file mode 100644
index 0000000..adb15ed
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/classpath/tests/ClasspathDependencyEARTests.java
@@ -0,0 +1,647 @@
+/*******************************************************************************
+ * Copyright (c) 2007 BEA Systems, Inc 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:
+ *    BEA Systems, Inc - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.classpath.tests;
+
+import java.io.FileInputStream;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jst.j2ee.classpath.tests.util.ClasspathDependencyTestUtil;
+import org.eclipse.jst.j2ee.classpathdep.UpdateClasspathAttributeUtil;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.EARFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.File;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveManifest;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveManifestImpl;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.impl.ArchiveImpl;
+import org.eclipse.jst.j2ee.componentcore.EnterpriseArtifactEdit;
+import org.eclipse.jst.j2ee.componentcore.util.EARArtifactEdit;
+import org.eclipse.jst.j2ee.dependency.tests.util.DependencyCreationUtil;
+import org.eclipse.jst.j2ee.dependency.tests.util.ProjectUtil;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.j2ee.internal.classpathdep.ClasspathDependencyEnablement;
+import org.eclipse.jst.j2ee.internal.deployables.J2EEFlexProjDeployable;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.server.core.IModule;
+import org.eclipse.wst.server.core.model.IModuleFile;
+import org.eclipse.wst.server.core.model.IModuleFolder;
+import org.eclipse.wst.server.core.model.IModuleResource;
+import org.eclipse.wst.server.core.util.ProjectModule;
+
+/**
+ * Tests export and publish behavior for classpath component dependencies on the module projects associated with an EAR.
+ */
+public class ClasspathDependencyEARTests extends AbstractTests {
+
+	private static final String UTIL_PROJECT = "TestUtil";
+	private static final String WEB_PROJECT = "TestWeb";
+	private static final String EAR_PROJECT = "TestEAR";
+	
+    private ClasspathDependencyEARTests(final String name) {
+        super(name);
+    }
+    
+    public static Test suite(){
+        final TestSuite suite = new TestSuite();
+        suite.setName("Classpath Dependency EAR Tests" );
+        suite.addTest(new ClasspathDependencyEARTests("testEARExportJ2EE"));
+        //suite.addTest(new ClasspathDependencyEARTests("testEARExportJEE5"));
+        suite.addTest(new ClasspathDependencyEARTests("testEARPublishJ2EE"));
+        suite.addTest(new ClasspathDependencyEARTests("testEARPublishJEE5"));
+        suite.addTest(new ClasspathDependencyEARTests("testEARLibPublishJEE5"));
+        return suite;
+    }
+    
+    public void testEARExportJ2EE() throws Exception {
+    	testEARExport(false);
+    }
+    
+    public void testEARExportJEE5() throws Exception {
+    	testEARExport(true);
+    }
+
+    // XXX TODO need to modify test logic to work with new JEE5 model provider logic rather than just EARArtifactEdit
+    private void testEARExport(boolean JEE5) throws Exception {
+    	// create the EAR and module projects
+    	createProjects(JEE5);
+    	final IProject earProject = ProjectUtil.getProject(EAR_PROJECT);
+    	final IVirtualComponent earComp = ComponentCore.createComponent(earProject);
+    	final Set archiveNames = new HashSet();
+    	archiveNames.add(ClasspathDependencyTestUtil.TEST1_JAR);
+    	archiveNames.add(ClasspathDependencyTestUtil.TEST2_JAR);
+    	
+    	// verify that the exported EAR does not contain the cp container Jars from the utility,
+    	// that the utility MANIFEST classpath does not include entries for the cp container jars and
+    	// that the contents of the util and web "bin" class folders are not included in the exported archives.
+    	verifyExportedEAR(earComp, archiveNames, false);
+
+    	// add the attribute to the cp container and "bin" class folder in the utility project and to the "bin" class
+    	// folder in the web project
+    	addDependencyAttribute(true);
+    	
+    	// verify that the exported EAR does contain the cp container Jars from the utility,
+    	// that the utility MANIFEST classpath includes entries for the cp container
+    	// jars, that the utility includes the contents of the "bin" class folder and that the web's WEB-INF/classes
+    	// includes the contents of the web's "bin" class folder.
+    	verifyExportedEAR(earComp, archiveNames, true);
+    }
+    
+    private void verifyExportedEAR(final IVirtualComponent comp, final Set archiveNames, final boolean shouldHaveDependencies) throws Exception {
+		EnterpriseArtifactEdit earEdit = null;
+		EARFile earFile = null;
+		try {
+			earEdit = EARArtifactEdit.getEARArtifactEditForRead(comp);
+			if (earEdit != null) {
+				earFile = (EARFile) earEdit.asArchive(true);
+				List archives = earFile.getArchiveFiles();
+				Iterator it = archiveNames.iterator();
+				while (it.hasNext()) {
+					String name = (String) it.next();
+					boolean hasArchive = false;
+					for (int i = 0; i < archives.size(); i++) {
+						File archive = (File) archives.get(i);
+						if (archive.isArchive()) {
+							if (archive.getName().equals(name)) {
+								hasArchive= true;
+							}
+						}
+					}
+					if (shouldHaveDependencies) {
+						assertTrue("Exported EAR missing classpath dependency Jar " + name, hasArchive);  					
+					} else {
+						assertFalse("Exported EAR has unexpected classpath dependency Jar " + name, hasArchive);
+					}
+				}
+				for (int i = 0; i < archives.size(); i++) {
+					File archive = (File) archives.get(i);
+					if (archive.isArchive() && archive.getName().equals(UTIL_PROJECT + ".jar")) {
+						ArchiveImpl archiveImpl = (ArchiveImpl) archive;
+						String[] cp = archiveImpl.getManifest().getClassPathTokenized();
+						while (it.hasNext()) {
+							String name = (String) it.next();
+							boolean isOnCP = false;
+							for (int j = 0; j < cp.length; j++) {
+								if (cp[j].equals(name)) {
+									isOnCP = true;
+								}
+							}
+							if (shouldHaveDependencies) {
+								assertTrue("Exported utility project MANIFEST.MF classpath in exported EAR is entry for dependency Jar " + name, isOnCP);  					
+							} else {
+								assertFalse("Exported utility project MANIFEST.MF classpath in exported EAR has unexpected entry for dependency Jar " + name, isOnCP);  					
+							}
+						}
+						archiveImpl.getFiles();
+						boolean hasTestFile = archiveImpl.containsFile("test");
+						if (shouldHaveDependencies) {
+							assertTrue("Exported utility project missing file from published/exported class folder", hasTestFile);  					
+						} else {
+							assertFalse("Exported utility project has unexpected entry for file from non-published/exported class folder", hasTestFile);  					
+						}
+						
+					} else if (archive.isArchive() && archive.getName().equals(WEB_PROJECT + ".war")) {
+						ArchiveImpl archiveImpl = (ArchiveImpl) archive;
+						archiveImpl.getFiles();
+						boolean hasTestFile = archiveImpl.containsFile("WEB-INF/classes/test");
+						if (shouldHaveDependencies) {
+							assertTrue("Exported web project missing file from published/exported class folder", hasTestFile);  					
+						} else {
+							assertFalse("Exported web project has unexpected entry for file from non-published/exported class folder", hasTestFile);
+						}
+					}
+				}
+			}
+		} finally {
+			if (earEdit !=null)
+				earEdit.dispose();
+			if(earFile != null){
+				earFile.close();
+			}
+		}    	
+    }
+    
+    public void testEARPublishJ2EE() throws Exception {
+    	testEARPublish(false);
+    }
+    
+    public void testEARPublishJEE5() throws Exception {
+    	testEARPublish(true);
+    }
+    
+    public void testEARLibPublishJEE5() throws Exception {
+    	testEARLibPublishJEE5(true);
+    }
+    
+    private void testEARPublish(boolean JEE5) throws Exception {
+
+    	// create the EAR and module projects
+    	createProjects(JEE5);
+    	final IProject earProject = ProjectUtil.getProject(EAR_PROJECT);
+    	final IVirtualComponent earComp = ComponentCore.createComponent(earProject);
+    	final Set archiveNames = new HashSet();
+    	archiveNames.add(ClasspathDependencyTestUtil.TEST1_JAR);
+    	archiveNames.add(ClasspathDependencyTestUtil.TEST2_JAR);
+    	
+    	// verify that the published EAR does not contain the cp container Jars from the utility,
+    	// that the utility MANIFEST classpath does not include entries for the cp container jars and
+    	// that the contents of the util and web "bin" class folders are not included in the exported archives.
+    	verifyPublishedEAR(earComp, archiveNames, false, JEE5);
+
+    	// add the attribute to the cp container in the utility project
+    	addDependencyAttribute(false);
+    	
+    	// verify that the published EAR does contain the cp container Jars from the utility,
+    	// that the utility MANIFEST classpath includes entries for the cp container
+    	// jars, that the utility includes the contents of the "bin" class folder and that the web's WEB-INF/classes
+    	// includes the contents of the web's "bin" class folder.
+    	verifyPublishedEAR(earComp, archiveNames, true, JEE5);
+    }
+    
+    private void testEARLibPublishJEE5(boolean JEE5) throws Exception {
+    	IVirtualComponent webComp = createWebProject(JEE5);
+    	
+    	final Set archiveNames = new HashSet();
+    	archiveNames.add(ClasspathDependencyTestUtil.TEST1_JAR);
+    	archiveNames.add(ClasspathDependencyTestUtil.TEST2_JAR);
+    	final IProject earProject = ProjectUtil.getProject(EAR_PROJECT);
+    	final IVirtualComponent earComp = ComponentCore.createComponent(earProject);
+    	
+    	verifyPublishedEARLibRef(earComp, archiveNames, false, JEE5);
+
+    	addEARLibDependencyAttribute(false);
+    	
+    	verifyPublishedEARLibRef(earComp, archiveNames, true, JEE5);
+    }
+    
+    private void verifyPublishedEAR(final IVirtualComponent comp, final Set archiveNames, final boolean shouldHaveDependencies, boolean isEE5) throws Exception {
+    	
+    	// verify that the published EAR contains the cp container jars from the Utility
+    	J2EEFlexProjDeployable deployable = new J2EEFlexProjDeployable(comp.getProject(), comp);
+		try {
+			IModuleResource[] rootmembers = deployable.members();
+			IModuleResource[] members = null;
+			if (isEE5) {
+				for (int i=0; i<rootmembers.length; i++) {
+					String name = rootmembers[i].getName();
+					if (name.equals("lib")) {
+						members = ((IModuleFolder)rootmembers[i]).members();
+					}
+				}
+			}
+
+			if (members == null)
+				members = rootmembers;
+				
+			Iterator it = archiveNames.iterator();						
+			while (it.hasNext()) {
+				String name = (String) it.next();
+				boolean hasArchive = false;
+				for (int i=0; i<members.length; i++) {
+					if (members[i].getName().equals(name)) {
+						hasArchive = true;
+					}
+				}
+				if (shouldHaveDependencies) {
+					assertTrue("Published EAR missing classpath dependency Jar " + name, hasArchive);  					
+				} else {
+					assertFalse("Published EAR has unexpected classpath dependency Jar " + name, hasArchive);
+				}
+			}
+			
+			// get the web and util child modules
+			
+			IModule utilModule = null;
+			IModule webModule = null;
+			IModule[] childModules = deployable.getChildModules();
+			for (int i=0; i < childModules.length; i++) {
+				if (childModules[i].getName().equals(UTIL_PROJECT)) {
+					utilModule = childModules[i];
+				} else if (childModules[i].getName().equals(WEB_PROJECT)) {
+					webModule = childModules[i];
+				}
+			}
+			
+			// verify that the util module has MANIFEST.MF classpath references to the cp container jars and has the
+			// class folder file
+
+			assertNotNull("Missing entry for utility project", utilModule);
+
+			J2EEFlexProjDeployable projectModule =(J2EEFlexProjDeployable) utilModule.loadAdapter(ProjectModule.class, null);
+			IModuleResource[] moduleMembers = projectModule.members();
+			ArchiveManifest manifest = null;
+			boolean foundMetaInf = false;
+			boolean foundTest = false;
+			for (int i=0; i< moduleMembers.length; i++) {
+				String name = moduleMembers[i].getName();
+				if (name.equals("META-INF")) {
+					foundMetaInf = true;
+					IModuleResource manifestResource= ((IModuleFolder)moduleMembers[i]).members()[0];
+					assertTrue(manifestResource.getModuleRelativePath().toString().equals("META-INF"));
+					assertTrue("Expected MANIFEST.MF, got " + manifestResource.getName(), manifestResource.getName().equals("MANIFEST.MF"));
+					java.io.File manifestFile = (java.io.File) manifestResource.getAdapter(java.io.File.class);
+					if (manifestFile == null) {
+						manifestFile = ((IFile) manifestResource.getAdapter(IFile.class)).getLocation().toFile();
+					}
+					assertNotNull(manifestFile);
+					FileInputStream fis = null;
+					try {
+						fis = new FileInputStream(manifestFile);
+						manifest = new ArchiveManifestImpl(fis);
+					} finally {
+						if (fis != null) {
+							fis.close();
+						}
+					}
+				} else if (name.equals("test")) {
+					if (moduleMembers[i] instanceof IModuleFile) {
+						foundTest = true;
+					}
+				}
+			}
+			if (!foundMetaInf) {
+				assertTrue("members() failed to return META-INF for utility project module in published EAR", foundMetaInf);
+			}
+			
+			if (shouldHaveDependencies) {
+				assertTrue("Published utility project missing file from published/exported class folder", foundTest);  					
+			} else {
+				assertFalse("Published utility project has unexpected entry for file from non-published/exported class folder", foundTest);  					
+			}
+
+			assertNotNull("Failed to retrieve MANIFEST.MF from utility project module in published EAR", manifest);
+			
+			it = archiveNames.iterator();						
+			while (it.hasNext()) {
+				String name = (String) it.next();
+				boolean isOnCP = false;
+				String[] cp = manifest.getClassPathTokenized();
+				for (int j = 0; j < cp.length; j++) {
+					if (cp[j].equals(name)) {
+						isOnCP = true;
+					}
+				}
+				if (shouldHaveDependencies && ClasspathDependencyEnablement.isAllowClasspathComponentDependency()) {
+					assertTrue("Utility project MANIFEST.MF classpath in published EAR missing entry for dependency Jar " + name, isOnCP);  					
+				} else {
+					assertFalse("Utility project MANIFEST.MF classpath in published EAR has unexpected entry for dependency Jar " + name, isOnCP);  					
+				}
+			}
+			
+			assertNotNull("Missing entry for web project", webModule);
+		
+			projectModule =(J2EEFlexProjDeployable) webModule.loadAdapter(ProjectModule.class, null);
+			moduleMembers = projectModule.members();
+			foundTest = false;
+			for (int i=0; i< moduleMembers.length; i++) {
+				if (moduleMembers[i].getName().equals("WEB-INF")) {
+					IModuleResource[] webinfMembers = ((IModuleFolder)moduleMembers[i]).members();
+					for (int j = 0; j < webinfMembers.length; j++) {
+						if (webinfMembers[j].getName().equals("classes")) {
+							IModuleResource[] classesMembers = ((IModuleFolder)webinfMembers[j]).members();
+							if (classesMembers.length > 0) {
+								IModuleResource test = classesMembers[0];
+								if (test.getName().equals("test") && test.getModuleRelativePath().equals(new Path("WEB-INF/classes")) && test instanceof IModuleFile) {
+									foundTest = true;
+								}
+							}
+						}
+					}
+				}
+			}
+			if (shouldHaveDependencies) {
+				assertTrue("Exported web project does not contain class folder file in WEB-INF/classes", foundTest);
+			} else {
+				assertFalse("Exported Web project should not class folder file in WEB-INF/classes", foundTest);
+			}
+		} catch (CoreException e) {
+			e.printStackTrace();
+			fail(e.getMessage());
+		}    	
+    }
+    
+private void verifyPublishedEARLibRef(final IVirtualComponent comp, final Set archiveNames, final boolean shouldHaveDependencies, boolean isEE5) throws Exception {
+    	
+    	J2EEFlexProjDeployable deployable = new J2EEFlexProjDeployable(comp.getProject(), comp);
+		try {
+			IModuleResource[] rootmembers = deployable.members();
+			IModuleResource[] members = null;
+			if (isEE5) {
+				for (int i=0; i<rootmembers.length; i++) {
+					String name = rootmembers[i].getName();
+					if (name.equals("lib")) {
+						members = ((IModuleFolder)rootmembers[i]).members();
+					}
+				}
+			}
+
+			if (members == null)
+				members = rootmembers;
+			
+			Iterator it = archiveNames.iterator();						
+			while (it.hasNext()) {
+				String name = (String) it.next();
+				boolean hasArchive = false;
+				for (int i=0; i<members.length; i++) {
+					if (members[i].getName().equals(name)) {
+						hasArchive = true;
+					}
+				}
+				if (shouldHaveDependencies) {
+					assertTrue("Published EAR missing classpath dependency Jar " + name, hasArchive);  					
+				} else {
+					assertFalse("Published EAR has unexpected classpath dependency Jar " + name, hasArchive);
+				}
+			}
+			
+			IModule webModule = null;
+			IModule[] childModules = deployable.getChildModules();
+			for (int i=0; i < childModules.length; i++) {
+				if (childModules[i].getName().equals(WEB_PROJECT)) {
+					webModule = childModules[i];
+				}
+			}
+			
+			assertNotNull("Missing entry for web project", webModule);
+
+			J2EEFlexProjDeployable projectModule =(J2EEFlexProjDeployable) webModule.loadAdapter(ProjectModule.class, null);
+			IModuleResource[] moduleMembers = projectModule.members();
+			ArchiveManifest manifest = null;
+			boolean foundMetaInf = false;
+			for (int i=0; i< moduleMembers.length; i++) {
+				String name = moduleMembers[i].getName();
+				if (name.equals("META-INF")) {
+					foundMetaInf = true;
+					IModuleResource manifestResource= ((IModuleFolder)moduleMembers[i]).members()[0];
+					assertTrue(manifestResource.getModuleRelativePath().toString().equals("META-INF"));
+					assertTrue("Expected MANIFEST.MF, got " + manifestResource.getName(), manifestResource.getName().equals("MANIFEST.MF"));
+					java.io.File manifestFile = (java.io.File) manifestResource.getAdapter(java.io.File.class);
+					if (manifestFile == null) {
+						manifestFile = ((IFile) manifestResource.getAdapter(IFile.class)).getLocation().toFile();
+					}
+					assertNotNull(manifestFile);
+					FileInputStream fis = null;
+					try {
+						fis = new FileInputStream(manifestFile);
+						manifest = new ArchiveManifestImpl(fis);
+					} finally {
+						if (fis != null) {
+							fis.close();
+						}
+					}
+				} 
+			}
+			if (!foundMetaInf) {
+				assertTrue("members() failed to return META-INF for web project module in published EAR", foundMetaInf);
+			}
+			
+			assertNotNull("Failed to retrieve MANIFEST.MF from web project module in published EAR", manifest);
+			
+			it = archiveNames.iterator();						
+			while (it.hasNext()) {
+				String name = (String) it.next();
+				boolean isOnCP = false;
+				String[] cp = manifest.getClassPathTokenized();
+				for (int j = 0; j < cp.length; j++) {
+					if (cp[j].equals("lib/" + name)) {
+						isOnCP = true;
+					}
+				}
+				if (shouldHaveDependencies && ClasspathDependencyEnablement.isAllowClasspathComponentDependency()) {
+					assertTrue("Utility project MANIFEST.MF classpath in published EAR missing entry for dependency Jar " + name, isOnCP);  					
+				} else {
+					assertFalse("Utility project MANIFEST.MF classpath in published EAR has unexpected entry for dependency Jar " + name, isOnCP);  					
+				}
+			}
+			
+		} catch (CoreException e) {
+			e.printStackTrace();
+			fail(e.getMessage());
+		}    	
+    }
+    
+    private IVirtualComponent createProjects(boolean JEE5) throws Exception {
+
+    	// create a Web project
+    	int version = J2EEVersionConstants.SERVLET_2_5;
+    	if (!JEE5) {
+    		version = J2EEVersionConstants.SERVLET_2_4;
+    	}
+    	final IProject webProject = ProjectUtil.createWebProject(WEB_PROJECT, EAR_PROJECT, version, true);
+    	final IJavaProject webJavaProject = JavaCore.create(webProject);
+    	final IVirtualComponent webComp = ComponentCore.createComponent(webProject);
+    	// create a new "bin" folder
+    	final IPath binPath = new Path("bin");
+    	IFolder webBin = webProject.getFolder(binPath);
+    	webBin.create(true, true, null);
+    	// add a file
+    	webBin.getFile("test").create(new java.io.StringBufferInputStream("blah"), true, null);
+    	// add as a library cp entry
+    	ClasspathDependencyTestUtil.addLibraryEntry(webJavaProject, webBin.getFullPath(), true);
+    	
+    	// create a Utility project
+    	final IProject util = ProjectUtil.createUtilityProject(UTIL_PROJECT, EAR_PROJECT, true);
+    	IFolder output = util.getFolder("build").getFolder("classes");
+    	final IJavaProject utilJava = JavaCore.create(util);
+    	// create a folder "bin"
+    	IFolder utilBin = util.getFolder(binPath);
+    	utilBin.create(true, true, null);
+    	// add a file
+    	utilBin.getFile("test").create(new java.io.StringBufferInputStream("blah"), true, null);
+    	final IVirtualComponent utilComp = ComponentCore.createComponent(util);
+    	// add as a library cp entry
+    	ClasspathDependencyTestUtil.addLibraryEntry(utilJava, utilBin.getFullPath(), true);
+    	
+    	// add a dependency from the Web to the Utility
+    	DependencyCreationUtil.createModuleDependency(webProject, util); 
+    	
+    	// add a cp dependency to the Utility
+    	ClasspathDependencyTestUtil.addCustomClasspathContainer(utilJava);
+    	
+    	return webComp;
+    }
+    
+    private IVirtualComponent createWebProject(boolean JEE5) throws Exception {
+    	// create a Web project
+    	int version = J2EEVersionConstants.SERVLET_2_5;
+    	if (!JEE5) {
+    		version = J2EEVersionConstants.SERVLET_2_4;
+    	}
+    	final IProject webProject = ProjectUtil.createWebProject(WEB_PROJECT, EAR_PROJECT, version, true);
+    	final IJavaProject webJavaProject = JavaCore.create(webProject);
+    	final IVirtualComponent webComp = ComponentCore.createComponent(webProject);
+ 	
+    	// add a cp dependency to the Utility
+    	ClasspathDependencyTestUtil.addCustomClasspathContainer(webJavaProject);
+    	
+    	return webComp;
+    }
+   
+  
+    /**
+     * 
+     * @param verifyClasspathDependencies - true if you want to immediately verify that
+     * the classpath dependencies were added.  Set to false if you want to verify this at
+     * a later time (such as thru a members call in export or publish).  
+     * @throws Exception
+     */
+    private void addDependencyAttribute(boolean verifyClasspathDependencies) throws Exception {
+    	final IProject util = ProjectUtil.getProject(UTIL_PROJECT);
+    	final IPath fullUtilBinPath = util.getFullPath().append("bin");
+    	final IJavaProject utilJava = JavaCore.create(util);
+    	final IVirtualComponent utilComp = ComponentCore.createComponent(util);
+    	final IProject web = ProjectUtil.getProject(WEB_PROJECT);
+    	final IJavaProject webJava = JavaCore.create(web);
+    	final IPath fullWebBinPath = web.getFullPath().append("bin");
+    	final IVirtualComponent webComp = ComponentCore.createComponent(web);
+    	
+    	final Set entryPaths = new HashSet();
+    	entryPaths.add(ClasspathDependencyTestUtil.CUSTOM_CLASSPATH_CONTAINER);
+    	entryPaths.add(fullUtilBinPath);
+    	// verify that "bin" and the custom cp container are potential entries
+    	List entries = ClasspathDependencyTestUtil.verifyPotentialClasspathEntries(utilJava, entryPaths);
+    	// verify that no entries have the classpath attribute
+    	ClasspathDependencyTestUtil.verifyNoClasspathAttributes(utilJava);
+    	// verify that there are no classpath dependencies
+    	ClasspathDependencyTestUtil.verifyNoClasspathDependencies(utilComp);
+    	IClasspathEntry entry = (IClasspathEntry) entries.get(0);
+
+    	// add the dependency attribute to "bin" and the cp container    	
+    	for (Object o: entries) {
+    		UpdateClasspathAttributeUtil.addDependencyAttribute(null, util.getName(), (IClasspathEntry) o);
+    	}
+    	// should no longer have potential entries
+    	ClasspathDependencyTestUtil.verifyNoPotentialClasspathEntries(utilJava);
+    	// verify that "bin" and the cp container have the attribute
+    	ClasspathDependencyTestUtil.verifyClasspathAttributes(utilJava, entryPaths);
+    	// verify that "bin" and the cp container are dependencies
+    	final Set archiveNames = new HashSet();
+    	archiveNames.add(ClasspathDependencyTestUtil.TEST1_JAR);
+    	archiveNames.add(ClasspathDependencyTestUtil.TEST2_JAR);
+    	archiveNames.add(fullUtilBinPath.toString());
+    	if (verifyClasspathDependencies)
+    		ClasspathDependencyTestUtil.verifyClasspathDependencies(utilComp, archiveNames);
+    	
+    	entryPaths.clear();
+    	entryPaths.add(fullWebBinPath);
+    	// verify that "bin" in the web project is a potential entry
+    	entries = ClasspathDependencyTestUtil.verifyPotentialClasspathEntries(webJava, entryPaths);
+    	// verify that no entries have the classpath attribute
+    	ClasspathDependencyTestUtil.verifyNoClasspathAttributes(webJava);
+    	// verify that there are no classpath dependencies
+    	ClasspathDependencyTestUtil.verifyNoClasspathDependencies(webComp);
+    	
+    	// add the dependency attribute to "bin"
+    	entry = (IClasspathEntry) entries.get(0);
+    	UpdateClasspathAttributeUtil.addDependencyAttribute(null, web.getName(), entry);
+    	// should no longer have potential entries
+    	ClasspathDependencyTestUtil.verifyNoPotentialClasspathEntries(webJava);
+    	// verify that "bin" has the attribute
+    	ClasspathDependencyTestUtil.verifyClasspathAttributes(webJava, entryPaths);
+    	// verify that "bin" is a dependency
+    	archiveNames.clear();
+    	archiveNames.add(fullWebBinPath.toString());
+    	if (verifyClasspathDependencies)
+    		ClasspathDependencyTestUtil.verifyClasspathDependencies(webComp, archiveNames);
+    }
+    
+    /**
+     * 
+     * @param verifyClasspathDependencies - true if you want to immediately verify that
+     * the classpath dependencies were added.  Set to false if you want to verify this at
+     * a later time (such as thru a members call in export or publish)  
+     * @throws Exception
+     */
+    private void addEARLibDependencyAttribute(boolean verifyClasspathDependencies) throws Exception {
+
+    	final IProject web = ProjectUtil.getProject(WEB_PROJECT);
+    	final IJavaProject webJava = JavaCore.create(web);
+    	final IVirtualComponent webComp = ComponentCore.createComponent(web);
+    	
+    	final Set entryPaths = new HashSet();
+    	entryPaths.add(ClasspathDependencyTestUtil.CUSTOM_CLASSPATH_CONTAINER);
+    	// verify that "bin" and the custom cp container are potential entries
+    	List entries = ClasspathDependencyTestUtil.verifyPotentialClasspathEntries(webJava, entryPaths);
+    	// verify that no entries have the classpath attribute
+    	ClasspathDependencyTestUtil.verifyNoClasspathAttributes(webJava);
+    	// verify that there are no classpath dependencies
+    	ClasspathDependencyTestUtil.verifyNoClasspathDependencies(webComp);
+    	IClasspathEntry entry = (IClasspathEntry) entries.get(0);
+
+    	// add the dependency attribute to "bin" and the cp container    	
+    	for (Object o: entries) {
+    		UpdateClasspathAttributeUtil.addDependencyAttribute(null, web.getName(), (IClasspathEntry) o, new Path("../lib"));
+    	}
+    	// should no longer have potential entries
+    	ClasspathDependencyTestUtil.verifyNoPotentialClasspathEntries(webJava);
+    	// verify that "bin" and the cp container have the attribute
+    	ClasspathDependencyTestUtil.verifyClasspathAttributes(webJava, entryPaths);
+    	// verify that "bin" and the cp container are dependencies
+    	final Set archiveNames = new HashSet();
+    	archiveNames.add(ClasspathDependencyTestUtil.TEST1_JAR);
+    	archiveNames.add(ClasspathDependencyTestUtil.TEST2_JAR);
+    	if (verifyClasspathDependencies)
+    		ClasspathDependencyTestUtil.verifyClasspathDependencies(webComp, archiveNames);
+    }
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/classpath/tests/ClasspathDependencyValidationTests.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/classpath/tests/ClasspathDependencyValidationTests.java
new file mode 100644
index 0000000..4160b2a
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/classpath/tests/ClasspathDependencyValidationTests.java
@@ -0,0 +1,360 @@
+/*******************************************************************************
+ * Copyright (c) 2007 BEA Systems, Inc 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:
+ *    BEA Systems, Inc - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.classpath.tests;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.launching.JavaRuntime;
+import org.eclipse.jst.j2ee.classpath.tests.util.ClasspathDependencyTestUtil;
+import org.eclipse.jst.j2ee.classpathdep.UpdateClasspathAttributeUtil;
+import org.eclipse.jst.j2ee.dependency.tests.util.DependencyCreationUtil;
+import org.eclipse.jst.j2ee.dependency.tests.util.DependencyUtil;
+import org.eclipse.jst.j2ee.dependency.tests.util.ProjectUtil;
+import org.eclipse.jst.j2ee.internal.common.classpath.J2EEComponentClasspathContainer;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualResource;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * Tests validation rules for classpath component dependencies.
+ */
+public class ClasspathDependencyValidationTests extends AbstractTests {
+
+    private ClasspathDependencyValidationTests(final String name) {
+        super(name);
+    }
+    
+    public static Test suite(){
+        final TestSuite suite = new TestSuite();
+        suite.setName("Classpath Component Dependency Validation Tests" );
+        suite.addTest(new ClasspathDependencyValidationTests("testSourceEntryRule"));
+        suite.addTest(new ClasspathDependencyValidationTests("testProjectEntryRule"));
+        suite.addTest(new ClasspathDependencyValidationTests("testDuplicateClassFolderRule"));
+        suite.addTest(new ClasspathDependencyValidationTests("testNonWebNonExportedRule"));
+        //suite.addTest(new ClasspathDependencyValidationTests("testDuplicateArchiveNamesRule"));
+        suite.addTest(new ClasspathDependencyValidationTests("testRootMappingNonEARWARRefRule"));
+        suite.addTest(new ClasspathDependencyValidationTests("testInvalidContainerRules"));
+        suite.addTest(new ClasspathDependencyValidationTests("testNonTaggedExportedClassesRule"));
+
+        return suite;
+    }
+    //SourceEntry=Invalid classpath component dependency {0}. Source entries not supported.
+    public void testSourceEntryRule() throws Exception {
+    	final IProject project = ProjectUtil.createUtilityProject("TestUtil", "TestEAR", true);
+    	ClasspathDependencyTestUtil.verifyNoValidationError(project);
+    	final IJavaProject javaProject = JavaCore.create(project);
+    	final IVirtualComponent comp = ComponentCore.createComponent(project);
+    	ClasspathDependencyTestUtil.verifyNoClasspathAttributes(javaProject);
+    	ClasspathDependencyTestUtil.verifyNoPotentialClasspathEntries(javaProject);
+    	ClasspathDependencyTestUtil.verifyNoClasspathDependencies(comp);
+
+    	IClasspathEntry[] entries = javaProject.getRawClasspath();
+    	IClasspathEntry src = null;
+    	for (int i = 0; i < entries.length; i++) {
+    		if (entries[i].getEntryKind() == IClasspathEntry.CPE_SOURCE) {
+    			src = entries[i];
+    			break;
+    		}
+    	}
+    	UpdateClasspathAttributeUtil.addDependencyAttribute(null, project.getName(), src);
+    	
+    	DependencyUtil.waitForValidationJobs(project);
+    	ClasspathDependencyTestUtil.verifyClasspathDependencyError(project);
+    	
+    	UpdateClasspathAttributeUtil.removeDependencyAttribute(null, project.getName(), src);
+    	
+    	DependencyUtil.waitForValidationJobs(project);
+    	ClasspathDependencyTestUtil.verifyNoClasspathDependencyError(project);
+    }
+    
+    //ProjectClasspathEntry=Invalid classpath component dependency {0}. Project entries not supported.
+    public void testProjectEntryRule() throws Exception {
+    	final IProject utilProject = ProjectUtil.createUtilityProject("TestUtil", "TestEAR");
+    	final IProject webProject = ProjectUtil.createWebProject("TestWeb", "TestEAR", true);
+    	final IJavaProject webJavaProject = JavaCore.create(webProject);
+    	final IVirtualComponent webComp = ComponentCore.createComponent(webProject);
+    	    	
+    	final IClasspathEntry entry = JavaCore.newProjectEntry(utilProject.getFullPath());
+    	ClasspathDependencyTestUtil.addEntryToCP(webJavaProject, entry);
+    	
+    	DependencyUtil.waitForValidationJobs(webProject);
+    	ClasspathDependencyTestUtil.verifyNoValidationError(webProject);
+    	ClasspathDependencyTestUtil.verifyNoClasspathAttributes(webJavaProject);
+    	ClasspathDependencyTestUtil.verifyNoPotentialClasspathEntries(webJavaProject);
+    	ClasspathDependencyTestUtil.verifyNoClasspathDependencies(webComp);
+
+    	UpdateClasspathAttributeUtil.addDependencyAttribute(null, webProject.getName(), entry);
+    	
+    	DependencyUtil.waitForValidationJobs(webProject);
+    	ClasspathDependencyTestUtil.verifyClasspathDependencyError(webProject);
+    	
+    	UpdateClasspathAttributeUtil.removeDependencyAttribute(null, webProject.getName(), entry);
+    	
+    	DependencyUtil.waitForValidationJobs(webProject);
+    	ClasspathDependencyTestUtil.verifyNoClasspathDependencyError(webProject);
+    }
+
+    //DuplicateClassFolderEntry
+    public void testDuplicateClassFolderRule() throws Exception {
+    	final IProject project = ProjectUtil.createUtilityProject("TestUtil", "TestEAR", true);
+    	final IJavaProject javaProject = JavaCore.create(project);
+    	final IVirtualComponent comp = ComponentCore.createComponent(project);
+    	final IPath classFolderPath = project.getFullPath().append(ClasspathDependencyTestUtil.TEST3_BIN_PATH);
+    	
+    	// create a library classpath entry
+    	ClasspathDependencyTestUtil.addLibraryEntry(javaProject, classFolderPath, true);
+    	
+    	// link via the component file 
+    	comp.getRootFolder().createLink(ClasspathDependencyTestUtil.TEST3_BIN_PATH, IVirtualResource.FORCE, null);
+    	
+    	DependencyUtil.waitForValidationJobs(project);
+    	ClasspathDependencyTestUtil.verifyNoValidationError(project);
+    	ClasspathDependencyTestUtil.verifyNoPotentialClasspathEntries(javaProject);
+    	ClasspathDependencyTestUtil.verifyNoClasspathAttributes(javaProject);
+    	ClasspathDependencyTestUtil.verifyNoClasspathDependencies(comp);
+
+    	IClasspathEntry[] entries = javaProject.getRawClasspath();
+    	IClasspathEntry lib = null;
+    	for (int i = 0; i < entries.length; i++) {
+    		if (entries[i].getEntryKind() == IClasspathEntry.CPE_LIBRARY) {
+    			lib = entries[i];
+    			break;
+    		}
+    	}
+    	
+    	// Mark that cp entry for publish/export
+    	UpdateClasspathAttributeUtil.addDependencyAttribute(null, project.getName(), lib);
+    	
+    	final Set entryPaths = Collections.singleton(classFolderPath);
+    	ClasspathDependencyTestUtil.verifyNoPotentialClasspathEntries(javaProject);
+    	ClasspathDependencyTestUtil.verifyClasspathAttributes(javaProject, entryPaths);
+    	ClasspathDependencyTestUtil.verifyNoClasspathDependencies(comp);
+    	
+    	DependencyUtil.waitForValidationJobs(project);
+    	ClasspathDependencyTestUtil.verifyClasspathDependencyError(project);
+
+    	UpdateClasspathAttributeUtil.removeDependencyAttribute(null, project.getName(), lib);
+    	
+    	DependencyUtil.waitForValidationJobs(project);
+    	ClasspathDependencyTestUtil.verifyNoClasspathDependencyError(project);
+    }
+    
+    //NonWebNonExported=Invalid classpath component dependency {0}. Classpath component dependencies for non-web projects must be exported.
+    public void testNonWebNonExportedRule() throws Exception {
+    	final IProject project = ProjectUtil.createUtilityProject("TestUtil", "TestEAR", true);
+    	final IJavaProject javaProject = JavaCore.create(project);
+    	final IVirtualComponent comp = ComponentCore.createComponent(project);
+    	
+    	ClasspathDependencyTestUtil.addLibraryEntry(javaProject, ClasspathDependencyTestUtil.TEST3_JAR_PATH, false);
+    	
+    	DependencyUtil.waitForValidationJobs(project);
+    	ClasspathDependencyTestUtil.verifyNoValidationError(project);
+    	final Set entryPaths = Collections.singleton(ClasspathDependencyTestUtil.TEST3_JAR_PATH);
+    	List entries = ClasspathDependencyTestUtil.verifyPotentialClasspathEntries(javaProject, entryPaths);
+    	ClasspathDependencyTestUtil.verifyNoClasspathAttributes(javaProject);
+    	ClasspathDependencyTestUtil.verifyNoClasspathDependencies(comp);
+
+    	IClasspathEntry entry = (IClasspathEntry) entries.get(0);    	
+    	UpdateClasspathAttributeUtil.addDependencyAttribute(null, project.getName(), entry);
+
+    	ClasspathDependencyTestUtil.verifyNoPotentialClasspathEntries(javaProject);
+    	ClasspathDependencyTestUtil.verifyClasspathAttributes(javaProject, entryPaths);
+    	final Set archiveNames = Collections.singleton(ClasspathDependencyTestUtil.TEST3_JAR);
+    	ClasspathDependencyTestUtil.verifyClasspathDependencies(comp, archiveNames);
+    	
+    	DependencyUtil.waitForValidationJobs(project);
+    	ClasspathDependencyTestUtil.verifyClasspathDependencyMarker(project);
+    }
+    
+    //DuplicateArchiveName=Invalid classpath component dependency {0}. The project contains another classpath component dependency the same archive name.
+    public void testDuplicateArchiveNamesRule() throws Exception {
+    	final IProject webProject = ProjectUtil.createWebProject("TestWeb", "TestEAR");
+    	final IJavaProject webJavaProject = JavaCore.create(webProject);
+    	final IProject util1 = ProjectUtil.createUtilityProject("TestUtil1", "TestEAR");
+    	DependencyCreationUtil.createWebLibDependency(webProject, util1);
+    	final IJavaProject utilJava1 = JavaCore.create(util1);
+    	final IVirtualComponent utilComp1 = ComponentCore.createComponent(util1);
+    	final IProject util2 = ProjectUtil.createUtilityProject("TestUtil2", "TestEAR");
+    	DependencyCreationUtil.createWebLibDependency(webProject, util2);
+    	final IVirtualComponent utilComp2 = ComponentCore.createComponent(util2);
+    	final IJavaProject utilJava2 = JavaCore.create(util2);
+    	final IProject util3 = ProjectUtil.createUtilityProject("TestUtil3", "TestEAR", true);
+    	DependencyCreationUtil.createWebLibDependency(webProject, util3);
+    	final IVirtualComponent utilComp3 = ComponentCore.createComponent(util3);
+    	final IJavaProject utilJava3 = JavaCore.create(util3);
+    	ClasspathDependencyTestUtil.addLibraryEntry(utilJava1, ClasspathDependencyTestUtil.TEST3_JAR_PATH, true);
+    	ClasspathDependencyTestUtil.addLibraryEntry(utilJava2, ClasspathDependencyTestUtil.TEST3_JAR_PATH, true);
+    	ClasspathDependencyTestUtil.addLibraryEntry(utilJava3, ClasspathDependencyTestUtil.TEST3_JAR_OTHER_LOCATION_PATH, true);
+    	final Set entryPaths = Collections.singleton(ClasspathDependencyTestUtil.TEST3_JAR_PATH);
+    	final Set otherEntryPaths = Collections.singleton(ClasspathDependencyTestUtil.TEST3_JAR_OTHER_LOCATION_PATH);
+    	final Set archiveNames = Collections.singleton(ClasspathDependencyTestUtil.TEST3_JAR);
+
+    	
+    	// add the dependency attribute to util1 and util2 (these point to the same jar so won't 
+    	// generate a validation error)
+    	List entries = ClasspathDependencyTestUtil.verifyPotentialClasspathEntries(utilJava1, entryPaths);
+    	IClasspathEntry entry = (IClasspathEntry) entries.get(0);
+    	UpdateClasspathAttributeUtil.addDependencyAttribute(null, util1.getName(), entry);
+    	ClasspathDependencyTestUtil.verifyClasspathDependencies(utilComp1, archiveNames);
+    	entries = ClasspathDependencyTestUtil.verifyPotentialClasspathEntries(utilJava2, entryPaths);
+    	entry = (IClasspathEntry) entries.get(0);
+    	UpdateClasspathAttributeUtil.addDependencyAttribute(null, util2.getName(), entry);
+    	ClasspathDependencyTestUtil.verifyClasspathDependencies(utilComp2, archiveNames);
+
+    	// no validation error on the EAR or Web
+    	DependencyUtil.waitForValidationJobs(webProject);
+    	IProject earProject = ProjectUtil.getProject("TestEAR");
+    	ClasspathDependencyTestUtil.verifyNoValidationError(earProject);
+    	ClasspathDependencyTestUtil.verifyNoValidationError(webProject);    	
+    	
+    	// add the dependency attribute to util3
+    	entries = ClasspathDependencyTestUtil.verifyPotentialClasspathEntries(utilJava3, otherEntryPaths);
+    	entry = (IClasspathEntry) entries.get(0);
+    	UpdateClasspathAttributeUtil.addDependencyAttribute(null, util3.getName(), entry);
+    	ClasspathDependencyTestUtil.verifyClasspathDependencies(utilComp3, archiveNames);
+    	
+    	// will have a validation error on the EAR and on the Web
+    	DependencyUtil.waitForValidationJobs(webProject);
+    	DependencyUtil.waitForValidationJobs(earProject);
+    	ClasspathDependencyTestUtil.verifyValidationError(webProject);
+    	ClasspathDependencyTestUtil.verifyValidationError(earProject);
+    	
+    	// remove dependency attribute from util3
+    	UpdateClasspathAttributeUtil.removeDependencyAttribute(null, util3.getName(), entry);
+
+    	// will have no validation errors on the EAR and on the Web
+    	DependencyUtil.waitForValidationJobs(webProject);
+    	DependencyUtil.waitForValidationJobs(earProject);
+    	ClasspathDependencyTestUtil.verifyNoValidationError(webProject);
+    	ClasspathDependencyTestUtil.verifyNoValidationError(earProject);    	
+    }
+    
+    //RootMappingNonEARWARRef=Non-web projects must be referenced by an EAR or a WAR to use classpath component dependencies.
+    public void testRootMappingNonEARWARRefRule() throws Exception {
+    	final IProject project = ProjectUtil.createUtilityProject("TestUtil", null, true);
+    	final IJavaProject javaProject = JavaCore.create(project);
+    	final IVirtualComponent comp = ComponentCore.createComponent(project);
+    	
+    	ClasspathDependencyTestUtil.addLibraryEntry(javaProject, ClasspathDependencyTestUtil.TEST3_JAR_PATH, true);
+    	
+    	DependencyUtil.waitForValidationJobs(project);
+    	ClasspathDependencyTestUtil.verifyNoValidationError(project);
+    	final Set entryPaths = Collections.singleton(ClasspathDependencyTestUtil.TEST3_JAR_PATH);
+    	List entries = ClasspathDependencyTestUtil.verifyPotentialClasspathEntries(javaProject, entryPaths);
+    	ClasspathDependencyTestUtil.verifyNoClasspathAttributes(javaProject);
+    	ClasspathDependencyTestUtil.verifyNoClasspathDependencies(comp);
+    	IClasspathEntry entry = (IClasspathEntry) entries.get(0);
+    	UpdateClasspathAttributeUtil.addDependencyAttribute(null, project.getName(), entry);
+
+    	DependencyUtil.waitForValidationJobs(project);
+    	ClasspathDependencyTestUtil.verifyClasspathDependencyMarker(project);
+    	
+    	ClasspathDependencyTestUtil.verifyNoPotentialClasspathEntries(javaProject);
+    	ClasspathDependencyTestUtil.verifyClasspathAttributes(javaProject, entryPaths);
+    	final Set archiveNames = Collections.singleton(ClasspathDependencyTestUtil.TEST3_JAR);
+    	ClasspathDependencyTestUtil.verifyClasspathDependencies(comp, archiveNames);
+    	
+    	UpdateClasspathAttributeUtil.removeDependencyAttribute(null, project.getName(), entry);
+    	
+    	ClasspathDependencyTestUtil.verifyNoClasspathAttributes(javaProject);
+    }
+    
+    //EarLibrariesContainer=Invalid classpath component dependency {0}. The EAR Libraries classpath container cannot be exposed.
+    //WebAppLibrariesContainer=Invalid classpath component dependency {0}. The Web App Libraries classpath container cannot be exposed.
+    //RuntimeClasspathContainer=Invalid classpath component dependency {0}. Server Runtime classpath containers cannot be exposed.
+    //JREContainer=Invalid classpath component dependency {0}. JRE classpath containers cannot be exposed.
+    public void testInvalidContainerRules() throws Exception {
+    	final IProject project = ProjectUtil.createWebProject("TestWeb", "TestEAR", true);
+    	final IJavaProject javaProject = JavaCore.create(project);
+    	final IVirtualComponent comp = ComponentCore.createComponent(project);
+    	
+    	DependencyUtil.waitForValidationJobs(project);
+    	ClasspathDependencyTestUtil.verifyNoValidationError(project);
+    	ClasspathDependencyTestUtil.verifyNoPotentialClasspathEntries(javaProject);
+    	ClasspathDependencyTestUtil.verifyNoClasspathAttributes(javaProject);
+    	ClasspathDependencyTestUtil.verifyNoClasspathDependencies(comp);    	
+    	
+    	IClasspathEntry earLibContainer = null;
+    	IClasspathEntry webAppLibContainer = null;
+    	IClasspathEntry jreContainer = null;
+    	IClasspathEntry[] rawCP = javaProject.getRawClasspath();
+    	for (int i = 0; i < rawCP.length; i++) {
+    		if (rawCP[i].getEntryKind() == IClasspathEntry.CPE_CONTAINER) {
+    			final IPath path = rawCP[i].getPath();
+    			if (path.equals(J2EEComponentClasspathContainer.CONTAINER_PATH)) {
+    				earLibContainer = rawCP[i];
+    			} else if (path.segment(0).equals("org.eclipse.jst.j2ee.internal.web.container")) {
+    				webAppLibContainer = rawCP[i];
+    			} else if (path.segment(0).equals(JavaRuntime.JRE_CONTAINER)) {
+    				jreContainer = rawCP[i];
+    			}
+    		}
+    	}
+    	
+    	// XXX Encountering sporadic JUnit problems trying to wait for and verify results of validator
+    	// the ClasspathDependencyTestUtil.verifyNoPotentialClasspathEntries(javaProject) will need to be 
+    	// sufficient for now: the results of that call are computed by calling the validator
+    	
+    	// try adding the Ear Libraries container
+    	//testInvalidContainer(javaProject, earLibContainer);
+    	
+    	// try adding the Web App Libraries container
+    	//testInvalidContainer(javaProject, webAppLibContainer);
+    	
+    	// try adding the JRE container
+    	//testInvalidContainer(javaProject, jreContainer);
+    }
+    
+    private void testInvalidContainer(final IJavaProject javaProject, final IClasspathEntry entry) throws Exception {
+    	IProject project = javaProject.getProject();
+    	UpdateClasspathAttributeUtil.addDependencyAttribute(null, project.getName(), entry);
+    	ClasspathDependencyTestUtil.verifyClasspathAttributes(javaProject, Collections.singleton(entry.getPath()));
+    	DependencyUtil.waitForValidationJobs(project);
+    	ClasspathDependencyTestUtil.verifyClasspathDependencyError(project);
+    	UpdateClasspathAttributeUtil.removeDependencyAttribute(null, project.getName(), entry);
+    	DependencyUtil.waitForValidationJobs(project);
+    	ClasspathDependencyTestUtil.verifyNoClasspathDependencyError(project);    	    	
+    }
+
+    //NonTaggedExportedClasses=Classpath entry {0} will not be exported or published. Runtime ClassNotFoundExceptions may result.  
+    public void testNonTaggedExportedClassesRule() throws Exception {
+    	final IProject project = ProjectUtil.createUtilityProject("TestUtil", "TestEAR", true);
+    	final IJavaProject javaProject = JavaCore.create(project);
+    	final IVirtualComponent comp = ComponentCore.createComponent(project);
+    	
+    	ClasspathDependencyTestUtil.addLibraryEntry(javaProject, ClasspathDependencyTestUtil.TEST3_JAR_PATH, true);
+    	
+    	DependencyUtil.waitForValidationJobs(project);
+    	ClasspathDependencyTestUtil.verifyClasspathDependencyMarker(project);
+    	final Set entryPaths = Collections.singleton(ClasspathDependencyTestUtil.TEST3_JAR_PATH);
+    	List entries = ClasspathDependencyTestUtil.verifyPotentialClasspathEntries(javaProject, entryPaths);
+    	ClasspathDependencyTestUtil.verifyNoClasspathAttributes(javaProject);
+    	ClasspathDependencyTestUtil.verifyNoClasspathDependencies(comp);
+    	IClasspathEntry entry = (IClasspathEntry) entries.get(0);
+    	UpdateClasspathAttributeUtil.addDependencyAttribute(null, project.getName(), entry);
+
+    	ClasspathDependencyTestUtil.verifyNoPotentialClasspathEntries(javaProject);
+    	ClasspathDependencyTestUtil.verifyClasspathAttributes(javaProject, entryPaths);
+    	DependencyUtil.waitForValidationJobs(project);
+    	ClasspathDependencyTestUtil.verifyNoClasspathDependencyMarker(project);
+    }
+    
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/classpath/tests/ClasspathDependencyWebTests.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/classpath/tests/ClasspathDependencyWebTests.java
new file mode 100644
index 0000000..5688ec6
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/classpath/tests/ClasspathDependencyWebTests.java
@@ -0,0 +1,435 @@
+/*******************************************************************************
+ * Copyright (c) 2007 BEA Systems, Inc 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:
+ *    BEA Systems, Inc - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.classpath.tests;
+
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jst.j2ee.classpath.tests.util.ClasspathDependencyTestUtil;
+import org.eclipse.jst.j2ee.classpathdep.UpdateClasspathAttributeUtil;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.File;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.WARFile;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.impl.FileImpl;
+import org.eclipse.jst.j2ee.dependency.tests.util.DependencyCreationUtil;
+import org.eclipse.jst.j2ee.dependency.tests.util.ProjectUtil;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.j2ee.internal.deployables.J2EEFlexProjDeployable;
+import org.eclipse.jst.j2ee.web.componentcore.util.WebArtifactEdit;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.server.core.model.IModuleFolder;
+import org.eclipse.wst.server.core.model.IModuleResource;
+
+/**
+ * Tests export and publish behavior for classpath component dependencies and web projects.
+ */
+public class ClasspathDependencyWebTests extends AbstractTests {
+
+	private static final String UTIL_PROJECT = "TestUtil";
+	private static final String WEB_PROJECT = "TestWeb";
+	
+    private ClasspathDependencyWebTests(final String name) {
+        super(name);
+    }
+    
+    public static Test suite(){
+        final TestSuite suite = new TestSuite();
+        suite.setName("Classpath Dependency Web Tests" );
+        suite.addTest(new ClasspathDependencyWebTests("testWebExportJ2EE"));
+        //suite.addTest(new ClasspathDependencyWebTests("testWebExportJEE5"));
+        suite.addTest(new ClasspathDependencyWebTests("testWebPublishJ2EE"));
+        suite.addTest(new ClasspathDependencyWebTests("testWebPublishJEE5"));
+        suite.addTest(new ClasspathDependencyWebTests("testWebContainerPublishJEE5"));
+        return suite;
+    }
+    
+    public void testWebExportJ2EE() throws Exception {
+        testWebExport(false);
+    }
+    
+    public void testWebExportJEE5() throws Exception {
+    	testWebExport(true);
+    }
+    
+    private void testWebExport(boolean JEE5) throws Exception {
+
+    	// create the Web and utility projects
+    	IVirtualComponent webComp = createProjects(JEE5);
+    	
+    	// verify that the exported WAR WEB-INF/lib does not contain the cp container jars from the Utility
+    	final Set archiveNames = new HashSet();
+    	archiveNames.add(ClasspathDependencyTestUtil.TEST1_JAR);
+    	archiveNames.add(ClasspathDependencyTestUtil.TEST2_JAR);
+    	verifyExportedWebInfLibs(webComp, archiveNames, false);
+    	
+    	// add the cp dependency attribute to the cp container in the util
+    	addDependencyAttribute(false);
+    	
+    	// verify that the exported WAR WEB-INF/lib does contain the cp container jars from the Utility
+    	verifyExportedWebInfLibs(webComp, archiveNames, true);
+    }
+    
+    // TODO need to modify to work with both JEE5 model provider and J2EE ArtifactEdit logic 
+    private void verifyExportedWebInfLibs(final IVirtualComponent comp, final Set archiveNames, final boolean shouldHaveDependencies) throws Exception {
+		WebArtifactEdit webEdit = null;
+		WARFile warFile = null;
+		try {
+			webEdit = WebArtifactEdit.getWebArtifactEditForRead(comp);
+			if (webEdit != null) {
+				warFile = (WARFile) webEdit.asArchive(true);
+				List libArchives = warFile.getLibArchives();
+				Iterator it = archiveNames.iterator();
+				while (it.hasNext()) {
+					String name = (String) it.next();
+					boolean hasArchive = false;
+					for (int i = 0; i < libArchives.size(); i++) {
+						File archive = (File) libArchives.get(i);
+						if (archive.isArchive()) {
+							if (archive.getName().equals(name)) {
+								hasArchive= true;
+							}
+						}
+					}
+					if (shouldHaveDependencies) {
+						assertTrue("Exported WAR missing classpath dependency Jar " + name, hasArchive);  					
+					} else {
+						assertFalse("Exported WAR has unexpected classpath dependency Jar " + name, hasArchive);
+					}
+				}
+				List webInfClasses = warFile.getClasses();
+				it = webInfClasses.iterator();
+				boolean hasNestedTest = false;
+				while (it.hasNext()) {
+					Object o = it.next();
+					if (o instanceof FileImpl && ((FileImpl)o).getURI().toString().equals("WEB-INF/classes/nested/test")) {
+						hasNestedTest = true;
+					}
+				}
+				if (shouldHaveDependencies) {
+					assertTrue("Exported WAR missing nested class folder file", hasNestedTest);  					
+				} else {
+					assertFalse("Exported WAR has unexpected nested class folder file", hasNestedTest);
+				}
+			}
+		} finally {
+			if (webEdit !=null)
+				webEdit.dispose();
+			if(warFile != null){
+				warFile.close();
+			}
+		}    	
+    }
+    
+    public void testWebPublishJ2EE() throws Exception {
+        testWebPublish(false);
+    }
+    
+    public void testWebPublishJEE5() throws Exception {
+        testWebPublish(true);
+    }
+    
+    public void testWebContainerPublishJEE5() throws Exception {
+        testWebContainerPublish(true);
+    }
+    
+    private void testWebPublish(boolean JEE5) throws Exception {
+
+    	// create the web and utility projects
+    	IVirtualComponent webComp = createProjects(JEE5);
+    	
+    	// verify that the exported WAR WEB-INF/lib does not contain the cp container jars from the Utility
+    	final Set archiveNames = new HashSet();
+    	archiveNames.add(ClasspathDependencyTestUtil.TEST1_JAR);
+    	archiveNames.add(ClasspathDependencyTestUtil.TEST2_JAR);
+    	verifyPublishedWebInfLibs(webComp, archiveNames, false);
+    	
+    	// add the cp dependency attribute to the cp container in the util
+    	addDependencyAttribute(true);
+    	
+    	// verify that the exported WAR WEB-INF/lib does contain the cp container jars from the Utility
+    	verifyPublishedWebInfLibs(webComp, archiveNames, true);
+    }
+    
+    private void testWebContainerPublish(boolean JEE5) throws Exception {
+    	IVirtualComponent webComp = createWebProject(JEE5);
+    	
+    	final Set archiveNames = new HashSet();
+    	archiveNames.add(ClasspathDependencyTestUtil.TEST1_JAR);
+    	archiveNames.add(ClasspathDependencyTestUtil.TEST2_JAR);
+    	
+    	verifyPublishedWebInfContainer(webComp, archiveNames, false);
+    	
+    	addWebInfContainerDependencyAttribute(false);
+
+    	verifyPublishedWebInfContainer(webComp, archiveNames, true);
+    }
+    
+    private void verifyPublishedWebInfLibs(final IVirtualComponent comp, final Set archiveNames, final boolean shouldHaveDependencies) throws Exception {
+    	J2EEFlexProjDeployable deployable = new J2EEFlexProjDeployable(comp.getProject(), comp);
+    	
+		try {
+			IModuleResource[] members = deployable.members();
+			assertTrue(members.length==2);
+			
+			for (int i=0; i<members.length; i++) {
+				String name = members[i].getName();
+				if (name.equals("WEB-INF")) {
+					IModuleResource[] webInf = ((IModuleFolder)members[i]).members();
+					for (int j=0; j<webInf.length; j++) {
+						IModuleResource webResource = webInf[j];
+						assertTrue(webResource.getModuleRelativePath().toString().equals("WEB-INF"));
+						if (webResource.getName().equals("lib")) {
+							IModuleResource[] webresMembers = ((IModuleFolder)webResource).members();
+							Iterator it = archiveNames.iterator();
+							while (it.hasNext()) {
+								String archiveName = (String) it.next();
+								boolean hasArchive = false;
+								for (int k = 0; k < webresMembers.length; k++) {
+									String localName = webresMembers[k].getName();
+									if (localName.equals(archiveName)) {
+										hasArchive= true;
+									}
+								}
+								if (shouldHaveDependencies) {
+									assertTrue("Published WAR missing classpath dependency Jar " + archiveName, hasArchive);  					
+								} else {
+									assertFalse("Published WAR has unexpected classpath dependency Jar " + archiveName, hasArchive);
+								}
+							}
+						} else if (webResource.getName().equals("classes")) {
+							IModuleResource[] webresMembers = ((IModuleFolder)webResource).members();
+							for (j = 0; j < webresMembers.length; j++) {
+								if (webresMembers[j].getName().equals("nested")) {
+									IModuleResource[] nestedMembers = ((IModuleFolder)webresMembers[j]).members();
+									assertTrue("Published WAR should have have nested folder without class folder dependency", shouldHaveDependencies);
+									boolean hasNestedTest = false;
+									if (nestedMembers.length == 1 && nestedMembers[0].getName().equals("test")) {
+										hasNestedTest = true;
+									}
+									if (shouldHaveDependencies) {
+										assertTrue("Published WAR missing nested class folder file", hasNestedTest);  					
+									} else {
+										assertFalse("Published WAR has unexpected nested class folder file", hasNestedTest);
+									}
+								}
+							}
+						}
+					}
+				} 
+			}
+
+		} catch (CoreException e) {
+			e.printStackTrace();
+			fail(e.getMessage());
+		}    	
+    }
+    
+    private void verifyPublishedWebInfContainer(final IVirtualComponent comp, final Set archiveNames, final boolean shouldHaveDependencies) throws Exception {
+    	J2EEFlexProjDeployable deployable = new J2EEFlexProjDeployable(comp.getProject(), comp);
+    	
+		try {
+			IModuleResource[] members = deployable.members();
+			assertTrue(members.length==2);
+			
+			for (int i=0; i<members.length; i++) {
+				String name = members[i].getName();
+				if (name.equals("WEB-INF")) {
+					IModuleResource[] webInf = ((IModuleFolder)members[i]).members();
+					for (int j=0; j<webInf.length; j++) {
+						IModuleResource webResource = webInf[j];
+						assertTrue(webResource.getModuleRelativePath().toString().equals("WEB-INF"));
+						if (webResource.getName().equals("lib")) {
+							IModuleResource[] webresMembers = ((IModuleFolder)webResource).members();
+							Iterator it = archiveNames.iterator();
+							while (it.hasNext()) {
+								String archiveName = (String) it.next();
+								boolean hasArchive = false;
+								for (int k = 0; k < webresMembers.length; k++) {
+									String localName = webresMembers[k].getName();
+									if (localName.equals(archiveName)) {
+										hasArchive= true;
+									}
+								}
+								if (shouldHaveDependencies) {
+									assertTrue("Published WAR missing classpath dependency Jar " + archiveName, hasArchive);  					
+								} else {
+									assertFalse("Published WAR has unexpected classpath dependency Jar " + archiveName, hasArchive);
+								}
+							}
+						} 
+					}
+				} 
+			}
+
+		} catch (CoreException e) {
+			e.printStackTrace();
+			fail(e.getMessage());
+		}    	
+    }
+    
+    private IVirtualComponent createProjects(boolean JEE5) throws Exception {
+    	// create a Utility project
+    	final IProject util = ProjectUtil.createUtilityProject(UTIL_PROJECT, null, true);
+    	final IJavaProject utilJava = JavaCore.create(util);
+    	final IVirtualComponent utilComp = ComponentCore.createComponent(util);
+
+    	// create a Web project
+    	// create a Web project
+    	int version = J2EEVersionConstants.SERVLET_2_5;
+    	if (!JEE5) {
+    		version = J2EEVersionConstants.SERVLET_2_4;
+    	}
+    	final IProject webProject = ProjectUtil.createWebProject(WEB_PROJECT, null, version, true);
+    	final IJavaProject webJavaProject = JavaCore.create(webProject);
+    	final IVirtualComponent webComp = ComponentCore.createComponent(webProject);
+    	// create a new "bin" folder
+    	final IPath binPath = new Path("bin");
+    	final IFolder webBin = webProject.getFolder(binPath);
+    	webBin.create(true, true, null);
+    	// create a nested folder
+    	final IFolder nested = webBin.getFolder("nested");
+    	nested.create(true, true, null);
+    	// add a file
+    	nested.getFile("test").create(new java.io.StringBufferInputStream("blah"), true, null);
+    	// add as a library cp entry
+    	ClasspathDependencyTestUtil.addLibraryEntry(webJavaProject, webBin.getFullPath(), true);
+    	
+    	// add a dependency from the Web to the Utility
+    	DependencyCreationUtil.createWebLibDependency(webProject, util); 
+    	
+    	// add a cp dependency to the Utility
+    	ClasspathDependencyTestUtil.addCustomClasspathContainer(utilJava);
+    	
+    	return webComp;
+    }
+    
+    private IVirtualComponent createWebProject(boolean JEE5) throws Exception {
+    	// create a Web project
+    	int version = J2EEVersionConstants.SERVLET_2_5;
+    	if (!JEE5) {
+    		version = J2EEVersionConstants.SERVLET_2_4;
+    	}
+    	final IProject webProject = ProjectUtil.createWebProject(WEB_PROJECT, null, version, true);
+    	final IJavaProject webJavaProject = JavaCore.create(webProject);
+    	final IVirtualComponent webComp = ComponentCore.createComponent(webProject);
+ 	
+    	// add a cp dependency to the Utility
+    	ClasspathDependencyTestUtil.addCustomClasspathContainer(webJavaProject);
+    	
+    	return webComp;
+    }
+    
+    /**
+     * 
+     * @param verifyClasspathDependencies - true if you want to immediately verify that
+     * the classpath dependencies were added.  Set to false if you want to verify this at
+     * a later time (such as thru a members call in export or publish)  
+     * @throws Exception
+     */
+    private void addDependencyAttribute(boolean verifyClasspathDependencies) throws Exception {
+    	final IProject util = ProjectUtil.getProject(UTIL_PROJECT);
+    	final IJavaProject utilJava = JavaCore.create(util);
+    	final IVirtualComponent utilComp = ComponentCore.createComponent(util);
+    	final IProject web = ProjectUtil.getProject(WEB_PROJECT);
+    	final IJavaProject webJava = JavaCore.create(web);
+    	final IPath fullWebBinPath = web.getFullPath().append("bin");
+    	final IVirtualComponent webComp = ComponentCore.createComponent(web);
+    	
+    	final Set entryPaths = new HashSet();
+    	entryPaths.add(ClasspathDependencyTestUtil.CUSTOM_CLASSPATH_CONTAINER);
+    	List entries = ClasspathDependencyTestUtil.verifyPotentialClasspathEntries(utilJava, entryPaths);
+    	ClasspathDependencyTestUtil.verifyNoClasspathAttributes(utilJava);
+    	ClasspathDependencyTestUtil.verifyNoClasspathDependencies(utilComp);
+    	IClasspathEntry entry = (IClasspathEntry) entries.get(0);
+    	UpdateClasspathAttributeUtil.addDependencyAttribute(null, util.getName(), entry);
+    	
+    	ClasspathDependencyTestUtil.verifyNoPotentialClasspathEntries(utilJava);
+    	ClasspathDependencyTestUtil.verifyClasspathAttributes(utilJava, entryPaths);
+    	final Set archiveNames = new HashSet();
+    	archiveNames.add(ClasspathDependencyTestUtil.TEST1_JAR);
+    	archiveNames.add(ClasspathDependencyTestUtil.TEST2_JAR);
+    	ClasspathDependencyTestUtil.verifyClasspathDependencies(utilComp, archiveNames);
+    	
+    	entryPaths.clear();
+    	entryPaths.add(fullWebBinPath);
+    	// verify that "bin" in the web project is a potential entry
+    	entries = ClasspathDependencyTestUtil.verifyPotentialClasspathEntries(webJava, entryPaths);
+    	// verify that no entries have the classpath attribute
+    	ClasspathDependencyTestUtil.verifyNoClasspathAttributes(webJava);
+    	// verify that there are no classpath dependencies
+    	ClasspathDependencyTestUtil.verifyNoClasspathDependencies(webComp);
+    	
+    	// add the dependency attribute to "bin"
+    	entry = (IClasspathEntry) entries.get(0);
+    	UpdateClasspathAttributeUtil.addDependencyAttribute(null, web.getName(), entry);
+    	// should no longer have potential entries
+    	ClasspathDependencyTestUtil.verifyNoPotentialClasspathEntries(webJava);
+    	// verify that "bin" has the attribute
+    	ClasspathDependencyTestUtil.verifyClasspathAttributes(webJava, entryPaths);
+    	// verify that "bin" is a dependency
+    	archiveNames.clear();
+    	archiveNames.add(fullWebBinPath.toString());
+    	ClasspathDependencyTestUtil.verifyClasspathDependencies(webComp, archiveNames);
+    }
+    
+    /**
+     * 
+     * @param verifyClasspathDependencies - true if you want to immediately verify that
+     * the classpath dependencies were added.  Set to false if you want to verify this at
+     * a later time (such as thru a members call in export or publish)  
+     * @throws Exception
+     */
+    private void addWebInfContainerDependencyAttribute(boolean verifyClasspathDependencies) throws Exception {
+
+    	final IProject web = ProjectUtil.getProject(WEB_PROJECT);
+    	final IJavaProject webJava = JavaCore.create(web);
+    	final IVirtualComponent webComp = ComponentCore.createComponent(web);
+    	
+    	final Set entryPaths = new HashSet();
+    	entryPaths.add(ClasspathDependencyTestUtil.CUSTOM_CLASSPATH_CONTAINER);
+    	// verify that "bin" and the custom cp container are potential entries
+    	List entries = ClasspathDependencyTestUtil.verifyPotentialClasspathEntries(webJava, entryPaths);
+    	// verify that no entries have the classpath attribute
+    	ClasspathDependencyTestUtil.verifyNoClasspathAttributes(webJava);
+    	// verify that there are no classpath dependencies
+    	ClasspathDependencyTestUtil.verifyNoClasspathDependencies(webComp);
+    	IClasspathEntry entry = (IClasspathEntry) entries.get(0);
+
+    	// add the dependency attribute to "bin" and the cp container    	
+    	for (Object o: entries) {
+    		UpdateClasspathAttributeUtil.addDependencyAttribute(null, web.getName(), (IClasspathEntry) o);
+    	}
+    	// should no longer have potential entries
+    	ClasspathDependencyTestUtil.verifyNoPotentialClasspathEntries(webJava);
+    	// verify that "bin" and the cp container have the attribute
+    	ClasspathDependencyTestUtil.verifyClasspathAttributes(webJava, entryPaths);
+    	// verify that "bin" and the cp container are dependencies
+    	final Set archiveNames = new HashSet();
+    	archiveNames.add(ClasspathDependencyTestUtil.TEST1_JAR);
+    	archiveNames.add(ClasspathDependencyTestUtil.TEST2_JAR);
+    	if (verifyClasspathDependencies)
+    		ClasspathDependencyTestUtil.verifyClasspathDependencies(webComp, archiveNames);
+    }
+    
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/classpath/tests/util/ClasspathDependencyTestUtil.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/classpath/tests/util/ClasspathDependencyTestUtil.java
new file mode 100644
index 0000000..a588fff
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/classpath/tests/util/ClasspathDependencyTestUtil.java
@@ -0,0 +1,219 @@
+/*******************************************************************************
+ * Copyright (c) 2007 BEA Systems, Inc 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:
+ *    BEA Systems, Inc - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.classpath.tests.util;
+
+import java.net.URL;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import junit.framework.Assert;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jdt.core.IClasspathContainer;
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jst.j2ee.classpathdep.ClasspathDependencyUtil;
+import org.eclipse.jst.j2ee.classpathdep.IClasspathDependencyConstants.DependencyAttributeType;
+import org.eclipse.jst.j2ee.componentcore.J2EEModuleVirtualComponent;
+import org.eclipse.jst.j2ee.dependency.tests.util.DependencyUtil;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
+import org.eclipse.wtp.j2ee.headless.tests.plugin.HeadlessTestsPlugin;
+
+/**
+ * Various utility methods.
+ */
+public class ClasspathDependencyTestUtil extends DependencyUtil {
+
+	public static final IPath CUSTOM_CLASSPATH_CONTAINER = new Path("TEST_CP_CONTAINER"); 
+		
+	public static final String TEST_DATA = "TestData" + IPath.SEPARATOR + "ClasspathDependencyTests";
+	public static final String TEST1_JAR = "Test1.jar";
+	public static final String TEST2_JAR = "Test2.jar";
+	public static final String TEST3_JAR = "Test3.jar";
+	public static final String TEST3_JAR_OTHER_LOCATION = "other/Test3.jar";
+	public static final String TEST3_BIN= "Test3_bin";
+
+	public static final IPath TEST1_JAR_PATH = getFullTestDataPath(TEST1_JAR);
+	public static final IPath TEST2_JAR_PATH = getFullTestDataPath(TEST2_JAR);
+	public static final IPath TEST3_JAR_PATH = getFullTestDataPath(TEST3_JAR);
+	public static final IPath TEST3_JAR_OTHER_LOCATION_PATH = getFullTestDataPath(TEST3_JAR_OTHER_LOCATION);
+	public static final IPath TEST3_BIN_PATH = new Path(TEST3_BIN);
+
+	public static final String CLASSPATH_DEPENDENCY_MARKER_TYPE = "org.eclipse.jst.j2ee.ClasspathDependencyValidatorMarker";
+	public static final String VALIDATION_MARKER_TYPE = "org.eclipse.wst.validation.problemmarker";
+	
+	public static IPath getFullTestDataPath(String dataPath) {
+		try {
+			final String testDataPath = TEST_DATA + IPath.SEPARATOR + dataPath;
+			HeadlessTestsPlugin plugin = HeadlessTestsPlugin.getDefault();
+			if (plugin != null) {
+				URL url = plugin.getBundle().getEntry(testDataPath);
+		        if (url != null) {
+		            url = Platform.asLocalURL(url);
+		            return new Path(url.getPath());
+		        }
+			}
+			return new Path(System.getProperty("user.dir") + IPath.SEPARATOR + testDataPath);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return new Path("");
+	}
+	
+	
+	/**
+	 * Adds a library entry that references a jar file and is optionally exported.
+	 */
+	public static IClasspathEntry addLibraryEntry(final IJavaProject javaProject, final IPath path, final boolean isExported) throws CoreException {
+		final IClasspathEntry entry = JavaCore.newLibraryEntry(path, null, null, isExported);
+		addEntryToCP(javaProject, entry);
+		return entry;
+	}
+	
+	public static void addEntryToCP(final IJavaProject javaProject, final IClasspathEntry entry) throws CoreException {
+		final IClasspathEntry[] rawCP = javaProject.getRawClasspath();
+		final IClasspathEntry[] newCP = new IClasspathEntry[rawCP.length + 1];
+		System.arraycopy(rawCP, 0, newCP, 0, rawCP.length);
+		newCP[rawCP.length] = entry;
+		javaProject.setRawClasspath(newCP, true, null);
+	}
+	/**
+	 * Adds a custom classpath container with the specified name that references two jar files.
+	 */
+	public static IClasspathEntry addCustomClasspathContainer(final IJavaProject javaProject) throws CoreException {
+		final IClasspathEntry entry = JavaCore.newContainerEntry(CUSTOM_CLASSPATH_CONTAINER, true);
+		addEntryToCP(javaProject, entry);
+		JavaCore.setClasspathContainer(
+				CUSTOM_CLASSPATH_CONTAINER,
+				new IJavaProject[]{ javaProject }, 
+				new IClasspathContainer[] {
+						new IClasspathContainer() {
+							public IClasspathEntry[] getClasspathEntries() {
+								return new IClasspathEntry[]{ 
+										JavaCore.newLibraryEntry(TEST1_JAR_PATH, null, null, false),
+										JavaCore.newLibraryEntry(TEST2_JAR_PATH, null, null, false),
+								}; 
+							}
+							public String getDescription() { return "Test classpath container"; }
+							public int getKind() { return IClasspathContainer.K_APPLICATION;}
+							public IPath getPath() { return CUSTOM_CLASSPATH_CONTAINER; }
+						}			
+				}, 
+				null);
+		return entry;
+	}
+	
+	public static void verifyNoClasspathAttributes(final IJavaProject javaProject) throws Exception {
+		verifyClasspathAttributes(javaProject, new HashSet());
+	}
+	
+	public static Map verifyClasspathAttributes(final IJavaProject javaProject, final Set rawEntryPaths) throws Exception {
+		final Map entriesToAttrib = ClasspathDependencyUtil.getRawComponentClasspathDependencies(javaProject, DependencyAttributeType.CLASSPATH_COMPONENT_DEPENDENCY);
+		Assert.assertTrue("Project " + javaProject + " should have " + rawEntryPaths.size() + " raw classpath dependencies, only has: " + 
+				entriesToAttrib.size(), entriesToAttrib.size()== rawEntryPaths.size());
+		final Iterator i = entriesToAttrib.keySet().iterator();
+		while (i.hasNext()) {
+			final IClasspathEntry entry = (IClasspathEntry) i.next();
+			Assert.assertTrue("Project " + javaProject + " missing expected classpath dependency " + entry.getPath(), rawEntryPaths.contains(entry.getPath()));
+		}
+		return entriesToAttrib;
+	}
+	
+	public static void verifyNoClasspathDependencies(final IVirtualComponent component) throws Exception {
+		verifyClasspathDependencies(component, new HashSet());
+	}
+	
+	public static IVirtualReference[] verifyClasspathDependencies(final IVirtualComponent component, final Set archiveNames) throws Exception {
+		Assert.assertTrue("Component " + component.getName() + " not a J2EEModuleVirtualComponent", component instanceof J2EEModuleVirtualComponent);
+		J2EEModuleVirtualComponent j2eeComp = (J2EEModuleVirtualComponent) component;
+		IVirtualReference[] refs = j2eeComp.getJavaClasspathReferences();
+		Assert.assertTrue("Component " + component.getName()+ " should have " + archiveNames.size() + " component classpath dependencies, only has: " + 
+				refs.length, refs.length == archiveNames.size());
+		for (int i = 0; i < refs.length; i++) {
+			Assert.assertTrue("Component " + component.getName()+ " has unexpected component classpath dependency " + refs[i].getArchiveName(), archiveNames.contains(refs[i].getArchiveName()));
+		}
+		return refs;
+	}
+	
+	public static void verifyNoPotentialClasspathEntries(final IJavaProject javaProject) throws Exception {
+		verifyPotentialClasspathEntries(javaProject, new HashSet());
+	}
+	
+	public static List verifyPotentialClasspathEntries(final IJavaProject javaProject, final Set potentialEntryPaths) throws Exception {
+		List entries = ClasspathDependencyUtil.getPotentialComponentClasspathDependencies(javaProject);
+		Assert.assertTrue("Project " + javaProject + " should have " + potentialEntryPaths.size() + " potential classpath dependencies, only has: " + 
+				entries.size(), entries.size() == potentialEntryPaths.size());
+		for (int i = 0; i < entries.size(); i++) {
+			IClasspathEntry entry = (IClasspathEntry) entries.get(i);
+			Assert.assertTrue("Project " + javaProject + " missing expected potential classpath entry " + entry.getPath(), potentialEntryPaths.contains(entry.getPath()));
+		}
+		return entries;
+	}
+	
+	public static void verifyValidationError(final IProject project) throws CoreException {
+		verifyError(project, VALIDATION_MARKER_TYPE, true);
+	}
+	
+	public static void verifyNoValidationError(final IProject project) throws CoreException {
+		verifyError(project, VALIDATION_MARKER_TYPE, false);
+	}
+	
+	public static void verifyClasspathDependencyError(final IProject project) throws CoreException {
+		verifyError(project, CLASSPATH_DEPENDENCY_MARKER_TYPE, true);
+	}
+	
+	public static void verifyNoClasspathDependencyError(final IProject project) throws CoreException {
+		verifyError(project, CLASSPATH_DEPENDENCY_MARKER_TYPE, false);
+	}
+	
+	private static void verifyError(final IProject project, final String markerType, final boolean shouldHaveErrorMarker) throws CoreException {
+		final IMarker[] markers = project.findMarkers(markerType, true, IProject.DEPTH_ZERO);
+		boolean hasError = false;
+		for (int i = 0; i < markers.length; i++) {
+			if (markers[i].getAttribute(IMarker.SEVERITY, IMarker.SEVERITY_INFO) == IMarker.SEVERITY_ERROR) {
+				hasError = true;
+				break;
+			}
+		}
+		if (shouldHaveErrorMarker) {
+			Assert.assertTrue("Project " + project + " missing expected validation error problem marker", hasError);
+		} else {
+			Assert.assertFalse("Project " + project + " has unexpected validation error problem marker", hasError);
+		}
+	}
+	
+	public static void verifyClasspathDependencyMarker(final IProject project) throws CoreException {
+		verifyMarker(project, CLASSPATH_DEPENDENCY_MARKER_TYPE, true);
+	}
+	
+	public static void verifyNoClasspathDependencyMarker(final IProject project) throws CoreException {
+		verifyMarker(project, CLASSPATH_DEPENDENCY_MARKER_TYPE, false);
+	}
+
+	private static void verifyMarker(final IProject project, final String markerType, final boolean shouldHaveMarker) throws CoreException {
+		final IMarker[] markers = project.findMarkers(markerType, true, IProject.DEPTH_ZERO);
+		if (shouldHaveMarker) {
+			Assert.assertTrue("Project " + project + " missing expected " + markerType + " problem marker", markers.length > 0);
+		} else {
+			Assert.assertFalse("Project " + project + " has unexpected " + markerType + " problem marker", markers.length > 0);
+		}
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/dependency/tests/AbstractTests.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/dependency/tests/AbstractTests.java
new file mode 100644
index 0000000..7b62b82
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/dependency/tests/AbstractTests.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2007 BEA Systems, Inc 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:
+ *    BEA Systems, Inc - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.dependency.tests;
+
+import org.eclipse.wst.common.tests.OperationTestCase;
+
+/**
+ * Abstract base class for unit tests
+ * 
+ * @author rfrost@bea.com
+ */
+public abstract class AbstractTests extends OperationTestCase {
+    
+    protected AbstractTests(final String name) {
+        super(name);
+    }
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/dependency/tests/AllTests.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/dependency/tests/AllTests.java
new file mode 100644
index 0000000..466f32b
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/dependency/tests/AllTests.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2007 BEA Systems, Inc 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:
+ *    BEA Systems, Inc - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.dependency.tests;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+public class AllTests extends TestCase {
+    public static Test suite() {
+        final TestSuite suite = new TestSuite();
+        
+        suite.setName("All J2EE Dependency/Refactoring Tests");
+        
+        suite.addTest(ProjectCreationTests.suite());
+        suite.addTest(ProjectDependencyTests.suite());
+        suite.addTest(ProjectEARRefactoringTests.suite());
+        //[Bug 234409] Temporarily removing these tests until underlying issue is fixed
+//        suite.addTest(ProjectModuleRefactoringTests.suite());
+//        suite.addTest(ProjectWebLibRefactoringTests.suite());
+        suite.addTest(ProjectClasspathRefactoringTests.suite());
+        suite.addTest(ProjectServerRefactoringTests.suite());
+        suite.addTest(EarLibDirContainerTests.suite());
+        
+        return suite;
+    }
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/dependency/tests/EarLibDirContainerTests.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/dependency/tests/EarLibDirContainerTests.java
new file mode 100644
index 0000000..3cc9efa
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/dependency/tests/EarLibDirContainerTests.java
@@ -0,0 +1,114 @@
+package org.eclipse.jst.j2ee.dependency.tests;
+
+import java.util.ArrayList;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jst.j2ee.dependency.tests.util.DependencyCreationUtil;
+import org.eclipse.jst.j2ee.dependency.tests.util.ProjectUtil;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.j2ee.internal.common.classpath.J2EEComponentClasspathUpdater;
+
+public class EarLibDirContainerTests extends AbstractTests {
+	
+	private static final String EAR_PROJECT_NAME = "TestEAR";
+	private static final String LIB_PROJECT_NAME = "TestLib";
+	private static final String UTIL_PROJECT_NAME = "TestUtil";
+	
+	public EarLibDirContainerTests(String name) {
+		super(name);
+	}
+	
+	public static Test suite() {
+		final TestSuite suite = new TestSuite();
+        suite.setName("EAR Container Library Directory Tests");
+        suite.addTest(new EarLibDirContainerTests("testEarLibDirDependency"));
+        return suite;
+	}
+	
+	public void testEarLibDirDependency() throws Exception {
+		ResourcesPlugin.getWorkspace().getRoot().getProjects();
+		IProject earProject = ProjectUtil.createEARProject(EAR_PROJECT_NAME, J2EEVersionConstants.JEE_5_0_ID, false);
+		IProject utilProject = ProjectUtil.createUtilityProject(UTIL_PROJECT_NAME, null);
+		DependencyCreationUtil.createEARDependency(earProject, utilProject, false);
+		IProject libProject = ProjectUtil.createUtilityProject(LIB_PROJECT_NAME, null);
+		DependencyCreationUtil.createEARDependency(earProject, libProject, true);
+		updateEARLibrariesContainer(utilProject);
+        waitForCondition(cpContains(utilProject, new Path(IPath.SEPARATOR + LIB_PROJECT_NAME)));
+	}
+	
+	private static void updateEARLibrariesContainer(IProject project) {
+		ArrayList projectList = new ArrayList();
+		projectList.add(project);
+		J2EEComponentClasspathUpdater.getInstance().forceUpdate(projectList);
+	}
+	
+	private static ICondition cpContains(final IProject project, final IPath entry) {
+		return new ClasspathContainsCondition( project, entry );
+	}
+    
+    private static void waitForCondition( final ICondition condition ) throws Exception {
+        waitForCondition( condition, 10 );
+    }
+    
+    private static void waitForCondition( final ICondition condition, final int seconds ) throws Exception {
+        for( int i = 0; i < seconds && ! condition.check(); i++ ) {
+            try {
+                Thread.sleep( 1000 );
+            }
+            catch( InterruptedException e ) {}
+        }
+        
+        assertCondition( condition );
+    }
+    
+    private static void assertCondition( final ICondition condition ) throws Exception {
+        assertTrue( condition.check() );
+    }
+    
+    private static interface ICondition {
+        boolean check() throws Exception;
+    }
+    
+    private static abstract class AbstractClasspathCondition implements ICondition {
+        private final IProject project;
+        private final IPath entry;
+        
+        public AbstractClasspathCondition( final IProject project, final IPath entry ) {
+            this.project = project;
+            this.entry = entry;
+        }
+        
+        protected boolean internalCheck() throws Exception {
+            final IJavaProject jproj = JavaCore.create( this.project );
+            final IClasspathEntry[] cp = jproj.getResolvedClasspath( true );
+            
+            for( int i = 0; i < cp.length; i++ ) {
+                if( cp[ i ].getPath().equals( this.entry ) ) {
+                    return true;
+                }
+            }
+            
+            return false;
+        }
+    }
+    
+    private static final class ClasspathContainsCondition extends AbstractClasspathCondition {
+	    public ClasspathContainsCondition( final IProject project, final IPath entry ) {
+	        super( project, entry );
+	    }
+	    
+	    public boolean check() throws Exception {
+	        return internalCheck();
+	    }
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/dependency/tests/ProjectClasspathRefactoringTests.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/dependency/tests/ProjectClasspathRefactoringTests.java
new file mode 100644
index 0000000..62f17e9
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/dependency/tests/ProjectClasspathRefactoringTests.java
@@ -0,0 +1,140 @@
+/*******************************************************************************
+ * Copyright (c) 2007 BEA Systems, Inc 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:
+ *    BEA Systems, Inc - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.dependency.tests;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jst.j2ee.dependency.tests.util.DependencyUtil;
+import org.eclipse.jst.j2ee.dependency.tests.util.ProjectUtil;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPreferences;
+
+/**
+ * Tests refactoring logic that updates component mappings when source IClasspathEntries are 
+ * added to/removed from the Java build path.
+ */
+public class ProjectClasspathRefactoringTests extends AbstractTests {
+	
+	public ProjectClasspathRefactoringTests(String name) {
+		super(name);
+	}
+	
+	public static Test suite(){
+        final TestSuite suite = new TestSuite();
+        suite.setName("Project Classpath Refactoring Tests" );
+        suite.addTest(new ProjectClasspathRefactoringTests("testSourcePathAdditionWeb"));
+        suite.addTest(new ProjectClasspathRefactoringTests("testSourcePathRemovalWeb"));
+        //suite.addTest(new ProjectClasspathRefactoringTests("testSourcePathRenameWeb"));
+        suite.addTest(new ProjectClasspathRefactoringTests("testSourcePathAdditionUtil"));
+        suite.addTest(new ProjectClasspathRefactoringTests("testSourcePathRemovalUtil"));
+        //suite.addTest(new ProjectClasspathRefactoringTests("testSourcePathRenameUtil"));
+        suite.addTest(new ProjectClasspathRefactoringTests("testWebContentRename"));
+        suite.addTest(new ProjectClasspathRefactoringTests("testEarContentRename"));
+        return suite;
+    }
+
+	public void testSourcePathAdditionWeb() throws Exception {
+		testSourcePathAddition(ProjectUtil.createWebProject("TestWeb", null));
+	}
+	
+	public void testSourcePathAdditionUtil() throws Exception {
+		testSourcePathAddition(ProjectUtil.createUtilityProject("TestUtil", null));
+	}
+	
+	private static void testSourcePathAddition(final IProject project) throws Exception {
+		final IPath srcPath = new Path("src");
+		final IPath newSrcPath = new Path("newSrc");
+		
+		DependencyUtil.verifyComponentMapping(project, srcPath, true);
+		DependencyUtil.verifyComponentMapping(project, newSrcPath, false);
+		
+		assertTrue("Failed to add new source path " + newSrcPath, DependencyUtil.addJavaSrcPath(project, newSrcPath));
+		
+		DependencyUtil.verifyComponentMapping(project, srcPath, true);
+		DependencyUtil.verifyComponentMapping(project, newSrcPath, true);
+	}
+	
+	public void testSourcePathRemovalWeb() throws Exception {
+		testSourcePathRemoval(ProjectUtil.createWebProject("TestWeb", null));
+	}
+	
+	public void testSourcePathRemovalUtil() throws Exception {
+		testSourcePathRemoval(ProjectUtil.createUtilityProject("TestUtil", null));
+	}
+	
+	private static void testSourcePathRemoval(final IProject project) throws Exception {
+		final IPath srcPath = new Path("src");
+		DependencyUtil.verifyComponentMapping(project, srcPath, true);
+		assertTrue("Failed to remove src path " + srcPath, DependencyUtil.removeJavaSrcPath(project, srcPath));
+		DependencyUtil.verifyComponentMapping(project, srcPath, false);
+	}
+	
+	public void testWebContentRename() throws Exception {
+		final IProject webProject = ProjectUtil.createWebProject("TestWeb", null);
+		final IPath webContent = new Path(J2EEPlugin.getDefault().getJ2EEPreferences().getString(J2EEPreferences.Keys.WEB_CONTENT_FOLDER));
+		final IPath newWebContent = new Path("WebContent2");
+		
+		DependencyUtil.verifyComponentMapping(webProject, webContent, Path.ROOT, true);
+		DependencyUtil.verifyComponentMapping(webProject, newWebContent, Path.ROOT, false);
+		
+		// rename the WebContent
+		final IFolder folder = webProject.getFolder(webContent);
+		folder.move(webProject.getFullPath().append(newWebContent), true, null);
+		DependencyUtil.waitForComponentRefactoringJobs();
+		
+		DependencyUtil.verifyComponentMapping(webProject, webContent, Path.ROOT, false);
+		DependencyUtil.verifyComponentMapping(webProject, newWebContent, Path.ROOT, true);	
+	}
+	
+	public void testEarContentRename() throws Exception {
+		final IProject earProject = ProjectUtil.createEARProject("TestEAR");
+		final IPath earContent = new Path(J2EEPlugin.getDefault().getJ2EEPreferences().getString(J2EEPreferences.Keys.APPLICATION_CONTENT_FOLDER));
+		final IPath newEarContent = new Path("EarContent2");
+		
+		DependencyUtil.verifyComponentMapping(earProject, earContent, Path.ROOT, true);
+		DependencyUtil.verifyComponentMapping(earProject, newEarContent, Path.ROOT, false);
+		
+		// rename the EarContent
+		final IFolder folder = earProject.getFolder(earContent);
+		folder.move(earProject.getFullPath().append(newEarContent), true, null);
+		DependencyUtil.waitForComponentRefactoringJobs();
+			
+		DependencyUtil.verifyComponentMapping(earProject, earContent, Path.ROOT, false);
+		DependencyUtil.verifyComponentMapping(earProject, newEarContent, Path.ROOT, true);
+	}
+
+//  XXX need to change to execute a refactor->rename
+//	public void testSourcePathRenameWeb() throws Exception {
+//		testSourcePathRename(ProjectUtil.createWebProject("TestWeb", null));
+//	}
+//	
+//	public void testSourcePathRenameUtil() throws Exception {
+//		testSourcePathRename(ProjectUtil.createUtilityProject("TestUtil", null));
+//	}
+//	
+//	private static void testSourcePathRename(final IProject project) throws Exception {
+//		final IPath srcPath = new Path("src");
+//		final IPath newSrcPath = new Path("newSrc");
+//		
+//		DependencyUtil.verifyComponentMapping(project, srcPath, true);
+//		
+//		final IFolder srcFolder = project.getFolder(srcPath);
+//		srcFolder.move(newSrcPath, true, null);
+//		
+//		DependencyUtil.verifyComponentMapping(project, srcPath, false);
+//		DependencyUtil.verifyComponentMapping(project, newSrcPath, true);
+//	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/dependency/tests/ProjectCreationTests.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/dependency/tests/ProjectCreationTests.java
new file mode 100644
index 0000000..f60dc2e
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/dependency/tests/ProjectCreationTests.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * Copyright (c) 2007 BEA Systems, Inc 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:
+ *    BEA Systems, Inc - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.dependency.tests;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jst.j2ee.dependency.tests.util.DependencyVerificationUtil;
+import org.eclipse.jst.j2ee.dependency.tests.util.ProjectUtil;
+
+/**
+ * Tests project creation logic in the ProjectCreationUtil helper class.
+ */
+public class ProjectCreationTests extends AbstractTests {
+
+    private ProjectCreationTests(final String name) {
+        super(name);
+    }
+    
+    public static Test suite(){
+        final TestSuite suite = new TestSuite();
+        suite.setName("Project Creation Tests" );
+        suite.addTest(new ProjectCreationTests("testEARCreation"));
+        suite.addTest(new ProjectCreationTests("testWebCreation"));
+        suite.addTest(new ProjectCreationTests("testWebWithEARCreation"));
+        suite.addTest(new ProjectCreationTests("testEJBCreation"));
+        suite.addTest(new ProjectCreationTests("testEJBWithEARCreation"));
+        suite.addTest(new ProjectCreationTests("testUtilCreation"));
+        suite.addTest(new ProjectCreationTests("testUtilWithEARCreation"));
+        return suite;
+    }
+    
+    public void testEARCreation() throws Exception {
+    	ProjectUtil.createEARProject("TestEAR");
+    }
+    
+    public void testWebCreation() throws Exception {
+    	ProjectUtil.createWebProject("TestWeb", null);
+    }
+    
+    public void testWebWithEARCreation() throws Exception {
+    	final IProject earProject = ProjectUtil.getProject("TestEAR"); 
+    	DependencyVerificationUtil.verifyEARDependency(earProject, ProjectUtil.createWebProject("TestWeb", earProject.getName()), true);
+    }
+    
+    public void testEJBCreation() throws Exception {
+    	ProjectUtil.createEJBProject("TestEJB", null);
+    }
+    
+    public void testEJBWithEARCreation() throws Exception {
+    	final IProject earProject = ProjectUtil.getProject("TestEAR"); 
+    	final IProject ejbProject = ProjectUtil.createEJBProject("TestEJB", earProject.getName());
+    	DependencyVerificationUtil.verifyEARDependency(earProject, ejbProject, true);
+    	testEJBClient(ejbProject, earProject);
+    }
+
+    private void testEJBClient(final IProject ejbProject, final IProject earProject) throws Exception {
+    	final IProject ejbClient = ProjectUtil.getProject(ejbProject.getName() + "Client"); 
+    	// check dependencies from EAR to EJB client
+    	DependencyVerificationUtil.verifyProjectReference(earProject, ejbClient, true);
+    	DependencyVerificationUtil.verifyComponentReference(earProject, ejbClient, DependencyVerificationUtil.ROOT, true);
+    	
+    	// check dependencies from EJB to EJB client
+    	//DependencyVerificationUtil.verifyModuleDependency(ejbProject, ejbClient);
+    	DependencyVerificationUtil.verifyManifestReference(ejbProject, ejbClient.getName() + ".jar", true);    	
+    }
+    
+    public void testUtilCreation() throws Exception {
+    	ProjectUtil.createUtilityProject("TestUtil", null);
+    }
+    
+    public void testUtilWithEARCreation() throws Exception {
+    	final IProject earProject = ProjectUtil.getProject("TestEAR");
+    	DependencyVerificationUtil.verifyEARDependency(earProject, ProjectUtil.createUtilityProject("TestUtil", earProject.getName()), false);
+    }
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/dependency/tests/ProjectDependencyTests.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/dependency/tests/ProjectDependencyTests.java
new file mode 100644
index 0000000..c83fd92
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/dependency/tests/ProjectDependencyTests.java
@@ -0,0 +1,97 @@
+/*******************************************************************************
+ * Copyright (c) 2007 BEA Systems, Inc 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:
+ *    BEA Systems, Inc - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.dependency.tests;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jst.j2ee.dependency.tests.util.DependencyCreationUtil;
+import org.eclipse.jst.j2ee.dependency.tests.util.DependencyVerificationUtil;
+import org.eclipse.jst.j2ee.dependency.tests.util.ProjectUtil;
+
+/**
+ * Tests project creation logic in the DependencyCreationUtil helper class.
+ */
+public class ProjectDependencyTests extends AbstractTests {
+	
+    private ProjectDependencyTests(final String name) {
+        super(name);
+    }
+    
+    public static Test suite(){
+        final TestSuite suite = new TestSuite();
+        suite.setName("Project Dependency Tests" );
+        suite.addTest(new ProjectDependencyTests("testEARWebDependency"));
+        suite.addTest(new ProjectDependencyTests("testEARDependencyRemoval"));
+        suite.addTest(new ProjectDependencyTests("testEARUtilDependency"));
+        suite.addTest(new ProjectDependencyTests("testEAREJBDependency"));
+        suite.addTest(new ProjectDependencyTests("testStandaloneWebUtilDependency"));
+        suite.addTest(new ProjectDependencyTests("testWebUtilWebInfLibDependency"));
+        suite.addTest(new ProjectDependencyTests("testWebEJBModuleDependency"));
+        return suite;
+    }
+    
+    public void testEARWebDependency() throws Exception {
+    	testEARDependency(ProjectUtil.createEARProject("TestEAR"),
+    			ProjectUtil.createWebProject("TestWeb", null), true);
+    }
+    
+    public void testEARDependencyRemoval() throws Exception {
+    	final IProject earProject = ProjectUtil.createEARProject("TestEAR");
+    	final IProject webProject = ProjectUtil.createWebProject("TestWeb", null);
+    	final String moduleURI = testEARDependency(earProject, webProject, true);
+    	DependencyCreationUtil.removeEARDependency(earProject, webProject);
+    	DependencyVerificationUtil.verifyEARDependencyRemoved(earProject, webProject, moduleURI);
+    }
+    
+    public void testEARUtilDependency() throws Exception {
+    	testEARDependency(ProjectUtil.createEARProject("TestEAR"),
+    			ProjectUtil.createUtilityProject("TestUtil", null), false);
+    }
+    
+    public void testEAREJBDependency() throws Exception {
+    	testEARDependency(ProjectUtil.createEARProject("TestEAR"),
+    			ProjectUtil.createEJBProject("TestEJB", null), true);
+    }
+    
+    private String testEARDependency(final IProject earProject, final IProject childProject, final boolean moduleRef) throws Exception {
+    	DependencyCreationUtil.createEARDependency(earProject, childProject);
+    	return DependencyVerificationUtil.verifyEARDependency(earProject, childProject, moduleRef);
+    }
+    
+    public void testStandaloneWebUtilDependency() throws Exception {
+    	final IProject saWeb =  ProjectUtil.createWebProject("TestWeb", null);
+    	final IProject util =  ProjectUtil.createUtilityProject("TestUtil", null);
+    	DependencyCreationUtil.createWebLibDependency(saWeb, util);
+    	DependencyVerificationUtil.verifyWebLibDependency(saWeb, util);
+    }
+    
+    public void testWebUtilWebInfLibDependency() throws Exception {
+    	final IProject web =  ProjectUtil.createWebProject("TestWeb", null);
+    	final IProject util =  ProjectUtil.createUtilityProject("TestUtil", null);
+    	final IProject ear = ProjectUtil.createEARProject("TestEAR");
+    	testEARDependency(ear, web, true);
+    	testEARDependency(ear, util, false);
+    	DependencyCreationUtil.createWebLibDependency(web, util);
+    	DependencyVerificationUtil.verifyWebLibDependency(web, util);
+    }
+    
+    public void testWebEJBModuleDependency() throws Exception {
+    	final IProject web =  ProjectUtil.createWebProject("TestWeb", null);
+    	final IProject ejb =  ProjectUtil.createEJBProject("TestEJB", null);
+    	final IProject ear = ProjectUtil.createEARProject("TestEAR");
+    	testEARDependency(ear, web, true);
+    	testEARDependency(ear, ejb, true);
+    	DependencyCreationUtil.createModuleDependency(web, ejb);
+    	DependencyVerificationUtil.verifyModuleDependency(web, ejb);	
+    }
+}
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/dependency/tests/ProjectEARRefactoringTests.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/dependency/tests/ProjectEARRefactoringTests.java
new file mode 100644
index 0000000..ec963c6
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/dependency/tests/ProjectEARRefactoringTests.java
@@ -0,0 +1,292 @@
+/*******************************************************************************
+ * Copyright (c) 2007 BEA Systems, Inc 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:
+ *    BEA Systems, Inc - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.dependency.tests;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.jst.j2ee.dependency.tests.util.DependencyCreationUtil;
+import org.eclipse.jst.j2ee.dependency.tests.util.DependencyUtil;
+import org.eclipse.jst.j2ee.dependency.tests.util.DependencyVerificationUtil;
+import org.eclipse.jst.j2ee.dependency.tests.util.ProjectUtil;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * Tests the refactoring logic that handles rename/delete refactoring of EAR child
+ * projects. 
+ */
+public class ProjectEARRefactoringTests extends AbstractTests {
+	
+	public ProjectEARRefactoringTests(String name) {
+		super(name);
+	}
+	
+	public static Test suite(){
+        final TestSuite suite = new TestSuite();
+        suite.setName("Project EAR Refactoring Tests" );
+        //suite.addTest(new ProjectEARRefactoringTests("testDeleteEARWebModule"));
+        // XXX this can fail
+        //suite.addTest(new ProjectEARRefactoringTests("testDeleteEARWebModuleWithValidation"));
+        //suite.addTest(new ProjectEARRefactoringTests("testDeleteEARUtilModule"));
+        //suite.addTest(new ProjectEARRefactoringTests("testDeleteEAREJBModule"));
+        suite.addTest(new ProjectEARRefactoringTests("testRenameEARWebModule"));
+        suite.addTest(new ProjectEARRefactoringTests("testRenameEARUtilModule"));
+        //suite.addTest(new ProjectEARRefactoringTests("testRenameEAREJBModule"));
+        //suite.addTest(new ProjectEARRefactoringTests("testMultipleEARWebDelete"));
+        suite.addTest(new ProjectEARRefactoringTests("testMultipleEARWebRename"));
+        //suite.addTest(new ProjectEARRefactoringTests("testMultipleEARUtilDelete"));
+        suite.addTest(new ProjectEARRefactoringTests("testMultipleEARUtilRename"));
+        //suite.addTest(new ProjectEARRefactoringTests("testDeleteWithEARModuleDependency"));
+        suite.addTest(new ProjectEARRefactoringTests("testRenameWithMultipleEARModuleDependency"));
+        //suite.addTest(new ProjectEARRefactoringTests("testDependencyRemovalWithMultipleEARModuleDependency"));        
+        return suite;
+    }
+    
+	// bug 261555 switches us to use LTK refactoring- need to update the delete test cases
+	public void _testDeleteEARWebModule() throws Exception {
+		DependencyUtil.disableValidation();
+		
+		final IProject earProject = ProjectUtil.getProject("TestEAR");
+		final IProject webProject = ProjectUtil.createWebProject("TestWeb", earProject.getName());
+		String moduleURI = DependencyVerificationUtil.verifyEARDependency(earProject, webProject, true);
+		
+		ProjectUtil.deleteProject(webProject);
+		
+		DependencyVerificationUtil.verifyEARDependencyRemoved(earProject, webProject, moduleURI);
+		
+		DependencyUtil.enableValidation();
+	}
+	
+	// bug 261555 switches us to use LTK refactoring- need to update the delete test cases
+	public void _testDeleteEARWebModuleWithValidation() throws Exception {
+		final IProject earProject = ProjectUtil.getProject("TestEAR");
+		final IProject webProject = ProjectUtil.createWebProject("TestWeb", earProject.getName());
+		String moduleURI = DependencyVerificationUtil.verifyEARDependency(earProject, webProject, true);
+		ProjectUtil.deleteProject(webProject);
+		DependencyVerificationUtil.verifyEARDependencyRemoved(earProject, webProject, moduleURI);
+	}
+	
+	// bug 261555 switches us to use LTK refactoring- need to update the delete test cases
+	public void _testDeleteEARUtilModule() throws Exception {
+		final IProject earProject = ProjectUtil.getProject("TestEAR");
+		final IProject utilProject = ProjectUtil.createUtilityProject("TestUtil", earProject.getName());
+		
+		DependencyVerificationUtil.verifyEARDependency(earProject, utilProject, false);
+		
+		ProjectUtil.deleteProject(utilProject);
+		
+		DependencyVerificationUtil.verifyEARDependencyRemoved(earProject, utilProject);	
+    }
+	
+	// bug 261555 switches us to use LTK refactoring- need to update the delete test cases
+	public void _testDeleteEAREJBModule() throws Exception {
+		final IProject earProject = ProjectUtil.getProject("TestEAR");
+		final IProject ejbProject = ProjectUtil.createEJBProject("TestEJB", earProject.getName());
+		
+		final IProject ejbClientProject = ProjectUtil.getProject("TestEJBClient");
+		String moduleURI = DependencyVerificationUtil.verifyEARDependency(earProject, ejbProject, true);
+		
+		DependencyVerificationUtil.verifyEARDependency(earProject, ejbClientProject, false);
+		DependencyVerificationUtil.verifyModuleDependency(ejbProject, ejbClientProject);
+		
+		ProjectUtil.deleteProject(ejbProject);
+		ProjectUtil.deleteProject(ejbClientProject);
+		
+		DependencyVerificationUtil.verifyEARDependencyRemoved(earProject, ejbProject, moduleURI);
+		DependencyVerificationUtil.verifyEARDependencyRemoved(earProject, ejbClientProject);
+    }
+	
+	public void testRenameEARWebModule() throws Exception {
+		DependencyUtil.disableValidation();
+
+		final IProject earProject = ProjectUtil.getProject("TestEAR");
+		final IProject webProject = ProjectUtil.createWebProject("TestWeb", earProject.getName());
+		String moduleURI = DependencyVerificationUtil.verifyEARDependency(earProject, webProject, true);
+		
+		final IProject newWeb = ProjectUtil.renameProject(webProject, "newWeb");
+		
+		DependencyVerificationUtil.verifyEARDependencyChanged(earProject, webProject, moduleURI, newWeb);
+		
+		DependencyUtil.enableValidation();
+	}
+	
+	public void testRenameEARUtilModule() throws Exception {
+		final IProject earProject = ProjectUtil.getProject("TestEAR");
+		final IProject utilProject = ProjectUtil.createUtilityProject("TestUtil", earProject.getName());
+		
+		DependencyVerificationUtil.verifyEARDependency(earProject, utilProject, false);
+		
+		final IProject newUtil = ProjectUtil.renameProject(utilProject, "newUtil");
+		
+		DependencyVerificationUtil.verifyEARDependencyChanged(earProject, utilProject, newUtil);	
+    }
+	
+	public void testRenameEAREJBModule() throws Exception {
+		final IProject earProject = ProjectUtil.getProject("TestEAR");
+		final IProject ejbProject = ProjectUtil.createEJBProject("TestEJB", earProject.getName());
+		final IProject ejbClientProject = ProjectUtil.getProject("TestEJBClient");
+		
+		String moduleURI = DependencyVerificationUtil.verifyEARDependency(earProject, ejbProject, true);
+		DependencyVerificationUtil.verifyEARDependency(earProject, ejbClientProject, false);
+		
+		final IProject newEJB = ProjectUtil.renameProject(ejbProject, "newEJB");
+		
+		DependencyVerificationUtil.verifyEARDependencyChanged(earProject, ejbProject, moduleURI, newEJB);
+		DependencyVerificationUtil.verifyModuleDependency(newEJB, ejbClientProject);
+    }
+	
+	// bug 261555 switches us to use LTK refactoring- need to update the delete test cases
+	public void _testMultipleEARWebDelete() throws Exception {
+		DependencyUtil.disableValidation();
+
+		final IProject earProject1 = ProjectUtil.getProject("TestEAR1");
+		final IProject earProject2 = ProjectUtil.createEARProject("TestEAR2");
+		final IProject webProject = ProjectUtil.createWebProject("TestWeb", earProject1.getName());
+		DependencyCreationUtil.createEARDependency(earProject2, webProject);
+		
+		final String moduleURI1 = DependencyVerificationUtil.verifyEARDependency(earProject1, webProject, true);	
+		final String moduleURI2 = DependencyVerificationUtil.verifyEARDependency(earProject2, webProject, true);
+		
+		ProjectUtil.deleteProject(webProject);
+
+		DependencyVerificationUtil.verifyEARDependencyRemoved(earProject1, webProject, moduleURI1);	
+		DependencyVerificationUtil.verifyEARDependencyRemoved(earProject2, webProject, moduleURI2);	
+		
+		DependencyUtil.enableValidation();
+	}
+	
+	public void testMultipleEARWebRename() throws Exception {
+		DependencyUtil.disableValidation();
+		
+		final IProject earProject1 = ProjectUtil.getProject("TestEAR1");
+		final IProject earProject2 = ProjectUtil.createEARProject("TestEAR2");
+		final IProject webProject = ProjectUtil.createWebProject("TestWeb", earProject1.getName());
+		DependencyCreationUtil.createEARDependency(earProject2, webProject);
+		
+		final String moduleURI1 = DependencyVerificationUtil.verifyEARDependency(earProject1, webProject, true);	
+		final String moduleURI2 = DependencyVerificationUtil.verifyEARDependency(earProject2, webProject, true);
+		
+		final IProject newWeb = ProjectUtil.renameProject(webProject, "newWeb");
+		
+		DependencyVerificationUtil.verifyEARDependencyChanged(earProject1, webProject, moduleURI1, newWeb);	
+		DependencyVerificationUtil.verifyEARDependencyChanged(earProject2, webProject, moduleURI2, newWeb);		
+
+		DependencyUtil.enableValidation();
+	}
+	
+	// bug 261555 switches us to use LTK refactoring- need to update the delete test cases
+	public void _testMultipleEARUtilDelete() throws Exception {
+		final IProject earProject1 = ProjectUtil.getProject("TestEAR1");
+		final IProject earProject2 = ProjectUtil.createEARProject("TestEAR2");
+		final IProject utilProject = ProjectUtil.createUtilityProject("TestUtil", earProject1.getName());
+		DependencyCreationUtil.createEARDependency(earProject2, utilProject);
+		DependencyVerificationUtil.verifyEARDependency(earProject1, utilProject, false);	
+		DependencyVerificationUtil.verifyEARDependency(earProject2, utilProject, false);
+		ProjectUtil.deleteProject(utilProject);
+		DependencyVerificationUtil.verifyEARDependencyRemoved(earProject1, utilProject);	
+		DependencyVerificationUtil.verifyEARDependencyRemoved(earProject2, utilProject);		
+	}
+	
+	public void testMultipleEARUtilRename() throws Exception {
+		final IProject earProject1 = ProjectUtil.getProject("TestEAR1");
+		final IProject earProject2 = ProjectUtil.createEARProject("TestEAR2");
+		final IProject utilProject = ProjectUtil.createUtilityProject("TestUtil", earProject1.getName());
+		DependencyCreationUtil.createEARDependency(earProject2, utilProject);
+		DependencyVerificationUtil.verifyEARDependency(earProject1, utilProject, false);	
+		DependencyVerificationUtil.verifyEARDependency(earProject2, utilProject, false);
+		
+		final IProject newUtil= ProjectUtil.renameProject(utilProject, "newUtil");
+		
+		DependencyVerificationUtil.verifyEARDependencyChanged(earProject1, utilProject, newUtil);	
+		DependencyVerificationUtil.verifyEARDependencyChanged(earProject2, utilProject, newUtil);				
+	}
+	
+	// bug 261555 switches us to use LTK refactoring- need to update the delete test cases
+	public void _testDeleteWithEARModuleDependency() throws Exception {
+		final IProject earProject = ProjectUtil.getProject("TestEAR");
+		final IProject utilProject = ProjectUtil.createUtilityProject("TestUtil", earProject.getName());
+		final IProject webProject = ProjectUtil.createWebProject("TestWeb", earProject.getName());
+		DependencyCreationUtil.createModuleDependency(webProject, utilProject);
+		
+		DependencyVerificationUtil.verifyEARDependency(earProject, utilProject, false);	
+		DependencyVerificationUtil.verifyEARDependency(earProject, webProject, true);
+		DependencyVerificationUtil.verifyModuleDependency(webProject, utilProject);
+		
+		ProjectUtil.deleteProject(utilProject);
+		
+		DependencyVerificationUtil.verifyEARDependencyRemoved(earProject, utilProject);	
+		DependencyVerificationUtil.verifyModuleDependencyRemoved(webProject, utilProject);
+		DependencyVerificationUtil.verifyEARDependency(earProject, webProject, true);
+	}
+	
+	public void testRenameWithMultipleEARModuleDependency() throws Exception {
+		final IProject earProject1 = ProjectUtil.getProject("TestEAR1");
+		final IProject earProject2 = ProjectUtil.createEARProject("TestEAR2");
+		final IProject ejbProject = ProjectUtil.createEJBProject("TestEJB", earProject1.getName());
+		DependencyCreationUtil.createEARDependency(earProject2, ejbProject);
+		final IProject webProject1 = ProjectUtil.createWebProject("TestWeb1", earProject1.getName());
+		final IProject webProject2 = ProjectUtil.createWebProject("TestWeb2", earProject2.getName());
+		DependencyCreationUtil.createModuleDependency(webProject1, ejbProject);
+		DependencyCreationUtil.createWebLibDependency(webProject2, ejbProject);
+		
+		DependencyUtil.waitForJobs(ResourcesPlugin.FAMILY_AUTO_BUILD);
+				
+		final String moduleURI1 = DependencyVerificationUtil.verifyEARDependency(earProject1, ejbProject, true);
+		final String moduleURI2 = DependencyVerificationUtil.verifyEARDependency(earProject2, ejbProject, true);	
+		DependencyVerificationUtil.verifyEARDependency(earProject1, webProject1, true);
+		DependencyVerificationUtil.verifyEARDependency(earProject2, webProject2, true);
+       	DependencyVerificationUtil.verifyModuleDependency(webProject1, ejbProject);
+		DependencyVerificationUtil.verifyWebLibDependency(webProject2, ejbProject);
+		
+		IProject newEJB = ProjectUtil.renameProject(ejbProject, "newEJB");
+			
+		DependencyVerificationUtil.verifyEARDependencyChanged(earProject1, ejbProject, moduleURI1, newEJB);	
+		DependencyVerificationUtil.verifyEARDependencyChanged(earProject2, ejbProject, moduleURI2, newEJB);
+      	DependencyVerificationUtil.verifyModuleDependencyChanged(webProject1, ejbProject, newEJB);
+		DependencyVerificationUtil.verifyWebLibDependencyChanged(webProject2, ejbProject, newEJB);
+	}
+	
+	/* XXX only works through the UI right now
+	public void testDependencyRemovalWithMultipleEARModuleDependency() throws Exception {
+		final IProject earProject1 = ProjectUtil.getProject("TestEAR1");
+		final IProject earProject2 = ProjectUtil.createEARProject("TestEAR2");
+		final IProject utilProject = ProjectUtil.createUtilityProject("TestUtil", earProject1.getName());
+		DependencyCreationUtil.createEARDependency(earProject2, utilProject);
+		final IProject webProject1 = ProjectUtil.createWebProject("TestWeb1", earProject1.getName());
+		final IProject webProject2 = ProjectUtil.createWebProject("TestWeb2", earProject2.getName());
+		DependencyCreationUtil.createModuleDependency(webProject1, utilProject);
+		DependencyCreationUtil.createModuleDependency(webProject2, utilProject);
+		
+		// verify all of the dependencies
+		DependencyVerificationUtil.verifyEARDependency(earProject1, utilProject, false);
+		DependencyVerificationUtil.verifyEARDependency(earProject2, utilProject, false);	
+		DependencyVerificationUtil.verifyEARDependency(earProject1, webProject1, true);
+		DependencyVerificationUtil.verifyEARDependency(earProject2, webProject2, true);
+		DependencyVerificationUtil.verifyModuleDependency(webProject1, utilProject);
+		DependencyVerificationUtil.verifyModuleDependency(webProject2, utilProject);
+		
+		// remove the dependency between the util and just EAR1
+		DependencyCreationUtil.removeEARDependency(earProject1, utilProject);
+		
+		// verify the changed dependencies
+		DependencyVerificationUtil.verifyEARDependencyRemoved(earProject1, utilProject);
+		DependencyVerificationUtil.verifyModuleDependencyRemoved(webProject1, utilProject);
+		
+		// verify the dependencies that should be unchanged
+		DependencyVerificationUtil.verifyEARDependency(earProject1, webProject1, true);
+		DependencyVerificationUtil.verifyEARDependency(earProject2, webProject2, true);
+		DependencyVerificationUtil.verifyEARDependency(earProject2, utilProject, false);
+		DependencyVerificationUtil.verifyWebLibDependency(webProject2, utilProject);
+	}
+	*/
+	
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/dependency/tests/ProjectModuleRefactoringTests.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/dependency/tests/ProjectModuleRefactoringTests.java
new file mode 100644
index 0000000..7dc8fd9
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/dependency/tests/ProjectModuleRefactoringTests.java
@@ -0,0 +1,166 @@
+/*******************************************************************************
+ * Copyright (c) 2007 BEA Systems, Inc 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:
+ *    BEA Systems, Inc - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.dependency.tests;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jst.j2ee.dependency.tests.util.DependencyCreationUtil;
+import org.eclipse.jst.j2ee.dependency.tests.util.DependencyVerificationUtil;
+import org.eclipse.jst.j2ee.dependency.tests.util.ProjectUtil;
+
+/**
+ * Tests the refactoring logic that handles rename/delete refactoring of projects that
+ * participate in inter-module dependencies.
+ */
+public class ProjectModuleRefactoringTests extends AbstractTests {
+	
+	public ProjectModuleRefactoringTests(String name) {
+		super(name);
+	}
+	
+	public static Test suite(){
+        final TestSuite suite = new TestSuite();
+        suite.setName("Project Module Dependency Refactoring Tests" );
+        suite.addTest(new ProjectModuleRefactoringTests("testDeleteModuleDependency"));
+        suite.addTest(new ProjectModuleRefactoringTests("testRenameModuleDependency"));
+        suite.addTest(new ProjectModuleRefactoringTests("testDeleteModuleDependencyWithMarker"));
+        suite.addTest(new ProjectModuleRefactoringTests("testRenameModuleDependencyWithMarker"));
+        suite.addTest(new ProjectModuleRefactoringTests("testDeleteMultipleDependency"));
+        suite.addTest(new ProjectModuleRefactoringTests("testRenameMultipleModuleDependency"));
+        return suite;
+    }
+	
+	public void testDeleteModuleDependency() throws Exception {
+		final IProject[] projects = setupModuleDependency();
+		final IProject earProject = projects[0];
+		final IProject webProject = projects[1];
+		final IProject utilProject = projects[2];
+
+		ProjectUtil.deleteProject(utilProject);
+		
+		DependencyVerificationUtil.verifyEARDependencyRemoved(earProject, utilProject);	
+		DependencyVerificationUtil.verifyModuleDependencyRemoved(webProject, utilProject);
+    }
+    
+    public void testDeleteModuleDependencyWithMarker() throws Exception {
+        final IProject[] projects = setupModuleDependency();
+        final IProject earProject = projects[0];
+        final IProject webProject = projects[1];
+        final IProject utilProject = projects[2];
+
+        // add a marker 
+        utilProject.createMarker("TEST_MARKER");
+        
+        ProjectUtil.deleteProject(utilProject);
+        
+        DependencyVerificationUtil.verifyEARDependencyRemoved(earProject, utilProject); 
+        DependencyVerificationUtil.verifyModuleDependencyRemoved(webProject, utilProject);
+    }
+
+    public void testRenameModuleDependency() throws Exception {
+        final IProject[] projects = setupModuleDependency();
+        final IProject earProject = projects[0];
+        final IProject webProject = projects[1];
+        final IProject utilProject = projects[2];
+        
+        final IProject newUtil = ProjectUtil.renameProject(utilProject, "newUtil");
+        
+        DependencyVerificationUtil.verifyEARDependencyChanged(earProject, utilProject, newUtil);    
+        DependencyVerificationUtil.verifyModuleDependencyChanged(webProject, utilProject, newUtil);
+    }
+    
+    public void testRenameModuleDependencyWithMarker() throws Exception {
+        final IProject[] projects = setupModuleDependency();
+        final IProject earProject = projects[0];
+        final IProject webProject = projects[1];
+        final IProject utilProject = projects[2];
+        
+        // add a marker 
+        utilProject.createMarker("TEST_MARKER");
+        
+        final IProject newUtil = ProjectUtil.renameProject(utilProject, "newUtil");
+        
+        DependencyVerificationUtil.verifyEARDependencyChanged(earProject, utilProject, newUtil);    
+        DependencyVerificationUtil.verifyModuleDependencyChanged(webProject, utilProject, newUtil);
+    }
+
+	public void testDeleteMultipleDependency() throws Exception {
+		final IProject[] projects = setupMultipleDependency();
+		final IProject earProject1 = projects[0];
+		final IProject earProject2 = projects[1];
+		final IProject webProject = projects[2];
+		final IProject ejbProject = projects[3];
+		final IProject utilProject = projects[4];
+
+		ProjectUtil.deleteProject(utilProject);
+		
+		DependencyVerificationUtil.verifyEARDependencyRemoved(earProject1, utilProject);	
+		DependencyVerificationUtil.verifyEARDependencyRemoved(earProject2, utilProject);	
+		DependencyVerificationUtil.verifyModuleDependencyRemoved(webProject, utilProject);
+		DependencyVerificationUtil.verifyModuleDependencyRemoved(ejbProject, utilProject);
+	}
+	
+	public void testRenameMultipleModuleDependency() throws Exception {
+		final IProject[] projects = setupMultipleDependency();
+		final IProject earProject1 = projects[0];
+		final IProject earProject2 = projects[1];
+		final IProject webProject = projects[2];
+		final IProject ejbProject = projects[3];
+		final IProject utilProject = projects[4];
+
+		final IProject newUtil = ProjectUtil.renameProject(utilProject, "newUtil");
+		
+		DependencyVerificationUtil.verifyEARDependencyChanged(earProject1, utilProject, newUtil);
+		DependencyVerificationUtil.verifyEARDependencyChanged(earProject2, utilProject, newUtil);
+		DependencyVerificationUtil.verifyModuleDependencyChanged(webProject, utilProject, newUtil);
+		DependencyVerificationUtil.verifyModuleDependencyChanged(ejbProject, utilProject, newUtil);
+	}
+	
+	private static IProject[] setupModuleDependency() throws Exception {
+		final IProject earProject = ProjectUtil.getProject("TestEAR");
+		final IProject utilProject = ProjectUtil.createUtilityProject("TestUtil", earProject.getName());
+		final IProject webProject = ProjectUtil.createWebProject("TestWeb", earProject.getName());
+		DependencyCreationUtil.createModuleDependency(webProject, utilProject);
+		DependencyVerificationUtil.verifyEARDependency(earProject, utilProject, false);	
+		DependencyVerificationUtil.verifyEARDependency(earProject, webProject, true);
+		DependencyVerificationUtil.verifyModuleDependency(webProject, utilProject);	
+		return new IProject[] {earProject, webProject, utilProject};
+	}
+
+	private static IProject[] setupMultipleDependency() throws Exception {
+		// create the projects
+		final IProject earProject1 = ProjectUtil.getProject("TestEAR1");
+		final IProject earProject2 = ProjectUtil.createEARProject("TestEAR2");
+		final IProject utilProject = ProjectUtil.createUtilityProject("TestUtil", earProject1.getName());
+
+		// create the dependencies
+		DependencyCreationUtil.createEARDependency(earProject2, utilProject);
+		final IProject webProject = ProjectUtil.createWebProject("TestWeb", earProject1.getName());
+		final IProject ejbProject = ProjectUtil.createEJBProject("TestEJB", earProject2.getName());
+		final IProject ejbClientProject = ProjectUtil.getProject("TestEJBClient");
+		DependencyCreationUtil.createModuleDependency(webProject, utilProject);
+		DependencyCreationUtil.createModuleDependency(ejbProject, utilProject);
+
+		// verify the dependencies
+		DependencyVerificationUtil.verifyEARDependency(earProject1, utilProject, false);
+		DependencyVerificationUtil.verifyEARDependency(earProject1, webProject, true);
+		DependencyVerificationUtil.verifyEARDependency(earProject2, utilProject, false);
+		DependencyVerificationUtil.verifyEARDependency(earProject2, ejbProject, true);
+		DependencyVerificationUtil.verifyEARDependency(earProject2, ejbClientProject, false);
+		DependencyVerificationUtil.verifyModuleDependency(webProject, utilProject);	
+		DependencyVerificationUtil.verifyModuleDependency(ejbProject, utilProject);
+		
+		return new IProject[] {earProject1, earProject2, webProject, ejbProject, utilProject};
+	}
+	
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/dependency/tests/ProjectServerRefactoringTests.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/dependency/tests/ProjectServerRefactoringTests.java
new file mode 100644
index 0000000..b9fa0c1
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/dependency/tests/ProjectServerRefactoringTests.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2007 BEA Systems, Inc 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:
+ *    BEA Systems, Inc - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.dependency.tests;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * Tests refactoring logic that updates server instances when associated modules are
+ * renamed or deleted. 
+ */
+public class ProjectServerRefactoringTests extends AbstractTests {
+	
+	public ProjectServerRefactoringTests(String name) {
+		super(name);
+	}
+	
+	public static Test suite(){
+        final TestSuite suite = new TestSuite();
+        suite.setName("Project Server Refactoring Tests" );
+        //suite.addTest(new ProjectServerRefactoringTests("testEARWebDependency"));
+        return suite;
+    }
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/dependency/tests/ProjectWebLibRefactoringTests.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/dependency/tests/ProjectWebLibRefactoringTests.java
new file mode 100644
index 0000000..fe6c165
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/dependency/tests/ProjectWebLibRefactoringTests.java
@@ -0,0 +1,133 @@
+/*******************************************************************************
+ * Copyright (c) 2007 BEA Systems, Inc 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:
+ *    BEA Systems, Inc - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.dependency.tests;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jst.j2ee.dependency.tests.util.DependencyCreationUtil;
+import org.eclipse.jst.j2ee.dependency.tests.util.DependencyVerificationUtil;
+import org.eclipse.jst.j2ee.dependency.tests.util.ProjectUtil;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * Tests the refactoring logic that handles rename/delete refactoring of projects that
+ * participate in web-inf/lib module dependencies.
+ */
+public class ProjectWebLibRefactoringTests extends AbstractTests {
+	
+	public ProjectWebLibRefactoringTests(String name) {
+		super(name);
+	}
+	
+	public static Test suite(){
+        final TestSuite suite = new TestSuite();
+        suite.setName("Project WEB-INF/lib Dependency Refactoring Tests" );
+        suite.addTest(new ProjectWebLibRefactoringTests("testDeleteWebLibDependency"));
+        suite.addTest(new ProjectWebLibRefactoringTests("testRenameWebLibDependency"));
+        suite.addTest(new ProjectWebLibRefactoringTests("testDeleteMultipleDependency"));
+        suite.addTest(new ProjectWebLibRefactoringTests("testRenameMultipleModuleDependency"));
+        return suite;
+    }
+
+	public void testDeleteWebLibDependency() throws Exception {
+		final IProject[] projects = setupWebLibDependency();
+		final IProject earProject = projects[0];
+		final IProject webProject = projects[1];
+		final IProject utilProject = projects[2];
+		
+		ProjectUtil.deleteProject(utilProject);
+		
+		DependencyVerificationUtil.verifyEARDependencyRemoved(earProject, utilProject);	
+		DependencyVerificationUtil.verifyWebLibDependencyRemoved(webProject, utilProject);
+    }
+
+	public void testRenameWebLibDependency() throws Exception {
+		final IProject[] projects = setupWebLibDependency();
+		final IProject earProject = projects[0];
+		final IProject webProject = projects[1];
+		final IProject utilProject = projects[2];
+		
+		final IProject newUtil = ProjectUtil.renameProject(utilProject, "newUtil");
+		
+		DependencyVerificationUtil.verifyEARDependencyChanged(earProject, utilProject, newUtil);	
+		DependencyVerificationUtil.verifyWebLibDependencyChanged(webProject, utilProject, newUtil);
+    }
+	
+	public void testDeleteMultipleDependency() throws Exception {
+		final IProject[] projects = setupMultipleDependency();
+		final IProject earProject1 = projects[0];
+		final IProject earProject2 = projects[1];
+		final IProject webProject1 = projects[2];
+		final IProject webProject2 = projects[3];
+		final IProject utilProject = projects[4];
+
+		ProjectUtil.deleteProject(utilProject);
+		
+		DependencyVerificationUtil.verifyEARDependencyRemoved(earProject1, utilProject);	
+		DependencyVerificationUtil.verifyEARDependencyRemoved(earProject2, utilProject);	
+		DependencyVerificationUtil.verifyWebLibDependencyRemoved(webProject1, utilProject);
+		DependencyVerificationUtil.verifyWebLibDependencyRemoved(webProject2, utilProject);
+	}
+	
+	public void testRenameMultipleModuleDependency() throws Exception {
+		final IProject[] projects = setupMultipleDependency();
+		final IProject earProject1 = projects[0];
+		final IProject earProject2 = projects[1];
+		final IProject webProject1 = projects[2];
+		final IProject webProject2 = projects[3];
+		final IProject utilProject = projects[4];
+
+		final IProject newUtil = ProjectUtil.renameProject(utilProject, "newUtil");
+		
+		DependencyVerificationUtil.verifyEARDependencyChanged(earProject1, utilProject, newUtil);
+		DependencyVerificationUtil.verifyEARDependencyChanged(earProject2, utilProject, newUtil);
+		DependencyVerificationUtil.verifyWebLibDependencyChanged(webProject1, utilProject, newUtil);
+		DependencyVerificationUtil.verifyWebLibDependencyChanged(webProject2, utilProject, newUtil);
+	}
+	
+	private static IProject[] setupWebLibDependency() throws Exception {
+		final IProject earProject = ProjectUtil.getProject("TestEAR");
+		final IProject utilProject = ProjectUtil.createUtilityProject("TestUtil", earProject.getName());
+		final IProject webProject = ProjectUtil.createWebProject("TestWeb", earProject.getName());
+		DependencyCreationUtil.createWebLibDependency(webProject, utilProject);
+		DependencyVerificationUtil.verifyEARDependency(earProject, utilProject, false);	
+		DependencyVerificationUtil.verifyEARDependency(earProject, webProject, true);
+		DependencyVerificationUtil.verifyWebLibDependency(webProject, utilProject);
+		return new IProject[] {earProject, webProject, utilProject};
+	}
+	
+	private static IProject[] setupMultipleDependency() throws Exception {
+		// create the projects
+		final IProject earProject1 = ProjectUtil.getProject("TestEAR1");
+		final IProject earProject2 = ProjectUtil.createEARProject("TestEAR2");
+		final IProject utilProject = ProjectUtil.createUtilityProject("TestUtil", earProject1.getName());
+
+		// create the dependencies
+		DependencyCreationUtil.createEARDependency(earProject2, utilProject);
+		final IProject webProject1 = ProjectUtil.createWebProject("TestWeb1", earProject1.getName());
+		final IProject webProject2 = ProjectUtil.createWebProject("TestWeb2", earProject2.getName());
+
+		DependencyCreationUtil.createWebLibDependency(webProject1, utilProject);
+		DependencyCreationUtil.createWebLibDependency(webProject2, utilProject);
+
+		// verify the dependencies
+		DependencyVerificationUtil.verifyEARDependency(earProject1, utilProject, false);
+		DependencyVerificationUtil.verifyEARDependency(earProject1, webProject1, true);
+		DependencyVerificationUtil.verifyEARDependency(earProject2, utilProject, false);
+		DependencyVerificationUtil.verifyEARDependency(earProject2, webProject2, true);
+		DependencyVerificationUtil.verifyWebLibDependency(webProject1, utilProject);	
+		DependencyVerificationUtil.verifyWebLibDependency(webProject2, utilProject);	
+		
+		return new IProject[] {earProject1, earProject2, webProject1, webProject2, utilProject};
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/dependency/tests/util/DependencyCreationUtil.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/dependency/tests/util/DependencyCreationUtil.java
new file mode 100644
index 0000000..71b0797
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/dependency/tests/util/DependencyCreationUtil.java
@@ -0,0 +1,148 @@
+/*******************************************************************************
+ * Copyright (c) 2007 BEA Systems, Inc 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:
+ *    BEA Systems, Inc - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.dependency.tests.util;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.jar.Manifest;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jst.j2ee.application.internal.operations.AddComponentToEnterpriseApplicationDataModelProvider;
+import org.eclipse.jst.j2ee.application.internal.operations.RemoveComponentFromEnterpriseApplicationDataModelProvider;
+import org.eclipse.jst.j2ee.application.internal.operations.UpdateManifestDataModelProperties;
+import org.eclipse.jst.j2ee.application.internal.operations.UpdateManifestDataModelProvider;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveManifest;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveManifestImpl;
+import org.eclipse.jst.j2ee.internal.J2EEConstants;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.datamodel.properties.ICreateReferenceComponentsDataModelProperties;
+import org.eclipse.wst.common.componentcore.internal.operation.CreateReferenceComponentsDataModelProvider;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualFile;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+/**
+ * Test utility class that programmatically creates J2EE dependencies. 
+ */
+public class DependencyCreationUtil {
+	
+	public static void createEARDependency(final IProject earProject, final IProject childProject) throws ExecutionException {
+		createEARDependency(earProject, childProject, false);
+	}
+	
+	public static void createEARDependency(final IProject earProject, final IProject childProject, final boolean inLibDir) throws ExecutionException {
+		final IDataModel dm = DataModelFactory.createDataModel(new AddComponentToEnterpriseApplicationDataModelProvider());
+		IVirtualComponent earComp = ComponentCore.createComponent(earProject);
+		IVirtualComponent childComp = ComponentCore.createComponent(childProject);
+		dm.setProperty(ICreateReferenceComponentsDataModelProperties.SOURCE_COMPONENT, earComp); 
+		final List depList = new ArrayList();
+		depList.add(childComp);
+		dm.setProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENT_LIST, depList);
+		if (inLibDir) {
+			dm.setProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENTS_DEPLOY_PATH, J2EEConstants.EAR_DEFAULT_LIB_DIR); //$NON-NLS-1$
+		} else {
+			dm.setProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENTS_DEPLOY_PATH, J2EEConstants.EAR_ROOT_DIR); //$NON-NLS-1$
+			Map modDeployPathMap = (Map) dm.getProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENTS_DEPLOY_PATH_MAP);
+			modDeployPathMap.put(childComp, J2EEConstants.EAR_ROOT_DIR);
+		}
+		dm.getDefaultOperation().execute(null, null);
+        ProjectUtil.waitForClasspathUpdate();
+	}
+	
+	public static void removeEARDependency(final IProject earProject, final IProject childProject) throws ExecutionException {
+		final IDataModel dm = DataModelFactory.createDataModel(new RemoveComponentFromEnterpriseApplicationDataModelProvider());
+		IVirtualComponent earComp = ComponentCore.createComponent(earProject);
+		IVirtualComponent childComp = ComponentCore.createComponent(childProject);
+		dm.setProperty(ICreateReferenceComponentsDataModelProperties.SOURCE_COMPONENT, earComp); 
+		final List depList = new ArrayList();
+		depList.add(childComp);
+		dm.setProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENT_LIST, depList);
+		dm.getDefaultOperation().execute(null, null);
+        ProjectUtil.waitForClasspathUpdate();
+	}
+
+	public static void createModuleDependency(final IProject source, final IProject target) throws ExecutionException, CoreException, IOException {
+		createProjectDependency(source, target, false);
+	}
+	
+	public static void createWebLibDependency(final IProject source, final IProject target) throws ExecutionException, CoreException, IOException {
+		createProjectDependency(source, target, true);
+	}
+	
+	private static void createProjectDependency(final IProject source, final IProject target, final boolean webLibDep) throws ExecutionException, CoreException, IOException {
+		IVirtualComponent sourceComp = ComponentCore.createComponent(source);
+		IVirtualComponent targetComp = ComponentCore.createComponent(target);
+		if (webLibDep) {
+			// add component and project refs
+			final IDataModel refdm = DataModelFactory.createDataModel(new CreateReferenceComponentsDataModelProvider());
+			final List targetCompList = (List) refdm.getProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENT_LIST);
+			targetCompList.add(targetComp);
+			refdm.setProperty(ICreateReferenceComponentsDataModelProperties.SOURCE_COMPONENT, sourceComp);
+			refdm.setProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENT_LIST, targetCompList);
+			refdm.setProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENTS_DEPLOY_PATH,"/WEB-INF/lib"); //$NON-NLS-1$
+			refdm.getDefaultOperation().execute(null, null);
+		} else {
+			// just add a manifest ref
+			final IVirtualComponent dependentComp = sourceComp;
+			final String dependentProjName = source.getName();
+			final String refactoredProjName = target.getName();
+			final IVirtualFile vf = dependentComp.getRootFolder().getFile(new Path(J2EEConstants.MANIFEST_URI) );
+			final IFile manifestmf = vf.getUnderlyingFile();
+			final IProgressMonitor monitor = new NullProgressMonitor();
+			final IDataModel updateManifestDataModel = DataModelFactory.createDataModel(new UpdateManifestDataModelProvider());
+			updateManifestDataModel.setProperty(UpdateManifestDataModelProperties.PROJECT_NAME, dependentProjName);
+			updateManifestDataModel.setBooleanProperty(UpdateManifestDataModelProperties.MERGE, false);
+			updateManifestDataModel.setProperty(UpdateManifestDataModelProperties.MANIFEST_FILE, manifestmf);
+			final ArchiveManifest manifest = getArchiveManifest(manifestmf);
+			String[] cp = manifest.getClassPathTokenized();
+			List cpList = new ArrayList();
+			String newCp = refactoredProjName + ".jar";//$NON-NLS-1$
+			for (int i = 0; i < cp.length; i++) {
+				if (!cp[i].equals(newCp)) {
+					cpList.add(cp[i]);
+				}
+			}
+			cpList.add(newCp);
+			updateManifestDataModel.setProperty(UpdateManifestDataModelProperties.JAR_LIST, cpList);
+			updateManifestDataModel.getDefaultOperation().execute(monitor, null );
+		}
+        ProjectUtil.waitForClasspathUpdate();
+        if (webLibDep)
+        	DependencyUtil.waitForComponentRefactoringJobs();
+	}
+	
+	public static ArchiveManifest getArchiveManifest(final IFile manifestFile) throws CoreException, IOException {
+		InputStream in = null;
+		try {
+			in = manifestFile.getContents();
+			ArchiveManifest mf = new ArchiveManifestImpl(new Manifest(in));
+			return mf;
+		} finally {
+			if (in != null) {
+				try {
+					in.close();
+				} catch (IOException weTried) {
+					//Ignore
+				}
+			}
+		}
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/dependency/tests/util/DependencyUtil.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/dependency/tests/util/DependencyUtil.java
new file mode 100644
index 0000000..f48fef3
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/dependency/tests/util/DependencyUtil.java
@@ -0,0 +1,281 @@
+/*******************************************************************************
+ * Copyright (c) 2007 BEA Systems, Inc 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:
+ *    BEA Systems, Inc - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.dependency.tests.util;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.Assert;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.jobs.IJobManager;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jst.j2ee.internal.J2EEConstants;
+import org.eclipse.jst.j2ee.project.JavaEEProjectUtilities;
+import org.eclipse.jst.j2ee.refactor.listeners.J2EEElementChangedListener;
+import org.eclipse.jst.j2ee.refactor.listeners.ProjectRefactoringListener;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
+import org.eclipse.wst.common.tests.OperationTestCase;
+import org.eclipse.wst.common.tests.ProjectUtility;
+import org.eclipse.wst.validation.internal.ConfigurationManager;
+import org.eclipse.wst.validation.internal.GlobalConfiguration;
+import org.eclipse.wst.validation.internal.ValidatorMetaData;
+
+/**
+ * Various utility methods.
+ */
+public class DependencyUtil {
+	
+	public static final IWorkspace ws = ResourcesPlugin.getWorkspace();
+	
+	/**
+	 * Retrieves a unique name.
+	 * @param prefix
+	 * @return
+	 */
+	public static String getUniqueName(final String prefix) {
+		return prefix + System.currentTimeMillis();
+	}
+	
+	public static void waitForValidationJobs() {
+		// Wait for all validation jobs to end
+		final IJobManager jobMgr = Platform.getJobManager();
+		IProject[] projects = ProjectUtility.getAllProjects();
+		for (int i = 0; i < projects.length; i++) {
+			final IProject p = projects[i];
+			waitForValidationJobs(p);
+		}
+	}
+	
+	public static void waitForValidationJobs(final IProject project) {
+		// Wait for all validation jobs to end
+		final IJobManager jobMgr = Platform.getJobManager();
+		final String family = project.getName() + OperationTestCase.VALIDATOR_JOB_FAMILY;
+		waitForJobs(family);
+	}
+	
+	public static void waitForProjectRefactoringJobs() {
+		waitForJobs(ProjectRefactoringListener.PROJECT_REFACTORING_JOB_FAMILY);
+	}
+		
+	public static void waitForComponentRefactoringJobs() {
+		waitForJobs(J2EEElementChangedListener.PROJECT_COMPONENT_UPDATE_JOB_FAMILY);
+	}
+	
+	/**
+	 * Waits for jobs in the specified family
+	 * @param family
+	 */
+	
+	public static void waitForJobs(final String family) {
+		waitForJobs((Object)family);
+	}
+	
+	/**
+	 * Waits for jobs in the specified family
+	 * @param family
+	 */
+	public static void waitForJobs(final Object family) {
+		final IJobManager jobMgr = Platform.getJobManager();
+        for (int i = 0; i < 1000; i++) {
+			final Job[] jobs = jobMgr.find(family);
+			if (jobs.length > 0) {
+				try {
+					jobMgr.join(family, null);
+				} catch (InterruptedException ie) {
+					// make one last check for jobs before exiting
+					i = 999;
+					continue;
+				}
+				break;
+			}
+			try {
+				Thread.sleep(10);
+			} catch (InterruptedException ie) {
+			}
+		}
+	}
+
+	 /**
+     * Disables all validators (if this is not done, getting error deleting/renaming projects
+     * because one of the validators is holding onto web.xml)
+     */
+    public static void disableValidation() throws InvocationTargetException {
+    	disableValidation(true);
+    }
+    
+    public static void enableValidation() throws InvocationTargetException {
+    	disableValidation(false);
+    }
+    
+    private static void disableValidation(final boolean disabled) throws InvocationTargetException {
+    	final GlobalConfiguration config = new GlobalConfiguration(ConfigurationManager.getManager().getGlobalConfiguration());
+    	config.setDisableAllValidation(disabled);
+    	config.passivate();
+    	config.store();
+	}
+    
+    /**
+     * Disables all validators except the specified validator
+     * @param project Project on which to disable the validator. Cannot be null.
+     * @param validatorToLeaveEnabled Name of the validator to leave enabled
+     * @throws CoreException Thrown if an error is encountered disabling the validator.
+     */
+    public static void disableValidation(final String validatorToLeaveEnabled) throws InvocationTargetException {
+        final GlobalConfiguration config = new GlobalConfiguration(ConfigurationManager.getManager().getGlobalConfiguration());
+        final List listVmd = new ArrayList();            
+        ValidatorMetaData[] enabledValidators = config.getEnabledValidators();
+            
+        // filter out validators to disable
+        boolean disabledSomeValidators = false;
+        for (int i = 0; i < enabledValidators.length; i++) {
+            final String uniqueName = enabledValidators[i].getValidatorUniqueName();
+            if (uniqueName.equals(validatorToLeaveEnabled)) {
+                listVmd.add(enabledValidators[i]);
+            } else {
+                disabledSomeValidators = true;
+            }
+        }
+            
+        if (disabledSomeValidators) {
+            config.setEnabledValidators((ValidatorMetaData[]) listVmd.toArray(new ValidatorMetaData[0]));                       
+            config.passivate();
+            config.store();   
+        }
+    }
+    
+    /**
+     * Adds a Java source path
+     * @param path project relative path.
+     * @throws CoreException
+     */
+    public static boolean addJavaSrcPath(final IProject project, final IPath path) throws CoreException {
+    	final IFolder folder = project.getFolder(path);
+    	if (!folder.exists()) {
+    		folder.create(true, true, null);
+    	}
+    	final IJavaProject jProject = JavaCore.create(project);
+    	final IPath absolutePath = project.getFullPath().append(path);
+    	final IClasspathEntry entry = JavaCore.newSourceEntry(absolutePath);
+    	IClasspathEntry[] cp = jProject.getRawClasspath();
+    	final List cpList = new ArrayList();
+    	boolean hasEntry = false;
+    	for (int i = 0; i < cp.length; i++) {
+    		final IClasspathEntry cpe = cp[i];
+    		if (cpe.getEntryKind() == IClasspathEntry.CPE_SOURCE) {
+    			if (cpe.getPath().equals(absolutePath)) {
+    				hasEntry = true;
+    				break;
+    			}
+    		}
+    		cpList.add(cp[i]);
+    	}
+    	if (!hasEntry) {
+    		cpList.add(entry);
+        	cp = (IClasspathEntry[]) cpList.toArray(new IClasspathEntry[cpList.size()]);
+        	jProject.setRawClasspath(cp, null);
+        	waitForComponentRefactoringJobs();
+        	return true;
+    	}
+    	return false;
+    }
+    
+    /**
+     * Adds a Java source path
+     * @param path project relative path.
+     * @throws CoreException
+     */
+    public static boolean removeJavaSrcPath(final IProject project, final IPath path) throws CoreException {
+    	final IJavaProject jProject = JavaCore.create(project);
+    	final IPath absolutePath = project.getFullPath().append(path);
+    	IClasspathEntry[] cp = jProject.getRawClasspath();
+    	final List cpList = new ArrayList();
+    	boolean removedEntry = false;
+    	for (int i = 0; i < cp.length; i++) {
+    		final IClasspathEntry cpe = cp[i];
+    		if (cpe.getEntryKind() != IClasspathEntry.CPE_SOURCE 
+    				|| !cpe.getPath().equals(absolutePath)) {
+    			cpList.add(cp[i]);
+    		} else {
+    			removedEntry = true;
+    		}
+    	}
+    	if (removedEntry) {
+    		cp = (IClasspathEntry[]) cpList.toArray(new IClasspathEntry[cpList.size()]);
+    		jProject.setRawClasspath(cp, null);
+        	waitForComponentRefactoringJobs();
+        	return true;
+    	}
+    	return false;
+    }
+    
+    /**
+     * Verifies the existence (or absence) of the specified component path mapping.
+     * @param project
+     * @param projectPath
+     * @param runtimePath
+     * @param exists
+     * @throws CoreException
+     */
+    public static void verifyComponentMapping(final IProject project, final IPath projectPath, final boolean exists) throws CoreException {
+    	IPath runtimePath = Path.ROOT;
+    	if (JavaEEProjectUtilities.isDynamicWebProject(project)) {
+    		// web projects map to WEB-INF/classes
+    		runtimePath = new Path(J2EEConstants.WEB_INF_CLASSES);
+    	}
+    	verifyComponentMapping(project, projectPath, runtimePath, exists);
+    	
+    }
+    
+    /**
+     * Verifies the existence (or absence) of the specified component path mapping.
+     * @param project
+     * @param projectPath
+     * @param runtimePath
+     * @param exists
+     * @throws CoreException
+     */
+    public static void verifyComponentMapping(final IProject project, final IPath projectPath, final IPath runtimePath, final boolean exists) throws CoreException {
+    	final IVirtualComponent c = ComponentCore.createComponent(project);
+    	c.create(0, null);
+    	IVirtualFolder dest = c.getRootFolder();
+    	if (!runtimePath.equals(Path.ROOT)) {
+    		dest = dest.getFolder(runtimePath);
+    	}
+    	IContainer[] mappedFolders = dest.getUnderlyingFolders();
+    	boolean hasMapping = false;
+    	for (int i = 0; i < mappedFolders.length; i++) {
+    		if (mappedFolders[i].getProjectRelativePath().equals(projectPath)) {
+    			hasMapping = true;
+    			break;
+    		}
+    	}
+    	if (exists) {
+    		Assert.assertTrue("Component mapping from " + projectPath + " to " + dest.toString() + " missing", hasMapping);
+    	} else { 
+    		Assert.assertFalse("Component mapping from " + projectPath + " to " + dest.toString() + " should not exist", hasMapping);
+    	}
+    }
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/dependency/tests/util/DependencyVerificationUtil.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/dependency/tests/util/DependencyVerificationUtil.java
new file mode 100644
index 0000000..d6b7159
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/dependency/tests/util/DependencyVerificationUtil.java
@@ -0,0 +1,330 @@
+/*******************************************************************************
+ * Copyright (c) 2007 BEA Systems, Inc 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:
+ *    BEA Systems, Inc - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.dependency.tests.util;
+
+import java.io.IOException;
+import java.util.Set;
+
+import junit.framework.Assert;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jst.j2ee.application.Application;
+import org.eclipse.jst.j2ee.application.Module;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveManifest;
+import org.eclipse.jst.j2ee.componentcore.util.EARArtifactEdit;
+import org.eclipse.jst.j2ee.internal.J2EEConstants;
+import org.eclipse.jst.j2ee.internal.common.classpath.J2EEComponentClasspathUpdater;
+import org.eclipse.jst.j2ee.project.EarUtilities;
+import org.eclipse.jst.j2ee.project.JavaEEProjectUtilities;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.internal.builder.IDependencyGraph;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualFile;
+import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
+
+/**
+ * Test utility class that programmatically verifies J2EE dependencies. 
+ */
+public class DependencyVerificationUtil {
+	
+	public static final IPath WEB_INF_LIB = new Path("/WEB-INF/lib"); //$NON-NLS-1$
+	public static final IPath ROOT = new Path("/"); //$NON-NLS-1$
+	
+	/**
+	 * Verifies the presence (or lack) of dependency between two projects as defined by the
+	 * DependencyManager.
+	 * @param source Source project
+	 * @param target Target project
+	 * @param hasDep True if a dependency should exist; false if not.
+	 * @throws Exception
+	 */
+	public static void verifyDependency(final IProject source, final IProject target, final boolean hasDep) {
+		Set<IProject> referencingComponents = IDependencyGraph.INSTANCE.getReferencingComponents(target);
+		boolean dep = false;
+		for (IProject project: referencingComponents) {
+			if (project.equals(source)) {
+				dep= true;
+				break;
+			}
+		}
+		if (hasDep) {
+			Assert.assertTrue("DependencyGraphManager does not report dependency between " + source + " and " + target, dep);
+		} else {
+			Assert.assertFalse("DependencyGraphManager incorrectly reporting dependency between " + source + " and " + target, dep);
+		}		
+	}
+	
+	/**
+	 * Verifies the presence (or lack) of a component reference between two projects.
+	 * @param source Source project
+	 * @param target Target project
+	 * @param runtimePath Runtime path of target project; null to not check path.
+	 * @param hasRef True if a component reference should exist; false if not.
+	 * @throws Exception
+	 */
+	public static void verifyComponentReference(final IProject source, final IProject target, final IPath runtimePath, final boolean hasRef) {
+		IVirtualComponent sourceComp = ComponentCore.createComponent(source);
+		IVirtualReference[] refs = sourceComp.getReferences();
+		boolean ref = false;
+		for (int i = 0; i < refs.length; i++) {
+			if (refs[i].getReferencedComponent().getProject().equals(target)) {
+				if (runtimePath == null || refs[i].getRuntimePath().equals(runtimePath)) {
+					ref = true;
+					break;
+				}
+			}
+		}
+		if (hasRef) {
+			Assert.assertTrue("Source project " + source + " missing component reference to " + target, ref);
+		} else {
+			Assert.assertFalse("Source project " + source + " still has component reference to " + target, ref);			
+		}
+	}
+	
+	/**
+	 * Verifies the presence (or lack) or a static project reference between two projects.
+	 * @param source Source project.
+	 * @param target Target project.
+	 * @param hasRef True if a project reference should exist; false if not.
+	 * @throws Exception
+	 */
+	public static void verifyProjectReference(final IProject source, final IProject target, final boolean hasRef) throws CoreException {
+		final IProjectDescription desc = source.getDescription();
+		IProject[] refs = desc.getReferencedProjects();
+		boolean ref = false;
+		for (int i = 0; i < refs.length; i++) {
+			if (refs[i].equals(target)) {
+				ref = true;
+				break;
+			}
+		}
+		if (hasRef) {
+			Assert.assertTrue("Source project " + source + " missing project reference to " + target, ref);
+		} else {
+			Assert.assertFalse("Source project " + source + " still has project reference to " + target, ref);			
+		}
+	}
+	
+	/**
+	 * Verifies the presence (or lack) of the specified MANIFEST.MF entry.
+	 * @param source Source project
+	 * @param entry Manifest entry.
+	 * @param hasEntry True if the entry should exist, false if not.
+	 * @throws Exception
+	 */
+	public static void verifyManifestReference(final IProject source, final String entry, final boolean hasEntry) throws CoreException, IOException {
+		final IVirtualComponent sourceComp = ComponentCore.createComponent(source);
+		final IVirtualFile vf = sourceComp.getRootFolder().getFile(new Path(J2EEConstants.MANIFEST_URI) );
+		final IFile manifestmf = vf.getUnderlyingFile();
+		final ArchiveManifest manifest = DependencyCreationUtil.getArchiveManifest(manifestmf);
+		String[] cp = manifest.getClassPathTokenized();
+		boolean hasManifestRef = false;
+		for (int i = 0; i < cp.length; i++) {
+			if (cp[i].equals(entry)) {
+				hasManifestRef = true;
+			}
+		}
+		if (hasEntry) {
+			Assert.assertTrue("Source project " + source + " missing MANIFEST.MF entry " + entry, hasManifestRef);
+		} else {
+			Assert.assertFalse("Source project " + source + " still has MANIFEST.MF entry " + entry, hasManifestRef);			
+		}
+	}
+	
+	/**
+	 * Verifies the presence of an application.xml reference in the specified EAR project for the
+	 * specified module project.
+	 * @param earProject The EAR project.
+	 * @param moduleProject The module project.
+	 * @param moduleURI Ignored unless hasRef is false.
+	 * @param hasRef True if there should be a ref, false if not
+	 * @return Computed module URI or null if one was passed in.
+	 * @throws Exception
+	 */
+	public static String verifyApplicationXMLReference(final IProject earProject, final IProject moduleProject, final String moduleURI, final boolean hasRef) throws CoreException {
+		EARArtifactEdit earEdit = null;
+		try {
+			earEdit = EARArtifactEdit.getEARArtifactEditForRead(earProject);
+			Assert.assertTrue(earEdit != null);
+			Application application = earEdit.getApplication();
+			if (hasRef) {
+				IVirtualComponent moduleComp = ComponentCore.createComponent(moduleProject);
+				String computedURI = earEdit.getModuleURI(moduleComp);
+				Assert.assertTrue("EAR's application.xml missing module element for " + moduleURI, 
+						application.getFirstModule(computedURI) != null);
+				return computedURI;
+			} else {
+				Module module = application.getFirstModule(moduleURI);
+				Assert.assertTrue("EAR's application.xml should not have a module element for " + moduleURI, 
+						module == null);
+			}
+		} finally {
+			if (earEdit != null)
+				earEdit.dispose();
+		}
+		return null;
+	}
+	
+	public static void waitForClasspathUpdate() {
+		Job [] jobs = Job.getJobManager().find(J2EEComponentClasspathUpdater.MODULE_UPDATE_JOB_NAME);
+		if(jobs.length > 0){
+			try {
+				for (int i = 0; i < jobs.length; i++){
+					if(jobs[i].getName().equals(J2EEComponentClasspathUpdater.MODULE_UPDATE_JOB_NAME))
+						jobs[i].join();
+				}
+			} catch (InterruptedException e) {
+				e.printStackTrace();
+			}
+		}
+	}
+	
+	/**
+	 * Verifies that the specified target project is visible (or not visible) to the source project via the Java build path 
+	 * @param source Source project.
+	 * @param target Target project.
+	 * @param hasRef True if the target project should be on the resolved classpath, false if not.
+	 * @throws Exception
+	 */
+	public static void verifyClasspathReference(final IProject source, final IProject target, final boolean hasRef) throws CoreException {
+		waitForClasspathUpdate();
+		boolean onClasspath = hasClasspathReference(source, target);
+		if (hasRef) {
+			Assert.assertTrue("Project " + target + " missing from resolved classpath of project " + source, onClasspath);
+		} else {
+			Assert.assertFalse("Project " + target + " should not be on resolved classpath of project " + source, onClasspath);
+		}	
+	}
+    
+    public static boolean hasClasspathReference(final IProject source, final IProject target) throws CoreException {
+        IJavaProject javaProject = JavaCore.create(source);
+        IClasspathEntry[] cp = javaProject.getResolvedClasspath(true); // ignore unresolvable entries
+        boolean onClasspath = false;
+        for (int i = 0; i < cp.length; i++) {
+            if (cp[i].getEntryKind() == IClasspathEntry.CPE_PROJECT 
+                    && cp[i].getPath().equals(target.getFullPath())) {
+                onClasspath= true;
+                break;
+            }
+        }
+        return onClasspath;
+    }
+    
+	
+	public static String verifyEARDependency(final IProject earProject, final IProject childProject, final boolean moduleRef) throws CoreException {
+		// .project dep
+		verifyProjectReference(earProject, childProject, true);
+		// .component dep
+		
+		IPath runtimePath = ROOT;
+		if(EarUtilities.isJEEComponent(ComponentCore.createComponent(earProject)) &&  JavaEEProjectUtilities.isUtilityProject(childProject)){
+			runtimePath = new Path("/lib");
+		}
+		
+		verifyComponentReference(earProject, childProject, runtimePath, true);
+		// application.xml ref
+		String moduleURI = null;
+		if (moduleRef) {
+			moduleURI = verifyApplicationXMLReference(earProject, childProject, null, true);
+		}
+		// DependencyGraphManager
+		verifyDependency(earProject, childProject, true);
+		
+		return moduleURI;
+	}
+
+	public static void verifyEARDependencyChanged(final IProject earProject, final IProject oldChildProject, final IProject newChildProject) throws CoreException {
+		verifyEARDependencyChanged(earProject, oldChildProject, null, newChildProject);
+	}
+	
+	public static void verifyEARDependencyChanged(final IProject earProject, final IProject oldChildProject, final String oldModuleURI, final IProject newChildProject) throws CoreException {
+		verifyEARDependency(earProject, newChildProject, oldModuleURI != null);
+		verifyEARDependencyRemoved(earProject, oldChildProject, oldModuleURI);
+	}
+	
+	public static void verifyEARDependencyRemoved(final IProject earProject, final IProject childProject) throws CoreException {
+		verifyEARDependencyRemoved(earProject, childProject, null);
+	}
+	
+	public static void verifyEARDependencyRemoved(final IProject earProject, final IProject childProject, final String oldModuleURI) throws CoreException {
+		// .component dep
+		verifyComponentReference(earProject, childProject, ROOT, false);
+		// application.xml ref
+		if (oldModuleURI != null) {
+			verifyApplicationXMLReference(earProject, childProject, oldModuleURI, false);			
+		}
+		// DependencyGraphManager
+		verifyDependency(earProject, childProject, false);
+		// .project dep
+		verifyProjectReference(earProject, childProject, false);
+	}
+	
+	public static void verifyModuleDependency(final IProject source, final IProject target) throws CoreException, IOException {
+		// verify MANIFEST.MF dep added
+		verifyManifestReference(source, target.getName() + ".jar", true); //$NON-NLS-1$
+		// verify classpath ref (will be via "EAR Libraries")
+		verifyClasspathReference(source, target, true);
+		// DependencyGraphManager only tracks references defined by the .settings/org.eclipse.wst.common.component file
+		// References defined via manifests will not be mapped in the IDependencyGraph
+		//verifyDependency(source, target, true);
+	}
+	
+	public static void verifyModuleDependencyChanged(final IProject source, final IProject oldTarget, final IProject newTarget) throws CoreException, IOException {
+		verifyModuleDependency(source, newTarget);
+		verifyModuleDependencyRemoved(source, oldTarget);
+	}
+	
+	public static void verifyModuleDependencyRemoved(final IProject source, final IProject target) throws CoreException, IOException {
+		// verify MANIFEST.MF dep removed
+		verifyManifestReference(source, target.getName()+ ".jar", false);
+		// verify classpath ref removed 
+		verifyClasspathReference(source, target, false);
+		// DependencyGraphManager
+		verifyDependency(source, target, false);
+	}
+	
+	public static void verifyWebLibDependency(final IProject source, final IProject target) throws CoreException {
+		// .project dep
+		verifyProjectReference(source, target, true);
+		// .component dep
+		verifyComponentReference(source, target, WEB_INF_LIB, true);
+		// verify classpath ref (will be via "EAR Libraries")
+		verifyClasspathReference(source, target, true);
+		// DependencyGraphManager
+		verifyDependency(source, target, true);
+	}
+	
+	public static void verifyWebLibDependencyChanged(final IProject source, final IProject oldTarget, final IProject newTarget) throws CoreException {
+		verifyWebLibDependency(source, newTarget);
+		verifyWebLibDependencyRemoved(source, oldTarget);
+	}
+	
+	public static void verifyWebLibDependencyRemoved(final IProject source, final IProject target) throws CoreException {
+		// verify changed .project dep
+		verifyProjectReference(source, target, false);
+		// .component dep
+		verifyComponentReference(source, target, WEB_INF_LIB, false);
+		// verify classpath ref removed 
+		verifyClasspathReference(source, target, false);
+		// DependencyGraphManager
+		verifyDependency(source, target, false);
+	}
+	
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/dependency/tests/util/ProjectUtil.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/dependency/tests/util/ProjectUtil.java
new file mode 100644
index 0000000..a5b73b2
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/dependency/tests/util/ProjectUtil.java
@@ -0,0 +1,382 @@
+/*******************************************************************************
+ * Copyright (c) 2007 BEA Systems, Inc 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:
+ *    BEA Systems, Inc - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.dependency.tests.util;
+
+import java.util.Map;
+
+import junit.framework.Assert;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.IWorkspaceRunnable;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.jobs.IJobChangeEvent;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.core.runtime.jobs.JobChangeAdapter;
+import org.eclipse.jst.j2ee.ejb.project.operations.IEjbFacetInstallDataModelProperties;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.j2ee.internal.common.J2EEVersionUtil;
+import org.eclipse.jst.j2ee.internal.common.classpath.J2EEComponentClasspathUpdater;
+import org.eclipse.jst.j2ee.internal.ejb.project.operations.EjbFacetProjectCreationDataModelProvider;
+import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
+import org.eclipse.jst.j2ee.internal.web.archive.operations.WebFacetProjectCreationDataModelProvider;
+import org.eclipse.jst.j2ee.project.JavaEEProjectUtilities;
+import org.eclipse.jst.j2ee.project.facet.EARFacetProjectCreationDataModelProvider;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetConstants;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetInstallDataModelProperties;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEModuleFacetInstallDataModelProperties;
+import org.eclipse.jst.j2ee.project.facet.UtilityProjectCreationDataModelProvider;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties.FacetDataModelMap;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.tests.OperationTestCase;
+
+/**
+ * Test utility class that contains code for manipulating projects.
+ * DO NOT verify dependencies between EAR and module projects.
+ */
+public class ProjectUtil {
+	
+	public static final IWorkspace ws = ResourcesPlugin.getWorkspace();
+
+	/**
+	 * Gets the project for the given name. Does not test for existence.
+	 * @param name
+	 * @return
+	 */
+	public static IProject getProject(final String name) {
+		return ws.getRoot().getProject(name);
+	}
+
+	/**
+	 * Deletes the specified project if it exists and waits for all refactoring
+	 * jobs.
+	 */
+	public static void deleteProject(final IProject project)
+	throws CoreException, InterruptedException {
+		if (!project.exists()) {
+			return;
+		}
+
+		IWorkspaceRunnable workspaceRunnable = new IWorkspaceRunnable() {
+			public void run(IProgressMonitor pm) throws CoreException {
+				project.delete(true, null);
+			}
+		};
+		
+		//waitForValidationJobs();
+		ResourcesPlugin.getWorkspace().run(workspaceRunnable, null);
+		DependencyUtil.waitForProjectRefactoringJobs();
+		ProjectUtil.waitForClasspathUpdate();
+	}
+
+	/**
+	 * Renames the specified project if it exists and waits for all refactoring
+	 * jobs.
+	 * @param project
+	 * @param newName
+	 * @return Renamed project.
+	 */
+	public static IProject renameProject(final IProject project, final String newName) 
+	throws CoreException, InterruptedException {
+		final IProject newProject = getProject(newName);
+		Assert.assertFalse("Cannot rename project " + project + ", a project already exists with name " + newName, newProject.exists());
+		Assert.assertTrue("Project " + project + " does not exist, cannot rename.", project.exists());
+		
+		IWorkspaceRunnable workspaceRunnable = new IWorkspaceRunnable() {
+			public void run(IProgressMonitor pm) throws CoreException {
+				project.move(newProject.getFullPath(), true, null);
+			}
+		};
+		
+		//waitForValidationJobs();
+		ResourcesPlugin.getWorkspace().run(workspaceRunnable, null);
+		DependencyUtil.waitForProjectRefactoringJobs();
+		DependencyUtil.waitForComponentRefactoringJobs();
+        ProjectUtil.waitForClasspathUpdate();
+		return newProject;
+	}
+	
+	/**
+	 * Creates an EAR project.
+	 * @param name EAR name.
+	 * @return The EAR project.
+	 * @throws Exception
+	 */
+	public static IProject createEARProject(final String name) throws Exception {
+		return createEARProject(name, false);
+    }
+	
+	/**
+	 * Creates an EAR project.
+	 * @param name EAR name.
+	 * @param waitForBuildToComplete True if the call should wait for the subsequent build to complete.
+	 * @return The EAR project.
+	 * @throws Exception
+	 */
+	public static IProject createEARProject(final String name, final boolean waitForBuildToComplete) throws Exception {
+		return createEARProject(name, J2EEVersionConstants.J2EE_1_4_ID, waitForBuildToComplete);
+    }
+	
+	/**
+	 * Creates an EAR project.
+	 * @param name EAR name.
+	 * @param waitForBuildToComplete True if the call should wait for the subsequent build to complete.
+	 * @param 
+	 * @return The EAR project.
+	 * @throws Exception
+	 */
+	public static IProject createEARProject(final String name, final int facetVersion, final boolean waitForBuildToComplete) throws Exception {
+		final IDataModel dataModel = getEARCreationDataModel(name, facetVersion);
+		return createAndVerify(dataModel, name, J2EEProjectUtilities.ENTERPRISE_APPLICATION, null, waitForBuildToComplete);
+	}
+	
+	/**
+	 * Creates a web project with optional EAR association.
+	 * @param name Web name.
+	 * @param earName EAR name; null for no EAR association.
+	 * @return The Web project.
+	 * @throws Exception
+	 */
+	public static IProject createWebProject(final String name, final String earName) throws Exception {
+		return createWebProject(name, earName, false);
+    }
+	
+	
+	/**
+	 * Creates a web project with optional EAR association.
+	 * @param name Web name.
+	 * @param earName EAR name; null for no EAR association.
+	 * @return The Web project.
+	 * @throws Exception
+	 */
+	public static IProject createWebProject(final String name, final String earName, final boolean waitForBuildToComplete) throws Exception {
+		return createWebProject(name, earName, J2EEVersionConstants.SERVLET_2_4, waitForBuildToComplete);
+    }
+	
+	/**
+	 * Creates a web project with optional EAR association.
+	 * @param name Web name.
+	 * @param earName EAR name; null for no EAR association.
+	 * @param facetVersion The facet version.
+	 * @return The Web project.
+	 * @throws Exception
+	 */
+	public static IProject createWebProject(final String name, final String earName, final int facetVersion, final boolean waitForBuildToComplete) throws Exception {
+		final IDataModel dataModel = getWebCreationDataModel(name, earName, facetVersion);
+		return createAndVerify(dataModel, name, J2EEProjectUtilities.DYNAMIC_WEB, earName, waitForBuildToComplete);
+    }
+	
+	/**
+	 * Creates a Utility project with optional EAR association.
+	 * @param name Util name.
+	 * @param earName EAR name; null for no EAR association.
+	 * @return The utility project.
+	 * @throws Exception
+	 */
+	public static IProject createUtilityProject(final String name, final String earName) throws Exception {
+		return createUtilityProject(name, earName, false);
+	}
+	
+	/**
+	 * Creates a Utility project with optional EAR association.
+	 * @param name Util name.
+	 * @param earName EAR name; null for no EAR association.
+	 * @return The utility project.
+	 * @throws Exception
+	 */
+	public static IProject createUtilityProject(final String name, final String earName, final boolean waitForBuildToComplete) throws Exception {
+		final IDataModel dataModel = getUtilityCreationDataModel(name, earName);
+		return createAndVerify(dataModel, name, J2EEProjectUtilities.UTILITY, earName, waitForBuildToComplete);
+	}
+	
+	/**
+	 * Creates an EJB project with optional EAR association.
+	 * @param name EJB name.
+	 * @param earName EAR name; null for no EAR association.
+	 * @return The EJB project.
+	 * @throws Exception
+	 */
+	public static IProject createEJBProject(final String name, final String earName) throws Exception {
+		return createEJBProject(name, earName, false);
+	}
+	
+	/**
+	 * Creates an EJB project with optional EAR association.
+	 * @param name EJB name.
+	 * @param earName EAR name; null for no EAR association.
+	 * @return The EJB project.
+	 * @throws Exception
+	 */
+	public static IProject createEJBProject(final String name, final String earName, final boolean waitForBuildToComplete) throws Exception {
+		return createEJBProject(name, earName, J2EEVersionConstants.EJB_2_1_ID, waitForBuildToComplete);
+	}
+	
+	/**
+	 * Creates an EJB project with optional EAR association.
+	 * @param name EJB name.
+	 * @param earName EAR name; null for no EAR association.
+	 * @param facetVersion The facet version.
+	 * @return The EJB project.
+	 * @throws Exception
+	 */
+	public static IProject createEJBProject(final String name, final String earName, final int facetVersion, final boolean waitForBuildToComplete) throws Exception {
+		final IDataModel dataModel = getEJBCreationDataModel(name, earName, facetVersion);
+		return createAndVerify(dataModel, name, J2EEProjectUtilities.EJB, earName, waitForBuildToComplete);
+	}
+	
+	/**
+	 * Creates an EJB project with optional EAR association.
+	 * 
+	 * @param name
+	 *            EJB name.
+	 * @param earName
+	 *            EAR name; null for no EAR association.
+	 * @param facetModelProperties
+	 *            this properties will be added to the facet model retrieved by
+	 *            <code> FacetDataModelMap facetMap = (FacetDataModelMap) dataModel
+				.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
+		IDataModel facetModel = facetMap.getFacetDataModel(IJ2EEFacetConstants.EJB);</code>
+	 *            This gives you the opportunity to control the creation of the
+	 *            project without introducing new create* methods.
+	 * @param facetVersion
+	 *            The facet version.
+	 * @return The EJB project.
+	 * @throws Exception
+	 */
+	public static IProject createEJBProject(final String name, final String earName,
+			Map<String, Object> facetModelProperties, final int facetVersion, final boolean waitForBuildToComplete)
+			throws Exception {
+		final IDataModel dataModel = getEJBCreationDataModel(name, earName, facetVersion);
+		FacetDataModelMap facetMap = (FacetDataModelMap) dataModel
+				.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
+		IDataModel facetModel = facetMap.getFacetDataModel(IJ2EEFacetConstants.EJB);
+		for (Map.Entry<String, Object> entry : facetModelProperties.entrySet()) {
+			facetModel.setProperty(entry.getKey(), entry.getValue());
+		}
+		return createAndVerify(dataModel, name, J2EEProjectUtilities.EJB, earName, waitForBuildToComplete);
+	}
+	
+	/**
+	 * Creates an EJB project with optional EAR association.
+	 * @param name EJB name.
+	 * @param earName EAR name; null for no EAR association.
+	 * @param clientName Client name; null for no client. 
+	 * @param facetVersion The facet version.
+	 * @param waitForBuildToComplete
+	 * @return The EJB project.
+	 * @throws Exception
+	 */
+	public static IProject createEJBProject(final String name, final String earName, final String clientName,
+			final int facetVersion, final boolean waitForBuildToComplete) throws Exception {
+		final IDataModel dataModel = getEJBCreationDataModel(name, earName, facetVersion);
+		FacetDataModelMap facetMap = (FacetDataModelMap) dataModel
+				.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
+		IDataModel facetModel = facetMap.getFacetDataModel(IJ2EEFacetConstants.EJB);
+		facetModel.setBooleanProperty(IJ2EEFacetInstallDataModelProperties.GENERATE_DD, true);
+		// only create client if given a client name, and is added to EAR
+		if (clientName != null && earName != null) {
+			facetModel.setBooleanProperty(IEjbFacetInstallDataModelProperties.CREATE_CLIENT, true);
+			facetModel.setStringProperty(IEjbFacetInstallDataModelProperties.CLIENT_NAME, clientName);
+		}
+		return createAndVerify(dataModel, name, J2EEProjectUtilities.EJB, earName, waitForBuildToComplete);
+	}
+
+	private static IDataModel getEARCreationDataModel(final String name, final int facetVersion) {
+		final IDataModel model =  DataModelFactory.createDataModel(new EARFacetProjectCreationDataModelProvider());
+		configure(model, name, J2EEProjectUtilities.ENTERPRISE_APPLICATION, null, facetVersion, false);
+		return model;
+	}
+	
+	private static IDataModel getWebCreationDataModel(final String name, final String earName, final int facetVersion) {
+		final IDataModel model =  DataModelFactory.createDataModel(new WebFacetProjectCreationDataModelProvider());
+		configure(model, name, J2EEProjectUtilities.DYNAMIC_WEB, earName, facetVersion, facetVersion == J2EEVersionConstants.SERVLET_2_5);
+		return model;
+	}
+		
+	private static IDataModel getUtilityCreationDataModel(final String name, final String earName) {
+		final IDataModel model =  DataModelFactory.createDataModel(new UtilityProjectCreationDataModelProvider());
+		configure(model, name, J2EEProjectUtilities.UTILITY, earName, 0, false);
+		return model;
+	}
+	
+	private static IDataModel getEJBCreationDataModel(final String name, final String earName, final int facetVersion) {
+		final IDataModel model =  DataModelFactory.createDataModel(new EjbFacetProjectCreationDataModelProvider());
+		configure(model, name, J2EEProjectUtilities.EJB, earName, facetVersion, facetVersion == J2EEVersionConstants.EJB_3_0_ID);
+		return model;
+	}
+	
+	private static void configure(final IDataModel model, final String name, final String facet, final String earName, final int facetVersion, final boolean isJEE5) {
+		model.setProperty(IFacetProjectCreationDataModelProperties.FACET_PROJECT_NAME, name);
+		final FacetDataModelMap map = (FacetDataModelMap) model.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
+		IDataModel facetDM = map.getFacetDataModel(facet);
+		if (earName != null) {
+			facetDM.setBooleanProperty(IJ2EEModuleFacetInstallDataModelProperties.ADD_TO_EAR, true);
+			facetDM.setProperty(IJ2EEModuleFacetInstallDataModelProperties.EAR_PROJECT_NAME, earName);
+		}
+		if (facetVersion != 0) {
+			String versionText = J2EEVersionUtil.convertVersionIntToString(facetVersion);
+			facetDM.setStringProperty(IFacetDataModelProperties.FACET_VERSION_STR, versionText);
+		}
+		if (isJEE5) {
+			facetDM = map.getFacetDataModel(J2EEProjectUtilities.JAVA);
+			facetDM.setStringProperty(IFacetDataModelProperties.FACET_VERSION_STR, J2EEVersionConstants.VERSION_5_0_TEXT);
+		}
+	}
+
+	private static IProject createAndVerify(final IDataModel model, final String projectName, final String type, final String earName, final boolean waitForBuildToComplete) throws Exception {
+		// run the data model operation to create the projects
+		OperationTestCase.runAndVerify(model,false,true, waitForBuildToComplete);
+        // wait for any classpath update jobs
+        ProjectUtil.waitForClasspathUpdate();
+		// verify the EAR (if one was created)
+	    verifyProject(earName, J2EEProjectUtilities.ENTERPRISE_APPLICATION);
+	    // verify the module project
+	    return verifyProject(projectName, type);
+	}
+	
+	private static IProject verifyProject(final String projectName, final String type) {
+		if (projectName != null) {
+            final IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
+            Assert.assertTrue("Failed to create project " + projectName, project.exists());
+            Assert.assertTrue("Project not is of type " + type, JavaEEProjectUtilities.isProjectOfType(project, type));
+            return project;
+        }	
+		return null;
+	}
+
+	public static void waitForClasspathUpdate() {
+		DependencyVerificationUtil.waitForClasspathUpdate();
+    }
+
+	private static ClasspathUpdateJobListener listener = new ClasspathUpdateJobListener();
+    
+	private static class ClasspathUpdateJobListener extends JobChangeAdapter {
+
+		public boolean isDone = false;
+
+		public ClasspathUpdateJobListener() {
+			super();
+			Job.getJobManager().addJobChangeListener(this);
+		}
+
+		public void done(IJobChangeEvent event) {
+			Job job = event.getJob();
+			if (job.getName().equals(J2EEComponentClasspathUpdater.MODULE_UPDATE_JOB_NAME)) {
+				isDone = true;
+			}
+		}
+    }
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/AppClientArtifactEditFVTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/AppClientArtifactEditFVTest.java
new file mode 100644
index 0000000..737fdea
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/AppClientArtifactEditFVTest.java
@@ -0,0 +1,110 @@
+package org.eclipse.jst.j2ee.flexible.project.apitests.artifactedit;
+
+import java.io.File;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jst.j2ee.applicationclient.componentcore.util.AppClientArtifactEdit;
+import org.eclipse.jst.j2ee.client.ApplicationClient;
+import org.eclipse.wst.common.componentcore.internal.ComponentResource;
+import org.eclipse.wst.common.componentcore.internal.ComponentcoreFactory;
+import org.eclipse.wst.common.internal.emfworkbench.integration.EditModelEvent;
+import org.eclipse.wst.common.internal.emfworkbench.integration.EditModelListener;
+
+public class AppClientArtifactEditFVTest extends TestCase {
+
+	private IProject appClientProject;
+	private String appClientModuleName;
+	
+
+	public AppClientArtifactEditFVTest() {
+		super();
+		if (TestWorkspace.init()) {
+			appClientProject = TestWorkspace.getTargetProject(TestWorkspace.APP_CLIENT_PROJECT_NAME);
+			appClientModuleName = TestWorkspace.APP_CLIENT_MODULE_NAME;
+		} else {
+			fail();
+
+		}
+	}
+
+	public void testCreationDisposeFunction() {
+		AppClientArtifactEdit edit = null;
+		try {
+			edit = AppClientArtifactEdit.getAppClientArtifactEditForWrite(appClientProject);
+			edit.addListener(new EditModelListener() {
+
+				public void editModelChanged(EditModelEvent anEvent) {
+					pass();
+
+				}
+			});
+			ApplicationClient client = edit.getApplicationClient();
+			updateClient(client);
+			edit.save(new NullProgressMonitor());
+
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+
+	private void updateClient(ApplicationClient client) {
+		client.setDescription(TestWorkspace.FVT_DESCRIPTION);
+		client.setDisplayName(TestWorkspace.FVT_DISPLAY_NAME);
+		client.setLargeIcon(TestWorkspace.FVT_LARGE_ICON);
+
+	}
+
+	private void pass() {
+		assertTrue(true);
+	}
+
+	public void testPersistenceFunction() {
+		AppClientArtifactEdit edit = null;
+		try {
+			edit = AppClientArtifactEdit.getAppClientArtifactEditForWrite(appClientProject);
+			ApplicationClient appClient = edit.getApplicationClient();
+			pass(appClient);
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+
+	private static void pass(ApplicationClient appClient) {
+		boolean pass = appClient.getDescription().equals(TestWorkspace.FVT_DESCRIPTION) && appClient.getDisplayName().equals(TestWorkspace.FVT_DISPLAY_NAME) && appClient.getLargeIcon().equals(TestWorkspace.FVT_LARGE_ICON);
+		assertTrue(pass);
+	}
+
+	private void validateResource() {
+		AppClientArtifactEdit edit = null;
+		try {
+			edit = AppClientArtifactEdit.getAppClientArtifactEditForWrite(appClientProject);
+			//EList resourceList = wbComponent.getResources();
+			//for (Iterator iter = resourceList.iterator(); iter.hasNext();) {
+			//}
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+
+		}
+	}
+
+	private ComponentResource createResourceComponent() {
+		ComponentResource resourceComponent = ComponentcoreFactory.eINSTANCE.createComponentResource();
+		File testFile = TestWorkspace.ARTIFACT_EDIT_FVT_RESOURCE_PATH.toFile();
+		if (testFile.exists()) {
+			resourceComponent.setRuntimePath(TestWorkspace.ARTIFACT_EDIT_FVT_RESOURCE_PATH);
+			resourceComponent.setSourcePath(TestWorkspace.ARTIFACT_EDIT_FVT_RESOURCE_PATH);
+		} else {
+			fail("Missing: TestWorkspace.ARTIFACT_EDIT_FVT_RESOURCE_PATH");
+		}
+		return resourceComponent;
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/AppClientArtifactEditTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/AppClientArtifactEditTest.java
new file mode 100644
index 0000000..eb4baa2
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/AppClientArtifactEditTest.java
@@ -0,0 +1,580 @@
+package org.eclipse.jst.j2ee.flexible.project.apitests.artifactedit;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.jst.j2ee.application.Module;
+import org.eclipse.jst.j2ee.applicationclient.componentcore.util.AppClientArtifactEdit;
+import org.eclipse.jst.j2ee.internal.common.XMLResource;
+import org.eclipse.wst.common.componentcore.ArtifactEdit;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.internal.ArtifactEditModel;
+import org.eclipse.wst.common.componentcore.internal.StructureEdit;
+import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.frameworks.internal.operations.IOperationHandler;
+import org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchContext;
+import org.eclipse.wst.common.internal.emfworkbench.integration.EditModelEvent;
+import org.eclipse.wst.common.internal.emfworkbench.integration.EditModelListener;
+
+public class AppClientArtifactEditTest extends TestCase {
+	private IProject appClientProject;
+	private String appClientModuleName;
+	public static final String EDIT_MODEL_ID = "jst.app_client"; //$NON-NLS-1$
+	private AppClientArtifactEdit artifactEditForRead;
+	private ArtifactEditModel artifactEditModelForRead;
+	private EditModelListener emListener;
+
+
+
+	public class ApplicationArtifactTestSub extends AppClientArtifactEdit {
+
+		public ApplicationArtifactTestSub(ArtifactEditModel anArtifactEditModel) {
+			super(anArtifactEditModel);
+		}
+
+		protected void addAppClientIfNecessary(XMLResource aResource) {
+			super.addAppClientIfNecessary(aResource);
+		}
+	}
+
+	public void testAddCleint() {
+		new ApplicationArtifactTestSub(null);
+
+	}
+
+	private IOperationHandler handler = new IOperationHandler() {
+
+
+		public boolean canContinue(String message) {
+			return false;
+		}
+
+
+		public boolean canContinue(String message, String[] items) {
+
+			return false;
+		}
+
+		public int canContinueWithAllCheck(String message) {
+
+			return 0;
+		}
+
+		public int canContinueWithAllCheckAllowCancel(String message) {
+
+			return 0;
+		}
+
+		public void error(String message) {
+
+
+		}
+
+		public void inform(String message) {
+
+
+		}
+
+
+		public Object getContext() {
+
+			return null;
+		}
+	};
+
+
+
+	public AppClientArtifactEditTest() {
+		super();
+
+		if (TestWorkspace.init()) {
+			appClientProject = TestWorkspace.getTargetProject(TestWorkspace.APP_CLIENT_PROJECT_NAME);
+			appClientModuleName = TestWorkspace.APP_CLIENT_MODULE_NAME;
+		} else {
+			fail();
+
+		}
+	}
+
+	public void testGetJ2EEVersion() {
+		AppClientArtifactEdit edit = null;
+		try {
+			edit = AppClientArtifactEdit.getAppClientArtifactEditForRead(appClientProject);
+			int version = edit.getJ2EEVersion();
+			Integer integer = new Integer(version);
+			assertTrue(integer.equals(TestWorkspace.APP_CLIENT_PROJECT_VERSION));
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+
+
+
+	public void testGetDeploymentDescriptorResource() {
+		AppClientArtifactEdit edit = null;
+		try {
+			edit = AppClientArtifactEdit.getAppClientArtifactEditForRead(appClientProject);
+			String uri = edit.getDeploymentDescriptorResource().getURI().toString();
+			assertTrue(uri.equals(TestWorkspace.APP_CLIENT_DD_RESOURCE_URI));
+
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+
+	public void testGetDeploymentDescriptorRoot() {
+		AppClientArtifactEdit edit = null;
+		try {
+			edit = AppClientArtifactEdit.getAppClientArtifactEditForRead(appClientProject);
+			EObject object = edit.getDeploymentDescriptorRoot();
+			assertNotNull(object);
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+
+
+	public void testCreateModelRoot() {
+		AppClientArtifactEdit edit = null;
+		try {
+			edit = AppClientArtifactEdit.getAppClientArtifactEditForRead(appClientProject);
+			EObject object = edit.createModelRoot();
+			assertNotNull(object);
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+
+	public void testCreateModelRootint() {
+		AppClientArtifactEdit edit = null;
+		try {
+			edit = AppClientArtifactEdit.getAppClientArtifactEditForRead(appClientProject);
+			EObject object = edit.createModelRoot(14);
+			assertNotNull(object);
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+
+	public void testAppClientArtifactEditComponentHandleboolean() {
+		AppClientArtifactEdit edit = null;
+		try {
+			edit = new AppClientArtifactEdit(appClientProject, true);
+			assertNotNull(edit);
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+
+	/*
+	 * Class under test for void AppClientArtifactEdit(ArtifactEditModel)
+	 */
+	public void testAppClientArtifactEditArtifactEditModel() {
+		AppClientArtifactEdit edit = new AppClientArtifactEdit(getArtifactEditModelforRead());
+		assertNotNull(edit);
+		edit.dispose();
+	}
+
+	// /////////////////BUG//////////////
+
+	public void testGetApplicationClientXmiResource() {
+		AppClientArtifactEdit edit = null;
+		try {
+			edit = AppClientArtifactEdit.getAppClientArtifactEditForRead(appClientProject);
+			String uri = edit.getApplicationClientXmiResource().getURI().toString();
+			// THIS IS A BUG\\ - commmenting out as suggested by DW
+			boolean testURI = uri.equals(TestWorkspace.APP_CLIENT_DD_XMI_RESOURCE_URI);
+			// assertTrue(uri.equals(TestWorkspace.APP_CLIENT_DD_XMI_RESOURCE_URI));
+		} catch (Exception e) {
+			// TODO
+		}
+
+		finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+			assertTrue(edit != null);
+		}
+	}
+
+	public void testAddAppClientIfNecessary() {
+		AppClientArtifactEdit edit = null;
+		try {
+			edit = AppClientArtifactEdit.getAppClientArtifactEditForRead(appClientProject);
+			Resource resource = edit.getDeploymentDescriptorResource();
+			AppClientArtifactEdit edit2 = new AppClientArtifactEdit(getArtifactEditModelforRead()) {
+				protected void addAppClientIfNecessary(XMLResource aResource) {
+					super.addAppClientIfNecessary(aResource);
+				}
+			};
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+		pass(); // protected - not sure if needed
+	}
+
+	public void testCreateNewModule() {
+		AppClientArtifactEdit edit = null;
+		try {
+			edit = AppClientArtifactEdit.getAppClientArtifactEditForRead(appClientProject);
+			Module module = edit.createNewModule();
+			assertNotNull(module);
+
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+
+	public void testGetApplicationClient() {
+		AppClientArtifactEdit edit = null;
+		try {
+			edit = AppClientArtifactEdit.getAppClientArtifactEditForRead(appClientProject);
+			EObject obj = edit.getApplicationClient();
+			assertNotNull(obj);
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+
+	public void testGetAppClientArtifactEditForReadComponentHandle() {
+		StructureEdit moduleCore = null;
+		AppClientArtifactEdit edit = null;
+		try {
+			moduleCore = StructureEdit.getStructureEditForRead(appClientProject);
+			WorkbenchComponent wbComponent = moduleCore.getComponent();
+			edit = AppClientArtifactEdit.getAppClientArtifactEditForRead(appClientProject);
+			assertTrue(edit != null);
+
+		} finally {
+			if (moduleCore != null) {
+				moduleCore.dispose();
+				edit.dispose();
+			}
+
+		}
+	}
+
+
+	public void testGetAppClientArtifactEditForWriteComponentHandle() {
+		StructureEdit moduleCore = null;
+		AppClientArtifactEdit edit = null;
+		try {
+			moduleCore = StructureEdit.getStructureEditForWrite(appClientProject);
+			WorkbenchComponent wbComponent = moduleCore.getComponent();
+			edit = AppClientArtifactEdit.getAppClientArtifactEditForWrite(appClientProject);
+
+		} finally {
+			if (moduleCore != null) {
+				moduleCore.dispose();
+				edit.dispose();
+			}
+			assertTrue(edit != null);
+		}
+	}
+
+
+	public void testGetAppClientArtifactEditForReadWorkbenchComponent() {
+		AppClientArtifactEdit edit = null;
+		try {
+			edit = AppClientArtifactEdit.getAppClientArtifactEditForRead(appClientProject);
+			assertTrue(edit != null);
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+
+	public void testGetAppClientArtifactEditForWriteWorkbenchComponent() {
+		AppClientArtifactEdit edit = null;
+		try {
+			edit = AppClientArtifactEdit.getAppClientArtifactEditForWrite(appClientProject);
+			assertTrue(edit != null);
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+
+	public void testIsValidApplicationClientModule() {
+		IVirtualComponent component = ComponentCore.createComponent(appClientProject, appClientModuleName);
+		assertTrue(ArtifactEdit.isValidEditableModule(component));
+	}
+
+	public void testSave() {
+		AppClientArtifactEdit edit = null;
+		try {
+			edit = AppClientArtifactEdit.getAppClientArtifactEditForWrite(appClientProject);
+			try {
+				edit.save(new NullProgressMonitor());
+			} catch (Exception e) {
+				fail(e.getMessage());
+			}
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+			assertTrue(edit != null);
+		}
+		assertTrue(true);
+	}
+
+	public void testSaveIfNecessary() {
+		AppClientArtifactEdit edit = null;
+		try {
+			edit = AppClientArtifactEdit.getAppClientArtifactEditForWrite(appClientProject);
+			try {
+				edit.saveIfNecessary(new NullProgressMonitor());
+			} catch (Exception e) {
+				fail(e.getMessage());
+			}
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+			assertTrue(edit != null);
+		}
+		assertTrue(true);
+	}
+
+	public void testSaveIfNecessaryWithPrompt() {
+		AppClientArtifactEdit edit = null;
+		try {
+			edit = AppClientArtifactEdit.getAppClientArtifactEditForWrite(appClientProject);
+			try {
+				edit.saveIfNecessaryWithPrompt(new NullProgressMonitor(), handler, true);
+			} catch (Exception e) {
+				fail(e.getMessage());
+			}
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+			pass();
+		}
+	}
+
+	public void testDispose() {
+		AppClientArtifactEdit edit;
+		try {
+			edit = new AppClientArtifactEdit(getArtifactEditModelforRead());
+			edit.dispose();
+		} catch (Exception e) {
+			fail(e.getMessage());
+		}
+		pass();
+	}
+
+	// //////////BUG////////////////
+
+	public void testGetContentModelRoot() {
+		AppClientArtifactEdit edit = null;
+		try {
+			edit = AppClientArtifactEdit.getAppClientArtifactEditForRead(appClientProject);
+			// THIS IS A BUG\\ - commmenting out as suggested by DW
+			Object object = edit.getContentModelRoot();
+			// assertNotNull(object);
+			pass();
+		} catch (Exception e) {
+			e.printStackTrace();
+			// fail(e.getMessage());
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+
+	public void testAddListener() {
+		AppClientArtifactEdit edit = getArtifactEditForRead();
+		try {
+			edit.addListener(getEmListener());
+		} catch (Exception e) {
+			fail(e.getMessage());
+		}
+		pass();
+		edit.dispose();
+	}
+
+	public EditModelListener getEmListener() {
+		if (emListener == null)
+			emListener = new EditModelListener() {
+				public void editModelChanged(EditModelEvent anEvent) {
+					//Default
+				}
+			};
+		return emListener;
+	}
+
+	public void testRemoveListener() {
+		AppClientArtifactEdit edit = getArtifactEditForRead();
+		try {
+			edit.removeListener(getEmListener());
+		} catch (Exception e) {
+			fail(e.getMessage());
+		}
+		edit.dispose();
+		pass();
+	}
+
+	public void testHasEditModel() {
+		AppClientArtifactEdit edit = getArtifactEditForRead();
+		assertTrue(edit.hasEditModel(artifactEditModelForRead));
+		edit.dispose();
+	}
+
+	public void testGetArtifactEditModel() {
+		AppClientArtifactEdit edit = getArtifactEditForRead();
+		assertTrue(edit.hasEditModel(artifactEditModelForRead));
+		edit.dispose();
+	}
+
+	public void testObject() {
+		pass();
+	}
+
+	public void testGetClass() {
+		AppClientArtifactEdit edit = getArtifactEditForRead();
+		assertNotNull(edit.getClass());
+		edit.dispose();
+	}
+
+	public void testHashCode() {
+		AppClientArtifactEdit edit = getArtifactEditForRead();
+		int y = -999999999;
+		int x = edit.hashCode();
+		assertTrue(x != y);
+		edit.dispose();
+	}
+
+	public void testEquals() {
+		AppClientArtifactEdit edit = getArtifactEditForRead();
+		assertTrue(getArtifactEditForRead().equals(artifactEditForRead));
+		edit.dispose();
+	}
+
+	public void testClone() {
+		pass();
+	}
+
+	public void testToString() {
+		AppClientArtifactEdit edit = getArtifactEditForRead();
+		assertTrue(getArtifactEditForRead().toString() != null);
+		edit.dispose();
+	}
+
+	public void testNotify() {
+		try {
+			synchronized (getArtifactEditForRead()) {
+				artifactEditForRead.notify();
+			}
+		} catch (Exception e) {
+			fail(e.getMessage());
+		}
+		artifactEditForRead.dispose();
+		pass();
+	}
+
+	public void testNotifyAll() {
+		try {
+			synchronized (getArtifactEditForRead()) {
+				artifactEditForRead.notifyAll();
+			}
+		} catch (Exception e) {
+			fail(e.getMessage());
+		} finally {
+			artifactEditForRead.dispose();
+		}
+		pass();
+	}
+
+
+	public void testWaitlong() {
+		long x = 2;
+		try {
+			synchronized (getArtifactEditForRead()) {
+				getArtifactEditForRead().wait(x);
+			}
+		} catch (Exception e) {
+			// fail(e.getMessage());
+		} finally {
+			artifactEditForRead.dispose();
+		}
+		pass();
+	}
+
+
+	public void testWaitlongint() {
+		int x = 2;
+		try {
+			synchronized (getArtifactEditForRead()) {
+				getArtifactEditForRead().wait(x);
+			}
+		} catch (Exception e) {
+			// fail(e.getMessage());
+		} finally {
+			artifactEditForRead.dispose();
+		}
+		pass();
+	}
+
+
+	public void testWait() {
+		try {
+			synchronized (getArtifactEditForRead()) {
+				getArtifactEditForRead().wait();
+			}
+		} catch (Exception e) {
+			// fail(e.getMessage());
+		} finally {
+			artifactEditForRead.dispose();
+		}
+		pass();
+
+	}
+
+	public void testFinalize() {
+		pass();
+	}
+
+	public void pass() {
+		assertTrue(true);
+	}
+
+	public ArtifactEditModel getArtifactEditModelforRead() {
+		EMFWorkbenchContext context = new EMFWorkbenchContext(appClientProject);
+		artifactEditModelForRead = new ArtifactEditModel(EDIT_MODEL_ID, context, true, TestWorkspace.APP_CLIENT_MODULE_URI);
+		return artifactEditModelForRead;
+	}
+
+
+
+	public AppClientArtifactEdit getArtifactEditForRead() {
+		artifactEditForRead = new AppClientArtifactEdit(getArtifactEditModelforRead());
+		return artifactEditForRead;
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/ConnectorArtifactEditFVTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/ConnectorArtifactEditFVTest.java
new file mode 100644
index 0000000..c0bee8a
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/ConnectorArtifactEditFVTest.java
@@ -0,0 +1,113 @@
+package org.eclipse.jst.j2ee.flexible.project.apitests.artifactedit;
+
+import java.io.File;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jst.j2ee.client.ApplicationClient;
+import org.eclipse.jst.j2ee.jca.Connector;
+import org.eclipse.jst.j2ee.jca.modulecore.util.ConnectorArtifactEdit;
+import org.eclipse.wst.common.componentcore.internal.ComponentResource;
+import org.eclipse.wst.common.componentcore.internal.ComponentcoreFactory;
+import org.eclipse.wst.common.internal.emfworkbench.integration.EditModelEvent;
+import org.eclipse.wst.common.internal.emfworkbench.integration.EditModelListener;
+
+public class ConnectorArtifactEditFVTest extends TestCase {
+	private IProject jcaProject;
+	private String jcaModuleName;
+
+
+	public ConnectorArtifactEditFVTest() {
+		super();
+
+		if (TestWorkspace.init()) {
+			jcaProject = TestWorkspace.getTargetProject(TestWorkspace.JCA_PROJECT_NAME);
+			jcaModuleName = TestWorkspace.JCA_MODULE_NAME;
+		} else {
+			fail();
+
+		}
+
+	}
+
+	public void testCreationDisposeFunction() {
+		ConnectorArtifactEdit edit = null;
+		try {
+			edit = ConnectorArtifactEdit.getConnectorArtifactEditForWrite(jcaProject);
+			edit.addListener(new EditModelListener() {
+				public void editModelChanged(EditModelEvent anEvent) {
+					pass();
+				}
+			});
+			Connector client = edit.getConnector();
+			updateClient(client);
+			edit.save(new NullProgressMonitor());
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+
+	private void updateClient(Connector client) {
+		client.setDescription(TestWorkspace.FVT_DESCRIPTION);
+		client.setDisplayName(TestWorkspace.FVT_DISPLAY_NAME);
+		client.setLargeIcon(TestWorkspace.FVT_LARGE_ICON);
+
+	}
+	private static void pass(Connector client) {
+		boolean pass = client.getDescription().equals(TestWorkspace.FVT_DESCRIPTION) && client.getDisplayName().equals(TestWorkspace.FVT_DISPLAY_NAME) && client.getLargeIcon().equals(TestWorkspace.FVT_LARGE_ICON);
+		assertTrue(pass);
+	}
+
+	private void pass() {
+		assertTrue(true);
+	}
+
+	public void testPersistenceFunction() {
+		ConnectorArtifactEdit edit = null;
+		try {
+			edit = ConnectorArtifactEdit.getConnectorArtifactEditForWrite(jcaProject);
+			Connector jca = edit.getConnector();
+			pass(jca);
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+
+	private static void pass(ApplicationClient jca) {
+		boolean pass = jca.getDescription().equals(TestWorkspace.FVT_DESCRIPTION) && jca.getDisplayName().equals(TestWorkspace.FVT_DISPLAY_NAME) && jca.getLargeIcon().equals(TestWorkspace.FVT_LARGE_ICON);
+		assertTrue(pass);
+	}
+
+	private void validateResource() {
+		ConnectorArtifactEdit edit = null;
+		try {
+			edit = ConnectorArtifactEdit.getConnectorArtifactEditForWrite(jcaProject);
+//			EList resourceList = wbComponent.getResources();
+//			for (Iterator iter = resourceList.iterator(); iter.hasNext();) {
+//			}
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+
+	private ComponentResource createResourceComponent() {
+		ComponentResource resourceComponent = ComponentcoreFactory.eINSTANCE.createComponentResource();
+		File testFile = TestWorkspace.ARTIFACT_EDIT_FVT_RESOURCE_PATH.toFile();
+		if (testFile.exists()) {
+			resourceComponent.setRuntimePath(TestWorkspace.ARTIFACT_EDIT_FVT_RESOURCE_PATH);
+			resourceComponent.setSourcePath(TestWorkspace.ARTIFACT_EDIT_FVT_RESOURCE_PATH);
+		} else {
+			fail("Missing: TestWorkspace.ARTIFACT_EDIT_FVT_RESOURCE_PATH");
+		}
+		return resourceComponent;
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/ConnectorArtifactEditTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/ConnectorArtifactEditTest.java
new file mode 100644
index 0000000..3cf9749
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/ConnectorArtifactEditTest.java
@@ -0,0 +1,243 @@
+package org.eclipse.jst.j2ee.flexible.project.apitests.artifactedit;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
+import org.eclipse.jst.j2ee.jca.modulecore.util.ConnectorArtifactEdit;
+import org.eclipse.wst.common.componentcore.ArtifactEdit;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.internal.ArtifactEditModel;
+import org.eclipse.wst.common.componentcore.internal.StructureEdit;
+import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchContext;
+
+public class ConnectorArtifactEditTest extends TestCase {
+
+	private IProject jcaProject;
+	private String jcaModuleName;
+
+
+	public ConnectorArtifactEditTest() {
+		super();
+
+		if (TestWorkspace.init()) {
+			jcaProject = TestWorkspace.getTargetProject(TestWorkspace.JCA_PROJECT_NAME);
+			jcaModuleName = TestWorkspace.JCA_MODULE_NAME;
+		} else {
+			fail();
+
+		}
+	}
+
+	public void testGetJ2EEVersion() {
+		IVirtualComponent vc = ComponentCore.createComponent(jcaProject);
+		assertTrue(J2EEProjectUtilities.getJ2EEProjectVersion(vc.getProject()).equals(TestWorkspace.JCA_PROJECT_VERSION));
+	}
+
+	public void testGetDeploymentDescriptorResource() {
+		ConnectorArtifactEdit edit = null;
+		try {
+			edit = ConnectorArtifactEdit.getConnectorArtifactEditForRead(jcaProject);
+			String uri = edit.getDeploymentDescriptorResource().getURI().toString();
+			assertTrue(uri.equals(TestWorkspace.JCA_DD_RESOURCE_URI));
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+
+
+	public void testCreateModelRoot() {
+		ConnectorArtifactEdit edit = null;
+		try {
+			edit = ConnectorArtifactEdit.getConnectorArtifactEditForWrite(jcaProject);
+			EObject object = edit.createModelRoot();
+			assertNotNull(object);
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+
+
+	public void testCreateModelRootint() {
+		ConnectorArtifactEdit edit = null;
+		try {
+			edit = ConnectorArtifactEdit.getConnectorArtifactEditForRead(jcaProject);
+			EObject object = edit.createModelRoot(14);
+			assertNotNull(object);
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+
+
+	public void testConnectorArtifactEditComponentHandleboolean() {
+		StructureEdit moduleCore = null;
+		WorkbenchComponent wbComponent = null;
+		ConnectorArtifactEdit edit = null;
+		try {
+			moduleCore = StructureEdit.getStructureEditForWrite(jcaProject);
+			wbComponent = moduleCore.getComponent();
+			edit = new ConnectorArtifactEdit(jcaProject, true);
+			assertNotNull(edit);
+		} finally {
+			if (moduleCore != null) {
+				moduleCore.dispose();
+				edit.dispose();
+			}
+		}
+
+	}
+
+	public void testConnectorArtifactEditArtifactEditModel() {
+		ConnectorArtifactEdit edit = new ConnectorArtifactEdit(getArtifactEditModelforRead());
+		assertNotNull(edit);
+		edit.dispose();
+	}
+
+
+	public void testGetConnectorArtifactEditForReadComponentHandle() {
+		StructureEdit moduleCore = null;
+		ConnectorArtifactEdit edit = null;
+		try {
+			moduleCore = StructureEdit.getStructureEditForRead(jcaProject);
+			WorkbenchComponent wbComponent = moduleCore.getComponent();
+			edit = ConnectorArtifactEdit.getConnectorArtifactEditForRead(jcaProject);
+			assertTrue(edit != null);
+
+		} finally {
+			if (moduleCore != null) {
+				moduleCore.dispose();
+				edit.dispose();
+			}
+
+		}
+	}
+
+
+	public void testGetConnectorArtifactEditForWriteComponentHandle() {
+		StructureEdit moduleCore = null;
+		ConnectorArtifactEdit edit = null;
+		try {
+			moduleCore = StructureEdit.getStructureEditForWrite(jcaProject);
+			WorkbenchComponent wbComponent = moduleCore.getComponent();
+			edit = ConnectorArtifactEdit.getConnectorArtifactEditForWrite(jcaProject);
+
+		} finally {
+			if (moduleCore != null) {
+				moduleCore.dispose();
+				edit.dispose();
+			}
+			assertTrue(edit != null);
+		}
+	}
+
+
+	public void testGetConnectorArtifactEditForReadWorkbenchComponent() {
+		ConnectorArtifactEdit edit = null;
+		try {
+			edit = ConnectorArtifactEdit.getConnectorArtifactEditForRead(jcaProject);
+			assertTrue(edit != null);
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+
+	public void testGetConnectorArtifactEditForWriteWorkbenchComponent() {
+		ConnectorArtifactEdit edit = null;
+		try {
+			edit = ConnectorArtifactEdit.getConnectorArtifactEditForWrite(jcaProject);
+			assertTrue(edit != null);
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+
+	public void testIsValidConnectorModule() {
+		IVirtualComponent component = ComponentCore.createComponent(jcaProject);
+		assertTrue(ArtifactEdit.isValidEditableModule(component));
+	}
+
+	public void testGetConnectorXmiResource() {
+		ConnectorArtifactEdit edit = null;
+		try {
+			edit = ConnectorArtifactEdit.getConnectorArtifactEditForRead(jcaProject);
+			String uri = edit.getDeploymentDescriptorResource().getURI().toString();
+			assertTrue(uri.equals(TestWorkspace.JCA_DD_RESOURCE_URI));
+
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+			assertTrue(edit != null);
+		}
+	}
+
+
+	public void testAddApplicationIfNecessary() {
+		pass(); // protected method
+	}
+
+	public void pass() {
+		assertTrue(true);
+	}
+
+	public ArtifactEditModel getArtifactEditModelforRead() {
+		EMFWorkbenchContext context = new EMFWorkbenchContext(jcaProject);
+		return new ArtifactEditModel(this.toString(), context, true, TestWorkspace.JCA_MODULE_URI);
+	}
+
+
+
+	public ConnectorArtifactEdit getArtifactEditForRead() {
+		return new ConnectorArtifactEdit(getArtifactEditModelforRead());
+	}
+
+
+
+	public void testGetDeploymentDescriptorRoot() {
+		ConnectorArtifactEdit edit = null;
+		try {
+			edit = ConnectorArtifactEdit.getConnectorArtifactEditForRead(jcaProject);
+			Object obj = edit.getDeploymentDescriptorRoot();
+			assertNotNull(obj);
+
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+
+	public void testAddConnectorIfNecessary() {
+		pass(); // protected method need to get clarification
+	}
+
+
+
+	public void testGetConnector() {
+		ConnectorArtifactEdit edit = null;
+		try {
+			edit = ConnectorArtifactEdit.getConnectorArtifactEditForRead(jcaProject);
+			Object obj = edit.getConnector();
+			assertNotNull(obj);
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/EARArtifactEditTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/EARArtifactEditTest.java
new file mode 100644
index 0000000..9c079b5
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/EARArtifactEditTest.java
@@ -0,0 +1,347 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.flexible.project.apitests.artifactedit;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.jst.j2ee.componentcore.EnterpriseArtifactEdit;
+import org.eclipse.jst.j2ee.componentcore.util.EARArtifactEdit;
+import org.eclipse.wst.common.componentcore.ArtifactEdit;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.UnresolveableURIException;
+import org.eclipse.wst.common.componentcore.internal.ArtifactEditModel;
+import org.eclipse.wst.common.componentcore.internal.StructureEdit;
+import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
+import org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchContext;
+
+public class EARArtifactEditTest extends TestCase {
+
+	private IProject earProject;
+	private String earModuleName;
+
+	public EARArtifactEditTest() {
+		super();
+
+		if (TestWorkspace.init()) {
+			earProject = TestWorkspace.getTargetProject(TestWorkspace.EAR_PROJECT_NAME);
+			earModuleName = TestWorkspace.EAR_MODULE_NAME;
+		} else {
+			fail();
+
+		}
+	}
+
+	public void testGetJ2EEVersion() {
+		EnterpriseArtifactEdit edit = null;
+		try {
+			edit = EARArtifactEdit.getEARArtifactEditForRead(earProject);
+			int version = edit.getJ2EEVersion();
+			Integer integer = new Integer(version);
+			assertTrue(integer.equals(TestWorkspace.EAR_PROJECT_VERSION));
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+	
+	public void testGetJ2EEModuleReferences() {
+		EARArtifactEdit edit = null;
+		try {
+			edit = EARArtifactEdit.getEARArtifactEditForRead(earProject);
+			IVirtualReference[] j2eeModuleRefs = edit.getJ2EEModuleReferences();
+			assertTrue(j2eeModuleRefs.length>0);
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+
+	public void testGetDeploymentDescriptorResource() {
+		EnterpriseArtifactEdit edit = null;
+		try {
+			edit = EARArtifactEdit.getEARArtifactEditForRead(earProject);
+			String uri = edit.getDeploymentDescriptorResource().getURI().toString();
+			assertTrue(uri.equals(TestWorkspace.EAR_DD_RESOURCE_URI));
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+			assertTrue(edit != null);
+		}
+	}
+
+	public void testCreateModelRoot() {
+		EnterpriseArtifactEdit edit = null;
+		try {
+			edit = EARArtifactEdit.getEARArtifactEditForWrite(earProject);
+			EObject object = edit.createModelRoot();
+			assertNotNull(object);
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+			assertTrue(edit != null);
+		}
+	}
+
+
+	public void testCreateModelRootint() {
+		EnterpriseArtifactEdit edit = null;
+		try {
+			edit = EARArtifactEdit.getEARArtifactEditForRead(earProject);
+			EObject object = edit.createModelRoot(14);
+			assertNotNull(object);
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+			assertTrue(edit != null);
+		}
+	}
+
+
+	public void testEARArtifactEditComponentHandleboolean() {
+		StructureEdit moduleCore = null;
+		WorkbenchComponent wbComponent = null;
+		EnterpriseArtifactEdit edit = null;
+		try {
+			moduleCore = StructureEdit.getStructureEditForWrite(earProject);
+			wbComponent = moduleCore.getComponent();
+			edit = new EARArtifactEdit(earProject, true);
+			assertNotNull(edit);
+		} finally {
+			if (moduleCore != null) {
+				moduleCore.dispose();
+				edit.dispose();
+			}
+		}
+
+	}
+
+	public void testEARArtifactEditArtifactEditModel() {
+		EnterpriseArtifactEdit edit = new EARArtifactEdit(getArtifactEditModelforRead());
+		assertNotNull(edit);
+		edit.dispose();
+	}
+
+
+	public void testGetEARArtifactEditForReadComponentHandle() {
+		StructureEdit moduleCore = null;
+		EnterpriseArtifactEdit edit = null;
+		try {
+			moduleCore = StructureEdit.getStructureEditForRead(earProject);
+			WorkbenchComponent wbComponent = moduleCore.getComponent();
+			edit = EARArtifactEdit.getEARArtifactEditForRead(earProject);
+			assertTrue(edit != null);
+
+		} finally {
+			if (moduleCore != null) {
+				moduleCore.dispose();
+				edit.dispose();
+			}
+
+		}
+	}
+
+
+	public void testGetEARArtifactEditForWriteComponentHandle() {
+		EnterpriseArtifactEdit edit = null;
+		try {
+			edit = EARArtifactEdit.getEARArtifactEditForWrite(earProject);
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+			assertTrue(edit != null);
+		}
+	}
+
+
+	public void testGetEARArtifactEditForReadWorkbenchComponent() {
+		EnterpriseArtifactEdit edit = null;
+		try {
+			edit = EARArtifactEdit.getEARArtifactEditForRead(earProject);
+			assertTrue(edit != null);
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+
+
+	public void testGetEARArtifactEditForWriteWorkbenchComponent() {
+		EnterpriseArtifactEdit edit = null;
+		try {
+			edit = EARArtifactEdit.getEARArtifactEditForWrite(earProject);
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+			assertTrue(edit != null);
+		}
+	}
+
+	public void testIsValidEARModule() {
+		IVirtualComponent component = null;
+		try {
+			component = ComponentCore.createComponent(earProject, earModuleName);
+			EARArtifactEdit.isValidEARModule(component);
+		} catch (UnresolveableURIException e) {
+			e.printStackTrace();
+		}
+		boolean isValid = ArtifactEdit.isValidEditableModule(component);
+		assertTrue(isValid);
+	}
+	
+	public void testIsValidEAREditableModule() {
+		IVirtualComponent component = null;
+		try {
+			component = ComponentCore.createComponent(earProject, earModuleName);
+			EARArtifactEdit.isValidEARModule(component);
+		} catch (UnresolveableURIException e) {
+			e.printStackTrace();
+		}
+		boolean isValid = ArtifactEdit.isValidEditableModule(component);
+		assertTrue(isValid);
+	}
+
+	public void testGetApplicationXmiResource() {
+		EARArtifactEdit edit = null;
+		try {
+			edit = EARArtifactEdit.getEARArtifactEditForRead(earProject);
+			String uri = edit.getApplicationXmiResource().getURI().toString();
+			assertTrue(uri.equals(TestWorkspace.EAR_DD_RESOURCE_URI));
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+			assertTrue(edit != null);
+
+		}
+	}
+
+	public void testGetApplication() {
+		EARArtifactEdit edit = null;
+		try {
+			edit = EARArtifactEdit.getEARArtifactEditForRead(earProject);
+			edit.createModelRoot();
+			EObject obj = edit.getApplication();
+			assertNotNull(obj);
+
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+			assertTrue(edit != null);
+
+		}
+	}
+
+	public void testAddApplicationIfNecessary() {
+		EnterpriseArtifactEdit edit = null;
+		try {
+			edit = EARArtifactEdit.getEARArtifactEditForRead(earProject);
+			
+			// /Bug
+			/*
+			 * assertTrue(edit.uriExists(TestWorkspace.EJB_MODULE_URI.toString()));
+			 */
+		} catch (Exception e) {
+			// TODO
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+		pass(); // protected method
+	}
+
+	// ///////////////BUG Workbench Module not initalized\\\\\\\\\\\\\\\\\\\\\\
+	public void testUriExists() {
+		EARArtifactEdit edit = null;
+		try {
+			edit = EARArtifactEdit.getEARArtifactEditForRead(earProject);
+			boolean uriExist = edit.uriExists(TestWorkspace.EJB_MODULE_URI.toString());
+			// /Bug
+			/*
+			 * assertTrue(edit.uriExists(TestWorkspace.EJB_MODULE_URI.toString()));
+			 */
+		} catch (Exception e) {
+			// TODO
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+
+	// ///////////////////BUG ClassCastException \\\\\\\\\\\\\\\\\\\\
+
+	public void testGetWorkbenchUtilModules() {
+		EARArtifactEdit edit = null;
+		try {
+			edit = EARArtifactEdit.getEARArtifactEditForRead(earProject);
+			edit.getUtilityModuleReferences();
+			// //////////////classcast exception
+			/*
+			 * assertNotNull(edit.getWorkbenchUtilModules(wbComponent));
+			 */
+		} catch (Exception e) {
+			// TODO
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+
+	// ///////////////////BUG ClassCastException \\\\\\\\\\\\\\\\\\\\
+	public void testGetWorkbenchJ2EEModules() {
+		EARArtifactEdit edit = null;
+		try {
+			edit = EARArtifactEdit.getEARArtifactEditForRead(earProject);
+			edit.getJ2EEModuleReferences();
+			// classCast
+			// assertNotNull(edit.getWorkbenchJ2EEModules(wbComponent));
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+
+
+		}
+	}
+
+	public void pass() {
+		assertTrue(true);
+	}
+
+	public ArtifactEditModel getArtifactEditModelforRead() {
+		EMFWorkbenchContext context = new EMFWorkbenchContext(earProject);
+		return new ArtifactEditModel(this.toString(), context, true, TestWorkspace.APP_CLIENT_MODULE_URI);
+	}
+
+
+
+	public EnterpriseArtifactEdit getArtifactEditForRead() {
+		return new EARArtifactEdit(getArtifactEditModelforRead());
+	}
+
+
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/EJBArtifactEditFVTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/EJBArtifactEditFVTest.java
new file mode 100644
index 0000000..752f429
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/EJBArtifactEditFVTest.java
@@ -0,0 +1,118 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.flexible.project.apitests.artifactedit;
+
+import java.io.File;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jst.j2ee.componentcore.EnterpriseArtifactEdit;
+import org.eclipse.jst.j2ee.ejb.EJBJar;
+import org.eclipse.jst.j2ee.ejb.componentcore.util.EJBArtifactEdit;
+import org.eclipse.wst.common.componentcore.internal.ComponentResource;
+import org.eclipse.wst.common.componentcore.internal.ComponentcoreFactory;
+import org.eclipse.wst.common.internal.emfworkbench.integration.EditModelEvent;
+import org.eclipse.wst.common.internal.emfworkbench.integration.EditModelListener;
+
+public class EJBArtifactEditFVTest extends TestCase {
+	
+	private IProject ejbProject;
+	private String ejbModuleName;
+
+	public EJBArtifactEditFVTest() {
+		super();
+
+		if (TestWorkspace.init()) {
+			ejbProject = TestWorkspace.getTargetProject(TestWorkspace.EJB_PROJECT_NAME);
+			ejbModuleName = TestWorkspace.EJB_MODULE_NAME;
+		} else {
+			fail();
+
+		}
+	}
+	
+	public void testCreationDisposeFunction() {
+		EJBArtifactEdit edit = null;
+		try {
+			edit = EJBArtifactEdit.getEJBArtifactEditForWrite(ejbProject);
+			edit.addListener(new EditModelListener() {
+				public void editModelChanged(EditModelEvent anEvent) {
+					pass();
+				}
+			});
+			EJBJar client = edit.getEJBJar();
+			updateClient(client);
+			edit.save(new NullProgressMonitor());
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+
+	private void updateClient(EJBJar client) {
+		client.setDescription(TestWorkspace.FVT_DESCRIPTION);
+		client.setDisplayName(TestWorkspace.FVT_DISPLAY_NAME);
+		client.setLargeIcon(TestWorkspace.FVT_LARGE_ICON);
+
+	}
+
+	private void pass() {
+		assertTrue(true);
+	}
+
+	public void testPersistenceFunction() {
+		EJBArtifactEdit edit = null;
+		try {
+			edit = EJBArtifactEdit.getEJBArtifactEditForWrite(ejbProject);
+			EJBJar ejb = edit.getEJBJar();
+			pass(ejb);
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+
+	private static void pass(EJBJar ejb) {
+		boolean pass = ejb.getDescription().equals(TestWorkspace.FVT_DESCRIPTION) && ejb.getDisplayName().equals(TestWorkspace.FVT_DISPLAY_NAME) && ejb.getLargeIcon().equals(TestWorkspace.FVT_LARGE_ICON);
+		assertTrue(pass);
+	}
+
+	private void validateResource() {
+		EnterpriseArtifactEdit edit = null;
+		try {
+			edit = EJBArtifactEdit.getEJBArtifactEditForWrite(ejbProject);
+//			EList resourceList = wbComponent.getResources();
+//			for (Iterator iter = resourceList.iterator(); iter.hasNext();) {
+//			}
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+
+	private ComponentResource createResourceComponent() {
+		ComponentResource resourceComponent = ComponentcoreFactory.eINSTANCE.createComponentResource();
+		File testFile = TestWorkspace.ARTIFACT_EDIT_FVT_RESOURCE_PATH.toFile();
+		if (testFile.exists()) {
+			resourceComponent.setRuntimePath(TestWorkspace.ARTIFACT_EDIT_FVT_RESOURCE_PATH);
+			resourceComponent.setSourcePath(TestWorkspace.ARTIFACT_EDIT_FVT_RESOURCE_PATH);
+		} else {
+			fail("Missing: TestWorkspace.ARTIFACT_EDIT_FVT_RESOURCE_PATH");
+		}
+		return resourceComponent;
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/EJBArtifactEditTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/EJBArtifactEditTest.java
new file mode 100644
index 0000000..159a9e7
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/EJBArtifactEditTest.java
@@ -0,0 +1,345 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.flexible.project.apitests.artifactedit;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jst.j2ee.application.Module;
+import org.eclipse.jst.j2ee.componentcore.EnterpriseArtifactEdit;
+import org.eclipse.jst.j2ee.ejb.EJBJar;
+import org.eclipse.jst.j2ee.ejb.componentcore.util.EJBArtifactEdit;
+import org.eclipse.jst.j2ee.internal.common.XMLResource;
+import org.eclipse.wst.common.componentcore.ArtifactEdit;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.internal.ArtifactEditModel;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchContext;
+
+public class EJBArtifactEditTest extends TestCase {
+
+	private IProject ejbProject;
+	private String ejbModuleName;
+
+	public EJBArtifactEditTest() {
+		super();
+
+		if (TestWorkspace.init()) {
+			ejbProject = TestWorkspace.getTargetProject(TestWorkspace.EJB_PROJECT_NAME);
+			ejbModuleName = TestWorkspace.EJB_MODULE_NAME;
+		} else {
+			fail();
+
+		}
+	}
+
+	public void testGetJ2EEVersion() {
+		EnterpriseArtifactEdit edit = null;
+		try {
+			edit = EJBArtifactEdit.getEJBArtifactEditForRead(ejbProject);
+			String version = new Integer(edit.getJ2EEVersion()).toString();
+			assertTrue(version.equals(TestWorkspace.EJB_PROJECT_VERSION));
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+
+	public void testGetDeploymentDescriptorResource() {
+		EnterpriseArtifactEdit edit = null;
+		try {
+			edit = EJBArtifactEdit.getEJBArtifactEditForRead(ejbProject);
+			String uri = edit.getDeploymentDescriptorResource().getURI().toString();
+			assertTrue(uri.equals(TestWorkspace.EJB_DD_RESOURCE_URI));
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+			assertTrue(edit != null);
+		}
+	}
+
+	// /////BUG in PlatformURL\\\\\\\\\\\
+
+	public void testGetDeploymentDescriptorRoot() {
+		EnterpriseArtifactEdit edit = null;
+		try {
+			edit = EJBArtifactEdit.getEJBArtifactEditForRead(ejbProject);
+			edit.getDeploymentDescriptorRoot();
+			// /////BUG in PlatformURL\\\\\\\\\\\turning test off////
+			/*
+			 * EObject object = edit.getDeploymentDescriptorRoot(); assertNotNull(object);
+			 */
+		} catch (Exception e) {
+			// TODO
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+			assertTrue(edit != null);
+		}
+	}
+
+	// /////////////BUG in PlatformURL\\\\\\\\\\\
+
+
+	public void testCreateModelRoot() {
+		EnterpriseArtifactEdit edit = null;
+		try {
+			edit = EJBArtifactEdit.getEJBArtifactEditForWrite(ejbProject);
+			edit.createModelRoot();
+			// ////BUG turning off\\\\\\\\\\\\\
+			/*
+			 * EObject object = edit.createModelRoot(); assertNotNull(object);
+			 */
+		} catch (Exception e) {
+			// TODO
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+			assertTrue(edit != null);
+		}
+	}
+
+	/*
+	 * Class under test for EObject createModelRoot(int)
+	 */
+	// ///////////////BUG in PlatformURLModuleConnection
+	public void testCreateModelRootint() {
+		EnterpriseArtifactEdit edit = null;
+		try {
+			// ///////BUG in PlatformURLModuleConnection
+			edit = EJBArtifactEdit.getEJBArtifactEditForRead(ejbProject);
+			edit.createModelRoot(14);
+			/*
+			 * EObject object = edit.createModelRoot(14); assertNotNull(object);
+			 */
+		} catch (Exception e) {
+			// TODO
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+			assertTrue(edit != null);
+		}
+	}
+
+	/*
+	 * Class under test for void EJBArtifactEdit(ComponentHandle, boolean)
+	 */
+	public void testEJBArtifactEditComponentHandleboolean() {
+		EnterpriseArtifactEdit edit = null;
+		try {
+			edit = new EJBArtifactEdit(ejbProject, true);
+			assertNotNull(edit);
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+
+	/*
+	 * Class under test for void EJBArtifactEdit(ArtifactEditModel)
+	 */
+	public void testEJBArtifactEditArtifactEditModel() {
+		EnterpriseArtifactEdit edit = new EJBArtifactEdit(getArtifactEditModelforRead());
+		assertNotNull(edit);
+		edit.dispose();
+	}
+
+	public void testGetEJBJarXmiResource() {
+		EJBArtifactEdit edit = null;
+		try {
+			edit = EJBArtifactEdit.getEJBArtifactEditForRead(ejbProject);
+			String uri = edit.getEJBJarXmiResource().toString();
+			// THIS IS A BUG\\ - commmenting out as suggested by DW
+			// assertTrue(uri.equals(TestWorkspace.EJB_DD_XMI_RESOURCE_URI));
+		} catch (Exception e) {
+			// TODO
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+			assertTrue(edit != null);
+		}
+	}
+
+	// //////////////Bug turning test off\\\\\\\\\\\
+
+	public void testHasEJBClientJARProject() {
+		EJBArtifactEdit edit = null;
+		try {
+			edit = EJBArtifactEdit.getEJBArtifactEditForRead(ejbProject);
+			edit.hasEJBClientJARProject();
+			// /////BUG\\\\\\\\\\\
+			// boolean bool = edit.hasEJBClientJARProject(ejbProject);
+			// assertEquals(bool, true);
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+
+	public void testCreateNewModule() {
+		EJBArtifactEdit edit = null;
+		try {
+			edit = EJBArtifactEdit.getEJBArtifactEditForRead(ejbProject);
+			Module module = edit.createNewModule();
+			assertNotNull(module);
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+
+	// /////////////////bug\\\\\\\\\\\\\
+
+	public void testGetEJBClientJarModule() {
+		EJBArtifactEdit edit = null;
+		try {
+			edit = EJBArtifactEdit.getEJBArtifactEditForRead(ejbProject);
+			edit.getEJBClientJarModule();
+			// /////////bug\\\\\\\\
+			// WorkbenchComponent comp = edit.getEJBClientJarModule(ejbProject);
+			// assertNotNull(comp);
+		} catch (Exception e) {
+			// TODO
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+
+	public void testGetEJBJar() {
+		EJBArtifactEdit edit = null;
+		try {
+			edit = EJBArtifactEdit.getEJBArtifactEditForRead(ejbProject);
+			EJBJar jar = edit.getEJBJar();
+			assertNotNull(jar);
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+
+	public void testGetDeploymenyDescriptorType() {
+		EJBArtifactEdit edit = null;
+		try {
+			edit = EJBArtifactEdit.getEJBArtifactEditForRead(ejbProject);
+			int type = edit.getDeploymentDescriptorType();
+			assertTrue(type >= 0);
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+
+	public void testAddEJBJarIfNecessary() {
+		EnterpriseArtifactEdit test = new EJBArtifactEdit(getArtifactEditModelforRead()) {
+			protected void addEJBJarIfNecessary(XMLResource aResource) {
+				// TODO add test
+				super.addEJBJarIfNecessary(aResource);
+			}
+
+			public void test() {
+				addEJBJarIfNecessary(null);
+			}
+		};
+
+	}
+
+	/*
+	 * Class under test for EJBArtifactEdit getEJBArtifactEditForRead(ComponentHandle)
+	 */
+	public void testGetEJBArtifactEditForReadComponentHandle() {
+		EnterpriseArtifactEdit edit = null;
+		try {
+			edit = EJBArtifactEdit.getEJBArtifactEditForRead(ejbProject);
+			assertTrue(edit != null);
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+
+	/*
+	 * Class under test for EJBArtifactEdit getEJBArtifactEditForWrite(ComponentHandle)
+	 */
+	public void testGetEJBArtifactEditForWriteComponentHandle() {
+		EnterpriseArtifactEdit edit = null;
+		try {
+			edit = EJBArtifactEdit.getEJBArtifactEditForWrite(ejbProject);
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+			assertTrue(edit != null);
+		}
+	}
+
+	/*
+	 * Class under test for EJBArtifactEdit getEJBArtifactEditForRead(WorkbenchComponent)
+	 */
+	public void testGetEJBArtifactEditForReadWorkbenchComponent() {
+		EnterpriseArtifactEdit edit = null;
+		try {
+			edit = EJBArtifactEdit.getEJBArtifactEditForRead(ejbProject);
+			assertTrue(edit != null);
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+
+	/*
+	 * Class under test for EJBArtifactEdit getEJBArtifactEditForWrite(WorkbenchComponent)
+	 */
+	public void testGetEJBArtifactEditForWriteWorkbenchComponent() {
+		EnterpriseArtifactEdit edit = null;
+		try {
+			edit = EJBArtifactEdit.getEJBArtifactEditForWrite(ejbProject);
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+			assertTrue(edit != null);
+		}
+	}
+
+	public void testIsValidEJBModule() {
+		IVirtualComponent component = ComponentCore.createComponent(ejbProject,ejbModuleName);
+		boolean valid = ArtifactEdit.isValidEditableModule(component);
+		assertTrue(valid);
+	}
+
+	public ArtifactEditModel getArtifactEditModelforRead() {
+		EMFWorkbenchContext context = new EMFWorkbenchContext(ejbProject);
+		return new ArtifactEditModel(this.toString(), context, true, TestWorkspace.APP_CLIENT_MODULE_URI);
+	}
+
+	public EnterpriseArtifactEdit getArtifactEditForRead() {
+		return new EJBArtifactEdit(getArtifactEditModelforRead());
+	}
+
+	public void pass() {
+		assertTrue(true);
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/EarArtiFactEditFVTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/EarArtiFactEditFVTest.java
new file mode 100644
index 0000000..c4b3568
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/EarArtiFactEditFVTest.java
@@ -0,0 +1,126 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.flexible.project.apitests.artifactedit;
+
+import java.io.File;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jst.j2ee.application.Application;
+import org.eclipse.jst.j2ee.client.ApplicationClient;
+import org.eclipse.jst.j2ee.componentcore.EnterpriseArtifactEdit;
+import org.eclipse.jst.j2ee.componentcore.util.EARArtifactEdit;
+import org.eclipse.wst.common.componentcore.internal.ComponentResource;
+import org.eclipse.wst.common.componentcore.internal.ComponentcoreFactory;
+import org.eclipse.wst.common.internal.emfworkbench.integration.EditModelEvent;
+import org.eclipse.wst.common.internal.emfworkbench.integration.EditModelListener;
+
+public class EarArtiFactEditFVTest extends TestCase {
+	
+	
+
+	private IProject earProject;
+	private String earModuleName;
+
+	public EarArtiFactEditFVTest() {
+		super();
+
+		if (TestWorkspace.init()) {
+			earProject = TestWorkspace.getTargetProject(TestWorkspace.EAR_PROJECT_NAME);
+			earModuleName = TestWorkspace.EAR_MODULE_NAME;
+		} else {
+			fail();
+
+		}
+	}
+	
+	public void testCreationDisposeFunction() {
+		EARArtifactEdit edit = null;
+		try {
+			edit = EARArtifactEdit.getEARArtifactEditForWrite(earProject);
+			edit.addListener(new EditModelListener() {
+				public void editModelChanged(EditModelEvent anEvent) {
+					pass();
+				}
+			});
+			Application client = edit.getApplication();
+			updateClient(client);
+			edit.save(new NullProgressMonitor());
+
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+
+	private void updateClient(Application client) {
+		client.setDescription(TestWorkspace.FVT_DESCRIPTION);
+		client.setDisplayName(TestWorkspace.FVT_DISPLAY_NAME);
+		client.setLargeIcon(TestWorkspace.FVT_LARGE_ICON);
+
+	}
+	private static void pass(Application client) {
+		boolean pass = client.getDescription().equals(TestWorkspace.FVT_DESCRIPTION) && client.getDisplayName().equals(TestWorkspace.FVT_DISPLAY_NAME) && client.getLargeIcon().equals(TestWorkspace.FVT_LARGE_ICON);
+		assertTrue(pass);
+	}
+
+	private void pass() {
+		assertTrue(true);
+	}
+
+	public void testPersistenceFunction() {
+		EARArtifactEdit edit = null;
+		try {
+			edit = EARArtifactEdit.getEARArtifactEditForWrite(earProject);
+			Application ear = edit.getApplication();
+			pass(ear);
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+
+	private static void pass(ApplicationClient ear) {
+		boolean pass = ear.getDescription().equals(TestWorkspace.FVT_DESCRIPTION) && ear.getDisplayName().equals(TestWorkspace.FVT_DISPLAY_NAME) && ear.getLargeIcon().equals(TestWorkspace.FVT_LARGE_ICON);
+		assertTrue(pass);
+	}
+
+	private void validateResource() {
+		EnterpriseArtifactEdit edit = null;
+		try {
+			edit = EARArtifactEdit.getEARArtifactEditForWrite(earProject);
+//			EList resourceList = wbComponent.getResources();
+//			for (Iterator iter = resourceList.iterator(); iter.hasNext();) {
+//			}
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+
+	private ComponentResource createResourceComponent() {
+		ComponentResource resourceComponent = ComponentcoreFactory.eINSTANCE.createComponentResource();
+		File testFile = TestWorkspace.ARTIFACT_EDIT_FVT_RESOURCE_PATH.toFile();
+		if (testFile.exists()) {
+			resourceComponent.setRuntimePath(TestWorkspace.ARTIFACT_EDIT_FVT_RESOURCE_PATH);
+			resourceComponent.setSourcePath(TestWorkspace.ARTIFACT_EDIT_FVT_RESOURCE_PATH);
+		} else {
+			fail("Missing: TestWorkspace.ARTIFACT_EDIT_FVT_RESOURCE_PATH");
+		}
+		return resourceComponent;
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/EnterpriseArtifactEditTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/EnterpriseArtifactEditTest.java
new file mode 100644
index 0000000..951b53a
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/EnterpriseArtifactEditTest.java
@@ -0,0 +1,92 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.flexible.project.apitests.artifactedit;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jst.j2ee.componentcore.EnterpriseArtifactEdit;
+import org.eclipse.jst.j2ee.componentcore.util.EARArtifactEdit;
+import org.eclipse.wst.common.componentcore.internal.ArtifactEditModel;
+import org.eclipse.wst.common.componentcore.internal.StructureEdit;
+import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent;
+import org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchContext;
+
+public class EnterpriseArtifactEditTest extends TestCase {
+	
+	private IProject earProject;
+	private String earModuleName;
+
+	public EnterpriseArtifactEditTest() {
+		super();
+		if (TestWorkspace.init()) {
+			earProject = TestWorkspace.getTargetProject(TestWorkspace.EAR_PROJECT_NAME);
+			earModuleName = TestWorkspace.EAR_MODULE_NAME;
+		} else {
+			fail();
+
+		}
+	}
+
+	public void testEnterpriseArtifactEditComponentHandleboolean() {
+		StructureEdit moduleCore = null;
+		WorkbenchComponent wbComponent = null;
+		EnterpriseArtifactEdit edit = null;
+		try {
+			moduleCore = StructureEdit.getStructureEditForWrite(earProject);
+			wbComponent = moduleCore.getComponent();
+			edit = new EARArtifactEdit(earProject, true);
+			assertNotNull(edit);
+		} finally {
+			if (moduleCore != null) {
+				moduleCore.dispose();
+				edit.dispose();
+			}
+		}
+	}
+
+	public void testEnterpriseArtifactEditArtifactEditModel() {
+		EnterpriseArtifactEdit edit = new EARArtifactEdit(getArtifactEditModelforRead());
+		assertNotNull(edit);
+		edit.dispose();
+	}
+
+
+	//////////BUG
+
+	public void testGetDeploymentDescriptorRoot() {
+		EnterpriseArtifactEdit edit = null;
+		try {
+			edit = new EARArtifactEdit(earProject,true);
+			edit.getDeploymentDescriptorRoot();
+			//////////////////////////BUG\\\\\\\\\\\
+			//assertNotNull(edit.getDeploymentDescriptorRoot());
+		} catch (Exception e) {
+			// TODO fail();
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+	
+	public ArtifactEditModel getArtifactEditModelforRead() {
+		EMFWorkbenchContext context = new EMFWorkbenchContext(earProject);
+		return new ArtifactEditModel(this.toString(), context, true, TestWorkspace.APP_CLIENT_MODULE_URI);
+	}
+
+
+
+	public EnterpriseArtifactEdit getArtifactEditForRead() {
+		return new EARArtifactEdit(getArtifactEditModelforRead());
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/J2EEArtifactEditAPIAllTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/J2EEArtifactEditAPIAllTest.java
new file mode 100644
index 0000000..588c614
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/J2EEArtifactEditAPIAllTest.java
@@ -0,0 +1,34 @@
+package org.eclipse.jst.j2ee.flexible.project.apitests.artifactedit;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.wst.common.frameworks.artifactedit.tests.ArtifactEditAPITests;
+import org.eclipse.wst.common.tests.SimpleTestSuite;
+
+public class J2EEArtifactEditAPIAllTest extends TestSuite {
+
+
+
+	public static Test suite() {
+		return new ArtifactEditAPITests();
+	}
+
+	public J2EEArtifactEditAPIAllTest() {
+		super();
+		addTest(new SimpleTestSuite(AppClientArtifactEditTest.class));
+		//addTest(new SimpleTestSuite(AppClientArtifactEditFVTest.class));
+		addTest(new SimpleTestSuite(ConnectorArtifactEditTest.class));
+		//addTest(new SimpleTestSuite(ConnectorArtifactEditFVTest.class));
+		addTest(new SimpleTestSuite(EARArtifactEditTest.class));
+		//addTest(new SimpleTestSuite(EarArtiFactEditFVTest.class));
+		addTest(new SimpleTestSuite(WebArtifactEditTest.class));
+		//addTest(new SimpleTestSuite(WebArtifactEditFVTest.class));
+		addTest(new SimpleTestSuite(EJBArtifactEditTest.class));
+		//addTest(new SimpleTestSuite(EJBArtifactEditFVTest.class));
+		addTest(new SimpleTestSuite(EnterpriseArtifactEditTest.class));
+		addTest(new SimpleTestSuite(WSDDArtifactEditFVTest.class));
+
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/JaxRPCMapArtifactEditFVTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/JaxRPCMapArtifactEditFVTest.java
new file mode 100644
index 0000000..68ec6e5
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/JaxRPCMapArtifactEditFVTest.java
@@ -0,0 +1,78 @@
+package org.eclipse.jst.j2ee.flexible.project.apitests.artifactedit;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jst.j2ee.internal.webservice.componentcore.util.JaxRPCMapArtifactEdit;
+import org.eclipse.jst.j2ee.web.componentcore.util.WebArtifactEdit;
+import org.eclipse.jst.j2ee.webapplication.WebApp;
+import org.eclipse.jst.j2ee.webservice.wsdd.WebServices;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+
+public class JaxRPCMapArtifactEditFVTest extends TestCase {
+
+	private IProject webProject;
+	private String webModuleName;
+	private String serverContextData = TestWorkspace.WEB_SERVER_CONTEXT_ROOT + "Test";
+
+	public JaxRPCMapArtifactEditFVTest() {
+		super();
+		if (TestWorkspace.init()) {
+			webProject = TestWorkspace.getTargetProject(TestWorkspace.WEB_PROJECT_NAME);
+			webModuleName = TestWorkspace.WEB_MODULE_NAME;
+		} else {
+			fail();
+
+		}
+	}
+	
+	private void updateClient(WebServices client) {
+		client.setDescription(TestWorkspace.FVT_DESCRIPTION);
+		client.setDisplayName(TestWorkspace.FVT_DISPLAY_NAME);
+		client.setLargeIcon(TestWorkspace.FVT_LARGE_ICON);
+
+	}
+
+	private void pass() {
+		assertTrue(true);
+	}
+
+	public void testPersistenceFunction() {
+		JaxRPCMapArtifactEdit jaxedit = null;
+		WebArtifactEdit webedit = null;
+		
+			IVirtualComponent comp = ComponentCore.createComponent(webProject,webModuleName);
+			
+			jaxedit = JaxRPCMapArtifactEdit.getJaxRPCMapArtifactEditForRead(comp);
+			jaxedit.getDeploymentDescriptorRoot("WebArtifactEditTest/WebArtifactEditModule/WebContent/WEB-INF/testmap.xml");
+			jaxedit.dispose();
+			webedit = WebArtifactEdit.getWebArtifactEditForWrite(comp);
+			WebApp webapp = webedit.getWebApp();
+			webedit.saveIfNecessary(null);
+			webedit.dispose();
+	}
+
+	private static void pass(WebServices webservice) {
+		boolean pass = webservice.getDescription().equals(TestWorkspace.FVT_DESCRIPTION) && 
+			webservice.getDisplayName().equals(TestWorkspace.FVT_DISPLAY_NAME) &&
+			webservice.getLargeIcon().equals(TestWorkspace.FVT_LARGE_ICON);
+		assertTrue(pass);
+	}
+
+	private void validateResource() {
+		WebArtifactEdit edit = null;
+		try {
+			edit = WebArtifactEdit.getWebArtifactEditForWrite(webProject);
+//			EList resourceList = wbComponent.getResources();
+//			for (Iterator iter = resourceList.iterator(); iter.hasNext();) {
+//			}
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+
+		}
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/TestWorkspace.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/TestWorkspace.java
new file mode 100644
index 0000000..ece9eba
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/TestWorkspace.java
@@ -0,0 +1,115 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.flexible.project.apitests.artifactedit;
+
+
+import java.io.IOException;
+import java.net.URL;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.etools.common.test.apitools.ProjectUnzipUtil;
+import org.eclipse.wtp.j2ee.headless.tests.plugin.HeadlessTestsPlugin;
+
+
+
+public class TestWorkspace {
+
+	public static final String EAR_PROJECT_NAME = "EARArtifactEditTest"; //$NON-NLS-1$
+	public static final String EAR_MODULE_NAME = "EARArtifactModule";//$NON-NLS-1$
+	public static final String EAR_PROJECT_VERSION = "1.4"; //$NON-NLS-1$
+	public static final String EAR_DD_RESOURCE_URI = "platform:/resource/EARArtifactModule/EARArtifactModule/META-INF/application.xml"; //$NON-NLS-1$
+	public static final String EAR_DD_XMI_RESOURCE_URI = "platform:/resource//EARArtifactEditTest/EARArtifactModule/ejbModule/META-INF/ejb-jar.xmi";//$NON-NLS-1$
+	public static final URI EAR_MODULE_URI = URI.createURI("module:/resource/EARArtifactEditTest/EARArtifactModule");
+
+	public static final String APP_CLIENT_PROJECT_NAME = "ApplicationClientArtifactEditTest"; //$NON-NLS-1$
+	public static final String APP_CLIENT_MODULE_NAME = "ApplicationClientModule"; //$NON-NLS-1$
+	public static final String APP_CLIENT_PROJECT_VERSION = "1.4";//$NON-NLS-1$
+	public static final String APP_CLIENT_DD_RESOURCE_URI = "platform:/resource/ApplicationClientModule/ApplicationClientModule/appClientModule/META-INF/application-client.xml";//$NON-NLS-1$
+	public static final String APP_CLIENT_DD_XMI_RESOURCE_URI = "platform:/resource/ApplicationClientModule/ApplicationClientModule/appClientModule/META-INF/application-client.xmi";//$NON-NLS-1$
+	public static final URI APP_CLIENT_MODULE_URI = URI.createURI("module:/resource/ApplicationClientArtifactEditTest/ApplicationClientModule");//$NON-NLS-1$
+
+	public static final String EJB_PROJECT_NAME = "EJBArtifactEditTest"; //$NON-NLS-1$
+	public static final String EJB_MODULE_NAME = "EJBArtifactEditModule";//$NON-NLS-1$
+	public static final String EJB_PROJECT_VERSION = "2.1"; //$NON-NLS-1$
+	public static final String EJB_DD_RESOURCE_URI = "platform:/resource/EARArtifactEditTest/EARArtifactModule/META-INF/application.xml";//$NON-NLS-1$
+	public static final String EJB_DD_XMI_RESOURCE_URI = "platform:/resource/EARArtifactEditTest/EARArtifactModule/META-INF/application.xmi";//$NON-NLS-1$
+	public static final URI EJB_MODULE_URI = URI.createURI("module:/resource/EARArtifactEditTest/EARArtifactModule");
+
+	public static final String WEB_PROJECT_NAME = "WebArtifactEditTest"; //$NON-NLS-1$
+	public static final String WEB_MODULE_NAME = "WebArtifactEditModule"; //$NON-NLS-1$
+	public static final String WEB_PROJECT_VERSION = "2.4";//$NON-NLS-1$
+	public static final String WEB_DD_RESOURCE_URI = "platform:/resource/WebArtifactEditModule/WebArtifactEditModule/WebContent/WEB-INF/web.xml";//$NON-NLS-1$
+	public static final String WEB_DD_XMI_RESOURCE_URI = "platform:/resource/WebArtifactEditModule/WebArtifactEditModule/WebContent/WEB-INF/web.xmi";//$NON-NLS-1$
+	public static final URI WEB_MODULE_URI = URI.createURI("module:/resource/WebArtifactEditTest/WebArtifactEditModule");
+	public static final String WEB_SERVER_CONTEXT_ROOT = "WebContent";
+
+	public static final String JCA_PROJECT_NAME = "JCAArtifactEditTest"; //$NON-NLS-1$
+	public static final String JCA_MODULE_NAME = "JCAArtifactEditTestModule";//$NON-NLS-1$
+	public static final String JCA_PROJECT_VERSION = "1.5"; //$NON-NLS-1$
+	public static final String JCA_DD_RESOURCE_URI = "platform:/resource/JCAArtifactEditTestModule/JCAArtifactEditTestModule/connectorModule/META-INF/ra.xml";//$NON-NLS-1$                                           
+	public static final URI JCA_MODULE_URI = URI.createURI("module:/resource/JCAArtifactEditTest/JCAArtifactEditModule");
+   
+	public static final String FVT_DESCRIPTION = "FVT Description Test";
+	public static final String FVT_DISPLAY_NAME = "FVT DisplayName Test";
+	public static final String FVT_LARGE_ICON = "fvtLargeIcon.gif";
+	public static IPath workspaceLocation = ResourcesPlugin.getWorkspace().getRoot().getLocation();
+	public static String ARTIFACT_EDIT_FVT_RESOURCE_PATH_NAME = "/ArtifactEditFunctionTestResource.txt";
+	public static IPath ARTIFACT_EDIT_FVT_RESOURCE_PATH = workspaceLocation.append(ARTIFACT_EDIT_FVT_RESOURCE_PATH_NAME);
+		
+	private static Path zipFilePath = new Path("/TestData/GenralArtifactTest/J2EEArtifactEditTestProjects.zip");
+	private static String[] projectNames = new String[]{EAR_PROJECT_NAME, APP_CLIENT_PROJECT_NAME, EJB_PROJECT_NAME, WEB_PROJECT_NAME, JCA_PROJECT_NAME};
+	private boolean isValidWorkspace;
+	
+
+
+
+	public static final String META_INF = "META-INF"; //$NON-NLS-1$
+	public static final String WEB_INF = "WEB-INF"; //$NON-NLS-1$
+
+	public static IProject getTargetProject(String projectName) {
+		return ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
+	}
+
+	public static boolean createProjects() {
+		IPath localZipPath = getLocalPath();
+		ProjectUnzipUtil util = new ProjectUnzipUtil(localZipPath, projectNames);
+		return util.createProjects();
+	}
+
+	private static IPath getLocalPath() {
+		URL url = HeadlessTestsPlugin.getDefault().find(zipFilePath);
+		try {
+			url = Platform.asLocalURL(url);
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		return new Path(url.getPath());
+	}
+
+	public static boolean init() {
+		// revisit
+		IProject project = getTargetProject(APP_CLIENT_PROJECT_NAME);
+		if (project.exists())
+			return true;
+		else
+			return createProjects();
+
+	}
+
+	public boolean isValidWorkspace() {
+		return isValidWorkspace;
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/WSDDArtifactEditFVTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/WSDDArtifactEditFVTest.java
new file mode 100644
index 0000000..2975fe8
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/WSDDArtifactEditFVTest.java
@@ -0,0 +1,95 @@
+package org.eclipse.jst.j2ee.flexible.project.apitests.artifactedit;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jst.j2ee.internal.webservice.componentcore.util.WSDDArtifactEdit;
+import org.eclipse.jst.j2ee.web.componentcore.util.WebArtifactEdit;
+import org.eclipse.jst.j2ee.webservice.wsdd.WebServices;
+import org.eclipse.wst.common.internal.emfworkbench.integration.EditModelEvent;
+import org.eclipse.wst.common.internal.emfworkbench.integration.EditModelListener;
+
+public class WSDDArtifactEditFVTest extends TestCase {
+
+	private IProject webProject;
+	private String webModuleName;
+	private String serverContextData = TestWorkspace.WEB_SERVER_CONTEXT_ROOT + "Test";
+
+	public WSDDArtifactEditFVTest() {
+		super();
+		if (TestWorkspace.init()) {
+			webProject = TestWorkspace.getTargetProject(TestWorkspace.WEB_PROJECT_NAME);
+			webModuleName = TestWorkspace.WEB_MODULE_NAME;
+		} else {
+			fail();
+
+		}
+	}
+	
+	public void testCreationDisposeFunction() {
+		WSDDArtifactEdit edit = null;
+		try {
+			edit = WSDDArtifactEdit.getWSDDArtifactEditForWrite(webProject);
+			edit.addListener(new EditModelListener() {
+				public void editModelChanged(EditModelEvent anEvent) {
+					pass();
+				}
+			});
+			WebServices client = edit.getWebServices();
+			updateClient(client);
+			edit.save(new NullProgressMonitor());
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+
+	private void updateClient(WebServices client) {
+		client.setDescription(TestWorkspace.FVT_DESCRIPTION);
+		client.setDisplayName(TestWorkspace.FVT_DISPLAY_NAME);
+		client.setLargeIcon(TestWorkspace.FVT_LARGE_ICON);
+
+	}
+
+	private void pass() {
+		assertTrue(true);
+	}
+
+	public void testPersistenceFunction() {
+		WSDDArtifactEdit edit = null;
+		try {
+			edit = WSDDArtifactEdit.getWSDDArtifactEditForWrite(webProject);
+			WebServices web = edit.getWebServices();
+			pass(web);
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+
+	private static void pass(WebServices webservice) {
+		boolean pass = webservice.getDescription().equals(TestWorkspace.FVT_DESCRIPTION) && 
+			webservice.getDisplayName().equals(TestWorkspace.FVT_DISPLAY_NAME) &&
+			webservice.getLargeIcon().equals(TestWorkspace.FVT_LARGE_ICON);
+		assertTrue(pass);
+	}
+
+	private void validateResource() {
+		WebArtifactEdit edit = null;
+		try {
+			edit = WebArtifactEdit.getWebArtifactEditForWrite(webProject);
+//			EList resourceList = wbComponent.getResources();
+//			for (Iterator iter = resourceList.iterator(); iter.hasNext();) {
+//			}
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+
+		}
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/WebArtifactEditFVTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/WebArtifactEditFVTest.java
new file mode 100644
index 0000000..295bf36
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/WebArtifactEditFVTest.java
@@ -0,0 +1,152 @@
+package org.eclipse.jst.j2ee.flexible.project.apitests.artifactedit;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.jst.j2ee.common.CommonFactory;
+import org.eclipse.jst.j2ee.common.ParamValue;
+import org.eclipse.jst.j2ee.internal.deployables.J2EEFlexProjDeployable;
+import org.eclipse.jst.j2ee.web.componentcore.util.WebArtifactEdit;
+import org.eclipse.jst.j2ee.webapplication.Filter;
+import org.eclipse.jst.j2ee.webapplication.WebApp;
+import org.eclipse.jst.j2ee.webapplication.WebapplicationFactory;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.internal.emfworkbench.integration.EditModelEvent;
+import org.eclipse.wst.common.internal.emfworkbench.integration.EditModelListener;
+import org.eclipse.wst.server.core.model.IModuleFolder;
+import org.eclipse.wst.server.core.model.IModuleResource;
+
+public class WebArtifactEditFVTest extends TestCase {
+
+	private IProject webProject;
+//	private String serverContextData = TestWorkspace.WEB_SERVER_CONTEXT_ROOT + "Test"; //$NON-NLS-1$
+
+	public WebArtifactEditFVTest() {
+		super();
+		if (TestWorkspace.init()) {
+			webProject = TestWorkspace.getTargetProject(TestWorkspace.WEB_PROJECT_NAME);
+		} else {
+			fail();
+
+		}
+	}
+	
+	public void testCreationDisposeFunction() {
+		WebArtifactEdit edit = null;
+		try {
+			edit = WebArtifactEdit.getWebArtifactEditForWrite(webProject);
+			edit.addListener(new EditModelListener() {
+				public void editModelChanged(EditModelEvent anEvent) {
+					pass();
+				}
+			});
+			WebApp client = edit.getWebApp();
+			updateClient(client);
+			edit.save(new NullProgressMonitor());
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+	
+	public void testDeployableResourceGather() {
+		IVirtualComponent webComp = ComponentCore.createComponent(webProject);
+		J2EEFlexProjDeployable deployable = new J2EEFlexProjDeployable(webProject,  webComp);
+		try {
+			IModuleResource[] resources = deployable.members();
+			assertTrue(resources.length>1);
+			int numOfModuleResourceFolders = 0;
+			for (int i=0; i<resources.length; i++) {
+				if (resources[i] instanceof IModuleFolder)
+					numOfModuleResourceFolders++;
+			}
+			assertTrue(numOfModuleResourceFolders==2);
+		} catch (Exception e) {
+			fail(e.getMessage());
+		}
+	}
+
+	private void updateClient(WebApp client) {
+		client.setDescription(TestWorkspace.FVT_DESCRIPTION);
+		client.setDisplayName(TestWorkspace.FVT_DISPLAY_NAME);
+		client.setLargeIcon(TestWorkspace.FVT_LARGE_ICON);
+	}
+
+	private void pass() {
+		assertTrue(true);
+	}
+
+	public void testPersistenceFunction() {
+		WebArtifactEdit edit = null;
+		try {
+			edit = WebArtifactEdit.getWebArtifactEditForWrite(webProject);
+			WebApp web = edit.getWebApp();
+			
+			
+			Filter filter = WebapplicationFactory.eINSTANCE.createFilter();
+	        filter.setName("WoohooFilter"); //$NON-NLS-1$
+	        filter.setFilterClassName("wtp.test.WhooHoo"); //$NON-NLS-1$
+	        
+	        ParamValue value = CommonFactory.eINSTANCE.createParamValue();
+	        value.setName("Param1"); //$NON-NLS-1$
+	        value.setValue("Value1"); //$NON-NLS-1$
+	        List initParams = new ArrayList();
+	        initParams.add(value);
+	        
+	        if (initParams != null) {
+	            filter.getInitParamValues().addAll(initParams);
+	        } 
+
+	        EList filters = web.getFilters();                                   
+	        
+	        filters.add(filter);
+			edit.saveIfNecessary(null);
+			
+			pass(web);
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+
+	private static void pass(WebApp web) {
+		boolean pass = web.getDescription().equals(TestWorkspace.FVT_DESCRIPTION) && web.getDisplayName().equals(TestWorkspace.FVT_DISPLAY_NAME) && web.getLargeIcon().equals(TestWorkspace.FVT_LARGE_ICON);
+		assertTrue(pass);
+	}
+
+//	private void validateResource() {
+//		WebArtifactEdit edit = null;
+//		try {
+//			ComponentHandle handle = ComponentHandle.create(webProject,webModuleName);
+//			edit = WebArtifactEdit.getWebArtifactEditForWrite(handle);
+////			EList resourceList = wbComponent.getResources();
+////			for (Iterator iter = resourceList.iterator(); iter.hasNext();) {
+////			}
+//		} finally {
+//			if (edit != null) {
+//				edit.dispose();
+//			}
+//		}
+//	}
+
+//	private ComponentResource createResourceComponent() {
+//		ComponentResource resourceComponent = ComponentcoreFactory.eINSTANCE.createComponentResource();
+//		File testFile = TestWorkspace.ARTIFACT_EDIT_FVT_RESOURCE_PATH.toFile();
+//		if (testFile.exists()) {
+//			resourceComponent.setRuntimePath(TestWorkspace.ARTIFACT_EDIT_FVT_RESOURCE_PATH);
+//			resourceComponent.setSourcePath(TestWorkspace.ARTIFACT_EDIT_FVT_RESOURCE_PATH);
+//		} else {
+//			fail("Missing: TestWorkspace.ARTIFACT_EDIT_FVT_RESOURCE_PATH"); //$NON-NLS-1$
+//		}
+//		return resourceComponent;
+//	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/WebArtifactEditTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/WebArtifactEditTest.java
new file mode 100644
index 0000000..c3d3046
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/WebArtifactEditTest.java
@@ -0,0 +1,414 @@
+package org.eclipse.jst.j2ee.flexible.project.apitests.artifactedit;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.jst.j2ee.web.componentcore.util.WebArtifactEdit;
+import org.eclipse.jst.j2ee.webapplication.Servlet;
+import org.eclipse.jst.j2ee.webapplication.ServletType;
+import org.eclipse.jst.j2ee.webapplication.WebApp;
+import org.eclipse.jst.j2ee.webapplication.internal.impl.WebapplicationFactoryImpl;
+import org.eclipse.wst.common.componentcore.ArtifactEdit;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.UnresolveableURIException;
+import org.eclipse.wst.common.componentcore.internal.ArtifactEditModel;
+import org.eclipse.wst.common.componentcore.internal.ComponentcoreFactory;
+import org.eclipse.wst.common.componentcore.internal.ReferencedComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchContext;
+
+public class WebArtifactEditTest extends TestCase {
+
+	private IProject webProject;
+	private String webModuleName;
+	private String serverContextData = TestWorkspace.WEB_SERVER_CONTEXT_ROOT + "Test";
+
+	public WebArtifactEditTest() {
+		super();
+		if (TestWorkspace.init()) {
+			webProject = TestWorkspace.getTargetProject(TestWorkspace.WEB_PROJECT_NAME);
+			webModuleName = TestWorkspace.WEB_MODULE_NAME;
+		} else {
+			fail();
+
+		}
+	}
+
+	public void testGetJ2EEVersion() {
+		WebArtifactEdit edit = null;
+		try {
+			edit = WebArtifactEdit.getWebArtifactEditForRead(webProject);
+			edit.getWebApp().setDescription("test");
+			int version = edit.getJ2EEVersion();
+			Integer integer = new Integer(version);
+			assertTrue(integer.equals(TestWorkspace.WEB_PROJECT_VERSION));
+
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+
+
+
+	public void testGetDeploymentDescriptorResource() {
+		WebArtifactEdit edit = null;
+		try {
+			edit = WebArtifactEdit.getWebArtifactEditForRead(webProject);
+			String uri = edit.getDeploymentDescriptorResource().getURI().toString();
+			// assertTrue(uri.equals(TestWorkspace.WEB_DD_RESOURCE_URI));
+		} catch (Exception e) {
+			// todo
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+
+	public void testGetDeploymentDescriptorRoot() {
+		WebArtifactEdit edit = null;
+		try {
+			edit = WebArtifactEdit.getWebArtifactEditForRead(webProject);
+			edit.getDeploymentDescriptorRoot();
+			// /////BUG in PlatformURL\\\\\\\\\\\turning test off////
+			EObject object = edit.getDeploymentDescriptorRoot();
+			assertNotNull(object);
+		} catch (Exception e) {
+			// TODO
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+			assertTrue(edit != null);
+		}
+	}
+
+	/*
+	 * Class under test for EObject createModelRoot()
+	 */
+	public void testCreateModelRoot() {
+		WebArtifactEdit edit = null;
+		try {
+			edit = WebArtifactEdit.getWebArtifactEditForWrite(webProject);
+			edit.createModelRoot();
+			// ////BUG turning off\\\\\\\\\\\\\
+			/*
+			 * EObject object = edit.createModelRoot(); assertNotNull(object);
+			 */
+		} catch (Exception e) {
+			// TODO
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+			assertTrue(edit != null);
+		}
+	}
+
+	/*
+	 * Class under test for EObject createModelRoot(int)
+	 */
+	public void testCreateModelRootint() {
+		WebArtifactEdit edit = null;
+		try {
+			// ///////BUG in PlatformURLModuleConnection
+			edit = WebArtifactEdit.getWebArtifactEditForRead(webProject);
+			edit.createModelRoot(14);
+			/*
+			 * EObject object = edit.createModelRoot(14); assertNotNull(object);
+			 */
+		} catch (Exception e) {
+			// TODO
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+			assertTrue(edit != null);
+		}
+	}
+
+	/*
+	 * Class under test for void WebArtifactEdit(ComponentHandle, boolean)
+	 */
+	public void testWebArtifactEditComponentHandleboolean() {
+		WebArtifactEdit edit = null;
+		try {
+			edit = new WebArtifactEdit(webProject, true);
+			assertNotNull(edit);
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+
+	}
+
+	/*
+	 * Class under test for WebArtifactEdit getWebArtifactEditForRead(ComponentHandle)
+	 */
+	public void testGetWebArtifactEditForReadComponentHandle() {
+		WebArtifactEdit edit = null;
+		try {
+			edit = WebArtifactEdit.getWebArtifactEditForRead(webProject);
+			assertTrue(edit != null);
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+
+	/*
+	 * Class under test for ArtifactEdit getWebArtifactEditForWrite(ComponentHandle)
+	 */
+	public void testGetWebArtifactEditForWriteComponentHandle() {
+		WebArtifactEdit edit = null;
+		try {
+			edit = WebArtifactEdit.getWebArtifactEditForWrite(webProject);
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+			assertTrue(edit != null);
+		}
+	}
+
+	/*
+	 * Class under test for WebArtifactEdit getWebArtifactEditForRead(WorkbenchComponent)
+	 */
+	public void testGetWebArtifactEditForReadWorkbenchComponent() {
+	}
+
+	/*
+	 * Class under test for WebArtifactEdit getWebArtifactEditForWrite(WorkbenchComponent)
+	 */
+	public void testGetWebArtifactEditForWriteWorkbenchComponent() {
+		WebArtifactEdit edit = null;
+		try {
+			edit = WebArtifactEdit.getWebArtifactEditForRead(webProject);
+			assertTrue(edit != null);
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+
+	public void testIsValidWebModule() {
+		IVirtualComponent component = null;
+		try {
+			component = ComponentCore.createComponent(webProject);
+			WebArtifactEdit.isValidWebModule(component);
+		} catch (UnresolveableURIException e) {
+			fail();
+		}
+		ArtifactEdit.isValidEditableModule(component);
+		assertTrue(ArtifactEdit.isValidEditableModule(component));
+	}
+
+	public void testIsValidEditModule() {
+		IVirtualComponent component = null;
+		try {
+			component = ComponentCore.createComponent(webProject);
+			WebArtifactEdit.isValidWebModule(component);
+		} catch (UnresolveableURIException e) {
+			fail();
+		}
+		ArtifactEdit.isValidEditableModule(component);
+		assertTrue(ArtifactEdit.isValidEditableModule(component));
+	}
+
+	/*
+	 * Class under test for void WebArtifactEdit(ArtifactEditModel)
+	 */
+	public void testWebArtifactEditArtifactEditModel() {
+		WebArtifactEdit edit = new WebArtifactEdit(getArtifactEditModelforRead());
+		assertNotNull(edit);
+		edit.dispose();
+	}
+
+	/*
+	 * Class under test for void WebArtifactEdit(ModuleCoreNature, WorkbenchComponent, boolean)
+	 */
+	public void testWebArtifactEditModuleCoreNatureWorkbenchComponentboolean() {
+		WebArtifactEdit edit = null;
+		try {
+			edit = new WebArtifactEdit(webProject, true);
+			assertNotNull(edit);
+		} catch (Exception e) {
+			fail();
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+
+	public void testGetServletVersion() {
+		WebArtifactEdit edit = null;
+		try {
+			edit = WebArtifactEdit.getWebArtifactEditForRead(webProject);
+			assertTrue(edit.getServletVersion() == 24);
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+
+	public void testAddWebAppIfNecessary() {
+	}
+
+	public void testGetJSPVersion() {
+		WebArtifactEdit edit = null;
+		try {
+			edit = WebArtifactEdit.getWebArtifactEditForRead(webProject);
+			assertTrue(edit.getJSPVersion() == 20);
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+
+	public void testGetDeploymentDescriptorPath() {
+		WebArtifactEdit edit = null;
+		try {
+			edit = WebArtifactEdit.getWebArtifactEditForRead(webProject);
+			edit.getDeploymentDescriptorPath();
+			assertNotNull(edit.getDeploymentDescriptorPath());
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+
+	public void testGetLibModules() {
+		WebArtifactEdit edit = null;
+		try {
+			edit = WebArtifactEdit.getWebArtifactEditForRead(webProject);
+			edit.getLibModules();
+			// //bug module in editmodel never initialized\\\\
+			// assertNotNull(edit.getLibModules());
+		} catch (Exception e) {
+			// TODO
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+
+	// ////////////Bug\\\\\\\\\\\\\\\\\\\\\\\
+
+	public void testAddLibModules() {
+		WebArtifactEdit edit = null;
+		try {
+			edit = WebArtifactEdit.getWebArtifactEditForRead(webProject);
+			ReferencedComponent refComp = ComponentcoreFactory.eINSTANCE.createReferencedComponent();
+			edit.addLibModules(new ReferencedComponent[]{refComp});
+			// ///////////////bug\\\\\\\ owner---WebArtifactEdit -> referenceComponents() != null
+			// needs to insure owner
+			/*
+			 * ReferencedComponent refComp =
+			 * ComponentcoreFactoryImpl.eINSTANCE.createReferencedComponent();
+			 * edit.addLibModules(new ReferencedComponent[]{refComp});
+			 * assertTrue(edit.getLibModules().length > 0);
+			 */
+		} catch (Exception e) {
+			// TODO
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+
+	public void testGetServerContextRoot() {
+		WebArtifactEdit edit = null;
+		try {
+			edit = WebArtifactEdit.getWebArtifactEditForRead(webProject);
+			edit.getServerContextRoot();
+			// /////////////////////BUG/////////////////////
+			// //edit.getServerContextRoot();
+			// assertTrue(edit.getServerContextRoot().equals(TestWorkspace.WEB_SERVER_CONTEXT_ROOT));
+		} catch (Exception e) {
+			// TODO
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+
+	// ////////////////BUG////////////////////////////////
+
+	public void testSetServerContextRoot() {
+		WebArtifactEdit edit = null;
+		try {
+			edit = WebArtifactEdit.getWebArtifactEditForRead(webProject);
+			edit.setServerContextRoot(serverContextData);
+			// /////////////////////BUG/////////////////////
+			// //edit.getServerContextRoot();
+			// edit.setServerContextRoot(serverContextData);
+			// String testData = edit.getServerContextRoot();
+			// assertTrue(testData.equals(serverContextData));
+		} catch (Exception e) {
+			// TODO
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+		}
+	}
+
+	public ArtifactEditModel getArtifactEditModelforRead() {
+		EMFWorkbenchContext context = new EMFWorkbenchContext(webProject);
+		return new ArtifactEditModel(this.toString(), context, true, TestWorkspace.APP_CLIENT_MODULE_URI);
+	}
+
+	public WebArtifactEdit getArtifactEditForRead() {
+		return new WebArtifactEdit(getArtifactEditModelforRead());
+	}
+	
+	public void testCreateServlet() {
+		WebArtifactEdit edit = null;
+		try {
+			WebapplicationFactoryImpl factory = new WebapplicationFactoryImpl();
+			edit = WebArtifactEdit.getWebArtifactEditForWrite(webProject);
+			WebApp webapp = edit.getWebApp();
+			Servlet servlet = factory.createServlet();
+			ServletType servletType = factory.createServletType();
+			servlet.setWebType(servletType);
+			servlet.setServletName("servletDescriptor._name");
+			servletType.setClassName("servletDescriptor._className");
+			// if(servletDescriptor._displayName != null){
+			servlet.setDisplayName("servletDescriptor._displayName");
+			// }
+			
+			webapp.getServlets().add(servlet);
+			webapp.setDescription("test");
+			edit.save(new NullProgressMonitor());
+			/*
+			 * if(servletDescriptor._loadOnStartup != null){
+			 * servlet.setLoadOnStartup(servletDescriptor._loadOnStartup); }
+			 * if(servletDescriptor._params != null){ Properties properties =
+			 * servlet.getParamsAsProperties(); properties.putAll(servletDescriptor._params); }
+			 */
+		} catch (Exception e) {
+			e.printStackTrace();
+			// TODO
+		} finally {
+			if (edit != null) {
+				edit.dispose();
+			}
+			assertTrue(edit != null);
+		}
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/fvtests/ArchiveComponentCreationTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/fvtests/ArchiveComponentCreationTest.java
new file mode 100644
index 0000000..e8c2dfe
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/fvtests/ArchiveComponentCreationTest.java
@@ -0,0 +1,106 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.flexible.project.fvtests;
+
+import java.util.ArrayList;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
+import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
+import org.eclipse.jst.j2ee.internal.web.archive.operations.WebFacetProjectCreationDataModelProvider;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties.FacetDataModelMap;
+import org.eclipse.wst.common.componentcore.internal.resources.VirtualArchiveComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+
+public class ArchiveComponentCreationTest extends TestCase {
+
+    
+    public static Test suite() {
+        return new TestSuite(ArchiveComponentCreationTest.class);
+    }
+
+    public ArchiveComponentCreationTest() {
+        super();
+    }
+
+    public ArchiveComponentCreationTest(String name) {
+        super(name);
+    }
+
+    
+    public void testCreateWebComponent() throws Exception {
+        createWebComponent(24, "TestWeb" ); //$NON-NLS-1$
+    }
+  
+    
+    private void createWebComponent(int j2eeVersion, String aModuleName) throws Exception{
+        IDataModel model = DataModelFactory.createDataModel(new WebFacetProjectCreationDataModelProvider());
+        model.setProperty(IFacetProjectCreationDataModelProperties.FACET_PROJECT_NAME, aModuleName);
+        FacetDataModelMap map = (FacetDataModelMap) model.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
+        IDataModel webModel = map.getFacetDataModel(J2EEProjectUtilities.DYNAMIC_WEB);
+        webModel.setIntProperty(IFacetDataModelProperties.FACET_VERSION,j2eeVersion);
+        model.getDefaultOperation().execute(new NullProgressMonitor(), null);
+        
+        IProject project = ProjectUtilities.getProject(aModuleName);
+        if( project.exists()){
+        	IVirtualComponent component = ComponentCore.createComponent(project);
+        	createArchiveComponent(component);
+        }	
+    }
+
+	public void createArchiveComponent(IVirtualComponent component){
+		
+		IPath path = new Path("JUNIT_HOME/junit.jar"); //$NON-NLS-1$
+
+
+		IPath resolvedPath = JavaCore.getResolvedVariablePath(path);
+
+		java.io.File file = new java.io.File(resolvedPath.toOSString());
+		if( file.isFile() && file.exists()){
+			String type = VirtualArchiveComponent.VARARCHIVETYPE + IPath.SEPARATOR;
+			
+			IVirtualComponent archive = ComponentCore.createArchiveComponent( component.getProject(), type +
+					path.toString());
+			
+			ArrayList vlist = new ArrayList();
+			IVirtualReference[] oldrefs = component.getReferences();
+			for (int j = 0; j < oldrefs.length; j++) {
+				IVirtualReference ref = oldrefs[j];
+				vlist.add(ref);
+			}		
+		
+			IVirtualReference ref = ComponentCore.createReference( component, archive, new Path("/WEB-INF/lib") ); //$NON-NLS-1$
+			vlist.add(ref);	
+			
+			IVirtualReference[] refs = new IVirtualReference[vlist.size()];
+			for (int j = 0; j < vlist.size(); j++) {
+				IVirtualReference tmpref = (IVirtualReference) vlist.get(j);
+				refs[j] = tmpref;
+			}				
+			component.setReferences(refs);
+		}
+	}	    
+ }
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/fvtests/EJBArtifactEditFvTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/fvtests/EJBArtifactEditFvTest.java
new file mode 100644
index 0000000..5c54d2d
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/fvtests/EJBArtifactEditFvTest.java
@@ -0,0 +1,6 @@
+package org.eclipse.jst.j2ee.flexible.project.fvtests;
+import junit.framework.TestCase;
+
+public class EJBArtifactEditFvTest extends TestCase {
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/fvtests/EJBDeployTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/fvtests/EJBDeployTest.java
new file mode 100644
index 0000000..076b8c8
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/fvtests/EJBDeployTest.java
@@ -0,0 +1,223 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.flexible.project.fvtests;
+import junit.framework.Test;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.emf.common.util.URI;
+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.jem.util.emf.workbench.ProjectResourceSet;
+import org.eclipse.jem.util.emf.workbench.WorkbenchResourceHelperBase;
+import org.eclipse.jst.common.project.facet.IJavaFacetInstallDataModelProperties;
+import org.eclipse.jst.common.project.facet.JavaFacetInstallDataModelProvider;
+import org.eclipse.jst.j2ee.archive.emftests.GeneralEMFPopulationTest;
+import org.eclipse.jst.j2ee.earcreation.IEarFacetInstallDataModelProperties;
+import org.eclipse.jst.j2ee.ejb.internal.operations.NewSessionBeanClassDataModelProvider;
+import org.eclipse.jst.j2ee.ejb.project.operations.IEjbFacetInstallDataModelProperties;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.j2ee.internal.common.J2EEVersionUtil;
+import org.eclipse.jst.j2ee.internal.common.operations.INewJavaClassDataModelProperties;
+import org.eclipse.jst.j2ee.internal.deployables.J2EEFlexProjDeployable;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPreferences;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetInstallDataModelProperties;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetInstallDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties.FacetDataModelMap;
+import org.eclipse.wst.common.componentcore.internal.impl.WTPResourceFactoryRegistry;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.project.facet.core.IProjectFacet;
+import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
+import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
+import org.eclipse.wst.common.tests.SimpleTestSuite;
+import org.eclipse.wst.server.core.model.IModuleFolder;
+import org.eclipse.wst.server.core.model.IModuleResource;
+
+public class EJBDeployTest extends GeneralEMFPopulationTest {
+	
+	private static final String PROJECTNAME = "TestNewModels";
+	public static final String PACKAGE = "test"; //$NON-NLS-1$
+    public static final String SESSION_BEAN_NAME = "TestSessionBean"; //$NON-NLS-1$
+	public EJBDeployTest(String name) {
+		super(name);
+	}
+	
+	
+    public static Test suite() {
+        return new SimpleTestSuite(EJBDeployTest.class);
+    }
+    
+    
+    
+	
+    private void createProject(IProjectDescription description,
+            IProject projectHandle, IProgressMonitor monitor)
+            throws CoreException, OperationCanceledException {
+        try {
+            monitor.beginTask("", 2000); //$NON-NLS-1$
+
+            projectHandle.create(description, new SubProgressMonitor(monitor,
+                    1000));
+
+            if (monitor.isCanceled())
+                throw new OperationCanceledException();
+
+            projectHandle.open(new SubProgressMonitor(monitor, 1000));
+
+        } finally {
+            monitor.done();
+        }
+    }
+
+
+public void testEJBDeployment() throws Exception {
+		
+	String projName = "TestEE5EjbProject";//$NON-NLS-1$
+	createEjbProject(projName);
+	
+	IProject project = getProject(projName);
+	// Create Session bean
+	createSessionBean(projName);
+	
+	
+	boolean found = false;
+	IVirtualComponent component = ComponentCore.createComponent(project);
+	J2EEFlexProjDeployable deployable = new J2EEFlexProjDeployable(project, component);
+	try {
+		if (deployable.isSingleRootStructure()) {
+			IModuleResource[] members = deployable.members();
+			for (int i=0; i<members.length; i++) {
+				IModuleResource packageFolder = members[i];
+				String name = packageFolder.getName();
+				if (name.equals(PACKAGE)) {
+					IModuleResource[] javaMembers = ((IModuleFolder)packageFolder).members();
+					for (int j = 0; j < javaMembers.length; j++) {
+						IModuleResource javaResource = javaMembers[j];
+						if (javaMembers[j].getName().equals("TestSessionBean.class"))
+							found = true;
+					}
+				}
+			}
+		}
+		assertTrue("Can't find class files in ejb deployment",found);
+
+	}catch (CoreException e) {
+		fail(e.getMessage());
+	}
+	
+	
+	
+
+}
+
+
+private void createSessionBean(String projName) throws ExecutionException {
+	IDataModel dm = DataModelFactory.createDataModel(NewSessionBeanClassDataModelProvider.class);
+	dm.setProperty(INewJavaClassDataModelProperties.PROJECT_NAME, projName);
+	dm.setProperty(INewJavaClassDataModelProperties.JAVA_PACKAGE, PACKAGE);
+	dm.setProperty(INewJavaClassDataModelProperties.CLASS_NAME, SESSION_BEAN_NAME);
+	IStatus operationStatus = dm.getDefaultOperation().execute(new NullProgressMonitor(), null);
+	try {
+		Job.getJobManager().join(ResourcesPlugin.FAMILY_AUTO_BUILD,null);
+	} catch (OperationCanceledException e) {
+		e.printStackTrace();
+	} catch (InterruptedException e) {
+		e.printStackTrace();
+	}
+}
+private ProjectResourceSet getResourceSet(String projName) {
+		IProject proj = getProject(projName);
+		return (ProjectResourceSet)WorkbenchResourceHelperBase.getResourceSet(proj);
+	}
+
+
+	private IProject createEjbProject(String projName) throws ExecutionException {
+		IDataModel dataModel = DataModelFactory.createDataModel(IEjbFacetInstallDataModelProperties.class);
+		String versionString = J2EEVersionUtil.convertVersionIntToString(J2EEVersionConstants.EJB_3_0_ID);
+		IProjectFacet facet = ProjectFacetsManager.getProjectFacet(IEjbFacetInstallDataModelProperties.EJB);
+		IProjectFacetVersion facetVersion = facet.getVersion(versionString); //$NON-NLS-1$
+		addVersionProperties(dataModel, projName, facetVersion,IJ2EEFacetInstallDataModelProperties.EJB);
+		dataModel.setProperty(IFacetDataModelProperties.FACET_PROJECT_NAME, projName);
+		FacetDataModelMap map = (FacetDataModelMap) dataModel
+				.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
+		map.add(setupJavaInstallAction(projName,J2EEPlugin.getDefault().getJ2EEPreferences().getString(J2EEPreferences.Keys.EJB_CONTENT_FOLDER)));
+		dataModel.getDefaultOperation().execute( new NullProgressMonitor(), null);
+		IProject webProj = ResourcesPlugin.getWorkspace().getRoot().getProject(projName);
+		return webProj;
+	}
+	private IProject createEarProject(String projName) throws ExecutionException {
+		IDataModel dataModel = DataModelFactory.createDataModel(IEarFacetInstallDataModelProperties.class);
+		String versionString = J2EEVersionUtil.convertVersionIntToString(J2EEVersionConstants.JEE_5_0_ID);
+		IProjectFacet facet = ProjectFacetsManager.getProjectFacet(IEarFacetInstallDataModelProperties.ENTERPRISE_APPLICATION);
+		IProjectFacetVersion facetVersion = facet.getVersion(versionString); //$NON-NLS-1$
+		addVersionProperties(dataModel, projName, facetVersion,IJ2EEFacetInstallDataModelProperties.ENTERPRISE_APPLICATION);
+		dataModel.setProperty(IFacetDataModelProperties.FACET_PROJECT_NAME, projName);
+		dataModel.getDefaultOperation().execute( new NullProgressMonitor(), null);
+		IProject webProj = ResourcesPlugin.getWorkspace().getRoot().getProject(projName);
+		return webProj;
+	}
+	protected IDataModel setupJavaInstallAction(String aProjectName, String srcFolder) {
+		IDataModel dm = DataModelFactory.createDataModel(new JavaFacetInstallDataModelProvider());
+		dm.setProperty(IFacetDataModelProperties.FACET_PROJECT_NAME, aProjectName);
+		String jVersion = "5.0";
+		dm.setProperty(IFacetDataModelProperties.FACET_VERSION_STR, jVersion); //$NON-NLS-1$
+		dm.setStringProperty(IJavaFacetInstallDataModelProperties.SOURCE_FOLDER_NAME, srcFolder); //$NON-NLS-1$
+		return dm;
+	}
+    private void addVersionProperties(IDataModel dataModel, String projName, IProjectFacetVersion fv, String facetString){
+
+		dataModel.setProperty(IFacetDataModelProperties.FACET_PROJECT_NAME, projName);
+		FacetDataModelMap map = (FacetDataModelMap) dataModel
+				.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
+		IDataModel model = (IDataModel) map.get(facetString);
+		model.setBooleanProperty(IJ2EEFacetInstallDataModelProperties.GENERATE_DD, true);
+		model.setProperty(IFacetInstallDataModelProperties.FACET_VERSION, fv);
+		
+    }
+
+
+	public IProject getProject() {
+		return ResourcesPlugin.getWorkspace().getRoot().getProject(PROJECTNAME);
+	}
+	public IProject getProject(String projName) {
+		return ResourcesPlugin.getWorkspace().getRoot().getProject(projName);
+	}
+
+
+	private void registerFactory(URI uri, ResourceSet resSet, Resource.Factory factory) {
+		WTPResourceFactoryRegistry registry = (WTPResourceFactoryRegistry) resSet.getResourceFactoryRegistry();
+		registry.registerLastFileSegment(uri.lastSegment(), factory);
+	}
+	private ResourceSet getResourceSet() {
+		ResourceSet set = new ResourceSetImpl();
+		set.setResourceFactoryRegistry(WTPResourceFactoryRegistry.INSTANCE);
+		return set;
+	}
+
+	
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/fvtests/J2EEFlexProjDeployablePerfTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/fvtests/J2EEFlexProjDeployablePerfTest.java
new file mode 100644
index 0000000..d3187c7
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/fvtests/J2EEFlexProjDeployablePerfTest.java
@@ -0,0 +1,89 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.flexible.project.fvtests;
+
+import java.io.IOException;
+import java.net.URL;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.etools.common.test.apitools.ProjectUnzipUtil;
+import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
+import org.eclipse.jst.j2ee.internal.deployables.J2EEFlexProjDeployable;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.server.core.util.ModuleFolder;
+import org.eclipse.wst.server.core.model.IModuleResource;
+import org.eclipse.wtp.j2ee.headless.tests.plugin.HeadlessTestsPlugin;
+
+public class J2EEFlexProjDeployablePerfTest extends TestCase {
+
+	private static String[] projectNames = new String[]{"war"}; //$NON-NLS-1$;
+	private static Path zipFilePath = new Path("/TestData/GenralArtifactTest/perfWAR.zip"); //$NON-NLS-1$
+	
+	public static Test suite() {
+		return new TestSuite(J2EEFlexProjDeployablePerfTest.class);
+	}
+	public void testMembersPerformance() {
+		ProjectUnzipUtil util = new ProjectUnzipUtil(getLocalPath(), projectNames);
+		util.createProjects();
+		IProject project = ProjectUtilities.getProject(projectNames[0]);
+		IVirtualComponent component = ComponentCore.createComponent(project);
+		J2EEFlexProjDeployable deployable = new J2EEFlexProjDeployable(project, component);
+		try {
+			IModuleResource[] members = deployable.members();
+			assertTrue(members.length==3);
+			int verified = 0;
+			for (int i=0; i<members.length; i++) {
+				String name = members[i].getName();
+				if (name.equals("META-INF")) {
+					IModuleResource manifest = ((ModuleFolder)members[i]).members()[0];
+					assertTrue(manifest.getModuleRelativePath().toString().equals("META-INF"));
+					assertTrue(manifest.getName().equals("MANIFEST.MF"));
+					verified++;
+				} else if (name.equals("WEB-INF")) {
+					IModuleResource[] webInf = ((ModuleFolder)members[i]).members();
+					assertTrue(webInf.length==2);
+					for (int j=0; j<webInf.length; j++) {
+						IModuleResource webResource = webInf[j];
+						assertTrue(webResource.getModuleRelativePath().toString().equals("WEB-INF"));
+						assertTrue(webResource.getName().equals("web.xml") || webResource.getName().equals("classes"));
+					}
+					verified++;
+				} else if (name.equals("pkg0")) {
+					assertTrue(((ModuleFolder)members[i]).members().length>0);
+					verified++;
+				}
+			}
+			assertTrue(verified==3);
+		} catch (CoreException e) {
+			e.printStackTrace();
+			fail(e.getMessage());
+		}
+	}
+	
+	private static IPath getLocalPath() {
+		URL url = HeadlessTestsPlugin.getDefault().find(zipFilePath);
+		try {
+			url = Platform.asLocalURL(url);
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		return new Path(url.getPath());
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/fvtests/PortedComponentCreationTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/fvtests/PortedComponentCreationTest.java
new file mode 100644
index 0000000..1fc76ef
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/fvtests/PortedComponentCreationTest.java
@@ -0,0 +1,156 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2006 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.flexible.project.fvtests;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jst.j2ee.applicationclient.internal.creation.AppClientFacetProjectCreationDataModelProvider;
+import org.eclipse.jst.j2ee.internal.ejb.project.operations.EjbFacetProjectCreationDataModelProvider;
+import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
+import org.eclipse.jst.j2ee.internal.web.archive.operations.WebFacetProjectCreationDataModelProvider;
+import org.eclipse.jst.j2ee.jca.project.facet.ConnectorFacetProjectCreationDataModelProvider;
+import org.eclipse.jst.j2ee.project.facet.EARFacetProjectCreationDataModelProvider;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEModuleFacetInstallDataModelProperties;
+import org.eclipse.jst.j2ee.web.project.facet.IWebFacetInstallDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties.FacetDataModelMap;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+
+public class PortedComponentCreationTest extends TestCase {
+
+    public static String DEFAULT_PROJECT_NAME = "Flexible";
+
+    public static Test suite() {
+        return new TestSuite(PortedComponentCreationTest.class);
+    }
+
+    public PortedComponentCreationTest() {
+        super();
+    }
+
+    public PortedComponentCreationTest(String name) {
+        super(name);
+    }
+
+    /*
+    public void testCreateFlexibleProject() throws Exception {
+        IDataModel dataModel = DataModelFactory.createDataModel(new FlexibleProjectCreationDataModelProvider());
+        dataModel.setProperty(IFlexibleProjectCreationDataModelProperties.PROJECT_NAME, DEFAULT_PROJECT_NAME + "_");
+        dataModel.getDefaultOperation().execute(new NullProgressMonitor(), null);
+    }
+    */
+    
+
+//    public void testCreateJavaUtiltyComponent() throws Exception {
+//        //createFlexibleJavaProject(DEFAULT_PROJECT_NAME + "_JavaUtil");
+//        createJavaUtilComponent(DEFAULT_PROJECT_NAME + "_JavaUtil", DEFAULT_PROJECT_NAME + "_JavaUtil");
+//    }
+//
+//    public void testCreateConnectorComponent() throws Exception {
+//       // createFlexibleJavaProject(DEFAULT_PROJECT_NAME + "_ConnectorProject");
+//        createConnectorComponent(15, "TestConnector", DEFAULT_PROJECT_NAME + "_ConnectorProject");
+//    }
+//
+//    
+//    public void testCreateWebComponent() throws Exception {
+//      //  createFlexibleJavaProject(DEFAULT_PROJECT_NAME+"_WebProject");
+//        createWebComponent(24, "TestWeb", DEFAULT_PROJECT_NAME+"_WebProject");
+//    }
+//    
+//    public void testCreateAppClientComponent() throws Exception {
+//      //  createFlexibleJavaProject(DEFAULT_PROJECT_NAME+"_AppClientProject");
+//        createAppClientComponent(14, "TestAppClient", DEFAULT_PROJECT_NAME+"_AppClientProject");
+//    }
+//    
+//    public void testCreateEjbComponent() throws Exception {
+//       // createFlexibleJavaProject(DEFAULT_PROJECT_NAME+"_EJBProject");
+//        createEjbComponent(21, "TestEJB", DEFAULT_PROJECT_NAME+"_EJBProject");
+//    }
+//    
+//    public void testCreateEARComponent() throws Exception {
+//       // createFlexibleJavaProject(DEFAULT_PROJECT_NAME+"_EARProject");
+//        createEARComponent(14, "TestEAR", DEFAULT_PROJECT_NAME+"_EARProject");
+//    }
+    
+    private void createConnectorComponent(int j2eeVersion, String aModuleName, String projectName) throws Exception{
+        IDataModel model = DataModelFactory.createDataModel(new ConnectorFacetProjectCreationDataModelProvider());
+        model.setProperty(IFacetProjectCreationDataModelProperties.FACET_PROJECT_NAME, projectName);
+        FacetDataModelMap map = (FacetDataModelMap) model.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
+        IDataModel jcaModel = map.getFacetDataModel(J2EEProjectUtilities.JCA);
+        jcaModel.setIntProperty(IFacetDataModelProperties.FACET_VERSION,j2eeVersion);
+        model.getDefaultOperation().execute(new NullProgressMonitor(), null);
+    }
+    
+    private void createWebComponent(int j2eeVersion, String aModuleName, String projectName) throws Exception{
+        IDataModel model = DataModelFactory.createDataModel(new WebFacetProjectCreationDataModelProvider());
+        model.setProperty(IFacetProjectCreationDataModelProperties.FACET_PROJECT_NAME, projectName);
+        FacetDataModelMap map = (FacetDataModelMap) model.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
+        IDataModel webModel = map.getFacetDataModel(J2EEProjectUtilities.DYNAMIC_WEB);
+        webModel.setIntProperty(IFacetDataModelProperties.FACET_VERSION,j2eeVersion);
+        model.getDefaultOperation().execute(new NullProgressMonitor(), null);
+    }
+
+    private void createAppClientComponent(int j2eeVersion, String aModuleName, String projectName) throws Exception{
+        IDataModel model = DataModelFactory.createDataModel(new AppClientFacetProjectCreationDataModelProvider());
+        model.setProperty(IFacetProjectCreationDataModelProperties.FACET_PROJECT_NAME, projectName);
+        FacetDataModelMap map = (FacetDataModelMap) model.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
+        IDataModel appClientModel = map.getFacetDataModel(J2EEProjectUtilities.APPLICATION_CLIENT);
+        appClientModel.setIntProperty(IFacetDataModelProperties.FACET_VERSION,j2eeVersion);
+        model.getDefaultOperation().execute(new NullProgressMonitor(), null);
+    }
+    
+    private void createEjbComponent(int j2eeVersion, String aModuleName, String projectName) throws Exception{
+        IDataModel model = DataModelFactory.createDataModel(new EjbFacetProjectCreationDataModelProvider());
+        model.setProperty(IFacetProjectCreationDataModelProperties.FACET_PROJECT_NAME, projectName);
+        FacetDataModelMap map = (FacetDataModelMap) model.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
+        IDataModel ejbModel = map.getFacetDataModel(J2EEProjectUtilities.EJB);
+        ejbModel.setIntProperty(IFacetDataModelProperties.FACET_VERSION,j2eeVersion);
+        model.getDefaultOperation().execute(new NullProgressMonitor(), null);
+    }
+    
+    private void createEARComponent(int j2eeVersion, String aModuleName, String projectName) throws Exception{
+        IDataModel model = DataModelFactory.createDataModel(new EARFacetProjectCreationDataModelProvider());
+        model.setProperty(IFacetProjectCreationDataModelProperties.FACET_PROJECT_NAME, projectName);
+        FacetDataModelMap map = (FacetDataModelMap) model.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
+        IDataModel earModel = map.getFacetDataModel(J2EEProjectUtilities.ENTERPRISE_APPLICATION);
+        earModel.setIntProperty(IFacetDataModelProperties.FACET_VERSION,j2eeVersion);
+        model.getDefaultOperation().execute(new NullProgressMonitor(), null);
+    }
+    
+    public void testCreateWebComponentWithUserDefinedFolders() throws Exception {
+          IDataModel model = DataModelFactory.createDataModel(new WebFacetProjectCreationDataModelProvider());
+          model.setProperty(IFacetProjectCreationDataModelProperties.FACET_PROJECT_NAME, "TestWeb24"); //$NON-NLS-1$   
+          FacetDataModelMap map = (FacetDataModelMap) model.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
+          IDataModel webModel = map.getFacetDataModel(J2EEProjectUtilities.DYNAMIC_WEB);
+          webModel.setIntProperty(IFacetDataModelProperties.FACET_VERSION,24);
+          webModel.setBooleanProperty(IJ2EEModuleFacetInstallDataModelProperties.ADD_TO_EAR,false);
+          webModel.setStringProperty(IJ2EEModuleFacetInstallDataModelProperties.CONFIG_FOLDER,"web"); //$NON-NLS-1$
+          webModel.setStringProperty(IWebFacetInstallDataModelProperties.SOURCE_FOLDER, "src"); //$NON-NLS-1$
+          model.getDefaultOperation().execute(new NullProgressMonitor(), null);
+      }    
+    
+    public void testCreateAppClientComponentWithUserDefinedFolders() throws Exception{
+        IDataModel model = DataModelFactory.createDataModel(new AppClientFacetProjectCreationDataModelProvider());
+        model.setProperty(IFacetProjectCreationDataModelProperties.FACET_PROJECT_NAME, "TestApp15"); //$NON-NLS-1$
+        FacetDataModelMap map = (FacetDataModelMap) model.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
+        IDataModel appClientModel = map.getFacetDataModel(J2EEProjectUtilities.APPLICATION_CLIENT);
+        appClientModel.setIntProperty(IFacetDataModelProperties.FACET_VERSION,14); 
+        appClientModel.setStringProperty(IJ2EEModuleFacetInstallDataModelProperties.CONFIG_FOLDER, "src"); //$NON-NLS-1$
+        appClientModel.setBooleanProperty(IJ2EEModuleFacetInstallDataModelProperties.ADD_TO_EAR, false);
+        model.getDefaultOperation().execute(new NullProgressMonitor(), null);
+    }    
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/fvtests/WebDeployTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/fvtests/WebDeployTest.java
new file mode 100644
index 0000000..53d56e2
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/fvtests/WebDeployTest.java
@@ -0,0 +1,120 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.flexible.project.fvtests;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.Arrays;
+import java.util.List;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.etools.common.test.apitools.ProjectUnzipUtil;
+import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
+import org.eclipse.jst.j2ee.internal.deployables.J2EEFlexProjDeployable;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.server.core.IModule;
+import org.eclipse.wst.server.core.model.IModuleFolder;
+import org.eclipse.wst.server.core.model.IModuleResource;
+import org.eclipse.wtp.j2ee.headless.tests.plugin.HeadlessTestsPlugin;
+
+public class WebDeployTest extends TestCase {
+
+	private static String[] projectNames = new String[]{"TestDeploy","TestDeployUtil","TestDeployWeb","TestWebLibProject","TestExternalJar"}; //$NON-NLS-1$;
+	private static Path zipFilePath = new Path("/TestData/WebDeployTests/WebDeployTest.zip"); //$NON-NLS-1$
+	
+	public static Test suite() {
+		return new TestSuite(WebDeployTest.class);
+	}
+	public void testMembersDeployment() {
+		ProjectUnzipUtil util = new ProjectUnzipUtil(getLocalPath(), projectNames);
+		util.createProjects();
+		
+		//hari: we're getting the web project here
+		IProject project = ProjectUtilities.getProject(projectNames[2]);
+		IVirtualComponent component = ComponentCore.createComponent(project);
+		J2EEFlexProjDeployable deployable = new J2EEFlexProjDeployable(project, component);
+		try {
+			IModuleResource[] members = deployable.members();
+			assertTrue(members.length==2);
+			
+			for (int i=0; i<members.length; i++) {
+				String name = members[i].getName();
+				if (name.equals("META-INF")) {
+					IModuleResource manifest = ((IModuleFolder)members[i]).members()[0];
+					assertTrue(manifest.getModuleRelativePath().toString().equals("META-INF"));
+					assertTrue(manifest.getName().equals("MANIFEST.MF"));
+					
+				} else if (name.equals("WEB-INF")) {
+					IModuleResource[] webInf = ((IModuleFolder)members[i]).members();
+					assertTrue(webInf.length==3);
+					for (int j=0; j<webInf.length; j++) {
+						IModuleResource webResource = webInf[j];
+						assertTrue(webResource.getModuleRelativePath().toString().equals("WEB-INF"));
+						if (webResource.getName().equals("lib")){
+							IModuleResource[] webresMembers = ((IModuleFolder)webResource).members();
+							{
+								//finds only smokeEJB.jar here...
+								assertTrue(webresMembers.length==0);
+//								//Check that the names match the 3 names we expect
+//								for (int k = 0; k < webresMembers.length; k++){
+//									String localName = webresMembers[k].getName();
+//									assertTrue	(localName.equals("SmokeEJB.jar") || localName.equals("AutoWorldEJB512.jar"));
+//								}
+							}
+						}
+					}
+				} 
+			}
+			
+			// get child modules on the deployable should return the utility modules which are not 
+			// on the manifest but are web lib projects
+			IModule[] childModules = deployable.getChildModules();
+			assertEquals(3, childModules.length);
+			List childURIs = Arrays.asList(new String[] {
+					"WEB-INF/lib/SmokeEJB.jar",
+					"WEB-INF/lib/TestWebLibProject.jar",
+					"WEB-INF/lib/AutoWorldEJB512.jar",
+			});
+			
+			for (int l = 0; l < childModules.length; l++){
+				String uri = deployable.getURI(childModules[l]);
+				if( !childURIs.contains(uri)) 
+					fail("URI " + uri + " is not an expected child module uri result");
+			}
+			
+		} catch (CoreException e) {
+			e.printStackTrace();
+			fail(e.getMessage());
+		}
+		
+		
+		
+	}
+	
+	private static IPath getLocalPath() {
+		URL url = HeadlessTestsPlugin.getDefault().find(zipFilePath);
+		try {
+			url = Platform.asLocalURL(url);
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		return new Path(url.getPath());
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/tests/FlexibleProjectEditTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/tests/FlexibleProjectEditTest.java
new file mode 100644
index 0000000..95579fc
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/tests/FlexibleProjectEditTest.java
@@ -0,0 +1,13 @@
+/*
+ * Created on Feb 14, 2005
+ */
+package org.eclipse.jst.j2ee.flexible.project.tests;
+
+import junit.framework.TestCase;
+
+/**
+ * @author vijayb
+ */
+public class FlexibleProjectEditTest extends TestCase {
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/project/facet/tests/EjbProjectFacetCreationTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/project/facet/tests/EjbProjectFacetCreationTest.java
new file mode 100644
index 0000000..cf64d67
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/project/facet/tests/EjbProjectFacetCreationTest.java
@@ -0,0 +1,33 @@
+package org.eclipse.jst.j2ee.project.facet.tests;
+import junit.framework.Test;
+import junit.framework.TestCase;
+
+import org.eclipse.jst.j2ee.internal.ejb.project.operations.EjbFacetProjectCreationDataModelProvider;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.tests.SimpleTestSuite;
+
+public class EjbProjectFacetCreationTest extends TestCase {
+	
+	
+	public EjbProjectFacetCreationTest(String name) {
+		super(name);
+	}
+	
+	public EjbProjectFacetCreationTest() {
+		super();
+	}
+    public static Test suite() {
+        return new SimpleTestSuite(EjbProjectFacetCreationTest.class);
+    }
+
+   public void testEjbCreation() throws Exception {
+
+		IDataModel dm = DataModelFactory.createDataModel( new EjbFacetProjectCreationDataModelProvider());
+		dm.setProperty(IFacetProjectCreationDataModelProperties.FACET_PROJECT_NAME, "TestEJBFacet"); //$NON-NLS-1$
+		dm.getDefaultOperation().execute(null, null);
+    }
+
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/project/facet/tests/ProjectFacetCreationTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/project/facet/tests/ProjectFacetCreationTest.java
new file mode 100644
index 0000000..544159d
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/project/facet/tests/ProjectFacetCreationTest.java
@@ -0,0 +1,79 @@
+package org.eclipse.jst.j2ee.project.facet.tests;
+import java.util.HashSet;
+import java.util.Set;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jst.j2ee.project.JavaEEProjectUtilities;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.project.facet.core.IFacetedProject;
+import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
+import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
+import org.eclipse.wst.common.project.facet.core.IFacetedProject.Action;
+import org.eclipse.wst.common.project.facet.core.runtime.IRuntime;
+import org.eclipse.wst.common.project.facet.core.runtime.RuntimeManager;
+import org.eclipse.wst.common.tests.SimpleTestSuite;
+
+public class ProjectFacetCreationTest extends TestCase {
+	
+	
+	public ProjectFacetCreationTest(String name) {
+		super(name);
+	}
+	
+	public ProjectFacetCreationTest() {
+		super();
+	}
+    public static Test suite() {
+        return new SimpleTestSuite(ProjectFacetCreationTest.class);
+    }
+
+   public void testWebCreation() throws Exception {
+		IFacetedProject facetProj = ProjectFacetsManager.create("SampleWebProject",null,new NullProgressMonitor());
+		// Set runtime if available
+		setRuntime(facetProj);
+		
+		Set actions = new HashSet();
+		
+		//Setting up the java and web install action
+		actions.add(setupJavaInstallAction());
+		actions.add(setupWebInstallAction());
+		
+		
+		facetProj.modify( actions,null);
+		
+		IVirtualComponent comp = ComponentCore.createComponent(facetProj.getProject());
+		assertTrue(JavaEEProjectUtilities.isDynamicWebProject(comp.getProject()));
+		
+    }
+
+	private IFacetedProject.Action setupWebInstallAction() {
+		IProjectFacetVersion webfacetversion =  ProjectFacetsManager.getProjectFacet( "jst.web" ).getVersion( "2.4" );
+		
+		IFacetedProject.Action action = new IFacetedProject.Action( Action.Type.INSTALL, webfacetversion, null );
+		return action;
+	}
+
+	private IFacetedProject.Action setupJavaInstallAction() {
+		IProjectFacetVersion webfacetversion =  ProjectFacetsManager.getProjectFacet( "jst.java" ).getVersion( "1.4" );
+		IFacetedProject.Action action = new IFacetedProject.Action( Action.Type.INSTALL, webfacetversion, null );
+		return action;
+	}
+
+	protected void setRuntime(IFacetedProject facetProj) throws CoreException {
+		//Setting the runtime
+//		RuntimeManager.bridge();
+		try {
+		IRuntime runtime = RuntimeManager.getRuntime("org.eclipse.jst.server.tomcat");
+		facetProj.setRuntime(runtime,null);
+		} catch (IllegalArgumentException ex) {
+			System.out.println("Runtime not found: org.eclipse.jst.server.tomcat");
+		}
+		
+	}		
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/tests/bvt/AutomatedBVT.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/tests/bvt/AutomatedBVT.java
new file mode 100644
index 0000000..eaa08c6
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/tests/bvt/AutomatedBVT.java
@@ -0,0 +1,63 @@
+/*
+ * Created on Apr 1, 2003
+ *
+ * To change this generated comment go to 
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+package org.eclipse.jst.j2ee.tests.bvt;
+
+import java.net.URL;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+import junit.textui.TestRunner;
+
+import org.eclipse.core.runtime.IPluginDescriptor;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.wtp.j2ee.headless.tests.plugin.AllPluginTests;
+
+
+/**
+ * @author jsholl
+ *
+ * To change this generated comment go to 
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+public class AutomatedBVT extends TestSuite {
+
+    public static String baseDirectory = System.getProperty("user.dir") + java.io.File.separatorChar + "TestData" + java.io.File.separatorChar;
+    
+    static {
+        try {
+            IPluginDescriptor pluginDescriptor = Platform.getPluginRegistry().getPluginDescriptor("org.eclipse.jst.j2ee.tests");
+            URL url = pluginDescriptor.getInstallURL(); 
+        	AutomatedBVT.baseDirectory = Platform.asLocalURL(url).getFile() + "TestData"+ java.io.File.separatorChar;
+		} catch (Exception e) { 
+			System.err.println("Using working directory since a workspace URL could not be located.");
+		} 
+    }
+
+    public static int unimplementedMethods;
+
+    public static void main(String[] args) {
+        unimplementedMethods = 0;
+        TestRunner.run(suite());
+        if (unimplementedMethods > 0) {
+            System.out.println("\nCalls to warnUnimpl: " + unimplementedMethods);
+        }
+    }
+
+    public AutomatedBVT() {
+        super();
+        TestSuite suite = (TestSuite) AutomatedBVT.suite();
+        for (int i = 0; i < suite.testCount(); i++) {
+            addTest(suite.testAt(i));
+        }
+    }
+
+    public static Test suite() {
+        TestSuite suite = new TestSuite("Test for org.eclipse.jst.j2ee.test.bvt");
+        suite.addTest(AllPluginTests.suite());
+        return suite;
+    }
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/tests/bvt/AutomatedBVTEclipse.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/tests/bvt/AutomatedBVTEclipse.java
new file mode 100644
index 0000000..2853633
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/tests/bvt/AutomatedBVTEclipse.java
@@ -0,0 +1,30 @@
+/*
+ * Created on Mar 25, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package org.eclipse.jst.j2ee.tests.bvt;
+
+import java.io.IOException;
+import java.net.URL;
+
+import org.eclipse.core.runtime.IPluginDescriptor;
+import org.eclipse.core.runtime.Platform;
+
+/**
+ * @author jsholl
+ */
+public class AutomatedBVTEclipse extends AutomatedBVT {
+	
+	public AutomatedBVTEclipse(){
+		super();
+		IPluginDescriptor pluginDescriptor = Platform.getPluginRegistry().getPluginDescriptor("org.eclipse.jst.j2ee.tests");
+        URL url = pluginDescriptor.getInstallURL();
+        try {
+        	AutomatedBVT.baseDirectory = Platform.asLocalURL(url).getFile() + "TestData"+ java.io.File.separatorChar;
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/tests/bvt/CoreInfrastructureBVT.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/tests/bvt/CoreInfrastructureBVT.java
new file mode 100644
index 0000000..50b1e26
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/tests/bvt/CoreInfrastructureBVT.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.jst.j2ee.tests.bvt;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+public class CoreInfrastructureBVT extends TestSuite {
+	
+	public CoreInfrastructureBVT(){
+		super();
+		addTest(org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.SourceFolderUpdateTest.suite());
+		addTest(org.eclipse.jst.j2ee.tests.modulecore.AllTests.suite());
+		addTest(org.eclipse.jst.j2ee.dependency.tests.AllTests.suite());
+		addTest(org.eclipse.jst.j2ee.classpath.tests.AllTests.suite());
+		addTest(org.eclipse.wtp.j2ee.headless.tests.web.container.WebAppLibrariesContainerTests.suite());
+		addTest(org.eclipse.jst.j2ee.defect.tests.DefectVerificationTestsSuite.suite());
+		addTest(org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.HeaderParserTests.suite());
+	}
+	
+	public static Test suite(){
+    	return new CoreInfrastructureBVT();
+    }	
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/tests/bvt/EJBBVT.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/tests/bvt/EJBBVT.java
new file mode 100644
index 0000000..cf50059
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/tests/bvt/EJBBVT.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.jst.j2ee.tests.bvt;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+public class EJBBVT extends TestSuite {
+
+    public EJBBVT() {
+        super();
+        addTest(org.eclipse.wtp.j2ee.headless.tests.ejb.operations.AllTests.suite());      
+    }
+    
+    public static Test suite(){
+    	return new EJBBVT();
+    }
+    
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/tests/bvt/EnterpriseBVT.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/tests/bvt/EnterpriseBVT.java
new file mode 100644
index 0000000..297d8c0
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/tests/bvt/EnterpriseBVT.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.jst.j2ee.tests.bvt;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+public class EnterpriseBVT extends TestSuite {
+
+	public EnterpriseBVT(){
+		super();
+		addTest(org.eclipse.wtp.j2ee.headless.tests.jca.operations.AllTests.suite());
+		addTest(org.eclipse.wtp.j2ee.headless.tests.ear.operations.AllTests.suite());
+		addTest(org.eclipse.wtp.j2ee.headless.tests.appclient.operations.AllTests.suite());
+		addTest(org.eclipse.wtp.j2ee.headless.tests.utility.operations.AllTests.suite());
+	}
+	
+    public static Test suite(){
+    	return new EnterpriseBVT();
+    }
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/tests/bvt/ExtendedModelProviderBVT.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/tests/bvt/ExtendedModelProviderBVT.java
new file mode 100644
index 0000000..06a9fe9
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/tests/bvt/ExtendedModelProviderBVT.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.jst.j2ee.tests.bvt;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+public class ExtendedModelProviderBVT extends TestSuite {
+
+	public ExtendedModelProviderBVT() {
+		super();
+		addTest(org.eclipse.jst.common.annotations.tests.AnnotationProviderTest.suite());
+		addTest(org.eclipse.jst.jee.model.tests.AllAnnotationModelTests.suite());
+		addTest(org.eclipse.jst.jee.model.mergers.tests.MergersTestSuite.suite());
+	}
+	
+    public static Test suite(){
+    	return new ExtendedModelProviderBVT();
+    }
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/tests/bvt/ModelProviderBVT.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/tests/bvt/ModelProviderBVT.java
new file mode 100644
index 0000000..f5651b9
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/tests/bvt/ModelProviderBVT.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.jst.j2ee.tests.bvt;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+public class ModelProviderBVT extends TestSuite {
+
+	public ModelProviderBVT(){
+		super();
+		addTest(org.eclipse.jst.jee.model.tests.JEE5ModelTest.suite());
+		addTest(org.eclipse.jst.jee.model.tests.JEE6ModelTest.suite());
+		addTest(org.eclipse.jst.jee.model.tests.ModelProviderTest.suite());
+	}
+	
+	public static Test suite(){
+		return new ModelProviderBVT();
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/tests/bvt/WebBVT.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/tests/bvt/WebBVT.java
new file mode 100644
index 0000000..029df53
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/tests/bvt/WebBVT.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.jst.j2ee.tests.bvt;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+public class WebBVT extends TestSuite {
+
+	public WebBVT() {
+        super();
+        addTest(org.eclipse.wtp.j2ee.headless.tests.web.operations.AllTests.suite());     
+    }
+	public static Test suite(){
+		return new WebBVT();
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/tests/modulecore/AllTests.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/tests/modulecore/AllTests.java
new file mode 100644
index 0000000..e0cc1db
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/tests/modulecore/AllTests.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ * Created on Feb 18, 2005
+ */
+package org.eclipse.jst.j2ee.tests.modulecore;
+
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jst.j2ee.project.facet.tests.EjbProjectFacetCreationTest;
+import org.eclipse.wst.server.core.IRuntime;
+import org.eclipse.wst.server.core.IRuntimeType;
+import org.eclipse.wst.server.core.IRuntimeWorkingCopy;
+import org.eclipse.wst.server.core.ServerCore;
+
+public class AllTests extends TestSuite {
+	
+	public static IRuntime JONAS_TOMCAT_RUNTIME = createJONASRuntime();
+
+    public static Test suite(){
+        return new AllTests();
+    }
+    
+    public AllTests(){
+        super("ModuleCore Tests");
+        //addTest(ProjectFacetCreationTest.suite());
+        addTest(EjbProjectFacetCreationTest.suite());
+    }
+	public static IRuntime createJONASRuntime() { 
+	       String s = "D:/JOnAS-4.3.2/lib";
+	       if (s == null || s.length() == 0)
+	          return null;
+	       try {
+	          IRuntimeType rt = ServerCore.findRuntimeType("org.eclipse.jst.server.core.runtimeType");
+	          IRuntimeWorkingCopy wc = rt.createRuntime(null, null);
+	          wc.setLocation(new Path(s));
+	          return wc.save(true, null);
+	       } catch (Exception e) {
+	          e.printStackTrace();
+	          return null;
+	       }
+	    }
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/tests/modulecore/FlexibleProjectBuilderTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/tests/modulecore/FlexibleProjectBuilderTest.java
new file mode 100644
index 0000000..c76bd46
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/tests/modulecore/FlexibleProjectBuilderTest.java
@@ -0,0 +1,259 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2006 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.tests.modulecore;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspaceDescription;
+import org.eclipse.core.resources.IncrementalProjectBuilder;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.jst.j2ee.internal.web.archive.operations.WebFacetProjectCreationDataModelProvider;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties;
+import org.eclipse.wst.common.componentcore.internal.ComponentResource;
+import org.eclipse.wst.common.componentcore.internal.ComponentcoreFactory;
+import org.eclipse.wst.common.componentcore.internal.ProjectComponents;
+import org.eclipse.wst.common.componentcore.internal.ReferencedComponent;
+import org.eclipse.wst.common.componentcore.internal.StructureEdit;
+import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchContext;
+
+public class FlexibleProjectBuilderTest extends TestCase {
+	public static final String MODULE__RESOURCE_URI_PROTOCOL = "module:/resource/";
+	private IProject project;
+	private EMFWorkbenchContext emfContext;
+
+	public FlexibleProjectBuilderTest(String name) {
+		super(name);
+	}
+
+	public static Test suite() {
+		// return new TestSuite(ModuleEditModelTest.class);
+		TestSuite suite = new TestSuite();
+		suite.addTest(new FlexibleProjectBuilderTest("testFlexibleProjectBuilderOutput"));
+		return suite;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see junit.framework.TestCase#setUp()
+	 */
+	public void setUp() throws Exception {
+		IWorkspaceDescription desc = ResourcesPlugin.getWorkspace().getDescription();
+		desc.setAutoBuilding(false);
+		ResourcesPlugin.getWorkspace().setDescription(desc);
+		getProjectForWebModuleAndLocalWebLib().delete(true, null);
+		getProjectForRemoteWebLib().delete(true, null);
+		super.setUp();
+	}
+
+	/**
+	 * 
+	 */
+	public void testFlexibleProjectBuilderOutput() throws Exception {
+		setupContent();
+		buildProjects();
+	}
+
+
+	/**
+	 * 
+	 */
+	private void buildProjects() {
+		try {
+			ResourcesPlugin.getWorkspace().build(IncrementalProjectBuilder.FULL_BUILD, null);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+	public void setupContent() throws Exception {
+		StructureEdit localModuleCore = null;
+		try {
+			getProjectForWebModuleAndLocalWebLib();
+
+			IProject containingProject = StructureEdit.getContainingProject(getWebModuleURI());
+			localModuleCore = StructureEdit.getStructureEditForWrite(containingProject);
+
+			createLocalModules(localModuleCore);
+
+			// will setup and handle creating the modules model
+			getProjectForRemoteWebLib();
+
+			WorkbenchComponent webModule = localModuleCore.getComponent();
+
+			addDependentModule(webModule, new Path("WEB-INF/lib"), getLocalWebLibraryModuleURI());
+			addDependentModule(webModule, new Path("WEB-INF/lib"), getRemoteWebLibraryModuleURI());
+
+			localModuleCore.saveIfNecessary(null);
+
+		} finally {
+			if (localModuleCore != null)
+				localModuleCore.dispose();
+		}
+
+	}
+
+	public IProject getProjectForWebModuleAndLocalWebLib() throws Exception {
+		return getWebProject(getWebModuleAndLocalWebLibModuleProjectName());
+	}
+
+	public IProject getProjectForRemoteWebLib() throws Exception {
+		return getJavaProject(getRemoteWebLibModuleProjectName());
+	}
+
+	public String getWebModuleAndLocalWebLibModuleProjectName() {
+		return "MyModulesProject"; //$NON-NLS-1$
+	}
+
+	public String getRemoteWebLibModuleProjectName() {
+		return "RemoteWebLibProject"; //$NON-NLS-1$
+	}
+
+	public IProject getWebProject(String aProjectName) throws Exception {
+		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(aProjectName);
+		if (!project.exists())
+			project = createWebProject(aProjectName);
+		return project;
+	}
+
+	public IProject getJavaProject(String aProjectName) throws Exception {
+		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(aProjectName);
+		if (!project.exists()) {
+			// createJavaProject(aProjectName);
+		}
+		return project;
+	}
+
+	public IProject createWebProject(String aProjectName) throws Exception {
+
+		project = ResourcesPlugin.getWorkspace().getRoot().getProject(aProjectName);
+		if (!project.exists()) {
+			IDataModel dataModel = DataModelFactory.createDataModel(new WebFacetProjectCreationDataModelProvider());
+			dataModel.setProperty(IFacetProjectCreationDataModelProperties.FACET_PROJECT_NAME, aProjectName);
+			dataModel.getDefaultOperation().execute(new NullProgressMonitor(), null);
+		}
+		return ResourcesPlugin.getWorkspace().getRoot().getProject(aProjectName);
+	}
+
+	// public IProject createJavaProject(String aProjectName) throws Exception {
+	//
+	// project = ResourcesPlugin.getWorkspace().getRoot().getProject(aProjectName);
+	// if (!project.exists()) {
+	// IDataModel dataModel = DataModelFactory.createDataModel(new
+	// TestJavaProjectCreationDataModelProvider());
+	// dataModel.setProperty(ITestJavaProjectCreationProperties.PROJECT_NAME, aProjectName);
+	// dataModel.getDefaultOperation().execute(new NullProgressMonitor(),null);
+	// project = ResourcesPlugin.getWorkspace().getRoot().getProject(aProjectName);
+	// ModuleCoreNature.addModuleCoreNatureIfNecessary(project, null);
+	//
+	// ModuleStructuralModel structuralModel = null;
+	// try {
+	// structuralModel =
+	// ModuleCoreNature.getModuleCoreNature(project).getModuleStructuralModelForWrite(this);
+	// structuralModel.prepareProjectModulesIfNecessary();
+	// StructureEdit moduleCore = (StructureEdit)
+	// structuralModel.getAdapter(StructureEdit.ADAPTER_TYPE);
+	// String deployedName = aProjectName + ".jar";
+	// URI moduleURI = URI.createURI(MODULE__RESOURCE_URI_PROTOCOL + aProjectName + IPath.SEPARATOR
+	// + deployedName);
+	// WorkbenchComponent utilityModule = addWorkbenchModule(moduleCore.getComponentModelRoot(),
+	// deployedName, moduleURI);
+	// IResource sourceFolder = project.getFolder("src");
+	// addResource(utilityModule, sourceFolder, "/"); //$NON-NLS-1$
+	// structuralModel.saveIfNecessary(this);
+	// } finally {
+	// if (structuralModel != null)
+	// structuralModel.releaseAccess(this);
+	// }
+	// }
+	// return ResourcesPlugin.getWorkspace().getRoot().getProject(aProjectName);
+	// }
+
+	public void addResource(WorkbenchComponent aModule, IResource aSourceFile, String aDeployPath) {
+		ComponentResource resource = ComponentcoreFactory.eINSTANCE.createComponentResource();
+		resource.setSourcePath(aSourceFile.getFullPath());
+		resource.setRuntimePath(new Path(aDeployPath));
+		aModule.getResources().add(resource);
+	}
+
+	public WorkbenchComponent addWorkbenchModule(ProjectComponents theModules, String aDeployedName, URI aHandle) {
+		WorkbenchComponent module = ComponentcoreFactory.eINSTANCE.createWorkbenchComponent();
+		module.setName(aDeployedName);
+		theModules.getComponents().add(module);
+		return module;
+	}
+
+	public void addDependentModule(WorkbenchComponent aModule, IPath aDeployedPath, URI aHandle) {
+		ReferencedComponent aClasspathDependentModule = ComponentcoreFactory.eINSTANCE.createReferencedComponent();
+		aClasspathDependentModule.setRuntimePath(aDeployedPath);
+		aClasspathDependentModule.setHandle(aHandle);
+		aModule.getReferencedComponents().add(aClasspathDependentModule);
+	}
+
+	public void createLocalModules(StructureEdit moduleCore) throws Exception {
+
+		ProjectComponents projectModules = moduleCore.getComponentModelRoot();
+
+		WorkbenchComponent webLibraryModule = addWorkbenchModule(projectModules, getLocalWebLibraryDeployedName(), getLocalWebLibraryModuleURI());
+		IFolder localWebLibrary = getProjectForWebModuleAndLocalWebLib().getFolder(getLocalWebLibraryFolderName());
+		if (!localWebLibrary.exists())
+			localWebLibrary.create(true, true, null);
+		addResource(webLibraryModule, localWebLibrary, "/");
+	}
+
+	public URI getWebModuleURI() {
+		return URI.createURI(MODULE__RESOURCE_URI_PROTOCOL + getWebModuleAndLocalWebLibModuleProjectName() + IPath.SEPARATOR + getWebModuleDeployedName());
+	}
+
+	public URI getLocalWebLibraryModuleURI() {
+		return URI.createURI(MODULE__RESOURCE_URI_PROTOCOL + getWebModuleAndLocalWebLibModuleProjectName() + IPath.SEPARATOR + getLocalWebLibraryDeployedName());
+	}
+
+	public URI getRemoteWebLibraryModuleURI() {
+		return URI.createURI(MODULE__RESOURCE_URI_PROTOCOL + getRemoteWebLibModuleProjectName() + IPath.SEPARATOR + getRemoteWebLibraryDeployedName());
+	}
+
+	public String getWebModuleDeployedName() {
+		return getWebModuleAndLocalWebLibModuleProjectName() + ".war"; //$NON-NLS-1$
+	}
+
+	public String getLocalWebLibraryDeployedName() {
+		return "LocalWebLibrary.jar"; //$NON-NLS-1$
+	}
+
+	public String getRemoteWebLibraryDeployedName() {
+		return getRemoteWebLibModuleProjectName() + ".jar"; //$NON-NLS-1$
+	}
+
+	public String getModulesFolder() {
+		return "MyWebModule"; //$NON-NLS-1$
+	}
+
+	public String getTestResourcePath() {
+		return "WEB-INF/web.xml"; //$NON-NLS-1$
+	}
+
+	public String getLocalWebLibraryFolderName() {
+		return "WebLibraryContents";
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/tests/modulecore/ModuleStructuralModelTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/tests/modulecore/ModuleStructuralModelTest.java
new file mode 100644
index 0000000..1152d78
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/tests/modulecore/ModuleStructuralModelTest.java
@@ -0,0 +1,409 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2006 IBM 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.j2ee.tests.modulecore;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.jst.j2ee.internal.web.archive.operations.WebFacetProjectCreationDataModelProvider;
+import org.eclipse.jst.j2ee.web.componentcore.util.WebArtifactEdit;
+import org.eclipse.jst.j2ee.webapplication.WebApp;
+import org.eclipse.wst.common.componentcore.ModuleCoreNature;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties;
+import org.eclipse.wst.common.componentcore.internal.ArtifactEditModel;
+import org.eclipse.wst.common.componentcore.internal.ComponentResource;
+import org.eclipse.wst.common.componentcore.internal.ComponentcoreFactory;
+import org.eclipse.wst.common.componentcore.internal.ProjectComponents;
+import org.eclipse.wst.common.componentcore.internal.ReferencedComponent;
+import org.eclipse.wst.common.componentcore.internal.StructureEdit;
+import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent;
+import org.eclipse.wst.common.componentcore.internal.impl.ArtifactEditModelFactory;
+import org.eclipse.wst.common.componentcore.internal.impl.PlatformURLModuleConnection;
+import org.eclipse.wst.common.componentcore.internal.impl.ResourceTreeRoot;
+import org.eclipse.wst.common.componentcore.internal.util.SourcePathProvider;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchContext;
+
+/**
+ * <p>
+ * The following class is experimental until fully documented.
+ * </p>
+ */
+public class ModuleStructuralModelTest extends TestCase {
+
+	public static final String MODULE__RESOURCE_URI_PROTOCOL = "module:/resource/";
+	private IProject project;
+	private EMFWorkbenchContext emfContext;
+
+	public interface IModuleTypesConstants {
+		String MODULE_TYPE_WEB = "org.eclipse.jst.modules.web"; //$NON-NLS-1$
+	}
+
+
+	public ModuleStructuralModelTest(String name) {
+		super(name);
+	}
+
+	public static Test suite() {
+		// return new TestSuite(ModuleEditModelTest.class);
+		TestSuite suite = new TestSuite();
+		suite.addTest(new ModuleStructuralModelTest("testResolveDependentModule"));
+		return suite;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see junit.framework.TestCase#setUp()
+	 */
+	public void setUp() throws Exception {
+		getProjectForWebModuleAndLocalWebLib().delete(true, null);
+		getProjectForRemoteWebLib().delete(true, null);
+		setupContent();
+		super.setUp();
+	}
+
+	/**
+	 * 
+	 */
+	public void testResourceTree() throws Exception {
+		StructureEdit moduleCore = null;
+		try {
+			/* We need to find the project */
+			moduleCore = StructureEdit.getStructureEditForRead(StructureEdit.getContainingProject(getWebModuleURI()));
+
+			WorkbenchComponent module = moduleCore.getWorkbenchModules()[0];
+			ResourceTreeRoot sourceRoot = new ResourceTreeRoot(module, SourcePathProvider.INSTANCE);
+			ComponentResource[] resources = sourceRoot.findModuleResources(URI.createURI("/WebContent/WEB-INF/web.xml"));
+			System.out.println(resources[0] != null ? resources[0].getSourcePath().toString() : "NOT FOUND");
+
+		} finally {
+			if (moduleCore != null)
+				moduleCore.dispose();
+		}
+
+	}
+
+	public void testResolveDependentModule() throws Exception {
+
+		StructureEdit moduleCore = null;
+		try {
+			IProject containingProject = StructureEdit.getContainingProject(getWebModuleURI());
+			moduleCore = StructureEdit.getStructureEditForRead(containingProject);
+			WorkbenchComponent[] modules = moduleCore.getWorkbenchModules();
+			ProjectComponents pm = moduleCore.getComponentModelRoot();
+			Class clazz = moduleCore.getClass();
+			String name = StructureEdit.getDeployedName(getWebModuleURI());
+			List dependentModules = null;
+			for (int i = 0; i < modules.length; i++) {
+				System.out.println("Module: " + modules[i].getName());
+				List list = modules[i].getResources();
+				for (int j = 0; j < list.size(); j++) {
+					ComponentResource wmr = (ComponentResource) list.get(j);
+					IResource er = StructureEdit.getEclipseResource(wmr);
+				}
+				// test modulecore API
+				dependentModules = modules[i].getReferencedComponents();
+				for (int dependentIndex = 0; dependentIndex < dependentModules.size(); dependentIndex++) {
+					ReferencedComponent dependentModule = (ReferencedComponent) dependentModules.get(dependentIndex);
+					WorkbenchComponent resolvedModule = moduleCore.findComponentByURI(dependentModule.getHandle());
+					System.out.println("\tDependentModule: " + resolvedModule.getName() + " in " + resolvedModule.getHandle());
+					boolean b = moduleCore.isLocalDependency(dependentModule);
+				}
+			}
+		} finally {
+			if (moduleCore != null)
+				moduleCore.dispose();
+		}
+	}
+
+	public void testLoadResource() throws Exception {
+
+		ArtifactEditModel artifactModel = null;
+		try {
+			URI moduleURI = URI.createURI(MODULE__RESOURCE_URI_PROTOCOL + getWebModuleAndLocalWebLibModuleProjectName() + "/" + getWebModuleAndLocalWebLibModuleProjectName() + ".war");
+			artifactModel = getNature(getProjectForWebModuleAndLocalWebLib()).getArtifactEditModelForRead(moduleURI, this);
+			WebArtifactEdit editUtility = (WebArtifactEdit) artifactModel.getAdapter(WebArtifactEdit.ADAPTER_TYPE);
+
+			WebApp webApp = (WebApp) editUtility.getDeploymentDescriptorRoot();
+			if (webApp == null)
+				System.out.println("Read failed.");
+			else
+				System.out.println("Found WebApp: " + webApp.getDisplayName());
+		} finally {
+			if (artifactModel != null)
+				artifactModel.releaseAccess(this);
+		}
+	}
+
+	public void testURIAPI() throws Exception {
+		URI uri = URI.createURI(MODULE__RESOURCE_URI_PROTOCOL + getWebModuleAndLocalWebLibModuleProjectName() + IPath.SEPARATOR + getWebModuleDeployedName() + ".war" + IPath.SEPARATOR + getTestResourcePath());
+		System.out.println("URI : \"" + uri.toString() + "\"" + " with scheme \"" + uri.scheme() + "\" has " + uri.segmentCount() + " segments. They are ...");
+		String[] segments = uri.segments();
+		for (int i = 0; i < segments.length; i++)
+			System.out.println("[" + i + "]: " + segments[i]);
+
+
+		/* Determine if the URI is for a resource or binary module */
+
+		if (PlatformURLModuleConnection.RESOURCE_MODULE.equals(segments[0])) {
+			StructureEdit moduleCore = null;
+			try {
+				moduleCore = StructureEdit.getStructureEditForRead(StructureEdit.getContainingProject(uri));
+				ComponentResource[] resource = moduleCore.findResourcesByRuntimePath(uri);
+				System.out.println(resource != null ? resource[0].getSourcePath().toString() : "NOT FOUND");
+			} finally {
+				if (moduleCore != null)
+					moduleCore.dispose();
+			}
+		} else if (PlatformURLModuleConnection.BINARY_MODULE.equals(segments[0])) {
+
+		}
+	}
+
+	public void testLoadingDocument() throws Exception {
+		ArtifactEditModelFactory factory = new ArtifactEditModelFactory();
+
+		URI moduleURI = URI.createURI(PlatformURLModuleConnection.MODULE_PROTOCOL + IPath.SEPARATOR + getWebModuleAndLocalWebLibModuleProjectName() + IPath.SEPARATOR + getWebModuleDeployedName());
+		URI ddURI = URI.createURI(IPath.SEPARATOR + "WEB-INF" + IPath.SEPARATOR + "web.xml");
+
+		Map params = new HashMap();
+		params.put(ArtifactEditModelFactory.PARAM_MODULE_URI, moduleURI);
+		EMFWorkbenchContext context = createEMFWorkbenchContext();
+		ArtifactEditModel editModel = (ArtifactEditModel) factory.createEditModelForWrite(IModuleTypesConstants.MODULE_TYPE_WEB, context, params);
+		Resource ddResource = editModel.getResource(ddURI);
+		EObject rootObject = (EObject) ddResource.getContents().get(0);
+		if (rootObject == null)
+			System.out.println("Read failed.");
+		else
+			System.out.println("Found WebApp: " + ((WebApp) rootObject).getDisplayName());
+
+	}
+
+	public void setupContent() throws Exception {
+		StructureEdit localModuleCore = null;
+		try {
+			getProjectForWebModuleAndLocalWebLib();
+
+			IProject containingProject = StructureEdit.getContainingProject(getWebModuleURI());
+			localModuleCore = StructureEdit.getStructureEditForWrite(containingProject);
+
+			createLocalModules(localModuleCore);
+
+			// will setup and handle creating the modules model
+			getProjectForRemoteWebLib();
+
+			WorkbenchComponent webModule = localModuleCore.getComponent();
+
+			addDependentModule(webModule, new Path("WEB-INF/lib"), getLocalWebLibraryModuleURI());
+			addDependentModule(webModule, new Path("WEB-INF/lib"), getRemoteWebLibraryModuleURI());
+
+			localModuleCore.saveIfNecessary(null);
+
+		} finally {
+			if (localModuleCore != null)
+				localModuleCore.dispose();
+		}
+
+	}
+
+	public void createLocalModules(StructureEdit moduleCore) throws Exception {
+
+		ProjectComponents projectModules = moduleCore.getComponentModelRoot();
+
+		WorkbenchComponent webLibraryModule = addWorkbenchModule(projectModules, getLocalWebLibraryDeployedName(), getLocalWebLibraryModuleURI());
+		IFolder localWebLibrary = getProjectForWebModuleAndLocalWebLib().getFolder(getLocalWebLibraryFolderName());
+		if (!localWebLibrary.exists())
+			localWebLibrary.create(true, true, null);
+		addResource(webLibraryModule, localWebLibrary, "/");
+	}
+
+	public IFile getModuleRelativeFile(String aModuleRelativePath) throws Exception {
+		return getProjectForWebModuleAndLocalWebLib().getFile(new Path(getModulesFolder() + IPath.SEPARATOR + aModuleRelativePath));
+	}
+
+	public void addResource(WorkbenchComponent aModule, IResource aSourceFile, String aDeployPath) {
+		ComponentResource resource = ComponentcoreFactory.eINSTANCE.createComponentResource();
+		resource.setSourcePath(aSourceFile.getFullPath());
+		resource.setRuntimePath(new Path(aDeployPath));
+		aModule.getResources().add(resource);
+	}
+
+	public WorkbenchComponent addWorkbenchModule(ProjectComponents theModules, String aDeployedName, URI aHandle) {
+		WorkbenchComponent module = ComponentcoreFactory.eINSTANCE.createWorkbenchComponent();
+		module.setName(aDeployedName);
+		theModules.getComponents().add(module);
+		return module;
+	}
+
+	public void addDependentModule(WorkbenchComponent aModule, IPath aDeployedPath, URI aHandle) {
+		ReferencedComponent aClasspathDependentModule = ComponentcoreFactory.eINSTANCE.createReferencedComponent();
+		aClasspathDependentModule.setRuntimePath(aDeployedPath);
+		aClasspathDependentModule.setHandle(aHandle);
+		aModule.getReferencedComponents().add(aClasspathDependentModule);
+	}
+
+
+	public EMFWorkbenchContext createEMFWorkbenchContext() throws Exception {
+		if (emfContext == null)
+			emfContext = new EMFWorkbenchContext(getProjectForWebModuleAndLocalWebLib());
+		return emfContext;
+	}
+
+	public IProject getProjectForWebModuleAndLocalWebLib() throws Exception {
+		return getWebProject(getWebModuleAndLocalWebLibModuleProjectName());
+	}
+
+	public IProject getProjectForRemoteWebLib() throws Exception {
+		return getJavaProject(getRemoteWebLibModuleProjectName());
+	}
+
+	public IProject getWebProject(String aProjectName) throws Exception {
+		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(aProjectName);
+		if (!project.exists())
+			project = createWebProject(aProjectName);
+		return project;
+	}
+
+	public IProject getJavaProject(String aProjectName) throws Exception {
+		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(aProjectName);
+		if (!project.exists()) {
+			// createJavaProject(aProjectName);
+		}
+		return project;
+	}
+
+	public IProject createWebProject(String aProjectName) throws Exception {
+
+		project = ResourcesPlugin.getWorkspace().getRoot().getProject(aProjectName);
+		if (!project.exists()) {
+			IDataModel dataModel = DataModelFactory.createDataModel(new WebFacetProjectCreationDataModelProvider());
+			dataModel.setProperty(IFacetProjectCreationDataModelProperties.FACET_PROJECT_NAME, aProjectName);
+			// dataModel.setProperty(WebComponentCreationDataModel.IS_FLEXIBLE_PROJECT,
+			// Boolean.TRUE);
+			// dataModel.setProperty(IWebComponentCreationDataModelProperties.ADD_TO_EAR,
+			// Boolean.FALSE);
+			// dataModel.setProperty(WebComponentCreationDataModel.ADD_SERVER_TARGET,
+			// Boolean.FALSE);
+			// dataModel.setProperty(WebModuleCreationDataModel.SERVER_TARGET_ID,
+			// AllPluginTests.JONAS_SERVER.getId());
+			dataModel.getDefaultOperation().execute(new NullProgressMonitor(), null);
+		}
+		return ResourcesPlugin.getWorkspace().getRoot().getProject(aProjectName);
+	}
+
+	// public IProject createJavaProject(String aProjectName) throws Exception {
+	//
+	// project = ResourcesPlugin.getWorkspace().getRoot().getProject(aProjectName);
+	// if (!project.exists()) {
+	// IDataModel dataModel = DataModelFactory.createDataModel(new
+	// TestJavaProjectCreationDataModelProvider());
+	// dataModel.setProperty(ITestJavaProjectCreationProperties.PROJECT_NAME, aProjectName);
+	// dataModel.getDefaultOperation().execute(new NullProgressMonitor(), null);
+	// project = ResourcesPlugin.getWorkspace().getRoot().getProject(aProjectName);
+	// ModuleCoreNature.addModuleCoreNatureIfNecessary(project, null);
+	//
+	// ModuleStructuralModel structuralModel = null;
+	// try {
+	// structuralModel =
+	// ModuleCoreNature.getModuleCoreNature(project).getModuleStructuralModelForWrite(this);
+	// structuralModel.prepareProjectModulesIfNecessary();
+	// StructureEdit moduleCore = (StructureEdit)
+	// structuralModel.getAdapter(StructureEdit.ADAPTER_TYPE);
+	// String deployedName = aProjectName + ".jar";
+	// URI moduleURI = URI.createURI(MODULE__RESOURCE_URI_PROTOCOL + aProjectName + IPath.SEPARATOR
+	// + deployedName);
+	// WorkbenchComponent utilityModule = addWorkbenchModule(moduleCore.getComponentModelRoot(),
+	// deployedName, moduleURI);
+	// IResource sourceFolder = project.getFolder("src");
+	// addResource(utilityModule, sourceFolder, "/"); //$NON-NLS-1$
+	// structuralModel.saveIfNecessary(this);
+	// } finally {
+	// if (structuralModel != null)
+	// structuralModel.releaseAccess(this);
+	// }
+	// }
+	// return ResourcesPlugin.getWorkspace().getRoot().getProject(aProjectName);
+	// }
+
+	public ModuleCoreNature getNature(IProject aProject) {
+		try {
+			return (ModuleCoreNature) aProject.getNature(ModuleCoreNature.MODULE_NATURE_ID);
+		} catch (CoreException e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+
+	public URI getWebModuleURI() {
+		return URI.createURI(MODULE__RESOURCE_URI_PROTOCOL + getWebModuleAndLocalWebLibModuleProjectName() + IPath.SEPARATOR + getWebModuleDeployedName());
+	}
+
+	public URI getLocalWebLibraryModuleURI() {
+		return URI.createURI(MODULE__RESOURCE_URI_PROTOCOL + getWebModuleAndLocalWebLibModuleProjectName() + IPath.SEPARATOR + getLocalWebLibraryDeployedName());
+	}
+
+	public URI getRemoteWebLibraryModuleURI() {
+		return URI.createURI(MODULE__RESOURCE_URI_PROTOCOL + getRemoteWebLibModuleProjectName() + IPath.SEPARATOR + getRemoteWebLibraryDeployedName());
+	}
+
+	public String getWebModuleAndLocalWebLibModuleProjectName() {
+		return "MyModulesProject"; //$NON-NLS-1$
+	}
+
+	public String getRemoteWebLibModuleProjectName() {
+		return "RemoteWebLibProject"; //$NON-NLS-1$
+	}
+
+	public String getWebModuleDeployedName() {
+		return getWebModuleAndLocalWebLibModuleProjectName() + ".war"; //$NON-NLS-1$
+	}
+
+	public String getLocalWebLibraryDeployedName() {
+		return "LocalWebLibrary.jar"; //$NON-NLS-1$
+	}
+
+	public String getRemoteWebLibraryDeployedName() {
+		return getRemoteWebLibModuleProjectName() + ".jar"; //$NON-NLS-1$
+	}
+
+	public String getModulesFolder() {
+		return "MyWebModule"; //$NON-NLS-1$
+	}
+
+	public String getTestResourcePath() {
+		return "WEB-INF/web.xml"; //$NON-NLS-1$
+	}
+
+	public String getLocalWebLibraryFolderName() {
+		return "WebLibraryContents";
+	}
+
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/ejb/tests/CreateModelFromXmlTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/ejb/tests/CreateModelFromXmlTest.java
new file mode 100644
index 0000000..6344177
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/ejb/tests/CreateModelFromXmlTest.java
@@ -0,0 +1,99 @@
+/***********************************************************************
+ * Copyright (c) 2008 by SAP AG, Walldorf. 
+ * 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:
+ *     SAP AG - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jst.jee.model.ejb.tests;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jst.j2ee.model.IModelProvider;
+import org.eclipse.jst.j2ee.model.ModelProviderManager;
+import org.eclipse.jst.javaee.ejb.EJBJar;
+import org.eclipse.jst.javaee.ejb.SessionBean;
+import org.eclipse.jst.jee.model.tests.AbstractTest;
+import org.eclipse.wst.common.project.facet.core.IFacetedProject;
+
+/**
+ * @author Kiril Mitov k.mitov@sap.com
+ * 
+ */
+public class CreateModelFromXmlTest extends TestCase {
+
+	private static IFacetedProject facetedProject;
+	private EJBJar fixture;
+
+	public static TestSuite suite() throws Exception {
+		TestSuite suite = new TestSuite();
+		setUpProject();
+		suite.addTestSuite(CreateModelFromXmlTest.class);
+		return suite;
+	}
+	
+	// @BeforeClass
+	public static void setUpProject() throws Exception {
+		facetedProject = AbstractTest.createEjbProject(CreateModelFromXmlTest.class.getSimpleName());
+		createProjectContent();
+	}
+
+	// @AfterClass
+	public static void tearDownAfterClass() throws InterruptedException {
+		AbstractTest.deleteProject(CreateModelFromXmlTest.class.getSimpleName());
+	}
+
+	private static void createProjectContent() throws Exception {
+		setEjbJarXmlContent();
+	}
+
+	private static void setEjbJarXmlContent() throws IOException, CoreException {
+		IFile file = facetedProject.getProject().getFile(new Path("ejbModule/META-INF/ejb-jar.xml"));
+		String content = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+				+ "<ejb-jar version=\"3.0\" xmlns=\"http://java.sun.com/xml/ns/javaee\" "
+				+ "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" "
+				+ "xsi:schemaLocation=\"http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd\">"
+				+ "<enterprise-beans>" + "		<session>" + "			<ejb-name>com.sap.SessionBean</ejb-name>"
+				+ "			<ejb-class>com.sap.SessionBean</ejb-class>" + "			<session-type>Stateless</session-type>"
+				+ "		</session>" + "	</enterprise-beans>" + "</ejb-jar>";
+
+		ByteArrayOutputStream stream = new ByteArrayOutputStream();
+		stream.write(content.getBytes());
+		file.setContents(new ByteArrayInputStream(stream.toByteArray()), IResource.FORCE, new NullProgressMonitor());
+	}
+
+	/**
+	 * @throws java.lang.Exception
+	 */
+	// @Before
+	public void setUp() throws Exception {
+		IModelProvider provider = ModelProviderManager.getModelProvider(facetedProject.getProject());
+		fixture = (EJBJar) provider.getModelObject();
+	}
+
+	// @Test
+	public void testGetBeans() {
+		assertEquals(new Integer(1), new Integer(fixture.getEnterpriseBeans().getSessionBeans().size()));
+	}
+
+	// @Test
+	public void testSessionBean() {
+		SessionBean bean = (SessionBean) fixture.getEnterpriseBeans().getSessionBeans().get(0);
+		assertEquals("com.sap.SessionBean", bean.getEjbName());
+		assertEquals("com.sap.SessionBean", bean.getEjbClass());
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/ejb/tests/DeleteProjectTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/ejb/tests/DeleteProjectTest.java
new file mode 100644
index 0000000..6849cab
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/ejb/tests/DeleteProjectTest.java
@@ -0,0 +1,146 @@
+/***********************************************************************
+ * Copyright (c) 2008 by SAP AG, Walldorf. 
+ * 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:
+ *     SAP AG - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jst.jee.model.ejb.tests;
+
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IPackageFragment;
+import org.eclipse.jdt.core.IPackageFragmentRoot;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jst.j2ee.dependency.tests.util.ProjectUtil;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.j2ee.model.IModelProvider;
+import org.eclipse.jst.j2ee.model.ModelProviderManager;
+import org.eclipse.jst.javaee.ejb.EJBJar;
+import org.eclipse.jst.jee.model.tests.AbstractTest;
+import org.eclipse.jst.jee.model.tests.SynchronousModelChangedListener;
+import org.eclipse.wst.common.project.facet.core.IFacetedProject;
+import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
+
+/**
+ * This is a test for deleting a project and updating the model providers.
+ * 
+ * @author Kiril Mitov k.mitov@sap.com
+ * 
+ */
+public class DeleteProjectTest extends TestCase {
+
+	public static TestSuite suite() {
+		TestSuite suite = new TestSuite(DeleteProjectTest.class);
+		return suite;
+	}
+
+	private static void createProjectContent(IFacetedProject facetedProject) throws CoreException {
+		IJavaProject javaProject = JavaCore.create(facetedProject.getProject());
+		IFolder comFolder = javaProject.getProject().getFolder("ejbModule/com");
+		comFolder.create(true, true, new NullProgressMonitor());
+		IPackageFragmentRoot root = javaProject.getPackageFragmentRoot(comFolder);
+		IPackageFragment fragment = root.createPackageFragment("sap", true, new NullProgressMonitor());
+		createSessionBean(fragment);
+		createSessionBeanLocal(fragment);
+		createBeanWithName(fragment);
+	}
+
+	private static void createBeanWithName(IPackageFragment fragment) throws JavaModelException {
+		String content = String.format("package com.sap;" + "import javax.ejb.Stateless;"
+				+ "@Stateless(name=\"%s\") public class BeanWithName implements SessionBeanLocal {}", "beanWithName");
+		fragment.createCompilationUnit("BeanWithName.java", content, true, null);
+	}
+
+	private static void createSessionBeanLocal(IPackageFragment fragment) throws JavaModelException {
+		fragment.createCompilationUnit("SessionBeanLocal.java", "package com.sap;" + "import javax.ejb.Local;"
+				+ "@Local public interface SessionBeanLocal {}", true, null);
+	}
+
+	private static void createSessionBean(IPackageFragment fragment) throws JavaModelException {
+		fragment.createCompilationUnit("SessionBean.java", "package com.sap;" + "import javax.ejb.Stateless;"
+				+ "@Stateless public class SessionBean implements SessionBeanLocal {}", true, null);
+	}
+
+	/**
+	 * The same instance of the model provider is preserved during deleting the
+	 * project. After the project is deleted the instance of the IModelProvider
+	 * must return <code>null</code> for model object
+	 * 
+	 * @throws Exception
+	 */
+	// @Test
+	public void testDeleteProjectSameProvider() throws Exception {
+		IProject project = ProjectUtil.createEJBProject(DeleteProjectTest.class.getSimpleName()
+				+ "testDeleteProjectSameProvider", null, J2EEVersionConstants.EJB_3_0_ID, true);
+		IFacetedProject facetedProject = ProjectFacetsManager.create(project);
+		createProjectContent(facetedProject);
+		IModelProvider provider = ModelProviderManager.getModelProvider(facetedProject.getProject());
+		EJBJar firstModel = (EJBJar) provider.getModelObject();
+		assertNotNull(firstModel);
+		assertEquals(firstModel, provider.getModelObject());
+
+		SynchronousModelChangedListener listener = new SynchronousModelChangedListener(1);
+		provider.addListener(listener);
+		AbstractTest.deleteProject(facetedProject.getProject().getName());
+		assertTrue(listener.waitForEvents());
+		provider.removeListener(listener);
+
+		try {
+			EJBJar secondModel = (EJBJar) provider.getModelObject();
+			fail("IllegalStateException expected because the project is deleted and can not be accessed.");
+		} catch (IllegalStateException e) {
+		}
+	}
+
+	// @Test(expected = IllegalArgumentException.class)
+	public void testProviderForNonExistingProject() {
+		IProject nonExistingProject = ResourcesPlugin.getWorkspace().getRoot().getProject(
+					"testProviderForNonExistingProject");
+		assertFalse(nonExistingProject.exists());
+		IModelProvider modelProvider = ModelProviderManager.getModelProvider(nonExistingProject);
+		assertNull(modelProvider);	
+	}
+
+	/**
+	 * Get the model for a project. Close the project. Get the model from the
+	 * same model provider. The model should be null because the project is
+	 * closed.
+	 * 
+	 * @throws Exception
+	 */
+	// @Test
+	public void testCloseProjectSameProvider() throws Exception {
+		IProject project = ProjectUtil.createEJBProject(DeleteProjectTest.class.getSimpleName() + "testClose", null,
+				J2EEVersionConstants.EJB_3_0_ID, true);
+		IFacetedProject facetedProject = ProjectFacetsManager.create(project);
+		createProjectContent(facetedProject);
+		IModelProvider provider = ModelProviderManager.getModelProvider(facetedProject.getProject());
+		EJBJar firstModel = (EJBJar) provider.getModelObject();
+		assertNotNull(firstModel);
+		assertEquals(firstModel, provider.getModelObject());
+
+		SynchronousModelChangedListener listener = new SynchronousModelChangedListener(1);
+		provider.addListener(listener);
+		AbstractTest.closeProject(facetedProject.getProject().getName());
+		assertTrue(listener.waitForEvents());
+		provider.removeListener(listener);
+		try {
+			EJBJar secondModel = (EJBJar) provider.getModelObject();
+			fail("IllegalStateExceptino expected because the project is deleted and can not be accessed.");
+		} catch (IllegalStateException e) {
+		}
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/ejb/tests/EJB3MergedModelProviderFactoryTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/ejb/tests/EJB3MergedModelProviderFactoryTest.java
new file mode 100644
index 0000000..199b6ce
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/ejb/tests/EJB3MergedModelProviderFactoryTest.java
@@ -0,0 +1,75 @@
+/***********************************************************************
+ * Copyright (c) 2008 by SAP AG, Walldorf. 
+ * 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:
+ *     SAP AG - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jst.jee.model.ejb.tests;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.jst.j2ee.dependency.tests.util.ProjectUtil;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.j2ee.model.IModelProvider;
+import org.eclipse.jst.jee.model.internal.Ejb3MergedModelProviderFactory;
+
+/**
+ * @author Kiril Mitov k.mitov@sap.com
+ * 
+ */
+public class EJB3MergedModelProviderFactoryTest extends TestCase {
+
+	private Ejb3MergedModelProviderFactory fixture;
+
+	public static Test suite() {
+		TestSuite suite = new TestSuite(EJB3MergedModelProviderFactoryTest.class);
+		return suite;
+	}
+
+	protected void setUp() throws Exception {
+		super.setUp();
+		fixture = new Ejb3MergedModelProviderFactory();
+	}
+
+	protected void tearDown() throws Exception {
+		super.tearDown();
+	}
+
+	public void testCreateForProject() {
+		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(
+				this.getClass().getSimpleName() + this.getName());
+		IModelProvider provider = fixture.create(project);
+		assertNotNull(provider);
+	}
+
+	public void testSameProjectDisposedProvider() {
+		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(
+				this.getClass().getSimpleName() + this.getName());
+		IModelProvider provider = fixture.create(project);
+		assertFalse(provider.equals(fixture.create(project)));
+		assertNotSame(provider, fixture.create(project));
+	}
+
+	/**
+	 * Same provider must be returned for the same project.
+	 * 
+	 * @throws Exception
+	 */
+	public void testSameProject() throws Exception {
+		IProject project = ProjectUtil.createEJBProject(this.getClass().getSimpleName() + this.getName(), null,
+				J2EEVersionConstants.EJB_3_0_ID, true);
+		IModelProvider provider = fixture.create(project);
+		provider.getModelObject();
+		IModelProvider secondProvider = fixture.create(project);
+		assertEquals(provider.getModelObject(), secondProvider.getModelObject());
+		assertEquals(provider, secondProvider);
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/ejb/tests/EJB3MergedModelProviderTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/ejb/tests/EJB3MergedModelProviderTest.java
new file mode 100644
index 0000000..5cfda8a
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/ejb/tests/EJB3MergedModelProviderTest.java
@@ -0,0 +1,338 @@
+/***********************************************************************
+ * Copyright (c) 2008 by SAP AG, Walldorf. 
+ * 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:
+ *     SAP AG - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jst.jee.model.ejb.tests;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import junit.framework.TestSuite;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IPackageFragment;
+import org.eclipse.jdt.core.IPackageFragmentRoot;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jst.j2ee.dependency.tests.util.ProjectUtil;
+import org.eclipse.jst.j2ee.ejb.internal.operations.AddSessionBeanOperation;
+import org.eclipse.jst.j2ee.ejb.internal.operations.INewSessionBeanClassDataModelProperties;
+import org.eclipse.jst.j2ee.ejb.internal.operations.NewSessionBeanClassDataModelProvider;
+import org.eclipse.jst.j2ee.ejb.internal.operations.StateType;
+import org.eclipse.jst.j2ee.ejb.project.operations.IEjbFacetInstallDataModelProperties;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.j2ee.internal.ejb.archiveoperations.EjbClientJarCreationDataModelProvider;
+import org.eclipse.jst.j2ee.internal.ejb.archiveoperations.IEjbClientJarCreationDataModelProperties;
+import org.eclipse.jst.j2ee.model.IModelProvider;
+import org.eclipse.jst.j2ee.model.ModelProviderManager;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetInstallDataModelProperties;
+import org.eclipse.jst.javaee.ejb.EJBJar;
+import org.eclipse.jst.jee.model.internal.Ejb3ModelProvider;
+import org.eclipse.jst.jee.model.tests.AbstractAnnotationModelTest;
+import org.eclipse.jst.jee.model.tests.AbstractTest;
+import org.eclipse.jst.jee.model.tests.SynchronousModelChangedListener;
+import org.eclipse.jst.jee.model.tests.TestUtils;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
+import org.eclipse.wst.common.project.facet.core.IFacetedProject;
+import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
+
+/**
+ * @author Kiril Mitov k.mitov@sap.com
+ * 
+ */
+public class EJB3MergedModelProviderTest extends AbstractAnnotationModelTest {
+
+	private static final String EJB_PROJECT_NAME = EJB3MergedModelProviderTest.class.getSimpleName();
+	private static final String EAR_PROJECT_NAME = EJB_PROJECT_NAME + "ear";
+	private static final String CLIENT_NAME = EJB_PROJECT_NAME + "Client";
+
+	public static TestSuite suite() throws Exception {
+		TestSuite suite = new TestSuite(EJB3MergedModelProviderTest.class);
+		setUpProject();
+		return suite;
+	}
+
+	// @BeforeClass
+	public static void setUpProject() throws Exception {
+		ProjectUtil.createEARProject(EAR_PROJECT_NAME);
+		IProject project = ProjectUtil.createEJBProject(EJB_PROJECT_NAME, EAR_PROJECT_NAME, CLIENT_NAME,
+				J2EEVersionConstants.EJB_3_0_ID, true);
+		IFacetedProject facetedProject = ProjectFacetsManager.create(project);
+		IProject clientProject = ResourcesPlugin.getWorkspace().getRoot().getProject(CLIENT_NAME);
+		createProjectContent(facetedProject.getProject());
+		createClientProjectContent(clientProject);
+	}
+
+	private static void createClientProjectContent(IProject clientProject) throws Exception {
+		IJavaProject javaProject = JavaCore.create(clientProject);
+		IFolder comFolder = javaProject.getProject().getFolder("ejbModule/com");
+		comFolder.create(true, true, new NullProgressMonitor());
+		comFolder.getFolder("sap").create(true, true, null);
+		IPackageFragmentRoot root = javaProject.getPackageFragmentRoot(comFolder);
+		IPackageFragment fragment = root.createPackageFragment("sap", true, new NullProgressMonitor());
+		createSessionBeanLocal(fragment);
+	}
+
+	// @AfterClass
+	public static void tearDownAfterClass() throws InterruptedException {
+		AbstractTest.deleteProject(EJB3MergedModelProviderTest.class.getSimpleName());
+	}
+
+	private static void createProjectContent(IProject project) throws Exception {
+		IJavaProject javaProject = JavaCore.create(project);
+		IFolder comFolder = javaProject.getProject().getFolder("ejbModule/com");
+		comFolder.create(true, true, new NullProgressMonitor());
+		comFolder.getFolder("sap").create(true, true, null);
+		IPackageFragmentRoot root = javaProject.getPackageFragmentRoot(comFolder);
+		IPackageFragment fragment = root.createPackageFragment("sap", true, new NullProgressMonitor());
+		createSessionBean(fragment);
+	}
+
+	// @Before
+	public void setUp() throws Exception {
+		super.setUp();
+		if (facetedProject == null)
+			return;
+		fixture = ModelProviderManager.getModelProvider(facetedProject.getProject());
+		clientProject = ResourcesPlugin.getWorkspace().getRoot().getProject(CLIENT_NAME);
+	}
+
+	// @After
+	public void tearDown() throws Exception {
+	}
+
+	// @Test
+	public void testAddBeanWithOperation() throws Exception {
+		final String ejbProjectName = this.getClass().getSimpleName() + this.getName();
+		final String clientName = ejbProjectName + "Client";
+		IProject project = ProjectUtil.createEJBProject(ejbProjectName, ejbProjectName + "ear", clientName,
+				J2EEVersionConstants.EJB_3_0_ID, true);
+		IDataModelOperation operation = createBeanOperation("testAddBeanWithOperation", "com.sap", project.getName());
+		IModelProvider provider = ModelProviderManager.getModelProvider(project);
+
+		EJBJar result = (EJBJar) provider.getModelObject();
+		assertEquals(new Integer(0), new Integer(result.getEnterpriseBeans().getSessionBeans().size()));
+		executeAndWait(operation, provider);
+
+		result = (EJBJar) provider.getModelObject();
+		assertEquals(new Integer(1), new Integer(result.getEnterpriseBeans().getSessionBeans().size()));
+		assertNotNull(TestUtils.getSessionBean(result, "testAddBeanWithOperation"));
+	}
+
+	// @Test
+	public void testAddBeanWithOperationPreserveListeners() throws Exception {
+		final String ejbProjectName = this.getClass().getSimpleName() + this.getName();
+		IProject project = ProjectUtil.createEJBProject(ejbProjectName, null, J2EEVersionConstants.EJB_3_0_ID, true);
+		IModelProvider provider = ModelProviderManager.getModelProvider(project);
+		IDataModelOperation operation = createBeanOperation("testAddBeanWithOperationPreserveListeners1", "com.sap",
+				project.getName());
+		SynchronousModelChangedListener preservedListener = new SynchronousModelChangedListener(2);
+		provider.addListener(preservedListener);
+		executeAndWait(operation, provider);
+		assertNotNull(TestUtils.getSessionBean((EJBJar) provider.getModelObject(),
+				"testAddBeanWithOperationPreserveListeners1"));
+
+		int oldReceivedEvents = preservedListener.getReceivedEvents().size();
+		operation = createBeanOperation("testAddBeanWithOperationPreserveListeners2", "com.sap", project.getName());
+		executeAndWait(operation, provider);
+		assertNotNull(TestUtils.getSessionBean((EJBJar) provider.getModelObject(),
+				"testAddBeanWithOperationPreserveListeners2"));
+		assertTrue(preservedListener.getReceivedEvents().size() > oldReceivedEvents);
+	}
+
+	// /**
+	// * Execute an operation on the model. Change the dd. The listeners should
+	// * not be removed. https://bugs.eclipse.org/bugs/show_bug.cgi?id=241496
+	// *
+	// * @throws Exception
+	// */
+	// public void testPreserveListenersChangeDD() throws Exception {
+	// final String ejbProjectName = this.getClass().getSimpleName() +
+	// this.getName();
+	// final IProject project = createEjbProjectWithoutClient(ejbProjectName,
+	// ejbProjectName + "ear");
+	// final IDataModel model = createModelEjbProjectWithClient(ejbProjectName);
+	// SynchronousModelChangedListener preserveListener = new
+	// SynchronousModelChangedListener(2);
+	//
+	// IModelProvider provider = ModelProviderManager.getModelProvider(project);
+	// provider.addListener(preserveListener);
+	// IFile ejbJarXml = project.getFile("ejbModule/META-INF/ejb-jar.xml");
+	// String content = TestUtils.getFileContent(ejbJarXml);
+	// executeAndWait(model.getDefaultOperation(), provider);
+	// assertNotNull(((EJBJar) provider.getModelObject()).getEjbClientJar());
+	//
+	// int oldEventsSize = preserveListener.getReceivedEvents().size();
+	// AbstractTest.saveFile(ejbJarXml, content);
+	// assertTrue(preserveListener.waitForEvents());
+	// assertTrue(preserveListener.getReceivedEvents().size() > oldEventsSize);
+	// assertNull(((EJBJar) provider.getModelObject()).getEjbClientJar());
+	// provider.removeListener(preserveListener);
+	// }
+
+	private IDataModel createModelEjbProjectWithClient(final String ejbProjectName) {
+		final IDataModel model = DataModelFactory.createDataModel(new EjbClientJarCreationDataModelProvider());
+		model.setProperty(IEjbClientJarCreationDataModelProperties.EJB_PROJECT_NAME, ejbProjectName);
+		model.setProperty(IEjbClientJarCreationDataModelProperties.PROJECT_NAME, CLIENT_NAME + "newName");
+		return model;
+	}
+
+	private IProject createEjbProjectWithoutClient(final String ejbProjectName, final String earProjectName)
+			throws Exception {
+		Map<String, Object> facetModelProperties = new HashMap<String, Object>();
+		facetModelProperties.put(IEjbFacetInstallDataModelProperties.CREATE_CLIENT, false);
+		facetModelProperties.put(IJ2EEFacetInstallDataModelProperties.GENERATE_DD, true);
+		final IProject project = ProjectUtil.createEJBProject(ejbProjectName, earProjectName, facetModelProperties,
+				J2EEVersionConstants.EJB_3_0_ID, true);
+		return project;
+	}
+
+	public void testCreateClientProjectWithOperation() throws Exception {
+		final String ejbProjectName = this.getClass().getSimpleName() + this.getName();
+		final IProject project = createEjbProjectWithoutClient(ejbProjectName, ejbProjectName + "ear");
+		final IModelProvider provider = new Ejb3ModelProvider(project);
+		provider.getModelObject();
+		final IDataModel model = createModelEjbProjectWithClient(ejbProjectName);
+
+		executeAndWait(model.getDefaultOperation(), provider);
+
+		EJBJar result = (EJBJar) provider.getModelObject();
+		assertEquals(CLIENT_NAME + "newNameClient" + ".jar", result.getEjbClientJar());
+	}
+
+	private void executeAndWait(IDataModelOperation operation, IModelProvider provider) throws InterruptedException,
+			ExecutionException {
+		SynchronousModelChangedListener listener = new SynchronousModelChangedListener(1);
+		provider.addListener(listener);
+		operation.execute(null, null);
+		assertTrue(listener.waitForEvents());
+		provider.removeListener(listener);
+	}
+
+	// @Test
+	// public void testChangeClientProject() throws Exception {
+	// final String ejbProjectName = this.getClass().getSimpleName() +
+	// this.getName();
+	// final String clientName = ejbProjectName + "Client";
+	// IProject project = ProjectUtil.createEJBProject(ejbProjectName,
+	// ejbProjectName + "ear", clientName,
+	// J2EEVersionConstants.EJB_3_0_ID, true);
+	//
+	// IFile dd =
+	// facetedProject.getProject().getFile("ejbModule/META-INF/ejb-jar.xml");
+	// final String ddWithClient = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+	// +
+	// "<ejb-jar xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://java.sun.com/xml/ns/javaee\" xmlns:ejb=\"http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd\" xsi:schemaLocation=\"http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd\" version=\"3.0\">"
+	// + "<ejb-client-jar>" + clientName + ".jar</ejb-client-jar></ejb-jar>";
+	// final String ddNoClient = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+	// +
+	// "<ejb-jar xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://java.sun.com/xml/ns/javaee\" xmlns:ejb=\"http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd\" xsi:schemaLocation=\"http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd\" version=\"3.0\">"
+	// + "</ejb-jar>";
+	// // load the model
+	// IModelProvider provider = ModelProviderManager.getModelProvider(project);
+	//
+	// EJBJar result = (EJBJar) provider.getModelObject();
+	// /*
+	// * From now on the model provider should not listener for changes in
+	// * the client project since it is not described in the deployment
+	// * descriptor.
+	// */
+	// saveFileAndUpdate(dd, ddNoClient, provider);
+	//
+	// /*
+	// * Change the interface. The model should not be updated.
+	// */
+	// final String remoteInterface = "package com.sap;" +
+	// "import javax.ejb.Remote;"
+	// + "@Remote public interface SessionBeanLocal {}";
+	// IFile interfaceFile =
+	// clientProject.getFile("ejbModule/com/sap/SessionBeanLocal.java");
+	// SynchronousModelChangedListener listener = new
+	// SynchronousModelChangedListener(1);
+	// provider.addListener(listener);
+	// AbstractTest.saveFile(interfaceFile, remoteInterface);
+	// assertFalse(listener.waitForEvents());
+	// provider.removeListener(listener);
+	// result = (EJBJar) provider.getModelObject();
+	// SessionBean bean = TestUtils.getSessionBean(result, "SessionBean");
+	// assertEquals(new Integer(1), new
+	// Integer(bean.getBusinessLocals().size()));
+	// assertTrue(bean.getBusinessRemotes().isEmpty());
+	//
+	// /*
+	// * The deployment descriptor is changed. The bean should now contain the
+	// * interface in the remotes list
+	// */
+	// saveFileAndUpdate(dd, ddWithClient, provider);
+	// bean = TestUtils.getSessionBean(result, "SessionBean");
+	// assertEquals(new Integer(1), new
+	// Integer(bean.getBusinessRemotes().size()));
+	// assertTrue(bean.getBusinessLocals().isEmpty());
+	//
+	// // revet the changes
+	// saveFileAndUpdate(facetedProject.getProject().getFile("ejbModule/com/sap/SessionBean.java"),
+	// beanContent);
+	// saveFileAndUpdate(interfaceFile, localInterfaceContent);
+	// }
+
+//	/**
+//	 * Create an ejb project with a client project. Add a session bean to the
+//	 * project. After creating the ejb project a client project is created. The
+//	 * modify method of the provider is called passing a runnable for setting
+//	 * the ejbClient. This is the current implementation of how a client is
+//	 * create.
+//	 * 
+//	 * The test doing exactly this. Create an ear project. Create and ejb
+//	 * project with a client project. Check that the model nows about the
+//	 * ejbClient project. Then add a session bean to the ejb project. The
+//	 * listener must be notified.
+//	 * 
+//	 * @throws Exception
+//	 */
+//	public void testAddSessionBean() throws Exception {
+//		final String ejbProjectName = this.getClass().getSimpleName() + this.getName();
+//
+//		// create the project
+//		ProjectUtil.createEARProject(ejbProjectName + "ear", true);
+//		IProject project = ProjectUtil.createEJBProject(ejbProjectName, ejbProjectName + "ear", ejbProjectName
+//				+ "client", J2EEVersionConstants.EJB_3_0_ID, true);
+//		IFolder comFolder = project.getFolder("ejbModule/com");
+//		comFolder.create(true, true, null);
+//		comFolder.getFolder("sap").create(true, true, null);
+//
+//		// get the model provider
+//		IModelProvider provider = ModelProviderManager.getModelProvider(project);
+//		EJBJar result = (EJBJar) provider.getModelObject();
+//		assertEquals(ejbProjectName + "Client.jar", result.getEjbClientJar());
+//		IDataModelOperation operation = createBeanOperation("testAddSessionBeanClientExists", "com.sap", project
+//				.getName());
+//		executeAndWait(operation, provider);
+//
+//		result = (EJBJar) provider.getModelObject();
+//		assertNotNull(TestUtils.getSessionBean(result, "testAddSessionBeanClientExists"));
+//	}
+
+	protected IDataModelOperation createBeanOperation(String className, String javaPackage, String projectName) {
+		NewSessionBeanClassDataModelProvider dataProvider = new NewSessionBeanClassDataModelProvider();
+		IDataModel dataModel = DataModelFactory.createDataModel(dataProvider);
+		dataModel.setStringProperty(INewSessionBeanClassDataModelProperties.CLASS_NAME, className);
+		dataModel.setStringProperty(INewSessionBeanClassDataModelProperties.STATE_TYPE, StateType.STATELESS.toString());
+		dataModel.setStringProperty(INewSessionBeanClassDataModelProperties.EJB_NAME, className);
+		dataModel.setStringProperty(INewSessionBeanClassDataModelProperties.JAVA_PACKAGE, javaPackage);
+		dataModel.setStringProperty(INewSessionBeanClassDataModelProperties.PROJECT_NAME, projectName);
+		AddSessionBeanOperation operation = new AddSessionBeanOperation(dataModel);
+		return operation;
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/ejb/tests/EJBAnnotationReaderWithClientTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/ejb/tests/EJBAnnotationReaderWithClientTest.java
new file mode 100644
index 0000000..6acd8fe
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/ejb/tests/EJBAnnotationReaderWithClientTest.java
@@ -0,0 +1,178 @@
+/***********************************************************************
+ * Copyright (c) 2008 by SAP AG, Walldorf. 
+ * 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:
+ *     SAP AG - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jst.jee.model.ejb.tests;
+
+import junit.framework.TestSuite;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IPackageFragmentRoot;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jst.j2ee.dependency.tests.util.ProjectUtil;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.javaee.ejb.SessionBean;
+import org.eclipse.jst.jee.model.internal.EJBAnnotationReader;
+import org.eclipse.jst.jee.model.internal.common.AbstractAnnotationModelProvider;
+import org.eclipse.jst.jee.model.tests.AbstractAnnotationModelTest;
+import org.eclipse.jst.jee.model.tests.AbstractTest;
+import org.eclipse.jst.jee.model.tests.TestUtils;
+
+/**
+ * Test the cases for an EJBProject that has a client project connected with it.
+ * The test is for EJBAnnotationReader.
+ * 
+ * @author Kiril Mitov k.mitov@sap.com
+ * 
+ */
+public class EJBAnnotationReaderWithClientTest extends AbstractAnnotationModelTest {
+
+	private static final String ejbProjectName = EJBAnnotationReaderWithClientTest.class.getSimpleName();
+	private static final String earProjectName = ejbProjectName + "ear";
+	private static final String clientName = ejbProjectName + "Client";
+
+	public static TestSuite suite() throws Exception {
+		TestSuite suite = new TestSuite(EJBAnnotationReaderWithClientTest.class);
+		return suite;
+	}
+
+	// @BeforeClass
+	public static void setUpProject() throws Exception {
+		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(ejbProjectName);
+		if (!project.exists())
+		{
+			ProjectUtil.createEARProject(ejbProjectName + "ear", true);
+			project = ProjectUtil.createEJBProject(ejbProjectName, earProjectName, clientName,
+					J2EEVersionConstants.EJB_3_0_ID, true);
+			IProject clientProject = ResourcesPlugin.getWorkspace().getRoot().getProject(clientName);
+			createProjectContent(project);
+			createClientProjectContent(clientProject);
+		}
+	}
+
+	private static void createClientProjectContent(IProject clientProject) throws Exception {
+		IJavaProject javaProject = JavaCore.create(clientProject);
+		IFolder comFolder = javaProject.getProject().getFolder("ejbModule/com");
+		comFolder.create(true, true, new NullProgressMonitor());
+		comFolder.getFolder("sap").create(true, true, null);
+		IPackageFragmentRoot root = javaProject.getPackageFragmentRoot(comFolder);
+		root.createPackageFragment("sap", true, new NullProgressMonitor());
+	}
+
+	// @AfterClass
+	public static void tearDownAfterClass() throws InterruptedException {
+		AbstractTest.deleteProject(EjbAnnotationReaderTest.class.getSimpleName());
+	}
+
+	private static void createProjectContent(IProject project) throws Exception {
+		IJavaProject javaProject = JavaCore.create(project);
+		IFolder comFolder = javaProject.getProject().getFolder("ejbModule/com");
+		comFolder.create(true, true, new NullProgressMonitor());
+		comFolder.getFolder("sap").create(true, true, null);
+		IPackageFragmentRoot root = javaProject.getPackageFragmentRoot(comFolder);
+		root.createPackageFragment("sap", true, new NullProgressMonitor());
+	}
+
+	// @Before
+	@Override
+	protected void setUp() throws Exception {
+		setUpProject();
+		super.setUp();
+		clientProject = ResourcesPlugin.getWorkspace().getRoot().getProject(clientName);
+		fixture = new EJBAnnotationReader(facetedProject, clientProject);
+	}
+
+	// @After
+	@Override
+	protected void tearDown() throws Exception {
+		((AbstractAnnotationModelProvider) fixture).dispose();
+	}
+
+	// @Test
+	public void testLocalInterfaceInClient() throws Exception {
+		IFile beanFile = facetedProject.getProject().getFile("ejbModule/com/sap/testLocalInterfaceInClient.java");
+		IFile interfaceFile = clientProject.getProject().getFile("ejbModule/com/sap/InterfaceForAddedBean.java");
+
+		final String beanContent = "package com.sap;" + "import javax.ejb.Stateless;"
+				+ "@Stateless public class testLocalInterfaceInClient implements InterfaceForAddedBean {}";
+		final String interfaceContent = "package com.sap;" + "public interface InterfaceForAddedBean {} ";
+
+		// add the bean
+		saveFileAndUpdate(beanFile, beanContent);
+		SessionBean result = TestUtils.getSessionBean(getEJBJar(), "testLocalInterfaceInClient");
+		assertNotNull(result);
+		assertEquals("InterfaceForAddedBean", result.getBusinessLocals().get(0));
+
+		// add interface. The bean should now resolve the interface
+		saveFileAndUpdate(interfaceFile, interfaceContent);
+		result = TestUtils.getSessionBean(getEJBJar(), "testLocalInterfaceInClient");
+		assertNotNull(result);
+		assertEquals("com.sap.InterfaceForAddedBean", result.getBusinessLocals().get(0));
+
+		// revert the change
+		deleteFileAndUpdate(beanFile);
+		// the bean is delete. Not update will occur on the annotation reader
+		AbstractTest.deleteFile(interfaceFile);
+	}
+
+	/**
+	 * The two beans are in the ejb project. The interface is in the client
+	 * project. Change this interface to remote.
+	 * 
+	 * @throws Exception
+	 */
+	// @Test
+	public void testLocalToRemoteInterfaceInClient() throws Exception {
+		IFile bean1File = facetedProject.getProject().getFile(
+				"ejbModule/com/sap/testLocalToRemoteInterfaceInClient1.java");
+		IFile bean2File = facetedProject.getProject().getFile(
+				"ejbModule/com/sap/testLocalToRemoteInterfaceInClient2.java");
+		IFile interfaceFile = clientProject.getProject().getFile("ejbModule/com/sap/InterfaceForAddedBean.java");
+
+		final String bean1Content = "package com.sap;" + "import javax.ejb.Stateless;"
+				+ "@Stateless public class testLocalToRemoteInterfaceInClient1 implements InterfaceForAddedBean {}";
+		final String bean2Content = "package com.sap;" + "import javax.ejb.Stateless;"
+				+ "@Stateless public class testLocalToRemoteInterfaceInClient2 implements InterfaceForAddedBean {}";
+		// add the bean. The interface is in the local list.
+		saveFileAndUpdate(bean1File, bean1Content);
+		saveFileAndUpdate(bean2File, bean2Content);
+		SessionBean result1 = TestUtils.getSessionBean(getEJBJar(), "testLocalToRemoteInterfaceInClient1");
+		assertEquals("InterfaceForAddedBean", result1.getBusinessLocals().get(0));
+		SessionBean result2 = TestUtils.getSessionBean(getEJBJar(), "testLocalToRemoteInterfaceInClient2");
+		assertEquals("InterfaceForAddedBean", result2.getBusinessLocals().get(0));
+
+		// add interface. The bean should now resolve the interface and add it
+		// to local interfaces.
+		final String interfaceContent = "package com.sap;" + "public interface InterfaceForAddedBean {} ";
+		saveFileAndUpdate(interfaceFile, interfaceContent);
+
+		// change the interface to remote
+		final String interfaceContentRemote = "package com.sap;" + "import javax.ejb.Remote"
+				+ "@Remote public interface InterfaceForAddedBean {} ";
+		saveFileAndUpdate(interfaceFile, interfaceContentRemote);
+		result1 = TestUtils.getSessionBean(getEJBJar(), "testLocalToRemoteInterfaceInClient1");
+		assertEquals("com.sap.InterfaceForAddedBean", result1.getBusinessRemotes().get(0));
+		result2 = TestUtils.getSessionBean(getEJBJar(), "testLocalToRemoteInterfaceInClient2");
+		assertEquals("com.sap.InterfaceForAddedBean", result2.getBusinessRemotes().get(0));
+		assertTrue(result1.getBusinessLocals().isEmpty());
+		assertTrue(result2.getBusinessLocals().isEmpty());
+
+		// revert the change
+		deleteFileAndUpdate(bean1File);
+		deleteFileAndUpdate(bean2File);
+		assertNull(TestUtils.getSessionBean(getEJBJar(), "testLocalToRemoteInterfaceInClient1"));
+		assertNull(TestUtils.getSessionBean(getEJBJar(), "testLocalToRemoteInterfaceInClient2"));
+		AbstractTest.deleteFile(interfaceFile);
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/ejb/tests/Ejb3ModelProviderTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/ejb/tests/Ejb3ModelProviderTest.java
new file mode 100644
index 0000000..f139178
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/ejb/tests/Ejb3ModelProviderTest.java
@@ -0,0 +1,83 @@
+/***********************************************************************
+ * Copyright (c) 2008 by SAP AG, Walldorf. 
+ * 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:
+ *     SAP AG - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jst.jee.model.ejb.tests;
+
+import java.util.Collection;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jst.j2ee.dependency.tests.util.ProjectUtil;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.j2ee.model.IModelProviderEvent;
+import org.eclipse.jst.javaee.core.Description;
+import org.eclipse.jst.javaee.core.JavaeeFactory;
+import org.eclipse.jst.javaee.ejb.EJBJar;
+import org.eclipse.jst.jee.model.internal.Ejb3ModelProvider;
+import org.eclipse.jst.jee.model.tests.SynchronousModelChangedListener;
+import org.eclipse.wst.common.project.facet.core.IFacetedProject;
+import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
+
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+/**
+ * @author  Kiril Mitov k.mitov@sap.com
+ *
+ */
+public class Ejb3ModelProviderTest extends TestCase {
+
+	private static final String EAR_PROJECT_NAME = "earProject";
+	private static final String EJB_PROJECT_NAME = "ejbProject";
+
+	public static TestSuite suite() throws Exception {
+		TestSuite suite = new TestSuite(Ejb3ModelProviderTest.class);
+		return suite;
+	}
+
+	// @BeforeClass
+	public static void setUpProject() throws Exception {
+	}
+
+	/**
+	 * A notification should be send after a modification on the model.
+	 * @throws Exception 
+	 */
+	public void testModifyOnlyModelWithOperation() throws Exception {
+		ProjectUtil.createEARProject(EAR_PROJECT_NAME);
+		IProject project = ProjectUtil.createEJBProject(EJB_PROJECT_NAME, EAR_PROJECT_NAME,
+				J2EEVersionConstants.EJB_3_0_ID, true);
+		IFacetedProject facetedProject = ProjectFacetsManager.create(project);
+		SynchronousModelChangedListener listener = new SynchronousModelChangedListener(1);
+		final Ejb3ModelProvider modelProvider = new Ejb3ModelProvider(facetedProject.getProject());
+		assertNotNull(modelProvider.getModelObject());
+		modelProvider.addListener(listener);
+		modelProvider.modify(new Runnable() {
+			public void run() {
+				EJBJar modelObject = (EJBJar) modelProvider.getModelObject();
+				changeModelObject(modelObject);
+			}
+
+			private void changeModelObject(EJBJar modelObject) {
+				Description description = JavaeeFactory.eINSTANCE.createDescription();
+				modelObject.getDescriptions().add(description);
+			}
+		}, null);
+		assertTrue(listener.waitForEvents());
+		Collection<IModelProviderEvent> events = listener.getReceivedEvents();
+		assertEquals(1, events.size());
+		modelProvider.removeListener(listener);
+	}
+
+	@Override
+	protected void setUp() throws Exception {
+		super.setUp();
+		setUpProject();
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/ejb/tests/EjbAnnotationFactoryTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/ejb/tests/EjbAnnotationFactoryTest.java
new file mode 100644
index 0000000..4474d02
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/ejb/tests/EjbAnnotationFactoryTest.java
@@ -0,0 +1,303 @@
+/***********************************************************************
+ * Copyright (c) 2008 by SAP AG, Walldorf. 
+ * 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:
+ *     SAP AG - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jst.jee.model.ejb.tests;
+
+import junit.framework.TestSuite;
+
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jst.javaee.core.EjbLocalRef;
+import org.eclipse.jst.javaee.core.InjectionTarget;
+import org.eclipse.jst.javaee.core.ResourceRef;
+import org.eclipse.jst.javaee.ejb.MessageDrivenBean;
+import org.eclipse.jst.javaee.ejb.RemoveMethodType;
+import org.eclipse.jst.javaee.ejb.SessionBean;
+import org.eclipse.jst.javaee.ejb.SessionType;
+import org.eclipse.jst.javaee.ejb.TransactionType;
+import org.eclipse.jst.jee.model.internal.EjbAnnotationFactory;
+import org.eclipse.jst.jee.model.internal.common.Result;
+import org.eclipse.jst.jee.model.tests.AbstractAnnotationFactoryTest;
+import org.eclipse.jst.jee.model.tests.TestUtils;
+
+/**
+ * Contains tests for {@link EjbAnnotationFactory}. This class includes test
+ * that do not depend on resolving types. Negative tests are also included here.
+ * 
+ * @author Kiril Mitov k.mitov@sap.com
+ */
+public class EjbAnnotationFactoryTest extends AbstractAnnotationFactoryTest {
+
+	public static TestSuite suite() {
+		TestSuite suite = new TestSuite(EjbAnnotationFactoryTest.class);
+		return suite;
+	}
+
+	/**
+	 * The content of the annotation is not valid.It should be an array.
+	 * 
+	 * @throws JavaModelException
+	 */
+	// @Test
+	public void testNotArrayLocal() throws JavaModelException {
+		final String beanContent = "package com.sap; "
+				+ "@Stateless @Local(value = java.util.List.class) public class testNotArrayLocal {}";
+		IType type = createCompilationUnit("testNotArrayLocal", beanContent).findPrimaryType();
+		Result result = fixture.createJavaeeObject(type);
+		SessionBean bean = (SessionBean) result.getMainObject();
+		assertTrue(bean.getBusinessLocals().isEmpty());
+	}
+
+	/**
+	 * The content of the annotation is not valid.It should be an array.
+	 * 
+	 * @throws JavaModelException
+	 */
+	// @Test
+	public void testNotArrayRemote() throws JavaModelException {
+		final String beanContent = "package com.sap; "
+				+ "@Stateless @Remote(value = java.util.List.class) public class testNotArrayRemote {}";
+		IType type = createCompilationUnit("testNotArrayRemote", beanContent).findPrimaryType();
+		Result result = fixture.createJavaeeObject(type);
+		SessionBean bean = (SessionBean) result.getMainObject();
+		assertTrue(bean.getBusinessRemotes().isEmpty());
+	}
+
+	// @Test
+	public void testNotArrayEjbs() throws JavaModelException {
+		final String beanContent = "package com.sap; "
+				+ "@Stateless @EJBs(value = @EJB()) public class testNotArrayEjbs {}";
+		IType type = createCompilationUnit("testNotArrayEjbs", beanContent).findPrimaryType();
+		Result result = fixture.createJavaeeObject(type);
+		SessionBean bean = (SessionBean) result.getMainObject();
+		assertTrue(bean.getEjbLocalRefs().isEmpty());
+	}
+
+	// @Test
+	public void testNotArrayResources() throws JavaModelException {
+		final String beanContent = "package com.sap; "
+				+ "@Stateless @Resources(value = @Resource(type = \"java.lang.Comparable\")) public class testNotArrayResources {}";
+		IType type = createCompilationUnit("testNotArrayResources", beanContent).findPrimaryType();
+		Result result = fixture.createJavaeeObject(type);
+		SessionBean bean = (SessionBean) result.getMainObject();
+		assertTrue(bean.getResourceRefs().isEmpty());
+	}
+
+	// @Test
+	public void testNotArrayDeclareRoles() throws JavaModelException {
+		final String beanContent = "package com.sap; "
+				+ "@Stateless @DeclareRoles(value = \"role1\") public class testNotArrayDeclareRoles {}";
+		IType type = createCompilationUnit("testNotArrayDeclareRoles", beanContent).findPrimaryType();
+		Result result = fixture.createJavaeeObject(type);
+		SessionBean bean = (SessionBean) result.getMainObject();
+		assertTrue(bean.getSecurityRoleRefs().isEmpty());
+	}
+
+	// @Test
+	public void testNotArrayActivationConfig() throws JavaModelException {
+		final String beanContent = "package com.sap; "
+				+ "@MessageDriven(activationConfig = "
+				+ "@ActivationConfigProperty(propertyName = \"name1\", propertyValue = \"value1\"),"
+				+ "@ActivationConfigProperty(propertyName = \"name2\", propertyValue = \"value2\")) public class testNotArrayActivationConfig {}";
+		IType type = createCompilationUnit("testNotArrayActivationConfig", beanContent).findPrimaryType();
+		Result result = fixture.createJavaeeObject(type);
+		MessageDrivenBean bean = (MessageDrivenBean) result.getMainObject();
+		assertNull(bean.getActivationConfig());
+	}
+
+	// @Test
+	public void testTimeout() throws Exception {
+		final String beanContent = "package com.sap;"
+				+ "@Stateless public class testTimeout implements SessionBeanLocal{"
+				+ "@Timeout public void timeoutMethod1(javax.ejb.Timer timer) {}"
+				+ "@Timeout public void timeoutMethod2(javax.ejb.Timer timer) {}"
+				+ "@Timeout public void timeoutMethod3() {}" + "}";
+		IType type = createCompilationUnit("testTimeout", beanContent).findPrimaryType();
+		Result result = fixture.createJavaeeObject(type);
+		SessionBean sessionBean = (SessionBean) result.getMainObject();
+		assertNotNull(sessionBean.getTimeoutMethod());
+		assertEquals("timeoutMethod2", sessionBean.getTimeoutMethod().getMethodName());
+		assertEquals("javax.ejb.Timer", sessionBean.getTimeoutMethod().getMethodParams().getMethodParams().get(0));
+	}
+
+	// @Test
+	public void testTimeoutStateful() throws Exception {
+		final String beanContent = "package com.sap;"
+				+ "@Stateful public class testTimeoutStateful implements SessionBeanLocal{"
+				+ "@Timeout public void timeoutMethod(javax.ejb.Timer timer) {}" + "}";
+		IType type = createCompilationUnit("testTimeoutStateful", beanContent).findPrimaryType();
+		Result result = fixture.createJavaeeObject(type);
+		SessionBean sessionBean = (SessionBean) result.getMainObject();
+		assertNotNull(sessionBean);
+		assertNull(sessionBean.getTimeoutMethod());
+	}
+	
+	// @Test
+	public void testSingleton() throws Exception {
+		final String beanContent = "package com.sap;"
+				+ "@Singleton public class testSingleton implements SessionBeanLocal{}";
+		IType type = createCompilationUnit("testSingleton", beanContent).findPrimaryType();
+		Result result = fixture.createJavaeeObject(type);
+		SessionBean sessionBean = (SessionBean) result.getMainObject();
+		assertNotNull(sessionBean);
+		assertTrue(sessionBean.getSessionType() == SessionType.SINGLETON_LITERAL);
+	}
+
+	// @Test
+	public void testTransactionManagementBean() throws Exception {
+		final String beanContent = "package com.sap;"
+				+ "@Stateful @TransactionManagement(value = TransactionManagementType.BEAN) "
+				+ "public class testTransactionManagementBean implements SessionBeanLocal{" + "}";
+		IType type = createCompilationUnit("testTransactionManagementBean", beanContent).findPrimaryType();
+		Result result = fixture.createJavaeeObject(type);
+		SessionBean sessionBean = (SessionBean) result.getMainObject();
+		assertNotNull(sessionBean);
+		assertEquals(TransactionType.BEAN_LITERAL, sessionBean.getTransactionType());
+
+	}
+
+	// @Test
+	public void testTransactionManagementContainer() throws Exception {
+		final String beanContent = "package com.sap;"
+				+ "@Stateful @TransactionManagement(value = TransactionManagementType.CONTAINER) "
+				+ "public class testTransactionManagementContainer implements SessionBeanLocal{" + "}";
+		IType type = createCompilationUnit("testTransactionManagementContainer", beanContent).findPrimaryType();
+		Result result = fixture.createJavaeeObject(type);
+		SessionBean sessionBean = (SessionBean) result.getMainObject();
+		assertNotNull(sessionBean);
+		assertEquals(TransactionType.CONTAINER_LITERAL, sessionBean.getTransactionType());
+	}
+
+	// @Test
+	public void testTransactionManagementContainerMDB() throws Exception {
+		final String beanContent = "package com.sap;"
+				+ "@MessageDriven @TransactionManagement(value = TransactionManagementType.CONTAINER) "
+				+ "public class testTransactionManagementContainerMDB {" + "}";
+		IType type = createCompilationUnit("testTransactionManagementContainerMDB", beanContent).findPrimaryType();
+		Result result = fixture.createJavaeeObject(type);
+		MessageDrivenBean messageBean = (MessageDrivenBean) result.getMainObject();
+		assertNotNull(messageBean);
+		assertEquals(TransactionType.CONTAINER_LITERAL, messageBean.getTransactionType());
+	}
+
+	// @Test
+	public void testTransactionManagementStaticImportContainer() throws Exception {
+		final String beanContent = "package com.sap; " + "import static TransactionManagementType.CONTAINER;"
+				+ "@Stateful @TransactionManagement(value = CONTAINER) "
+				+ "public class testTransactionManagementStaticImportContainer implements SessionBeanLocal{" + "}";
+		IType type = createCompilationUnit("testTransactionManagementStaticImportContainer", beanContent)
+				.findPrimaryType();
+		Result result = fixture.createJavaeeObject(type);
+		SessionBean sessionBean = (SessionBean) result.getMainObject();
+		assertEquals(TransactionType.CONTAINER_LITERAL, sessionBean.getTransactionType());
+	}
+
+	// @Test
+	public void testRemoveMethod() throws Exception {
+		final String beanContent = "package com.sap"
+				+ "@Stateful public class testRemoveMethod implements SessionBeanLocal {"
+				+ "@Remove public void removeMethod1() {}"
+				+ "@Remove(retainIfException = true) public void removeMethod2() {}"
+				+ "@Remove(retainIfException = true) public void removeMethodParam(java.lang.String str) {}" + "}";
+		IType type = createCompilationUnit("testRemoveMethod", beanContent).findPrimaryType();
+		Result result = fixture.createJavaeeObject(type);
+		SessionBean sessionBean = (SessionBean) result.getMainObject();
+		RemoveMethodType method1 = TestUtils.findRemoveMethodByName(sessionBean, "removeMethod1");
+		RemoveMethodType method2 = TestUtils.findRemoveMethodByName(sessionBean, "removeMethod2");
+		assertNotNull(method1);
+		assertNotNull(method2);
+		assertFalse(method1.isRetainIfException());
+		assertTrue(method2.isRetainIfException());
+		assertEquals(new Integer(2), new Integer(sessionBean.getRemoveMethods().size()));
+	}
+
+	// @Test
+	public void testRemoveMethodOnStateless() throws Exception {
+		final String beanContent = "package com.sap;"
+				+ "@Stateless public class testRemoveMethodOnStateless implements SessionBeanLocal {"
+				+ "@Remove public void removeMethod1() {}" + "}";
+		IType type = createCompilationUnit("testRemoveMethodOnStateless", beanContent).findPrimaryType();
+		Result result = fixture.createJavaeeObject(type);
+		SessionBean sessionBean = (SessionBean) result.getMainObject();
+		assertNotNull(sessionBean);
+		assertTrue(sessionBean.getRemoveMethods().isEmpty());
+	}
+
+	// @Test
+	public void testDeclareRolesOnMessageDrivenBean() throws Exception {
+		final String beanContent = "package com.sap;" + "@DeclareRoles(value = {\"role1\", \"role2\"}) "
+				+ "@MessageDriven public class testDeclareRolesOnMessageDrivenBean implements SessionBeanLocal {}";
+		IType type = createCompilationUnit("testDeclareRolesOnMessageDrivenBean", beanContent).findPrimaryType();
+		Result result = fixture.createJavaeeObject(type);
+		MessageDrivenBean bean = (MessageDrivenBean) result.getMainObject();
+		assertNotNull(bean);
+	}
+
+	public void testEjbRefName() throws Exception {
+		final String beanContent = "package com.sap;"
+				+ "@Stateless public class testEjbRefName implements SessionBeanLocal {"
+				+ "@EJB(name=\"refName\") private SessionBeanLocal field;" + "}";
+		IType type = createCompilationUnit("testEjbRefName", beanContent).findPrimaryType();
+		Result result = fixture.createJavaeeObject(type);
+		SessionBean sessionBean = (SessionBean) result.getMainObject();
+		assertNotNull(sessionBean);
+		assertEquals(1, sessionBean.getEjbLocalRefs().size());
+		EjbLocalRef ref = (EjbLocalRef) sessionBean.getEjbLocalRefs().get(0);
+		assertEquals(1, ref.getInjectionTargets().size());
+		assertInjectionTarget("refName", "", (InjectionTarget) ref.getInjectionTargets().get(0));
+	}
+
+	public void testEjbRefNameWithSlash() throws Exception {
+		final String beanContent = "package com.sap;"
+				+ "@Stateless public class testEjbRefNameWithSlash implements SessionBeanLocal {"
+				+ "@EJB(name=\"refClass/refName\") private SessionBeanLocal field;" + "}";
+		IType type = createCompilationUnit("testEjbRefNameWithSlash", beanContent).findPrimaryType();
+		Result result = fixture.createJavaeeObject(type);
+		SessionBean sessionBean = (SessionBean) result.getMainObject();
+		assertNotNull(sessionBean);
+		assertEquals(1, sessionBean.getEjbLocalRefs().size());
+		EjbLocalRef ref = (EjbLocalRef) sessionBean.getEjbLocalRefs().get(0);
+		assertEquals(1, ref.getInjectionTargets().size());
+		assertInjectionTarget("refName", "refClass", (InjectionTarget) ref.getInjectionTargets().get(0));
+	}
+
+	public void testResourceRefName() throws Exception {
+		final String beanContent = "package com.sap;"
+				+ "@Stateless public class testResourceRefName implements SessionBeanLocal {"
+				+ "@Resource(name=\"refName\") private SessionBeanLocal field;" + "}";
+		IType type = createCompilationUnit("testResourceRefName", beanContent).findPrimaryType();
+		Result result = fixture.createJavaeeObject(type);
+		SessionBean sessionBean = (SessionBean) result.getMainObject();
+		assertNotNull(sessionBean);
+		assertEquals(1, sessionBean.getResourceRefs().size());
+		ResourceRef ref = (ResourceRef) sessionBean.getResourceRefs().get(0);
+		assertEquals(1, ref.getInjectionTargets().size());
+		assertInjectionTarget("refName", "", (InjectionTarget) ref.getInjectionTargets().get(0));
+	}
+
+	public void testResourceRefNameWithSlash() throws Exception {
+		final String beanContent = "package com.sap;"
+				+ "@Stateless public class testResourceRefNameWithSlash implements SessionBeanLocal {"
+				+ "@Resource(name=\"refClass/refName\") private SessionBeanLocal field;" + "}";
+		IType type = createCompilationUnit("testResourceRefNameWithSlash", beanContent).findPrimaryType();
+		Result result = fixture.createJavaeeObject(type);
+		SessionBean sessionBean = (SessionBean) result.getMainObject();
+		assertNotNull(sessionBean);
+		assertEquals(1, sessionBean.getResourceRefs().size());
+		ResourceRef ref = (ResourceRef) sessionBean.getResourceRefs().get(0);
+		assertEquals(1, ref.getInjectionTargets().size());
+		assertInjectionTarget("refName", "refClass", (InjectionTarget) ref.getInjectionTargets().get(0));
+	}
+	
+	private void assertInjectionTarget(String targetName, String targetClass, InjectionTarget target) {
+		assertEquals(targetClass, target.getInjectionTargetClass());
+		assertEquals(targetName, target.getInjectionTargetName());
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/ejb/tests/EjbAnnotationReaderTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/ejb/tests/EjbAnnotationReaderTest.java
new file mode 100644
index 0000000..57d8a66
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/ejb/tests/EjbAnnotationReaderTest.java
@@ -0,0 +1,932 @@
+/***********************************************************************
+ * Copyright (c) 2007 by SAP AG, Walldorf. http://www.sap.com All rights
+ * reserved.
+ * 
+ * This software is the confidential and proprietary information of SAP AG,
+ * Walldorf. You shall not disclose such Confidential Information and shall use
+ * it only in accordance with the terms of the license agreement you entered
+ * into with SAP.
+ * 
+ * $Id: EjbAnnotationReaderTest.java,v 1.7 2010/11/23 14:01:47 jsholl Exp $
+ ***********************************************************************/
+package org.eclipse.jst.jee.model.ejb.tests;
+
+import java.util.List;
+
+import junit.framework.TestSuite;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IPackageFragment;
+import org.eclipse.jdt.core.IPackageFragmentRoot;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jst.j2ee.dependency.tests.util.ProjectUtil;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.j2ee.model.IModelProvider;
+import org.eclipse.jst.javaee.ejb.ActivationConfigProperty;
+import org.eclipse.jst.javaee.ejb.EJBJar;
+import org.eclipse.jst.javaee.ejb.EnterpriseBeans;
+import org.eclipse.jst.javaee.ejb.InitMethodType;
+import org.eclipse.jst.javaee.ejb.MessageDrivenBean;
+import org.eclipse.jst.javaee.ejb.RemoveMethodType;
+import org.eclipse.jst.javaee.ejb.SessionBean;
+import org.eclipse.jst.jee.model.internal.EJBAnnotationReader;
+import org.eclipse.jst.jee.model.internal.common.AbstractAnnotationModelProvider;
+import org.eclipse.jst.jee.model.tests.AbstractAnnotationModelTest;
+import org.eclipse.jst.jee.model.tests.AbstractTest;
+import org.eclipse.jst.jee.model.tests.SynchronousModelChangedListener;
+import org.eclipse.jst.jee.model.tests.TestUtils;
+import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
+import org.eclipse.wst.common.tests.ProjectUtility;
+
+/**
+ * @author Kiril Mitov k.mitov@sap.com
+ * 
+ */
+public class EjbAnnotationReaderTest extends AbstractAnnotationModelTest {
+
+	private static String BEAN_WITH_NAME = "package com.sap;" + "import javax.ejb.Stateless;"
+			+ "@Stateless(name=\"%s\") public class BeanWithName implements SessionBeanLocal {}";
+
+	public static TestSuite suite() throws Exception {
+		TestSuite suite = new TestSuite(EjbAnnotationReaderTest.class);
+		return suite;
+	}
+
+	public static void setUpProject() throws Exception {
+		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(
+				EjbAnnotationReaderTest.class.getSimpleName());
+		if (!project.exists()) {
+			project = ProjectUtil.createEJBProject(EjbAnnotationReaderTest.class.getSimpleName(), null,
+					J2EEVersionConstants.EJB_3_0_ID, true);
+			createProjectContent(project);
+		}
+	}
+
+	public static void tearDownAfterClass() throws InterruptedException {
+		AbstractTest.deleteProject(EjbAnnotationReaderTest.class.getSimpleName());
+	}
+
+	private static void createProjectContent(IProject project) throws Exception {
+		IJavaProject javaProject = JavaCore.create(project);
+		IFolder comFolder = javaProject.getProject().getFolder("ejbModule/com");
+		comFolder.create(true, true, new NullProgressMonitor());
+		IPackageFragmentRoot root = javaProject.getPackageFragmentRoot(comFolder);
+		IPackageFragment fragment = root.createPackageFragment("sap", true, new NullProgressMonitor());
+		createSessionBean(fragment);
+		createSessionBeanLocal(fragment);
+		createBeanWithName(fragment);
+		createMessageDrivenBean(fragment);
+		createInvalidCompilationUnit(fragment);
+	}
+
+	private static void createBeanWithName(IPackageFragment fragment) throws JavaModelException {
+		String content = String.format(BEAN_WITH_NAME, "beanWithName");
+		fragment.createCompilationUnit("BeanWithName.java", content, true, null);
+	}
+
+	/**
+	 * The word "class" is missed and the compilation unit does not contain a
+	 * valid type.
+	 * 
+	 * @param fragment
+	 * @throws Exception
+	 */
+	private static void createInvalidCompilationUnit(IPackageFragment fragment) throws Exception {
+		final String content = "package com.sap;"
+				+ "@Stateless public InvalidCompilationUnit implements SessionBeanLocal {}";
+		IFile file = ((IContainer) fragment.getResource()).getFile(new Path("InvalidCompilationUnit.java"));
+		AbstractTest.saveFile(file, content);
+	}
+
+	private static void createMessageDrivenBean(IPackageFragment fragment) throws Exception {
+		final String content = "package com.sap;" + "import javax.ejb.MessageDriven;"
+				+ "@MessageDriven public class MessageDrivenBean {}";
+		IFile file = ((IContainer) fragment.getResource()).getFile(new Path("MessageDrivenBean.java"));
+		AbstractTest.saveFile(file, content);
+	}
+
+	@Override
+	protected void setUp() throws Exception {
+		ProjectUtility.deleteAllProjects();
+		setUpProject();
+		super.setUp();
+		fixture = new EJBAnnotationReader(facetedProject, clientProject);
+	}
+
+	@Override
+	protected void tearDown() throws Exception {
+		((AbstractAnnotationModelProvider) fixture).dispose();
+	}
+
+	// @Test(expected = IllegalArgumentException.class)
+	public void testCerateReaderWithNullProject() {
+		try {
+			new EJBAnnotationReader(null, null);
+			fail("IllegalArgumentException expected");
+		} catch (IllegalArgumentException e) {
+		}
+	}
+
+	public void testLoadForEmptyProject() throws Exception {
+		String projectName = EjbAnnotationReaderTest.class.getSimpleName() + "testLoadForEmptyProject";
+		IProject emptyProject = ProjectUtil.createEJBProject(projectName, null, J2EEVersionConstants.EJB_3_0_ID, true);
+		IModelProvider provider = new EJBAnnotationReader(ProjectFacetsManager.create(emptyProject), null);
+		EJBJar ejbJar = (EJBJar) provider.getModelObject();
+		assertNull(ejbJar.getEnterpriseBeans());
+		AbstractTest.deleteProject(projectName);
+	}
+
+	public void testNullEnterpriseBeanAfterDelete() throws Exception {
+		final String projectName = EjbAnnotationReaderTest.class.getSimpleName() + "testNullEnterpriseBeanAfterDelete";
+		IProject oneBeanProject = ProjectUtil
+				.createEJBProject(projectName, null, J2EEVersionConstants.EJB_3_0_ID, true);
+		facetedProject = ProjectFacetsManager.create(oneBeanProject);
+		fixture = new EJBAnnotationReader(facetedProject, clientProject);
+
+		IFile beanFile = oneBeanProject.getFile("ejbModule/testNullEnterpriseBeanAfterDelete.java");
+		assertFalse(beanFile.exists());
+		final String content = "import javax.ejb.Stateless;"
+				+ "@Stateless public class testNullEnterpriseBeanAfterDelete implements SessionBeanLocal {}";
+		// add the file
+		saveFileAndUpdate(beanFile, content);
+		SessionBean result = TestUtils.getSessionBean(getEJBJar(), "testNullEnterpriseBeanAfterDelete");
+		assertNotNull(result);
+		// delete the file
+		deleteFileAndUpdate(beanFile);
+		assertNull(getEJBJar().getEnterpriseBeans());
+		AbstractTest.deleteProject(projectName);
+	}
+
+	// @Test
+	public void testGetSessionBeans() {
+		EnterpriseBeans beans = getEJBJar().getEnterpriseBeans();
+		assertNotNull(beans);
+		assertEquals(new Integer(2), new Integer(beans.getSessionBeans().size()));
+		assertEquals(new Integer(1), new Integer(getEJBJar().getEnterpriseBeans().getMessageDrivenBeans().size()));
+	}
+
+	// @Test
+	public void testSessionBeanName() {
+		List<SessionBean> beans = getEJBJar().getEnterpriseBeans().getSessionBeans();
+		SessionBean bean = TestUtils.getSessionBean(getEJBJar(), "SessionBean");
+		assertEquals("com.sap.SessionBean", bean.getEjbClass());
+		assertEquals("SessionBean", bean.getEjbName());
+	}
+
+	// @Test
+	public void testMessageDrivenBean() {
+		MessageDrivenBean bean = TestUtils.getMessageDrivenBean(getEJBJar(), "MessageDrivenBean");
+		assertNotNull(bean);
+		assertEquals("com.sap.MessageDrivenBean", bean.getEjbClass());
+		assertEquals("MessageDrivenBean", bean.getEjbName());
+	}
+
+	// @Test
+	public void testBeanWithName() {
+		SessionBean bean = TestUtils.getSessionBean(getEJBJar(), "beanWithName");
+		assertNotNull(bean);
+		assertEquals("com.sap.BeanWithName", bean.getEjbClass());
+		assertEquals("beanWithName", bean.getEjbName());
+	}
+
+	// @Test
+	public void testChange() throws Exception {
+		IFile file = facetedProject.getProject().getFile("ejbModule/com/sap/BeanWithName.java");
+		final String newContent = String.format(BEAN_WITH_NAME, "newBeanName");
+
+		saveFileAndUpdate(file, newContent);
+
+		SessionBean result = TestUtils.getSessionBean(getEJBJar(), "newBeanName");
+		assertNotNull(result);
+
+		// revert the change
+		final String oldContent = String.format(BEAN_WITH_NAME, "beanWithName");
+		saveFileAndUpdate(file, oldContent);
+		assertNotNull(TestUtils.getSessionBean(getEJBJar(), "beanWithName"));
+	}
+
+	// @Test
+	public void testDeleteBean() throws Exception {
+		IFile file = facetedProject.getProject().getFile("ejbModule/com/sap/BeanWithName.java");
+		deleteFileAndUpdate(file);
+		assertEquals(new Integer(1), new Integer(getEJBJar().getEnterpriseBeans().getSessionBeans().size()));
+		assertNull(TestUtils.getSessionBean(getEJBJar(), "beanWithName"));
+
+		// revert the change
+		final String content = String.format(BEAN_WITH_NAME, "beanWithName");
+		saveFileAndUpdate(file, content);
+		assertNotNull(TestUtils.getSessionBean(getEJBJar(), "beanWithName"));
+	}
+
+	// @Test
+	public void testAddDeleteSessionBean() throws Exception {
+		int oldSize = getEJBJar().getEnterpriseBeans().getSessionBeans().size();
+		IFile beanFile = facetedProject.getProject().getFile("ejbModule/com/sap/testAddDeleteSessionBean.java");
+		assertFalse(beanFile.exists());
+		final String content = "package com.sap;" + "import javax.ejb.Stateless;"
+				+ "@Stateless public class testAddDeleteSessionBean implements SessionBeanLocal {}";
+		// add the file
+		saveFileAndUpdate(beanFile, content);
+		assertEquals(new Integer(oldSize + 1), new Integer(getEJBJar().getEnterpriseBeans().getSessionBeans().size()));
+		SessionBean result = TestUtils.getSessionBean(getEJBJar(), "testAddDeleteSessionBean");
+		assertNotNull(result);
+
+		// delete the file
+		deleteFileAndUpdate(beanFile);
+		assertEquals(new Integer(oldSize), new Integer(getEJBJar().getEnterpriseBeans().getSessionBeans().size()));
+		assertNull(TestUtils.getSessionBean(getEJBJar(), "testAddDeleteSessionBean"));
+	}
+
+	// @Test
+	public void testEventsNumber1() throws Exception {
+		final String content = "package com.sap;" + "import javax.ejb.Stateless;"
+				+ "@Stateless public class testEventsNumber1 implements SessionBeanLocal {}";
+		IFile beanFile = facetedProject.getProject().getFile("ejbModule/com/sap/testEventsNumber1.java");
+		SynchronousModelChangedListener listener = new SynchronousModelChangedListener(1);
+		getFixture().addListener(listener);
+		saveFileAndUpdate(beanFile, content);
+		assertTrue(listener.waitForEvents());
+		getFixture().removeListener(listener);
+		assertEquals(new Integer(1), new Integer(listener.getReceivedEvents().size()));
+	}
+
+	// @Test
+	public void testEventsNumber2() throws Exception {
+		final String content = "package com.sap;" + "import javax.ejb.Stateless;"
+				+ "@Stateless public class testEventsNumber2 implements SessionBeanLocal {}";
+		IFile beanFile = facetedProject.getProject().getFile("ejbModule/com/sap/testEventsNumber2.java");
+		SynchronousModelChangedListener listener = new SynchronousModelChangedListener(2);
+		getFixture().addListener(listener);
+		saveFileAndUpdate(beanFile, content);
+		assertFalse(listener.waitForEvents());
+		getFixture().removeListener(listener);
+		assertEquals(new Integer(1), new Integer(listener.getReceivedEvents().size()));
+
+	}
+
+	// @Test
+	public void testDispose() throws Exception {
+		AbstractAnnotationModelProvider reader = new EJBAnnotationReader(facetedProject, null);
+		SynchronousModelChangedListener listener = new SynchronousModelChangedListener(1);
+		reader.addListener(listener);
+		reader.dispose();
+		assertTrue(listener.waitForEvents());
+	}
+
+	// @Test
+	public void testAddBeanThenInterface() throws Exception {
+		int oldSize = getEJBJar().getEnterpriseBeans().getSessionBeans().size();
+		IFile beanFile = facetedProject.getProject().getFile("ejbModule/com/sap/testAddBeanThenInterface.java");
+		IFile interfaceFile = facetedProject.getProject().getFile("ejbModule/com/sap/InterfaceForAddedBean.java");
+
+		final String beanContent = "package com.sap;" + "import javax.ejb.Stateless;"
+				+ "@Stateless public class testAddBeanThenInterface implements InterfaceForAddedBean {}";
+		final String interfaceContent = "package com.sap;" + "public interface InterfaceForAddedBean {} ";
+
+		// add the bean
+		saveFileAndUpdate(beanFile, beanContent);
+		assertEquals(new Integer(oldSize + 1), new Integer(getEJBJar().getEnterpriseBeans().getSessionBeans().size()));
+		SessionBean result = TestUtils.getSessionBean(getEJBJar(), "testAddBeanThenInterface");
+		assertNotNull(result);
+		assertEquals("InterfaceForAddedBean", result.getBusinessLocals().get(0));
+
+		// add interface. The bean should now resolve the interface
+		saveFileAndUpdate(interfaceFile, interfaceContent);
+		assertEquals(new Integer(oldSize + 1), new Integer(getEJBJar().getEnterpriseBeans().getSessionBeans().size()));
+		result = TestUtils.getSessionBean(getEJBJar(), "testAddBeanThenInterface");
+		assertNotNull(result);
+		assertEquals("com.sap.InterfaceForAddedBean", result.getBusinessLocals().get(0));
+
+		// revert the change
+		deleteFileAndUpdate(beanFile);
+		// the bean is delete. Not update will occur on the annotation reader
+		AbstractTest.deleteFile(interfaceFile);
+	}
+
+	// @Test
+	public void testAddBeanThenInterfaceThenRemote() throws Exception {
+		int oldSize = getEJBJar().getEnterpriseBeans().getSessionBeans().size();
+		IFile beanFile = facetedProject.getProject().getFile(
+				"ejbModule/com/sap/testAddBeanThenInterfaceThenRemote.java");
+		IFile interfaceFile = facetedProject.getProject().getFile("ejbModule/com/sap/InterfaceForAddedBean.java");
+
+		final String beanContent = "package com.sap;" + "import javax.ejb.Stateless;"
+				+ "@Stateless public class testAddBeanThenInterfaceThenRemote implements InterfaceForAddedBean {}";
+
+		// add the bean. The interface is in the local list.
+		saveFileAndUpdate(beanFile, beanContent);
+		SessionBean result = TestUtils.getSessionBean(getEJBJar(), "testAddBeanThenInterfaceThenRemote");
+		assertNotNull(result);
+		assertEquals(new Integer(oldSize + 1), new Integer(getEJBJar().getEnterpriseBeans().getSessionBeans().size()));
+		assertEquals("InterfaceForAddedBean", result.getBusinessLocals().get(0));
+
+		// add interface. The bean should now resolve the interface and add it
+		// to local interfaces.
+		final String interfaceContent = "package com.sap;" + "public interface InterfaceForAddedBean {} ";
+		saveFileAndUpdate(interfaceFile, interfaceContent);
+		result = TestUtils.getSessionBean(getEJBJar(), "testAddBeanThenInterfaceThenRemote");
+		assertNotNull(result);
+		assertEquals(new Integer(oldSize + 1), new Integer(getEJBJar().getEnterpriseBeans().getSessionBeans().size()));
+		assertEquals("com.sap.InterfaceForAddedBean", result.getBusinessLocals().get(0));
+		assertTrue(result.getBusinessRemotes().isEmpty());
+
+		// change the interface to remote
+		final String interfaceContentRemote = "package com.sap;" + "import javax.ejb.Remote"
+				+ "@Remote public interface InterfaceForAddedBean {} ";
+		saveFileAndUpdate(interfaceFile, interfaceContentRemote);
+		result = TestUtils.getSessionBean(getEJBJar(), "testAddBeanThenInterfaceThenRemote");
+		assertNotNull(result);
+		assertEquals(new Integer(oldSize + 1), new Integer(getEJBJar().getEnterpriseBeans().getSessionBeans().size()));
+		assertEquals("com.sap.InterfaceForAddedBean", result.getBusinessRemotes().get(0));
+		assertTrue(result.getBusinessLocals().isEmpty());
+
+		// revert the change
+		deleteFileAndUpdate(beanFile);
+		assertNull(TestUtils.getSessionBean(getEJBJar(), "testAddBeanThenInterfaceThenRemote"));
+		AbstractTest.deleteFile(interfaceFile);
+	}
+
+	// @Test
+	public void testAddBeanThenRemoteThenLocal() throws Exception {
+		IFile beanFile = facetedProject.getProject().getFile("ejbModule/com/sap/testAddBeanThenRemoteThenLocal.java");
+		IFile interfaceFile = facetedProject.getProject().getFile("ejbModule/com/sap/InterfaceForAddedBean.java");
+
+		final String beanContent = "package com.sap;" + "import javax.ejb.Stateless;"
+				+ "@Stateless public class testAddBeanThenRemoteThenLocal implements InterfaceForAddedBean {}";
+
+		// add the bean. The interface is in the local list.
+		saveFileAndUpdate(beanFile, beanContent);
+		SessionBean result = TestUtils.getSessionBean(getEJBJar(), "testAddBeanThenRemoteThenLocal");
+		assertNotNull(result);
+		assertEquals("InterfaceForAddedBean", result.getBusinessLocals().get(0));
+
+		// add interface. The bean should now resolve the interface and add it
+		// to remote interfaces.
+		final String interfaceContent = "package com.sap;" + "@Remote public interface InterfaceForAddedBean {} ";
+		saveFileAndUpdate(interfaceFile, interfaceContent);
+		result = TestUtils.getSessionBean(getEJBJar(), "testAddBeanThenRemoteThenLocal");
+		assertNotNull(result);
+		assertEquals("com.sap.InterfaceForAddedBean", result.getBusinessRemotes().get(0));
+		assertTrue(result.getBusinessLocals().isEmpty());
+
+		// change the interface to local
+		final String interfaceContentRemote = "package com.sap;" + "import javax.ejb.Remote"
+				+ "@Local public interface InterfaceForAddedBean {} ";
+		saveFileAndUpdate(interfaceFile, interfaceContentRemote);
+		result = TestUtils.getSessionBean(getEJBJar(), "testAddBeanThenRemoteThenLocal");
+		assertNotNull(result);
+		assertEquals("com.sap.InterfaceForAddedBean", result.getBusinessLocals().get(0));
+		assertTrue(result.getBusinessRemotes().isEmpty());
+
+		// revert the change
+		deleteFileAndUpdate(beanFile);
+		assertNull(TestUtils.getSessionBean(getEJBJar(), "testAddBeanThenRemoteThenLocal"));
+		AbstractTest.deleteFile(interfaceFile);
+	}
+
+	/**
+	 * Add a bean. Then add a local interface. The interface has a local
+	 * annotation. Change the annotation of the interface to remote. The two
+	 * beans should be rebuilded and the interface should now be in the remote
+	 * business interfaces.
+	 * 
+	 * @throws Exception
+	 * @throws InterruptedException
+	 */
+	// @Test
+	public void testAdd2BeansThenInterfaceThenRemote() throws InterruptedException, Exception {
+		IFile bean1File = facetedProject.getProject().getFile(
+				"ejbModule/com/sap/testAdd2BeansThenInterfaceThenRemote1.java");
+		IFile bean2File = facetedProject.getProject().getFile(
+				"ejbModule/com/sap/testAdd2BeansThenInterfaceThenRemote2.java");
+		IFile interfaceFile = facetedProject.getProject().getFile("ejbModule/com/sap/InterfaceForAddedBean.java");
+
+		final String bean1Content = "package com.sap;" + "import javax.ejb.Stateless;"
+				+ "@Stateless public class testAdd2BeansThenInterfaceThenRemote1 implements InterfaceForAddedBean {}";
+		final String bean2Content = "package com.sap;" + "import javax.ejb.Stateless;"
+				+ "@Stateless public class testAdd2BeansThenInterfaceThenRemote2 implements InterfaceForAddedBean {}";
+		// add the bean. The interface is in the local list.
+		saveFileAndUpdate(bean1File, bean1Content);
+		saveFileAndUpdate(bean2File, bean2Content);
+		SessionBean result1 = TestUtils.getSessionBean(getEJBJar(), "testAdd2BeansThenInterfaceThenRemote1");
+		assertEquals("InterfaceForAddedBean", result1.getBusinessLocals().get(0));
+		SessionBean result2 = TestUtils.getSessionBean(getEJBJar(), "testAdd2BeansThenInterfaceThenRemote2");
+		assertEquals("InterfaceForAddedBean", result2.getBusinessLocals().get(0));
+
+		// add interface. The bean should now resolve the interface and add it
+		// to local interfaces.
+		final String interfaceContent = "package com.sap;" + "public interface InterfaceForAddedBean {} ";
+		saveFileAndUpdate(interfaceFile, interfaceContent);
+
+		// change the interface to remote
+		final String interfaceContentRemote = "package com.sap;" + "import javax.ejb.Remote"
+				+ "@Remote public interface InterfaceForAddedBean {} ";
+		saveFileAndUpdate(interfaceFile, interfaceContentRemote);
+		result1 = TestUtils.getSessionBean(getEJBJar(), "testAdd2BeansThenInterfaceThenRemote1");
+		assertEquals("com.sap.InterfaceForAddedBean", result1.getBusinessRemotes().get(0));
+		result2 = TestUtils.getSessionBean(getEJBJar(), "testAdd2BeansThenInterfaceThenRemote2");
+		assertEquals("com.sap.InterfaceForAddedBean", result2.getBusinessRemotes().get(0));
+		assertTrue(result1.getBusinessLocals().isEmpty());
+		assertTrue(result2.getBusinessLocals().isEmpty());
+
+		// revert the change
+		deleteFileAndUpdate(bean1File);
+		deleteFileAndUpdate(bean2File);
+		assertNull(TestUtils.getSessionBean(getEJBJar(), "testAdd2BeansThenInterfaceThenRemote1"));
+		assertNull(TestUtils.getSessionBean(getEJBJar(), "testAdd2BeansThenInterfaceThenRemote2"));
+		AbstractTest.deleteFile(interfaceFile);
+	}
+
+	// @Test
+	public void testBeanWithSourceAndBinaryInterface() throws Exception {
+		final String beanContent = "package com.sap; "
+				+ "@Stateless @Local({java.util.List.class, SessionBeanLocal.class}) public class testBeanWithSourceAndBinaryInterface {}";
+		IFile beanFile = facetedProject.getProject().getFile(
+				"ejbModule/com/sap/testBeanWithSourceAndBinaryInterface.java");
+		saveFileAndUpdate(beanFile, beanContent);
+		SessionBean result = TestUtils.getSessionBean(getEJBJar(), "testBeanWithSourceAndBinaryInterface");
+		assertNotNull(result);
+
+		assertTrue(result.getBusinessLocals().contains("com.sap.SessionBeanLocal"));
+		assertTrue(result.getBusinessLocals().contains("java.util.List"));
+
+		// revert the change
+		deleteFileAndUpdate(beanFile);
+		assertNull(TestUtils.getSessionBean(getEJBJar(), "testBeanWithSourceAndBinaryInterface"));
+	}
+
+	// @Test
+	public void testAddDeleteMessageBean() throws Exception {
+		int oldSize = getEJBJar().getEnterpriseBeans().getMessageDrivenBeans().size();
+		SynchronousModelChangedListener listener = new SynchronousModelChangedListener(1);
+		IFile file = facetedProject.getProject().getFile("ejbModule/com/sap/AddedMessageBean.java");
+		assertFalse(file.exists());
+		final String content = "package com.sap;" + "import javax.ejb.MessageDriven;"
+				+ "@MessageDriven public class AddedMessageBean {}";
+		getFixture().addListener(listener);
+
+		// add the file
+		AbstractTest.saveFile(file, content);
+		assertTrue(listener.waitForEvents());
+		getFixture().removeListener(listener);
+
+		assertEquals(new Integer(oldSize + 1), new Integer(getEJBJar().getEnterpriseBeans().getMessageDrivenBeans()
+				.size()));
+		MessageDrivenBean result = TestUtils.getMessageDrivenBean(getEJBJar(), "AddedMessageBean");
+		assertNotNull(result);
+
+		// delete the file
+		listener = new SynchronousModelChangedListener(1);
+		getFixture().addListener(listener);
+		AbstractTest.deleteFile(file);
+		assertTrue(listener.waitForEvents());
+		getFixture().removeListener(listener);
+
+		assertEquals(new Integer(oldSize), new Integer(getEJBJar().getEnterpriseBeans().getMessageDrivenBeans().size()));
+		assertNull(TestUtils.getMessageDrivenBean(getEJBJar(), "AddedMessageBean"));
+	}
+
+	// @Test
+	public void testAddDeleteLocalHome() throws Exception {
+		final String beanContent = "package com.sap; "
+				+ "@Stateless @LocalHome(value = LocalHomeInterface.class) public class testAddDeleteLocalHome {}";
+		IFile beanFile = facetedProject.getProject().getFile("ejbModule/com/sap/testAddDeleteLocalHome.java");
+		saveFileAndUpdate(beanFile, beanContent);
+		SessionBean result = TestUtils.getSessionBean(getEJBJar(), "testAddDeleteLocalHome");
+		assertNotNull(result);
+		assertEquals("LocalHomeInterface", result.getLocalHome());
+
+		final String interfaceContent = "package com.sap; " + "public interface LocalHomeInterface {}";
+		IFile interfaceFile = facetedProject.getProject().getFile("ejbModule/com/sap/LocalHomeInterface.java");
+		saveFileAndUpdate(interfaceFile, interfaceContent);
+		result = TestUtils.getSessionBean(getEJBJar(), "testAddDeleteLocalHome");
+		assertNotNull(result);
+		assertEquals("com.sap.LocalHomeInterface", result.getLocalHome());
+
+		// revert the change
+		deleteFileAndUpdate(interfaceFile);
+		result = TestUtils.getSessionBean(getEJBJar(), "testAddDeleteLocalHome");
+		assertNotNull(result);
+		assertEquals("LocalHomeInterface", result.getLocalHome());
+		deleteFileAndUpdate(beanFile);
+
+		assertNull(TestUtils.getSessionBean(getEJBJar(), "testAddDeleteLocalHome"));
+	}
+
+	// @Test
+	public void testAddDeleteHome() throws Exception {
+		final String beanContent = "package com.sap; import javax.ejb.RemoteHome;"
+				+ "@Stateless @RemoteHome(value = HomeInterface.class) public class testAddDeleteHome {}";
+		IFile beanFile = facetedProject.getProject().getFile("ejbModule/com/sap/testAddDeleteHome.java");
+		saveFileAndUpdate(beanFile, beanContent);
+		SessionBean result = TestUtils.getSessionBean(getEJBJar(), "testAddDeleteHome");
+		assertNotNull(result);
+		assertEquals("HomeInterface", result.getHome());
+
+		final String interfaceContent = "package com.sap; " + "public interface HomeInterface {}";
+		IFile interfaceFile = facetedProject.getProject().getFile("ejbModule/com/sap/HomeInterface.java");
+		saveFileAndUpdate(interfaceFile, interfaceContent);
+		result = TestUtils.getSessionBean(getEJBJar(), "testAddDeleteHome");
+		assertNotNull(result);
+		assertEquals("com.sap.HomeInterface", result.getHome());
+
+		// revert the change
+		deleteFileAndUpdate(interfaceFile);
+		result = TestUtils.getSessionBean(getEJBJar(), "testAddDeleteHome");
+		assertNotNull(result);
+		assertEquals("HomeInterface", result.getHome());
+
+		deleteFileAndUpdate(beanFile);
+		assertNull(TestUtils.getSessionBean(getEJBJar(), "testAddDeleteHome"));
+	}
+
+	// @Test
+	public void testRemoveMethod() throws Exception {
+		final String beanContent = "package com.sap"
+				+ "@Stateful public class testRemoveMethod implements SessionBeanLocal {"
+				+ "@Remove public void removeMethod1() {}"
+				+ "@Remove(retainIfException = true) public void removeMethod2() {}"
+				+ "@Remove(retainIfException = true) public void removeMethodParam(java.lang.String str) {}" + "}";
+		IFile beanFile = facetedProject.getProject().getFile("ejbModule/com/sap/testRemoveMethod.java");
+		saveFileAndUpdate(beanFile, beanContent);
+		SessionBean result = TestUtils.getSessionBean(getEJBJar(), "testRemoveMethod");
+		assertNotNull(result);
+		RemoveMethodType method1 = TestUtils.findRemoveMethodByName(result, "removeMethod1");
+		RemoveMethodType method2 = TestUtils.findRemoveMethodByName(result, "removeMethod2");
+		assertNotNull(method1);
+		assertNotNull(method2);
+		assertFalse(method1.isRetainIfException());
+		assertTrue(method2.isRetainIfException());
+		assertEquals(new Integer(2), new Integer(result.getRemoveMethods().size()));
+
+		deleteFileAndUpdate(beanFile);
+		assertNull(TestUtils.getSessionBean(getEJBJar(), "testRemoveMethod"));
+	}
+
+	// @Test
+	public void testRemoveMethodOnStateless() throws Exception {
+		final String beanContent = "package com.sap;"
+				+ "@Stateless public class testRemoveMethodOnStateless implements SessionBeanLocal {"
+				+ "@Remove public void removeMethod1() {}" + "}";
+		IFile beanFile = facetedProject.getProject().getFile("ejbModule/com/sap/testRemoveMethodOnStateless.java");
+		saveFileAndUpdate(beanFile, beanContent);
+		SessionBean result = TestUtils.getSessionBean(getEJBJar(), "testRemoveMethodOnStateless");
+		assertNotNull(result);
+		assertTrue(result.getRemoveMethods().isEmpty());
+
+		deleteFileAndUpdate(beanFile);
+		assertNull(TestUtils.getSessionBean(getEJBJar(), "testRemoveMethodOnStateless"));
+	}
+
+	// @Test
+	public void testInitMetod() throws Exception {
+		final String beanContent = "package com.sap"
+				+ "@Stateful @RemoteHome(value = java.lang.Comparable.class) public class testInitMetod implements SessionBeanLocal {"
+				+ "@Init public void createMethod1() {}" + "@Init public void createMethod2(String arg0) {}" + "}";
+		IFile beanFile = facetedProject.getProject().getFile("ejbModule/com/sap/testInitMetod.java");
+		saveFileAndUpdate(beanFile, beanContent);
+		SessionBean result = TestUtils.getSessionBean(getEJBJar(), "testInitMetod");
+		assertNotNull(result);
+		InitMethodType method1 = TestUtils.findInitMethodByName(result, "createMethod1");
+		assertNotNull(method1);
+		InitMethodType method2 = TestUtils.findInitMethodByName(result, "createMethod2");
+		assertNotNull(method2);
+		assertEquals(new Integer(1), new Integer(method2.getBeanMethod().getMethodParams().getMethodParams().size()));
+		assertEquals("String", method2.getBeanMethod().getMethodParams().getMethodParams().get(0).toString());
+		assertEquals(new Integer(2), new Integer(result.getInitMethods().size()));
+
+		deleteFileAndUpdate(beanFile);
+		assertNull(TestUtils.getSessionBean(getEJBJar(), "testInitMethod"));
+	}
+
+	// @Test
+	public void testInitMetodStateless() throws Exception {
+		final String beanContent = "package com.sap;"
+				+ "@Stateless @RemoteHome(value = java.lang.Comparable.class) public class testInitMetodStateless implements SessionBeanLocal {"
+				+ "@Init public void createMethod1() {}" + "@Init public void createMethod2(String arg0) {}" + "}";
+		IFile beanFile = facetedProject.getProject().getFile("ejbModule/com/sap/testInitMetodStateless.java");
+		saveFileAndUpdate(beanFile, beanContent);
+		SessionBean result = TestUtils.getSessionBean(getEJBJar(), "testInitMetodStateless");
+		assertNotNull(result);
+		assertEquals(new Integer(0), new Integer(result.getInitMethods().size()));
+
+		deleteFileAndUpdate(beanFile);
+		assertNull(TestUtils.getSessionBean(getEJBJar(), "testInitMetodStateless"));
+	}
+
+	// @Test
+	public void testActivationConfigProperty() throws Exception {
+		final String beanContent = "package com.sap;" + "@MessageDriven(activationConfig = { "
+				+ "@ActivationConfigProperty(propertyName = \"name1\", propertyValue = \"value1\"),"
+				+ "@ActivationConfigProperty(propertyName = \"name2\", propertyValue = \"value2\") })"
+				+ "public class testActivationConfigProperty {}";
+		IFile beanFile = facetedProject.getProject().getFile("ejbModule/com/sap/testActivationConfigProperty.java");
+		saveFileAndUpdate(beanFile, beanContent);
+		MessageDrivenBean result = TestUtils.getMessageDrivenBean(getEJBJar(), "testActivationConfigProperty");
+		assertNotNull(result);
+		ActivationConfigProperty property1 = TestUtils.findActivationConfigProperty(result, "name1");
+		ActivationConfigProperty property2 = TestUtils.findActivationConfigProperty(result, "name2");
+		assertEquals("value1", property1.getActivationConfigPropertyValue());
+		assertEquals("value2", property2.getActivationConfigPropertyValue());
+		assertEquals(new Integer(2), new Integer(result.getActivationConfig().getActivationConfigProperties().size()));
+
+		deleteFileAndUpdate(beanFile);
+		assertNull(TestUtils.getSessionBean(getEJBJar(), "testActivationConfigProperty"));
+	}
+
+	// @Test
+	public void testMoveBeanFile() throws Exception {
+		IFile file = facetedProject.getProject().getFile("ejbModule/com/sap/testMoveBeanFile.java");
+		final String content = "package com.sap;" + "import javax.ejb.Stateless;"
+				+ "@Stateless public class testMoveBeanFile implements		 SessionBeanLocal {}";
+
+		// add the file
+		saveFileAndUpdate(file, content);
+		SessionBean result = TestUtils.getSessionBean(getEJBJar(), "testMoveBeanFile");
+		assertNotNull(result);
+
+		// move the file to a place out of the classpath
+		SynchronousModelChangedListener listener = new SynchronousModelChangedListener(1);
+		getFixture().addListener(listener);
+		file.move(facetedProject.getProject().getFullPath().append("testMoveBeanFile.java"), true,
+				new NullProgressMonitor());
+		assertTrue(listener.waitForEvents());
+		getFixture().removeListener(listener);
+
+		assertNull(TestUtils.getSessionBean(getEJBJar(), "testMoveBeanFile"));
+
+		// rever the change
+		AbstractTest.deleteFile(facetedProject.getProject().getFile("testMoveBeanFile.java"));
+	}
+
+	// @Test
+	public void testMoveBeanFileToMetainf() throws Exception {
+		IFile file = facetedProject.getProject().getFile("ejbModule/com/sap/testMoveBeanFileToMetainf.java");
+		final String content = "package com.sap;" + "import javax.ejb.Stateless;"
+				+ "@Stateless public class testMoveBeanFileToMetainf implements SessionBeanLocal {}";
+
+		// add the file
+		saveFileAndUpdate(file, content);
+		SessionBean result = TestUtils.getSessionBean(getEJBJar(), "testMoveBeanFileToMetainf");
+		assertNotNull(result);
+
+		// move the file to a place out of the classpath
+		SynchronousModelChangedListener listener = new SynchronousModelChangedListener(1);
+		getFixture().addListener(listener);
+		IFolder metainfFolder = facetedProject.getProject().getFolder("ejbModule/META-INF");
+		file
+				.move(metainfFolder.getFullPath().append("testMoveBeanFileToMetainf.java"), true,
+						new NullProgressMonitor());
+		assertTrue(listener.waitForEvents());
+		getFixture().removeListener(listener);
+
+		assertNull(TestUtils.getSessionBean(getEJBJar(), "testMoveBeanFileToMetainf"));
+
+		// revert the change
+		AbstractTest.deleteFile(facetedProject.getProject()
+				.getFile("ejbModule/META-INF/testMoveBeanFileToMetainf.java"));
+	}
+
+	/**
+	 * Add a bean. Then add a local interface. The interface has a local
+	 * annotation. Change the annotation of the interface to remote. The two
+	 * beans should be rebuilded and the interface should now be in the remote
+	 * business interfaces.
+	 * 
+	 * @throws Exception
+	 * @throws InterruptedException
+	 */
+	// @Test
+	public void testAdd2BeansThenInterfaceThenRemoteThenOverrideWithLocal() throws InterruptedException, Exception {
+		IFile bean1File = facetedProject.getProject().getFile(
+				"ejbModule/com/sap/testAdd2BeansThenInterfaceThenRemote1.java");
+		IFile bean2File = facetedProject.getProject().getFile(
+				"ejbModule/com/sap/testAdd2BeansThenInterfaceThenRemote2.java");
+		IFile interfaceFile = facetedProject.getProject().getFile("ejbModule/com/sap/InterfaceForAddedBean.java");
+
+		final String bean1Content = "package com.sap;" + "import javax.ejb.Stateless;"
+				+ "@Stateless public class testAdd2BeansThenInterfaceThenRemote1 implements InterfaceForAddedBean {}";
+
+		final String bean1Content2 = "package com.sap;"
+				+ "import javax.ejb.Stateless;"
+				+ "@Stateless @Local({InterfaceForAddedBean.class}) public class testAdd2BeansThenInterfaceThenRemote1 implements InterfaceForAddedBean {}";
+
+		final String bean2Content = "package com.sap;" + "import javax.ejb.Stateless;"
+				+ "@Stateless public class testAdd2BeansThenInterfaceThenRemote2 implements InterfaceForAddedBean {}";
+		// add the bean. The interface is in the local list.
+		saveFileAndUpdate(bean1File, bean1Content);
+		saveFileAndUpdate(bean2File, bean2Content);
+		SessionBean result1 = TestUtils.getSessionBean(getEJBJar(), "testAdd2BeansThenInterfaceThenRemote1");
+		assertEquals("InterfaceForAddedBean", result1.getBusinessLocals().get(0));
+		SessionBean result2 = TestUtils.getSessionBean(getEJBJar(), "testAdd2BeansThenInterfaceThenRemote2");
+		assertEquals("InterfaceForAddedBean", result2.getBusinessLocals().get(0));
+
+		// add interface. The bean should now resolve the interface and add it
+		// to local interfaces.
+		final String interfaceContent = "package com.sap;" + "public interface InterfaceForAddedBean {} ";
+		saveFileAndUpdate(interfaceFile, interfaceContent);
+
+		// change the interface to remote
+		final String interfaceContentRemote = "package com.sap;" + "import javax.ejb.Remote"
+				+ "@Remote public interface InterfaceForAddedBean {} ";
+		saveFileAndUpdate(interfaceFile, interfaceContentRemote);
+		result1 = TestUtils.getSessionBean(getEJBJar(), "testAdd2BeansThenInterfaceThenRemote1");
+		assertEquals("com.sap.InterfaceForAddedBean", result1.getBusinessRemotes().get(0));
+		result2 = TestUtils.getSessionBean(getEJBJar(), "testAdd2BeansThenInterfaceThenRemote2");
+		assertEquals("com.sap.InterfaceForAddedBean", result2.getBusinessRemotes().get(0));
+		assertTrue(result1.getBusinessLocals().isEmpty());
+		assertTrue(result2.getBusinessLocals().isEmpty());
+
+		saveFileAndUpdate(bean1File, bean1Content2);
+		result1 = TestUtils.getSessionBean(getEJBJar(), "testAdd2BeansThenInterfaceThenRemote1");
+		assertEquals("com.sap.InterfaceForAddedBean", result1.getBusinessLocals().get(0));
+		assertTrue(result1.getBusinessRemotes().isEmpty());
+
+		// revert the change
+		deleteFileAndUpdate(bean1File);
+		deleteFileAndUpdate(bean2File);
+		assertNull(TestUtils.getSessionBean(getEJBJar(), "testAdd2BeansThenInterfaceThenRemote1"));
+		assertNull(TestUtils.getSessionBean(getEJBJar(), "testAdd2BeansThenInterfaceThenRemote2"));
+		AbstractTest.deleteFile(interfaceFile);
+	}
+
+	/**
+	 * Add a bean. Then add a local interface. The interface has a local
+	 * annotation. Change the annotation of the interface to remote. The two
+	 * beans should be rebuilded and the interface should now be in the remote
+	 * business interfaces.
+	 * 
+	 * @throws Exception
+	 * @throws InterruptedException
+	 */
+	// @Test
+	public void testAdd2BeansThenInterfaceThenLocalThenOverrideWithRemote() throws InterruptedException, Exception {
+		IFile bean1File = facetedProject.getProject().getFile(
+				"ejbModule/com/sap/testAdd2BeansThenInterfaceThenRemote1.java");
+		IFile bean2File = facetedProject.getProject().getFile(
+				"ejbModule/com/sap/testAdd2BeansThenInterfaceThenRemote2.java");
+		IFile interfaceFile = facetedProject.getProject().getFile("ejbModule/com/sap/InterfaceForAddedBean.java");
+
+		final String bean1Content = "package com.sap;" + "import javax.ejb.Stateless;"
+				+ "@Stateless public class testAdd2BeansThenInterfaceThenRemote1 implements InterfaceForAddedBean {}";
+
+		final String bean1Content2 = "package com.sap;"
+				+ "import javax.ejb.Stateless;"
+				+ "@Stateless @Remote({InterfaceForAddedBean.class}) public class testAdd2BeansThenInterfaceThenRemote1 implements InterfaceForAddedBean {}";
+
+		final String bean2Content = "package com.sap;" + "import javax.ejb.Stateless;"
+				+ "@Stateless public class testAdd2BeansThenInterfaceThenRemote2 implements InterfaceForAddedBean {}";
+		// add the bean. The interface is in the local list.
+		saveFileAndUpdate(bean1File, bean1Content);
+		saveFileAndUpdate(bean2File, bean2Content);
+		SessionBean result1 = TestUtils.getSessionBean(getEJBJar(), "testAdd2BeansThenInterfaceThenRemote1");
+		assertEquals("InterfaceForAddedBean", result1.getBusinessLocals().get(0));
+		SessionBean result2 = TestUtils.getSessionBean(getEJBJar(), "testAdd2BeansThenInterfaceThenRemote2");
+		assertEquals("InterfaceForAddedBean", result2.getBusinessLocals().get(0));
+
+		// add interface. The bean should now resolve the interface and add it
+		// to local interfaces.
+		final String interfaceContent = "package com.sap;" + "public interface InterfaceForAddedBean {} ";
+		saveFileAndUpdate(interfaceFile, interfaceContent);
+
+		// change the interface to remote
+
+		saveFileAndUpdate(bean1File, bean1Content2);
+		result1 = TestUtils.getSessionBean(getEJBJar(), "testAdd2BeansThenInterfaceThenRemote1");
+		assertEquals("com.sap.InterfaceForAddedBean", result1.getBusinessRemotes().get(0));
+		assertTrue(result1.getBusinessLocals().isEmpty());
+
+		// revert the change
+		deleteFileAndUpdate(bean1File);
+		deleteFileAndUpdate(bean2File);
+		assertNull(TestUtils.getSessionBean(getEJBJar(), "testAdd2BeansThenInterfaceThenRemote1"));
+		assertNull(TestUtils.getSessionBean(getEJBJar(), "testAdd2BeansThenInterfaceThenRemote2"));
+		AbstractTest.deleteFile(interfaceFile);
+	}
+
+	/**
+	 * Add a bean. Then add a local interface. The interface has a local
+	 * annotation. Change the annotation of the interface to remote. The two
+	 * beans should be rebuilded and the interface should now be in the remote
+	 * business interfaces.
+	 * 
+	 * @throws Exception
+	 * @throws InterruptedException
+	 */
+	// @Test
+	public void testAdd2BeansThenInterfaceThenLocalThenOverrideWithLocal() throws InterruptedException, Exception {
+		IFile bean1File = facetedProject.getProject().getFile(
+				"ejbModule/com/sap/testAdd2BeansThenInterfaceThenRemote1.java");
+		IFile bean2File = facetedProject.getProject().getFile(
+				"ejbModule/com/sap/testAdd2BeansThenInterfaceThenRemote2.java");
+		IFile interfaceFile = facetedProject.getProject().getFile("ejbModule/com/sap/InterfaceForAddedBean.java");
+
+		final String bean1Content = "package com.sap;" + "import javax.ejb.Stateless;"
+				+ "@Stateless public class testAdd2BeansThenInterfaceThenRemote1 implements InterfaceForAddedBean {}";
+
+		final String bean1Content2 = "package com.sap;"
+				+ "import javax.ejb.Stateless;"
+				+ "@Stateless @Local({InterfaceForAddedBean.class}) public class testAdd2BeansThenInterfaceThenRemote1 implements InterfaceForAddedBean {}";
+
+		final String bean2Content = "package com.sap;" + "import javax.ejb.Stateless;"
+				+ "@Stateless public class testAdd2BeansThenInterfaceThenRemote2 implements InterfaceForAddedBean {}";
+		// add the bean. The interface is in the local list.
+		saveFileAndUpdate(bean1File, bean1Content);
+		saveFileAndUpdate(bean2File, bean2Content);
+		SessionBean result1 = TestUtils.getSessionBean(getEJBJar(), "testAdd2BeansThenInterfaceThenRemote1");
+		assertEquals("InterfaceForAddedBean", result1.getBusinessLocals().get(0));
+		SessionBean result2 = TestUtils.getSessionBean(getEJBJar(), "testAdd2BeansThenInterfaceThenRemote2");
+		assertEquals("InterfaceForAddedBean", result2.getBusinessLocals().get(0));
+
+		// add interface. The bean should now resolve the interface and add it
+		// to local interfaces.
+		final String interfaceContent = "package com.sap;" + "public interface InterfaceForAddedBean {} ";
+		saveFileAndUpdate(interfaceFile, interfaceContent);
+
+		// change the interface to remote
+
+		saveFileAndUpdate(bean1File, bean1Content2);
+		result1 = TestUtils.getSessionBean(getEJBJar(), "testAdd2BeansThenInterfaceThenRemote1");
+		assertEquals("com.sap.InterfaceForAddedBean", result1.getBusinessLocals().get(0));
+		assertTrue(result1.getBusinessRemotes().isEmpty());
+
+		// revert the change
+		deleteFileAndUpdate(bean1File);
+		deleteFileAndUpdate(bean2File);
+		assertNull(TestUtils.getSessionBean(getEJBJar(), "testAdd2BeansThenInterfaceThenRemote1"));
+		assertNull(TestUtils.getSessionBean(getEJBJar(), "testAdd2BeansThenInterfaceThenRemote2"));
+		AbstractTest.deleteFile(interfaceFile);
+	}
+
+	/**
+	 * Add a bean. Then add a local interface. The interface has a local
+	 * annotation. Change the annotation of the interface to remote. The two
+	 * beans should be rebuilded and the interface should now be in the remote
+	 * business interfaces.
+	 * 
+	 * @throws Exception
+	 * @throws InterruptedException
+	 */
+	// @Test
+	public void testAdd2BeansThenInterfaceThenRemoteThenOverrideWithRemote() throws InterruptedException, Exception {
+		IFile bean1File = facetedProject.getProject().getFile(
+				"ejbModule/com/sap/testAdd2BeansThenInterfaceThenRemote1.java");
+		IFile bean2File = facetedProject.getProject().getFile(
+				"ejbModule/com/sap/testAdd2BeansThenInterfaceThenRemote2.java");
+		IFile interfaceFile = facetedProject.getProject().getFile("ejbModule/com/sap/InterfaceForAddedBean.java");
+
+		final String bean1Content = "package com.sap;" + "import javax.ejb.Stateless;"
+				+ "@Stateless public class testAdd2BeansThenInterfaceThenRemote1 implements InterfaceForAddedBean {}";
+
+		final String bean1Content2 = "package com.sap;"
+				+ "import javax.ejb.Stateless;"
+				+ "@Stateless @Remote({InterfaceForAddedBean.class}) public class testAdd2BeansThenInterfaceThenRemote1 implements InterfaceForAddedBean {}";
+
+		final String bean2Content = "package com.sap;" + "import javax.ejb.Stateless;"
+				+ "@Stateless public class testAdd2BeansThenInterfaceThenRemote2 implements InterfaceForAddedBean {}";
+		// add the bean. The interface is in the local list.
+		saveFileAndUpdate(bean1File, bean1Content);
+		saveFileAndUpdate(bean2File, bean2Content);
+		SessionBean result1 = TestUtils.getSessionBean(getEJBJar(), "testAdd2BeansThenInterfaceThenRemote1");
+		assertEquals("InterfaceForAddedBean", result1.getBusinessLocals().get(0));
+		SessionBean result2 = TestUtils.getSessionBean(getEJBJar(), "testAdd2BeansThenInterfaceThenRemote2");
+		assertEquals("InterfaceForAddedBean", result2.getBusinessLocals().get(0));
+
+		// add interface. The bean should now resolve the interface and add it
+		// to local interfaces.
+		final String interfaceContent = "package com.sap;" + "public interface InterfaceForAddedBean {} ";
+		saveFileAndUpdate(interfaceFile, interfaceContent);
+
+		// change the interface to remote
+		final String interfaceContentRemote = "package com.sap;" + "import javax.ejb.Remote"
+				+ "@Remote public interface InterfaceForAddedBean {} ";
+		saveFileAndUpdate(interfaceFile, interfaceContentRemote);
+		result1 = TestUtils.getSessionBean(getEJBJar(), "testAdd2BeansThenInterfaceThenRemote1");
+		assertEquals("com.sap.InterfaceForAddedBean", result1.getBusinessRemotes().get(0));
+		result2 = TestUtils.getSessionBean(getEJBJar(), "testAdd2BeansThenInterfaceThenRemote2");
+		assertEquals("com.sap.InterfaceForAddedBean", result2.getBusinessRemotes().get(0));
+		assertTrue(result1.getBusinessLocals().isEmpty());
+		assertTrue(result2.getBusinessLocals().isEmpty());
+
+		saveFileAndUpdate(bean1File, bean1Content2);
+		result1 = TestUtils.getSessionBean(getEJBJar(), "testAdd2BeansThenInterfaceThenRemote1");
+		assertEquals("com.sap.InterfaceForAddedBean", result1.getBusinessRemotes().get(0));
+		assertTrue(result1.getBusinessLocals().isEmpty());
+
+		// revert the change
+		deleteFileAndUpdate(bean1File);
+		deleteFileAndUpdate(bean2File);
+		assertNull(TestUtils.getSessionBean(getEJBJar(), "testAdd2BeansThenInterfaceThenRemote1"));
+		assertNull(TestUtils.getSessionBean(getEJBJar(), "testAdd2BeansThenInterfaceThenRemote2"));
+		AbstractTest.deleteFile(interfaceFile);
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/ejb/tests/EjbReferenceTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/ejb/tests/EjbReferenceTest.java
new file mode 100644
index 0000000..301db9d
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/ejb/tests/EjbReferenceTest.java
@@ -0,0 +1,371 @@
+/***********************************************************************
+ * Copyright (c) 2008 by SAP AG, Walldorf. 
+ * 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:
+ *     SAP AG - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jst.jee.model.ejb.tests;
+
+import junit.framework.TestSuite;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IPackageFragmentRoot;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jst.j2ee.dependency.tests.util.ProjectUtil;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.javaee.core.EjbLocalRef;
+import org.eclipse.jst.javaee.core.InjectionTarget;
+import org.eclipse.jst.javaee.ejb.MessageDrivenBean;
+import org.eclipse.jst.javaee.ejb.SessionBean;
+import org.eclipse.jst.jee.model.internal.EJBAnnotationReader;
+import org.eclipse.jst.jee.model.internal.common.AbstractAnnotationModelProvider;
+import org.eclipse.jst.jee.model.tests.AbstractAnnotationModelTest;
+import org.eclipse.jst.jee.model.tests.AbstractTest;
+import org.eclipse.jst.jee.model.tests.TestUtils;
+
+/**
+ * @author Kiril Mitov k.mitov@sap.com
+ * 
+ */
+public class EjbReferenceTest extends AbstractAnnotationModelTest {
+
+	public static TestSuite suite() throws Exception {
+		TestSuite suite = new TestSuite(EjbReferenceTest.class);
+		return suite;
+	}
+
+	// @BeforeClass
+	public static void setUpProject() throws Exception {
+		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(EjbReferenceTest.class.getSimpleName());
+		if (!project.exists())
+		{
+			project = ProjectUtil.createEJBProject(EjbReferenceTest.class.getSimpleName(), null,
+				J2EEVersionConstants.EJB_3_0_ID, true);
+			createProjectContent(project);
+		}
+	}
+
+	private static void createProjectContent(IProject project) throws Exception {
+		IJavaProject javaProject = JavaCore.create(project);
+		IFolder comFolder = javaProject.getProject().getFolder("ejbModule/com");
+		comFolder.create(true, true, new NullProgressMonitor());
+		IPackageFragmentRoot root = javaProject.getPackageFragmentRoot(comFolder);
+		root.createPackageFragment("sap", true, new NullProgressMonitor());
+	}
+
+	// @AfterClass
+	public static void tearDownAfterClass() throws InterruptedException {
+		AbstractTest.deleteProject(EjbReferenceTest.class.getSimpleName());
+	}
+
+	// @Before
+	@Override
+	protected void setUp() throws Exception {
+		setUpProject();
+		super.setUp();
+		fixture = new EJBAnnotationReader(facetedProject, clientProject);
+	}
+
+	// @After
+	@Override
+	protected void tearDown() throws Exception {
+		((AbstractAnnotationModelProvider) fixture).dispose();
+	}
+
+	// @Test
+	public void testAddDeleteInterfaceEjbOnFieldAnnotation() throws Exception {
+		final String beanContent = "package com.sap;" + "@Stateless " + " public class AddedBean {"
+				+ "@EJB(beanInterface = InjectionInterface.class) " + "private InjectionInterface bean1;" + "}";
+		IFile beanFile = facetedProject.getProject().getFile("ejbModule/com/sap/AddedBean.java");
+		saveFileAndUpdate(beanFile, beanContent);
+		SessionBean result = TestUtils.getSessionBean(getEJBJar(), "AddedBean");
+		assertNotNull(result);
+		assertEquals(new Integer(1), new Integer(result.getEjbLocalRefs().size()));
+		EjbLocalRef ref = (EjbLocalRef) result.getEjbLocalRefs().get(0);
+		assertEquals("InjectionInterface", ref.getLocal());
+		assertEquals(new Integer(1), new Integer(ref.getInjectionTargets().size()));
+		InjectionTarget injectionTarget = (InjectionTarget) ref.getInjectionTargets().get(0);
+		assertEquals("com.sap.AddedBean", injectionTarget.getInjectionTargetClass());
+		assertEquals("bean1", injectionTarget.getInjectionTargetName());
+
+		final String interfaceContent = "package com.sap;" + "public interface InjectionInterface {}";
+		IFile interfaceFile = facetedProject.getProject().getFile("ejbModule/com/sap/InjectionInterface.java");
+		saveFileAndUpdate(interfaceFile, interfaceContent);
+		result = TestUtils.getSessionBean(getEJBJar(), "AddedBean");
+		ref = (EjbLocalRef) result.getEjbLocalRefs().get(0);
+		assertEquals("com.sap.InjectionInterface", ref.getLocal());
+
+		// revert the change
+		deleteFileAndUpdate(interfaceFile);
+		result = TestUtils.getSessionBean(getEJBJar(), "AddedBean");
+		ref = (EjbLocalRef) result.getEjbLocalRefs().get(0);
+		assertEquals("InjectionInterface", ref.getLocal());
+
+		deleteFileAndUpdate(beanFile);
+		assertNull(TestUtils.getSessionBean(getEJBJar(), "AddedBean"));
+	}
+
+	// @Test
+	public void testManyEjbFields() throws Exception {
+		final String beanContent = "package com.sap;" + "@Stateless " + " public class testManyEjbFields {"
+				+ "@EJB(beanInterface = InjectionInterface.class) private InjectionInterface bean1;"
+				+ "@EJB() private InjectionInterface bean2;"
+				+ "@EJB(beanInterface = Collection.class) private String invalideBean;"
+				+ "@EJB(beanInterface = Collection.class) private int simpelType;" + "}";
+		IFile beanFile = facetedProject.getProject().getFile("ejbModule/com/sap/testManyEjbFields.java");
+		saveFileAndUpdate(beanFile, beanContent);
+		SessionBean result = TestUtils.getSessionBean(getEJBJar(), "testManyEjbFields");
+		assertNotNull(result);
+		assertEquals(new Integer(2), new Integer(result.getEjbLocalRefs().size()));
+		EjbLocalRef bean1Reference = TestUtils.findLocalRefByName(result.getEjbLocalRefs(),
+				"com.sap.testManyEjbFields/bean1");
+		assertNotNull(bean1Reference);
+		assertEquals("InjectionInterface", bean1Reference.getLocal());
+		assertEquals("InjectionInterface", bean1Reference.getLocalHome());
+		EjbLocalRef bean2Reference = TestUtils.findLocalRefByName(result.getEjbLocalRefs(),
+				"com.sap.testManyEjbFields/bean2");
+		assertNotNull(bean2Reference);
+		assertEquals("InjectionInterface", bean2Reference.getLocalHome());
+		assertEquals("InjectionInterface", bean2Reference.getLocal());
+
+		// add the interface
+		final String interfaceContent = "package com.sap;" + "public interface InjectionInterface {}";
+		IFile interfaceFile = facetedProject.getProject().getFile("ejbModule/com/sap/InjectionInterface.java");
+		saveFileAndUpdate(interfaceFile, interfaceContent);
+		result = TestUtils.getSessionBean(getEJBJar(), "testManyEjbFields");
+		assertNotNull(result);
+		bean1Reference = TestUtils.findLocalRefByName(result.getEjbLocalRefs(), "com.sap.testManyEjbFields/bean1");
+		bean2Reference = TestUtils.findLocalRefByName(result.getEjbLocalRefs(), "com.sap.testManyEjbFields/bean2");
+		assertEquals("com.sap.InjectionInterface", bean1Reference.getLocal());
+		assertEquals("com.sap.InjectionInterface", bean1Reference.getLocalHome());
+		assertEquals("com.sap.InjectionInterface", bean2Reference.getLocalHome());
+
+		// revert the change
+		deleteFileAndUpdate(interfaceFile);
+		result = TestUtils.getSessionBean(getEJBJar(), "testManyEjbFields");
+		bean1Reference = TestUtils.findLocalRefByName(result.getEjbLocalRefs(), "com.sap.testManyEjbFields/bean1");
+		bean2Reference = TestUtils.findLocalRefByName(result.getEjbLocalRefs(), "com.sap.testManyEjbFields/bean2");
+		assertEquals("InjectionInterface", bean1Reference.getLocal());
+		assertEquals("InjectionInterface", bean1Reference.getLocalHome());
+		assertEquals("InjectionInterface", bean2Reference.getLocalHome());
+
+		deleteFileAndUpdate(beanFile);
+		assertNull(TestUtils.getSessionBean(getEJBJar(), "testManyEjbFields"));
+	}
+
+	// @Test
+	public void testAddDeleteInterfaceEjbOnMethodAnnotation() throws Exception {
+		final String beanContent = "package com.sap;" + "@Stateless "
+				+ " public class testAddDeleteInterfaceEjbOnMethodAnnotation {"
+				+ "@EJB(beanInterface = InjectionInterface.class) public void setBean1(InjectionInterface inter) {}"
+				+ "private InjectionInterface bean1;" + "}";
+		IFile beanFile = facetedProject.getProject().getFile(
+				"ejbModule/com/sap/testAddDeleteInterfaceEjbOnMethodAnnotation.java");
+		// add the bean file
+		saveFileAndUpdate(beanFile, beanContent);
+		SessionBean result = TestUtils.getSessionBean(getEJBJar(), "testAddDeleteInterfaceEjbOnMethodAnnotation");
+		assertNotNull(result);
+		assertEquals(new Integer(1), new Integer(result.getEjbLocalRefs().size()));
+		EjbLocalRef ref = (EjbLocalRef) result.getEjbLocalRefs().get(0);
+		assertEquals("InjectionInterface", ref.getLocal());
+		assertEquals(new Integer(1), new Integer(ref.getInjectionTargets().size()));
+		InjectionTarget injectionTarget = (InjectionTarget) ref.getInjectionTargets().get(0);
+		assertEquals("com.sap.testAddDeleteInterfaceEjbOnMethodAnnotation", injectionTarget.getInjectionTargetClass());
+		assertEquals("bean1", injectionTarget.getInjectionTargetName());
+
+		// add interface
+		final String interfaceContent = "package com.sap;" + "public interface InjectionInterface {}";
+		IFile interfaceFile = facetedProject.getProject().getFile("ejbModule/com/sap/InjectionInterface.java");
+		saveFileAndUpdate(interfaceFile, interfaceContent);
+		result = TestUtils.getSessionBean(getEJBJar(), "testAddDeleteInterfaceEjbOnMethodAnnotation");
+		ref = (EjbLocalRef) result.getEjbLocalRefs().get(0);
+		assertEquals("com.sap.InjectionInterface", ref.getLocal());
+
+		// revert the change
+		deleteFileAndUpdate(interfaceFile);
+		result = TestUtils.getSessionBean(getEJBJar(), "testAddDeleteInterfaceEjbOnMethodAnnotation");
+		ref = (EjbLocalRef) result.getEjbLocalRefs().get(0);
+		assertEquals("InjectionInterface", ref.getLocal());
+
+		deleteFileAndUpdate(beanFile);
+		assertNull(TestUtils.getSessionBean(getEJBJar(), "testAddDeleteInterfaceEjbOnMethodAnnotation"));
+	}
+
+	// @Test
+	public void testManyEjbMethods() throws Exception {
+		final String beanContent = "package com.sap;" + "@Stateless " + " public class testManyEjbMethods {"
+				+ "@EJB(beanInterface = InjectionInterface.class) public void setBean1(InjectionInterface bean1){};"
+				+ "@EJB() public void setBean2(InjectionInterface bean2){};"
+				+ "@EJB(beanInterface = Collection.class) public void setInvalideBean(String invalideBean) {};" + "}";
+		IFile beanFile = facetedProject.getProject().getFile("ejbModule/com/sap/testManyEjbMethods.java");
+		saveFileAndUpdate(beanFile, beanContent);
+		SessionBean result = TestUtils.getSessionBean(getEJBJar(), "testManyEjbMethods");
+		assertNotNull(result);
+		assertEquals(new Integer(2), new Integer(result.getEjbLocalRefs().size()));
+		EjbLocalRef bean1Reference = TestUtils.findLocalRefByName(result.getEjbLocalRefs(),
+				"com.sap.testManyEjbMethods/bean1");
+		assertNotNull(bean1Reference);
+		assertEquals("InjectionInterface", bean1Reference.getLocal());
+		assertEquals("InjectionInterface", bean1Reference.getLocalHome());
+		EjbLocalRef bean2Reference = TestUtils.findLocalRefByName(result.getEjbLocalRefs(),
+				"com.sap.testManyEjbMethods/bean2");
+		assertNotNull(bean2Reference);
+		assertEquals("InjectionInterface", bean2Reference.getLocalHome());
+		assertEquals("InjectionInterface", bean2Reference.getLocal());
+
+		// add the interface
+		final String interfaceContent = "package com.sap;" + "public interface InjectionInterface {}";
+		IFile interfaceFile = facetedProject.getProject().getFile("ejbModule/com/sap/InjectionInterface.java");
+		saveFileAndUpdate(interfaceFile, interfaceContent);
+		result = TestUtils.getSessionBean(getEJBJar(), "testManyEjbMethods");
+		assertNotNull(result);
+		bean1Reference = TestUtils.findLocalRefByName(result.getEjbLocalRefs(), "com.sap.testManyEjbMethods/bean1");
+		bean2Reference = TestUtils.findLocalRefByName(result.getEjbLocalRefs(), "com.sap.testManyEjbMethods/bean2");
+		assertEquals("com.sap.InjectionInterface", bean1Reference.getLocal());
+		assertEquals("com.sap.InjectionInterface", bean1Reference.getLocalHome());
+		assertEquals("com.sap.InjectionInterface", bean2Reference.getLocalHome());
+
+		// revert the change
+		deleteFileAndUpdate(interfaceFile);
+		result = TestUtils.getSessionBean(getEJBJar(), "testManyEjbMethods");
+		bean1Reference = TestUtils.findLocalRefByName(result.getEjbLocalRefs(), "com.sap.testManyEjbMethods/bean1");
+		bean2Reference = TestUtils.findLocalRefByName(result.getEjbLocalRefs(), "com.sap.testManyEjbMethods/bean2");
+		assertEquals("InjectionInterface", bean1Reference.getLocal());
+		assertEquals("InjectionInterface", bean1Reference.getLocalHome());
+		assertEquals("InjectionInterface", bean2Reference.getLocalHome());
+
+		deleteFileAndUpdate(beanFile);
+		assertNull(TestUtils.getSessionBean(getEJBJar(), "testManyEjbMethods"));
+	}
+
+	// @Test
+	public void testEjbOnMethodAndFieldsOfMessageBean() throws Exception {
+		final String beanContent = "package com.sap;" + "@MessageDriven "
+				+ " public class testEjbOnMethodAndFieldsOfMessageBean {"
+				+ "@EJB(beanInterface = InjectionInterface.class) public void setBean1(InjectionInterface bean1){};"
+				+ "@EJB() public InjectionInterface bean2;" + "}";
+		IFile beanFile = facetedProject.getProject().getFile(
+				"ejbModule/com/sap/testEjbOnMethodAndFieldsOfMessageBean.java");
+		saveFileAndUpdate(beanFile, beanContent);
+		MessageDrivenBean result = TestUtils.getMessageDrivenBean(getEJBJar(), "testEjbOnMethodAndFieldsOfMessageBean");
+		assertNotNull(result);
+		assertEquals(new Integer(2), new Integer(result.getEjbLocalRefs().size()));
+		EjbLocalRef bean1Reference = TestUtils.findLocalRefByName(result.getEjbLocalRefs(),
+				"com.sap.testEjbOnMethodAndFieldsOfMessageBean/bean1");
+		assertNotNull(bean1Reference);
+		assertEquals("InjectionInterface", bean1Reference.getLocal());
+		assertEquals("InjectionInterface", bean1Reference.getLocalHome());
+		EjbLocalRef bean2Reference = TestUtils.findLocalRefByName(result.getEjbLocalRefs(),
+				"com.sap.testEjbOnMethodAndFieldsOfMessageBean/bean2");
+		assertNotNull(bean2Reference);
+		assertEquals("InjectionInterface", bean2Reference.getLocalHome());
+		assertEquals("InjectionInterface", bean2Reference.getLocal());
+
+		// add the interface
+		final String interfaceContent = "package com.sap;" + "public interface InjectionInterface {}";
+		IFile interfaceFile = facetedProject.getProject().getFile("ejbModule/com/sap/InjectionInterface.java");
+		saveFileAndUpdate(interfaceFile, interfaceContent);
+		result = TestUtils.getMessageDrivenBean(getEJBJar(), "testEjbOnMethodAndFieldsOfMessageBean");
+		assertNotNull(result);
+		bean1Reference = TestUtils.findLocalRefByName(result.getEjbLocalRefs(),
+				"com.sap.testEjbOnMethodAndFieldsOfMessageBean/bean1");
+		bean2Reference = TestUtils.findLocalRefByName(result.getEjbLocalRefs(),
+				"com.sap.testEjbOnMethodAndFieldsOfMessageBean/bean2");
+		assertEquals("com.sap.InjectionInterface", bean1Reference.getLocal());
+		assertEquals("com.sap.InjectionInterface", bean1Reference.getLocalHome());
+		assertEquals("com.sap.InjectionInterface", bean2Reference.getLocalHome());
+
+		// revert the change
+		deleteFileAndUpdate(interfaceFile);
+		result = TestUtils.getMessageDrivenBean(getEJBJar(), "testEjbOnMethodAndFieldsOfMessageBean");
+		bean1Reference = TestUtils.findLocalRefByName(result.getEjbLocalRefs(),
+				"com.sap.testEjbOnMethodAndFieldsOfMessageBean/bean1");
+		bean2Reference = TestUtils.findLocalRefByName(result.getEjbLocalRefs(),
+				"com.sap.testEjbOnMethodAndFieldsOfMessageBean/bean2");
+		assertEquals("InjectionInterface", bean1Reference.getLocal());
+		assertEquals("InjectionInterface", bean1Reference.getLocalHome());
+		assertEquals("InjectionInterface", bean2Reference.getLocalHome());
+
+		deleteFileAndUpdate(beanFile);
+		assertNull(TestUtils.getSessionBean(getEJBJar(), "testEjbOnMethodAndFieldsOfMessageBean"));
+	}
+
+	// @Test
+	public void testAddDeleteBeanInterfaceOnEjbAnnotation() throws Exception {
+		final String beanContent = "package com.sap;"
+				+ "@Stateless @EJB(name=\"refName\", beanInterface = BeanInterface.class, "
+				+ "beanName=\"beanName\", mappedName=\"mappedName\")"
+				+ " public class testAddDeleteBeanInterfaceOnEjbAnnotation {}";
+		IFile beanFile = facetedProject.getProject().getFile(
+				"ejbModule/com/sap/testAddDeleteBeanInterfaceOnEjbAnnotation.java");
+		saveFileAndUpdate(beanFile, beanContent);
+		SessionBean result = TestUtils.getSessionBean(getEJBJar(), "testAddDeleteBeanInterfaceOnEjbAnnotation");
+		assertNotNull(result);
+		assertEquals(new Integer(1), new Integer(result.getEjbLocalRefs().size()));
+		EjbLocalRef ref = (EjbLocalRef) result.getEjbLocalRefs().get(0);
+		assertEquals("BeanInterface", ref.getLocal());
+
+		final String interfaceContent = "package com.sap;" + "public interface BeanInterface {}";
+		IFile interfaceFile = facetedProject.getProject().getFile("ejbModule/com/sap/BeanInterface.java");
+		saveFileAndUpdate(interfaceFile, interfaceContent);
+		result = TestUtils.getSessionBean(getEJBJar(), "testAddDeleteBeanInterfaceOnEjbAnnotation");
+		ref = (EjbLocalRef) result.getEjbLocalRefs().get(0);
+		assertEquals("com.sap.BeanInterface", ref.getLocal());
+
+		// revert the change
+		deleteFileAndUpdate(interfaceFile);
+		result = TestUtils.getSessionBean(getEJBJar(), "testAddDeleteBeanInterfaceOnEjbAnnotation");
+		ref = (EjbLocalRef) result.getEjbLocalRefs().get(0);
+		assertEquals("BeanInterface", ref.getLocal());
+
+		deleteFileAndUpdate(beanFile);
+		assertFalse(beanFile.exists());
+		assertNull(TestUtils.getSessionBean(getEJBJar(), "testAddDeleteBeanInterfaceOnEjbAnnotation"));
+	}
+
+	// @Test
+	public void testAddDeleteInterfaceOnEjbsAnnotation() throws Exception {
+		final String beanContent = "package com.sap;" + "@Stateless " + "@EJBs(value = { "
+				+ "@EJB(name=\"comparable\", beanInterface = java.lang.Comparable.class, beanName = \"beanName\"), "
+				+ "@EJB(name=\"nonResolved\", beanInterface = BeanInterface.class) }) "
+				+ " public class testAddDeleteInterfaceOnEjbsAnnotation {}";
+		IFile beanFile = facetedProject.getProject().getFile(
+				"ejbModule/com/sap/testAddDeleteInterfaceOnEjbsAnnotation.java");
+		saveFileAndUpdate(beanFile, beanContent);
+		SessionBean result = TestUtils.getSessionBean(getEJBJar(), "testAddDeleteInterfaceOnEjbsAnnotation");
+		assertNotNull(result);
+		EjbLocalRef comparable = TestUtils.findLocalRefByName(result.getEjbLocalRefs(), "comparable");
+		assertNotNull(comparable);
+		assertEquals("java.lang.Comparable", comparable.getLocal());
+		EjbLocalRef nonResolved = TestUtils.findLocalRefByName(result.getEjbLocalRefs(), "nonResolved");
+		assertNotNull(nonResolved);
+		assertEquals("BeanInterface", nonResolved.getLocal());
+		assertEquals(new Integer(2), new Integer(result.getEjbLocalRefs().size()));
+
+		final String interfaceContent = "package com.sap;" + "public interface BeanInterface {}";
+		IFile interfaceFile = facetedProject.getProject().getFile("ejbModule/com/sap/BeanInterface.java");
+		saveFileAndUpdate(interfaceFile, interfaceContent);
+		result = TestUtils.getSessionBean(getEJBJar(), "testAddDeleteInterfaceOnEjbsAnnotation");
+		nonResolved = TestUtils.findLocalRefByName(result.getEjbLocalRefs(), "nonResolved");
+		assertEquals("com.sap.BeanInterface", nonResolved.getLocal());
+
+		// revert the change
+		deleteFileAndUpdate(interfaceFile);
+		result = TestUtils.getSessionBean(getEJBJar(), "testAddDeleteInterfaceOnEjbsAnnotation");
+		nonResolved = TestUtils.findLocalRefByName(result.getEjbLocalRefs(), "nonResolved");
+		assertEquals("BeanInterface", nonResolved.getLocal());
+
+		deleteFileAndUpdate(beanFile);
+		assertNull(TestUtils.getSessionBean(getEJBJar(), "testAddDeleteInterfaceOnEjbsAnnotation"));
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/ejb/tests/GenerateDDTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/ejb/tests/GenerateDDTest.java
new file mode 100644
index 0000000..c117ef6
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/ejb/tests/GenerateDDTest.java
@@ -0,0 +1,84 @@
+/***********************************************************************
+ * Copyright (c) 2008 by SAP AG, Walldorf. 
+ * 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:
+ *     SAP AG - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jst.jee.model.ejb.tests;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jst.j2ee.dependency.tests.util.ProjectUtil;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.j2ee.model.IModelProvider;
+import org.eclipse.jst.j2ee.model.ModelProviderManager;
+import org.eclipse.jst.jee.model.tests.SynchronousModelChangedListener;
+import org.eclipse.jst.jee.project.facet.ICreateDeploymentFilesDataModelProperties;
+import org.eclipse.jst.jee.project.facet.IEJBCreateDeploymentFilesDataModelProperties;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+/**
+ * @author Kiril Mitov k.mitov@sap.com
+ * 
+ */
+public class GenerateDDTest extends TestCase {
+
+	private static final String EJB_JAR_CONTENT = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+			+ "<ejb-jar xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" "
+			+ "xmlns=\"http://java.sun.com/xml/ns/javaee\" "
+			+ "xmlns:ejb=\"http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd\" "
+			+ "xsi:schemaLocation=\"http://java.sun.com/xml/ns/javaee "
+			+ "http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd\" version=\"3.0\">" + "<enterprise-beans>"
+			+ "		<session>" + "			<ejb-name>NMTOKEN</ejb-name>" + "		</session>" + "	</enterprise-beans></ejb-jar>";
+
+	private IModelProvider fixture = null;
+
+	private IProject project = null;
+
+	public static Test suite() {
+		TestSuite suite = new TestSuite(GenerateDDTest.class);
+		return suite;
+	}
+
+	protected void setUp() throws Exception {
+		super.setUp();
+		project = ProjectUtil.createEJBProject(GenerateDDTest.class.getSimpleName(), null,
+				J2EEVersionConstants.EJB_3_0_ID, true);
+		fixture = ModelProviderManager.getModelProvider(project);
+	}
+
+	protected void tearDown() throws Exception {
+		ProjectUtil.deleteProject(project);
+		super.tearDown();
+	}
+
+	/**
+	 * Generated the deployment descriptor.
+	 * 
+	 * @throws InterruptedException
+	 */
+	public void testGenerateDD() throws Exception {
+		IFile file = project.getFile("ejbModule/META-INF/ejb-jar.xml");
+		assertFalse(file.exists());
+		SynchronousModelChangedListener listener = new SynchronousModelChangedListener(1);
+		fixture.addListener(listener);
+
+		IDataModel dataModel = DataModelFactory.createDataModel(IEJBCreateDeploymentFilesDataModelProperties.class);
+		dataModel.setProperty(ICreateDeploymentFilesDataModelProperties.TARGET_PROJECT, project);
+		dataModel.getDefaultOperation().execute(new NullProgressMonitor(), null);
+
+		listener.waitForEvents();
+		fixture.removeListener(listener);
+		assertEquals(new Integer(1), new Integer(listener.getReceivedEvents().size()));
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/ejb/tests/LifecycleAnnotationsTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/ejb/tests/LifecycleAnnotationsTest.java
new file mode 100644
index 0000000..ee917ac
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/ejb/tests/LifecycleAnnotationsTest.java
@@ -0,0 +1,209 @@
+/***********************************************************************
+ * Copyright (c) 2008 by SAP AG, Walldorf. 
+ * 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:
+ *     SAP AG - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jst.jee.model.ejb.tests;
+
+import junit.framework.TestSuite;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IPackageFragmentRoot;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jst.j2ee.dependency.tests.util.ProjectUtil;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.javaee.core.LifecycleCallback;
+import org.eclipse.jst.javaee.ejb.MessageDrivenBean;
+import org.eclipse.jst.javaee.ejb.SessionBean;
+import org.eclipse.jst.jee.model.internal.common.Result;
+import org.eclipse.jst.jee.model.tests.AbstractAnnotationFactoryTest;
+import org.eclipse.jst.jee.model.tests.AbstractTest;
+import org.eclipse.jst.jee.model.tests.TestUtils;
+import org.eclipse.wst.common.project.facet.core.IFacetedProject;
+import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
+
+/**
+ * @author Kiril Mitov k.mitov@sap.com
+ * 
+ */
+public class LifecycleAnnotationsTest extends AbstractAnnotationFactoryTest {
+
+	private IFacetedProject facetedProject;
+	
+	public static TestSuite suite() throws Exception {
+		TestSuite suite = new TestSuite(LifecycleAnnotationsTest.class);
+		return suite;
+	}
+
+	@Override
+	protected void setUp() throws Exception {
+		setUpProject();
+		super.setUp();
+		facetedProject =ProjectFacetsManager.create(ResourcesPlugin.getWorkspace().getRoot().getProject(this.getClass().getSimpleName())); 
+	}
+
+	// @BeforeClass
+	public static void setUpProject() throws Exception {
+		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(LifecycleAnnotationsTest.class.getSimpleName());
+		if (!project.exists())
+		{
+			project = ProjectUtil.createEJBProject(LifecycleAnnotationsTest.class.getSimpleName(), null,
+				J2EEVersionConstants.EJB_3_0_ID, true);
+			createProjectContent(project);
+		}
+	}
+
+	// @AfterClass
+	public static void tearDownAfterClass() throws InterruptedException {
+		AbstractTest.deleteProject(LifecycleAnnotationsTest.class.getSimpleName());
+	}
+
+	private static void createProjectContent(IProject project) throws Exception {
+		IJavaProject javaProject = JavaCore.create(project);
+		IFolder comFolder = javaProject.getProject().getFolder("ejbModule/com");
+		comFolder.create(true, true, new NullProgressMonitor());
+		IPackageFragmentRoot root = javaProject.getPackageFragmentRoot(comFolder);
+		root.createPackageFragment("sap", true, new NullProgressMonitor());
+	}
+
+	// @Test
+	public void testPostActivate() throws Exception {
+		final String beanContent = "package com.sap;"
+				+ "@Stateful public class testPostActivate implements SessionBeanLocal{"
+				+ "@PostActivate public void postActivateMethod() {}"
+				+ "@PostActivate protected void protectedMethod() {}" + "@PostActivate void defaultMethod() {}"
+				+ "@PostActivate private void privateMethod() {}"
+				+ "@PostActivate public String returnTypeMethod() {return null;}"
+				+ "@PostActivate public void paramMethod(String param) {}"
+				+ "@PostActivate public void exceptionMethod() throws Exception {}"
+				+ "@PostActivate public final void finalMethod() {}" + "}";
+		IFile beanFile = facetedProject.getProject().getFile("ejbModule/com/sap/testPostActivate.java");
+		AbstractTest.saveFile(beanFile, beanContent);
+		IType type = JavaCore.createCompilationUnitFrom(beanFile).findPrimaryType();
+		Result result = fixture.createJavaeeObject(type);
+		SessionBean sessionBean = (SessionBean) result.getMainObject();
+		assertNotNull(sessionBean);
+		assertEquals("testPostActivate", sessionBean.getEjbName());
+		LifecycleCallback postActivateMethod = TestUtils.findLifecycleMethod(sessionBean.getPostActivates(),
+				"postActivateMethod");
+		assertEquals("com.sap.testPostActivate", postActivateMethod.getLifecycleCallbackClass());
+		LifecycleCallback protectedMethod = TestUtils.findLifecycleMethod(sessionBean.getPostActivates(),
+				"protectedMethod");
+		assertEquals("com.sap.testPostActivate", protectedMethod.getLifecycleCallbackClass());
+		LifecycleCallback defaultMethod = TestUtils
+				.findLifecycleMethod(sessionBean.getPostActivates(), "defaultMethod");
+		assertEquals("com.sap.testPostActivate", defaultMethod.getLifecycleCallbackClass());
+		LifecycleCallback privateMethod = TestUtils
+				.findLifecycleMethod(sessionBean.getPostActivates(), "privateMethod");
+		assertEquals("com.sap.testPostActivate", privateMethod.getLifecycleCallbackClass());
+		assertEquals(new Integer(4), new Integer(sessionBean.getPostActivates().size()));
+
+	}
+
+	// @Test
+	public void testPrePassivate() throws Exception {
+		final String beanContent = "package com.sap;"
+				+ "@Stateful public class testPrePassivate implements SessionBeanLocal{"
+				+ "@PrePassivate public void prePassivateMethod() {}"
+				+ "@PrePassivate protected void protectedMethod() {}" + "@PrePassivate void defaultMethod() {}"
+				+ "@PrePassivate private void privateMethod() {}"
+				+ "@PrePassivate public String returnTypeMethod() {return null;}"
+				+ "@PrePassivate public void paramMethod(String param) {}"
+				+ "@PrePassivate public void exceptionMethod() throws Exception {}"
+				+ "@PrePassivate public final void finalMethod() {}" + "}";
+		IFile beanFile = facetedProject.getProject().getFile("ejbModule/com/sap/testPrePassivate.java");
+		AbstractTest.saveFile(beanFile, beanContent);
+		IType type = JavaCore.createCompilationUnitFrom(beanFile).findPrimaryType();
+
+		Result result = fixture.createJavaeeObject(type);
+		SessionBean sessionBean = (SessionBean) result.getMainObject();
+		assertNotNull(sessionBean);
+		LifecycleCallback postActivateMethod = TestUtils.findLifecycleMethod(sessionBean.getPrePassivates(),
+				"prePassivateMethod");
+		assertEquals("com.sap.testPrePassivate", postActivateMethod.getLifecycleCallbackClass());
+		LifecycleCallback protectedMethod = TestUtils.findLifecycleMethod(sessionBean.getPrePassivates(),
+				"protectedMethod");
+		assertEquals("com.sap.testPrePassivate", protectedMethod.getLifecycleCallbackClass());
+		LifecycleCallback defaultMethod = TestUtils
+				.findLifecycleMethod(sessionBean.getPrePassivates(), "defaultMethod");
+		assertEquals("com.sap.testPrePassivate", defaultMethod.getLifecycleCallbackClass());
+		LifecycleCallback privateMethod = TestUtils
+				.findLifecycleMethod(sessionBean.getPrePassivates(), "privateMethod");
+		assertEquals("com.sap.testPrePassivate", privateMethod.getLifecycleCallbackClass());
+		assertEquals(new Integer(4), new Integer(sessionBean.getPrePassivates().size()));
+	}
+
+	// @Test
+	public void testPostConstruct() throws Exception {
+		final String beanContent = "package com.sap;"
+				+ "@Stateless public class testPostConstruct implements SessionBeanLocal {"
+				+ "@PostConstruct public void publicMethod() {}"
+				+ "@PostConstruct public static void staticMethod() {}"
+				+ "@PostConstruct public final void finalMethod(){}" + "@PostConstruct public String returnType() {}"
+				+ "@PostConstruct public void paramMethod(String param) {}"
+				+ "@PostConstruct public void throwExpception() throws Exception {};" + "}";
+		IFile beanFile = facetedProject.getProject().getFile("ejbModule/com/sap/testPostConstruct.java");
+		AbstractTest.saveFile(beanFile, beanContent);
+		IType type = JavaCore.createCompilationUnitFrom(beanFile).findPrimaryType();
+		Result result = fixture.createJavaeeObject(type);
+		SessionBean sessionBean = (SessionBean) result.getMainObject();
+		assertNotNull(sessionBean);
+		assertEquals("testPostConstruct", sessionBean.getEjbName());
+		LifecycleCallback callback = TestUtils.findLifecycleMethod(sessionBean.getPostConstructs(), "publicMethod");
+		assertEquals("com.sap.testPostConstruct", callback.getLifecycleCallbackClass());
+		assertEquals(new Integer(1), new Integer(sessionBean.getPostConstructs().size()));
+
+	}
+
+	// @Test
+	public void testPreDestroy() throws Exception {
+		final String beanContent = "package com.sap;"
+				+ "@Stateless public class testPreDestroy implements SessionBeanLocal {"
+				+ "@PreDestroy public void publicMethod() {}" + "@PreDestroy public static void staticMethod() {}"
+				+ "@PreDestroy public final void finalMethod(){}" + "@PreDestroy public String returnType() {}"
+				+ "@PreDestroy public void paramMethod(String param) {}"
+				+ "@PreDestroy public void throwExpception() throws Exception {};" + "}";
+		IFile beanFile = facetedProject.getProject().getFile("ejbModule/com/sap/testPreDestroy.java");
+		AbstractTest.saveFile(beanFile, beanContent);
+		IType type = JavaCore.createCompilationUnitFrom(beanFile).findPrimaryType();
+		Result result = fixture.createJavaeeObject(type);
+		SessionBean sessionBean = (SessionBean) result.getMainObject();
+		assertNotNull(sessionBean);
+		LifecycleCallback callback = TestUtils.findLifecycleMethod(sessionBean.getPreDestroys(), "publicMethod");
+		assertEquals("com.sap.testPreDestroy", callback.getLifecycleCallbackClass());
+		assertEquals(new Integer(1), new Integer(sessionBean.getPreDestroys().size()));
+	}
+
+	// @Test
+	public void testLifecycleOnMessageDriven() throws Exception {
+		final String beanContent = "package com.sap;"
+				+ "@MessageDriven public class testLifecycleOnMessageDriven implements SessionBeanLocal {"
+				+ "@PostConstruct public void postConstructMethod() {}"
+				+ "@PreDestroy public void preDestroyMethod() {}" + "}";
+		IFile beanFile = facetedProject.getProject().getFile("ejbModule/com/sap/testLifecycleOnMessageDriven.java");
+		AbstractTest.saveFile(beanFile, beanContent);
+		IType type = JavaCore.createCompilationUnitFrom(beanFile).findPrimaryType();
+		Result result = fixture.createJavaeeObject(type);
+		MessageDrivenBean mdb = (MessageDrivenBean) result.getMainObject();
+		assertNotNull(mdb);
+		LifecycleCallback callback1 = TestUtils.findLifecycleMethod(mdb.getPostConstructs(), "postConstructMethod");
+		assertNotNull(callback1);
+		assertEquals("com.sap.testLifecycleOnMessageDriven", callback1.getLifecycleCallbackClass());
+		LifecycleCallback callback2 = TestUtils.findLifecycleMethod(mdb.getPreDestroys(), "preDestroyMethod");
+		assertNotNull(callback2);
+		assertEquals("com.sap.testLifecycleOnMessageDriven", callback2.getLifecycleCallbackClass());
+		assertEquals(new Integer(1), new Integer(mdb.getPreDestroys().size()));
+		assertEquals(new Integer(1), new Integer(mdb.getPostConstructs().size()));
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/ejb/tests/NotifyCloseProjectTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/ejb/tests/NotifyCloseProjectTest.java
new file mode 100644
index 0000000..117c7ba
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/ejb/tests/NotifyCloseProjectTest.java
@@ -0,0 +1,83 @@
+/***********************************************************************
+ * Copyright (c) 2008 by SAP AG, Walldorf. 
+ * 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:
+ *     SAP AG - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jst.jee.model.ejb.tests;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.eclipse.jst.j2ee.model.IModelProvider;
+import org.eclipse.jst.j2ee.model.IModelProviderEvent;
+import org.eclipse.jst.j2ee.model.ModelProviderManager;
+import org.eclipse.jst.jee.model.tests.AbstractTest;
+import org.eclipse.jst.jee.model.tests.SynchronousModelChangedListener;
+import org.eclipse.wst.common.project.facet.core.IFacetedProject;
+
+/**
+ * @author Kiril Mitov k.mitov@sap.com
+ * 
+ */
+public class NotifyCloseProjectTest extends TestCase {
+
+	public static Test suite() {
+		TestSuite suite = new TestSuite(NotifyCloseProjectTest.class);
+		return suite;
+	}
+
+	/**
+	 * Get the model for a project. Close the project. Get the model from the
+	 * same model provider. The model should be null because the project is
+	 * closed.
+	 * 
+	 * @throws Exception
+	 */
+	// @Test
+	public void testCloseEjbProject() throws Exception {
+		IFacetedProject facetedProject = AbstractTest.createEjbProject(NotifyCloseProjectTest.class.getSimpleName()
+				+ "testCloseEjbProject");
+		IModelProvider provider = ModelProviderManager.getModelProvider(facetedProject.getProject());
+		provider.getModelObject();
+
+		SynchronousModelChangedListener listener = new SynchronousModelChangedListener(1);
+		provider.addListener(listener);
+		AbstractTest.closeProject(facetedProject.getProject().getName());
+		assertTrue(listener.waitForEvents());
+		provider.removeListener(listener);
+		assertEquals(new Integer(1), new Integer(listener.getReceivedEvents().size()));
+		IModelProviderEvent event = listener.getReceivedEvents().iterator().next();
+		assertTrue(event.getEventCode() == IModelProviderEvent.UNLOADED_RESOURCE);
+	}
+
+	/**
+	 * Get the model for a project. Close the project. Get the model from the
+	 * same model provider. The model should be null because the project is
+	 * closed.
+	 * 
+	 * @throws Exception
+	 */
+	// @Test
+	public void testCloseWebProject() throws Exception {
+		IFacetedProject facetedProject = AbstractTest.createWebProject(NotifyCloseProjectTest.class.getSimpleName()
+				+ "testCloseWebProject");
+		IModelProvider provider = ModelProviderManager.getModelProvider(facetedProject.getProject());
+		provider.getModelObject();
+
+		SynchronousModelChangedListener listener = new SynchronousModelChangedListener(1);
+		provider.addListener(listener);
+		AbstractTest.closeProject(facetedProject.getProject().getName());
+		assertTrue(listener.waitForEvents());
+		provider.removeListener(listener);
+		assertEquals(new Integer(1), new Integer(listener.getReceivedEvents().size()));
+		IModelProviderEvent event = listener.getReceivedEvents().iterator().next();
+		assertTrue(event.getEventCode() == IModelProviderEvent.UNLOADED_RESOURCE);
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/ejb/tests/ResourceReferenceTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/ejb/tests/ResourceReferenceTest.java
new file mode 100644
index 0000000..bab4154
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/ejb/tests/ResourceReferenceTest.java
@@ -0,0 +1,278 @@
+/***********************************************************************
+ * Copyright (c) 2008 by SAP AG, Walldorf. 
+ * 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:
+ *     SAP AG - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jst.jee.model.ejb.tests;
+
+import junit.framework.TestSuite;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IPackageFragmentRoot;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jst.javaee.core.Description;
+import org.eclipse.jst.javaee.core.ResAuthType;
+import org.eclipse.jst.javaee.core.ResSharingScopeType;
+import org.eclipse.jst.javaee.core.ResourceRef;
+import org.eclipse.jst.javaee.ejb.SessionBean;
+import org.eclipse.jst.jee.model.internal.EJBAnnotationReader;
+import org.eclipse.jst.jee.model.internal.common.AbstractAnnotationModelProvider;
+import org.eclipse.jst.jee.model.tests.AbstractAnnotationModelTest;
+import org.eclipse.jst.jee.model.tests.AbstractTest;
+import org.eclipse.jst.jee.model.tests.TestUtils;
+import org.eclipse.wst.common.project.facet.core.IFacetedProject;
+
+/**
+ * @author Kiril Mitov k.mitov@sap.com
+ * 
+ */
+public class ResourceReferenceTest extends AbstractAnnotationModelTest {
+
+	public static TestSuite suite() throws Exception {
+		TestSuite suite = new TestSuite(ResourceReferenceTest.class);
+		return suite;
+	}
+
+	// @BeforeClass
+	public static void setUpProject() throws Exception {
+		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(ResourceReferenceTest.class.getSimpleName());
+		if (!project.exists())
+		{
+			IFacetedProject facetedProject = AbstractTest.createEjbProject(ResourceReferenceTest.class.getSimpleName());
+			createProjectContent(facetedProject.getProject());
+		}
+	}
+
+	private static void createProjectContent(IProject project) throws Exception {
+		IJavaProject javaProject = JavaCore.create(project);
+		IFolder comFolder = javaProject.getProject().getFolder("ejbModule/com");
+		comFolder.create(true, true, new NullProgressMonitor());
+		IPackageFragmentRoot root = javaProject.getPackageFragmentRoot(comFolder);
+		root.createPackageFragment("sap", true, new NullProgressMonitor());
+	}
+
+	// @AfterClass
+	public static void tearDownAfterClass() throws InterruptedException {
+//		AbstractTest.deleteProject(facetedProject.getProject().getName());
+	}
+
+	// @Before
+	@Override
+	protected void setUp() throws Exception {
+		setUpProject();
+		super.setUp();
+		fixture = new EJBAnnotationReader(facetedProject, clientProject);
+	}
+
+	// @After
+	public void tearDown() throws Exception {
+		((AbstractAnnotationModelProvider) fixture).dispose();
+	}
+
+	//@Test
+	public void testResource() throws Exception {
+		final String beanContent = "package com.sap;" + "@Stateless "
+				+ "@Resource(name =\"withNotDefaults\", mappedName = \"mappedName\", shareable = false, "
+				+ "type = java.lang.Comparable.class, "
+				+ "authenticationType = AuthenticationType.CONTAINER, description = \"description\")"
+				+ "public class testResource implements SessionBeanLocal{}";
+		IFile beanFile = facetedProject.getProject().getFile("ejbModule/com/sap/testResource.java");
+		saveFileAndUpdate(beanFile, beanContent);
+		SessionBean result = TestUtils.getSessionBean(getEJBJar(), "testResource");
+		assertNotNull(result);
+		ResourceRef ref = TestUtils.findResourceRefByName(result.getResourceRefs(), "withNotDefaults");
+		assertNotNull(ref);
+		assertEquals("description", ((Description) ref.getDescriptions().get(0)).getValue());
+		assertEquals("mappedName", ref.getMappedName());
+		assertEquals(ResSharingScopeType.UNSHAREABLE_LITERAL, ref.getResSharingScope());
+		assertEquals(ResAuthType.CONTAINER_LITERAL, ref.getResAuth());
+
+		deleteFileAndUpdate(beanFile);
+		assertNull(TestUtils.getSessionBean(getEJBJar(), "testResource"));
+	}
+
+	//@Test
+	public void testResourcesDefaults() throws Exception {
+		final String beanContent = "package com.sap;" + "@Stateless "
+				+ "@Resource(name =\"withDefaults\", mappedName = \"mappedName\","
+				+ "type = java.lang.Comparable.class, " + "description = \"description\")"
+				+ "public class testResourcesDefaults implements SessionBeanLocal{}";
+		IFile beanFile = facetedProject.getProject().getFile("ejbModule/com/sap/testResourcesDefaults.java");
+		saveFileAndUpdate(beanFile, beanContent);
+		SessionBean result = TestUtils.getSessionBean(getEJBJar(), "testResourcesDefaults");
+		assertNotNull(result);
+		ResourceRef ref = TestUtils.findResourceRefByName(result.getResourceRefs(), "withDefaults");
+		assertNotNull(ref);
+		assertEquals("description", ((Description) ref.getDescriptions().get(0)).getValue());
+		assertEquals("mappedName", ref.getMappedName());
+		assertEquals("java.lang.Comparable", ref.getResType());
+		assertEquals(ResSharingScopeType.SHAREABLE_LITERAL, ref.getResSharingScope());
+		assertEquals(ResAuthType.APPLICATION_LITERAL, ref.getResAuth());
+
+		deleteFileAndUpdate(beanFile);
+		assertNull(TestUtils.getSessionBean(getEJBJar(), "testResourcesDefaults"));
+	}
+
+	//@Test
+	public void testResources() throws Exception {
+		final String beanContent = "package com.sap;"
+				+ "@Stateless "
+				+ "@Resources(value = {"
+				+ "@Resource(name = \"withNotDefaults\", mappedName = \"mappedName\", "
+				+ "	shareable = false, type = java.lang.Comparable.class, "
+				+ "	authenticationType = AuthenticationType.APPLICATION, description = \"description\"),"
+				+ "@Resource(name = \"withDefaults\", type = java.lang.Comparable.class), @Resource(name = \"invalidNoType\") })"
+				+ "public class testResources implements SessionBeanLocal{}";
+		IFile beanFile = facetedProject.getProject().getFile("ejbModule/com/sap/testResources.java");
+		saveFileAndUpdate(beanFile, beanContent);
+		SessionBean result = TestUtils.getSessionBean(getEJBJar(), "testResources");
+		assertNotNull(result);
+		assertNotNull(TestUtils.findResourceRefByName(result.getResourceRefs(), "withNotDefaults"));
+		assertNotNull(TestUtils.findResourceRefByName(result.getResourceRefs(), "withDefaults"));
+		assertEquals(new Integer(2), new Integer(result.getResourceRefs().size()));
+
+		deleteFileAndUpdate(beanFile);
+		assertNull(TestUtils.getSessionBean(getEJBJar(), "testResources"));
+	}
+
+	//@Test
+	public void testResourceUnresolved() throws Exception {
+		final String beanContent = "package com.sap;" + "@Stateless " + "@Resource(name =\"withNotDefaults\","
+				+ "type = ResourceInterface.class)"
+				+ "public class testResourceUnresolved implements SessionBeanLocal{}";
+		// add the bean.
+		IFile beanFile = facetedProject.getProject().getFile("ejbModule/com/sap/testResourceUnresolved.java");
+		saveFileAndUpdate(beanFile, beanContent);
+		SessionBean result = TestUtils.getSessionBean(getEJBJar(), "testResourceUnresolved");
+		assertNotNull(result);
+		ResourceRef ref = TestUtils.findResourceRefByName(result.getResourceRefs(), "withNotDefaults");
+		assertNotNull(ref);
+		assertEquals("ResourceInterface", ref.getResType());
+
+		// add the interface. The name should be resolved
+		final String interfaceContent = "package com.sap;" + "public interface ResourceInterface {}";
+		IFile interfaceFile = facetedProject.getProject().getFile("ejbModule/com/sap/ResourceInterface.java");
+		saveFileAndUpdate(interfaceFile, interfaceContent);
+		result = TestUtils.getSessionBean(getEJBJar(), "testResourceUnresolved");
+		assertNotNull(result);
+		ref = TestUtils.findResourceRefByName(result.getResourceRefs(), "withNotDefaults");
+		assertNotNull(ref);
+		assertEquals("com.sap.ResourceInterface", ref.getResType());
+
+		// delete the file. The name is now not resolved.
+		deleteFileAndUpdate(interfaceFile);
+		result = TestUtils.getSessionBean(getEJBJar(), "testResourceUnresolved");
+		assertNotNull(result);
+		ref = TestUtils.findResourceRefByName(result.getResourceRefs(), "withNotDefaults");
+		assertNotNull(ref);
+		assertEquals("ResourceInterface", ref.getResType());
+
+		deleteFileAndUpdate(beanFile);
+		assertNull(TestUtils.getSessionBean(getEJBJar(), "testResourceUnresolved"));
+	}
+
+	//@Test
+	public void testResourceOnField() throws Exception {
+		final String beanContent = "package com.sap;" + "@Stateless "
+				+ "public class testResourceOnField implements SessionBeanLocal{"
+				+ "@Resource(type = java.lang.Comparable.class) private java.lang.Comparable valid;"
+				+ "@Resource(type = java.lang.Comparable.class) private int simpleType;"
+				+ "@Resource private java.lang.Comparable validButWithoutType;}";
+		IFile beanFile = facetedProject.getProject().getFile("ejbModule/com/sap/testResourceOnField.java");
+		saveFileAndUpdate(beanFile, beanContent);
+		SessionBean result = TestUtils.getSessionBean(getEJBJar(), "testResourceOnField");
+		assertNotNull(result);
+		ResourceRef ref1 = TestUtils.findResourceRefByName(result.getResourceRefs(),
+				"com.sap.testResourceOnField/valid");
+		assertNotNull(ref1);
+		assertEquals("java.lang.Comparable", ref1.getResType());
+		ResourceRef ref2 = TestUtils.findResourceRefByName(result.getResourceRefs(),
+				"com.sap.testResourceOnField/validButWithoutType");
+		assertNotNull(ref2);
+		assertEquals("java.lang.Comparable", ref2.getResType());
+		assertEquals(new Integer(2), new Integer(result.getResourceRefs().size()));
+
+		deleteFileAndUpdate(beanFile);
+		assertNull(TestUtils.getSessionBean(getEJBJar(), "testResourceOnField"));
+	}
+
+	//@Test
+	public void testResourceOnMethod() throws Exception {
+		final String beanContent = "package com.sap;" + "@Stateless "
+				+ "public class testResourceOnMethod implements SessionBeanLocal{"
+				+ "@Resource(type = java.lang.Comparable.class) public void validMethod(Comparable arg0){};"
+				+ "@Resource(type = java.lang.Comparable.class) private void simpleType(int arg0) {};"
+				+ "@Resource public void validButWithoutType(Comparable arg0){};"
+				+ "@Resource public void twoParams(Comparable arg0, Comparable arg1} {};}";
+		IFile beanFile = facetedProject.getProject().getFile("ejbModule/com/sap/testResourceOnMethod.java");
+		saveFileAndUpdate(beanFile, beanContent);
+		SessionBean result = TestUtils.getSessionBean(getEJBJar(), "testResourceOnMethod");
+		assertNotNull(result);
+		ResourceRef ref1 = TestUtils.findResourceRefByName(result.getResourceRefs(),
+				"com.sap.testResourceOnMethod/validMethod");
+		assertNotNull(ref1);
+		ResourceRef ref2 = TestUtils.findResourceRefByName(result.getResourceRefs(),
+				"com.sap.testResourceOnMethod/validButWithoutType");
+		assertNotNull(ref2);
+		assertEquals(new Integer(2), new Integer(result.getResourceRefs().size()));
+
+		deleteFileAndUpdate(beanFile);
+		assertNull(TestUtils.getSessionBean(getEJBJar(), "testResourceOnMethod"));
+	}
+
+	//@Test
+	public void testResourceOnMethodAndFieldUnresolved() throws Exception {
+		final String beanContent = "package com.sap;" + "@Stateless "
+				+ "public class testResourceOnMethodAndFieldUnresolved implements SessionBeanLocal{"
+				+ "@Resource(type = ResourceInterface.class) public void validMethod(ResourceInterface arg0){};"
+				+ "@Resource private ResourceInterface valid;}";
+		IFile beanFile = facetedProject.getProject().getFile(
+				"ejbModule/com/sap/testResourceOnMethodAndFieldUnresolved.java");
+		saveFileAndUpdate(beanFile, beanContent);
+		SessionBean result = TestUtils.getSessionBean(getEJBJar(), "testResourceOnMethodAndFieldUnresolved");
+		assertNotNull(result);
+		ResourceRef ref1 = TestUtils.findResourceRefByName(result.getResourceRefs(),
+				"com.sap.testResourceOnMethodAndFieldUnresolved/validMethod");
+		assertEquals("ResourceInterface", ref1.getResType());
+		ResourceRef ref2 = TestUtils.findResourceRefByName(result.getResourceRefs(),
+				"com.sap.testResourceOnMethodAndFieldUnresolved/valid");
+		assertEquals("ResourceInterface", ref2.getResType());
+
+		// add the interface. The name should be resolved
+		final String interfaceContent = "package com.sap;" + "public interface ResourceInterface {}";
+		IFile interfaceFile = facetedProject.getProject().getFile("ejbModule/com/sap/ResourceInterface.java");
+		saveFileAndUpdate(interfaceFile, interfaceContent);
+		result = TestUtils.getSessionBean(getEJBJar(), "testResourceOnMethodAndFieldUnresolved");
+		assertNotNull(result);
+		ref1 = TestUtils.findResourceRefByName(result.getResourceRefs(),
+				"com.sap.testResourceOnMethodAndFieldUnresolved/validMethod");
+		ref2 = TestUtils.findResourceRefByName(result.getResourceRefs(),
+				"com.sap.testResourceOnMethodAndFieldUnresolved/valid");
+		assertEquals("com.sap.ResourceInterface", ref1.getResType());
+		assertEquals("com.sap.ResourceInterface", ref1.getResType());
+
+		// delete the file. The name is now not resolved.
+		deleteFileAndUpdate(interfaceFile);
+		result = TestUtils.getSessionBean(getEJBJar(), "testResourceOnMethodAndFieldUnresolved");
+		ref1 = TestUtils.findResourceRefByName(result.getResourceRefs(),
+				"com.sap.testResourceOnMethodAndFieldUnresolved/validMethod");
+		ref2 = TestUtils.findResourceRefByName(result.getResourceRefs(),
+				"com.sap.testResourceOnMethodAndFieldUnresolved/valid");
+		assertEquals("ResourceInterface", ref1.getResType());
+		assertEquals("ResourceInterface", ref2.getResType());
+
+		deleteFileAndUpdate(beanFile);
+		assertNull(TestUtils.getSessionBean(getEJBJar(), "testResourceOnMethodAndFieldUnresolved"));
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/ejb/tests/SecurityRolesTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/ejb/tests/SecurityRolesTest.java
new file mode 100644
index 0000000..c0f07b6
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/ejb/tests/SecurityRolesTest.java
@@ -0,0 +1,175 @@
+/***********************************************************************
+ * Copyright (c) 2008 by SAP AG, Walldorf. 
+ * 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:
+ *     SAP AG - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jst.jee.model.ejb.tests;
+
+import junit.framework.TestSuite;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IPackageFragmentRoot;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jst.j2ee.dependency.tests.util.ProjectUtil;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.javaee.core.RunAs;
+import org.eclipse.jst.javaee.core.SecurityRole;
+import org.eclipse.jst.javaee.core.SecurityRoleRef;
+import org.eclipse.jst.javaee.ejb.MessageDrivenBean;
+import org.eclipse.jst.javaee.ejb.SecurityIdentityType;
+import org.eclipse.jst.javaee.ejb.SessionBean;
+import org.eclipse.jst.jee.model.internal.EJBAnnotationReader;
+import org.eclipse.jst.jee.model.internal.common.AbstractAnnotationModelProvider;
+import org.eclipse.jst.jee.model.tests.AbstractAnnotationModelTest;
+import org.eclipse.jst.jee.model.tests.AbstractTest;
+import org.eclipse.jst.jee.model.tests.TestUtils;
+
+/**
+ * @author Kiril Mitov k.mitov@sap.com
+ * 
+ */
+public class SecurityRolesTest extends AbstractAnnotationModelTest {
+
+	public static TestSuite suite() throws Exception {
+		TestSuite suite = new TestSuite(SecurityRolesTest.class);
+		return suite;
+	}
+	
+	// @BeforeClass
+	public static void setUpProject() throws Exception {
+		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(SecurityRolesTest.class.getSimpleName());
+		if (!project.exists())
+		{
+			project = ProjectUtil.createEJBProject(SecurityRolesTest.class.getSimpleName(), null, J2EEVersionConstants.EJB_3_0_ID, true);
+			createProjectContent(project);
+		}
+	}
+
+	// @AfterClass
+	public static void tearDownAfterClass() throws InterruptedException {
+		AbstractTest.deleteProject(SecurityRolesTest.class.getSimpleName());
+	}
+
+	private static void createProjectContent(IProject project) throws Exception {
+		IJavaProject javaProject = JavaCore.create(project);
+		IFolder comFolder = javaProject.getProject().getFolder("ejbModule/com");
+		comFolder.create(true, true, new NullProgressMonitor());
+		IPackageFragmentRoot root = javaProject.getPackageFragmentRoot(comFolder);
+		root.createPackageFragment("sap", true, new NullProgressMonitor());
+	}
+
+	// @Before
+	@Override
+	protected void setUp() throws Exception {
+		setUpProject();
+		super.setUp();
+		fixture = new EJBAnnotationReader(facetedProject, clientProject);
+	}
+
+	// @After
+	@Override
+	protected void tearDown() throws Exception {
+		((AbstractAnnotationModelProvider) fixture).dispose();
+	}
+
+	// @Test
+	public void testDeclareRoles() throws Exception {
+		final String beanContent = "package com.sap;" + "@DeclareRoles(value = {\"role1\", \"role2\"}) "
+				+ "@Stateless public class testDeclareRoles implements SessionBeanLocal {}";
+
+		IFile beanFile = facetedProject.getProject().getFile("ejbModule/com/sap/testDeclareRoles.java");
+		saveFileAndUpdate(beanFile, beanContent);
+		SessionBean result = TestUtils.getSessionBean(getEJBJar(), "testDeclareRoles");
+		SecurityRole role1 = TestUtils
+				.findSecurityRole(getEJBJar().getAssemblyDescriptor().getSecurityRoles(), "role1");
+		SecurityRole role2 = TestUtils
+				.findSecurityRole(getEJBJar().getAssemblyDescriptor().getSecurityRoles(), "role2");
+		assertNotNull(role1);
+		assertNotNull(role2);
+		SecurityRoleRef role1Ref = TestUtils.findSecurityRoleRef(result.getSecurityRoleRefs(), "role1");
+		assertNotNull(role1Ref);
+		SecurityRoleRef role2Ref = TestUtils.findSecurityRoleRef(result.getSecurityRoleRefs(), "role2");
+		assertNotNull(role2Ref);
+
+		deleteFileAndUpdate(beanFile);
+		assertNull(TestUtils.getSessionBean(getEJBJar(), "testDeclareRoles"));
+		assertNull(TestUtils.findSecurityRole(getEJBJar().getAssemblyDescriptor().getSecurityRoles(), "role1"));
+		assertNull(TestUtils.findSecurityRole(getEJBJar().getAssemblyDescriptor().getSecurityRoles(), "role2"));
+	}
+
+	// @Test
+	public void testDeclareRoleOnManyBeans() throws Exception {
+		final String bean1Content = "package com.sap;" + "@DeclareRoles(value = {\"role1\"}) "
+				+ "@Stateless public class testDeclareRoleOnManyBeans1 implements SessionBeanLocal {}";
+		final String bean2Content = "package com.sap;" + "@DeclareRoles(value = {\"role1\"}) "
+				+ "@Stateless public class testDeclareRoleOnManyBeans2 implements SessionBeanLocal {}";
+
+		IFile bean1File = facetedProject.getProject().getFile("ejbModule/com/sap/testDeclareRoleOnManyBeans1.java");
+		IFile bean2File = facetedProject.getProject().getFile("ejbModule/com/sap/testDeclareRoleOnManyBeans2.java");
+		saveFileAndUpdate(bean1File, bean1Content);
+		saveFileAndUpdate(bean2File, bean2Content);
+		SessionBean result = TestUtils.getSessionBean(getEJBJar(), "testDeclareRoleOnManyBeans1");
+		SecurityRole role1 = TestUtils
+				.findSecurityRole(getEJBJar().getAssemblyDescriptor().getSecurityRoles(), "role1");
+		assertNotNull(role1);
+		SecurityRoleRef role1Ref = TestUtils.findSecurityRoleRef(result.getSecurityRoleRefs(), "role1");
+		assertNotNull(role1Ref);
+
+		deleteFileAndUpdate(bean1File);
+		assertNotNull(TestUtils.findSecurityRole(getEJBJar().getAssemblyDescriptor().getSecurityRoles(), "role1"));
+		deleteFileAndUpdate(bean2File);
+		assertNull(TestUtils.findSecurityRole(getEJBJar().getAssemblyDescriptor().getSecurityRoles(), "role1"));
+	}
+
+	// @Test
+	public void testRunAs() throws Exception {
+		final String beanContent = "package com.sap;" + "@DeclareRoles(value = {\"role1\"}) @RunAs(value = \"role1\") "
+				+ "@Stateless public class testRunAs implements SessionBeanLocal {}";
+
+		IFile beanFile = facetedProject.getProject().getFile("ejbModule/com/sap/testRunAs.java");
+		saveFileAndUpdate(beanFile, beanContent);
+		SessionBean result = TestUtils.getSessionBean(getEJBJar(), "testRunAs");
+		SecurityRole role1 = TestUtils
+				.findSecurityRole(getEJBJar().getAssemblyDescriptor().getSecurityRoles(), "role1");
+		assertNotNull(role1);
+		SecurityRoleRef role1Ref = TestUtils.findSecurityRoleRef(result.getSecurityRoleRefs(), "role1");
+		assertNotNull(role1Ref);
+		SecurityIdentityType identity = (SecurityIdentityType) result.getSecurityIdentities();
+		assertNotNull(identity);
+		RunAs runAs = identity.getRunAs();
+		assertNotNull(runAs);
+		assertEquals("role1", runAs.getRoleName());
+
+		deleteFileAndUpdate(beanFile);
+		assertNull(TestUtils.findSecurityRole(getEJBJar().getAssemblyDescriptor().getSecurityRoles(), "role1"));
+	}
+
+	// @Test
+	public void testRunAsMessageBean() throws Exception {
+		final String beanContent = "package com.sap;" + "@RunAs(value = \"role1\") "
+				+ "@MessageDriven public class testRunAsMessageBean implements SessionBeanLocal {}";
+
+		IFile beanFile = facetedProject.getProject().getFile("ejbModule/com/sap/testRunAsMessageBean.java");
+		saveFileAndUpdate(beanFile, beanContent);
+		MessageDrivenBean result = TestUtils.getMessageDrivenBean(getEJBJar(), "testRunAsMessageBean");
+		SecurityIdentityType identity = (SecurityIdentityType) result.getSecurityIdentity();
+		assertNotNull(identity);
+		RunAs runAs = identity.getRunAs();
+		assertNotNull(runAs);
+		assertEquals("role1", runAs.getRoleName());
+
+		deleteFileAndUpdate(beanFile);
+		assertNull(TestUtils.getMessageDrivenBean(getEJBJar(), "testRunAsMessageBean"));
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/mergers/tests/AssemblyDescriptorMergerTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/mergers/tests/AssemblyDescriptorMergerTest.java
new file mode 100644
index 0000000..5e1f123
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/mergers/tests/AssemblyDescriptorMergerTest.java
@@ -0,0 +1,232 @@
+/***********************************************************************
+ * Copyright (c) 2008 by SAP AG, Walldorf. 
+ * 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:
+ *     SAP AG - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jst.jee.model.mergers.tests;
+
+import java.util.List;
+
+import junit.framework.Assert;
+import junit.framework.TestCase;
+
+import org.eclipse.jst.javaee.core.JavaeeFactory;
+import org.eclipse.jst.javaee.core.SecurityRole;
+import org.eclipse.jst.javaee.ejb.AssemblyDescriptor;
+import org.eclipse.jst.javaee.ejb.EjbFactory;
+import org.eclipse.jst.jee.model.internal.mergers.AssemblyDescriptorMerger;
+import org.eclipse.jst.jee.model.internal.mergers.ModelException;
+
+
+/**
+ * Tests Assembly descriptor merger.
+ * 
+ * @author Dimitar Giormov
+ *
+ */
+public class AssemblyDescriptorMergerTest extends TestCase{
+
+  /**
+   * Tests the merger with empty list of security roles.
+   * 
+   * @throws ModelException
+   */
+//  @Test
+  public void testEmptySecurityRoleCase() throws ModelException{
+    AssemblyDescriptor descriptorBase = EjbFactory.eINSTANCE.createAssemblyDescriptor();
+    AssemblyDescriptor descriptorToMerge = EjbFactory.eINSTANCE.createAssemblyDescriptor();
+    AssemblyDescriptorMerger result = new AssemblyDescriptorMerger(descriptorBase, descriptorToMerge, 0);
+    result.process();
+    Assert.assertNotNull(descriptorBase.getSecurityRoles());
+    Assert.assertTrue(descriptorBase.getSecurityRoles().size() == 0);
+    Assert.assertTrue(descriptorToMerge.getSecurityRoles().size() == 0);
+  }
+  
+  /**
+   * Tests the merger with Base security role only.
+   * No merge is necessary
+   * 
+   * @throws ModelException
+   */
+  //@Test
+  public void testSingleSecurityRoleCaseBase() throws ModelException{
+    AssemblyDescriptor descriptorBase = EjbFactory.eINSTANCE.createAssemblyDescriptor();
+    SecurityRole role = JavaeeFactory.eINSTANCE.createSecurityRole();
+    role.setRoleName("test1");
+    
+    descriptorBase.getSecurityRoles().add(role);
+    AssemblyDescriptor descriptorToMerge = EjbFactory.eINSTANCE.createAssemblyDescriptor();
+    AssemblyDescriptorMerger result = new AssemblyDescriptorMerger(descriptorBase, descriptorToMerge, 0);
+    result.process();
+    Assert.assertNotNull(descriptorBase.getSecurityRoles());
+    Assert.assertTrue(descriptorBase.getSecurityRoles().size() == 1);
+    Assert.assertTrue(descriptorToMerge.getSecurityRoles().size() == 0);
+    Assert.assertTrue(((SecurityRole)descriptorBase.getSecurityRoles().get(0)).getRoleName().equals("test1"));
+  }
+  
+  /**
+   * Tests the merger with toMerge security role only.
+   * The role should be copied in base.
+   * 
+   * @throws ModelException
+   */
+  //@Test
+  public void testSingleSecurityRoleCaseToMerge() throws ModelException{
+    AssemblyDescriptor descriptorBase = EjbFactory.eINSTANCE.createAssemblyDescriptor();
+    AssemblyDescriptor descriptorToMerge = EjbFactory.eINSTANCE.createAssemblyDescriptor();
+    SecurityRole role = JavaeeFactory.eINSTANCE.createSecurityRole();
+    role.setRoleName("test1");
+    
+    descriptorToMerge.getSecurityRoles().add(role);
+    
+    AssemblyDescriptorMerger result = new AssemblyDescriptorMerger(descriptorBase, descriptorToMerge, 0);
+    result.process();
+    Assert.assertNotNull(descriptorBase.getSecurityRoles());
+    Assert.assertTrue(descriptorBase.getSecurityRoles().size() == 1);
+    Assert.assertTrue(descriptorToMerge.getSecurityRoles().size() == 1);
+    Assert.assertTrue(((SecurityRole)descriptorBase.getSecurityRoles().get(0)).getRoleName().equals("test1"));
+  }
+  
+  /**
+   * Tests the merger with one and the same security role.
+   * The result should be non merged 1 security role.
+   * 
+   * @throws ModelException
+   */
+  //@Test
+  public void testSingleSecurityRoleCaseSameRole() throws ModelException{
+    AssemblyDescriptor descriptorBase = EjbFactory.eINSTANCE.createAssemblyDescriptor();
+    AssemblyDescriptor descriptorToMerge = EjbFactory.eINSTANCE.createAssemblyDescriptor();
+    SecurityRole role = JavaeeFactory.eINSTANCE.createSecurityRole();
+    role.setRoleName("test1");
+    descriptorBase.getSecurityRoles().add(role);
+    descriptorToMerge.getSecurityRoles().add(role);
+    
+    AssemblyDescriptorMerger result = new AssemblyDescriptorMerger(descriptorBase, descriptorToMerge, 0);
+    result.process();
+    Assert.assertNotNull(descriptorBase.getSecurityRoles());
+    Assert.assertTrue(descriptorBase.getSecurityRoles().size() == 1);
+    Assert.assertTrue(descriptorToMerge.getSecurityRoles().size() == 1);
+    Assert.assertTrue(((SecurityRole)descriptorBase.getSecurityRoles().get(0)).getRoleName().equals("test1"));
+  }
+  
+  /**
+   * Tests the merger with variety of security roles.
+   * 
+   * @throws ModelException
+   */
+  //@Test
+  public void testSingleSecurityRoleCaseComplex() throws ModelException{
+    AssemblyDescriptor descriptorBase = EjbFactory.eINSTANCE.createAssemblyDescriptor();
+    AssemblyDescriptor descriptorToMerge = EjbFactory.eINSTANCE.createAssemblyDescriptor();
+    SecurityRole role0 = JavaeeFactory.eINSTANCE.createSecurityRole();
+    SecurityRole role1 = JavaeeFactory.eINSTANCE.createSecurityRole();
+    SecurityRole role2 = JavaeeFactory.eINSTANCE.createSecurityRole();
+    SecurityRole role3 = JavaeeFactory.eINSTANCE.createSecurityRole();
+    SecurityRole role4 = JavaeeFactory.eINSTANCE.createSecurityRole();
+    SecurityRole role5 = JavaeeFactory.eINSTANCE.createSecurityRole();
+    role0.setRoleName("test1");
+    role1.setRoleName("test2");
+    role2.setRoleName("test3");
+    role3.setRoleName("test4");
+    role4.setRoleName("test5");
+    role5.setRoleName("test6");
+    
+    
+    
+    descriptorBase.getSecurityRoles().add(role1);
+    descriptorBase.getSecurityRoles().add(role3);
+    descriptorBase.getSecurityRoles().add(role4);
+    descriptorBase.getSecurityRoles().add(role5);
+    
+    
+    descriptorToMerge.getSecurityRoles().add(role0);
+    descriptorToMerge.getSecurityRoles().add(role1);
+    descriptorToMerge.getSecurityRoles().add(role2);
+   
+    
+    
+    
+    AssemblyDescriptorMerger result = new AssemblyDescriptorMerger(descriptorBase, descriptorToMerge, 0);
+    result.process();
+    Assert.assertNotNull(descriptorBase.getSecurityRoles());
+    Assert.assertTrue(descriptorBase.getSecurityRoles().size() == 6);
+    Assert.assertTrue(descriptorToMerge.getSecurityRoles().size() == 3);
+    Assert.assertTrue(containsSecRole(descriptorBase.getSecurityRoles(), role0.getRoleName()));
+    Assert.assertTrue(containsSecRole(descriptorBase.getSecurityRoles(), role1.getRoleName()));
+    Assert.assertTrue(containsSecRole(descriptorBase.getSecurityRoles(), role2.getRoleName()));
+    Assert.assertTrue(containsSecRole(descriptorBase.getSecurityRoles(), role3.getRoleName()));
+    Assert.assertTrue(containsSecRole(descriptorBase.getSecurityRoles(), role4.getRoleName()));
+    Assert.assertTrue(containsSecRole(descriptorBase.getSecurityRoles(), role5.getRoleName()));
+  }
+
+  private boolean containsSecRole(List list, String roleName) {
+    
+    
+    for (Object object : list) {
+      SecurityRole role = (SecurityRole) object;
+      if(roleName == null){
+        if(roleName == role.getRoleName()){
+          return true;
+        }
+      } else if(roleName.equals(role.getRoleName())){
+        return true;
+      }
+    }
+    return false;
+  }
+  
+  /**
+   * Tests the merger with variety of security roles. In addition one of the roles has no name.
+   * 
+   * @throws ModelException
+   */
+  //@Test
+  public void testSingleSecurityRoleCaseComplexWithoutName() throws ModelException{
+    AssemblyDescriptor descriptorBase = EjbFactory.eINSTANCE.createAssemblyDescriptor();
+    AssemblyDescriptor descriptorToMerge = EjbFactory.eINSTANCE.createAssemblyDescriptor();
+    SecurityRole role0 = JavaeeFactory.eINSTANCE.createSecurityRole();
+    SecurityRole role1 = JavaeeFactory.eINSTANCE.createSecurityRole();
+    SecurityRole role2 = JavaeeFactory.eINSTANCE.createSecurityRole();
+    SecurityRole role3 = JavaeeFactory.eINSTANCE.createSecurityRole();
+    SecurityRole role4 = JavaeeFactory.eINSTANCE.createSecurityRole();
+    SecurityRole role5 = JavaeeFactory.eINSTANCE.createSecurityRole();
+    role0.setRoleName("test1");
+    role2.setRoleName("test3");
+    role3.setRoleName("test4");
+    role4.setRoleName("test5");
+    role5.setRoleName("test6");
+    
+    
+    
+    descriptorBase.getSecurityRoles().add(role1);
+    descriptorBase.getSecurityRoles().add(role3);
+    descriptorBase.getSecurityRoles().add(role4);
+    descriptorBase.getSecurityRoles().add(role5);
+    
+    
+    descriptorToMerge.getSecurityRoles().add(role0);
+    descriptorToMerge.getSecurityRoles().add(role1);
+    descriptorToMerge.getSecurityRoles().add(role2);
+   
+    
+    
+    
+    AssemblyDescriptorMerger result = new AssemblyDescriptorMerger(descriptorBase, descriptorToMerge, 0);
+    result.process();
+    Assert.assertNotNull(descriptorBase.getSecurityRoles());
+    Assert.assertTrue(descriptorBase.getSecurityRoles().size() == 6);
+    Assert.assertTrue(descriptorToMerge.getSecurityRoles().size() == 3);
+    Assert.assertTrue(containsSecRole(descriptorBase.getSecurityRoles(), role0.getRoleName()));
+    Assert.assertTrue(containsSecRole(descriptorBase.getSecurityRoles(), null));
+    Assert.assertTrue(containsSecRole(descriptorBase.getSecurityRoles(), role2.getRoleName()));
+    Assert.assertTrue(containsSecRole(descriptorBase.getSecurityRoles(), role3.getRoleName()));
+    Assert.assertTrue(containsSecRole(descriptorBase.getSecurityRoles(), role4.getRoleName()));
+    Assert.assertTrue(containsSecRole(descriptorBase.getSecurityRoles(), role5.getRoleName()));
+  }
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/mergers/tests/EjbJarMergerTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/mergers/tests/EjbJarMergerTest.java
new file mode 100644
index 0000000..163292f
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/mergers/tests/EjbJarMergerTest.java
@@ -0,0 +1,630 @@
+/***********************************************************************
+ * Copyright (c) 2008 by SAP AG, Walldorf. 
+ * 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:
+ *     SAP AG - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jst.jee.model.mergers.tests;
+
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.eclipse.jst.javaee.ejb.EJBJar;
+import org.eclipse.jst.javaee.ejb.EJBRelation;
+import org.eclipse.jst.javaee.ejb.EJBRelationshipRole;
+import org.eclipse.jst.javaee.ejb.EjbFactory;
+import org.eclipse.jst.javaee.ejb.EntityBean;
+import org.eclipse.jst.javaee.ejb.InterceptorType;
+import org.eclipse.jst.javaee.ejb.InterceptorsType;
+import org.eclipse.jst.javaee.ejb.MessageDrivenBean;
+import org.eclipse.jst.javaee.ejb.RelationshipRoleSourceType;
+import org.eclipse.jst.javaee.ejb.Relationships;
+import org.eclipse.jst.javaee.ejb.SessionBean;
+import org.eclipse.jst.jee.model.internal.mergers.EjbJarMerger;
+import org.eclipse.jst.jee.model.internal.mergers.ModelException;
+
+/**
+ * Tester class for EjbJar artifact.
+ * 
+ * Base suffix means that the base object has some info and toMerge is empty:
+ * nothing should be merged
+ * 
+ * ToMerge suffix means that the base is empty object and toMerge has some info:
+ * all from merge should be present in base.
+ * 
+ * Same suffix means that the information in merge and base is one and the same:
+ * no merge should occurred and additional checks for doubling of the elements
+ * are present.
+ * 
+ * Complex suffix means variety of information is present in base and to merge:
+ * consistent information combined by base and toMerge should be available at
+ * the end.
+ * 
+ * ComplexOverlapped suffix means variety of information is present in base and
+ * to merge: consistent information combined by base and toMerge should be
+ * available at the end. There are artifacts with one and the same name and
+ * different values: values should be merged into base.
+ * 
+ * 
+ * @author Dimitar Giormov
+ * 
+ */
+public class EjbJarMergerTest extends TestCase {
+
+	/**
+	 * Empty Ejb Jars test without enterprise beans tag
+	 * 
+	 * @throws ModelException
+	 */
+	// @Test
+	public void testZeroMerge() throws ModelException {
+		EJBJar base = EjbFactory.eINSTANCE.createEJBJar();
+		EJBJar merge = EjbFactory.eINSTANCE.createEJBJar();
+		(new EjbJarMerger(base, merge, 0)).process();
+		assertNull(base.getEnterpriseBeans());
+		assertNull(merge.getEnterpriseBeans());
+	}
+
+	/**
+	 * Empty Ejb Jars test with enterprise beans tag on toMerge
+	 * 
+	 * @throws ModelException
+	 */
+	// @Test
+	public void testZeroMerge2() throws ModelException {
+		EJBJar base = EjbFactory.eINSTANCE.createEJBJar();
+		EJBJar merge = EjbFactory.eINSTANCE.createEJBJar();
+		merge.setEnterpriseBeans(EjbFactory.eINSTANCE.createEnterpriseBeans());
+		(new EjbJarMerger(base, merge, 0)).process();
+		assertNotNull(base.getEnterpriseBeans());
+		assertNotNull(merge.getEnterpriseBeans());
+	}
+
+	/**
+	 * Empty Ejb Jars test with enterprise beans tag on base
+	 * 
+	 * @throws ModelException
+	 */
+	// @Test
+	public void testZeroMerge3() throws ModelException {
+		EJBJar base = EjbFactory.eINSTANCE.createEJBJar();
+		EJBJar merge = EjbFactory.eINSTANCE.createEJBJar();
+		base.setEnterpriseBeans(EjbFactory.eINSTANCE.createEnterpriseBeans());
+		(new EjbJarMerger(base, merge, 0)).process();
+		assertNotNull(base.getEnterpriseBeans());
+		assertNull(merge.getEnterpriseBeans());
+	}
+
+	/**
+	 * Base suffix means that the base object has some info and toMerge is
+	 * empty: nothing should be merged
+	 * 
+	 * @throws ModelException
+	 */
+	// @Test
+	public void testSesionBeansBase() throws ModelException {
+		EJBJar base = EjbFactory.eINSTANCE.createEJBJar();
+		EJBJar merge = EjbFactory.eINSTANCE.createEJBJar();
+		base.setEnterpriseBeans(EjbFactory.eINSTANCE.createEnterpriseBeans());
+		SessionBean sessionBean = EjbFactory.eINSTANCE.createSessionBean();
+		sessionBean.setEjbName("name");
+		base.getEnterpriseBeans().getSessionBeans().add(sessionBean);
+		(new EjbJarMerger(base, merge, 0)).process();
+		assertNotNull(base.getEnterpriseBeans());
+		assertNull(merge.getEnterpriseBeans());
+		assertEquals(1, base.getEnterpriseBeans().getSessionBeans().size());
+
+	}
+
+	/**
+	 * ToMerge suffix means that the base is empty object and toMerge has some
+	 * info: all from merge should be present in base.
+	 * 
+	 * @throws ModelException
+	 */
+	// @Test
+	public void testSesionBeansMerge() throws ModelException {
+		EJBJar base = EjbFactory.eINSTANCE.createEJBJar();
+		EJBJar merge = EjbFactory.eINSTANCE.createEJBJar();
+		base.setEnterpriseBeans(EjbFactory.eINSTANCE.createEnterpriseBeans());
+		merge.setEnterpriseBeans(EjbFactory.eINSTANCE.createEnterpriseBeans());
+		SessionBean sessionBean = EjbFactory.eINSTANCE.createSessionBean();
+		sessionBean.setEjbName("name");
+		merge.getEnterpriseBeans().getSessionBeans().add(sessionBean);
+		(new EjbJarMerger(base, merge, 0)).process();
+		assertNotNull(base.getEnterpriseBeans());
+		assertNotNull(merge.getEnterpriseBeans());
+		assertEquals(1, base.getEnterpriseBeans().getSessionBeans().size());
+		assertEquals(1, merge.getEnterpriseBeans().getSessionBeans().size());
+
+	}
+
+	/**
+	 * Same suffix means that the information in merge and base is one and the
+	 * same: no merge should occurred and additional checks for doubling of the
+	 * elements are present.
+	 * 
+	 * @throws ModelException
+	 */
+	// @Test
+	public void testSesionBeansMergeSameBean() throws ModelException {
+		EJBJar base = EjbFactory.eINSTANCE.createEJBJar();
+		EJBJar merge = EjbFactory.eINSTANCE.createEJBJar();
+		base.setEnterpriseBeans(EjbFactory.eINSTANCE.createEnterpriseBeans());
+		merge.setEnterpriseBeans(EjbFactory.eINSTANCE.createEnterpriseBeans());
+		SessionBean sessionBean = EjbFactory.eINSTANCE.createSessionBean();
+		sessionBean.setEjbName("name");
+		base.getEnterpriseBeans().getSessionBeans().add(sessionBean);
+		merge.getEnterpriseBeans().getSessionBeans().add(sessionBean);
+		(new EjbJarMerger(base, merge, 0)).process();
+		assertNotNull(base.getEnterpriseBeans());
+		assertNotNull(merge.getEnterpriseBeans());
+		assertEquals(1, base.getEnterpriseBeans().getSessionBeans().size());
+		assertEquals(1, merge.getEnterpriseBeans().getSessionBeans().size());
+		assertNotNull(getSessionBean("name", base.getEnterpriseBeans().getSessionBeans()));
+
+	}
+
+	private SessionBean getSessionBean(String name, List enterpriseBeans) {
+		for (Object bean : enterpriseBeans) {
+			SessionBean sBean = (SessionBean) bean;
+			if (sBean.getEjbName().equals(name)) {
+				return sBean;
+			}
+
+		}
+		return null;
+	}
+
+	/**
+	 * Complex suffix means variety of information is present in base and to
+	 * merge: consistent information combined by base and toMerge should be
+	 * available at the end.
+	 * 
+	 * @throws Exception
+	 */
+	public void testSessionBeanComplex() throws Exception {
+		EJBJar base = EjbFactory.eINSTANCE.createEJBJar();
+		EJBJar merge = EjbFactory.eINSTANCE.createEJBJar();
+		base.setEnterpriseBeans(EjbFactory.eINSTANCE.createEnterpriseBeans());
+		merge.setEnterpriseBeans(EjbFactory.eINSTANCE.createEnterpriseBeans());
+		SessionBean sessionBean = EjbFactory.eINSTANCE.createSessionBean();
+		sessionBean.setEjbName("name");
+		SessionBean sessionBean1 = EjbFactory.eINSTANCE.createSessionBean();
+		sessionBean1.setEjbName("name1");
+		SessionBean sessionBean2 = EjbFactory.eINSTANCE.createSessionBean();
+		sessionBean2.setEjbName("name2");
+		SessionBean sessionBean3 = EjbFactory.eINSTANCE.createSessionBean();
+		sessionBean3.setEjbName("name3");
+		base.getEnterpriseBeans().getSessionBeans().add(sessionBean);
+		base.getEnterpriseBeans().getSessionBeans().add(sessionBean1);
+		base.getEnterpriseBeans().getSessionBeans().add(sessionBean3);
+
+		merge.getEnterpriseBeans().getSessionBeans().add(sessionBean);
+		merge.getEnterpriseBeans().getSessionBeans().add(sessionBean2);
+
+		(new EjbJarMerger(base, merge, 0)).process();
+		assertNotNull(base.getEnterpriseBeans());
+		assertNotNull(merge.getEnterpriseBeans());
+		assertEquals(4, base.getEnterpriseBeans().getSessionBeans().size());
+		assertEquals(2, merge.getEnterpriseBeans().getSessionBeans().size());
+		assertNotNull(getSessionBean("name", base.getEnterpriseBeans().getSessionBeans()));
+		assertNotNull(getSessionBean("name1", base.getEnterpriseBeans().getSessionBeans()));
+		assertNotNull(getSessionBean("name2", base.getEnterpriseBeans().getSessionBeans()));
+		assertNotNull(getSessionBean("name3", base.getEnterpriseBeans().getSessionBeans()));
+	}
+
+	// MDB
+
+	/**
+	 * Base suffix means that the base object has some info and toMerge is
+	 * empty: nothing should be merged
+	 * 
+	 * @throws ModelException
+	 */
+	// @Test
+	public void testMdbBeansBase() throws ModelException {
+		EJBJar base = EjbFactory.eINSTANCE.createEJBJar();
+		EJBJar merge = EjbFactory.eINSTANCE.createEJBJar();
+		base.setEnterpriseBeans(EjbFactory.eINSTANCE.createEnterpriseBeans());
+		MessageDrivenBean sessionBean = EjbFactory.eINSTANCE.createMessageDrivenBean();
+		sessionBean.setEjbName("name");
+		base.getEnterpriseBeans().getMessageDrivenBeans().add(sessionBean);
+		(new EjbJarMerger(base, merge, 0)).process();
+		assertNotNull(base.getEnterpriseBeans());
+		assertNull(merge.getEnterpriseBeans());
+		assertEquals(1, base.getEnterpriseBeans().getMessageDrivenBeans().size());
+
+	}
+
+	/**
+	 * @throws ModelException
+	 */
+	// @Test
+	public void tesMdbBeansMerge() throws ModelException {
+		EJBJar base = EjbFactory.eINSTANCE.createEJBJar();
+		EJBJar merge = EjbFactory.eINSTANCE.createEJBJar();
+		base.setEnterpriseBeans(EjbFactory.eINSTANCE.createEnterpriseBeans());
+		merge.setEnterpriseBeans(EjbFactory.eINSTANCE.createEnterpriseBeans());
+		MessageDrivenBean sessionBean = EjbFactory.eINSTANCE.createMessageDrivenBean();
+		sessionBean.setEjbName("name");
+		merge.getEnterpriseBeans().getMessageDrivenBeans().add(sessionBean);
+		(new EjbJarMerger(base, merge, 0)).process();
+		assertNotNull(base.getEnterpriseBeans());
+		assertNotNull(merge.getEnterpriseBeans());
+		assertEquals(1, base.getEnterpriseBeans().getMessageDrivenBeans().size());
+		assertEquals(1, merge.getEnterpriseBeans().getMessageDrivenBeans().size());
+
+	}
+
+	/**
+	 * Same suffix means that the information in merge and base is one and the
+	 * same: no merge should occurred and additional checks for doubling of the
+	 * elements are present.
+	 * 
+	 * @throws ModelException
+	 */
+	// @Test
+	public void testMdbBeansMergeSameBean() throws ModelException {
+		EJBJar base = EjbFactory.eINSTANCE.createEJBJar();
+		EJBJar merge = EjbFactory.eINSTANCE.createEJBJar();
+		base.setEnterpriseBeans(EjbFactory.eINSTANCE.createEnterpriseBeans());
+		merge.setEnterpriseBeans(EjbFactory.eINSTANCE.createEnterpriseBeans());
+		MessageDrivenBean sessionBean = EjbFactory.eINSTANCE.createMessageDrivenBean();
+		sessionBean.setEjbName("name");
+		base.getEnterpriseBeans().getMessageDrivenBeans().add(sessionBean);
+		merge.getEnterpriseBeans().getMessageDrivenBeans().add(sessionBean);
+		(new EjbJarMerger(base, merge, 0)).process();
+		assertNotNull(base.getEnterpriseBeans());
+		assertNotNull(merge.getEnterpriseBeans());
+		assertEquals(1, base.getEnterpriseBeans().getMessageDrivenBeans().size());
+		assertEquals(1, merge.getEnterpriseBeans().getMessageDrivenBeans().size());
+		assertNotNull(getMdbBean("name", base.getEnterpriseBeans().getMessageDrivenBeans()));
+
+	}
+
+	private MessageDrivenBean getMdbBean(String name, List enterpriseBeans) {
+		for (Object bean : enterpriseBeans) {
+			MessageDrivenBean sBean = (MessageDrivenBean) bean;
+			if (sBean.getEjbName().equals(name)) {
+				return sBean;
+			}
+
+		}
+		return null;
+	}
+
+	/**
+	 * Complex suffix means variety of information is present in base and to
+	 * merge: consistent information combined by base and toMerge should be
+	 * available at the end.
+	 * 
+	 * @throws Exception
+	 */
+	public void testMdbBeanComplex() throws Exception {
+		EJBJar base = EjbFactory.eINSTANCE.createEJBJar();
+		EJBJar merge = EjbFactory.eINSTANCE.createEJBJar();
+		base.setEnterpriseBeans(EjbFactory.eINSTANCE.createEnterpriseBeans());
+		merge.setEnterpriseBeans(EjbFactory.eINSTANCE.createEnterpriseBeans());
+		MessageDrivenBean messageBean = EjbFactory.eINSTANCE.createMessageDrivenBean();
+		messageBean.setEjbName("name");
+		MessageDrivenBean messageBean1 = EjbFactory.eINSTANCE.createMessageDrivenBean();
+		messageBean1.setEjbName("name1");
+		MessageDrivenBean messageBean2 = EjbFactory.eINSTANCE.createMessageDrivenBean();
+		messageBean2.setEjbName("name2");
+		MessageDrivenBean messageBean3 = EjbFactory.eINSTANCE.createMessageDrivenBean();
+		messageBean3.setEjbName("name3");
+		base.getEnterpriseBeans().getMessageDrivenBeans().add(messageBean);
+		base.getEnterpriseBeans().getMessageDrivenBeans().add(messageBean1);
+		base.getEnterpriseBeans().getMessageDrivenBeans().add(messageBean3);
+
+		merge.getEnterpriseBeans().getMessageDrivenBeans().add(messageBean);
+		merge.getEnterpriseBeans().getMessageDrivenBeans().add(messageBean2);
+
+		(new EjbJarMerger(base, merge, 0)).process();
+		assertNotNull(base.getEnterpriseBeans());
+		assertNotNull(merge.getEnterpriseBeans());
+		assertEquals(4, base.getEnterpriseBeans().getMessageDrivenBeans().size());
+		assertEquals(2, merge.getEnterpriseBeans().getMessageDrivenBeans().size());
+		assertNotNull(getMdbBean("name", base.getEnterpriseBeans().getMessageDrivenBeans()));
+		assertNotNull(getMdbBean("name1", base.getEnterpriseBeans().getMessageDrivenBeans()));
+		assertNotNull(getMdbBean("name2", base.getEnterpriseBeans().getMessageDrivenBeans()));
+		assertNotNull(getMdbBean("name3", base.getEnterpriseBeans().getMessageDrivenBeans()));
+	}
+
+	// Entities
+
+	/**
+	 * Base suffix means that the base object has some info and toMerge is
+	 * empty: nothing should be merged
+	 * 
+	 * @throws ModelException
+	 */
+	// @Test
+	public void testEntityBeansBase() throws ModelException {
+		EJBJar base = EjbFactory.eINSTANCE.createEJBJar();
+		EJBJar merge = EjbFactory.eINSTANCE.createEJBJar();
+		base.setEnterpriseBeans(EjbFactory.eINSTANCE.createEnterpriseBeans());
+		EntityBean sessionBean = EjbFactory.eINSTANCE.createEntityBean();
+		sessionBean.setEjbName("name");
+		base.getEnterpriseBeans().getEntityBeans().add(sessionBean);
+		(new EjbJarMerger(base, merge, 0)).process();
+		assertNotNull(base.getEnterpriseBeans());
+		assertNull(merge.getEnterpriseBeans());
+		assertEquals(1, base.getEnterpriseBeans().getEntityBeans().size());
+
+	}
+
+	/**
+	 * * ToMerge suffix means that the base is empty object and toMerge has some
+	 * info: all from merge should be present in base.
+	 * 
+	 * @throws ModelException
+	 */
+	// @Test
+	public void testEntityBeansMerge() throws ModelException {
+		EJBJar base = EjbFactory.eINSTANCE.createEJBJar();
+		EJBJar merge = EjbFactory.eINSTANCE.createEJBJar();
+		base.setEnterpriseBeans(EjbFactory.eINSTANCE.createEnterpriseBeans());
+		merge.setEnterpriseBeans(EjbFactory.eINSTANCE.createEnterpriseBeans());
+		EntityBean sessionBean = EjbFactory.eINSTANCE.createEntityBean();
+		sessionBean.setEjbName("name");
+		merge.getEnterpriseBeans().getEntityBeans().add(sessionBean);
+		(new EjbJarMerger(base, merge, 0)).process();
+		assertNotNull(base.getEnterpriseBeans());
+		assertNotNull(merge.getEnterpriseBeans());
+		assertEquals(1, base.getEnterpriseBeans().getEntityBeans().size());
+		assertEquals(1, merge.getEnterpriseBeans().getEntityBeans().size());
+
+	}
+
+	/**
+	 * Same suffix means that the information in merge and base is one and the
+	 * same: no merge should occurred and additional checks for doubling of the
+	 * elements are present.
+	 * 
+	 * @throws ModelException
+	 */
+	// @Test
+	public void testEntityBeansMergeSameBean() throws ModelException {
+		EJBJar base = EjbFactory.eINSTANCE.createEJBJar();
+		EJBJar merge = EjbFactory.eINSTANCE.createEJBJar();
+		base.setEnterpriseBeans(EjbFactory.eINSTANCE.createEnterpriseBeans());
+		merge.setEnterpriseBeans(EjbFactory.eINSTANCE.createEnterpriseBeans());
+		EntityBean sessionBean = EjbFactory.eINSTANCE.createEntityBean();
+		sessionBean.setEjbName("name");
+		base.getEnterpriseBeans().getEntityBeans().add(sessionBean);
+		merge.getEnterpriseBeans().getEntityBeans().add(sessionBean);
+		(new EjbJarMerger(base, merge, 0)).process();
+		assertNotNull(base.getEnterpriseBeans());
+		assertNotNull(merge.getEnterpriseBeans());
+		assertEquals(1, base.getEnterpriseBeans().getEntityBeans().size());
+		assertEquals(1, merge.getEnterpriseBeans().getEntityBeans().size());
+		assertNotNull(getEntityBean("name", base.getEnterpriseBeans().getEntityBeans()));
+
+	}
+
+	private EntityBean getEntityBean(String name, List enterpriseBeans) {
+		for (Object bean : enterpriseBeans) {
+			EntityBean sBean = (EntityBean) bean;
+			if (sBean.getEjbName().equals(name)) {
+				return sBean;
+			}
+
+		}
+		return null;
+	}
+
+	/**
+	 * 
+	 * Complex suffix means variety of information is present in base and to
+	 * merge: consistent information combined by base and toMerge should be
+	 * available at the end.
+	 * 
+	 * @throws Exception
+	 */
+	public void testEntityBeanComplex() throws Exception {
+		EJBJar base = EjbFactory.eINSTANCE.createEJBJar();
+		EJBJar merge = EjbFactory.eINSTANCE.createEJBJar();
+		base.setEnterpriseBeans(EjbFactory.eINSTANCE.createEnterpriseBeans());
+		merge.setEnterpriseBeans(EjbFactory.eINSTANCE.createEnterpriseBeans());
+		EntityBean entityBean = EjbFactory.eINSTANCE.createEntityBean();
+		entityBean.setEjbName("name");
+		EntityBean entityBean1 = EjbFactory.eINSTANCE.createEntityBean();
+		entityBean1.setEjbName("name1");
+		EntityBean entityBean2 = EjbFactory.eINSTANCE.createEntityBean();
+		entityBean2.setEjbName("name2");
+		EntityBean entityBean3 = EjbFactory.eINSTANCE.createEntityBean();
+		entityBean3.setEjbName("name3");
+		base.getEnterpriseBeans().getEntityBeans().add(entityBean);
+		base.getEnterpriseBeans().getEntityBeans().add(entityBean1);
+		base.getEnterpriseBeans().getEntityBeans().add(entityBean3);
+
+		merge.getEnterpriseBeans().getEntityBeans().add(entityBean);
+		merge.getEnterpriseBeans().getEntityBeans().add(entityBean2);
+
+		(new EjbJarMerger(base, merge, 0)).process();
+		assertNotNull(base.getEnterpriseBeans());
+		assertNotNull(merge.getEnterpriseBeans());
+		assertEquals(4, base.getEnterpriseBeans().getEntityBeans().size());
+		assertEquals(2, merge.getEnterpriseBeans().getEntityBeans().size());
+		assertNotNull(getEntityBean("name", base.getEnterpriseBeans().getEntityBeans()));
+		assertNotNull(getEntityBean("name1", base.getEnterpriseBeans().getEntityBeans()));
+		assertNotNull(getEntityBean("name2", base.getEnterpriseBeans().getEntityBeans()));
+		assertNotNull(getEntityBean("name3", base.getEnterpriseBeans().getEntityBeans()));
+	}
+
+	// @Test
+	public void testGenericCopyBase() throws Exception {
+		EJBJar base = EjbFactory.eINSTANCE.createEJBJar();
+		EJBJar merge = EjbFactory.eINSTANCE.createEJBJar();
+		// Interceptors
+		InterceptorsType interceptorsType = EjbFactory.eINSTANCE.createInterceptorsType();
+		InterceptorType type = EjbFactory.eINSTANCE.createInterceptorType();
+		interceptorsType.getInterceptors().add(type);
+		type.setInterceptorClass("test");
+		base.setInterceptors(interceptorsType);
+
+		// Relationships
+		Relationships relationships = EjbFactory.eINSTANCE.createRelationships();
+		EJBRelation relation = EjbFactory.eINSTANCE.createEJBRelation();
+		EJBRelationshipRole relationshipRole = EjbFactory.eINSTANCE.createEJBRelationshipRole();
+		RelationshipRoleSourceType roleSourceType = EjbFactory.eINSTANCE.createRelationshipRoleSourceType();
+		roleSourceType.setEjbName("testEjbName");
+		String roleName = "RelationshpiRoleName";
+		relationshipRole.setEjbRelationshipRoleName("nm");
+		relationshipRole.setRelationshipRoleSource(roleSourceType);
+		relation.getEjbRelationshipRoles().add(relationshipRole);
+		relation.setEjbRelationName(roleName);
+		relationships.getEjbRelations().add(relation);
+		base.setRelationships(relationships);
+		// Client jar
+		String clientJar = "ejbClientJar";
+		base.setEjbClientJar(clientJar);
+
+		// version
+		String version = "99";
+		base.setVersion(version);
+
+		(new EjbJarMerger(base, merge, 0)).process();
+		// Interceptors
+		assertNotNull(base.getInterceptors());
+		assertNotNull(base.getInterceptors().getInterceptors());
+		assertEquals(1, base.getInterceptors().getInterceptors().size());
+		assertEquals("test", ((InterceptorType) base.getInterceptors().getInterceptors().get(0)).getInterceptorClass());
+
+		// Relationships
+		assertNotNull(base.getRelationships());
+		assertNotNull(base.getRelationships().getEjbRelations());
+		assertEquals(1, base.getRelationships().getEjbRelations().size());
+		assertEquals(roleName, ((EJBRelation) base.getRelationships().getEjbRelations().get(0)).getEjbRelationName());
+		// Client jar
+		assertEquals(clientJar, base.getEjbClientJar());
+
+	}
+
+	// @Test
+	public void testGenericCopyMerge() throws Exception {
+		EJBJar base = EjbFactory.eINSTANCE.createEJBJar();
+		EJBJar merge = EjbFactory.eINSTANCE.createEJBJar();
+
+		// Interceptors
+		InterceptorsType interceptorsType = EjbFactory.eINSTANCE.createInterceptorsType();
+		InterceptorType type = EjbFactory.eINSTANCE.createInterceptorType();
+		interceptorsType.getInterceptors().add(type);
+		type.setInterceptorClass("test");
+		merge.setInterceptors(interceptorsType);
+
+		// Relationships
+		Relationships relationships = EjbFactory.eINSTANCE.createRelationships();
+		EJBRelation relation = EjbFactory.eINSTANCE.createEJBRelation();
+		EJBRelationshipRole relationshipRole = EjbFactory.eINSTANCE.createEJBRelationshipRole();
+		RelationshipRoleSourceType roleSourceType = EjbFactory.eINSTANCE.createRelationshipRoleSourceType();
+		roleSourceType.setEjbName("testEjbName");
+		String roleName = "RelationshpiRoleName";
+		relationshipRole.setEjbRelationshipRoleName("nm");
+		relationshipRole.setRelationshipRoleSource(roleSourceType);
+		relation.getEjbRelationshipRoles().add(relationshipRole);
+		relation.setEjbRelationName(roleName);
+		relationships.getEjbRelations().add(relation);
+		merge.setRelationships(relationships);
+		// Client jar
+		String clientJar = "ejbClientJar";
+		merge.setEjbClientJar(clientJar);
+
+		(new EjbJarMerger(base, merge, 0)).process();
+
+		// Interceptors
+		assertNotNull(base.getInterceptors());
+		assertNotNull(base.getInterceptors().getInterceptors());
+		assertEquals(1, base.getInterceptors().getInterceptors().size());
+		assertEquals("test", ((InterceptorType) base.getInterceptors().getInterceptors().get(0)).getInterceptorClass());
+		// Relationships
+		assertNotNull(base.getRelationships());
+		assertNotNull(base.getRelationships().getEjbRelations());
+		assertEquals(1, base.getRelationships().getEjbRelations().size());
+		assertEquals(roleName, ((EJBRelation) base.getRelationships().getEjbRelations().get(0)).getEjbRelationName());
+		// Client jar
+		assertEquals(clientJar, base.getEjbClientJar());
+
+	}
+	
+	
+	/**
+	 * Tests weather the merger will ignore incorrect bean (ejbName is missing)
+	 * Session beans
+	 * 
+	 * @throws ModelException
+	 */
+	// @Test
+	public void testSesionBeansNullNameMerge() throws ModelException {
+		EJBJar base = EjbFactory.eINSTANCE.createEJBJar();
+		EJBJar merge = EjbFactory.eINSTANCE.createEJBJar();
+		base.setEnterpriseBeans(EjbFactory.eINSTANCE.createEnterpriseBeans());
+		merge.setEnterpriseBeans(EjbFactory.eINSTANCE.createEnterpriseBeans());
+		SessionBean sessionBean = EjbFactory.eINSTANCE.createSessionBean();
+		base.getEnterpriseBeans().getSessionBeans().add(sessionBean);
+		merge.getEnterpriseBeans().getSessionBeans().add(sessionBean);
+		(new EjbJarMerger(base, merge, 0)).process();
+		assertNotNull(base.getEnterpriseBeans());
+		assertNotNull(merge.getEnterpriseBeans());
+		assertEquals(0, base.getEnterpriseBeans().getSessionBeans().size());
+		assertEquals(1, merge.getEnterpriseBeans().getSessionBeans().size());
+
+	}
+	
+	
+
+	/**
+	 * Tests weather the merger will ignore incorrect bean (ejbName is missing)
+	 * For MdBeans
+	 * 
+	 * @throws ModelException
+	 */
+	// @Test
+	public void testMdBeansNullNameMergeSameBean() throws ModelException {
+		EJBJar base = EjbFactory.eINSTANCE.createEJBJar();
+		EJBJar merge = EjbFactory.eINSTANCE.createEJBJar();
+		base.setEnterpriseBeans(EjbFactory.eINSTANCE.createEnterpriseBeans());
+		merge.setEnterpriseBeans(EjbFactory.eINSTANCE.createEnterpriseBeans());
+		MessageDrivenBean mdb = EjbFactory.eINSTANCE.createMessageDrivenBean();
+		base.getEnterpriseBeans().getMessageDrivenBeans().add(mdb);
+		merge.getEnterpriseBeans().getMessageDrivenBeans().add(mdb);
+		(new EjbJarMerger(base, merge, 0)).process();
+		assertNotNull(base.getEnterpriseBeans());
+		assertNotNull(merge.getEnterpriseBeans());
+		assertEquals(0, base.getEnterpriseBeans().getMessageDrivenBeans().size());
+		assertEquals(1, merge.getEnterpriseBeans().getMessageDrivenBeans().size());
+
+	}
+	
+	
+
+	/**
+	 * Tests weather the merger will ignore incorrect bean (ejbName is missing)
+	 * EntityBeans
+	 * 
+	 * @throws ModelException
+	 */
+	// @Test
+	public void testEntityBeansNullNameMerge() throws ModelException {
+		EJBJar base = EjbFactory.eINSTANCE.createEJBJar();
+		EJBJar merge = EjbFactory.eINSTANCE.createEJBJar();
+		base.setEnterpriseBeans(EjbFactory.eINSTANCE.createEnterpriseBeans());
+		merge.setEnterpriseBeans(EjbFactory.eINSTANCE.createEnterpriseBeans());
+		EntityBean entity = EjbFactory.eINSTANCE.createEntityBean();
+		base.getEnterpriseBeans().getEntityBeans().add(entity);
+		merge.getEnterpriseBeans().getEntityBeans().add(entity);
+		(new EjbJarMerger(base, merge, 0)).process();
+		assertNotNull(base.getEnterpriseBeans());
+		assertNotNull(merge.getEnterpriseBeans());
+		assertEquals(0, base.getEnterpriseBeans().getEntityBeans().size());
+		assertEquals(1, merge.getEnterpriseBeans().getEntityBeans().size());
+
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/mergers/tests/JndiRefsTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/mergers/tests/JndiRefsTest.java
new file mode 100644
index 0000000..1571f84
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/mergers/tests/JndiRefsTest.java
@@ -0,0 +1,2068 @@
+/***********************************************************************
+ * Copyright (c) 2008 by SAP AG, Walldorf. 
+ * 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:
+ *     SAP AG - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jst.jee.model.mergers.tests;
+
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.eclipse.jst.javaee.core.EjbLocalRef;
+import org.eclipse.jst.javaee.core.EjbRef;
+import org.eclipse.jst.javaee.core.EjbRefType;
+import org.eclipse.jst.javaee.core.EnvEntry;
+import org.eclipse.jst.javaee.core.EnvEntryType;
+import org.eclipse.jst.javaee.core.JavaeeFactory;
+import org.eclipse.jst.javaee.core.MessageDestinationRef;
+import org.eclipse.jst.javaee.core.MessageDestinationUsageType;
+import org.eclipse.jst.javaee.core.PersistenceContextRef;
+import org.eclipse.jst.javaee.core.PersistenceContextType;
+import org.eclipse.jst.javaee.core.PersistenceUnitRef;
+import org.eclipse.jst.javaee.core.ResAuthType;
+import org.eclipse.jst.javaee.core.ResSharingScopeType;
+import org.eclipse.jst.javaee.core.ResourceEnvRef;
+import org.eclipse.jst.javaee.core.ResourceRef;
+import org.eclipse.jst.javaee.core.ServiceRef;
+import org.eclipse.jst.javaee.ejb.EjbFactory;
+import org.eclipse.jst.javaee.ejb.SessionBean;
+import org.eclipse.jst.jee.model.internal.mergers.JNDIRefsMerger;
+
+/**
+ * Tester class for JNDI references artifacts.
+ * 
+ * Base suffix means that the base object has some info and 
+ * toMerge is empty: nothing should be merged
+ * 
+ * ToMerge suffix means that the base is empty object and 
+ * toMerge has some info: all from merge should be present in base.
+ * 
+ * Same suffix means that the information in merge and base is one 
+ * and the same: no merge should occurred and additional checks for 
+ * doubling of the elements are present.
+ * 
+ * Complex suffix means variety of information is present in base 
+ * and to merge: consistent information combined by base and toMerge
+ * should be available at the end.
+ * 
+ * ComplexOverlapped suffix means variety of information is present 
+ * in base and to merge: consistent information combined by base and toMerge
+ * should be available at the end. There are artifacts with one and the same 
+ * name and different values: values should be merged into base.
+ *  
+ * 
+ * @author Dimitar Giormov
+ *
+ */
+public class JndiRefsTest extends TestCase{
+
+  /**
+   * Base suffix means that the base object has some info and 
+   * toMerge is empty: nothing should be merged
+   * @throws Exception
+   */
+  //@Test
+  public void testResourceEnvRefsBase() throws Exception {
+    SessionBean beanBase = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean beanToMerge = EjbFactory.eINSTANCE.createSessionBean();
+
+    beanBase.setEjbName("name");
+    beanToMerge.setEjbName("name");
+
+    ResourceEnvRef envRefBase = JavaeeFactory.eINSTANCE.createResourceEnvRef();
+    envRefBase.setMappedName("mapped1");
+    envRefBase.setResourceEnvRefName("refName1");
+    envRefBase.setResourceEnvRefType("type1");
+
+    ResourceEnvRef envRefToMerge = JavaeeFactory.eINSTANCE.createResourceEnvRef();
+    envRefToMerge.setMappedName("mapped2");
+    envRefToMerge.setResourceEnvRefName("refName2");
+    envRefToMerge.setResourceEnvRefType("type2");
+
+    beanBase.getResourceEnvRefs().add(envRefBase);
+
+    (new JNDIRefsMerger(beanBase, beanToMerge, 0)).process();
+
+    assertEquals(1, beanBase.getResourceEnvRefs().size());
+    assertEquals("mapped1", ((ResourceEnvRef)beanBase.getResourceEnvRefs().get(0)).getMappedName());
+    assertEquals("refName1", ((ResourceEnvRef)beanBase.getResourceEnvRefs().get(0)).getResourceEnvRefName());
+    assertEquals("type1", ((ResourceEnvRef)beanBase.getResourceEnvRefs().get(0)).getResourceEnvRefType());
+
+  }
+
+  /**
+   * ToMerge suffix means that the base is empty object and 
+   * toMerge has some info: all from merge should be present in base.
+   * @throws Exception
+   */
+  //@Test
+  public void testResourceEnvRefsMerge() throws Exception {
+    SessionBean beanBase = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean beanToMerge = EjbFactory.eINSTANCE.createSessionBean();
+
+    beanBase.setEjbName("name");
+    beanToMerge.setEjbName("name");
+
+    ResourceEnvRef envRefBase = JavaeeFactory.eINSTANCE.createResourceEnvRef();
+    envRefBase.setMappedName("mapped1");
+    envRefBase.setResourceEnvRefName("refName1");
+    envRefBase.setResourceEnvRefType("type1");
+
+    ResourceEnvRef envRefToMerge = JavaeeFactory.eINSTANCE.createResourceEnvRef();
+    envRefToMerge.setMappedName("mapped2");
+    envRefToMerge.setResourceEnvRefName("refName2");
+    envRefToMerge.setResourceEnvRefType("type2");
+
+    beanToMerge.getResourceEnvRefs().add(envRefBase);
+
+    (new JNDIRefsMerger(beanBase, beanToMerge, 0)).process();
+
+    assertEquals(1, beanBase.getResourceEnvRefs().size());
+    assertEquals("mapped1", ((ResourceEnvRef)beanBase.getResourceEnvRefs().get(0)).getMappedName());
+    assertEquals("refName1", ((ResourceEnvRef)beanBase.getResourceEnvRefs().get(0)).getResourceEnvRefName());
+    assertEquals("type1", ((ResourceEnvRef)beanBase.getResourceEnvRefs().get(0)).getResourceEnvRefType());
+
+  }
+
+  /**
+   *  Same suffix means that the information in merge and base is one 
+   * and the same: no merge should occurred and additional checks for 
+   * doubling of the elements are present.
+   * @throws Exception
+   */
+  //@Test
+  public void testResourceEnvRefsSame() throws Exception {
+    SessionBean beanBase = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean beanToMerge = EjbFactory.eINSTANCE.createSessionBean();
+
+    beanBase.setEjbName("name");
+    beanToMerge.setEjbName("name");
+
+    ResourceEnvRef envRefBase = JavaeeFactory.eINSTANCE.createResourceEnvRef();
+    envRefBase.setMappedName("mapped1");
+    envRefBase.setResourceEnvRefName("refName1");
+    envRefBase.setResourceEnvRefType("type1");
+
+    ResourceEnvRef envRefToMerge = JavaeeFactory.eINSTANCE.createResourceEnvRef();
+    envRefToMerge.setMappedName("mapped2");
+    envRefToMerge.setResourceEnvRefName("refName2");
+    envRefToMerge.setResourceEnvRefType("type2");
+
+    beanBase.getResourceEnvRefs().add(envRefBase);
+    beanToMerge.getResourceEnvRefs().add(envRefBase);
+
+    (new JNDIRefsMerger(beanBase, beanToMerge, 0)).process();
+
+    assertEquals(1, beanBase.getResourceEnvRefs().size());
+    assertEquals("mapped1", ((ResourceEnvRef)beanBase.getResourceEnvRefs().get(0)).getMappedName());
+    assertEquals("refName1", ((ResourceEnvRef)beanBase.getResourceEnvRefs().get(0)).getResourceEnvRefName());
+    assertEquals("type1", ((ResourceEnvRef)beanBase.getResourceEnvRefs().get(0)).getResourceEnvRefType());
+
+  }
+
+  /**
+   *  Complex suffix means variety of information is present in base 
+   * and to merge: consistent information combined by base and toMerge
+   * should be available at the end.
+   * @throws Exception
+   */
+  //@Test
+  public void testResourceEnvRefsComplex() throws Exception {
+    SessionBean beanBase = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean beanToMerge = EjbFactory.eINSTANCE.createSessionBean();
+
+    beanBase.setEjbName("name");
+    beanToMerge.setEjbName("name");
+
+    ResourceEnvRef envRefBase = JavaeeFactory.eINSTANCE.createResourceEnvRef();
+    envRefBase.setMappedName("mapped1");
+    envRefBase.setResourceEnvRefName("refName1");
+    envRefBase.setResourceEnvRefType("type1");
+
+    ResourceEnvRef envRefToMerge = JavaeeFactory.eINSTANCE.createResourceEnvRef();
+    envRefToMerge.setMappedName("mapped2");
+    envRefToMerge.setResourceEnvRefName("refName2");
+    envRefToMerge.setResourceEnvRefType("type2");
+
+    beanBase.getResourceEnvRefs().add(envRefBase);
+    beanToMerge.getResourceEnvRefs().add(envRefBase);
+    beanToMerge.getResourceEnvRefs().add(envRefToMerge);
+
+    (new JNDIRefsMerger(beanBase, beanToMerge, 0)).process();
+
+    assertEquals(2, beanBase.getResourceEnvRefs().size());
+
+    ResourceEnvRef test = getResEnvRef(beanBase.getResourceEnvRefs(), "refName1");
+    ResourceEnvRef test2 = getResEnvRef(beanBase.getResourceEnvRefs(), "refName2");
+    assertEquals("mapped1", test.getMappedName());
+    assertEquals("type1", test.getResourceEnvRefType());
+
+    assertEquals("mapped2", test2.getMappedName());
+    assertEquals("type2", test2.getResourceEnvRefType());
+
+  }
+
+  /**
+   * ComplexOverlapped suffix means variety of information is present 
+   * in base and to merge: consistent information combined by base and toMerge
+   * should be available at the end. There are artifacts with one and the same 
+   * name and different values: values should be merged into base.
+   * @throws Exception
+   */
+  //@Test
+  public void testResourceEnvRefsComplexOverlapped() throws Exception {
+    SessionBean beanBase = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean beanToMerge = EjbFactory.eINSTANCE.createSessionBean();
+
+    beanBase.setEjbName("name");
+    beanToMerge.setEjbName("name");
+
+    ResourceEnvRef envRefBase = JavaeeFactory.eINSTANCE.createResourceEnvRef();
+    envRefBase.setResourceEnvRefName("refName1");
+
+    ResourceEnvRef envRefToMerge = JavaeeFactory.eINSTANCE.createResourceEnvRef();
+    envRefToMerge.setMappedName("mapped2");
+    envRefToMerge.setResourceEnvRefName("refName1");
+    envRefToMerge.setResourceEnvRefType("type2");
+
+    beanBase.getResourceEnvRefs().add(envRefBase);
+    beanToMerge.getResourceEnvRefs().add(envRefBase);
+    beanToMerge.getResourceEnvRefs().add(envRefToMerge);
+
+    (new JNDIRefsMerger(beanBase, beanToMerge, 0)).process();
+
+    assertEquals(1, beanBase.getResourceEnvRefs().size());
+
+    ResourceEnvRef test = getResEnvRef(beanBase.getResourceEnvRefs(), "refName1");
+    assertEquals("type2", test.getResourceEnvRefType());
+    assertEquals("mapped2", test.getMappedName());
+
+  }
+
+  private ResourceEnvRef getResEnvRef(List refs, String name){
+    if (name == null){
+      return null;
+    }
+    for (Object object : refs) {
+      ResourceEnvRef ref = (ResourceEnvRef) object;
+      if(name.equals(ref.getResourceEnvRefName())){
+        return ref; 
+      }
+    }
+    return null;
+  }
+
+
+
+
+  /**
+   * Base suffix means that the base object has some info and 
+   * toMerge is empty: nothing should be merged
+   * @throws Exception
+   */
+  //@Test
+  public void testResourceRefsBase() throws Exception {
+    SessionBean beanBase = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean beanToMerge = EjbFactory.eINSTANCE.createSessionBean();
+
+    beanBase.setEjbName("name");
+    beanToMerge.setEjbName("name");
+
+    ResourceRef resRefBase = JavaeeFactory.eINSTANCE.createResourceRef();
+    resRefBase.setMappedName("mapped1");
+    resRefBase.setResRefName("refName1");
+    resRefBase.setResType("type1");
+    resRefBase.setResAuth(ResAuthType.APPLICATION_LITERAL);
+    resRefBase.setResSharingScope(ResSharingScopeType.SHAREABLE_LITERAL);
+
+
+    ResourceRef resRefToMerge = JavaeeFactory.eINSTANCE.createResourceRef();
+    resRefToMerge.setMappedName("mapped2");
+    resRefToMerge.setResRefName("refName2");
+    resRefToMerge.setResType("type2");
+    resRefToMerge.setResAuth(ResAuthType.CONTAINER_LITERAL);
+    resRefToMerge.setResSharingScope(ResSharingScopeType.UNSHAREABLE_LITERAL);
+
+    beanBase.getResourceRefs().add(resRefBase);
+
+    (new JNDIRefsMerger(beanBase, beanToMerge, 0)).process();
+
+    assertEquals(1, beanBase.getResourceRefs().size());
+    assertEquals("mapped1", ((ResourceRef)beanBase.getResourceRefs().get(0)).getMappedName());
+    assertEquals("refName1", ((ResourceRef)beanBase.getResourceRefs().get(0)).getResRefName());
+    assertEquals("type1", ((ResourceRef)beanBase.getResourceRefs().get(0)).getResType());
+    assertEquals(ResAuthType.APPLICATION_LITERAL, ((ResourceRef)beanBase.getResourceRefs().get(0)).getResAuth());
+    assertEquals(ResSharingScopeType.SHAREABLE_LITERAL, ((ResourceRef)beanBase.getResourceRefs().get(0)).getResSharingScope());
+  }
+
+  /**
+   * ToMerge suffix means that the base is empty object and 
+   * toMerge has some info: all from merge should be present in base.
+   * @throws Exception
+   */
+  //@Test
+  public void testResourceRefsMerge() throws Exception {
+    SessionBean beanBase = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean beanToMerge = EjbFactory.eINSTANCE.createSessionBean();
+
+    beanBase.setEjbName("name");
+    beanToMerge.setEjbName("name");
+
+    ResourceRef resRefBase = JavaeeFactory.eINSTANCE.createResourceRef();
+    resRefBase.setMappedName("mapped1");
+    resRefBase.setResRefName("refName1");
+    resRefBase.setResType("type1");
+    resRefBase.setResAuth(ResAuthType.APPLICATION_LITERAL);
+    resRefBase.setResSharingScope(ResSharingScopeType.SHAREABLE_LITERAL);
+
+    ResourceRef resRefToMerge = JavaeeFactory.eINSTANCE.createResourceRef();
+    resRefToMerge.setMappedName("mapped2");
+    resRefToMerge.setResRefName("refName2");
+    resRefToMerge.setResType("type2");
+    resRefToMerge.setResAuth(ResAuthType.CONTAINER_LITERAL);
+    resRefToMerge.setResSharingScope(ResSharingScopeType.UNSHAREABLE_LITERAL);
+
+    beanToMerge.getResourceRefs().add(resRefBase);
+
+    (new JNDIRefsMerger(beanBase, beanToMerge, 0)).process();
+
+    assertEquals(1, beanBase.getResourceRefs().size());
+    assertEquals("mapped1", ((ResourceRef)beanBase.getResourceRefs().get(0)).getMappedName());
+    assertEquals("refName1", ((ResourceRef)beanBase.getResourceRefs().get(0)).getResRefName());
+    assertEquals("type1", ((ResourceRef)beanBase.getResourceRefs().get(0)).getResType());
+    assertEquals(ResAuthType.APPLICATION_LITERAL, ((ResourceRef)beanBase.getResourceRefs().get(0)).getResAuth());
+    assertEquals(ResSharingScopeType.SHAREABLE_LITERAL, ((ResourceRef)beanBase.getResourceRefs().get(0)).getResSharingScope());
+  }
+
+  /**
+   *  Same suffix means that the information in merge and base is one 
+   * and the same: no merge should occurred and additional checks for 
+   * doubling of the elements are present.
+   * @throws Exception
+   */
+  //@Test
+  public void testResourceRefsSame() throws Exception {
+    SessionBean beanBase = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean beanToMerge = EjbFactory.eINSTANCE.createSessionBean();
+
+    beanBase.setEjbName("name");
+    beanToMerge.setEjbName("name");
+
+    ResourceRef resRefBase = JavaeeFactory.eINSTANCE.createResourceRef();
+    resRefBase.setMappedName("mapped1");
+    resRefBase.setResRefName("refName1");
+    resRefBase.setResType("type1");
+    resRefBase.setResAuth(ResAuthType.APPLICATION_LITERAL);
+    resRefBase.setResSharingScope(ResSharingScopeType.SHAREABLE_LITERAL);
+
+
+    ResourceRef resRefToMerge = JavaeeFactory.eINSTANCE.createResourceRef();
+    resRefToMerge.setMappedName("mapped2");
+    resRefToMerge.setResRefName("refName2");
+    resRefToMerge.setResType("type2");
+    resRefToMerge.setResAuth(ResAuthType.CONTAINER_LITERAL);
+    resRefToMerge.setResSharingScope(ResSharingScopeType.UNSHAREABLE_LITERAL);
+
+    beanBase.getResourceRefs().add(resRefBase);
+    beanToMerge.getResourceRefs().add(resRefBase);
+
+    (new JNDIRefsMerger(beanBase, beanToMerge, 0)).process();
+
+    assertEquals(1, beanBase.getResourceRefs().size());
+    assertEquals("mapped1", ((ResourceRef)beanBase.getResourceRefs().get(0)).getMappedName());
+    assertEquals("refName1", ((ResourceRef)beanBase.getResourceRefs().get(0)).getResRefName());
+    assertEquals("type1", ((ResourceRef)beanBase.getResourceRefs().get(0)).getResType());
+    assertEquals(ResAuthType.APPLICATION_LITERAL, ((ResourceRef)beanBase.getResourceRefs().get(0)).getResAuth());
+    assertEquals(ResSharingScopeType.SHAREABLE_LITERAL, ((ResourceRef)beanBase.getResourceRefs().get(0)).getResSharingScope());
+
+  }
+
+  /**
+   *  Complex suffix means variety of information is present in base 
+   * and to merge: consistent information combined by base and toMerge
+   * should be available at the end.
+   * @throws Exception
+   */
+  //@Test
+  public void testResourceRefsComplex() throws Exception {
+    SessionBean beanBase = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean beanToMerge = EjbFactory.eINSTANCE.createSessionBean();
+
+    beanBase.setEjbName("name");
+    beanToMerge.setEjbName("name");
+
+    ResourceRef resRefBase = JavaeeFactory.eINSTANCE.createResourceRef();
+    resRefBase.setMappedName("mapped1");
+    resRefBase.setResRefName("refName1");
+    resRefBase.setResType("type1");
+    resRefBase.setResAuth(ResAuthType.APPLICATION_LITERAL);
+    resRefBase.setResSharingScope(ResSharingScopeType.SHAREABLE_LITERAL);
+
+    ResourceRef resRefToMerge = JavaeeFactory.eINSTANCE.createResourceRef();
+    resRefToMerge.setMappedName("mapped2");
+    resRefToMerge.setResRefName("refName2");
+    resRefToMerge.setResType("type2");
+    resRefToMerge.setResAuth(ResAuthType.CONTAINER_LITERAL);
+    resRefToMerge.setResSharingScope(ResSharingScopeType.UNSHAREABLE_LITERAL);
+
+    beanBase.getResourceRefs().add(resRefBase);
+    beanToMerge.getResourceRefs().add(resRefBase);
+    beanToMerge.getResourceRefs().add(resRefToMerge);
+
+    (new JNDIRefsMerger(beanBase, beanToMerge, 0)).process();
+
+    assertEquals(2, beanBase.getResourceRefs().size());
+
+    ResourceRef test = getResRef(beanBase.getResourceRefs(), "refName1");
+    ResourceRef test2 = getResRef(beanBase.getResourceRefs(), "refName2");
+    assertEquals("mapped1", test.getMappedName());
+    assertEquals("type1", test.getResType());
+    assertEquals(ResAuthType.APPLICATION_LITERAL, test.getResAuth());
+    assertEquals(ResSharingScopeType.SHAREABLE_LITERAL, test.getResSharingScope());
+
+    assertEquals("mapped2", test2.getMappedName());
+    assertEquals("type2", test2.getResType());
+    assertEquals(ResAuthType.CONTAINER_LITERAL, test2.getResAuth());
+    assertEquals(ResSharingScopeType.UNSHAREABLE_LITERAL, test2.getResSharingScope());
+
+  }
+
+  /**
+   * ComplexOverlapped suffix means variety of information is present 
+   * in base and to merge: consistent information combined by base and toMerge
+   * should be available at the end. There are artifacts with one and the same 
+   * name and different values: values should be merged into base.
+   * @throws Exception
+   */
+  //@Test
+  public void testResourceRefsComplexOverlapped() throws Exception {
+    SessionBean beanBase = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean beanToMerge = EjbFactory.eINSTANCE.createSessionBean();
+
+    beanBase.setEjbName("name");
+    beanToMerge.setEjbName("name");
+
+    ResourceRef envRefBase = JavaeeFactory.eINSTANCE.createResourceRef();
+    envRefBase.setResRefName("refName1");
+
+    ResourceRef resRefToMerge = JavaeeFactory.eINSTANCE.createResourceRef();
+    resRefToMerge.setMappedName("mapped2");
+    resRefToMerge.setResRefName("refName1");
+    resRefToMerge.setResType("type2");
+    resRefToMerge.setResAuth(ResAuthType.CONTAINER_LITERAL);
+    resRefToMerge.setResSharingScope(ResSharingScopeType.UNSHAREABLE_LITERAL);
+
+    beanBase.getResourceRefs().add(envRefBase);
+    beanToMerge.getResourceRefs().add(envRefBase);
+    beanToMerge.getResourceRefs().add(resRefToMerge);
+
+    (new JNDIRefsMerger(beanBase, beanToMerge, 0)).process();
+
+    assertEquals(1, beanBase.getResourceRefs().size());
+
+    ResourceRef test = getResRef(beanBase.getResourceRefs(), "refName1");
+    assertEquals("type2", test.getResType());
+    assertEquals("mapped2", test.getMappedName());
+    assertEquals(ResAuthType.CONTAINER_LITERAL, test.getResAuth());
+    assertEquals(ResSharingScopeType.UNSHAREABLE_LITERAL, test.getResSharingScope());
+
+  }
+
+  private ResourceRef getResRef(List refs, String name){
+    if (name == null){
+      return null;
+    }
+    for (Object object : refs) {
+      ResourceRef ref = (ResourceRef) object;
+      if(name.equals(ref.getResRefName())){
+        return ref; 
+      }
+    }
+    return null;
+  }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  /**
+   * Base suffix means that the base object has some info and 
+   * toMerge is empty: nothing should be merged
+   * @throws Exception
+   */
+  //@Test
+  public void testServiceRefBase() throws Exception {
+    SessionBean beanBase = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean beanToMerge = EjbFactory.eINSTANCE.createSessionBean();
+
+    beanBase.setEjbName("name");
+    beanToMerge.setEjbName("name");
+
+    ServiceRef serviceRefBase = JavaeeFactory.eINSTANCE.createServiceRef();
+    serviceRefBase.setMappedName("mapped1");
+    serviceRefBase.setServiceRefName("refName1");
+    //    ServiceRefHandlerChains chains = JavaeeFactory.eINSTANCE.createServiceRefHandlerChains();
+    //    ServiceRefHandlerChain chain = JavaeeFactory.eINSTANCE.createServiceRefHandlerChain();
+    //    chains.getHandlerChains().add(chain);
+    //    chain.
+    //    resRefBase.setHandlerChains(chains);
+    serviceRefBase.setServiceInterface("interface1");
+    serviceRefBase.setWsdlFile("file1");
+
+
+    ServiceRef serviceRefMerge = JavaeeFactory.eINSTANCE.createServiceRef();
+    serviceRefMerge.setMappedName("mapped2");
+    serviceRefMerge.setServiceRefName("refName2");
+    serviceRefMerge.setServiceInterface("interface2");
+    serviceRefMerge.setWsdlFile("file2");
+
+    beanBase.getServiceRefs().add(serviceRefBase);
+
+    (new JNDIRefsMerger(beanBase, beanToMerge, 0)).process();
+
+    assertEquals(1, beanBase.getServiceRefs().size());
+    assertEquals("mapped1", ((ServiceRef)beanBase.getServiceRefs().get(0)).getMappedName());
+    assertEquals("refName1", ((ServiceRef)beanBase.getServiceRefs().get(0)).getServiceRefName());
+    assertEquals("interface1", ((ServiceRef)beanBase.getServiceRefs().get(0)).getServiceInterface());
+    assertEquals("file1", ((ServiceRef)beanBase.getServiceRefs().get(0)).getWsdlFile());
+  }
+
+  /**
+   * ToMerge suffix means that the base is empty object and 
+   * toMerge has some info: all from merge should be present in base.
+   * @throws Exception
+   */
+  //@Test
+  public void testServiceRefsMerge() throws Exception {
+    SessionBean beanBase = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean beanToMerge = EjbFactory.eINSTANCE.createSessionBean();
+
+    beanBase.setEjbName("name");
+    beanToMerge.setEjbName("name");
+
+    ServiceRef serviceRefBase = JavaeeFactory.eINSTANCE.createServiceRef();
+    serviceRefBase.setMappedName("mapped1");
+    serviceRefBase.setServiceRefName("refName1");
+    serviceRefBase.setServiceInterface("interface1");
+    serviceRefBase.setWsdlFile("file1");
+
+    ServiceRef serviceRefMerge = JavaeeFactory.eINSTANCE.createServiceRef();
+    serviceRefMerge.setMappedName("mapped2");
+    serviceRefMerge.setServiceRefName("refName2");
+    serviceRefMerge.setServiceInterface("interface2");
+    serviceRefMerge.setWsdlFile("file2");
+
+    beanToMerge.getServiceRefs().add(serviceRefBase);
+
+    (new JNDIRefsMerger(beanBase, beanToMerge, 0)).process();
+
+    assertEquals(1, beanBase.getServiceRefs().size());
+    assertEquals("mapped1", ((ServiceRef)beanBase.getServiceRefs().get(0)).getMappedName());
+    assertEquals("refName1", ((ServiceRef)beanBase.getServiceRefs().get(0)).getServiceRefName());
+    assertEquals("interface1", ((ServiceRef)beanBase.getServiceRefs().get(0)).getServiceInterface());
+    assertEquals("file1", ((ServiceRef)beanBase.getServiceRefs().get(0)).getWsdlFile());
+  }
+
+  /**
+   *  Same suffix means that the information in merge and base is one 
+   * and the same: no merge should occurred and additional checks for 
+   * doubling of the elements are present.
+   * @throws Exception
+   */
+  //@Test
+  public void testServiceRefsSame() throws Exception {
+    SessionBean beanBase = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean beanToMerge = EjbFactory.eINSTANCE.createSessionBean();
+
+    beanBase.setEjbName("name");
+    beanToMerge.setEjbName("name");
+
+    ServiceRef serviceRefBase = JavaeeFactory.eINSTANCE.createServiceRef();
+    serviceRefBase.setMappedName("mapped1");
+    serviceRefBase.setServiceRefName("refName1");
+    serviceRefBase.setServiceInterface("interface1");
+    serviceRefBase.setWsdlFile("file1");
+
+
+    ServiceRef resRefToMerge = JavaeeFactory.eINSTANCE.createServiceRef();
+    resRefToMerge.setMappedName("mapped2");
+    resRefToMerge.setServiceRefName("refName2");
+    resRefToMerge.setServiceInterface("interface2");
+    resRefToMerge.setWsdlFile("file2");
+
+    beanBase.getServiceRefs().add(serviceRefBase);
+    beanToMerge.getServiceRefs().add(serviceRefBase);
+
+    (new JNDIRefsMerger(beanBase, beanToMerge, 0)).process();
+
+    assertEquals(1, beanBase.getServiceRefs().size());
+    assertEquals("mapped1", ((ServiceRef)beanBase.getServiceRefs().get(0)).getMappedName());
+    assertEquals("refName1", ((ServiceRef)beanBase.getServiceRefs().get(0)).getServiceRefName());
+    assertEquals("interface1", ((ServiceRef)beanBase.getServiceRefs().get(0)).getServiceInterface());
+    assertEquals("file1", ((ServiceRef)beanBase.getServiceRefs().get(0)).getWsdlFile());
+
+  }
+
+  /**
+   *  Complex suffix means variety of information is present in base 
+   * and to merge: consistent information combined by base and toMerge
+   * should be available at the end.
+   * @throws Exception
+   */
+  //@Test
+  public void testServiceRefsComplex() throws Exception {
+    SessionBean beanBase = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean beanToMerge = EjbFactory.eINSTANCE.createSessionBean();
+
+    beanBase.setEjbName("name");
+    beanToMerge.setEjbName("name");
+
+    ServiceRef serviceRefBase = JavaeeFactory.eINSTANCE.createServiceRef();
+    serviceRefBase.setMappedName("mapped1");
+    serviceRefBase.setServiceRefName("refName1");
+    serviceRefBase.setServiceInterface("interface1");
+    serviceRefBase.setWsdlFile("file1");
+
+    ServiceRef serviceRefMerge = JavaeeFactory.eINSTANCE.createServiceRef();
+    serviceRefMerge.setMappedName("mapped2");
+    serviceRefMerge.setServiceRefName("refName2");
+    serviceRefMerge.setServiceInterface("interface2");
+    serviceRefMerge.setWsdlFile("file2");
+
+    beanBase.getServiceRefs().add(serviceRefBase);
+    beanToMerge.getServiceRefs().add(serviceRefBase);
+    beanToMerge.getServiceRefs().add(serviceRefMerge);
+
+    (new JNDIRefsMerger(beanBase, beanToMerge, 0)).process();
+
+    assertEquals(2, beanBase.getServiceRefs().size());
+
+    ServiceRef test = getServiceRef(beanBase.getServiceRefs(), "refName1");
+    ServiceRef test2 = getServiceRef(beanBase.getServiceRefs(), "refName2");
+    assertEquals("mapped1", test.getMappedName());
+    assertEquals("interface1", test.getServiceInterface());
+    assertEquals("file1", test.getWsdlFile());
+
+    assertEquals("mapped2", test2.getMappedName());
+    assertEquals("interface2", test2.getServiceInterface());
+    assertEquals("file2", test2.getWsdlFile());
+
+  }
+
+  /**
+   * ComplexOverlapped suffix means variety of information is present 
+   * in base and to merge: consistent information combined by base and toMerge
+   * should be available at the end. There are artifacts with one and the same 
+   * name and different values: values should be merged into base.
+   * @throws Exception
+   */
+  //@Test
+  public void testServiceRefsComplexOverlapped() throws Exception {
+    SessionBean beanBase = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean beanToMerge = EjbFactory.eINSTANCE.createSessionBean();
+
+    beanBase.setEjbName("name");
+    beanToMerge.setEjbName("name");
+
+    ServiceRef serviceRefBase = JavaeeFactory.eINSTANCE.createServiceRef();
+    serviceRefBase.setServiceRefName("refName1");
+
+    ServiceRef serviceRefMerge = JavaeeFactory.eINSTANCE.createServiceRef();
+    serviceRefMerge.setMappedName("mapped2");
+    serviceRefMerge.setServiceRefName("refName1");
+    serviceRefMerge.setServiceInterface("interface2");
+    serviceRefMerge.setWsdlFile("file2");
+
+    beanBase.getServiceRefs().add(serviceRefBase);
+    beanToMerge.getServiceRefs().add(serviceRefBase);
+    beanToMerge.getServiceRefs().add(serviceRefMerge);
+
+    (new JNDIRefsMerger(beanBase, beanToMerge, 0)).process();
+
+    assertEquals(1, beanBase.getServiceRefs().size());
+
+    ServiceRef test = getServiceRef(beanBase.getServiceRefs(), "refName1");
+    assertEquals("interface2", test.getServiceInterface());
+    assertEquals("mapped2", test.getMappedName());
+    assertEquals("file2", test.getWsdlFile());
+
+  }
+
+  private ServiceRef getServiceRef(List refs, String name){
+    if (name == null){
+      return null;
+    }
+    for (Object object : refs) {
+      ServiceRef ref = (ServiceRef) object;
+      if(name.equals(ref.getServiceRefName())){
+        return ref; 
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Base suffix means that the base object has some info and 
+   * toMerge is empty: nothing should be merged
+   * @throws Exception
+   */
+  //@Test
+  public void testPersistenceUnitRefsBase() throws Exception {
+    SessionBean beanBase = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean beanToMerge = EjbFactory.eINSTANCE.createSessionBean();
+
+    beanBase.setEjbName("name");
+    beanToMerge.setEjbName("name");
+
+    PersistenceUnitRef persistenceUnitRefBase = JavaeeFactory.eINSTANCE.createPersistenceUnitRef();
+    persistenceUnitRefBase.setMappedName("mapped1");
+    persistenceUnitRefBase.setPersistenceUnitRefName("refName1");
+    persistenceUnitRefBase.setPersistenceUnitName("type1");
+
+
+    PersistenceUnitRef persistenceUnitRefMerge = JavaeeFactory.eINSTANCE.createPersistenceUnitRef();
+    persistenceUnitRefMerge.setMappedName("mapped2");
+    persistenceUnitRefMerge.setPersistenceUnitRefName("refName2");
+    persistenceUnitRefMerge.setPersistenceUnitName("type2");
+
+    beanBase.getPersistenceUnitRefs().add(persistenceUnitRefBase);
+
+    (new JNDIRefsMerger(beanBase, beanToMerge, 0)).process();
+
+    assertEquals(1, beanBase.getPersistenceUnitRefs().size());
+    assertEquals("mapped1", ((PersistenceUnitRef)beanBase.getPersistenceUnitRefs().get(0)).getMappedName());
+    assertEquals("refName1", ((PersistenceUnitRef)beanBase.getPersistenceUnitRefs().get(0)).getPersistenceUnitRefName());
+    assertEquals("type1", ((PersistenceUnitRef)beanBase.getPersistenceUnitRefs().get(0)).getPersistenceUnitName());
+
+  }
+
+  /**
+   * ToMerge suffix means that the base is empty object and 
+   * toMerge has some info: all from merge should be present in base.
+   * @throws Exception
+   */
+  //@Test
+  public void testPersistenceUnitRefsMerge() throws Exception {
+    SessionBean beanBase = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean beanToMerge = EjbFactory.eINSTANCE.createSessionBean();
+
+    beanBase.setEjbName("name");
+    beanToMerge.setEjbName("name");
+
+    PersistenceUnitRef persistenceUnitRefBase = JavaeeFactory.eINSTANCE.createPersistenceUnitRef();
+    persistenceUnitRefBase.setMappedName("mapped1");
+    persistenceUnitRefBase.setPersistenceUnitRefName("refName1");
+    persistenceUnitRefBase.setPersistenceUnitName("type1");
+
+    PersistenceUnitRef persistenceUnitRefMerge = JavaeeFactory.eINSTANCE.createPersistenceUnitRef();
+    persistenceUnitRefMerge.setMappedName("mapped2");
+    persistenceUnitRefMerge.setPersistenceUnitRefName("refName2");
+    persistenceUnitRefMerge.setPersistenceUnitName("type2");
+
+    beanToMerge.getPersistenceUnitRefs().add(persistenceUnitRefBase);
+
+    (new JNDIRefsMerger(beanBase, beanToMerge, 0)).process();
+
+    assertEquals(1, beanBase.getPersistenceUnitRefs().size());
+    assertEquals("mapped1", ((PersistenceUnitRef)beanBase.getPersistenceUnitRefs().get(0)).getMappedName());
+    assertEquals("refName1", ((PersistenceUnitRef)beanBase.getPersistenceUnitRefs().get(0)).getPersistenceUnitRefName());
+    assertEquals("type1", ((PersistenceUnitRef)beanBase.getPersistenceUnitRefs().get(0)).getPersistenceUnitName());
+
+  }
+
+  /**
+   *  Same suffix means that the information in merge and base is one 
+   * and the same: no merge should occurred and additional checks for 
+   * doubling of the elements are present.
+   * @throws Exception
+   */
+  //@Test
+  public void testPersistenceUnitRefsSame() throws Exception {
+    SessionBean beanBase = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean beanToMerge = EjbFactory.eINSTANCE.createSessionBean();
+
+    beanBase.setEjbName("name");
+    beanToMerge.setEjbName("name");
+
+    PersistenceUnitRef persistenceUnitRefBase = JavaeeFactory.eINSTANCE.createPersistenceUnitRef();
+    persistenceUnitRefBase.setMappedName("mapped1");
+    persistenceUnitRefBase.setPersistenceUnitRefName("refName1");
+    persistenceUnitRefBase.setPersistenceUnitName("type1");
+
+    PersistenceUnitRef persistenceUnitRefMerge = JavaeeFactory.eINSTANCE.createPersistenceUnitRef();
+    persistenceUnitRefMerge.setMappedName("mapped2");
+    persistenceUnitRefMerge.setPersistenceUnitRefName("refName2");
+    persistenceUnitRefMerge.setPersistenceUnitName("type2");
+
+    beanBase.getPersistenceUnitRefs().add(persistenceUnitRefBase);
+    beanToMerge.getPersistenceUnitRefs().add(persistenceUnitRefBase);
+
+    (new JNDIRefsMerger(beanBase, beanToMerge, 0)).process();
+
+    assertEquals(1, beanBase.getPersistenceUnitRefs().size());
+    assertEquals("mapped1", ((PersistenceUnitRef)beanBase.getPersistenceUnitRefs().get(0)).getMappedName());
+    assertEquals("refName1", ((PersistenceUnitRef)beanBase.getPersistenceUnitRefs().get(0)).getPersistenceUnitRefName());
+    assertEquals("type1", ((PersistenceUnitRef)beanBase.getPersistenceUnitRefs().get(0)).getPersistenceUnitName());
+
+  }
+
+  /**
+   *  Complex suffix means variety of information is present in base 
+   * and to merge: consistent information combined by base and toMerge
+   * should be available at the end.
+   * @throws Exception
+   */
+  //@Test
+  public void testPersistenceUnitRefsComplex() throws Exception {
+    SessionBean beanBase = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean beanToMerge = EjbFactory.eINSTANCE.createSessionBean();
+
+    beanBase.setEjbName("name");
+    beanToMerge.setEjbName("name");
+
+    PersistenceUnitRef persistenceUnitRefBase = JavaeeFactory.eINSTANCE.createPersistenceUnitRef();
+    persistenceUnitRefBase.setMappedName("mapped1");
+    persistenceUnitRefBase.setPersistenceUnitRefName("refName1");
+    persistenceUnitRefBase.setPersistenceUnitName("type1");
+
+    PersistenceUnitRef persistenceUnitRefMerge = JavaeeFactory.eINSTANCE.createPersistenceUnitRef();
+    persistenceUnitRefMerge.setMappedName("mapped2");
+    persistenceUnitRefMerge.setPersistenceUnitRefName("refName2");
+    persistenceUnitRefMerge.setPersistenceUnitName("type2");
+
+    beanBase.getPersistenceUnitRefs().add(persistenceUnitRefBase);
+    beanToMerge.getPersistenceUnitRefs().add(persistenceUnitRefBase);
+    beanToMerge.getPersistenceUnitRefs().add(persistenceUnitRefMerge);
+
+    (new JNDIRefsMerger(beanBase, beanToMerge, 0)).process();
+
+    assertEquals(2, beanBase.getPersistenceUnitRefs().size());
+
+    PersistenceUnitRef test = getPersistUnitRef(beanBase.getPersistenceUnitRefs(), "refName1");
+    PersistenceUnitRef test2 = getPersistUnitRef(beanBase.getPersistenceUnitRefs(), "refName2");
+    assertEquals("mapped1", test.getMappedName());
+    assertEquals("type1", test.getPersistenceUnitName());
+
+    assertEquals("mapped2", test2.getMappedName());
+    assertEquals("type2", test2.getPersistenceUnitName());
+
+  }
+
+  /**
+   * ComplexOverlapped suffix means variety of information is present 
+   * in base and to merge: consistent information combined by base and toMerge
+   * should be available at the end. There are artifacts with one and the same 
+   * name and different values: values should be merged into base.
+   * @throws Exception
+   */
+  //@Test
+  public void testPersistenceUnitRefsComplexOverlapped() throws Exception {
+    SessionBean beanBase = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean beanToMerge = EjbFactory.eINSTANCE.createSessionBean();
+
+    beanBase.setEjbName("name");
+    beanToMerge.setEjbName("name");
+
+    PersistenceUnitRef persistenceUnitRefBase = JavaeeFactory.eINSTANCE.createPersistenceUnitRef();
+    persistenceUnitRefBase.setPersistenceUnitRefName("refName1");
+
+    PersistenceUnitRef persistenceUnitRefMerge = JavaeeFactory.eINSTANCE.createPersistenceUnitRef();
+    persistenceUnitRefMerge.setMappedName("mapped2");
+    persistenceUnitRefMerge.setPersistenceUnitRefName("refName1");
+    persistenceUnitRefMerge.setPersistenceUnitName("type2");
+
+    beanBase.getPersistenceUnitRefs().add(persistenceUnitRefBase);
+    beanToMerge.getPersistenceUnitRefs().add(persistenceUnitRefBase);
+    beanToMerge.getPersistenceUnitRefs().add(persistenceUnitRefMerge);
+
+    (new JNDIRefsMerger(beanBase, beanToMerge, 0)).process();
+
+    assertEquals(1, beanBase.getPersistenceUnitRefs().size());
+
+    PersistenceUnitRef test = getPersistUnitRef(beanBase.getPersistenceUnitRefs(), "refName1");
+    assertEquals("type2", test.getPersistenceUnitName());
+    assertEquals("mapped2", test.getMappedName());
+
+  }
+
+  private PersistenceUnitRef getPersistUnitRef(List refs, String name){
+    if (name == null){
+      return null;
+    }
+    for (Object object : refs) {
+      PersistenceUnitRef ref = (PersistenceUnitRef) object;
+      if(name.equals(ref.getPersistenceUnitRefName())){
+        return ref; 
+      }
+    }
+    return null;
+  }
+
+
+  /**
+   * Base suffix means that the base object has some info and 
+   * toMerge is empty: nothing should be merged
+   * @throws Exception
+   */
+  //@Test
+  public void testPersistenceContextRefsBase() throws Exception {
+    SessionBean beanBase = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean beanToMerge = EjbFactory.eINSTANCE.createSessionBean();
+
+    beanBase.setEjbName("name");
+    beanToMerge.setEjbName("name");
+
+    PersistenceContextRef persistenceContextRefBase = JavaeeFactory.eINSTANCE.createPersistenceContextRef();
+    persistenceContextRefBase.setMappedName("mapped1");
+    persistenceContextRefBase.setPersistenceContextRefName("refName1");
+    persistenceContextRefBase.setPersistenceContextType(PersistenceContextType.EXTENDED_LITERAL);
+
+    PersistenceContextRef persistenceContextRefMerge = JavaeeFactory.eINSTANCE.createPersistenceContextRef();
+    persistenceContextRefMerge.setMappedName("mapped2");
+    persistenceContextRefMerge.setPersistenceContextRefName("refName2");
+    persistenceContextRefMerge.setPersistenceContextType(PersistenceContextType.TRANSACTION_LITERAL);
+
+    beanBase.getPersistenceContextRefs().add(persistenceContextRefBase);
+
+    (new JNDIRefsMerger(beanBase, beanToMerge, 0)).process();
+
+    assertEquals(1, beanBase.getPersistenceContextRefs().size());
+    assertEquals("mapped1", ((PersistenceContextRef)beanBase.getPersistenceContextRefs().get(0)).getMappedName());
+    assertEquals("refName1", ((PersistenceContextRef)beanBase.getPersistenceContextRefs().get(0)).getPersistenceContextRefName());
+    assertEquals(PersistenceContextType.EXTENDED_LITERAL, ((PersistenceContextRef)beanBase.getPersistenceContextRefs().get(0)).getPersistenceContextType());
+
+  }
+
+  /**
+   * ToMerge suffix means that the base is empty object and 
+   * toMerge has some info: all from merge should be present in base.
+   * @throws Exception
+   */
+  //@Test
+  public void testPersistenceContextRefsMerge() throws Exception {
+    SessionBean beanBase = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean beanToMerge = EjbFactory.eINSTANCE.createSessionBean();
+
+    beanBase.setEjbName("name");
+    beanToMerge.setEjbName("name");
+
+    PersistenceContextRef persistenceContextRefBase = JavaeeFactory.eINSTANCE.createPersistenceContextRef();
+    persistenceContextRefBase.setMappedName("mapped1");
+    persistenceContextRefBase.setPersistenceContextRefName("refName1");
+    persistenceContextRefBase.setPersistenceContextType(PersistenceContextType.EXTENDED_LITERAL);
+
+    PersistenceContextRef persistenceContextRefMerge = JavaeeFactory.eINSTANCE.createPersistenceContextRef();
+    persistenceContextRefMerge.setMappedName("mapped2");
+    persistenceContextRefMerge.setPersistenceContextRefName("refName2");
+    persistenceContextRefMerge.setPersistenceContextType(PersistenceContextType.TRANSACTION_LITERAL);
+
+    beanToMerge.getPersistenceContextRefs().add(persistenceContextRefBase);
+
+    (new JNDIRefsMerger(beanBase, beanToMerge, 0)).process();
+
+    assertEquals(1, beanBase.getPersistenceContextRefs().size());
+    assertEquals("mapped1", ((PersistenceContextRef)beanBase.getPersistenceContextRefs().get(0)).getMappedName());
+    assertEquals("refName1", ((PersistenceContextRef)beanBase.getPersistenceContextRefs().get(0)).getPersistenceContextRefName());
+    assertEquals(PersistenceContextType.EXTENDED_LITERAL, ((PersistenceContextRef)beanBase.getPersistenceContextRefs().get(0)).getPersistenceContextType());
+
+  }
+
+  /**
+   *  Same suffix means that the information in merge and base is one 
+   * and the same: no merge should occurred and additional checks for 
+   * doubling of the elements are present.
+   * @throws Exception
+   */
+  //@Test
+  public void testPersistenceContextRefsSame() throws Exception {
+    SessionBean beanBase = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean beanToMerge = EjbFactory.eINSTANCE.createSessionBean();
+
+    beanBase.setEjbName("name");
+    beanToMerge.setEjbName("name");
+
+    PersistenceContextRef persistenceContextRefBase = JavaeeFactory.eINSTANCE.createPersistenceContextRef();
+    persistenceContextRefBase.setMappedName("mapped1");
+    persistenceContextRefBase.setPersistenceContextRefName("refName1");
+    persistenceContextRefBase.setPersistenceContextType(PersistenceContextType.EXTENDED_LITERAL);
+
+    PersistenceContextRef persistenceContextRefMerge = JavaeeFactory.eINSTANCE.createPersistenceContextRef();
+    persistenceContextRefMerge.setMappedName("mapped2");
+    persistenceContextRefMerge.setPersistenceContextRefName("refName2");
+    persistenceContextRefMerge.setPersistenceContextType(PersistenceContextType.TRANSACTION_LITERAL);
+
+    beanBase.getPersistenceContextRefs().add(persistenceContextRefBase);
+    beanToMerge.getPersistenceContextRefs().add(persistenceContextRefBase);
+
+    (new JNDIRefsMerger(beanBase, beanToMerge, 0)).process();
+
+    assertEquals(1, beanBase.getPersistenceContextRefs().size());
+    assertEquals("mapped1", ((PersistenceContextRef)beanBase.getPersistenceContextRefs().get(0)).getMappedName());
+    assertEquals("refName1", ((PersistenceContextRef)beanBase.getPersistenceContextRefs().get(0)).getPersistenceContextRefName());
+    assertEquals(PersistenceContextType.EXTENDED_LITERAL, ((PersistenceContextRef)beanBase.getPersistenceContextRefs().get(0)).getPersistenceContextType());
+
+  }
+
+  /**
+   *  Complex suffix means variety of information is present in base 
+   * and to merge: consistent information combined by base and toMerge
+   * should be available at the end.
+   * @throws Exception
+   */
+  //@Test
+  public void testPersistenceContextRefsComplex() throws Exception {
+    SessionBean beanBase = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean beanToMerge = EjbFactory.eINSTANCE.createSessionBean();
+
+    beanBase.setEjbName("name");
+    beanToMerge.setEjbName("name");
+
+    PersistenceContextRef persistenceContextRefBase = JavaeeFactory.eINSTANCE.createPersistenceContextRef();
+    persistenceContextRefBase.setMappedName("mapped1");
+    persistenceContextRefBase.setPersistenceContextRefName("refName1");
+    persistenceContextRefBase.setPersistenceContextType(PersistenceContextType.EXTENDED_LITERAL);
+
+    PersistenceContextRef persistenceContextRefMerge = JavaeeFactory.eINSTANCE.createPersistenceContextRef();
+    persistenceContextRefMerge.setMappedName("mapped2");
+    persistenceContextRefMerge.setPersistenceContextRefName("refName2");
+    persistenceContextRefMerge.setPersistenceContextType(PersistenceContextType.TRANSACTION_LITERAL);
+
+    beanBase.getPersistenceContextRefs().add(persistenceContextRefBase);
+    beanToMerge.getPersistenceContextRefs().add(persistenceContextRefBase);
+    beanToMerge.getPersistenceContextRefs().add(persistenceContextRefMerge);
+
+    (new JNDIRefsMerger(beanBase, beanToMerge, 0)).process();
+
+    assertEquals(2, beanBase.getPersistenceContextRefs().size());
+
+    PersistenceContextRef test = getPersistenceCintextRef(beanBase.getPersistenceContextRefs(), "refName1");
+    PersistenceContextRef test2 = getPersistenceCintextRef(beanBase.getPersistenceContextRefs(), "refName2");
+    assertEquals("mapped1", test.getMappedName());
+    assertEquals(PersistenceContextType.EXTENDED_LITERAL, test.getPersistenceContextType());
+
+    assertEquals("mapped2", test2.getMappedName());
+    assertEquals(PersistenceContextType.TRANSACTION_LITERAL, test2.getPersistenceContextType());
+
+  }
+
+  /**
+   * ComplexOverlapped suffix means variety of information is present 
+   * in base and to merge: consistent information combined by base and toMerge
+   * should be available at the end. There are artifacts with one and the same 
+   * name and different values: values should be merged into base.
+   * @throws Exception
+   */
+  //@Test
+  public void testPersistenceContextRefsComplexOverlapped() throws Exception {
+    SessionBean beanBase = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean beanToMerge = EjbFactory.eINSTANCE.createSessionBean();
+
+    beanBase.setEjbName("name");
+    beanToMerge.setEjbName("name");
+
+    PersistenceContextRef persistenceContextRefBase = JavaeeFactory.eINSTANCE.createPersistenceContextRef();
+    persistenceContextRefBase.setPersistenceContextRefName("refName1");
+
+    PersistenceContextRef persistenceContextRefMerge = JavaeeFactory.eINSTANCE.createPersistenceContextRef();
+    persistenceContextRefMerge.setMappedName("mapped2");
+    persistenceContextRefMerge.setPersistenceContextRefName("refName1");
+    persistenceContextRefMerge.setPersistenceContextType(PersistenceContextType.TRANSACTION_LITERAL);
+
+    beanBase.getPersistenceContextRefs().add(persistenceContextRefBase);
+    beanToMerge.getPersistenceContextRefs().add(persistenceContextRefBase);
+    beanToMerge.getPersistenceContextRefs().add(persistenceContextRefMerge);
+
+    (new JNDIRefsMerger(beanBase, beanToMerge, 0)).process();
+
+    assertEquals(1, beanBase.getPersistenceContextRefs().size());
+
+    PersistenceContextRef test = getPersistenceCintextRef(beanBase.getPersistenceContextRefs(), "refName1");
+    assertEquals(PersistenceContextType.TRANSACTION_LITERAL, test.getPersistenceContextType());
+    assertEquals("mapped2", test.getMappedName());
+
+  }
+
+  private PersistenceContextRef getPersistenceCintextRef(List refs, String name){
+    if (name == null){
+      return null;
+    }
+    for (Object object : refs) {
+      PersistenceContextRef ref = (PersistenceContextRef) object;
+      if(name.equals(ref.getPersistenceContextRefName())){
+        return ref; 
+      }
+    }
+    return null;
+  }
+
+
+  /**
+   * Base suffix means that the base object has some info and 
+   * toMerge is empty: nothing should be merged
+   * @throws Exception
+   */
+  //@Test
+  public void testMessageDestinationRefsBase() throws Exception {
+    SessionBean beanBase = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean beanToMerge = EjbFactory.eINSTANCE.createSessionBean();
+
+    beanBase.setEjbName("name");
+    beanToMerge.setEjbName("name");
+
+    MessageDestinationRef messageDestRefBase = JavaeeFactory.eINSTANCE.createMessageDestinationRef();
+    messageDestRefBase.setMappedName("mapped1");
+    messageDestRefBase.setMessageDestinationRefName("refName1");
+    messageDestRefBase.setMessageDestinationType("type1");
+    messageDestRefBase.setMessageDestinationLink("link1");
+    messageDestRefBase.setMessageDestinationUsage(MessageDestinationUsageType.CONSUMES_LITERAL);
+
+    MessageDestinationRef messageDestRefMerge = JavaeeFactory.eINSTANCE.createMessageDestinationRef();
+    messageDestRefMerge.setMappedName("mapped2");
+    messageDestRefMerge.setMessageDestinationRefName("refName2");
+    messageDestRefMerge.setMessageDestinationType("type2");
+    messageDestRefMerge.setMessageDestinationLink("link2");
+    messageDestRefMerge.setMessageDestinationUsage(MessageDestinationUsageType.CONSUMES_PRODUCES_LITERAL);
+
+    beanBase.getMessageDestinationRefs().add(messageDestRefBase);
+
+    (new JNDIRefsMerger(beanBase, beanToMerge, 0)).process();
+
+    assertEquals(1, beanBase.getMessageDestinationRefs().size());
+    assertEquals("mapped1", ((MessageDestinationRef)beanBase.getMessageDestinationRefs().get(0)).getMappedName());
+    assertEquals("refName1", ((MessageDestinationRef)beanBase.getMessageDestinationRefs().get(0)).getMessageDestinationRefName());
+    assertEquals("type1", ((MessageDestinationRef)beanBase.getMessageDestinationRefs().get(0)).getMessageDestinationType());
+    assertEquals("link1", ((MessageDestinationRef)beanBase.getMessageDestinationRefs().get(0)).getMessageDestinationLink());
+    assertEquals(MessageDestinationUsageType.CONSUMES_LITERAL, ((MessageDestinationRef)beanBase.getMessageDestinationRefs().get(0)).getMessageDestinationUsage());
+
+  }
+
+  /**
+   * ToMerge suffix means that the base is empty object and 
+   * toMerge has some info: all from merge should be present in base.
+   * @throws Exception
+   */
+  //@Test
+  public void testMessageDestinationRefsMerge() throws Exception {
+    SessionBean beanBase = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean beanToMerge = EjbFactory.eINSTANCE.createSessionBean();
+
+    beanBase.setEjbName("name");
+    beanToMerge.setEjbName("name");
+
+    MessageDestinationRef messageDestRefBase = JavaeeFactory.eINSTANCE.createMessageDestinationRef();
+    messageDestRefBase.setMappedName("mapped1");
+    messageDestRefBase.setMessageDestinationRefName("refName1");
+    messageDestRefBase.setMessageDestinationType("type1");
+    messageDestRefBase.setMessageDestinationLink("link1");
+    messageDestRefBase.setMessageDestinationUsage(MessageDestinationUsageType.CONSUMES_LITERAL);
+
+    MessageDestinationRef messageDestRefMerge = JavaeeFactory.eINSTANCE.createMessageDestinationRef();
+    messageDestRefMerge.setMappedName("mapped2");
+    messageDestRefMerge.setMessageDestinationRefName("refName2");
+    messageDestRefMerge.setMessageDestinationType("type2");
+    messageDestRefMerge.setMessageDestinationLink("link2");
+    messageDestRefMerge.setMessageDestinationUsage(MessageDestinationUsageType.CONSUMES_PRODUCES_LITERAL);
+
+
+    beanToMerge.getMessageDestinationRefs().add(messageDestRefBase);
+
+    (new JNDIRefsMerger(beanBase, beanToMerge, 0)).process();
+
+    assertEquals(1, beanBase.getMessageDestinationRefs().size());
+    assertEquals("mapped1", ((MessageDestinationRef)beanBase.getMessageDestinationRefs().get(0)).getMappedName());
+    assertEquals("refName1", ((MessageDestinationRef)beanBase.getMessageDestinationRefs().get(0)).getMessageDestinationRefName());
+    assertEquals("type1", ((MessageDestinationRef)beanBase.getMessageDestinationRefs().get(0)).getMessageDestinationType());
+    assertEquals("link1", ((MessageDestinationRef)beanBase.getMessageDestinationRefs().get(0)).getMessageDestinationLink());
+    assertEquals(MessageDestinationUsageType.CONSUMES_LITERAL, ((MessageDestinationRef)beanBase.getMessageDestinationRefs().get(0)).getMessageDestinationUsage());
+
+  }
+
+  /**
+   *  Same suffix means that the information in merge and base is one 
+   * and the same: no merge should occurred and additional checks for 
+   * doubling of the elements are present.
+   * @throws Exception
+   */
+  //@Test
+  public void testMessageDestinationRefsSame() throws Exception {
+    SessionBean beanBase = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean beanToMerge = EjbFactory.eINSTANCE.createSessionBean();
+
+    beanBase.setEjbName("name");
+    beanToMerge.setEjbName("name");
+
+    MessageDestinationRef messageDestRefBase = JavaeeFactory.eINSTANCE.createMessageDestinationRef();
+    messageDestRefBase.setMappedName("mapped1");
+    messageDestRefBase.setMessageDestinationRefName("refName1");
+    messageDestRefBase.setMessageDestinationType("type1");
+    messageDestRefBase.setMessageDestinationLink("link1");
+    messageDestRefBase.setMessageDestinationUsage(MessageDestinationUsageType.CONSUMES_LITERAL);
+
+    MessageDestinationRef messageDestRefMerge = JavaeeFactory.eINSTANCE.createMessageDestinationRef();
+    messageDestRefMerge.setMappedName("mapped2");
+    messageDestRefMerge.setMessageDestinationRefName("refName2");
+    messageDestRefMerge.setMessageDestinationType("type2");
+    messageDestRefMerge.setMessageDestinationLink("link2");
+    messageDestRefMerge.setMessageDestinationUsage(MessageDestinationUsageType.CONSUMES_PRODUCES_LITERAL);
+
+
+    beanBase.getMessageDestinationRefs().add(messageDestRefBase);
+    beanToMerge.getMessageDestinationRefs().add(messageDestRefBase);
+
+    (new JNDIRefsMerger(beanBase, beanToMerge, 0)).process();
+
+    assertEquals(1, beanBase.getMessageDestinationRefs().size());
+    assertEquals("mapped1", ((MessageDestinationRef)beanBase.getMessageDestinationRefs().get(0)).getMappedName());
+    assertEquals("refName1", ((MessageDestinationRef)beanBase.getMessageDestinationRefs().get(0)).getMessageDestinationRefName());
+    assertEquals("type1", ((MessageDestinationRef)beanBase.getMessageDestinationRefs().get(0)).getMessageDestinationType());
+    assertEquals("link1", ((MessageDestinationRef)beanBase.getMessageDestinationRefs().get(0)).getMessageDestinationLink());
+    assertEquals(MessageDestinationUsageType.CONSUMES_LITERAL, ((MessageDestinationRef)beanBase.getMessageDestinationRefs().get(0)).getMessageDestinationUsage());
+
+  }
+
+  /**
+   *  Complex suffix means variety of information is present in base 
+   * and to merge: consistent information combined by base and toMerge
+   * should be available at the end.
+   * @throws Exception
+   */
+  //@Test
+  public void testMessageDestinationRefsComplex() throws Exception {
+    SessionBean beanBase = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean beanToMerge = EjbFactory.eINSTANCE.createSessionBean();
+
+    beanBase.setEjbName("name");
+    beanToMerge.setEjbName("name");
+
+    MessageDestinationRef messageDestRefBase = JavaeeFactory.eINSTANCE.createMessageDestinationRef();
+    messageDestRefBase.setMappedName("mapped1");
+    messageDestRefBase.setMessageDestinationRefName("refName1");
+    messageDestRefBase.setMessageDestinationType("type1");
+    messageDestRefBase.setMessageDestinationLink("link1");
+    messageDestRefBase.setMessageDestinationUsage(MessageDestinationUsageType.CONSUMES_LITERAL);
+
+    MessageDestinationRef messageDestRefMerge = JavaeeFactory.eINSTANCE.createMessageDestinationRef();
+    messageDestRefMerge.setMappedName("mapped2");
+    messageDestRefMerge.setMessageDestinationRefName("refName2");
+    messageDestRefMerge.setMessageDestinationType("type2");
+    messageDestRefMerge.setMessageDestinationLink("link2");
+    messageDestRefMerge.setMessageDestinationUsage(MessageDestinationUsageType.CONSUMES_PRODUCES_LITERAL);
+
+
+    beanBase.getMessageDestinationRefs().add(messageDestRefBase);
+    beanToMerge.getMessageDestinationRefs().add(messageDestRefBase);
+    beanToMerge.getMessageDestinationRefs().add(messageDestRefMerge);
+
+    (new JNDIRefsMerger(beanBase, beanToMerge, 0)).process();
+
+    assertEquals(2, beanBase.getMessageDestinationRefs().size());
+
+    MessageDestinationRef test = getMessageRef(beanBase.getMessageDestinationRefs(), "refName1");
+    MessageDestinationRef test2 = getMessageRef(beanBase.getMessageDestinationRefs(), "refName2");
+    assertEquals("mapped1", test.getMappedName());
+    assertEquals("type1", test.getMessageDestinationType());
+    assertEquals("link1", ((MessageDestinationRef)beanBase.getMessageDestinationRefs().get(0)).getMessageDestinationLink());
+    assertEquals(MessageDestinationUsageType.CONSUMES_LITERAL, ((MessageDestinationRef)beanBase.getMessageDestinationRefs().get(0)).getMessageDestinationUsage());
+
+    assertEquals("mapped2", test2.getMappedName());
+    assertEquals("type2", test2.getMessageDestinationType());
+    assertEquals("link2", test2.getMessageDestinationLink());
+    assertEquals(MessageDestinationUsageType.CONSUMES_PRODUCES_LITERAL, test2.getMessageDestinationUsage());
+
+  }
+
+  /**
+   * ComplexOverlapped suffix means variety of information is present 
+   * in base and to merge: consistent information combined by base and toMerge
+   * should be available at the end. There are artifacts with one and the same 
+   * name and different values: values should be merged into base.
+   * @throws Exception
+   */
+  //@Test
+  public void testMessageDestinationRefsComplexOverlapped() throws Exception {
+    SessionBean beanBase = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean beanToMerge = EjbFactory.eINSTANCE.createSessionBean();
+
+    beanBase.setEjbName("name");
+    beanToMerge.setEjbName("name");
+
+    MessageDestinationRef messageDestRefBase = JavaeeFactory.eINSTANCE.createMessageDestinationRef();
+    messageDestRefBase.setMessageDestinationRefName("refName1");
+
+    MessageDestinationRef messageDestRefMerge = JavaeeFactory.eINSTANCE.createMessageDestinationRef();
+    messageDestRefMerge.setMappedName("mapped2");
+    messageDestRefMerge.setMessageDestinationRefName("refName1");
+    messageDestRefMerge.setMessageDestinationType("type2");
+    messageDestRefMerge.setMessageDestinationLink("link2");
+    messageDestRefMerge.setMessageDestinationUsage(MessageDestinationUsageType.CONSUMES_PRODUCES_LITERAL);
+
+
+    beanBase.getMessageDestinationRefs().add(messageDestRefBase);
+    beanToMerge.getMessageDestinationRefs().add(messageDestRefBase);
+    beanToMerge.getMessageDestinationRefs().add(messageDestRefMerge);
+
+    (new JNDIRefsMerger(beanBase, beanToMerge, 0)).process();
+
+    assertEquals(1, beanBase.getMessageDestinationRefs().size());
+
+    MessageDestinationRef test = getMessageRef(beanBase.getMessageDestinationRefs(), "refName1");
+    assertEquals("type2", test.getMessageDestinationType());
+    assertEquals("mapped2", test.getMappedName());
+    assertEquals("link2", test.getMessageDestinationLink());
+    assertEquals(MessageDestinationUsageType.CONSUMES_PRODUCES_LITERAL, test.getMessageDestinationUsage());
+
+  }
+
+  private MessageDestinationRef getMessageRef(List refs, String name){
+    if (name == null){
+      return null;
+    }
+    for (Object object : refs) {
+      MessageDestinationRef ref = (MessageDestinationRef) object;
+      if(name.equals(ref.getMessageDestinationRefName())){
+        return ref; 
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Base suffix means that the base object has some info and 
+   * toMerge is empty: nothing should be merged
+   * @throws Exception
+   */
+  //@Test
+  public void testEjbRefsBase() throws Exception {
+    SessionBean beanBase = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean beanToMerge = EjbFactory.eINSTANCE.createSessionBean();
+
+    beanBase.setEjbName("name");
+    beanToMerge.setEjbName("name");
+
+    EjbRef ejbRefBase = JavaeeFactory.eINSTANCE.createEjbRef();
+    ejbRefBase.setMappedName("mapped1");
+    ejbRefBase.setEjbRefName("refName1");
+    ejbRefBase.setEjbRefType(EjbRefType.SESSION_LITERAL);
+    ejbRefBase.setEjbLink("link1");
+    ejbRefBase.setHome("home1");
+    ejbRefBase.setRemote("remote1");
+
+    EjbRef ejbRefToMerge = JavaeeFactory.eINSTANCE.createEjbRef();
+    ejbRefToMerge.setMappedName("mapped2");
+    ejbRefToMerge.setEjbRefName("refName2");
+    ejbRefToMerge.setEjbRefType(EjbRefType.ENTITY_LITERAL);
+    ejbRefToMerge.setEjbLink("link2");
+    ejbRefToMerge.setHome("home2");
+    ejbRefToMerge.setRemote("remote2");
+
+    beanBase.getEjbRefs().add(ejbRefBase);
+
+    (new JNDIRefsMerger(beanBase, beanToMerge, 0)).process();
+
+    assertEquals(1, beanBase.getEjbRefs().size());
+    assertEquals("mapped1", ((EjbRef)beanBase.getEjbRefs().get(0)).getMappedName());
+    assertEquals("refName1", ((EjbRef)beanBase.getEjbRefs().get(0)).getEjbRefName());
+    assertEquals(EjbRefType.SESSION_LITERAL, ((EjbRef)beanBase.getEjbRefs().get(0)).getEjbRefType());
+    assertEquals("link1", ((EjbRef)beanBase.getEjbRefs().get(0)).getEjbLink());
+    assertEquals("home1", ((EjbRef)beanBase.getEjbRefs().get(0)).getHome());
+    assertEquals("remote1", ((EjbRef)beanBase.getEjbRefs().get(0)).getRemote());
+  }
+
+  /**
+   * ToMerge suffix means that the base is empty object and 
+   * toMerge has some info: all from merge should be present in base.
+   * @throws Exception
+   */
+  //@Test
+  public void testEjbRefsMerge() throws Exception {
+    SessionBean beanBase = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean beanToMerge = EjbFactory.eINSTANCE.createSessionBean();
+
+    beanBase.setEjbName("name");
+    beanToMerge.setEjbName("name");
+
+    EjbRef ejbRefBase = JavaeeFactory.eINSTANCE.createEjbRef();
+    ejbRefBase.setMappedName("mapped1");
+    ejbRefBase.setEjbRefName("refName1");
+    ejbRefBase.setEjbRefType(EjbRefType.SESSION_LITERAL);
+    ejbRefBase.setEjbLink("link1");
+    ejbRefBase.setHome("home1");
+    ejbRefBase.setRemote("remote1");
+
+    EjbRef ejbRefToMerge = JavaeeFactory.eINSTANCE.createEjbRef();
+    ejbRefToMerge.setMappedName("mapped2");
+    ejbRefToMerge.setEjbRefName("refName2");
+    ejbRefToMerge.setEjbRefType(EjbRefType.ENTITY_LITERAL);
+    ejbRefToMerge.setEjbLink("link2");
+    ejbRefToMerge.setHome("home2");
+    ejbRefToMerge.setRemote("remote2");
+
+
+    beanToMerge.getEjbRefs().add(ejbRefBase);
+
+    (new JNDIRefsMerger(beanBase, beanToMerge, 0)).process();
+
+    assertEquals(1, beanBase.getEjbRefs().size());
+    assertEquals("mapped1", ((EjbRef)beanBase.getEjbRefs().get(0)).getMappedName());
+    assertEquals("refName1", ((EjbRef)beanBase.getEjbRefs().get(0)).getEjbRefName());
+    assertEquals(EjbRefType.SESSION_LITERAL, ((EjbRef)beanBase.getEjbRefs().get(0)).getEjbRefType());
+    assertEquals("link1", ((EjbRef)beanBase.getEjbRefs().get(0)).getEjbLink());
+    assertEquals("home1", ((EjbRef)beanBase.getEjbRefs().get(0)).getHome());
+    assertEquals("remote1", ((EjbRef)beanBase.getEjbRefs().get(0)).getRemote());
+  }
+
+  /**
+   *  Same suffix means that the information in merge and base is one 
+   * and the same: no merge should occurred and additional checks for 
+   * doubling of the elements are present.
+   * @throws Exception
+   */
+  //@Test
+  public void testEjbRefsSame() throws Exception {
+    SessionBean beanBase = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean beanToMerge = EjbFactory.eINSTANCE.createSessionBean();
+
+    beanBase.setEjbName("name");
+    beanToMerge.setEjbName("name");
+
+    EjbRef ejbRefBase = JavaeeFactory.eINSTANCE.createEjbRef();
+    ejbRefBase.setMappedName("mapped1");
+    ejbRefBase.setEjbRefName("refName1");
+    ejbRefBase.setEjbRefType(EjbRefType.SESSION_LITERAL);
+    ejbRefBase.setEjbLink("link1");
+    ejbRefBase.setHome("home1");
+    ejbRefBase.setRemote("remote1");
+
+    EjbRef ejbRefToMerge = JavaeeFactory.eINSTANCE.createEjbRef();
+    ejbRefToMerge.setMappedName("mapped2");
+    ejbRefToMerge.setEjbRefName("refName2");
+    ejbRefToMerge.setEjbRefType(EjbRefType.ENTITY_LITERAL);
+    ejbRefToMerge.setEjbLink("link2");
+    ejbRefToMerge.setHome("home2");
+    ejbRefToMerge.setRemote("remote2");
+
+
+    beanBase.getEjbRefs().add(ejbRefBase);
+    beanToMerge.getEjbRefs().add(ejbRefBase);
+
+    (new JNDIRefsMerger(beanBase, beanToMerge, 0)).process();
+
+    assertEquals(1, beanBase.getEjbRefs().size());
+    assertEquals("mapped1", ((EjbRef)beanBase.getEjbRefs().get(0)).getMappedName());
+    assertEquals("refName1", ((EjbRef)beanBase.getEjbRefs().get(0)).getEjbRefName());
+    assertEquals(EjbRefType.SESSION_LITERAL, ((EjbRef)beanBase.getEjbRefs().get(0)).getEjbRefType());
+    assertEquals("link1", ((EjbRef)beanBase.getEjbRefs().get(0)).getEjbLink());
+    assertEquals("home1", ((EjbRef)beanBase.getEjbRefs().get(0)).getHome());
+    assertEquals("remote1", ((EjbRef)beanBase.getEjbRefs().get(0)).getRemote());
+
+  }
+
+  /**
+   *  Complex suffix means variety of information is present in base 
+   * and to merge: consistent information combined by base and toMerge
+   * should be available at the end.
+   * @throws Exception
+   */
+  //@Test
+  public void testEjbRefsComplex() throws Exception {
+    SessionBean beanBase = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean beanToMerge = EjbFactory.eINSTANCE.createSessionBean();
+
+    beanBase.setEjbName("name");
+    beanToMerge.setEjbName("name");
+
+    EjbRef ejbRefBase = JavaeeFactory.eINSTANCE.createEjbRef();
+    ejbRefBase.setMappedName("mapped1");
+    ejbRefBase.setEjbRefName("refName1");
+    ejbRefBase.setEjbRefType(EjbRefType.SESSION_LITERAL);
+    ejbRefBase.setEjbLink("link1");
+    ejbRefBase.setHome("home1");
+    ejbRefBase.setRemote("remote1");
+
+    EjbRef ejbRefToMerge = JavaeeFactory.eINSTANCE.createEjbRef();
+    ejbRefToMerge.setMappedName("mapped2");
+    ejbRefToMerge.setEjbRefName("refName2");
+    ejbRefToMerge.setEjbRefType(EjbRefType.ENTITY_LITERAL);
+    ejbRefToMerge.setEjbLink("link2");
+    ejbRefToMerge.setHome("home2");
+    ejbRefToMerge.setRemote("remote2");
+
+
+    beanBase.getEjbRefs().add(ejbRefBase);
+    beanToMerge.getEjbRefs().add(ejbRefBase);
+    beanToMerge.getEjbRefs().add(ejbRefToMerge);
+
+    (new JNDIRefsMerger(beanBase, beanToMerge, 0)).process();
+
+    assertEquals(2, beanBase.getEjbRefs().size());
+
+    EjbRef test = getEjbRef(beanBase.getEjbRefs(), "refName1");
+    EjbRef test2 = getEjbRef(beanBase.getEjbRefs(), "refName2");
+    assertEquals("mapped1", test.getMappedName());
+    assertEquals(EjbRefType.SESSION_LITERAL, test.getEjbRefType());
+    assertEquals("link1", ((EjbRef)beanBase.getEjbRefs().get(0)).getEjbLink());
+    assertEquals("home1", test.getHome());
+    assertEquals("remote1", test.getRemote());
+
+    assertEquals("mapped2", test2.getMappedName());
+    assertEquals(EjbRefType.ENTITY_LITERAL, test2.getEjbRefType());
+    assertEquals("link2", test2.getEjbLink());
+    assertEquals("home2", test2.getHome());
+    assertEquals("remote2", test2.getRemote());
+
+  }
+
+  /**
+   * ComplexOverlapped suffix means variety of information is present 
+   * in base and to merge: consistent information combined by base and toMerge
+   * should be available at the end. There are artifacts with one and the same 
+   * name and different values: values should be merged into base.
+   * @throws Exception
+   */
+  //@Test
+  public void testEjbRefsComplexOverlapped() throws Exception {
+    SessionBean beanBase = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean beanToMerge = EjbFactory.eINSTANCE.createSessionBean();
+
+    SessionBean beanToLink = EjbFactory.eINSTANCE.createSessionBean();
+
+
+    beanBase.setEjbName("name");
+    beanToMerge.setEjbName("name");
+    beanToLink.setEjbName("name");
+
+    EjbRef ejbRefBase = JavaeeFactory.eINSTANCE.createEjbRef();
+    ejbRefBase.setEjbRefName("refName1");
+
+    EjbRef ejbRefToMerge = JavaeeFactory.eINSTANCE.createEjbRef();
+    ejbRefToMerge.setMappedName("mapped2");
+    ejbRefToMerge.setEjbRefName("refName1");
+    ejbRefToMerge.setEjbRefType(EjbRefType.SESSION_LITERAL);
+    ejbRefToMerge.setEjbLink("link2");
+    ejbRefToMerge.setHome("home2");
+    ejbRefToMerge.setRemote("remote2");
+
+
+    EjbRef ejbRefToLink = JavaeeFactory.eINSTANCE.createEjbRef();
+    ejbRefToLink.setEjbRefName("refName199");
+    ejbRefToLink.setEjbLink("link2");
+
+
+    beanBase.getEjbRefs().add(ejbRefBase);
+    beanToMerge.getEjbRefs().add(ejbRefBase);
+    beanToMerge.getEjbRefs().add(ejbRefToMerge);
+    beanToLink.getEjbRefs().add(ejbRefToLink);
+
+    (new JNDIRefsMerger(beanBase, beanToMerge, 0)).process();
+
+    assertEquals(1, beanBase.getEjbRefs().size());
+
+    EjbRef test = getEjbRef(beanBase.getEjbRefs(), "refName1");
+    assertEquals(EjbRefType.SESSION_LITERAL, test.getEjbRefType());
+    assertEquals("mapped2", test.getMappedName());
+    assertEquals("link2", test.getEjbLink());
+    assertEquals("home2", test.getHome());
+    assertEquals("remote2", test.getRemote());
+
+    (new JNDIRefsMerger(beanBase, beanToMerge, 0)).process();
+
+  }
+
+  private EjbRef getEjbRef(List refs, String name){
+    if (name == null){
+      return null;
+    }
+    for (Object object : refs) {
+      EjbRef ref = (EjbRef) object;
+      if(name.equals(ref.getEjbRefName())){
+        return ref; 
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Base suffix means that the base object has some info and 
+   * toMerge is empty: nothing should be merged
+   * @throws Exception
+   */
+  //@Test
+  public void testEjbLocalRefsBase() throws Exception {
+    SessionBean beanBase = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean beanToMerge = EjbFactory.eINSTANCE.createSessionBean();
+
+    beanBase.setEjbName("name");
+    beanToMerge.setEjbName("name");
+
+    EjbLocalRef ejbLocalRefBase = JavaeeFactory.eINSTANCE.createEjbLocalRef();
+    ejbLocalRefBase.setMappedName("mapped1");
+    ejbLocalRefBase.setEjbRefName("refName1");
+    ejbLocalRefBase.setEjbRefType(EjbRefType.SESSION_LITERAL);
+    ejbLocalRefBase.setEjbLink("link1");
+    ejbLocalRefBase.setLocalHome("home1");
+    ejbLocalRefBase.setLocal("remote1");
+
+    EjbLocalRef ejbLocalRefToMerge = JavaeeFactory.eINSTANCE.createEjbLocalRef();
+    ejbLocalRefToMerge.setMappedName("mapped2");
+    ejbLocalRefToMerge.setEjbRefName("refName2");
+    ejbLocalRefToMerge.setEjbRefType(EjbRefType.ENTITY_LITERAL);
+    ejbLocalRefToMerge.setEjbLink("link2");
+    ejbLocalRefToMerge.setLocalHome("home2");
+    ejbLocalRefToMerge.setLocal("remote2");
+
+    beanBase.getEjbLocalRefs().add(ejbLocalRefBase);
+
+    (new JNDIRefsMerger(beanBase, beanToMerge, 0)).process();
+
+    assertEquals(1, beanBase.getEjbLocalRefs().size());
+    assertEquals("mapped1", ((EjbLocalRef)beanBase.getEjbLocalRefs().get(0)).getMappedName());
+    assertEquals("refName1", ((EjbLocalRef)beanBase.getEjbLocalRefs().get(0)).getEjbRefName());
+    assertEquals(EjbRefType.SESSION_LITERAL, ((EjbLocalRef)beanBase.getEjbLocalRefs().get(0)).getEjbRefType());
+    assertEquals("link1", ((EjbLocalRef)beanBase.getEjbLocalRefs().get(0)).getEjbLink());
+    assertEquals("home1", ((EjbLocalRef)beanBase.getEjbLocalRefs().get(0)).getLocalHome());
+    assertEquals("remote1", ((EjbLocalRef)beanBase.getEjbLocalRefs().get(0)).getLocal());
+  }
+
+  /**
+   * ToMerge suffix means that the base is empty object and 
+   * toMerge has some info: all from merge should be present in base.
+   * @throws Exception
+   */
+  //@Test
+  public void testEjbLocalRefsMerge() throws Exception {
+    SessionBean beanBase = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean beanToMerge = EjbFactory.eINSTANCE.createSessionBean();
+
+    beanBase.setEjbName("name");
+    beanToMerge.setEjbName("name");
+
+    EjbLocalRef envRefBase = JavaeeFactory.eINSTANCE.createEjbLocalRef();
+    envRefBase.setMappedName("mapped1");
+    envRefBase.setEjbRefName("refName1");
+    envRefBase.setEjbRefType(EjbRefType.SESSION_LITERAL);
+    envRefBase.setEjbLink("link1");
+    envRefBase.setLocalHome("home1");
+    envRefBase.setLocal("remote1");
+
+    EjbLocalRef ejbLocalRefToMerge = JavaeeFactory.eINSTANCE.createEjbLocalRef();
+    ejbLocalRefToMerge.setMappedName("mapped2");
+    ejbLocalRefToMerge.setEjbRefName("refName2");
+    ejbLocalRefToMerge.setEjbRefType(EjbRefType.ENTITY_LITERAL);
+    ejbLocalRefToMerge.setEjbLink("link2");
+    ejbLocalRefToMerge.setLocalHome("home2");
+    ejbLocalRefToMerge.setLocal("remote2");
+
+
+    beanToMerge.getEjbLocalRefs().add(envRefBase);
+
+    (new JNDIRefsMerger(beanBase, beanToMerge, 0)).process();
+
+    assertEquals(1, beanBase.getEjbLocalRefs().size());
+    assertEquals("mapped1", ((EjbLocalRef)beanBase.getEjbLocalRefs().get(0)).getMappedName());
+    assertEquals("refName1", ((EjbLocalRef)beanBase.getEjbLocalRefs().get(0)).getEjbRefName());
+    assertEquals(EjbRefType.SESSION_LITERAL, ((EjbLocalRef)beanBase.getEjbLocalRefs().get(0)).getEjbRefType());
+    assertEquals("link1", ((EjbLocalRef)beanBase.getEjbLocalRefs().get(0)).getEjbLink());
+    assertEquals("home1", ((EjbLocalRef)beanBase.getEjbLocalRefs().get(0)).getLocalHome());
+    assertEquals("remote1", ((EjbLocalRef)beanBase.getEjbLocalRefs().get(0)).getLocal());
+  }
+
+  /**
+   *  Same suffix means that the information in merge and base is one 
+   * and the same: no merge should occurred and additional checks for 
+   * doubling of the elements are present.
+   * @throws Exception
+   */
+  //@Test
+  public void testEjbLocalRefsSame() throws Exception {
+    SessionBean beanBase = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean beanToMerge = EjbFactory.eINSTANCE.createSessionBean();
+
+    beanBase.setEjbName("name");
+    beanToMerge.setEjbName("name");
+
+    EjbLocalRef ejbLocalRefBase = JavaeeFactory.eINSTANCE.createEjbLocalRef();
+    ejbLocalRefBase.setMappedName("mapped1");
+    ejbLocalRefBase.setEjbRefName("refName1");
+    ejbLocalRefBase.setEjbRefType(EjbRefType.SESSION_LITERAL);
+    ejbLocalRefBase.setEjbLink("link1");
+    ejbLocalRefBase.setLocalHome("home1");
+    ejbLocalRefBase.setLocal("remote1");
+
+    EjbLocalRef ejbLocalRefToMerge = JavaeeFactory.eINSTANCE.createEjbLocalRef();
+    ejbLocalRefToMerge.setMappedName("mapped2");
+    ejbLocalRefToMerge.setEjbRefName("refName2");
+    ejbLocalRefToMerge.setEjbRefType(EjbRefType.ENTITY_LITERAL);
+    ejbLocalRefToMerge.setEjbLink("link2");
+    ejbLocalRefToMerge.setLocalHome("home2");
+    ejbLocalRefToMerge.setLocal("remote2");
+
+
+    beanBase.getEjbLocalRefs().add(ejbLocalRefBase);
+    beanToMerge.getEjbLocalRefs().add(ejbLocalRefBase);
+
+    (new JNDIRefsMerger(beanBase, beanToMerge, 0)).process();
+
+    assertEquals(1, beanBase.getEjbLocalRefs().size());
+    assertEquals("mapped1", ((EjbLocalRef)beanBase.getEjbLocalRefs().get(0)).getMappedName());
+    assertEquals("refName1", ((EjbLocalRef)beanBase.getEjbLocalRefs().get(0)).getEjbRefName());
+    assertEquals(EjbRefType.SESSION_LITERAL, ((EjbLocalRef)beanBase.getEjbLocalRefs().get(0)).getEjbRefType());
+    assertEquals("link1", ((EjbLocalRef)beanBase.getEjbLocalRefs().get(0)).getEjbLink());
+    assertEquals("home1", ((EjbLocalRef)beanBase.getEjbLocalRefs().get(0)).getLocalHome());
+    assertEquals("remote1", ((EjbLocalRef)beanBase.getEjbLocalRefs().get(0)).getLocal());
+
+  }
+
+  /**
+   *  Complex suffix means variety of information is present in base 
+   * and to merge: consistent information combined by base and toMerge
+   * should be available at the end.
+   * @throws Exception
+   */
+  //@Test
+  public void testEjbLocalRefsComplex() throws Exception {
+    SessionBean beanBase = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean beanToMerge = EjbFactory.eINSTANCE.createSessionBean();
+
+    beanBase.setEjbName("name");
+    beanToMerge.setEjbName("name");
+
+    EjbLocalRef ejbLocalRefBase = JavaeeFactory.eINSTANCE.createEjbLocalRef();
+    ejbLocalRefBase.setMappedName("mapped1");
+    ejbLocalRefBase.setEjbRefName("refName1");
+    ejbLocalRefBase.setEjbRefType(EjbRefType.SESSION_LITERAL);
+    ejbLocalRefBase.setEjbLink("link1");
+    ejbLocalRefBase.setLocalHome("home1");
+    ejbLocalRefBase.setLocal("remote1");
+
+    EjbLocalRef ejbLocalRefToMerge = JavaeeFactory.eINSTANCE.createEjbLocalRef();
+    ejbLocalRefToMerge.setMappedName("mapped2");
+    ejbLocalRefToMerge.setEjbRefName("refName2");
+    ejbLocalRefToMerge.setEjbRefType(EjbRefType.ENTITY_LITERAL);
+    ejbLocalRefToMerge.setEjbLink("link2");
+    ejbLocalRefToMerge.setLocalHome("home2");
+    ejbLocalRefToMerge.setLocal("remote2");
+
+
+    beanBase.getEjbLocalRefs().add(ejbLocalRefBase);
+    beanToMerge.getEjbLocalRefs().add(ejbLocalRefBase);
+    beanToMerge.getEjbLocalRefs().add(ejbLocalRefToMerge);
+
+    (new JNDIRefsMerger(beanBase, beanToMerge, 0)).process();
+
+    assertEquals(2, beanBase.getEjbLocalRefs().size());
+
+    EjbLocalRef test = getEjbLocalRef(beanBase.getEjbLocalRefs(), "refName1");
+    EjbLocalRef test2 = getEjbLocalRef(beanBase.getEjbLocalRefs(), "refName2");
+    assertEquals("mapped1", test.getMappedName());
+    assertEquals(EjbRefType.SESSION_LITERAL, test.getEjbRefType());
+    assertEquals("link1", ((EjbLocalRef)beanBase.getEjbLocalRefs().get(0)).getEjbLink());
+    assertEquals("home1", test.getLocalHome());
+    assertEquals("remote1", test.getLocal());
+
+    assertEquals("mapped2", test2.getMappedName());
+    assertEquals(EjbRefType.ENTITY_LITERAL, test2.getEjbRefType());
+    assertEquals("link2", test2.getEjbLink());
+    assertEquals("home2", test2.getLocalHome());
+    assertEquals("remote2", test2.getLocal());
+
+  }
+
+  /**
+   * ComplexOverlapped suffix means variety of information is present 
+   * in base and to merge: consistent information combined by base and toMerge
+   * should be available at the end. There are artifacts with one and the same 
+   * name and different values: values should be merged into base.
+   * @throws Exception
+   */
+  //@Test
+  public void testEjbLocalRefsComplexOverlapped() throws Exception {
+    SessionBean beanBase = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean beanToMerge = EjbFactory.eINSTANCE.createSessionBean();
+
+    SessionBean beanToLink = EjbFactory.eINSTANCE.createSessionBean();
+
+
+    beanBase.setEjbName("name");
+    beanToMerge.setEjbName("name");
+    beanToLink.setEjbName("name");
+
+    EjbLocalRef ejbLocalRefBase = JavaeeFactory.eINSTANCE.createEjbLocalRef();
+    ejbLocalRefBase.setEjbRefName("refName1");
+
+    EjbLocalRef ejbLocalRefToMerge = JavaeeFactory.eINSTANCE.createEjbLocalRef();
+    ejbLocalRefToMerge.setMappedName("mapped2");
+    ejbLocalRefToMerge.setEjbRefName("refName1");
+    ejbLocalRefToMerge.setEjbRefType(EjbRefType.SESSION_LITERAL);
+    ejbLocalRefToMerge.setEjbLink("link2");
+    ejbLocalRefToMerge.setLocalHome("home2");
+    ejbLocalRefToMerge.setLocal("remote2");
+
+
+    EjbLocalRef ejbLocalRefToLink = JavaeeFactory.eINSTANCE.createEjbLocalRef();
+    ejbLocalRefToLink.setEjbRefName("refName199");
+    ejbLocalRefToLink.setEjbLink("link2");
+
+
+    beanBase.getEjbLocalRefs().add(ejbLocalRefBase);
+    beanToMerge.getEjbLocalRefs().add(ejbLocalRefBase);
+    beanToMerge.getEjbLocalRefs().add(ejbLocalRefToMerge);
+    beanToLink.getEjbLocalRefs().add(ejbLocalRefToLink);
+
+    (new JNDIRefsMerger(beanBase, beanToMerge, 0)).process();
+
+    assertEquals(1, beanBase.getEjbLocalRefs().size());
+
+    EjbLocalRef test = getEjbLocalRef(beanBase.getEjbLocalRefs(), "refName1");
+    assertEquals(EjbRefType.SESSION_LITERAL, test.getEjbRefType());
+    assertEquals("mapped2", test.getMappedName());
+    assertEquals("link2", test.getEjbLink());
+    assertEquals("home2", test.getLocalHome());
+    assertEquals("remote2", test.getLocal());
+
+    (new JNDIRefsMerger(beanBase, beanToMerge, 0)).process();
+
+  }
+
+  private EjbLocalRef getEjbLocalRef(List refs, String name){
+    if (name == null){
+      return null;
+    }
+    for (Object object : refs) {
+      EjbLocalRef ref = (EjbLocalRef) object;
+      if(name.equals(ref.getEjbRefName())){
+        return ref; 
+      }
+    }
+    return null;
+  }
+
+
+  /**
+   * Base suffix means that the base object has some info and 
+   * toMerge is empty: nothing should be merged
+   * @throws Exception
+   */
+  //@Test
+  public void testEnvEntrysBase() throws Exception {
+    SessionBean beanBase = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean beanToMerge = EjbFactory.eINSTANCE.createSessionBean();
+
+    beanBase.setEjbName("name");
+    beanToMerge.setEjbName("name");
+
+    EnvEntry envEntryBase = JavaeeFactory.eINSTANCE.createEnvEntry();
+    envEntryBase.setMappedName("mapped1");
+    envEntryBase.setEnvEntryName("refName1");
+    envEntryBase.setEnvEntryType(EnvEntryType.JAVA_LANG_BOOLEAN_LITERAL);
+    envEntryBase.setEnvEntryValue("true");
+
+
+    EnvEntry envEntryMerge = JavaeeFactory.eINSTANCE.createEnvEntry();
+    envEntryMerge.setMappedName("mapped2");
+    envEntryMerge.setEnvEntryName("refName2");
+    envEntryMerge.setEnvEntryType(EnvEntryType.JAVA_LANG_BYTE_LITERAL);
+    envEntryMerge.setEnvEntryValue("00");
+
+    beanBase.getEnvEntries().add(envEntryBase);
+
+    (new JNDIRefsMerger(beanBase, beanToMerge, 0)).process();
+
+    assertEquals(1, beanBase.getEnvEntries().size());
+    assertEquals("mapped1", ((EnvEntry)beanBase.getEnvEntries().get(0)).getMappedName());
+    assertEquals("refName1", ((EnvEntry)beanBase.getEnvEntries().get(0)).getEnvEntryName());
+    assertEquals(EnvEntryType.JAVA_LANG_BOOLEAN_LITERAL.getLiteral(), ((EnvEntry)beanBase.getEnvEntries().get(0)).getEnvEntryType());
+    assertEquals("true", ((EnvEntry)beanBase.getEnvEntries().get(0)).getEnvEntryValue());
+  }
+
+  /**
+   * ToMerge suffix means that the base is empty object and 
+   * toMerge has some info: all from merge should be present in base.
+   * @throws Exception
+   */
+  //@Test
+  public void testEnvEntrysMerge() throws Exception {
+    SessionBean beanBase = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean beanToMerge = EjbFactory.eINSTANCE.createSessionBean();
+
+    beanBase.setEjbName("name");
+    beanToMerge.setEjbName("name");
+
+    EnvEntry envEntryBase = JavaeeFactory.eINSTANCE.createEnvEntry();
+    envEntryBase.setMappedName("mapped1");
+    envEntryBase.setEnvEntryName("refName1");
+    envEntryBase.setEnvEntryType(EnvEntryType.JAVA_LANG_BOOLEAN_LITERAL);
+    envEntryBase.setEnvEntryValue("true");
+
+    EnvEntry envEntryMerge = JavaeeFactory.eINSTANCE.createEnvEntry();
+    envEntryMerge.setMappedName("mapped2");
+    envEntryMerge.setEnvEntryName("refName2");
+    envEntryMerge.setEnvEntryType(EnvEntryType.JAVA_LANG_BYTE_LITERAL);
+    envEntryMerge.setEnvEntryValue("00");
+
+    beanToMerge.getEnvEntries().add(envEntryBase);
+
+    (new JNDIRefsMerger(beanBase, beanToMerge, 0)).process();
+
+    assertEquals(1, beanBase.getEnvEntries().size());
+    assertEquals("mapped1", ((EnvEntry)beanBase.getEnvEntries().get(0)).getMappedName());
+    assertEquals("refName1", ((EnvEntry)beanBase.getEnvEntries().get(0)).getEnvEntryName());
+    assertEquals(EnvEntryType.JAVA_LANG_BOOLEAN_LITERAL.getLiteral(), ((EnvEntry)beanBase.getEnvEntries().get(0)).getEnvEntryType());
+    assertEquals("true", ((EnvEntry)beanBase.getEnvEntries().get(0)).getEnvEntryValue());
+  }
+
+  /**
+   *  Same suffix means that the information in merge and base is one 
+   * and the same: no merge should occurred and additional checks for 
+   * doubling of the elements are present.
+   * @throws Exception
+   */
+  //@Test
+  public void testEnvEntrysSame() throws Exception {
+    SessionBean beanBase = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean beanToMerge = EjbFactory.eINSTANCE.createSessionBean();
+
+    beanBase.setEjbName("name");
+    beanToMerge.setEjbName("name");
+
+    EnvEntry envEntryBase = JavaeeFactory.eINSTANCE.createEnvEntry();
+    envEntryBase.setMappedName("mapped1");
+    envEntryBase.setEnvEntryName("refName1");
+    envEntryBase.setEnvEntryType(EnvEntryType.JAVA_LANG_BOOLEAN_LITERAL);
+    envEntryBase.setEnvEntryValue("true");
+
+
+    EnvEntry envEntryMerge = JavaeeFactory.eINSTANCE.createEnvEntry();
+    envEntryMerge.setMappedName("mapped2");
+    envEntryMerge.setEnvEntryName("refName2");
+    envEntryMerge.setEnvEntryType(EnvEntryType.JAVA_LANG_BYTE_LITERAL);
+    envEntryMerge.setEnvEntryValue("00");
+
+    beanBase.getEnvEntries().add(envEntryBase);
+    beanToMerge.getEnvEntries().add(envEntryBase);
+
+    (new JNDIRefsMerger(beanBase, beanToMerge, 0)).process();
+
+    assertEquals(1, beanBase.getEnvEntries().size());
+    assertEquals("mapped1", ((EnvEntry)beanBase.getEnvEntries().get(0)).getMappedName());
+    assertEquals("refName1", ((EnvEntry)beanBase.getEnvEntries().get(0)).getEnvEntryName());
+    assertEquals(EnvEntryType.JAVA_LANG_BOOLEAN_LITERAL.getLiteral(), ((EnvEntry)beanBase.getEnvEntries().get(0)).getEnvEntryType());
+    assertEquals("true", ((EnvEntry)beanBase.getEnvEntries().get(0)).getEnvEntryValue());
+
+  }
+
+  /**
+   *  Complex suffix means variety of information is present in base 
+   * and to merge: consistent information combined by base and toMerge
+   * should be available at the end.
+   * @throws Exception
+   */
+  //@Test
+  public void testEnvEntrysComplex() throws Exception {
+    SessionBean beanBase = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean beanToMerge = EjbFactory.eINSTANCE.createSessionBean();
+
+    beanBase.setEjbName("name");
+    beanToMerge.setEjbName("name");
+
+    EnvEntry envEntryBase = JavaeeFactory.eINSTANCE.createEnvEntry();
+    envEntryBase.setMappedName("mapped1");
+    envEntryBase.setEnvEntryName("refName1");
+    envEntryBase.setEnvEntryType(EnvEntryType.JAVA_LANG_BOOLEAN_LITERAL);
+    envEntryBase.setEnvEntryValue("true");
+
+    EnvEntry envEntryMerge = JavaeeFactory.eINSTANCE.createEnvEntry();
+    envEntryMerge.setMappedName("mapped2");
+    envEntryMerge.setEnvEntryName("refName2");
+    envEntryMerge.setEnvEntryType(EnvEntryType.JAVA_LANG_BYTE_LITERAL);
+    envEntryMerge.setEnvEntryValue("00");
+
+    beanBase.getEnvEntries().add(envEntryBase);
+    beanToMerge.getEnvEntries().add(envEntryBase);
+    beanToMerge.getEnvEntries().add(envEntryMerge);
+
+    (new JNDIRefsMerger(beanBase, beanToMerge, 0)).process();
+
+    assertEquals(2, beanBase.getEnvEntries().size());
+
+    EnvEntry test = getEnvEntry(beanBase.getEnvEntries(), "refName1");
+    EnvEntry test2 = getEnvEntry(beanBase.getEnvEntries(), "refName2");
+    assertEquals("mapped1", test.getMappedName());
+    assertEquals(EnvEntryType.JAVA_LANG_BOOLEAN_LITERAL.getLiteral(), test.getEnvEntryType());
+    assertEquals("true", test.getEnvEntryValue());
+
+    assertEquals("mapped2", test2.getMappedName());
+    assertEquals(EnvEntryType.JAVA_LANG_BYTE_LITERAL.getLiteral(), test2.getEnvEntryType());
+    assertEquals("00", test2.getEnvEntryValue());
+
+  }
+
+  /**
+   * ComplexOverlapped suffix means variety of information is present 
+   * in base and to merge: consistent information combined by base and toMerge
+   * should be available at the end. There are artifacts with one and the same 
+   * name and different values: values should be merged into base.
+   * @throws Exception
+   */
+  //@Test
+  public void testEnvEntrysComplexOverlapped() throws Exception {
+    SessionBean beanBase = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean beanToMerge = EjbFactory.eINSTANCE.createSessionBean();
+
+    beanBase.setEjbName("name");
+    beanToMerge.setEjbName("name");
+
+    EnvEntry envEntryBase = JavaeeFactory.eINSTANCE.createEnvEntry();
+    envEntryBase.setEnvEntryName("refName1");
+
+    EnvEntry envEntryMerge = JavaeeFactory.eINSTANCE.createEnvEntry();
+    envEntryMerge.setMappedName("mapped2");
+    envEntryMerge.setEnvEntryName("refName1");
+    envEntryMerge.setEnvEntryType(EnvEntryType.JAVA_LANG_BYTE_LITERAL);
+    envEntryMerge.setEnvEntryValue("00");
+
+    beanBase.getEnvEntries().add(envEntryBase);
+    beanToMerge.getEnvEntries().add(envEntryBase);
+    beanToMerge.getEnvEntries().add(envEntryMerge);
+
+    (new JNDIRefsMerger(beanBase, beanToMerge, 0)).process();
+
+    assertEquals(1, beanBase.getEnvEntries().size());
+
+    EnvEntry test = getEnvEntry(beanBase.getEnvEntries(), "refName1");
+    assertEquals(EnvEntryType.JAVA_LANG_BYTE_LITERAL.getLiteral(), test.getEnvEntryType());
+    assertEquals("mapped2", test.getMappedName());
+    assertEquals("00", test.getEnvEntryValue());
+
+  }
+
+  private EnvEntry getEnvEntry(List refs, String name){
+    if (name == null){
+      return null;
+    }
+    for (Object object : refs) {
+      EnvEntry ref = (EnvEntry) object;
+      if(name.equals(ref.getEnvEntryName())){
+        return ref; 
+      }
+    }
+    return null;
+  }
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/mergers/tests/MdbMergerTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/mergers/tests/MdbMergerTest.java
new file mode 100644
index 0000000..258e2af
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/mergers/tests/MdbMergerTest.java
@@ -0,0 +1,721 @@
+/***********************************************************************
+ * Copyright (c) 2008 by SAP AG, Walldorf. 
+ * 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:
+ *     SAP AG - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jst.jee.model.mergers.tests;
+
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.eclipse.jst.javaee.core.JavaeeFactory;
+import org.eclipse.jst.javaee.core.RunAs;
+import org.eclipse.jst.javaee.ejb.ActivationConfig;
+import org.eclipse.jst.javaee.ejb.ActivationConfigProperty;
+import org.eclipse.jst.javaee.ejb.EjbFactory;
+import org.eclipse.jst.javaee.ejb.MessageDrivenBean;
+import org.eclipse.jst.javaee.ejb.MethodParams;
+import org.eclipse.jst.javaee.ejb.NamedMethodType;
+import org.eclipse.jst.javaee.ejb.SecurityIdentityType;
+import org.eclipse.jst.javaee.ejb.TransactionType;
+import org.eclipse.jst.jee.model.internal.mergers.MessageDrivenBeanMerger;
+import org.eclipse.jst.jee.model.internal.mergers.ModelException;
+
+/**
+ * Tester class for MessageDrivenBean artifact.
+ * 
+ * Base suffix means that the base object has some info and 
+ * toMerge is empty: nothing should be merged
+ * 
+ * ToMerge suffix means that the base is empty object and 
+ * toMerge has some info: all from merge should be present in base.
+ * 
+ * Same suffix means that the information in merge and base is one 
+ * and the same: no merge should occurred and additional checks for 
+ * doubling of the elements are present.
+ * 
+ * Complex suffix means variety of information is present in base 
+ * and to merge: consistent information combined by base and toMerge
+ * should be available at the end.
+ * 
+ * ComplexOverlapped suffix means variety of information is present 
+ * in base and to merge: consistent information combined by base and toMerge
+ * should be available at the end. There are artifacts with one and the same 
+ * name and different values: values should be merged into base.
+ *  
+ * 
+ * @author Dimitar Giormov
+ *
+ */
+public class MdbMergerTest extends TestCase {
+
+
+  /**
+   * 
+   * Complex suffix means variety of information is present in base 
+   * and to merge: consistent information combined by base and toMerge
+   * should be available at the end.
+   * @throws ModelException
+   */
+  //@Test
+  public void testActivationConfigPropComplex() throws ModelException{
+    MessageDrivenBean mdbBean = EjbFactory.eINSTANCE.createMessageDrivenBean();
+    MessageDrivenBean mdbBean1 = EjbFactory.eINSTANCE.createMessageDrivenBean();
+    mdbBean.setEjbName("name");
+    mdbBean1.setEjbName("name");
+
+    ActivationConfig base = EjbFactory.eINSTANCE.createActivationConfig();
+    mdbBean.setActivationConfig(base);
+    ActivationConfig merge = EjbFactory.eINSTANCE.createActivationConfig();
+    mdbBean1.setActivationConfig(merge);
+    ActivationConfigProperty property = EjbFactory.eINSTANCE.createActivationConfigProperty();
+    property.setActivationConfigPropertyName("n1");
+    property.setActivationConfigPropertyValue("v1");
+    base.getActivationConfigProperties().add(property);
+
+    ActivationConfigProperty property1 = EjbFactory.eINSTANCE.createActivationConfigProperty();
+    property1.setActivationConfigPropertyName("n2");
+    property1.setActivationConfigPropertyValue("v2");
+    base.getActivationConfigProperties().add(property1);
+
+    ActivationConfigProperty property2 = EjbFactory.eINSTANCE.createActivationConfigProperty();
+    property2.setActivationConfigPropertyName("n3");
+    property2.setActivationConfigPropertyValue("v3");
+    base.getActivationConfigProperties().add(property2);
+
+    ActivationConfigProperty property3 = EjbFactory.eINSTANCE.createActivationConfigProperty();
+    property3.setActivationConfigPropertyName("n3");
+    property3.setActivationConfigPropertyValue("v1");
+    merge.getActivationConfigProperties().add(property3);
+
+    ActivationConfigProperty property4 = EjbFactory.eINSTANCE.createActivationConfigProperty();
+    property4.setActivationConfigPropertyName("n4");
+    property4.setActivationConfigPropertyValue("v4");
+    merge.getActivationConfigProperties().add(property4);
+    ActivationConfigProperty property5 = EjbFactory.eINSTANCE.createActivationConfigProperty();
+    property5.setActivationConfigPropertyName("n5");
+    property5.setActivationConfigPropertyValue("v6");
+    merge.getActivationConfigProperties().add(property5);
+
+    ActivationConfigProperty property6 = EjbFactory.eINSTANCE.createActivationConfigProperty();
+    property6.setActivationConfigPropertyName("n6");
+    property6.setActivationConfigPropertyValue("v6");
+    base.getActivationConfigProperties().add(property6);
+
+    (new MessageDrivenBeanMerger(mdbBean, mdbBean1, 0)).process();
+
+    assertEquals(mdbBean.getActivationConfig().getActivationConfigProperties().size(), 6);
+    assertEquals(mdbBean1.getActivationConfig().getActivationConfigProperties().size(), 3);
+    assertTrue(checkActivationConfProp("n1", "v1", base.getActivationConfigProperties()));
+    assertTrue(checkActivationConfProp("n2", "v2", base.getActivationConfigProperties()));
+    assertTrue(checkActivationConfProp("n3", "v3", base.getActivationConfigProperties()));
+    assertTrue(checkActivationConfProp("n4", "v4", base.getActivationConfigProperties()));
+    assertTrue(checkActivationConfProp("n5", "v6", base.getActivationConfigProperties()));
+    assertTrue(checkActivationConfProp("n6", "v6", base.getActivationConfigProperties()));
+
+  }
+
+
+  /**
+   * 
+   * Complex suffix means variety of information is present in base 
+   * and to merge: consistent information combined by base and toMerge
+   * should be available at the end.
+   * @throws ModelException
+   */
+  //@Test
+  public void testActivationConfigPropComplex2() throws ModelException{
+    MessageDrivenBean mdbBean = EjbFactory.eINSTANCE.createMessageDrivenBean();
+    MessageDrivenBean mdbBean1 = EjbFactory.eINSTANCE.createMessageDrivenBean();
+    mdbBean.setEjbName("name");
+    mdbBean1.setEjbName("name");
+
+    ActivationConfig base = EjbFactory.eINSTANCE.createActivationConfig();
+    mdbBean.setActivationConfig(base);
+    ActivationConfig merge = EjbFactory.eINSTANCE.createActivationConfig();
+    mdbBean1.setActivationConfig(merge);
+    ActivationConfigProperty property = EjbFactory.eINSTANCE.createActivationConfigProperty();
+    property.setActivationConfigPropertyName("n1");
+    property.setActivationConfigPropertyValue("v1");
+    base.getActivationConfigProperties().add(property);
+
+    ActivationConfigProperty property1 = EjbFactory.eINSTANCE.createActivationConfigProperty();
+    property1.setActivationConfigPropertyName("n2");
+    property1.setActivationConfigPropertyValue("v2");
+    base.getActivationConfigProperties().add(property1);
+
+    ActivationConfigProperty property2 = EjbFactory.eINSTANCE.createActivationConfigProperty();
+    property2.setActivationConfigPropertyName("n3");
+    property2.setActivationConfigPropertyValue("v3");
+    base.getActivationConfigProperties().add(property2);
+
+    ActivationConfigProperty property3 = EjbFactory.eINSTANCE.createActivationConfigProperty();
+    property3.setActivationConfigPropertyName("n3");
+    property3.setActivationConfigPropertyValue("v1");
+    merge.getActivationConfigProperties().add(property3);
+
+    ActivationConfigProperty property4 = EjbFactory.eINSTANCE.createActivationConfigProperty();
+    property4.setActivationConfigPropertyName("n4");
+    property4.setActivationConfigPropertyValue("v4");
+    merge.getActivationConfigProperties().add(property4);
+    ActivationConfigProperty property5 = EjbFactory.eINSTANCE.createActivationConfigProperty();
+    property5.setActivationConfigPropertyName("n5");
+    property5.setActivationConfigPropertyValue("v6");
+    merge.getActivationConfigProperties().add(property5);
+
+    ActivationConfigProperty property6 = EjbFactory.eINSTANCE.createActivationConfigProperty();
+    property6.setActivationConfigPropertyName("n6");
+    property6.setActivationConfigPropertyValue("v6");
+    base.getActivationConfigProperties().add(property6);
+
+    (new MessageDrivenBeanMerger(mdbBean1, mdbBean, 0)).process();
+
+    assertEquals(mdbBean.getActivationConfig().getActivationConfigProperties().size(), 4);
+    assertEquals(mdbBean1.getActivationConfig().getActivationConfigProperties().size(), 6);
+    assertTrue(checkActivationConfProp("n1", "v1", merge.getActivationConfigProperties()));
+    assertTrue(checkActivationConfProp("n2", "v2", merge.getActivationConfigProperties()));
+    assertTrue(checkActivationConfProp("n3", "v1", merge.getActivationConfigProperties()));
+    assertTrue(checkActivationConfProp("n4", "v4", merge.getActivationConfigProperties()));
+    assertTrue(checkActivationConfProp("n5", "v6", merge.getActivationConfigProperties()));
+    assertTrue(checkActivationConfProp("n6", "v6", merge.getActivationConfigProperties()));
+
+  }
+
+  private boolean checkActivationConfProp(String key, String value, List properties){
+    for (Object acProp : properties) {
+      ActivationConfigProperty p = (ActivationConfigProperty) acProp;
+      if (p.getActivationConfigPropertyName().equals(key) && p.getActivationConfigPropertyValue().equals(value)){
+        return true;
+      }
+    }
+    return false;
+
+  }
+
+
+
+  /**
+   * 
+   * Base suffix means that the base object has some info and 
+   * toMerge is empty: nothing should be merged
+   * @throws ModelException
+   */
+  //@Test
+  public void testActivationConfigPropBase() throws ModelException{
+    MessageDrivenBean mdbBean = EjbFactory.eINSTANCE.createMessageDrivenBean();
+    MessageDrivenBean mdbBean1 = EjbFactory.eINSTANCE.createMessageDrivenBean();
+    mdbBean.setEjbName("name");
+    mdbBean1.setEjbName("name");
+
+    ActivationConfig base = EjbFactory.eINSTANCE.createActivationConfig();
+    mdbBean.setActivationConfig(base);
+    ActivationConfig merge = EjbFactory.eINSTANCE.createActivationConfig();
+    mdbBean1.setActivationConfig(merge);
+    ActivationConfigProperty property = EjbFactory.eINSTANCE.createActivationConfigProperty();
+    property.setActivationConfigPropertyName("n1");
+    property.setActivationConfigPropertyValue("v1");
+    base.getActivationConfigProperties().add(property);
+
+
+    (new MessageDrivenBeanMerger(mdbBean, mdbBean1, 0)).process();
+
+    assertEquals(mdbBean.getActivationConfig().getActivationConfigProperties().size(), 1);
+    assertEquals(mdbBean1.getActivationConfig().getActivationConfigProperties().size(), 0);
+    assertTrue(checkActivationConfProp("n1", "v1", base.getActivationConfigProperties()));
+
+  }
+
+  /**
+   * ToMerge suffix means that the base is empty object and 
+   * toMerge has some info: all from merge should be present in base.
+   * @throws ModelException
+   */
+  //@Test
+  public void testActivationConfigPropMerge() throws ModelException{
+    MessageDrivenBean mdbBean = EjbFactory.eINSTANCE.createMessageDrivenBean();
+    MessageDrivenBean mdbBean1 = EjbFactory.eINSTANCE.createMessageDrivenBean();
+    mdbBean.setEjbName("name");
+    mdbBean1.setEjbName("name");
+
+    ActivationConfig base = EjbFactory.eINSTANCE.createActivationConfig();
+    mdbBean.setActivationConfig(base);
+    ActivationConfig merge = EjbFactory.eINSTANCE.createActivationConfig();
+    mdbBean1.setActivationConfig(merge);
+    ActivationConfigProperty property = EjbFactory.eINSTANCE.createActivationConfigProperty();
+    property.setActivationConfigPropertyName("n1");
+    property.setActivationConfigPropertyValue("v1");
+    merge.getActivationConfigProperties().add(property);
+
+
+    (new MessageDrivenBeanMerger(mdbBean, mdbBean1, 0)).process();
+
+    assertEquals(mdbBean.getActivationConfig().getActivationConfigProperties().size(), 1);
+    assertEquals(mdbBean1.getActivationConfig().getActivationConfigProperties().size(), 1);
+    assertTrue(checkActivationConfProp("n1", "v1", base.getActivationConfigProperties()));
+
+  }
+
+  /**
+   *  Same suffix means that the information in merge and base is one 
+   * and the same: no merge should occurred and additional checks for 
+   * doubling of the elements are present.
+   * @throws ModelException
+   */
+  //@Test
+  public void testActivationConfigPropSameBean() throws ModelException{
+    MessageDrivenBean mdbBean = EjbFactory.eINSTANCE.createMessageDrivenBean();
+    MessageDrivenBean mdbBean1 = EjbFactory.eINSTANCE.createMessageDrivenBean();
+    mdbBean.setEjbName("name");
+    mdbBean1.setEjbName("name");
+
+    ActivationConfig base = EjbFactory.eINSTANCE.createActivationConfig();
+    mdbBean.setActivationConfig(base);
+    ActivationConfig merge = EjbFactory.eINSTANCE.createActivationConfig();
+    mdbBean1.setActivationConfig(merge);
+    ActivationConfigProperty property = EjbFactory.eINSTANCE.createActivationConfigProperty();
+    property.setActivationConfigPropertyName("n1");
+    property.setActivationConfigPropertyValue("v1");
+    base.getActivationConfigProperties().add(property);
+    merge.getActivationConfigProperties().add(property);
+
+    (new MessageDrivenBeanMerger(mdbBean, mdbBean1, 0)).process();
+
+    assertEquals(mdbBean.getActivationConfig().getActivationConfigProperties().size(), 1);
+    assertEquals(mdbBean1.getActivationConfig().getActivationConfigProperties().size(), 1);
+    assertTrue(checkActivationConfProp("n1", "v1", base.getActivationConfigProperties()));
+
+  }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  //Timeout
+  /**
+   * Complex suffix means variety of information is present in base 
+   * and to merge: consistent information combined by base and toMerge
+   * should be available at the end.
+   * @throws ModelException
+   */
+  //@Test
+  public void testTimeOutComplexNoParams() throws ModelException{
+    MessageDrivenBean mdbBean = EjbFactory.eINSTANCE.createMessageDrivenBean();
+    MessageDrivenBean mdbBean1 = EjbFactory.eINSTANCE.createMessageDrivenBean();
+    mdbBean.setEjbName("name");
+    mdbBean1.setEjbName("name");
+
+
+    NamedMethodType base = EjbFactory.eINSTANCE.createNamedMethodType();
+    String value = "getMethod";
+    base.setMethodName(value);
+
+    mdbBean.setTimeoutMethod(base);
+
+    (new MessageDrivenBeanMerger(mdbBean, mdbBean1, 0)).process();
+
+    assertNotNull(mdbBean.getTimeoutMethod());
+    assertNotNull(mdbBean.getTimeoutMethod().getMethodName().equals(value));
+    assertNull(mdbBean.getTimeoutMethod().getMethodParams());
+
+
+  }
+
+  /**
+   * Complex suffix means variety of information is present in base 
+   * and to merge: consistent information combined by base and toMerge
+   * should be available at the end.
+   * @throws ModelException
+   */
+  //@Test
+  public void testTimeOutComplexWithParams() throws ModelException{
+    MessageDrivenBean mdbBean = EjbFactory.eINSTANCE.createMessageDrivenBean();
+    MessageDrivenBean mdbBean1 = EjbFactory.eINSTANCE.createMessageDrivenBean();
+    mdbBean.setEjbName("name");
+    mdbBean1.setEjbName("name");
+
+
+    NamedMethodType base = EjbFactory.eINSTANCE.createNamedMethodType();
+    String value = "getMethod";
+    base.setMethodName(value);
+    MethodParams params = EjbFactory.eINSTANCE.createMethodParams();
+    params.getMethodParams().add("java.lang.String");
+    base.setMethodParams(params);
+
+    NamedMethodType merge = EjbFactory.eINSTANCE.createNamedMethodType();
+    merge.setMethodName(value);
+
+    mdbBean.setTimeoutMethod(base);
+    mdbBean1.setTimeoutMethod(merge);
+
+    (new MessageDrivenBeanMerger(mdbBean, mdbBean1, 0)).process();
+
+    assertNotNull(mdbBean.getTimeoutMethod());
+    assertNotNull(mdbBean.getTimeoutMethod().getMethodName().equals(value));
+    assertNotNull(mdbBean.getTimeoutMethod().getMethodParams());
+    assertEquals(1, mdbBean.getTimeoutMethod().getMethodParams().getMethodParams().size());
+
+  }
+
+  /**
+   * Complex suffix means variety of information is present in base 
+   * and to merge: consistent information combined by base and toMerge
+   * should be available at the end.
+   * @throws ModelException
+   */
+  //@Test
+  public void testTimeOutComplexWithParams2() throws ModelException{
+    MessageDrivenBean mdbBean = EjbFactory.eINSTANCE.createMessageDrivenBean();
+    MessageDrivenBean mdbBean1 = EjbFactory.eINSTANCE.createMessageDrivenBean();
+    mdbBean.setEjbName("name");
+    mdbBean1.setEjbName("name");
+
+
+    NamedMethodType base = EjbFactory.eINSTANCE.createNamedMethodType();
+    String value = "getMethod";
+    base.setMethodName(value);
+    MethodParams params = EjbFactory.eINSTANCE.createMethodParams();
+    String string = "java.lang.String";
+    params.getMethodParams().add(string);
+    base.setMethodParams(params);
+
+    NamedMethodType merge = EjbFactory.eINSTANCE.createNamedMethodType();
+    merge.setMethodName(value);
+
+    mdbBean.setTimeoutMethod(base);
+    mdbBean1.setTimeoutMethod(merge);
+
+    (new MessageDrivenBeanMerger(mdbBean1, mdbBean, 0)).process();
+
+    assertNotNull(mdbBean.getTimeoutMethod());
+    assertNotNull(mdbBean.getTimeoutMethod().getMethodName().equals(value));
+    assertNotNull(mdbBean.getTimeoutMethod().getMethodParams());
+    assertNotNull(mdbBean.getTimeoutMethod().getMethodParams().getMethodParams().get(0).equals(string));
+
+  }
+
+  /**
+   * 
+   * Base suffix means that the base object has some info and 
+   * toMerge is empty: nothing should be merged
+   * @throws ModelException
+   */
+  //@Test
+  public void testTimeOutBase() throws ModelException{
+    MessageDrivenBean mdbBean = EjbFactory.eINSTANCE.createMessageDrivenBean();
+    MessageDrivenBean mdbBean1 = EjbFactory.eINSTANCE.createMessageDrivenBean();
+    mdbBean.setEjbName("name");
+    mdbBean1.setEjbName("name");
+
+
+    NamedMethodType base = EjbFactory.eINSTANCE.createNamedMethodType();
+    String value = "getMethod";
+    base.setMethodName(value);
+    MethodParams params = EjbFactory.eINSTANCE.createMethodParams();
+    String string = "java.lang.String";
+    params.getMethodParams().add(string);
+    base.setMethodParams(params);
+
+    mdbBean.setTimeoutMethod(base);
+
+    (new MessageDrivenBeanMerger(mdbBean, mdbBean1, 0)).process();
+
+    assertNotNull(mdbBean.getTimeoutMethod());
+    assertNotNull(mdbBean.getTimeoutMethod().getMethodName().equals(value));
+    assertNotNull(mdbBean.getTimeoutMethod().getMethodParams());
+    assertNotNull(mdbBean.getTimeoutMethod().getMethodParams().getMethodParams().get(0).equals(string));
+
+  }
+
+  /**
+   * ToMerge suffix means that the base is empty object and 
+   * toMerge has some info: all from merge should be present in base.
+   * @throws ModelException
+   */
+  //@Test
+  public void testTimeOutMerge() throws ModelException{
+    MessageDrivenBean mdbBean = EjbFactory.eINSTANCE.createMessageDrivenBean();
+    MessageDrivenBean mdbBean1 = EjbFactory.eINSTANCE.createMessageDrivenBean();
+    mdbBean.setEjbName("name");
+    mdbBean1.setEjbName("name");
+
+
+    NamedMethodType base = EjbFactory.eINSTANCE.createNamedMethodType();
+    String value = "getMethod";
+    base.setMethodName(value);
+    MethodParams params = EjbFactory.eINSTANCE.createMethodParams();
+    String string = "java.lang.String";
+    params.getMethodParams().add(string);
+    base.setMethodParams(params);
+
+    mdbBean.setTimeoutMethod(base);
+
+    (new MessageDrivenBeanMerger(mdbBean1, mdbBean, 0)).process();
+
+    assertNotNull(mdbBean.getTimeoutMethod());
+    assertNotNull(mdbBean1.getTimeoutMethod());
+    assertNotNull(mdbBean1.getTimeoutMethod().getMethodName().equals(value));
+    assertNotNull(mdbBean1.getTimeoutMethod().getMethodParams());
+    assertNotNull(mdbBean1.getTimeoutMethod().getMethodParams().getMethodParams().get(0).equals(string));   
+  }
+
+  /**
+   * 
+   * Base suffix means that the base object has some info and 
+   * toMerge is empty: nothing should be merged
+   * @throws ModelException
+   */
+  //@Test
+  public void testSecurityIdentityBase() throws ModelException{
+    MessageDrivenBean mdbBean = EjbFactory.eINSTANCE.createMessageDrivenBean();
+    MessageDrivenBean mdbBean1 = EjbFactory.eINSTANCE.createMessageDrivenBean();
+    mdbBean.setEjbName("name");
+    mdbBean1.setEjbName("name");
+    SecurityIdentityType type = EjbFactory.eINSTANCE.createSecurityIdentityType();
+    type.setUseCallerIdentity(JavaeeFactory.eINSTANCE.createEmptyType());
+    mdbBean1.setSecurityIdentity(type);
+
+    (new MessageDrivenBeanMerger(mdbBean1, mdbBean, 0)).process();
+    assertNotNull(mdbBean1.getSecurityIdentity().getUseCallerIdentity());
+
+  }
+
+  /**
+   * ToMerge suffix means that the base is empty object and 
+   * toMerge has some info: all from merge should be present in base.
+   * @throws ModelException
+   */
+  //@Test
+  public void testSecurityIdentityMerge() throws ModelException{
+    MessageDrivenBean mdbBean = EjbFactory.eINSTANCE.createMessageDrivenBean();
+    MessageDrivenBean mdbBean1 = EjbFactory.eINSTANCE.createMessageDrivenBean();
+    mdbBean.setEjbName("name");
+    mdbBean1.setEjbName("name");
+    SecurityIdentityType type = EjbFactory.eINSTANCE.createSecurityIdentityType();
+    type.setUseCallerIdentity(JavaeeFactory.eINSTANCE.createEmptyType());
+    mdbBean1.setSecurityIdentity(type);
+
+    (new MessageDrivenBeanMerger(mdbBean, mdbBean1, 0)).process();
+    assertNotNull(mdbBean.getSecurityIdentity().getUseCallerIdentity());    
+  }
+
+  /**
+   *  Same suffix means that the information in merge and base is one 
+   * and the same: no merge should occurred and additional checks for 
+   * doubling of the elements are present.
+   * @throws ModelException
+   */
+  //@Test
+  public void testSecurityIdentitySame() throws ModelException{
+    MessageDrivenBean mdbBean = EjbFactory.eINSTANCE.createMessageDrivenBean();
+    MessageDrivenBean mdbBean1 = EjbFactory.eINSTANCE.createMessageDrivenBean();
+    mdbBean.setEjbName("name");
+    mdbBean1.setEjbName("name");
+    SecurityIdentityType type = EjbFactory.eINSTANCE.createSecurityIdentityType();
+    type.setUseCallerIdentity(JavaeeFactory.eINSTANCE.createEmptyType());
+    mdbBean1.setSecurityIdentity(type);
+    mdbBean.setSecurityIdentity(type);
+
+    (new MessageDrivenBeanMerger(mdbBean, mdbBean1, 0)).process();
+    assertNotNull(mdbBean.getSecurityIdentity().getUseCallerIdentity());
+
+  }
+
+  /**
+   * Complex suffix means variety of information is present in base 
+   * and to merge: consistent information combined by base and toMerge
+   * should be available at the end.
+   * @throws ModelException
+   */
+  //@Test
+  public void testSecurityIdentityComplex() throws ModelException{
+    MessageDrivenBean mdbBean = EjbFactory.eINSTANCE.createMessageDrivenBean();
+    MessageDrivenBean mdbBean1 = EjbFactory.eINSTANCE.createMessageDrivenBean();
+    mdbBean.setEjbName("name");
+    mdbBean1.setEjbName("name");
+    SecurityIdentityType type = EjbFactory.eINSTANCE.createSecurityIdentityType();
+    type.setUseCallerIdentity(JavaeeFactory.eINSTANCE.createEmptyType());
+
+    SecurityIdentityType type2 = EjbFactory.eINSTANCE.createSecurityIdentityType();
+    RunAs createRunAs = JavaeeFactory.eINSTANCE.createRunAs();
+    createRunAs.setRoleName("ttt");
+    type2.setRunAs(createRunAs);
+
+    mdbBean1.setSecurityIdentity(type);
+    mdbBean.setSecurityIdentity(type2);
+
+    (new MessageDrivenBeanMerger(mdbBean, mdbBean1, 0)).process();
+    assertNull(mdbBean.getSecurityIdentity().getUseCallerIdentity());
+    assertNotNull(mdbBean.getSecurityIdentity().getRunAs().getRoleName());
+
+
+  }
+
+
+  /**
+   * Base suffix means that the base object has some info and 
+   * toMerge is empty: nothing should be merged
+   * @throws ModelException
+   */
+  //@Test
+  public void testTransactionTypeBase() throws ModelException{
+    MessageDrivenBean mdbBean = EjbFactory.eINSTANCE.createMessageDrivenBean();
+    MessageDrivenBean mdbBean1 = EjbFactory.eINSTANCE.createMessageDrivenBean();
+    mdbBean.setEjbName("name");
+    mdbBean1.setEjbName("name");
+    mdbBean1.setTransactionType(TransactionType.BEAN_LITERAL);
+
+    (new MessageDrivenBeanMerger(mdbBean1, mdbBean, 0)).process();
+    assertEquals(TransactionType.BEAN_LITERAL, mdbBean1.getTransactionType());
+
+  }
+
+  /**
+   * ToMerge suffix means that the base is empty object and 
+   * toMerge has some info: all from merge should be present in base.
+   * @throws ModelException
+   */
+  //@Test
+  public void testTransactionTypeMerge() throws ModelException{
+    MessageDrivenBean mdbBean = EjbFactory.eINSTANCE.createMessageDrivenBean();
+    MessageDrivenBean mdbBean1 = EjbFactory.eINSTANCE.createMessageDrivenBean();
+    mdbBean.setEjbName("name");
+    mdbBean1.setEjbName("name");
+    mdbBean.setTransactionType(TransactionType.BEAN_LITERAL);
+
+    (new MessageDrivenBeanMerger(mdbBean1, mdbBean, 0)).process();
+    assertEquals(TransactionType.BEAN_LITERAL, mdbBean1.getTransactionType());    
+  }
+
+  /**
+   *  Same suffix means that the information in merge and base is one 
+   * and the same: no merge should occurred and additional checks for 
+   * doubling of the elements are present.
+   * @throws ModelException
+   */
+  //@Test
+  public void testTransactionTypeSame() throws ModelException{
+    MessageDrivenBean mdbBean = EjbFactory.eINSTANCE.createMessageDrivenBean();
+    MessageDrivenBean mdbBean1 = EjbFactory.eINSTANCE.createMessageDrivenBean();
+    mdbBean.setEjbName("name");
+    mdbBean1.setEjbName("name");
+    mdbBean1.setTransactionType(TransactionType.BEAN_LITERAL);
+    mdbBean.setTransactionType(TransactionType.BEAN_LITERAL);
+    (new MessageDrivenBeanMerger(mdbBean1, mdbBean, 0)).process();
+    assertEquals(TransactionType.BEAN_LITERAL, mdbBean1.getTransactionType());     
+  }
+
+  /**
+   * Complex suffix means variety of information is present in base 
+   * and to merge: consistent information combined by base and toMerge
+   * should be available at the end.
+   * @throws ModelException
+   */
+  //@Test
+  public void testTransactionTypeComplex() throws ModelException{
+    MessageDrivenBean mdbBean = EjbFactory.eINSTANCE.createMessageDrivenBean();
+    MessageDrivenBean mdbBean1 = EjbFactory.eINSTANCE.createMessageDrivenBean();
+    mdbBean.setEjbName("name");
+    mdbBean1.setEjbName("name");
+    mdbBean1.setTransactionType(TransactionType.CONTAINER_LITERAL);
+    mdbBean.setTransactionType(TransactionType.BEAN_LITERAL);
+    (new MessageDrivenBeanMerger(mdbBean1, mdbBean, 0)).process();
+    assertEquals(TransactionType.CONTAINER_LITERAL, mdbBean1.getTransactionType());
+
+  }
+
+
+  /**
+   * 
+   * Base suffix means that the base object has some info and 
+   * toMerge is empty: nothing should be merged
+   * @throws ModelException
+   */
+  //@Test
+  public void testMessagingTypeBase() throws ModelException{
+    MessageDrivenBean mdbBean = EjbFactory.eINSTANCE.createMessageDrivenBean();
+    MessageDrivenBean mdbBean1 = EjbFactory.eINSTANCE.createMessageDrivenBean();
+    mdbBean.setEjbName("name");
+    mdbBean1.setEjbName("name");
+    mdbBean1.setMessagingType("test");
+
+    (new MessageDrivenBeanMerger(mdbBean1, mdbBean, 0)).process();
+    assertEquals("test", mdbBean1.getMessagingType());
+
+  }
+
+  /**
+   * ToMerge suffix means that the base is empty object and 
+   * toMerge has some info: all from merge should be present in base.
+   * @throws ModelException
+   */
+  //@Test
+  public void testMessagingTypeMerge() throws ModelException{
+    MessageDrivenBean mdbBean = EjbFactory.eINSTANCE.createMessageDrivenBean();
+    MessageDrivenBean mdbBean1 = EjbFactory.eINSTANCE.createMessageDrivenBean();
+    mdbBean.setEjbName("name");
+    mdbBean1.setEjbName("name");
+    mdbBean.setMessagingType("test");
+
+    (new MessageDrivenBeanMerger(mdbBean1, mdbBean, 0)).process();
+    assertEquals("test", mdbBean1.getMessagingType());    
+  }
+
+  /**
+   *  Same suffix means that the information in merge and base is one 
+   * and the same: no merge should occurred and additional checks for 
+   * doubling of the elements are present.
+   * @throws ModelException
+   */
+  //@Test
+  public void testMessagingTypeSame() throws ModelException{
+    MessageDrivenBean mdbBean = EjbFactory.eINSTANCE.createMessageDrivenBean();
+    MessageDrivenBean mdbBean1 = EjbFactory.eINSTANCE.createMessageDrivenBean();
+    mdbBean.setEjbName("name");
+    mdbBean1.setEjbName("name");
+    mdbBean1.setMessagingType("test");
+    mdbBean.setMessagingType("test");
+    (new MessageDrivenBeanMerger(mdbBean1, mdbBean, 0)).process();
+    assertEquals("test", mdbBean1.getMessagingType());     
+  }
+
+  /**
+   * 
+   * Complex suffix means variety of information is present in base 
+   * and to merge: consistent information combined by base and toMerge
+   * should be available at the end.
+   * @throws ModelException
+   */
+  //@Test
+  public void testMessagingTypeComplex() throws ModelException{
+    MessageDrivenBean mdbBean = EjbFactory.eINSTANCE.createMessageDrivenBean();
+    MessageDrivenBean mdbBean1 = EjbFactory.eINSTANCE.createMessageDrivenBean();
+    mdbBean.setEjbName("name");
+    mdbBean1.setEjbName("name");
+    mdbBean1.setMessagingType("zero");
+    mdbBean.setMessagingType("test");
+    (new MessageDrivenBeanMerger(mdbBean1, mdbBean, 0)).process();
+    assertEquals("zero", mdbBean1.getMessagingType());
+
+  }
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/mergers/tests/MergersTestSuite.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/mergers/tests/MergersTestSuite.java
new file mode 100644
index 0000000..5073ef3
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/mergers/tests/MergersTestSuite.java
@@ -0,0 +1,35 @@
+/***********************************************************************
+ * Copyright (c) 2008 by SAP AG, Walldorf. 
+ * 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:
+ *     SAP AG - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jst.jee.model.mergers.tests;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * @author Dimitar Giormov
+ * 
+ */
+//@SuiteClasses({ EjbJarMergerTest.class, SessionMergerTest.class, MdbMergerTest.class, AssemblyDescriptorMergerTest.class, JndiRefsTest.class, WebAppMergerTest.class })
+//@RunWith(Suite.class)
+public class MergersTestSuite {
+
+    public static Test suite() {
+    	TestSuite suite = new TestSuite(MergersTestSuite.class.getName());
+    	suite.addTestSuite(EjbJarMergerTest.class);
+    	suite.addTestSuite(SessionMergerTest.class);
+    	suite.addTestSuite(MdbMergerTest.class);
+    	suite.addTestSuite(AssemblyDescriptorMergerTest.class);
+    	suite.addTestSuite(JndiRefsTest.class);
+    	suite.addTestSuite(WebAppMergerTest.class);
+    	suite.addTestSuite(WebApp3MergerTest.class);
+        return suite;
+    }
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/mergers/tests/SessionMergerTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/mergers/tests/SessionMergerTest.java
new file mode 100644
index 0000000..e275c9f
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/mergers/tests/SessionMergerTest.java
@@ -0,0 +1,1212 @@
+/***********************************************************************
+ * Copyright (c) 2008 by SAP AG, Walldorf. 
+ * 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:
+ *     SAP AG - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jst.jee.model.mergers.tests;
+
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.eclipse.jst.javaee.core.JavaeeFactory;
+import org.eclipse.jst.javaee.core.RunAs;
+import org.eclipse.jst.javaee.core.SecurityRoleRef;
+import org.eclipse.jst.javaee.ejb.EjbFactory;
+import org.eclipse.jst.javaee.ejb.InitMethodType;
+import org.eclipse.jst.javaee.ejb.MethodParams;
+import org.eclipse.jst.javaee.ejb.NamedMethodType;
+import org.eclipse.jst.javaee.ejb.RemoveMethodType;
+import org.eclipse.jst.javaee.ejb.SecurityIdentityType;
+import org.eclipse.jst.javaee.ejb.SessionBean;
+import org.eclipse.jst.javaee.ejb.TransactionType;
+import org.eclipse.jst.jee.model.internal.mergers.ModelException;
+import org.eclipse.jst.jee.model.internal.mergers.SessionBeanMerger;
+
+/**
+ * Tester class for SessionBean artifact.
+ * 
+ * Base suffix means that the base object has some info and 
+ * toMerge is empty: nothing should be merged
+ * 
+ * ToMerge suffix means that the base is empty object and 
+ * toMerge has some info: all from merge should be present in base.
+ * 
+ * Same suffix means that the information in merge and base is one 
+ * and the same: no merge should occurred and additional checks for 
+ * doubling of the elements are present.
+ * 
+ * Complex suffix means variety of information is present in base 
+ * and to merge: consistent information combined by base and toMerge
+ * should be available at the end.
+ * 
+ * ComplexOverlapped suffix means variety of information is present 
+ * in base and to merge: consistent information combined by base and toMerge
+ * should be available at the end. There are artifacts with one and the same 
+ * name and different values: values should be merged into base.
+ *  
+ * 
+ * @author Dimitar Giormov
+ *
+ */
+public class SessionMergerTest extends TestCase{
+
+  /**
+   * Complex suffix means variety of information is present in base 
+   * and to merge: consistent information combined by base and toMerge
+   * should be available at the end.
+   * @throws ModelException
+   */
+  //@Test
+  public void testTimeOutComplexNoParams() throws ModelException{
+    SessionBean baseBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean toMergeBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    baseBean1.setEjbName("name");
+    toMergeBean1.setEjbName("name");
+
+
+    NamedMethodType base = EjbFactory.eINSTANCE.createNamedMethodType();
+    String value = "getMethod";
+    base.setMethodName(value);
+
+    baseBean1.setTimeoutMethod(base);
+
+    (new SessionBeanMerger(baseBean1, toMergeBean1, 0)).process();
+
+    assertNotNull(baseBean1.getTimeoutMethod());
+    assertNotNull(baseBean1.getTimeoutMethod().getMethodName().equals(value));
+    assertNull(baseBean1.getTimeoutMethod().getMethodParams());
+
+
+  }
+
+  /**
+   * Complex suffix means variety of information is present in base 
+   * and to merge: consistent information combined by base and toMerge
+   * should be available at the end.
+   * @throws ModelException
+   */
+  //@Test
+  public void testTimeOutComplexWithParams() throws ModelException{
+    SessionBean baseBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean toMergeBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    baseBean1.setEjbName("name");
+    toMergeBean1.setEjbName("name");
+
+
+    NamedMethodType base = EjbFactory.eINSTANCE.createNamedMethodType();
+    String value = "getMethod";
+    base.setMethodName(value);
+    MethodParams params = EjbFactory.eINSTANCE.createMethodParams();
+    params.getMethodParams().add("java.lang.String");
+    base.setMethodParams(params);
+
+    NamedMethodType merge = EjbFactory.eINSTANCE.createNamedMethodType();
+    merge.setMethodName(value);
+
+    baseBean1.setTimeoutMethod(base);
+    toMergeBean1.setTimeoutMethod(merge);
+
+    (new SessionBeanMerger(baseBean1, toMergeBean1, 0)).process();
+
+    assertNotNull(baseBean1.getTimeoutMethod());
+    assertNotNull(baseBean1.getTimeoutMethod().getMethodName().equals(value));
+    assertNotNull(baseBean1.getTimeoutMethod().getMethodParams());
+    assertEquals(1, baseBean1.getTimeoutMethod().getMethodParams().getMethodParams().size());
+
+  }
+
+  /**
+   * Complex suffix means variety of information is present in base 
+   * and to merge: consistent information combined by base and toMerge
+   * should be available at the end.
+   * @throws ModelException
+   */
+  //@Test
+  public void testTimeOutComplexWithParams2() throws ModelException{
+    SessionBean baseBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean toMergeBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    baseBean1.setEjbName("name");
+    toMergeBean1.setEjbName("name");
+
+
+    NamedMethodType base = EjbFactory.eINSTANCE.createNamedMethodType();
+    String value = "getMethod";
+    base.setMethodName(value);
+    MethodParams params = EjbFactory.eINSTANCE.createMethodParams();
+    String string = "java.lang.String";
+    params.getMethodParams().add(string);
+    base.setMethodParams(params);
+
+    NamedMethodType merge = EjbFactory.eINSTANCE.createNamedMethodType();
+    merge.setMethodName(value);
+
+    baseBean1.setTimeoutMethod(base);
+    toMergeBean1.setTimeoutMethod(merge);
+
+    (new SessionBeanMerger(toMergeBean1, baseBean1, 0)).process();
+
+    assertNotNull(baseBean1.getTimeoutMethod());
+    assertNotNull(baseBean1.getTimeoutMethod().getMethodName().equals(value));
+    assertNotNull(baseBean1.getTimeoutMethod().getMethodParams());
+    assertNotNull(baseBean1.getTimeoutMethod().getMethodParams().getMethodParams().get(0).equals(string));
+
+  }
+
+  /**
+   * Base suffix means that the base object has some info and 
+   * toMerge is empty: nothing should be merged
+   * @throws ModelException
+   */
+  //@Test
+  public void testTimeOutBase() throws ModelException{
+    SessionBean baseBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean toMergeBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    baseBean1.setEjbName("name");
+    toMergeBean1.setEjbName("name");
+
+
+    NamedMethodType base = EjbFactory.eINSTANCE.createNamedMethodType();
+    String value = "getMethod";
+    base.setMethodName(value);
+    MethodParams params = EjbFactory.eINSTANCE.createMethodParams();
+    String string = "java.lang.String";
+    params.getMethodParams().add(string);
+    base.setMethodParams(params);
+
+    baseBean1.setTimeoutMethod(base);
+
+    (new SessionBeanMerger(baseBean1, toMergeBean1, 0)).process();
+
+    assertNotNull(baseBean1.getTimeoutMethod());
+    assertNotNull(baseBean1.getTimeoutMethod().getMethodName().equals(value));
+    assertNotNull(baseBean1.getTimeoutMethod().getMethodParams());
+    assertNotNull(baseBean1.getTimeoutMethod().getMethodParams().getMethodParams().get(0).equals(string));
+
+  }
+
+  /**
+   * ToMerge suffix means that the base is empty object and 
+   * toMerge has some info: all from merge should be present in base.
+   * @throws ModelException
+   */
+  //@Test
+  public void testTimeOutMerge() throws ModelException{
+    SessionBean baseBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean toMergeBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    baseBean1.setEjbName("name");
+    toMergeBean1.setEjbName("name");
+
+
+    NamedMethodType base = EjbFactory.eINSTANCE.createNamedMethodType();
+    String value = "getMethod";
+    base.setMethodName(value);
+    MethodParams params = EjbFactory.eINSTANCE.createMethodParams();
+    String string = "java.lang.String";
+    params.getMethodParams().add(string);
+    base.setMethodParams(params);
+
+    baseBean1.setTimeoutMethod(base);
+
+    (new SessionBeanMerger(toMergeBean1, baseBean1, 0)).process();
+
+    assertNotNull(baseBean1.getTimeoutMethod());
+    assertNotNull(toMergeBean1.getTimeoutMethod());
+    assertNotNull(toMergeBean1.getTimeoutMethod().getMethodName().equals(value));
+    assertNotNull(toMergeBean1.getTimeoutMethod().getMethodParams());
+    assertNotNull(toMergeBean1.getTimeoutMethod().getMethodParams().getMethodParams().get(0).equals(string));   
+  }
+
+  /**
+   * Base suffix means that the base object has some info and 
+   * toMerge is empty: nothing should be merged
+   * @throws ModelException
+   */
+  //@Test
+  public void testSecurityIdentityBase() throws ModelException{
+    SessionBean baseBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean toMergeBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    baseBean1.setEjbName("name");
+    toMergeBean1.setEjbName("name");
+    SecurityIdentityType type = EjbFactory.eINSTANCE.createSecurityIdentityType();
+    type.setUseCallerIdentity(JavaeeFactory.eINSTANCE.createEmptyType());
+    toMergeBean1.setSecurityIdentities(type);
+
+    (new SessionBeanMerger(toMergeBean1, baseBean1, 0)).process();
+    assertNotNull(toMergeBean1.getSecurityIdentities().getUseCallerIdentity());
+
+  }
+
+  /**
+   * ToMerge suffix means that the base is empty object and 
+   * toMerge has some info: all from merge should be present in base.
+   * @throws ModelException
+   */
+  //@Test
+  public void testSecurityIdentityMerge() throws ModelException{
+    SessionBean baseBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean toMergeBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    baseBean1.setEjbName("name");
+    toMergeBean1.setEjbName("name");
+    SecurityIdentityType type = EjbFactory.eINSTANCE.createSecurityIdentityType();
+    type.setUseCallerIdentity(JavaeeFactory.eINSTANCE.createEmptyType());
+    toMergeBean1.setSecurityIdentities(type);
+
+    (new SessionBeanMerger(baseBean1, toMergeBean1, 0)).process();
+    assertNotNull(baseBean1.getSecurityIdentities().getUseCallerIdentity());    
+  }
+
+  /**
+   * 
+   * Same suffix means that the information in merge and base is one 
+   * and the same: no merge should occurred and additional checks for 
+   * doubling of the elements are present.
+   * @throws ModelException
+   */
+  //@Test
+  public void testSecurityIdentitySame() throws ModelException{
+    SessionBean baseBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean toMergeBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    baseBean1.setEjbName("name");
+    toMergeBean1.setEjbName("name");
+    SecurityIdentityType type = EjbFactory.eINSTANCE.createSecurityIdentityType();
+    type.setUseCallerIdentity(JavaeeFactory.eINSTANCE.createEmptyType());
+    toMergeBean1.setSecurityIdentities(type);
+    baseBean1.setSecurityIdentities(type);
+
+    (new SessionBeanMerger(baseBean1, toMergeBean1, 0)).process();
+    assertNotNull(baseBean1.getSecurityIdentities().getUseCallerIdentity());
+
+  }
+
+  /**
+   * Complex suffix means variety of information is present in base 
+   * and to merge: consistent information combined by base and toMerge
+   * should be available at the end.
+   * @throws ModelException
+   */
+  //@Test
+  public void testSecurityIdentityComplex() throws ModelException{
+    SessionBean baseBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean toMergeBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    baseBean1.setEjbName("name");
+    toMergeBean1.setEjbName("name");
+    SecurityIdentityType type = EjbFactory.eINSTANCE.createSecurityIdentityType();
+    type.setUseCallerIdentity(JavaeeFactory.eINSTANCE.createEmptyType());
+
+    SecurityIdentityType type2 = EjbFactory.eINSTANCE.createSecurityIdentityType();
+    RunAs createRunAs = JavaeeFactory.eINSTANCE.createRunAs();
+    createRunAs.setRoleName("ttt");
+    type2.setRunAs(createRunAs);
+
+    toMergeBean1.setSecurityIdentities(type);
+    baseBean1.setSecurityIdentities(type2);
+
+    (new SessionBeanMerger(baseBean1, toMergeBean1, 0)).process();
+    assertNull(baseBean1.getSecurityIdentities().getUseCallerIdentity());
+    assertNotNull(baseBean1.getSecurityIdentities().getRunAs().getRoleName());
+
+
+  }
+
+
+  /**
+   * Base suffix means that the base object has some info and 
+   * toMerge is empty: nothing should be merged
+   * @throws ModelException
+   */
+  //@Test
+  public void testTransactionTypeBase() throws ModelException{
+    SessionBean baseBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean toMergeBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    baseBean1.setEjbName("name");
+    toMergeBean1.setEjbName("name");
+    toMergeBean1.setTransactionType(TransactionType.BEAN_LITERAL);
+
+    (new SessionBeanMerger(toMergeBean1, baseBean1, 0)).process();
+    assertEquals(TransactionType.BEAN_LITERAL, toMergeBean1.getTransactionType());
+
+  }
+
+  /**
+   * ToMerge suffix means that the base is empty object and 
+   * toMerge has some info: all from merge should be present in base.
+   * @throws ModelException
+   */
+  //@Test
+  public void testTransactionTypeMerge() throws ModelException{
+    SessionBean baseBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean toMergeBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    baseBean1.setEjbName("name");
+    toMergeBean1.setEjbName("name");
+    baseBean1.setTransactionType(TransactionType.BEAN_LITERAL);
+
+    (new SessionBeanMerger(toMergeBean1, baseBean1, 0)).process();
+    assertEquals(TransactionType.BEAN_LITERAL, toMergeBean1.getTransactionType());    
+  }
+
+  /**
+   * Same suffix means that the information in merge and base is one 
+   * and the same: no merge should occurred and additional checks for 
+   * doubling of the elements are present.
+   * @throws ModelException
+   */
+  //@Test
+  public void testTransactionTypeSame() throws ModelException{
+    SessionBean baseBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean toMergeBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    baseBean1.setEjbName("name");
+    toMergeBean1.setEjbName("name");
+    toMergeBean1.setTransactionType(TransactionType.BEAN_LITERAL);
+    baseBean1.setTransactionType(TransactionType.BEAN_LITERAL);
+    (new SessionBeanMerger(toMergeBean1, baseBean1, 0)).process();
+    assertEquals(TransactionType.BEAN_LITERAL, toMergeBean1.getTransactionType());     
+  }
+
+  /**
+   * Complex suffix means variety of information is present in base 
+   * and to merge: consistent information combined by base and toMerge
+   * should be available at the end.
+   * @throws ModelException
+   */
+  //@Test
+  public void testTransactionTypeComplex() throws ModelException{
+    SessionBean baseBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean toMergeBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    baseBean1.setEjbName("name");
+    toMergeBean1.setEjbName("name");
+    toMergeBean1.setTransactionType(TransactionType.CONTAINER_LITERAL);
+    baseBean1.setTransactionType(TransactionType.BEAN_LITERAL);
+    (new SessionBeanMerger(toMergeBean1, baseBean1, 0)).process();
+    assertEquals(TransactionType.CONTAINER_LITERAL, toMergeBean1.getTransactionType());
+
+  }
+
+
+  /**
+   * Base suffix means that the base object has some info and 
+   * toMerge is empty: nothing should be merged
+   * @throws ModelException
+   */
+  //@Test
+  public void testInitMethodBase() throws ModelException{
+    SessionBean baseBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean toMergeBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    baseBean1.setEjbName("name");
+    toMergeBean1.setEjbName("name");
+
+
+
+
+    String value = "getMethod";
+
+
+    String mParam1 = "java.lang.String";
+
+    InitMethodType methodType = generateInitType(value, new String[]{mParam1});
+
+    baseBean1.getInitMethods().add(methodType);
+
+    (new SessionBeanMerger(baseBean1, toMergeBean1, 0)).process();
+
+    assertNotNull(baseBean1.getInitMethods());
+    assertEquals(1, baseBean1.getInitMethods().size());
+
+    InitMethodType aMethod = findInitMethod(baseBean1.getInitMethods(), methodType.getBeanMethod());
+
+    assertNotNull(aMethod);
+  }
+
+  /**
+   * ToMerge suffix means that the base is empty object and 
+   * toMerge has some info: all from merge should be present in base.
+   * @throws ModelException
+   */
+  //@Test
+  public void testInitMethodToMerge() throws ModelException{
+    SessionBean baseBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean toMergeBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    baseBean1.setEjbName("name");
+    toMergeBean1.setEjbName("name");
+
+
+    String value = "getMethod";    
+    String mParam1 = "java.lang.String";
+    InitMethodType methodType = generateInitType(value, new String[]{mParam1});
+
+    baseBean1.getInitMethods().add(methodType);
+
+    (new SessionBeanMerger(toMergeBean1, baseBean1,  0)).process();
+
+    assertNotNull(toMergeBean1.getInitMethods());
+    assertEquals(1, toMergeBean1.getInitMethods().size());
+
+    InitMethodType aMethod = findInitMethod(toMergeBean1.getInitMethods(), methodType.getBeanMethod());
+    assertNotNull(aMethod);
+
+  }
+
+  /**
+   * Same suffix means that the information in merge and base is one 
+   * and the same: no merge should occurred and additional checks for 
+   * doubling of the elements are present.
+   * @throws ModelException
+   */
+  //@Test
+  public void testInitMethodSame() throws ModelException{
+    SessionBean baseBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean toMergeBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    baseBean1.setEjbName("name");
+    toMergeBean1.setEjbName("name");
+
+
+    String value = "getMethod";    
+    String mParam1 = "java.lang.String";
+    InitMethodType methodType = generateInitType(value, new String[]{mParam1});
+
+    baseBean1.getInitMethods().add(methodType);
+    toMergeBean1.getInitMethods().add(methodType);
+
+    (new SessionBeanMerger(toMergeBean1, baseBean1,  0)).process();
+
+    assertNotNull(toMergeBean1.getInitMethods());
+    assertEquals(1, toMergeBean1.getInitMethods().size());
+
+    InitMethodType aMethod = findInitMethod(toMergeBean1.getInitMethods(), methodType.getBeanMethod());
+    assertNotNull(aMethod);
+
+  }
+
+
+  /**
+   * Complex suffix means variety of information is present in base 
+   * and to merge: consistent information combined by base and toMerge
+   * should be available at the end.
+   * @throws ModelException
+   */
+  //@Test
+  public void testInitMethodComplex() throws ModelException{
+    SessionBean baseBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean toMergeBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    baseBean1.setEjbName("name");
+    toMergeBean1.setEjbName("name");
+
+    String value = "getMethod";
+    String mParam1 = "java.lang.String";
+    InitMethodType methodType = generateInitType(value, new String[]{mParam1});
+    InitMethodType methodType2 = generateInitType(value, new String[]{mParam1, mParam1});
+    InitMethodType methodType3 = generateInitType(value, new String[]{mParam1});
+
+    baseBean1.getInitMethods().add(methodType);
+    toMergeBean1.getInitMethods().add(methodType2);
+    toMergeBean1.getInitMethods().add(methodType3);
+
+    (new SessionBeanMerger(toMergeBean1, baseBean1,  0)).process();
+
+    assertNotNull(toMergeBean1.getInitMethods());
+    assertEquals(2, toMergeBean1.getInitMethods().size());
+
+    InitMethodType aMethod = findInitMethod(toMergeBean1.getInitMethods(), methodType.getBeanMethod());
+    assertNotNull(aMethod);
+    InitMethodType aMethod2 = findInitMethod(toMergeBean1.getInitMethods(), methodType2.getBeanMethod());
+    assertNotNull(aMethod2);
+
+
+  }
+
+  private InitMethodType findInitMethod(List namedMethodsBase, NamedMethodType object) {
+    for (Object base: namedMethodsBase) {
+      InitMethodType tmpBase = (InitMethodType)base;
+      if ( tmpBase.getBeanMethod().getMethodName().equals(object.getMethodName()) 
+          && sameParams(tmpBase.getBeanMethod().getMethodParams(), object.getMethodParams())) {
+        return (InitMethodType) base;
+      }
+    }
+    return null;
+  }
+
+
+  private boolean sameParams(MethodParams methodParams,
+      MethodParams methodParams2) {
+    if(methodParams == null && methodParams2 == null){
+      return true;
+    }
+    if(methodParams == null | methodParams2 == null){
+      return false;
+    }
+
+    if (methodParams.getMethodParams().size() != methodParams2.getMethodParams().size()){
+      return false;
+    }
+
+    for (int i = 0; i < methodParams.getMethodParams().size(); i++) {
+      if(!methodParams.getMethodParams().get(i).equals(methodParams2.getMethodParams().get(i))){
+        return false;
+      }
+    }
+    return true;
+  }
+
+  private InitMethodType generateInitType(String name, String[] parameters) {
+    InitMethodType methodType3 = EjbFactory.eINSTANCE.createInitMethodType();
+    NamedMethodType nMethodType3 = EjbFactory.eINSTANCE.createNamedMethodType();
+
+    nMethodType3.setMethodName(name);
+    MethodParams params3 = EjbFactory.eINSTANCE.createMethodParams();
+    if (parameters != null){
+      for (int i = 0; i < parameters.length; i++) {
+        params3.getMethodParams().add(parameters[i]);  
+      }
+      nMethodType3.setMethodParams(params3);
+    }
+
+    methodType3.setBeanMethod(nMethodType3);    
+    return methodType3;
+  }
+
+
+  private RemoveMethodType generateRemoveMethodType(String name, String[] parameters) {
+    RemoveMethodType methodType3 = EjbFactory.eINSTANCE.createRemoveMethodType();
+    NamedMethodType nMethodType3 = EjbFactory.eINSTANCE.createNamedMethodType();
+
+    nMethodType3.setMethodName(name);
+    MethodParams params3 = EjbFactory.eINSTANCE.createMethodParams();
+    if (parameters != null){
+      for (int i = 0; i < parameters.length; i++) {
+        params3.getMethodParams().add(parameters[i]);  
+      }
+      nMethodType3.setMethodParams(params3);
+    }
+
+    methodType3.setBeanMethod(nMethodType3);    
+    return methodType3;
+  }
+
+
+  /**
+   * Base suffix means that the base object has some info and 
+   * toMerge is empty: nothing should be merged
+   * @throws ModelException
+   */
+  //@Test
+  public void testRemoveMethodBase() throws ModelException{
+    SessionBean baseBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean toMergeBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    baseBean1.setEjbName("name");
+    toMergeBean1.setEjbName("name");
+
+    String value = "getMethod";
+
+    String mParam1 = "java.lang.String";
+
+    RemoveMethodType methodType = generateRemoveMethodType(value, new String[]{mParam1});
+
+    baseBean1.getRemoveMethods().add(methodType);
+
+    (new SessionBeanMerger(baseBean1, toMergeBean1, 0)).process();
+
+    assertNotNull(baseBean1.getRemoveMethods());
+    assertEquals(1, baseBean1.getRemoveMethods().size());
+
+    RemoveMethodType aMethod = findRemoveMethod(baseBean1.getRemoveMethods(), methodType.getBeanMethod());
+
+    assertNotNull(aMethod);
+  }
+
+  /**
+   * ToMerge suffix means that the base is empty object and 
+   * toMerge has some info: all from merge should be present in base.
+   * @throws ModelException
+   */
+  //@Test
+  public void testRemoveMethodToMerge() throws ModelException{
+    SessionBean baseBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean toMergeBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    baseBean1.setEjbName("name");
+    toMergeBean1.setEjbName("name");
+
+
+    String value = "getMethod";    
+    String mParam1 = "java.lang.String";
+    RemoveMethodType methodType = generateRemoveMethodType(value, new String[]{mParam1});
+
+    baseBean1.getRemoveMethods().add(methodType);
+
+    (new SessionBeanMerger(toMergeBean1, baseBean1,  0)).process();
+
+    assertNotNull(toMergeBean1.getRemoveMethods());
+    assertEquals(1, toMergeBean1.getRemoveMethods().size());
+
+    RemoveMethodType aMethod = findRemoveMethod(toMergeBean1.getRemoveMethods(), methodType.getBeanMethod());
+    assertNotNull(aMethod);
+
+  }
+
+  /**
+   * Same suffix means that the information in merge and base is one 
+   * and the same: no merge should occurred and additional checks for 
+   * doubling of the elements are present.
+   * @throws ModelException
+   */
+  //@Test
+  public void testRemoveMethodSame() throws ModelException{
+    SessionBean baseBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean toMergeBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    baseBean1.setEjbName("name");
+    toMergeBean1.setEjbName("name");
+
+
+    String value = "getMethod";    
+    String mParam1 = "java.lang.String";
+    RemoveMethodType methodType = generateRemoveMethodType(value, new String[]{mParam1});
+
+    baseBean1.getRemoveMethods().add(methodType);
+    toMergeBean1.getRemoveMethods().add(methodType);
+
+    (new SessionBeanMerger(toMergeBean1, baseBean1,  0)).process();
+
+    assertNotNull(toMergeBean1.getRemoveMethods());
+    assertEquals(1, toMergeBean1.getRemoveMethods().size());
+
+    RemoveMethodType aMethod = findRemoveMethod(toMergeBean1.getRemoveMethods(), methodType.getBeanMethod());
+    assertNotNull(aMethod);
+
+  }
+
+
+  /**
+   * Complex suffix means variety of information is present in base 
+   * and to merge: consistent information combined by base and toMerge
+   * should be available at the end.
+   * @throws ModelException
+   */
+  //@Test
+  public void testRemoveMethodComplex() throws ModelException{
+    SessionBean baseBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean toMergeBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    baseBean1.setEjbName("name");
+    toMergeBean1.setEjbName("name");
+
+    String value = "getMethod";
+    String mParam1 = "java.lang.String";
+    RemoveMethodType methodType = generateRemoveMethodType(value, new String[]{mParam1});
+    RemoveMethodType methodType2 = generateRemoveMethodType(value, new String[]{mParam1, mParam1});
+    RemoveMethodType methodType3 = generateRemoveMethodType(value, new String[]{mParam1});
+
+    baseBean1.getRemoveMethods().add(methodType);
+    toMergeBean1.getRemoveMethods().add(methodType2);
+    toMergeBean1.getRemoveMethods().add(methodType3);
+
+    (new SessionBeanMerger(toMergeBean1, baseBean1,  0)).process();
+
+    assertNotNull(toMergeBean1.getRemoveMethods());
+    assertEquals(2, toMergeBean1.getRemoveMethods().size());
+
+    RemoveMethodType aMethod = findRemoveMethod(toMergeBean1.getRemoveMethods(), methodType.getBeanMethod());
+    assertNotNull(aMethod);
+    RemoveMethodType aMethod2 = findRemoveMethod(toMergeBean1.getRemoveMethods(), methodType2.getBeanMethod());
+    assertNotNull(aMethod2);
+
+
+  }
+
+  private RemoveMethodType findRemoveMethod(List namedMethodsBase, NamedMethodType object) {
+    for (Object base: namedMethodsBase) {
+      RemoveMethodType tmpBase = (RemoveMethodType)base;
+      if ( tmpBase.getBeanMethod().getMethodName().equals(object.getMethodName()) 
+          && sameParams(tmpBase.getBeanMethod().getMethodParams(), object.getMethodParams())) {
+        return (RemoveMethodType) base;
+      }
+    }
+    return null;
+  }
+
+
+  /**
+   * Base suffix means that the base object has some info and 
+   * toMerge is empty: nothing should be merged
+   * @throws Exception
+   */
+  //@Test
+  public void testSecurityRoleRefsBase() throws Exception {
+    SessionBean baseBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean toMergeBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    baseBean1.setEjbName("name");
+    toMergeBean1.setEjbName("name");
+
+    SecurityRoleRef ref = JavaeeFactory.eINSTANCE.createSecurityRoleRef();
+    String name0 = "roleName1";
+    ref.setRoleName(name0);
+    String link0 = "roleLink1";
+    ref.setRoleLink(link0);
+
+    baseBean1.getSecurityRoleRefs().add(ref);
+
+    (new SessionBeanMerger(baseBean1, toMergeBean1,  0)).process();
+
+    assertNotNull(baseBean1.getSecurityRoleRefs());
+    assertEquals(1, baseBean1.getSecurityRoleRefs().size());
+    assertNotNull(getSecurityRoleRefByName(baseBean1.getSecurityRoleRefs(), name0));
+  }
+
+  private SecurityRoleRef getSecurityRoleRefByName(List securityRoleRefs, String name0) {
+    for (Object object : securityRoleRefs) {
+      SecurityRoleRef sr = (SecurityRoleRef) object;
+      if (sr.getRoleName().equals(name0)){
+        return sr;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * ToMerge suffix means that the base is empty object and 
+   * toMerge has some info: all from merge should be present in base.
+   * @throws Exception
+   */
+  //@Test
+  public void testSecurityRoleRefsMerge() throws Exception {
+    SessionBean baseBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean toMergeBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    baseBean1.setEjbName("name");
+    toMergeBean1.setEjbName("name");
+
+    SecurityRoleRef ref = JavaeeFactory.eINSTANCE.createSecurityRoleRef();
+    String name0 = "roleName1";
+    ref.setRoleName(name0);
+    String link0 = "roleLink1";
+    ref.setRoleLink(link0);
+
+    toMergeBean1.getSecurityRoleRefs().add(ref);
+
+    (new SessionBeanMerger(baseBean1, toMergeBean1,  0)).process();
+
+    assertEquals(1, baseBean1.getSecurityRoleRefs().size());
+    assertNotNull(getSecurityRoleRefByName(baseBean1.getSecurityRoleRefs(), name0));
+  }
+
+  /**
+   * Same suffix means that the information in merge and base is one 
+   * and the same: no merge should occurred and additional checks for 
+   * doubling of the elements are present.
+   * 
+   * @throws Exception
+   */
+  //@Test
+  public void testSecurityRoleRefsSame() throws Exception {
+    SessionBean baseBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean toMergeBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    baseBean1.setEjbName("name");
+    toMergeBean1.setEjbName("name");
+
+    SecurityRoleRef ref = JavaeeFactory.eINSTANCE.createSecurityRoleRef();
+    String name0 = "roleName1";
+    ref.setRoleName(name0);
+    String link0 = "roleLink1";
+    ref.setRoleLink(link0);
+
+    baseBean1.getSecurityRoleRefs().add(ref);
+    toMergeBean1.getSecurityRoleRefs().add(ref);
+
+    (new SessionBeanMerger(baseBean1, toMergeBean1,  0)).process();
+
+    assertEquals(1, baseBean1.getSecurityRoleRefs().size());
+    assertNotNull(getSecurityRoleRefByName(baseBean1.getSecurityRoleRefs(), name0));
+  }
+
+  /**
+   * Complex suffix means variety of information is present in base 
+   * and to merge: consistent information combined by base and toMerge
+   * should be available at the end.
+   * @throws Exception
+   */
+  //@Test
+  public void testSecurityRoleRefsComplex() throws Exception {
+    SessionBean baseBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean toMergeBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    baseBean1.setEjbName("name");
+    toMergeBean1.setEjbName("name");
+
+    SecurityRoleRef ref = JavaeeFactory.eINSTANCE.createSecurityRoleRef();
+    String name0 = "roleName1";
+    ref.setRoleName(name0);
+    String link0 = "roleLink1";
+    ref.setRoleLink(link0);
+
+    SecurityRoleRef ref2 = JavaeeFactory.eINSTANCE.createSecurityRoleRef();
+    String name1 = "roleName2";
+    ref2.setRoleName(name1);
+    ref2.setRoleLink(link0);
+
+    baseBean1.getSecurityRoleRefs().add(ref);
+    toMergeBean1.getSecurityRoleRefs().add(ref2);
+
+    (new SessionBeanMerger(baseBean1, toMergeBean1,  0)).process();
+
+    assertEquals(2, baseBean1.getSecurityRoleRefs().size());
+    assertNotNull(getSecurityRoleRefByName(baseBean1.getSecurityRoleRefs(), name0));
+
+    assertNotNull(getSecurityRoleRefByName(baseBean1.getSecurityRoleRefs(), name1));
+  }
+
+  /**
+   * Base suffix means that the base object has some info and 
+   * toMerge is empty: nothing should be merged
+   * @throws Exception
+   */
+  //@Test
+  public void testBeanClassBase() throws Exception {
+    SessionBean baseBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean toMergeBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    baseBean1.setEjbName("name");
+    toMergeBean1.setEjbName("name");
+
+    String expected = "test.Test";
+    baseBean1.setEjbClass(expected);
+    String notExpected = "test.Test2";
+    toMergeBean1.setEjbClass(notExpected);
+
+    (new SessionBeanMerger(baseBean1, toMergeBean1,  0)).process();
+    assertEquals(expected,baseBean1.getEjbClass());
+
+  }
+
+  /**
+   * ToMerge suffix means that the base is empty object and 
+   * toMerge has some info: all from merge should be present in base.
+   * @throws Exception
+   */
+  //@Test
+  public void testBeanClassMerge() throws Exception {
+    SessionBean baseBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean toMergeBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    baseBean1.setEjbName("name");
+    toMergeBean1.setEjbName("name");
+
+    String expected = "test.Test";
+    toMergeBean1.setEjbClass(expected);
+
+    (new SessionBeanMerger(baseBean1, toMergeBean1,  0)).process();
+    assertEquals(expected,baseBean1.getEjbClass());
+
+  }
+
+  /**
+   * Same suffix means that the information in merge and base is one 
+   * and the same: no merge should occurred and additional checks for 
+   * doubling of the elements are present.
+   * @throws Exception
+   */
+  //@Test
+  public void testBeanClassSame() throws Exception {
+    SessionBean baseBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean toMergeBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    baseBean1.setEjbName("name");
+    toMergeBean1.setEjbName("name");
+
+    String expected = "test.Test";
+    baseBean1.setEjbClass(expected);
+    toMergeBean1.setEjbClass(expected);
+
+    (new SessionBeanMerger(baseBean1, toMergeBean1,  0)).process();
+    assertEquals(expected,baseBean1.getEjbClass());
+  }
+
+  /**
+   * Base suffix means that the base object has some info and 
+   * toMerge is empty: nothing should be merged
+   * @throws Exception
+   */
+  //@Test
+  public void testBussinessInterfacesBase() throws Exception {
+
+    SessionBean baseBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean toMergeBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    baseBean1.setEjbName("name");
+    toMergeBean1.setEjbName("name");
+
+    baseBean1.getBusinessLocals().add("intfs1");
+    baseBean1.getBusinessRemotes().add("intfs2");
+
+    (new SessionBeanMerger(baseBean1, toMergeBean1,  0)).process();
+
+    assertEquals(1, baseBean1.getBusinessLocals().size());
+    assertEquals(1, baseBean1.getBusinessRemotes().size());
+    assertEquals("intfs1", baseBean1.getBusinessLocals().get(0));
+    assertEquals("intfs2", baseBean1.getBusinessRemotes().get(0));
+  }
+
+  /**
+   * ToMerge suffix means that the base is empty object and 
+   * toMerge has some info: all from merge should be present in base.
+   * @throws Exception
+   */
+  //@Test
+  public void testBussinessInterfacesMerge() throws Exception {
+
+    SessionBean baseBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean toMergeBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    baseBean1.setEjbName("name");
+    toMergeBean1.setEjbName("name");
+
+    toMergeBean1.getBusinessLocals().add("intfs1");
+    toMergeBean1.getBusinessRemotes().add("intfs2");
+
+    (new SessionBeanMerger(baseBean1, toMergeBean1,  0)).process();
+
+    assertEquals(1, baseBean1.getBusinessLocals().size());
+    assertEquals(1, baseBean1.getBusinessRemotes().size());
+    assertEquals("intfs1", baseBean1.getBusinessLocals().get(0));
+    assertEquals("intfs2", baseBean1.getBusinessRemotes().get(0));
+  }
+
+
+  /**
+   * Same suffix means that the information in merge and base is one 
+   * and the same: no merge should occurred and additional checks for 
+   * doubling of the elements are present.
+   * @throws Exception
+   */
+  //@Test
+  public void testBussinessInterfacesSame() throws Exception {
+
+    SessionBean baseBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean toMergeBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    baseBean1.setEjbName("name");
+    toMergeBean1.setEjbName("name");
+
+    toMergeBean1.getBusinessLocals().add("intfs1");
+    toMergeBean1.getBusinessRemotes().add("intfs2");
+
+    baseBean1.getBusinessLocals().add("intfs1");
+    baseBean1.getBusinessRemotes().add("intfs2");
+
+    (new SessionBeanMerger(baseBean1, toMergeBean1,  0)).process();
+
+    assertEquals(1, baseBean1.getBusinessLocals().size());
+    assertEquals(1, baseBean1.getBusinessRemotes().size());
+    assertEquals("intfs1", baseBean1.getBusinessLocals().get(0));
+    assertEquals("intfs2", baseBean1.getBusinessRemotes().get(0));
+  }
+
+
+  /**
+   * Complex suffix means variety of information is present in base 
+   * and to merge: consistent information combined by base and toMerge
+   * should be available at the end.
+   * @throws Exception
+   */
+  //@Test
+  public void testBussinessInterfacesComplex() throws Exception {
+
+    SessionBean baseBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean toMergeBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    baseBean1.setEjbName("name");
+    toMergeBean1.setEjbName("name");
+
+    toMergeBean1.getBusinessLocals().add("intfs1");
+    toMergeBean1.getBusinessRemotes().add("intfs2");
+    toMergeBean1.getBusinessLocals().add("intfs3");
+    toMergeBean1.getBusinessRemotes().add("intfs4");
+    toMergeBean1.getBusinessLocals().add("intfs5");
+    toMergeBean1.getBusinessRemotes().add("intfs6");
+
+    baseBean1.getBusinessLocals().add("intfs1");
+    baseBean1.getBusinessRemotes().add("intfs9");
+    baseBean1.getBusinessLocals().add("intfs0");
+    baseBean1.getBusinessRemotes().add("intfs2");
+
+
+    (new SessionBeanMerger(baseBean1, toMergeBean1,  0)).process();
+
+    assertEquals(4, baseBean1.getBusinessLocals().size());
+    assertEquals(4, baseBean1.getBusinessRemotes().size());
+    assertTrue(baseBean1.getBusinessLocals().contains("intfs1"));
+    assertTrue(baseBean1.getBusinessLocals().contains("intfs3"));
+    assertTrue(baseBean1.getBusinessLocals().contains("intfs5"));
+    assertTrue(baseBean1.getBusinessLocals().contains("intfs0"));
+
+    assertTrue(baseBean1.getBusinessRemotes().contains("intfs2"));
+    assertTrue(baseBean1.getBusinessRemotes().contains("intfs4"));
+    assertTrue(baseBean1.getBusinessRemotes().contains("intfs6"));
+    assertTrue(baseBean1.getBusinessRemotes().contains("intfs9"));
+
+  }
+
+
+  /**
+   * Base suffix means that the base object has some info and 
+   * toMerge is empty: nothing should be merged
+   * @throws Exception
+   */
+  //@Test
+  public void test2xInterfacesBase() throws Exception {
+
+    SessionBean baseBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean toMergeBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    baseBean1.setEjbName("name");
+    toMergeBean1.setEjbName("name");
+
+    String l = "local1";
+    baseBean1.setLocal(l);
+    String lh = "localhome1";
+    baseBean1.setLocalHome(lh);
+    String r = "remote1";
+    baseBean1.setRemote(r);
+    String h = "home1";
+    baseBean1.setHome(h);
+
+
+    (new SessionBeanMerger(baseBean1, toMergeBean1,  0)).process();
+
+    assertEquals(l, baseBean1.getLocal());   
+    assertEquals(lh, baseBean1.getLocalHome());
+    assertEquals(r, baseBean1.getRemote());
+    assertEquals(h, baseBean1.getHome());
+  }
+
+  /**
+   * ToMerge suffix means that the base is empty object and 
+   * toMerge has some info: all from merge should be present in base.
+   * @throws Exception
+   */
+  //@Test
+  public void test2xInterfacesMerge() throws Exception {
+
+    SessionBean baseBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean toMergeBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    baseBean1.setEjbName("name");
+    toMergeBean1.setEjbName("name");
+
+    String l = "local1";
+    toMergeBean1.setLocal(l);
+    String lh = "localhome1";
+    toMergeBean1.setLocalHome(lh);
+    String r = "remote1";
+    toMergeBean1.setRemote(r);
+    String h = "home1";
+    toMergeBean1.setHome(h);
+
+
+    (new SessionBeanMerger(baseBean1, toMergeBean1,  0)).process();
+
+    assertEquals(l, baseBean1.getLocal());   
+    assertEquals(lh, baseBean1.getLocalHome());
+    assertEquals(r, baseBean1.getRemote());
+    assertEquals(h, baseBean1.getHome());
+  }
+
+  /**
+   * Same suffix means that the information in merge and base is one 
+   * and the same: no merge should occurred and additional checks for 
+   * doubling of the elements are present.
+   * @throws Exception
+   */
+  //@Test
+  public void test2xInterfacesSame() throws Exception {
+
+    SessionBean baseBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean toMergeBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    baseBean1.setEjbName("name");
+    toMergeBean1.setEjbName("name");
+
+    String l = "local1";
+    baseBean1.setLocal(l);
+    toMergeBean1.setLocal(l);
+    String lh = "localhome1";
+    baseBean1.setLocalHome(lh);
+    toMergeBean1.setLocalHome(lh);
+    String r = "remote1";
+    baseBean1.setRemote(r);
+    toMergeBean1.setRemote(r);
+    String h = "home1";
+    baseBean1.setHome(h);
+    toMergeBean1.setHome(h);
+
+
+    (new SessionBeanMerger(baseBean1, toMergeBean1,  0)).process();
+
+    assertEquals(l, baseBean1.getLocal());   
+    assertEquals(lh, baseBean1.getLocalHome());
+    assertEquals(r, baseBean1.getRemote());
+    assertEquals(h, baseBean1.getHome());
+  }
+
+  /**
+   * Complex suffix means variety of information is present in base 
+   * and to merge: consistent information combined by base and toMerge
+   * should be available at the end.
+   * @throws Exception
+   */
+  //@Test
+  public void test2xInterfacesComplex() throws Exception {
+
+    SessionBean baseBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean toMergeBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    baseBean1.setEjbName("name");
+    toMergeBean1.setEjbName("name");
+
+    String l = "local1";
+    baseBean1.setLocal(l);
+
+    String lh = "localhome1";
+
+    toMergeBean1.setLocalHome(lh);
+    String r = "remote1";
+    baseBean1.setRemote(r);
+
+    String h = "home1";
+
+    toMergeBean1.setHome(h);
+
+
+    (new SessionBeanMerger(baseBean1, toMergeBean1,  0)).process();
+
+    assertEquals(l, baseBean1.getLocal());   
+    assertEquals(lh, baseBean1.getLocalHome());
+    assertEquals(r, baseBean1.getRemote());
+    assertEquals(h, baseBean1.getHome());
+  }
+
+  /**
+   * Complex suffix means variety of information is present in base 
+   * and to merge: consistent information combined by base and toMerge
+   * should be available at the end.
+   * @throws Exception
+   */
+  //@Test
+  public void test2xInterfacesComplexInversed() throws Exception {
+
+    SessionBean baseBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    SessionBean toMergeBean1 = EjbFactory.eINSTANCE.createSessionBean();
+    baseBean1.setEjbName("name");
+    toMergeBean1.setEjbName("name");
+
+    String l = "local1";
+    toMergeBean1.setLocal(l);
+
+    String lh = "localhome1";
+
+    baseBean1.setLocalHome(lh);
+    String r = "remote1";
+    toMergeBean1.setRemote(r);
+
+    String h = "home1";
+
+    baseBean1.setHome(h);
+
+
+    (new SessionBeanMerger(baseBean1, toMergeBean1,  0)).process();
+
+    assertEquals(l, baseBean1.getLocal());   
+    assertEquals(lh, baseBean1.getLocalHome());
+    assertEquals(r, baseBean1.getRemote());
+    assertEquals(h, baseBean1.getHome());
+  }
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/mergers/tests/WebApp3MergerTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/mergers/tests/WebApp3MergerTest.java
new file mode 100644
index 0000000..0a1ee29
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/mergers/tests/WebApp3MergerTest.java
@@ -0,0 +1,1456 @@
+/***********************************************************************
+ * Copyright (c) 2008 by SAP AG, Walldorf. 
+ * 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:
+ *     SAP AG - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jst.jee.model.mergers.tests;
+
+import java.util.List;
+
+import junit.framework.Assert;
+import junit.framework.TestCase;
+
+import org.eclipse.jst.javaee.core.JavaeeFactory;
+import org.eclipse.jst.javaee.core.ParamValue;
+import org.eclipse.jst.javaee.core.RunAs;
+import org.eclipse.jst.javaee.core.SecurityRole;
+import org.eclipse.jst.javaee.core.UrlPatternType;
+import org.eclipse.jst.javaee.web.AuthConstraint;
+import org.eclipse.jst.javaee.web.Filter;
+import org.eclipse.jst.javaee.web.FilterMapping;
+import org.eclipse.jst.javaee.web.SecurityConstraint;
+import org.eclipse.jst.javaee.web.Servlet;
+import org.eclipse.jst.javaee.web.ServletMapping;
+import org.eclipse.jst.javaee.web.TransportGuaranteeType;
+import org.eclipse.jst.javaee.web.UserDataConstraint;
+import org.eclipse.jst.javaee.web.WebApp;
+import org.eclipse.jst.javaee.web.WebFactory;
+import org.eclipse.jst.jee.model.internal.mergers.ModelElementMerger;
+import org.eclipse.jst.jee.model.internal.mergers.ModelException;
+import org.eclipse.jst.jee.model.internal.mergers.WebApp3Merger;
+import org.eclipse.jst.jee.model.internal.mergers.WebAppMerger;
+
+/**
+ * Tester class for WebAPp artifact.
+ * 
+ * Base suffix means that the base object has some info and 
+ * toMerge is empty: nothing should be merged
+ * 
+ * ToMerge suffix means that the base is empty object and 
+ * toMerge has some info: all from merge should be present in base.
+ * 
+ * Same suffix means that the information in merge and base is one 
+ * and the same: no merge should occurred and additional checks for 
+ * doubling of the elements are present.
+ * 
+ * Complex suffix means variety of information is present in base 
+ * and to merge: consistent information combined by base and toMerge
+ * should be available at the end.
+ * 
+ * ComplexOverlapped suffix means variety of information is present 
+ * in base and to merge: consistent information combined by base and toMerge
+ * should be available at the end. There are artifacts with one and the same 
+ * name and different values: values should be merged into base.
+ *  
+ * 
+ * @author Dimitar Giormov
+ *
+ */
+public class WebApp3MergerTest extends TestCase{
+
+	/**
+	 * Tests the merger with Base security role only.
+	 * No merge is necessary
+	 * 
+	 * @throws ModelException
+	 */
+	//@Test
+	public void testSingleSecurityRoleCaseBase() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		SecurityRole role = JavaeeFactory.eINSTANCE.createSecurityRole();
+		role.setRoleName("test1");
+
+		descriptorBase.getSecurityRoles().add(role);
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		Assert.assertNotNull(descriptorBase.getSecurityRoles());
+		Assert.assertTrue(descriptorBase.getSecurityRoles().size() == 1);
+		Assert.assertTrue(descriptorToMerge.getSecurityRoles().size() == 0);
+		Assert.assertTrue(((SecurityRole)descriptorBase.getSecurityRoles().get(0)).getRoleName().equals("test1"));
+	}
+
+	/**
+	 * Tests the merger with toMerge security role only.
+	 * The role should be copied in base.
+	 * 
+	 * @throws ModelException
+	 */
+	//@Test
+	public void testSingleSecurityRoleCaseToMerge() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		SecurityRole role = JavaeeFactory.eINSTANCE.createSecurityRole();
+		role.setRoleName("test1");
+
+		descriptorToMerge.getSecurityRoles().add(role);
+
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		Assert.assertNotNull(descriptorBase.getSecurityRoles());
+		Assert.assertEquals(1, descriptorBase.getSecurityRoles().size());
+		Assert.assertEquals(1, descriptorToMerge.getSecurityRoles().size());
+		Assert.assertTrue(((SecurityRole)descriptorBase.getSecurityRoles().get(0)).getRoleName().equals("test1"));
+	}
+
+	/**
+	 * Tests the merger with one and the same security role.
+	 * The result should be non merged 1 security role.
+	 * 
+	 * @throws ModelException
+	 */
+	//@Test
+	public void testSingleSecurityRoleCaseSameRole() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		SecurityRole role = JavaeeFactory.eINSTANCE.createSecurityRole();
+		role.setRoleName("test1");
+		descriptorBase.getSecurityRoles().add(role);
+		descriptorToMerge.getSecurityRoles().add(role);
+
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		Assert.assertNotNull(descriptorBase.getSecurityRoles());
+		Assert.assertTrue(descriptorBase.getSecurityRoles().size() == 1);
+		Assert.assertTrue(descriptorToMerge.getSecurityRoles().size() == 1);
+		Assert.assertTrue(((SecurityRole)descriptorBase.getSecurityRoles().get(0)).getRoleName().equals("test1"));
+	}
+
+	/**
+	 * Tests the merger with variety of security roles.
+	 * 
+	 * @throws ModelException
+	 */
+	//@Test
+	public void testSingleSecurityRoleCaseComplex() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		SecurityRole role0 = JavaeeFactory.eINSTANCE.createSecurityRole();
+		SecurityRole role1 = JavaeeFactory.eINSTANCE.createSecurityRole();
+		SecurityRole role2 = JavaeeFactory.eINSTANCE.createSecurityRole();
+		SecurityRole role3 = JavaeeFactory.eINSTANCE.createSecurityRole();
+		SecurityRole role4 = JavaeeFactory.eINSTANCE.createSecurityRole();
+		SecurityRole role5 = JavaeeFactory.eINSTANCE.createSecurityRole();
+		role0.setRoleName("test1");
+		role1.setRoleName("test2");
+		role2.setRoleName("test3");
+		role3.setRoleName("test4");
+		role4.setRoleName("test5");
+		role5.setRoleName("test6");
+
+
+
+		descriptorBase.getSecurityRoles().add(role1);
+		descriptorBase.getSecurityRoles().add(role3);
+		descriptorBase.getSecurityRoles().add(role4);
+		descriptorBase.getSecurityRoles().add(role5);
+
+
+		descriptorToMerge.getSecurityRoles().add(role0);
+		descriptorToMerge.getSecurityRoles().add(role1);
+		descriptorToMerge.getSecurityRoles().add(role2);
+
+
+
+
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		Assert.assertNotNull(descriptorBase.getSecurityRoles());
+		Assert.assertTrue(descriptorBase.getSecurityRoles().size() == 6);
+		Assert.assertTrue(descriptorToMerge.getSecurityRoles().size() == 3);
+		Assert.assertTrue(containsSecRole(descriptorBase.getSecurityRoles(), role0.getRoleName()));
+		Assert.assertTrue(containsSecRole(descriptorBase.getSecurityRoles(), role1.getRoleName()));
+		Assert.assertTrue(containsSecRole(descriptorBase.getSecurityRoles(), role2.getRoleName()));
+		Assert.assertTrue(containsSecRole(descriptorBase.getSecurityRoles(), role3.getRoleName()));
+		Assert.assertTrue(containsSecRole(descriptorBase.getSecurityRoles(), role4.getRoleName()));
+		Assert.assertTrue(containsSecRole(descriptorBase.getSecurityRoles(), role5.getRoleName()));
+	}
+
+	private boolean containsSecRole(List list, String roleName) {
+
+
+		for (Object object : list) {
+			SecurityRole role = (SecurityRole) object;
+			if(roleName == null){
+				if(roleName == role.getRoleName()){
+					return true;
+				}
+			} else if(roleName.equals(role.getRoleName())){
+				return true;
+			}
+		}
+		return false;
+	}
+
+
+	/**
+	 * Tests the merger with Base security role only.
+	 * No merge is necessary
+	 * 
+	 * @throws ModelException
+	 */
+	//@Test
+	public void testSingleRunAsCaseBase() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		RunAs role = JavaeeFactory.eINSTANCE.createRunAs();
+		Servlet servletBase = WebFactory.eINSTANCE.createServlet();
+		servletBase.setServletName("servName");
+		Servlet servletMerge = WebFactory.eINSTANCE.createServlet();
+		servletMerge.setServletName("servName");
+		role.setRoleName("test1");
+		servletBase.setRunAs(role);
+
+		descriptorBase.getServlets().add(servletBase);
+		descriptorToMerge.getServlets().add(servletMerge);
+
+
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		Assert.assertNotNull(servletBase.getRunAs());
+		Assert.assertTrue(((RunAs)servletBase.getRunAs()).getRoleName().equals("test1"));
+	}
+
+	/**
+	 * Tests the merger with toMerge security role only.
+	 * The role should be copied in base.
+	 * 
+	 * @throws ModelException
+	 */
+	//@Test
+	public void testSingleRunAsCaseToMerge() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		RunAs role = JavaeeFactory.eINSTANCE.createRunAs();
+		Servlet servletBase = WebFactory.eINSTANCE.createServlet();
+		servletBase.setServletName("servName");
+		Servlet servletMerge = WebFactory.eINSTANCE.createServlet();
+		servletMerge.setServletName("servName");
+		role.setRoleName("test1");
+		servletMerge.setRunAs(role);
+
+		descriptorBase.getServlets().add(servletBase);
+		descriptorToMerge.getServlets().add(servletMerge);
+
+
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		Assert.assertNotNull(servletBase.getRunAs());
+		Assert.assertTrue(((RunAs)servletBase.getRunAs()).getRoleName().equals("test1"));
+		Assert.assertEquals(1, descriptorBase.getServlets().size());
+	}
+
+
+	/**
+	 * Tests the merger with null named servlet in toMerge array, the merger should ignore such entries.
+	 * 
+	 * @throws ModelException
+	 */
+	//@Test
+	public void testSingleNullServletToMerge() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		Servlet servletBase = WebFactory.eINSTANCE.createServlet();
+
+		descriptorToMerge.getServlets().add(servletBase);
+
+
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		Assert.assertEquals(0, descriptorBase.getServlets().size());
+	}
+
+	/**
+	 * Tests the merger with null named servlet in Base, as this is extremely unlikely
+	 * the merger should not stop merging because of such error.
+	 * 
+	 * @throws ModelException
+	 */
+	//@Test
+	public void testSingleNullNamedServletInBase() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		Servlet servletBase = WebFactory.eINSTANCE.createServlet();
+		Servlet servletMerge = WebFactory.eINSTANCE.createServlet();
+		servletMerge.setServletName("servName");
+
+		descriptorBase.getServlets().add(servletBase);
+		descriptorToMerge.getServlets().add(servletMerge);
+
+
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		Assert.assertEquals(2, descriptorBase.getServlets().size());
+	}
+
+	/**
+	 * Tests the merger with one and the same security role.
+	 * The result should be non merged 1 security role.
+	 * 
+	 * @throws ModelException
+	 */
+	//@Test
+	public void testSingleRunAsCaseSameRole() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		RunAs role = JavaeeFactory.eINSTANCE.createRunAs();
+		Servlet servletBase = WebFactory.eINSTANCE.createServlet();
+		servletBase.setServletName("servName");
+		Servlet servletMerge = WebFactory.eINSTANCE.createServlet();
+		servletMerge.setServletName("servName");
+		role.setRoleName("test1");
+		servletBase.setRunAs(role);
+		servletMerge.setRunAs(role);
+
+		descriptorBase.getServlets().add(servletBase);
+		descriptorToMerge.getServlets().add(servletMerge);
+
+
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		Assert.assertNotNull(servletBase.getRunAs());
+		Assert.assertTrue(((RunAs)servletBase.getRunAs()).getRoleName().equals("test1"));
+	}
+
+
+
+	/**
+	 * Tests the merger with Base security constraints only.
+	 * No merge is necessary
+	 * 
+	 * @throws ModelException
+	 */
+//	@Test
+	@SuppressWarnings("unchecked")
+	public void testSingleSecurityConstraintCaseBase() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		SecurityConstraint sc = WebFactory.eINSTANCE.createSecurityConstraint();
+		AuthConstraint createAuthConstraint = WebFactory.eINSTANCE.createAuthConstraint();
+		createAuthConstraint.getRoleNames().add("test");
+		sc.setAuthConstraint(createAuthConstraint);
+		UserDataConstraint userDataConstraint = WebFactory.eINSTANCE.createUserDataConstraint();
+		userDataConstraint.setTransportGuarantee(TransportGuaranteeType.CONFIDENTIAL_LITERAL);
+		sc.setUserDataConstraint(userDataConstraint);
+
+		descriptorBase.getSecurityConstraints().add(sc);
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		Assert.assertNotNull(descriptorBase.getSecurityConstraints());
+		Assert.assertTrue(descriptorBase.getSecurityConstraints().size() == 1);
+		Assert.assertTrue(descriptorToMerge.getSecurityConstraints().size() == 0);
+		Assert.assertTrue(((SecurityConstraint)descriptorBase.getSecurityConstraints().get(0)).getAuthConstraint().getRoleNames().get(0).equals("test"));
+	}
+
+	/**
+	 * Tests the merger with toMerge security constraints only.
+	 * The role should be copied in base.
+	 * 
+	 * @throws ModelException
+	 */
+	//@Test
+	public void testSingleSecurityConstraintCaseToMerge() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		SecurityConstraint sc = WebFactory.eINSTANCE.createSecurityConstraint();
+		AuthConstraint createAuthConstraint = WebFactory.eINSTANCE.createAuthConstraint();
+		createAuthConstraint.getRoleNames().add("test");
+		sc.setAuthConstraint(createAuthConstraint);
+		UserDataConstraint userDataConstraint = WebFactory.eINSTANCE.createUserDataConstraint();
+		userDataConstraint.setTransportGuarantee(TransportGuaranteeType.CONFIDENTIAL_LITERAL);
+		sc.setUserDataConstraint(userDataConstraint);
+
+		descriptorBase.getSecurityConstraints().add(sc);
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		WebApp3Merger result = new WebApp3Merger(descriptorToMerge, descriptorBase, 0);
+		result.process();
+		Assert.assertNotNull(descriptorToMerge.getSecurityConstraints());
+		Assert.assertTrue(descriptorToMerge.getSecurityConstraints().size() == 1);
+		Assert.assertTrue(((SecurityConstraint)descriptorToMerge.getSecurityConstraints().get(0)).getAuthConstraint().getRoleNames().get(0).equals("test"));
+	}
+	
+	
+	//@Test
+	public void testSingleServletMappingInBase() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		Servlet servletBase = WebFactory.eINSTANCE.createServlet();
+		Servlet servletMerge = WebFactory.eINSTANCE.createServlet();
+		
+		String sname = "servName";
+		servletBase.setServletName(sname);
+		servletMerge.setServletName(sname);
+		
+		ServletMapping servletMappingBase = WebFactory.eINSTANCE.createServletMapping();
+		UrlPatternType urlPatternType = JavaeeFactory.eINSTANCE.createUrlPatternType();
+		String value = "/1";
+		urlPatternType.setValue(value);
+		
+		servletMappingBase.setServletName(sname);
+		servletMappingBase.getUrlPatterns().add(urlPatternType);
+		
+		descriptorBase.getServletMappings().add(servletMappingBase);
+
+		descriptorBase.getServlets().add(servletBase);
+		descriptorToMerge.getServlets().add(servletMerge);
+
+
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		Assert.assertEquals(1, descriptorBase.getServletMappings().size());
+		ServletMapping mapping = descriptorBase.getServletMappings().get(0);
+		
+		Assert.assertEquals(sname, mapping.getServletName());
+		
+		Assert.assertEquals(1, mapping.getUrlPatterns().size());
+		Assert.assertEquals(value, mapping.getUrlPatterns().get(0).getValue());
+	}
+	
+	
+	//@Test
+	public void testSingleServletMappingInToMerge() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		Servlet servletBase = WebFactory.eINSTANCE.createServlet();
+		Servlet servletMerge = WebFactory.eINSTANCE.createServlet();
+		
+		String sname = "servName";
+		servletBase.setServletName(sname);
+		servletMerge.setServletName(sname);
+		
+		ServletMapping servletMappingBase = WebFactory.eINSTANCE.createServletMapping();
+		UrlPatternType urlPatternType = JavaeeFactory.eINSTANCE.createUrlPatternType();
+		String value = "/1";
+		urlPatternType.setValue(value);
+		
+		servletMappingBase.setServletName(sname);
+		servletMappingBase.getUrlPatterns().add(urlPatternType);
+		
+		descriptorToMerge.getServletMappings().add(servletMappingBase);
+
+		descriptorBase.getServlets().add(servletBase);
+		descriptorToMerge.getServlets().add(servletMerge);
+
+
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		Assert.assertEquals(1, descriptorBase.getServletMappings().size());
+		ServletMapping mapping = descriptorBase.getServletMappings().get(0);
+		
+		Assert.assertEquals(sname, mapping.getServletName());
+		
+		Assert.assertEquals(1, mapping.getUrlPatterns().size());
+		Assert.assertEquals(value, mapping.getUrlPatterns().get(0).getValue());
+	}
+	
+	//@Test
+	public void testSingleServletMappingSame() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		Servlet servletBase = WebFactory.eINSTANCE.createServlet();
+		Servlet servletMerge = WebFactory.eINSTANCE.createServlet();
+		
+		String sname = "servName";
+		servletBase.setServletName(sname);
+		servletMerge.setServletName(sname);
+		
+		ServletMapping servletMappingBase = WebFactory.eINSTANCE.createServletMapping();
+		UrlPatternType urlPatternType = JavaeeFactory.eINSTANCE.createUrlPatternType();
+		String value = "/1";
+		urlPatternType.setValue(value);
+		
+		servletMappingBase.setServletName(sname);
+		servletMappingBase.getUrlPatterns().add(urlPatternType);
+		
+		descriptorToMerge.getServletMappings().add(servletMappingBase);
+		descriptorBase.getServletMappings().add(servletMappingBase);
+
+		descriptorBase.getServlets().add(servletBase);
+		descriptorToMerge.getServlets().add(servletMerge);
+
+
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		Assert.assertEquals(1, descriptorBase.getServletMappings().size());
+		ServletMapping mapping = descriptorBase.getServletMappings().get(0);
+		
+		Assert.assertEquals(sname, mapping.getServletName());
+
+		Assert.assertEquals(1, mapping.getUrlPatterns().size());
+		Assert.assertEquals(value, mapping.getUrlPatterns().get(0).getValue());
+	}
+	
+	//@Test
+	public void testSingleServletMappingAdditive() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		Servlet servletBase = WebFactory.eINSTANCE.createServlet();
+		Servlet servletMerge = WebFactory.eINSTANCE.createServlet();
+		
+		String sname = "servName";
+		servletBase.setServletName(sname);
+		servletMerge.setServletName(sname);
+		
+		String value = "/1";
+		String value2 = "/2";
+		
+		UrlPatternType urlPatternType = JavaeeFactory.eINSTANCE.createUrlPatternType();
+		urlPatternType.setValue(value);
+		
+		UrlPatternType urlPatternType2 = JavaeeFactory.eINSTANCE.createUrlPatternType();
+		urlPatternType2.setValue(value2);
+		
+		ServletMapping servletMappingBase = WebFactory.eINSTANCE.createServletMapping();
+		ServletMapping servletMappingMerge = WebFactory.eINSTANCE.createServletMapping();
+		
+		servletMappingBase.setServletName(sname);
+		servletMappingBase.getUrlPatterns().add(urlPatternType);
+		
+		servletMappingMerge.setServletName(sname);
+		servletMappingMerge.getUrlPatterns().add(urlPatternType2);
+		
+		descriptorBase.getServletMappings().add(servletMappingBase);
+		descriptorToMerge.getServletMappings().add(servletMappingMerge);
+
+		descriptorBase.getServlets().add(servletBase);
+		descriptorToMerge.getServlets().add(servletMerge);
+
+
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		Assert.assertEquals(1, descriptorBase.getServletMappings().size());
+		ServletMapping mapping = descriptorBase.getServletMappings().get(0);
+		
+		Assert.assertEquals(sname, mapping.getServletName());
+		Assert.assertEquals(2, mapping.getUrlPatterns().size());
+		Assert.assertEquals(value, mapping.getUrlPatterns().get(0).getValue());
+	}
+	
+	//@Test
+	public void testSingleServletMappingDifferentServletName() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		Servlet servletBase = WebFactory.eINSTANCE.createServlet();
+		Servlet servletMerge = WebFactory.eINSTANCE.createServlet();
+		
+		String sname = "servName";
+		String sname1 = "servName1";
+		servletBase.setServletName(sname);
+		servletMerge.setServletName(sname1);
+		
+		String value = "/1";
+		String value2 = "/2";
+		
+		UrlPatternType urlPatternType = JavaeeFactory.eINSTANCE.createUrlPatternType();
+		urlPatternType.setValue(value);
+		
+		UrlPatternType urlPatternType2 = JavaeeFactory.eINSTANCE.createUrlPatternType();
+		urlPatternType2.setValue(value2);
+		
+		ServletMapping servletMappingBase = WebFactory.eINSTANCE.createServletMapping();
+		ServletMapping servletMappingMerge = WebFactory.eINSTANCE.createServletMapping();
+		
+		servletMappingBase.setServletName(sname);
+		servletMappingBase.getUrlPatterns().add(urlPatternType);
+		
+		servletMappingMerge.setServletName(sname1);
+		servletMappingMerge.getUrlPatterns().add(urlPatternType2);
+		
+		descriptorBase.getServletMappings().add(servletMappingBase);
+		descriptorToMerge.getServletMappings().add(servletMappingMerge);
+
+		descriptorBase.getServlets().add(servletBase);
+		descriptorToMerge.getServlets().add(servletMerge);
+
+
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		Assert.assertEquals(2, descriptorBase.getServletMappings().size());
+	}
+	
+	
+	
+	
+	
+	
+	
+	
+	//@Test
+	public void testSingleFilterMappingInBase() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		Filter servletBase = WebFactory.eINSTANCE.createFilter();
+		Filter servletMerge = WebFactory.eINSTANCE.createFilter();
+		
+		String sname = "servName";
+		servletBase.setFilterName(sname);
+		servletMerge.setFilterName(sname);
+		
+		FilterMapping FilterMappingBase = WebFactory.eINSTANCE.createFilterMapping();
+		UrlPatternType urlPatternType = JavaeeFactory.eINSTANCE.createUrlPatternType();
+		String value = "/1";
+		urlPatternType.setValue(value);
+		
+		FilterMappingBase.setFilterName(sname);
+		FilterMappingBase.getUrlPatterns().add(urlPatternType);
+		
+		descriptorBase.getFilterMappings().add(FilterMappingBase);
+
+		descriptorBase.getFilters().add(servletBase);
+		descriptorToMerge.getFilters().add(servletMerge);
+
+
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		Assert.assertEquals(1, descriptorBase.getFilterMappings().size());
+		FilterMapping mapping = descriptorBase.getFilterMappings().get(0);
+		
+		Assert.assertEquals(sname, mapping.getFilterName());
+		
+		Assert.assertEquals(1, mapping.getUrlPatterns().size());
+		Assert.assertEquals(value, mapping.getUrlPatterns().get(0).getValue());
+	}
+	
+	
+	//@Test
+	public void testSingleFilterMappingInToMerge() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		Filter servletBase = WebFactory.eINSTANCE.createFilter();
+		Filter servletMerge = WebFactory.eINSTANCE.createFilter();
+		
+		String sname = "servName";
+		servletBase.setFilterName(sname);
+		servletMerge.setFilterName(sname);
+		
+		FilterMapping FilterMappingBase = WebFactory.eINSTANCE.createFilterMapping();
+		UrlPatternType urlPatternType = JavaeeFactory.eINSTANCE.createUrlPatternType();
+		String value = "/1";
+		urlPatternType.setValue(value);
+		
+		FilterMappingBase.setFilterName(sname);
+		FilterMappingBase.getUrlPatterns().add(urlPatternType);
+		
+		descriptorToMerge.getFilterMappings().add(FilterMappingBase);
+
+		descriptorBase.getFilters().add(servletBase);
+		descriptorToMerge.getFilters().add(servletMerge);
+
+
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		Assert.assertEquals(1, descriptorBase.getFilterMappings().size());
+		FilterMapping mapping = descriptorBase.getFilterMappings().get(0);
+		
+		Assert.assertEquals(sname, mapping.getFilterName());
+		
+		Assert.assertEquals(1, mapping.getUrlPatterns().size());
+		Assert.assertEquals(value, mapping.getUrlPatterns().get(0).getValue());
+	}
+	
+	//@Test
+	public void testSingleFilterMappingSame() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		Filter servletBase = WebFactory.eINSTANCE.createFilter();
+		Filter servletMerge = WebFactory.eINSTANCE.createFilter();
+		
+		String sname = "servName";
+		servletBase.setFilterName(sname);
+		servletMerge.setFilterName(sname);
+		
+		FilterMapping FilterMappingBase = WebFactory.eINSTANCE.createFilterMapping();
+		UrlPatternType urlPatternType = JavaeeFactory.eINSTANCE.createUrlPatternType();
+		String value = "/1";
+		urlPatternType.setValue(value);
+		
+		FilterMappingBase.setFilterName(sname);
+		FilterMappingBase.getUrlPatterns().add(urlPatternType);
+		
+		descriptorToMerge.getFilterMappings().add(FilterMappingBase);
+		descriptorBase.getFilterMappings().add(FilterMappingBase);
+
+		descriptorBase.getFilters().add(servletBase);
+		descriptorToMerge.getFilters().add(servletMerge);
+
+
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		Assert.assertEquals(1, descriptorBase.getFilterMappings().size());
+		FilterMapping mapping = descriptorBase.getFilterMappings().get(0);
+		
+		Assert.assertEquals(sname, mapping.getFilterName());
+
+		Assert.assertEquals(1, mapping.getUrlPatterns().size());
+		Assert.assertEquals(value, mapping.getUrlPatterns().get(0).getValue());
+	}
+	
+	//@Test
+	public void testSingleFilterMappingAdditive() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		Filter servletBase = WebFactory.eINSTANCE.createFilter();
+		Filter servletMerge = WebFactory.eINSTANCE.createFilter();
+		
+		String sname = "servName";
+		servletBase.setFilterName(sname);
+		servletMerge.setFilterName(sname);
+		
+		String value = "/1";
+		String value2 = "/2";
+		
+		UrlPatternType urlPatternType = JavaeeFactory.eINSTANCE.createUrlPatternType();
+		urlPatternType.setValue(value);
+		
+		UrlPatternType urlPatternType2 = JavaeeFactory.eINSTANCE.createUrlPatternType();
+		urlPatternType2.setValue(value2);
+		
+		FilterMapping filterMappingBase = WebFactory.eINSTANCE.createFilterMapping();
+		FilterMapping filterMappingMerge = WebFactory.eINSTANCE.createFilterMapping();
+		
+		filterMappingBase.setFilterName(sname);
+		filterMappingBase.getUrlPatterns().add(urlPatternType);
+		
+		filterMappingMerge.setFilterName(sname);
+		filterMappingMerge.getUrlPatterns().add(urlPatternType2);
+		
+		descriptorBase.getFilterMappings().add(filterMappingBase);
+		descriptorToMerge.getFilterMappings().add(filterMappingMerge);
+
+		descriptorBase.getFilters().add(servletBase);
+		descriptorToMerge.getFilters().add(servletMerge);
+
+
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		Assert.assertEquals(1, descriptorBase.getFilterMappings().size());
+		FilterMapping mapping = descriptorBase.getFilterMappings().get(0);
+		
+		Assert.assertEquals(sname, mapping.getFilterName());
+		Assert.assertEquals(2, mapping.getUrlPatterns().size());
+		Assert.assertEquals(value, mapping.getUrlPatterns().get(0).getValue());
+	}
+	
+	//@Test
+	public void testSingleFilterMappingDifferentFilterName() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		Filter servletBase = WebFactory.eINSTANCE.createFilter();
+		Filter servletMerge = WebFactory.eINSTANCE.createFilter();
+		
+		String sname = "servName";
+		String sname1 = "servName1";
+		servletBase.setFilterName(sname);
+		servletMerge.setFilterName(sname1);
+		
+		String value = "/1";
+		String value2 = "/2";
+		
+		UrlPatternType urlPatternType = JavaeeFactory.eINSTANCE.createUrlPatternType();
+		urlPatternType.setValue(value);
+		
+		UrlPatternType urlPatternType2 = JavaeeFactory.eINSTANCE.createUrlPatternType();
+		urlPatternType2.setValue(value2);
+		
+		FilterMapping FilterMappingBase = WebFactory.eINSTANCE.createFilterMapping();
+		FilterMapping FilterMappingMerge = WebFactory.eINSTANCE.createFilterMapping();
+		
+		FilterMappingBase.setFilterName(sname);
+		FilterMappingBase.getUrlPatterns().add(urlPatternType);
+		
+		FilterMappingMerge.setFilterName(sname1);
+		FilterMappingMerge.getUrlPatterns().add(urlPatternType2);
+		
+		descriptorBase.getFilterMappings().add(FilterMappingBase);
+		descriptorToMerge.getFilterMappings().add(FilterMappingMerge);
+
+		descriptorBase.getFilters().add(servletBase);
+		descriptorToMerge.getFilters().add(servletMerge);
+
+
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		Assert.assertEquals(2, descriptorBase.getFilterMappings().size());
+	}
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	//@Test
+	public void testSingleInitParamsInBase() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		Servlet servletBase = WebFactory.eINSTANCE.createServlet();
+		Servlet servletMerge = WebFactory.eINSTANCE.createServlet();
+		
+		String sname = "servName";
+		servletBase.setServletName(sname);
+		servletMerge.setServletName(sname);
+		
+		ParamValue initParamsType = JavaeeFactory.eINSTANCE.createParamValue();
+		String value = "/1";
+		initParamsType.setParamName(sname);
+		initParamsType.setParamValue(value);
+		
+		servletBase.getInitParams().add(initParamsType);
+		
+		descriptorBase.getServlets().add(servletBase);
+		descriptorToMerge.getServlets().add(servletMerge);
+
+
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		
+		Assert.assertEquals(1, descriptorBase.getServlets().size());
+		Servlet rservlet = descriptorBase.getServlets().get(0);
+		
+		Assert.assertEquals(1, rservlet.getInitParams().size());
+		Assert.assertEquals(sname, rservlet.getInitParams().get(0).getParamName());
+		Assert.assertEquals(value, rservlet.getInitParams().get(0).getParamValue());
+	}
+	
+	
+	//@Test
+	public void testSingleInitParamsInToMerge() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		Servlet servletBase = WebFactory.eINSTANCE.createServlet();
+		Servlet servletMerge = WebFactory.eINSTANCE.createServlet();
+		
+		String sname = "servName";
+		servletBase.setServletName(sname);
+		servletMerge.setServletName(sname);
+		
+		ParamValue initParamsType = JavaeeFactory.eINSTANCE.createParamValue();
+		String value = "/1";
+		initParamsType.setParamName(sname);
+		initParamsType.setParamValue(value);
+		
+		servletMerge.getInitParams().add(initParamsType);
+		
+		descriptorBase.getServlets().add(servletBase);
+		descriptorToMerge.getServlets().add(servletMerge);
+
+
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		
+		Assert.assertEquals(1, descriptorBase.getServlets().size());
+		Servlet rservlet = descriptorBase.getServlets().get(0);
+		
+		Assert.assertEquals(1, rservlet.getInitParams().size());
+		Assert.assertEquals(sname, rservlet.getInitParams().get(0).getParamName());
+		Assert.assertEquals(value, rservlet.getInitParams().get(0).getParamValue());
+	}
+	
+	//@Test
+	public void testSingleInitParamsSame() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		Servlet servletBase = WebFactory.eINSTANCE.createServlet();
+		Servlet servletMerge = WebFactory.eINSTANCE.createServlet();
+		
+		String sname = "servName";
+		servletBase.setServletName(sname);
+		servletMerge.setServletName(sname);
+		
+		ParamValue initParamsType = JavaeeFactory.eINSTANCE.createParamValue();
+		String value = "/1";
+		initParamsType.setParamName(sname);
+		initParamsType.setParamValue(value);
+		
+		servletBase.getInitParams().add(initParamsType);
+		servletMerge.getInitParams().add(initParamsType);
+		
+		descriptorBase.getServlets().add(servletBase);
+		descriptorToMerge.getServlets().add(servletMerge);
+
+
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		
+		Assert.assertEquals(1, descriptorBase.getServlets().size());
+		Servlet rservlet = descriptorBase.getServlets().get(0);
+		
+		Assert.assertEquals(1, rservlet.getInitParams().size());
+		Assert.assertEquals(sname, rservlet.getInitParams().get(0).getParamName());
+		Assert.assertEquals(value, rservlet.getInitParams().get(0).getParamValue());
+	}
+	
+	//@Test
+	public void testSingleInitParamsAdditive() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		Servlet servletBase = WebFactory.eINSTANCE.createServlet();
+		Servlet servletMerge = WebFactory.eINSTANCE.createServlet();
+		
+		String sname = "servName";
+		
+		servletBase.setServletName(sname);
+		servletMerge.setServletName(sname);
+		
+		
+		String value = "/1";
+		String value2 = "/2";
+		
+		ParamValue initParamsType = JavaeeFactory.eINSTANCE.createParamValue();
+		initParamsType.setParamName(sname);
+		initParamsType.setParamValue(value);
+		
+		ParamValue initParamsType2 = JavaeeFactory.eINSTANCE.createParamValue();
+		initParamsType2.setParamName(sname);
+		initParamsType2.setParamValue(value2);
+		
+		servletBase.getInitParams().add(initParamsType);
+		servletMerge.getInitParams().add(initParamsType2);
+		
+		descriptorBase.getServlets().add(servletBase);
+		descriptorToMerge.getServlets().add(servletMerge);
+
+
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		
+		Assert.assertEquals(1, descriptorBase.getServlets().size());
+		Servlet rservlet = descriptorBase.getServlets().get(0);
+		
+		Assert.assertEquals(1, rservlet.getInitParams().size());
+		Assert.assertEquals(sname, rservlet.getInitParams().get(0).getParamName());
+		Assert.assertEquals(value2, rservlet.getInitParams().get(0).getParamValue());
+	}
+	
+	//@Test
+	public void testSingleInitParamsDifferentServletName() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		Servlet servletBase = WebFactory.eINSTANCE.createServlet();
+		Servlet servletMerge = WebFactory.eINSTANCE.createServlet();
+		
+		String sname = "servName";
+		String sname2 = "servName2";
+		
+		servletBase.setServletName(sname);
+		servletMerge.setServletName(sname);
+		
+		
+		String value = "/1";
+		String value2 = "/2";
+		
+		ParamValue initParamsType = JavaeeFactory.eINSTANCE.createParamValue();
+		initParamsType.setParamName(sname);
+		initParamsType.setParamValue(value);
+		
+		ParamValue initParamsType2 = JavaeeFactory.eINSTANCE.createParamValue();
+		initParamsType2.setParamName(sname2);
+		initParamsType2.setParamValue(value2);
+		
+		servletBase.getInitParams().add(initParamsType);
+		servletMerge.getInitParams().add(initParamsType2);
+		
+		descriptorBase.getServlets().add(servletBase);
+		descriptorToMerge.getServlets().add(servletMerge);
+
+
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		
+		Assert.assertEquals(1, descriptorBase.getServlets().size());
+		Servlet rservlet = descriptorBase.getServlets().get(0);
+		
+		Assert.assertEquals(2, rservlet.getInitParams().size());
+	}
+	
+	
+	
+	
+	
+	
+	
+	
+	//@Test
+	public void testSingleFilterInitParamsInBase() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		Filter servletBase = WebFactory.eINSTANCE.createFilter();
+		Filter servletMerge = WebFactory.eINSTANCE.createFilter();
+		
+		String sname = "servName";
+		
+		servletBase.setFilterName(sname);
+		servletMerge.setFilterName(sname);
+		
+		
+		String value = "/1";
+		
+		ParamValue initParamsType = JavaeeFactory.eINSTANCE.createParamValue();
+		initParamsType.setParamName(sname);
+		initParamsType.setParamValue(value);
+		
+		ParamValue initParamsType2 = JavaeeFactory.eINSTANCE.createParamValue();
+		initParamsType2.setParamName(sname);
+		initParamsType2.setParamValue(value);
+		
+		servletBase.getInitParams().add(initParamsType);
+		
+		descriptorBase.getFilters().add(servletBase);
+		descriptorToMerge.getFilters().add(servletMerge);
+
+
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		
+		Assert.assertEquals(1, descriptorBase.getFilters().size());
+		Filter rservlet = descriptorBase.getFilters().get(0);
+		
+		Assert.assertEquals(1, rservlet.getInitParams().size());
+		Assert.assertEquals(sname, rservlet.getInitParams().get(0).getParamName());
+		Assert.assertEquals(value, rservlet.getInitParams().get(0).getParamValue());
+	}
+	
+	
+	//@Test
+	public void testSingleFilterInitParamsInToMerge() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		Filter servletBase = WebFactory.eINSTANCE.createFilter();
+		Filter servletMerge = WebFactory.eINSTANCE.createFilter();
+		
+		String sname = "servName";
+		
+		servletBase.setFilterName(sname);
+		servletMerge.setFilterName(sname);
+		
+		
+		String value = "/1";
+		
+		ParamValue initParamsType = JavaeeFactory.eINSTANCE.createParamValue();
+		initParamsType.setParamName(sname);
+		initParamsType.setParamValue(value);
+		
+		ParamValue initParamsType2 = JavaeeFactory.eINSTANCE.createParamValue();
+		initParamsType2.setParamName(sname);
+		initParamsType2.setParamValue(value);
+		
+		servletMerge.getInitParams().add(initParamsType2);
+		
+		descriptorBase.getFilters().add(servletBase);
+		descriptorToMerge.getFilters().add(servletMerge);
+
+
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		
+		Assert.assertEquals(1, descriptorBase.getFilters().size());
+		Filter rservlet = descriptorBase.getFilters().get(0);
+		
+		Assert.assertEquals(1, rservlet.getInitParams().size());
+		Assert.assertEquals(sname, rservlet.getInitParams().get(0).getParamName());
+		Assert.assertEquals(value, rservlet.getInitParams().get(0).getParamValue());
+	}
+	
+	//@Test
+	public void testSingleFilterInitParamsSame() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		Filter servletBase = WebFactory.eINSTANCE.createFilter();
+		Filter servletMerge = WebFactory.eINSTANCE.createFilter();
+		
+		String sname = "servName";
+		
+		servletBase.setFilterName(sname);
+		servletMerge.setFilterName(sname);
+		
+		
+		String value = "/1";
+		
+		ParamValue initParamsType = JavaeeFactory.eINSTANCE.createParamValue();
+		initParamsType.setParamName(sname);
+		initParamsType.setParamValue(value);
+		
+		ParamValue initParamsType2 = JavaeeFactory.eINSTANCE.createParamValue();
+		initParamsType2.setParamName(sname);
+		initParamsType2.setParamValue(value);
+		
+		servletBase.getInitParams().add(initParamsType);
+		servletMerge.getInitParams().add(initParamsType2);
+		
+		descriptorBase.getFilters().add(servletBase);
+		descriptorToMerge.getFilters().add(servletMerge);
+
+
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		
+		Assert.assertEquals(1, descriptorBase.getFilters().size());
+		Filter rservlet = descriptorBase.getFilters().get(0);
+		
+		Assert.assertEquals(1, rservlet.getInitParams().size());
+		Assert.assertEquals(sname, rservlet.getInitParams().get(0).getParamName());
+		Assert.assertEquals(value, rservlet.getInitParams().get(0).getParamValue());
+	}
+	
+	//@Test
+	public void testSingleFilterInitParamsAdditive() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		Filter servletBase = WebFactory.eINSTANCE.createFilter();
+		Filter servletMerge = WebFactory.eINSTANCE.createFilter();
+		
+		String sname = "servName";
+		
+		servletBase.setFilterName(sname);
+		servletMerge.setFilterName(sname);
+		
+		
+		String value = "/1";
+		String value2 = "/2";
+		
+		ParamValue initParamsType = JavaeeFactory.eINSTANCE.createParamValue();
+		initParamsType.setParamName(sname);
+		initParamsType.setParamValue(value);
+		
+		ParamValue initParamsType2 = JavaeeFactory.eINSTANCE.createParamValue();
+		initParamsType2.setParamName(sname);
+		initParamsType2.setParamValue(value2);
+		
+		servletBase.getInitParams().add(initParamsType);
+		servletMerge.getInitParams().add(initParamsType2);
+		
+		descriptorBase.getFilters().add(servletBase);
+		descriptorToMerge.getFilters().add(servletMerge);
+
+
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		
+		Assert.assertEquals(1, descriptorBase.getFilters().size());
+		Filter rservlet = descriptorBase.getFilters().get(0);
+		
+		Assert.assertEquals(1, rservlet.getInitParams().size());
+		Assert.assertEquals(sname, rservlet.getInitParams().get(0).getParamName());
+		Assert.assertEquals(value2, rservlet.getInitParams().get(0).getParamValue());	
+	}
+	
+	//@Test
+	public void testSingleFilterInitParamDifferentFilterName() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		Filter servletBase = WebFactory.eINSTANCE.createFilter();
+		Filter servletMerge = WebFactory.eINSTANCE.createFilter();
+		
+		String sname = "servName";
+		
+		servletBase.setFilterName(sname);
+		servletMerge.setFilterName(sname);
+		
+		
+		String value = "/1";
+		String value2 = "/2";
+		
+		ParamValue initParamsType = JavaeeFactory.eINSTANCE.createParamValue();
+		initParamsType.setParamName(sname);
+		initParamsType.setParamValue(value);
+		
+		ParamValue initParamsType2 = JavaeeFactory.eINSTANCE.createParamValue();
+		initParamsType2.setParamName(sname);
+		initParamsType2.setParamValue(value2);
+		
+		servletBase.getInitParams().add(initParamsType);
+		servletMerge.getInitParams().add(initParamsType2);
+		
+		descriptorBase.getFilters().add(servletBase);
+		descriptorToMerge.getFilters().add(servletMerge);
+
+
+		WebApp3Merger result = new WebApp3Merger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		
+		Assert.assertEquals(1, descriptorBase.getFilters().size());
+		Filter rservlet = descriptorBase.getFilters().get(0);
+		
+		Assert.assertEquals(1, rservlet.getInitParams().size());
+	}
+
+	/**
+	 * Tests the merger "add" behavior with filter mappings with
+	 * different url-patterns
+	 * No merge is necessary
+	 * 
+	 * @throws ModelException
+	 */
+	//@Test
+	public void testFilterMappingsCaseSameAdd() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+
+		Filter filter = WebFactory.eINSTANCE.createFilter();
+		filter.setFilterName("TestFilter");
+		filter.setFilterClass("test.TestFilter");
+		List<Filter> filters = descriptorBase.getFilters();
+		filters.add(filter);
+
+		UrlPatternType urlPattern = JavaeeFactory.eINSTANCE.createUrlPatternType();
+		urlPattern.setValue("/pattern1/*");
+		FilterMapping filterMapping = WebFactory.eINSTANCE.createFilterMapping();
+		filterMapping.setFilterName("TestFilter");
+		List<UrlPatternType> urlPatterns = filterMapping.getUrlPatterns();
+		urlPatterns.add(urlPattern);
+		List<FilterMapping> filterMappings = descriptorBase.getFilterMappings();
+		filterMappings.add(filterMapping);
+
+		Filter filter2 = WebFactory.eINSTANCE.createFilter();
+		filter2.setFilterName("TestFilter");
+		filter2.setFilterClass("test.TestFilter2");
+		List<Filter> filters2 = descriptorToMerge.getFilters();
+		filters2.add(filter2);
+
+		UrlPatternType urlPattern2 = JavaeeFactory.eINSTANCE.createUrlPatternType();
+		urlPattern2.setValue("/pattern2/*");
+		FilterMapping filterMapping2 = WebFactory.eINSTANCE.createFilterMapping();
+		filterMapping2.setFilterName("TestFilter");
+		List<UrlPatternType> urlPatterns2 = filterMapping2.getUrlPatterns();
+		urlPatterns2.add(urlPattern2);
+		List<FilterMapping> filterMappings2 = descriptorToMerge.getFilterMappings();
+		filterMappings2.add(filterMapping2);
+
+		WebAppMerger result = new WebApp3Merger(descriptorBase, descriptorToMerge, ModelElementMerger.ADD);
+		result.process();
+		Assert.assertNotNull(descriptorBase.getFilters());
+		Assert.assertEquals(1, descriptorBase.getFilters().size());
+		Assert.assertEquals(1, descriptorToMerge.getFilters().size());
+		Assert.assertEquals(1, descriptorToMerge.getFilterMappings().size());
+		Filter f = descriptorBase.getFilters().get(0);
+		Assert.assertNotNull(f);
+		Assert.assertTrue(f.getFilterName().equals("TestFilter"));
+		Assert.assertNotNull(descriptorBase.getFilterMappings());
+		Assert.assertEquals(1, descriptorBase.getFilterMappings().size());
+		FilterMapping m = descriptorBase.getFilterMappings().get(0);
+		Assert.assertTrue(m.getFilterName().equals("TestFilter"));
+		Assert.assertNotNull(m.getUrlPatterns());
+		Assert.assertEquals(2, m.getUrlPatterns().size());
+		Assert.assertTrue(m.getUrlPatterns().get(0).getValue().equals("/pattern1/*"));
+	}
+
+	/**
+	 * Tests the merger "copy" behavior with filter mappings with
+	 * different url-patterns
+	 * The filter mapping should be copied to base
+	 * 
+	 * @throws ModelException
+	 */
+	//@Test
+	public void testFilterMappingsCaseSameCopy() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+
+		Filter filter = WebFactory.eINSTANCE.createFilter();
+		filter.setFilterName("TestFilter");
+		filter.setFilterClass("test.TestFilter");
+		List<Filter> filters = descriptorBase.getFilters();
+		filters.add(filter);
+
+		UrlPatternType urlPattern = JavaeeFactory.eINSTANCE.createUrlPatternType();
+		urlPattern.setValue("/pattern1/*");
+		FilterMapping filterMapping = WebFactory.eINSTANCE.createFilterMapping();
+		filterMapping.setFilterName("TestFilter");
+		List<UrlPatternType> urlPatterns = filterMapping.getUrlPatterns();
+		urlPatterns.add(urlPattern);
+		List<FilterMapping> filterMappings = descriptorBase.getFilterMappings();
+		filterMappings.add(filterMapping);
+
+		Filter filter2 = WebFactory.eINSTANCE.createFilter();
+		filter2.setFilterName("TestFilter");
+		filter2.setFilterClass("test.TestFilter2");
+		List<Filter> filters2 = descriptorToMerge.getFilters();
+		filters2.add(filter2);
+
+		UrlPatternType urlPattern2 = JavaeeFactory.eINSTANCE.createUrlPatternType();
+		urlPattern2.setValue("/pattern2/*");
+		FilterMapping filterMapping2 = WebFactory.eINSTANCE.createFilterMapping();
+		filterMapping2.setFilterName("TestFilter");
+		List<UrlPatternType> urlPatterns2 = filterMapping2.getUrlPatterns();
+		urlPatterns2.add(urlPattern2);
+		List<FilterMapping> filterMappings2 = descriptorToMerge.getFilterMappings();
+		filterMappings2.add(filterMapping2);
+
+		WebAppMerger result = new WebApp3Merger(descriptorBase, descriptorToMerge, ModelElementMerger.COPY);
+		result.process();
+		Assert.assertNotNull(descriptorBase.getFilters());
+		Assert.assertEquals(1, descriptorBase.getFilters().size());
+		Assert.assertEquals(1, descriptorToMerge.getFilters().size());
+		Assert.assertEquals(1, descriptorToMerge.getFilterMappings().size());
+		Filter f = descriptorBase.getFilters().get(0);
+		Assert.assertNotNull(f);
+		Assert.assertTrue(f.getFilterName().equals("TestFilter"));
+		Assert.assertNotNull(descriptorBase.getFilterMappings());
+		Assert.assertEquals(1, descriptorBase.getFilterMappings().size());
+		FilterMapping m = descriptorBase.getFilterMappings().get(0);
+		Assert.assertTrue(m.getFilterName().equals("TestFilter"));
+		Assert.assertNotNull(m.getUrlPatterns());
+		Assert.assertEquals(2, m.getUrlPatterns().size());
+		Assert.assertTrue(m.getUrlPatterns().get(0).getValue().equals("/pattern1/*"));
+		m = descriptorBase.getFilterMappings().get(0);
+		Assert.assertTrue(m.getFilterName().equals("TestFilter"));
+		Assert.assertNotNull(m.getUrlPatterns());
+		Assert.assertEquals(2, m.getUrlPatterns().size());
+		Assert.assertTrue(m.getUrlPatterns().get(0).getValue().equals("/pattern1/*"));
+		Assert.assertTrue(m.getUrlPatterns().get(1).getValue().equals("/pattern2/*"));
+	}
+
+	/**
+	 * Tests the merger "add" behavior with servlet mappings with
+	 * different url-patterns
+	 * No merge is necessary
+	 * 
+	 * @throws ModelException
+	 */
+	//@Test
+	public void testServletMappingsCaseSameAdd() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+
+		Servlet servlet = WebFactory.eINSTANCE.createServlet();
+		servlet.setServletName("TestServlet");
+		servlet.setServletClass("test.TestServlet");
+		List<Servlet> servlets = descriptorBase.getServlets();
+		servlets.add(servlet);
+
+		UrlPatternType urlPattern = JavaeeFactory.eINSTANCE.createUrlPatternType();
+		urlPattern.setValue("/pattern1");
+		ServletMapping servletMapping = WebFactory.eINSTANCE.createServletMapping();
+		servletMapping.setServletName("TestServlet");
+		List<UrlPatternType> urlPatterns = servletMapping.getUrlPatterns();
+		urlPatterns.add(urlPattern);
+		List<ServletMapping> servletMappings = descriptorBase.getServletMappings();
+		servletMappings.add(servletMapping);
+
+		Servlet servlet2 = WebFactory.eINSTANCE.createServlet();
+		servlet2.setServletName("TestServlet");
+		servlet2.setServletClass("test.TestServlet2");
+		List<Servlet> servlets2 = descriptorToMerge.getServlets();
+		servlets2.add(servlet2);
+
+		UrlPatternType urlPattern2 = JavaeeFactory.eINSTANCE.createUrlPatternType();
+		urlPattern2.setValue("/pattern2");
+		ServletMapping servletMapping2 = WebFactory.eINSTANCE.createServletMapping();
+		servletMapping2.setServletName("TestServlet");
+		List<UrlPatternType> urlPatterns2 = servletMapping2.getUrlPatterns();
+		urlPatterns2.add(urlPattern2);
+		List<ServletMapping> servletMappings2 = descriptorToMerge.getServletMappings();
+		servletMappings2.add(servletMapping2);
+
+		WebAppMerger result = new WebApp3Merger(descriptorBase, descriptorToMerge, ModelElementMerger.ADD);
+		result.process();
+		Assert.assertNotNull(descriptorBase.getServlets());
+		Assert.assertEquals(1, descriptorBase.getServlets().size());
+		Assert.assertEquals(1, descriptorToMerge.getServlets().size());
+		Assert.assertEquals(1, descriptorToMerge.getServletMappings().size());
+		Servlet s = descriptorBase.getServlets().get(0);
+		Assert.assertNotNull(s);
+		Assert.assertTrue(s.getServletName().equals("TestServlet"));
+		Assert.assertNotNull(descriptorBase.getServletMappings());
+		Assert.assertEquals(1, descriptorBase.getServletMappings().size());
+		ServletMapping m = descriptorBase.getServletMappings().get(0);
+		Assert.assertTrue(m.getServletName().equals("TestServlet"));
+		Assert.assertNotNull(m.getUrlPatterns());
+		Assert.assertEquals(2, m.getUrlPatterns().size());
+		Assert.assertTrue(m.getUrlPatterns().get(0).getValue().equals("/pattern1"));
+		Assert.assertTrue(m.getUrlPatterns().get(1).getValue().equals("/pattern2"));
+	}
+
+	/**
+	 * Tests the merger "copy" behavior with servlet mappings with
+	 * different url-patterns
+	 * The servlet mapping should be copied to base
+	 * 
+	 * @throws ModelException
+	 */
+	//@Test
+	public void testServletMappingsCaseSameCopy() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+
+		Servlet servlet = WebFactory.eINSTANCE.createServlet();
+		servlet.setServletName("TestServlet");
+		servlet.setServletClass("test.TestServlet");
+		List<Servlet> servlets = descriptorBase.getServlets();
+		servlets.add(servlet);
+
+		UrlPatternType urlPattern = JavaeeFactory.eINSTANCE.createUrlPatternType();
+		urlPattern.setValue("/pattern1");
+		ServletMapping servletMapping = WebFactory.eINSTANCE.createServletMapping();
+		servletMapping.setServletName("TestServlet");
+		List<UrlPatternType> urlPatterns = servletMapping.getUrlPatterns();
+		urlPatterns.add(urlPattern);
+		List<ServletMapping> servletMappings = descriptorBase.getServletMappings();
+		servletMappings.add(servletMapping);
+
+		Servlet servlet2 = WebFactory.eINSTANCE.createServlet();
+		servlet2.setServletName("TestServlet");
+		servlet2.setServletClass("test.TestServlet2");
+		List<Servlet> servlets2 = descriptorToMerge.getServlets();
+		servlets2.add(servlet2);
+
+		UrlPatternType urlPattern2 = JavaeeFactory.eINSTANCE.createUrlPatternType();
+		urlPattern2.setValue("/pattern2");
+		ServletMapping servletMapping2 = WebFactory.eINSTANCE.createServletMapping();
+		servletMapping2.setServletName("TestServlet");
+		List<UrlPatternType> urlPatterns2 = servletMapping2.getUrlPatterns();
+		urlPatterns2.add(urlPattern2);
+		List<ServletMapping> servletMappings2 = descriptorToMerge.getServletMappings();
+		servletMappings2.add(servletMapping2);
+
+		WebAppMerger result = new WebApp3Merger(descriptorBase, descriptorToMerge, ModelElementMerger.COPY);
+		result.process();
+		Assert.assertNotNull(descriptorBase.getServlets());
+		Assert.assertEquals(1, descriptorBase.getServlets().size());
+		Assert.assertEquals(1, descriptorToMerge.getServlets().size());
+		Assert.assertEquals(1, descriptorToMerge.getServletMappings().size());
+		Servlet s = descriptorBase.getServlets().get(0);
+		Assert.assertNotNull(s);
+		Assert.assertTrue(s.getServletName().equals("TestServlet"));
+		Assert.assertNotNull(descriptorBase.getServletMappings());
+		Assert.assertEquals(1, descriptorBase.getServletMappings().size());
+		ServletMapping m = descriptorBase.getServletMappings().get(0);
+		Assert.assertTrue(m.getServletName().equals("TestServlet"));
+		Assert.assertNotNull(m.getUrlPatterns());
+		Assert.assertEquals(2, m.getUrlPatterns().size());
+		Assert.assertTrue(m.getUrlPatterns().get(0).getValue().equals("/pattern1"));
+		Assert.assertTrue(m.getUrlPatterns().get(1).getValue().equals("/pattern2"));
+//		m = descriptorBase.getServletMappings().get(1);
+//		Assert.assertTrue(m.getServletName().equals("TestServlet"));
+//		Assert.assertNotNull(m.getUrlPatterns());
+//		Assert.assertEquals(1, m.getUrlPatterns().size());
+//		Assert.assertTrue(m.getUrlPatterns().get(0).getValue().equals("/pattern2"));
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/mergers/tests/WebAppMergerTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/mergers/tests/WebAppMergerTest.java
new file mode 100644
index 0000000..690c1cf
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/mergers/tests/WebAppMergerTest.java
@@ -0,0 +1,634 @@
+/***********************************************************************
+ * Copyright (c) 2008 by SAP AG, Walldorf. 
+ * 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:
+ *     SAP AG - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jst.jee.model.mergers.tests;
+
+import java.util.List;
+
+import junit.framework.Assert;
+import junit.framework.TestCase;
+
+import org.eclipse.jst.javaee.core.JavaeeFactory;
+import org.eclipse.jst.javaee.core.RunAs;
+import org.eclipse.jst.javaee.core.SecurityRole;
+import org.eclipse.jst.javaee.core.UrlPatternType;
+import org.eclipse.jst.javaee.web.AuthConstraint;
+import org.eclipse.jst.javaee.web.Filter;
+import org.eclipse.jst.javaee.web.FilterMapping;
+import org.eclipse.jst.javaee.web.SecurityConstraint;
+import org.eclipse.jst.javaee.web.Servlet;
+import org.eclipse.jst.javaee.web.ServletMapping;
+import org.eclipse.jst.javaee.web.TransportGuaranteeType;
+import org.eclipse.jst.javaee.web.UserDataConstraint;
+import org.eclipse.jst.javaee.web.WebApp;
+import org.eclipse.jst.javaee.web.WebFactory;
+import org.eclipse.jst.jee.model.internal.mergers.ModelElementMerger;
+import org.eclipse.jst.jee.model.internal.mergers.ModelException;
+import org.eclipse.jst.jee.model.internal.mergers.WebAppMerger;
+
+/**
+ * Tester class for WebAPp artifact.
+ * 
+ * Base suffix means that the base object has some info and 
+ * toMerge is empty: nothing should be merged
+ * 
+ * ToMerge suffix means that the base is empty object and 
+ * toMerge has some info: all from merge should be present in base.
+ * 
+ * Same suffix means that the information in merge and base is one 
+ * and the same: no merge should occurred and additional checks for 
+ * doubling of the elements are present.
+ * 
+ * Complex suffix means variety of information is present in base 
+ * and to merge: consistent information combined by base and toMerge
+ * should be available at the end.
+ * 
+ * ComplexOverlapped suffix means variety of information is present 
+ * in base and to merge: consistent information combined by base and toMerge
+ * should be available at the end. There are artifacts with one and the same 
+ * name and different values: values should be merged into base.
+ *  
+ * 
+ * @author Dimitar Giormov
+ *
+ */
+public class WebAppMergerTest extends TestCase{
+
+	/**
+	 * Tests the merger with Base security role only.
+	 * No merge is necessary
+	 * 
+	 * @throws ModelException
+	 */
+	//@Test
+	public void testSingleSecurityRoleCaseBase() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		SecurityRole role = JavaeeFactory.eINSTANCE.createSecurityRole();
+		role.setRoleName("test1");
+
+		descriptorBase.getSecurityRoles().add(role);
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		WebAppMerger result = new WebAppMerger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		Assert.assertNotNull(descriptorBase.getSecurityRoles());
+		Assert.assertTrue(descriptorBase.getSecurityRoles().size() == 1);
+		Assert.assertTrue(descriptorToMerge.getSecurityRoles().size() == 0);
+		Assert.assertTrue(((SecurityRole)descriptorBase.getSecurityRoles().get(0)).getRoleName().equals("test1"));
+	}
+
+	/**
+	 * Tests the merger with toMerge security role only.
+	 * The role should be copied in base.
+	 * 
+	 * @throws ModelException
+	 */
+	//@Test
+	public void testSingleSecurityRoleCaseToMerge() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		SecurityRole role = JavaeeFactory.eINSTANCE.createSecurityRole();
+		role.setRoleName("test1");
+
+		descriptorToMerge.getSecurityRoles().add(role);
+
+		WebAppMerger result = new WebAppMerger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		Assert.assertNotNull(descriptorBase.getSecurityRoles());
+		Assert.assertEquals(1, descriptorBase.getSecurityRoles().size());
+		Assert.assertEquals(1, descriptorToMerge.getSecurityRoles().size());
+		Assert.assertTrue(((SecurityRole)descriptorBase.getSecurityRoles().get(0)).getRoleName().equals("test1"));
+	}
+
+	/**
+	 * Tests the merger with one and the same security role.
+	 * The result should be non merged 1 security role.
+	 * 
+	 * @throws ModelException
+	 */
+	//@Test
+	public void testSingleSecurityRoleCaseSameRole() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		SecurityRole role = JavaeeFactory.eINSTANCE.createSecurityRole();
+		role.setRoleName("test1");
+		descriptorBase.getSecurityRoles().add(role);
+		descriptorToMerge.getSecurityRoles().add(role);
+
+		WebAppMerger result = new WebAppMerger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		Assert.assertNotNull(descriptorBase.getSecurityRoles());
+		Assert.assertTrue(descriptorBase.getSecurityRoles().size() == 1);
+		Assert.assertTrue(descriptorToMerge.getSecurityRoles().size() == 1);
+		Assert.assertTrue(((SecurityRole)descriptorBase.getSecurityRoles().get(0)).getRoleName().equals("test1"));
+	}
+
+	/**
+	 * Tests the merger with variety of security roles.
+	 * 
+	 * @throws ModelException
+	 */
+	//@Test
+	public void testSingleSecurityRoleCaseComplex() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		SecurityRole role0 = JavaeeFactory.eINSTANCE.createSecurityRole();
+		SecurityRole role1 = JavaeeFactory.eINSTANCE.createSecurityRole();
+		SecurityRole role2 = JavaeeFactory.eINSTANCE.createSecurityRole();
+		SecurityRole role3 = JavaeeFactory.eINSTANCE.createSecurityRole();
+		SecurityRole role4 = JavaeeFactory.eINSTANCE.createSecurityRole();
+		SecurityRole role5 = JavaeeFactory.eINSTANCE.createSecurityRole();
+		role0.setRoleName("test1");
+		role1.setRoleName("test2");
+		role2.setRoleName("test3");
+		role3.setRoleName("test4");
+		role4.setRoleName("test5");
+		role5.setRoleName("test6");
+
+
+
+		descriptorBase.getSecurityRoles().add(role1);
+		descriptorBase.getSecurityRoles().add(role3);
+		descriptorBase.getSecurityRoles().add(role4);
+		descriptorBase.getSecurityRoles().add(role5);
+
+
+		descriptorToMerge.getSecurityRoles().add(role0);
+		descriptorToMerge.getSecurityRoles().add(role1);
+		descriptorToMerge.getSecurityRoles().add(role2);
+
+
+
+
+		WebAppMerger result = new WebAppMerger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		Assert.assertNotNull(descriptorBase.getSecurityRoles());
+		Assert.assertTrue(descriptorBase.getSecurityRoles().size() == 6);
+		Assert.assertTrue(descriptorToMerge.getSecurityRoles().size() == 3);
+		Assert.assertTrue(containsSecRole(descriptorBase.getSecurityRoles(), role0.getRoleName()));
+		Assert.assertTrue(containsSecRole(descriptorBase.getSecurityRoles(), role1.getRoleName()));
+		Assert.assertTrue(containsSecRole(descriptorBase.getSecurityRoles(), role2.getRoleName()));
+		Assert.assertTrue(containsSecRole(descriptorBase.getSecurityRoles(), role3.getRoleName()));
+		Assert.assertTrue(containsSecRole(descriptorBase.getSecurityRoles(), role4.getRoleName()));
+		Assert.assertTrue(containsSecRole(descriptorBase.getSecurityRoles(), role5.getRoleName()));
+	}
+
+	private boolean containsSecRole(List list, String roleName) {
+
+
+		for (Object object : list) {
+			SecurityRole role = (SecurityRole) object;
+			if(roleName == null){
+				if(roleName == role.getRoleName()){
+					return true;
+				}
+			} else if(roleName.equals(role.getRoleName())){
+				return true;
+			}
+		}
+		return false;
+	}
+
+
+	/**
+	 * Tests the merger with Base security role only.
+	 * No merge is necessary
+	 * 
+	 * @throws ModelException
+	 */
+	//@Test
+	public void testSingleRunAsCaseBase() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		RunAs role = JavaeeFactory.eINSTANCE.createRunAs();
+		Servlet servletBase = WebFactory.eINSTANCE.createServlet();
+		servletBase.setServletName("servName");
+		Servlet servletMerge = WebFactory.eINSTANCE.createServlet();
+		servletMerge.setServletName("servName");
+		role.setRoleName("test1");
+		servletBase.setRunAs(role);
+
+		descriptorBase.getServlets().add(servletBase);
+		descriptorToMerge.getServlets().add(servletMerge);
+
+
+		WebAppMerger result = new WebAppMerger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		Assert.assertNotNull(servletBase.getRunAs());
+		Assert.assertTrue(((RunAs)servletBase.getRunAs()).getRoleName().equals("test1"));
+	}
+
+	/**
+	 * Tests the merger with toMerge security role only.
+	 * The role should be copied in base.
+	 * 
+	 * @throws ModelException
+	 */
+	//@Test
+	public void testSingleRunAsCaseToMerge() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		RunAs role = JavaeeFactory.eINSTANCE.createRunAs();
+		Servlet servletBase = WebFactory.eINSTANCE.createServlet();
+		servletBase.setServletName("servName");
+		Servlet servletMerge = WebFactory.eINSTANCE.createServlet();
+		servletMerge.setServletName("servName");
+		role.setRoleName("test1");
+		servletMerge.setRunAs(role);
+
+		descriptorBase.getServlets().add(servletBase);
+		descriptorToMerge.getServlets().add(servletMerge);
+
+
+		WebAppMerger result = new WebAppMerger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		Assert.assertNotNull(servletBase.getRunAs());
+		Assert.assertTrue(((RunAs)servletBase.getRunAs()).getRoleName().equals("test1"));
+		Assert.assertEquals(1, descriptorBase.getServlets().size());
+	}
+
+
+	/**
+	 * Tests the merger with null named servlet in toMerge array, the merger should ignore such entries.
+	 * 
+	 * @throws ModelException
+	 */
+	//@Test
+	public void testSingleNullServletToMerge() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		Servlet servletBase = WebFactory.eINSTANCE.createServlet();
+
+		descriptorToMerge.getServlets().add(servletBase);
+
+
+		WebAppMerger result = new WebAppMerger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		Assert.assertEquals(0, descriptorBase.getServlets().size());
+	}
+
+	/**
+	 * Tests the merger with null named servlet in Base, as this is extremely unlikely
+	 * the merger should not stop merging because of such error.
+	 * 
+	 * @throws ModelException
+	 */
+	//@Test
+	public void testSingleNullNamedServletInBase() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		Servlet servletBase = WebFactory.eINSTANCE.createServlet();
+		Servlet servletMerge = WebFactory.eINSTANCE.createServlet();
+		servletMerge.setServletName("servName");
+
+		descriptorBase.getServlets().add(servletBase);
+		descriptorToMerge.getServlets().add(servletMerge);
+
+
+		WebAppMerger result = new WebAppMerger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		Assert.assertEquals(2, descriptorBase.getServlets().size());
+	}
+
+	/**
+	 * Tests the merger with one and the same security role.
+	 * The result should be non merged 1 security role.
+	 * 
+	 * @throws ModelException
+	 */
+	//@Test
+	public void testSingleRunAsCaseSameRole() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		RunAs role = JavaeeFactory.eINSTANCE.createRunAs();
+		Servlet servletBase = WebFactory.eINSTANCE.createServlet();
+		servletBase.setServletName("servName");
+		Servlet servletMerge = WebFactory.eINSTANCE.createServlet();
+		servletMerge.setServletName("servName");
+		role.setRoleName("test1");
+		servletBase.setRunAs(role);
+		servletMerge.setRunAs(role);
+
+		descriptorBase.getServlets().add(servletBase);
+		descriptorToMerge.getServlets().add(servletMerge);
+
+
+		WebAppMerger result = new WebAppMerger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		Assert.assertNotNull(servletBase.getRunAs());
+		Assert.assertTrue(((RunAs)servletBase.getRunAs()).getRoleName().equals("test1"));
+	}
+
+
+
+	/**
+	 * Tests the merger with Base security constraints only.
+	 * No merge is necessary
+	 * 
+	 * @throws ModelException
+	 */
+//	@Test
+	@SuppressWarnings("unchecked")
+	public void testSingleSecurityConstraintCaseBase() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		SecurityConstraint sc = WebFactory.eINSTANCE.createSecurityConstraint();
+		AuthConstraint createAuthConstraint = WebFactory.eINSTANCE.createAuthConstraint();
+		createAuthConstraint.getRoleNames().add("test");
+		sc.setAuthConstraint(createAuthConstraint);
+		UserDataConstraint userDataConstraint = WebFactory.eINSTANCE.createUserDataConstraint();
+		userDataConstraint.setTransportGuarantee(TransportGuaranteeType.CONFIDENTIAL_LITERAL);
+		sc.setUserDataConstraint(userDataConstraint);
+
+		descriptorBase.getSecurityConstraints().add(sc);
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		WebAppMerger result = new WebAppMerger(descriptorBase, descriptorToMerge, 0);
+		result.process();
+		Assert.assertNotNull(descriptorBase.getSecurityConstraints());
+		Assert.assertTrue(descriptorBase.getSecurityConstraints().size() == 1);
+		Assert.assertTrue(descriptorToMerge.getSecurityConstraints().size() == 0);
+		Assert.assertTrue(((SecurityConstraint)descriptorBase.getSecurityConstraints().get(0)).getAuthConstraint().getRoleNames().get(0).equals("test"));
+	}
+
+	/**
+	 * Tests the merger with toMerge security constraints only.
+	 * The role should be copied in base.
+	 * 
+	 * @throws ModelException
+	 */
+	//@Test
+	public void testSingleSecurityConstraintCaseToMerge() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		SecurityConstraint sc = WebFactory.eINSTANCE.createSecurityConstraint();
+		AuthConstraint createAuthConstraint = WebFactory.eINSTANCE.createAuthConstraint();
+		createAuthConstraint.getRoleNames().add("test");
+		sc.setAuthConstraint(createAuthConstraint);
+		UserDataConstraint userDataConstraint = WebFactory.eINSTANCE.createUserDataConstraint();
+		userDataConstraint.setTransportGuarantee(TransportGuaranteeType.CONFIDENTIAL_LITERAL);
+		sc.setUserDataConstraint(userDataConstraint);
+
+		descriptorBase.getSecurityConstraints().add(sc);
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+		WebAppMerger result = new WebAppMerger(descriptorToMerge, descriptorBase, 0);
+		result.process();
+		Assert.assertNotNull(descriptorToMerge.getSecurityConstraints());
+		Assert.assertTrue(descriptorToMerge.getSecurityConstraints().size() == 1);
+		Assert.assertTrue(((SecurityConstraint)descriptorToMerge.getSecurityConstraints().get(0)).getAuthConstraint().getRoleNames().get(0).equals("test"));
+	}
+
+	/**
+	 * Tests the merger "add" behavior with filter mappings with
+	 * different url-patterns
+	 * No merge is necessary
+	 * 
+	 * @throws ModelException
+	 */
+	//@Test
+	public void testFilterMappingsCaseSameAdd() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+
+		Filter filter = WebFactory.eINSTANCE.createFilter();
+		filter.setFilterName("TestFilter");
+		filter.setFilterClass("test.TestFilter");
+		List<Filter> filters = descriptorBase.getFilters();
+		filters.add(filter);
+
+		UrlPatternType urlPattern = JavaeeFactory.eINSTANCE.createUrlPatternType();
+		urlPattern.setValue("/pattern1/*");
+		FilterMapping filterMapping = WebFactory.eINSTANCE.createFilterMapping();
+		filterMapping.setFilterName("TestFilter");
+		List<UrlPatternType> urlPatterns = filterMapping.getUrlPatterns();
+		urlPatterns.add(urlPattern);
+		List<FilterMapping> filterMappings = descriptorBase.getFilterMappings();
+		filterMappings.add(filterMapping);
+
+		Filter filter2 = WebFactory.eINSTANCE.createFilter();
+		filter2.setFilterName("TestFilter");
+		filter2.setFilterClass("test.TestFilter2");
+		List<Filter> filters2 = descriptorToMerge.getFilters();
+		filters2.add(filter2);
+
+		UrlPatternType urlPattern2 = JavaeeFactory.eINSTANCE.createUrlPatternType();
+		urlPattern2.setValue("/pattern2/*");
+		FilterMapping filterMapping2 = WebFactory.eINSTANCE.createFilterMapping();
+		filterMapping2.setFilterName("TestFilter");
+		List<UrlPatternType> urlPatterns2 = filterMapping2.getUrlPatterns();
+		urlPatterns2.add(urlPattern2);
+		List<FilterMapping> filterMappings2 = descriptorToMerge.getFilterMappings();
+		filterMappings2.add(filterMapping2);
+
+		WebAppMerger result = new WebAppMerger(descriptorBase, descriptorToMerge, ModelElementMerger.ADD);
+		result.process();
+		Assert.assertNotNull(descriptorBase.getFilters());
+		Assert.assertEquals(1, descriptorBase.getFilters().size());
+		Assert.assertEquals(1, descriptorToMerge.getFilters().size());
+		Assert.assertEquals(1, descriptorToMerge.getFilterMappings().size());
+		Filter f = descriptorBase.getFilters().get(0);
+		Assert.assertNotNull(f);
+		Assert.assertTrue(f.getFilterName().equals("TestFilter"));
+		Assert.assertNotNull(descriptorBase.getFilterMappings());
+		Assert.assertEquals(1, descriptorBase.getFilterMappings().size());
+		FilterMapping m = descriptorBase.getFilterMappings().get(0);
+		Assert.assertTrue(m.getFilterName().equals("TestFilter"));
+		Assert.assertNotNull(m.getUrlPatterns());
+		Assert.assertEquals(1, m.getUrlPatterns().size());
+		Assert.assertTrue(m.getUrlPatterns().get(0).getValue().equals("/pattern1/*"));
+	}
+
+	/**
+	 * Tests the merger "copy" behavior with filter mappings with
+	 * different url-patterns
+	 * The filter mapping should be copied to base
+	 * 
+	 * @throws ModelException
+	 */
+	//@Test
+	public void testFilterMappingsCaseSameCopy() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+
+		Filter filter = WebFactory.eINSTANCE.createFilter();
+		filter.setFilterName("TestFilter");
+		filter.setFilterClass("test.TestFilter");
+		List<Filter> filters = descriptorBase.getFilters();
+		filters.add(filter);
+
+		UrlPatternType urlPattern = JavaeeFactory.eINSTANCE.createUrlPatternType();
+		urlPattern.setValue("/pattern1/*");
+		FilterMapping filterMapping = WebFactory.eINSTANCE.createFilterMapping();
+		filterMapping.setFilterName("TestFilter");
+		List<UrlPatternType> urlPatterns = filterMapping.getUrlPatterns();
+		urlPatterns.add(urlPattern);
+		List<FilterMapping> filterMappings = descriptorBase.getFilterMappings();
+		filterMappings.add(filterMapping);
+
+		Filter filter2 = WebFactory.eINSTANCE.createFilter();
+		filter2.setFilterName("TestFilter");
+		filter2.setFilterClass("test.TestFilter2");
+		List<Filter> filters2 = descriptorToMerge.getFilters();
+		filters2.add(filter2);
+
+		UrlPatternType urlPattern2 = JavaeeFactory.eINSTANCE.createUrlPatternType();
+		urlPattern2.setValue("/pattern2/*");
+		FilterMapping filterMapping2 = WebFactory.eINSTANCE.createFilterMapping();
+		filterMapping2.setFilterName("TestFilter");
+		List<UrlPatternType> urlPatterns2 = filterMapping2.getUrlPatterns();
+		urlPatterns2.add(urlPattern2);
+		List<FilterMapping> filterMappings2 = descriptorToMerge.getFilterMappings();
+		filterMappings2.add(filterMapping2);
+
+		WebAppMerger result = new WebAppMerger(descriptorBase, descriptorToMerge, ModelElementMerger.COPY);
+		result.process();
+		Assert.assertNotNull(descriptorBase.getFilters());
+		Assert.assertEquals(1, descriptorBase.getFilters().size());
+		Assert.assertEquals(1, descriptorToMerge.getFilters().size());
+		Assert.assertEquals(1, descriptorToMerge.getFilterMappings().size());
+		Filter f = descriptorBase.getFilters().get(0);
+		Assert.assertNotNull(f);
+		Assert.assertTrue(f.getFilterName().equals("TestFilter"));
+		Assert.assertNotNull(descriptorBase.getFilterMappings());
+		Assert.assertEquals(2, descriptorBase.getFilterMappings().size());
+		FilterMapping m = descriptorBase.getFilterMappings().get(0);
+		Assert.assertTrue(m.getFilterName().equals("TestFilter"));
+		Assert.assertNotNull(m.getUrlPatterns());
+		Assert.assertEquals(1, m.getUrlPatterns().size());
+		Assert.assertTrue(m.getUrlPatterns().get(0).getValue().equals("/pattern1/*"));
+		m = descriptorBase.getFilterMappings().get(1);
+		Assert.assertTrue(m.getFilterName().equals("TestFilter"));
+		Assert.assertNotNull(m.getUrlPatterns());
+		Assert.assertEquals(1, m.getUrlPatterns().size());
+		Assert.assertTrue(m.getUrlPatterns().get(0).getValue().equals("/pattern2/*"));
+	}
+
+	/**
+	 * Tests the merger "add" behavior with servlet mappings with
+	 * different url-patterns
+	 * No merge is necessary
+	 * 
+	 * @throws ModelException
+	 */
+	//@Test
+	public void testServletMappingsCaseSame() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+
+		Servlet servlet = WebFactory.eINSTANCE.createServlet();
+		servlet.setServletName("TestServlet");
+		servlet.setServletClass("test.TestServlet");
+		List<Servlet> servlets = descriptorBase.getServlets();
+		servlets.add(servlet);
+
+		UrlPatternType urlPattern = JavaeeFactory.eINSTANCE.createUrlPatternType();
+		urlPattern.setValue("/pattern1");
+		ServletMapping servletMapping = WebFactory.eINSTANCE.createServletMapping();
+		servletMapping.setServletName("TestServlet");
+		List<UrlPatternType> urlPatterns = servletMapping.getUrlPatterns();
+		urlPatterns.add(urlPattern);
+		List<ServletMapping> servletMappings = descriptorBase.getServletMappings();
+		servletMappings.add(servletMapping);
+
+		Servlet servlet2 = WebFactory.eINSTANCE.createServlet();
+		servlet2.setServletName("TestServlet");
+		servlet2.setServletClass("test.TestServlet2");
+		List<Servlet> servlets2 = descriptorToMerge.getServlets();
+		servlets2.add(servlet2);
+
+		UrlPatternType urlPattern2 = JavaeeFactory.eINSTANCE.createUrlPatternType();
+		urlPattern2.setValue("/pattern2");
+		ServletMapping servletMapping2 = WebFactory.eINSTANCE.createServletMapping();
+		servletMapping2.setServletName("TestServlet");
+		List<UrlPatternType> urlPatterns2 = servletMapping2.getUrlPatterns();
+		urlPatterns2.add(urlPattern2);
+		List<ServletMapping> servletMappings2 = descriptorToMerge.getServletMappings();
+		servletMappings2.add(servletMapping2);
+
+		WebAppMerger result = new WebAppMerger(descriptorBase, descriptorToMerge, ModelElementMerger.ADD);
+		result.process();
+		Assert.assertNotNull(descriptorBase.getServlets());
+		Assert.assertEquals(1, descriptorBase.getServlets().size());
+		Assert.assertEquals(1, descriptorToMerge.getServlets().size());
+		Assert.assertEquals(1, descriptorToMerge.getServletMappings().size());
+		Servlet s = descriptorBase.getServlets().get(0);
+		Assert.assertNotNull(s);
+		Assert.assertTrue(s.getServletName().equals("TestServlet"));
+		Assert.assertNotNull(descriptorBase.getServletMappings());
+		Assert.assertEquals(1, descriptorBase.getServletMappings().size());
+		ServletMapping m = descriptorBase.getServletMappings().get(0);
+		Assert.assertTrue(m.getServletName().equals("TestServlet"));
+		Assert.assertNotNull(m.getUrlPatterns());
+		Assert.assertEquals(1, m.getUrlPatterns().size());
+		Assert.assertTrue(m.getUrlPatterns().get(0).getValue().equals("/pattern1"));
+	}
+
+	/**
+	 * Tests the merger "copy" behavior with servlet mappings with
+	 * different url-patterns
+	 * The servlet mapping should be copied to base
+	 * 
+	 * @throws ModelException
+	 */
+	//@Test
+	public void testServletMappingsCaseSameCopy() throws ModelException{
+		WebApp descriptorBase = WebFactory.eINSTANCE.createWebApp();
+		WebApp descriptorToMerge = WebFactory.eINSTANCE.createWebApp();
+
+		Servlet servlet = WebFactory.eINSTANCE.createServlet();
+		servlet.setServletName("TestServlet");
+		servlet.setServletClass("test.TestServlet");
+		List<Servlet> servlets = descriptorBase.getServlets();
+		servlets.add(servlet);
+
+		UrlPatternType urlPattern = JavaeeFactory.eINSTANCE.createUrlPatternType();
+		urlPattern.setValue("/pattern1");
+		ServletMapping servletMapping = WebFactory.eINSTANCE.createServletMapping();
+		servletMapping.setServletName("TestServlet");
+		List<UrlPatternType> urlPatterns = servletMapping.getUrlPatterns();
+		urlPatterns.add(urlPattern);
+		List<ServletMapping> servletMappings = descriptorBase.getServletMappings();
+		servletMappings.add(servletMapping);
+
+		Servlet servlet2 = WebFactory.eINSTANCE.createServlet();
+		servlet2.setServletName("TestServlet");
+		servlet2.setServletClass("test.TestServlet2");
+		List<Servlet> servlets2 = descriptorToMerge.getServlets();
+		servlets2.add(servlet2);
+
+		UrlPatternType urlPattern2 = JavaeeFactory.eINSTANCE.createUrlPatternType();
+		urlPattern2.setValue("/pattern2");
+		ServletMapping servletMapping2 = WebFactory.eINSTANCE.createServletMapping();
+		servletMapping2.setServletName("TestServlet");
+		List<UrlPatternType> urlPatterns2 = servletMapping2.getUrlPatterns();
+		urlPatterns2.add(urlPattern2);
+		List<ServletMapping> servletMappings2 = descriptorToMerge.getServletMappings();
+		servletMappings2.add(servletMapping2);
+
+		WebAppMerger result = new WebAppMerger(descriptorBase, descriptorToMerge, ModelElementMerger.COPY);
+		result.process();
+		Assert.assertNotNull(descriptorBase.getServlets());
+		Assert.assertEquals(1, descriptorBase.getServlets().size());
+		Assert.assertEquals(1, descriptorToMerge.getServlets().size());
+		Assert.assertEquals(1, descriptorToMerge.getServletMappings().size());
+		Servlet s = descriptorBase.getServlets().get(0);
+		Assert.assertNotNull(s);
+		Assert.assertTrue(s.getServletName().equals("TestServlet"));
+		Assert.assertNotNull(descriptorBase.getServletMappings());
+		Assert.assertEquals(2, descriptorBase.getServletMappings().size());
+		ServletMapping m = descriptorBase.getServletMappings().get(0);
+		Assert.assertTrue(m.getServletName().equals("TestServlet"));
+		Assert.assertNotNull(m.getUrlPatterns());
+		Assert.assertEquals(1, m.getUrlPatterns().size());
+		Assert.assertTrue(m.getUrlPatterns().get(0).getValue().equals("/pattern1"));
+		m = descriptorBase.getServletMappings().get(1);
+		Assert.assertTrue(m.getServletName().equals("TestServlet"));
+		Assert.assertNotNull(m.getUrlPatterns());
+		Assert.assertEquals(1, m.getUrlPatterns().size());
+		Assert.assertTrue(m.getUrlPatterns().get(0).getValue().equals("/pattern2"));
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/tests/AbstractAnnotationFactoryTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/tests/AbstractAnnotationFactoryTest.java
new file mode 100644
index 0000000..a6a4ca5
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/tests/AbstractAnnotationFactoryTest.java
@@ -0,0 +1,53 @@
+/***********************************************************************
+ * Copyright (c) 2008 by SAP AG, Walldorf. 
+ * 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:
+ *     SAP AG - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jst.jee.model.tests;
+
+import junit.framework.TestCase;
+
+import org.eclipse.jdt.core.IBuffer;
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.core.WorkingCopyOwner;
+import org.eclipse.jst.jee.model.internal.EjbAnnotationFactory;
+
+/**
+ * @author Kiril Mitov k.mitov@sap.com
+ * 
+ */
+public class AbstractAnnotationFactoryTest extends TestCase{
+
+	protected EjbAnnotationFactory fixture;
+
+//	@Before
+	@Override
+	protected void setUp() throws Exception {
+		fixture = EjbAnnotationFactory.createFactory();
+	}
+
+//	@After
+	@Override
+	protected void tearDown() {
+	}
+
+	protected ICompilationUnit createCompilationUnit(final String name, final String content) throws JavaModelException {
+		WorkingCopyOwner owner = new WorkingCopyOwner() {
+			@Override
+			public IBuffer createBuffer(ICompilationUnit workingCopy) {
+				IBuffer buffer = super.createBuffer(workingCopy);
+				buffer.setContents(content);
+				return buffer;
+			}
+		};
+		return owner.newWorkingCopy(name, new IClasspathEntry[0], null);
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/tests/AbstractAnnotationModelTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/tests/AbstractAnnotationModelTest.java
new file mode 100644
index 0000000..96166f3
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/tests/AbstractAnnotationModelTest.java
@@ -0,0 +1,91 @@
+/***********************************************************************
+ * Copyright (c) 2008 by SAP AG, Walldorf. 
+ * 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:
+ *     SAP AG - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jst.jee.model.tests;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jdt.core.IPackageFragment;
+import org.eclipse.jst.j2ee.model.IModelProvider;
+import org.eclipse.jst.javaee.ejb.EJBJar;
+import org.eclipse.wst.common.project.facet.core.IFacetedProject;
+import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
+
+/**
+ * @author Kiril Mitov k.mitov@sap.com
+ * 
+ */
+public abstract class AbstractAnnotationModelTest extends TestCase {
+
+	protected static final String localInterfaceContent = "package com.sap;" + "import javax.ejb.Local;"
+			+ "@Local public interface SessionBeanLocal {}";
+	protected static final String beanContent = "package com.sap;" + "import javax.ejb.Stateless;"
+			+ "@Stateless public class SessionBean implements SessionBeanLocal {}";
+
+	protected IFacetedProject facetedProject;
+
+	protected IProject clientProject;
+
+	protected IModelProvider fixture;
+
+	@Override
+	protected void setUp() throws Exception {
+		super.setUp();
+		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(this.getClass().getSimpleName());
+		facetedProject = ProjectFacetsManager.create(project);
+	}
+
+	protected void saveFileAndUpdate(IFile beanFile, String beanContent) throws Exception {
+		saveFileAndUpdate(beanFile, beanContent, getFixture());
+	}
+
+	protected void saveFileAndUpdate(IFile beanFile, String beanContent, IModelProvider provider) throws Exception {
+		SynchronousModelChangedListener listener = new SynchronousModelChangedListener(1);
+		provider.addListener(listener);
+		AbstractTest.saveFile(beanFile, beanContent);
+		assertTrue(listener.waitForEvents());
+		provider.removeListener(listener);
+	}
+
+	protected void deleteFileAndUpdate(IFile beanFile) throws Exception, InterruptedException {
+		SynchronousModelChangedListener listener = new SynchronousModelChangedListener(1);
+		getFixture().addListener(listener);
+		AbstractTest.deleteFile(beanFile);
+		assertTrue(listener.waitForEvents());
+		getFixture().removeListener(listener);
+	}
+
+	protected static void createSessionBeanLocal(IPackageFragment fragment) throws Exception {
+		IFile file = ((IContainer) fragment.getResource()).getFile(new Path("SessionBeanLocal.java"));
+		AbstractTest.saveFile(file, localInterfaceContent);
+	}
+
+	protected static void createSessionBean(IPackageFragment fragment) throws Exception {
+		IFile file = ((IContainer) fragment.getResource()).getFile(new Path("SessionBean.java"));
+		AbstractTest.saveFile(file, beanContent);
+	}
+
+	/**
+	 * @return the reader
+	 */
+	protected IModelProvider getFixture() {
+		return fixture;
+	}
+
+	protected EJBJar getEJBJar() {
+		return (EJBJar) getFixture().getModelObject();
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/tests/AbstractTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/tests/AbstractTest.java
new file mode 100644
index 0000000..468233f
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/tests/AbstractTest.java
@@ -0,0 +1,320 @@
+/***********************************************************************
+ * Copyright (c) 2008 by SAP AG, Walldorf. 
+ * 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:
+ *     SAP AG - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jst.jee.model.tests;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.concurrent.Semaphore;
+import java.util.concurrent.TimeUnit;
+
+import junit.framework.AssertionFailedError;
+
+import org.eclipse.core.filebuffers.FileBuffers;
+import org.eclipse.core.filebuffers.ITextFileBuffer;
+import org.eclipse.core.filebuffers.ITextFileBufferManager;
+import org.eclipse.core.filebuffers.LocationKind;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspaceRunnable;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.resources.WorkspaceJob;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jst.common.project.facet.IJavaFacetInstallDataModelProperties;
+import org.eclipse.jst.common.project.facet.JavaFacetInstallDataModelProvider;
+import org.eclipse.jst.common.project.facet.JavaFacetUtils;
+import org.eclipse.jst.j2ee.ejb.project.operations.IEjbFacetInstallDataModelProperties;
+import org.eclipse.jst.j2ee.internal.ejb.project.operations.EjbFacetInstallDataModelProvider;
+import org.eclipse.jst.j2ee.internal.ejb.project.operations.EjbFacetProjectCreationDataModelProvider;
+import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
+import org.eclipse.jst.j2ee.internal.web.archive.operations.WebFacetProjectCreationDataModelProvider;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetConstants;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetInstallDataModelProperties;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetProjectCreationDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties.FacetDataModelMap;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.project.facet.core.IFacetedProject;
+import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
+import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
+
+/**
+ * @author Kiril Mitov k.mitov@sap.com
+ * 
+ */
+public class AbstractTest {
+
+	private static final String EJB_API_JAR_LOCATION = "/home/kiko/local/jboss-4.2.1.GA/server/default/lib/jboss-ejb3x.jar";
+
+	public static IFacetedProject createEjbProject(String earName, String ejbProjectName, String clientName)
+			throws Exception {
+		IDataModel dm = DataModelFactory.createDataModel(new EjbFacetProjectCreationDataModelProvider());
+		dm.setProperty(IFacetProjectCreationDataModelProperties.FACET_PROJECT_NAME, ejbProjectName);
+
+		FacetDataModelMap facetMap = (FacetDataModelMap) dm
+				.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
+		IDataModel facetModel = facetMap.getFacetDataModel(IJ2EEFacetConstants.EJB);
+		facetModel.setProperty(IFacetDataModelProperties.FACET_VERSION, IJ2EEFacetConstants.EJB_30);
+
+		if (earName != null) {
+			dm.setProperty(IJ2EEFacetProjectCreationDataModelProperties.ADD_TO_EAR, true);
+			dm.setProperty(IJ2EEFacetProjectCreationDataModelProperties.EAR_PROJECT_NAME, earName);
+
+			// only create client if given a client name, and is added to EAR
+			if (clientName != null) {
+				facetModel.setBooleanProperty(IEjbFacetInstallDataModelProperties.CREATE_CLIENT, true);
+				facetModel.setStringProperty(IEjbFacetInstallDataModelProperties.CLIENT_NAME, clientName);
+			}
+		} else {
+			dm.setProperty(IJ2EEFacetProjectCreationDataModelProperties.ADD_TO_EAR, false);
+		}
+
+		// this option only exists if JEE5
+		facetModel.setBooleanProperty(IJ2EEFacetInstallDataModelProperties.GENERATE_DD, true);
+
+		IDataModel javaFacetModel = facetMap.getFacetDataModel(IJ2EEFacetConstants.JAVA);
+		javaFacetModel.setProperty(IFacetDataModelProperties.FACET_VERSION, JavaFacetUtils.JAVA_50);
+
+		dm.getDefaultOperation().execute(null, null);
+		IFacetedProject project = ProjectFacetsManager.create(ResourcesPlugin.getWorkspace().getRoot().getProject(
+				ejbProjectName));
+		addEjbApiToClassPath(project);
+		return project;
+	}
+
+	public static IFacetedProject createEjbProject(String projectName) throws Exception {
+		IDataModel dm = DataModelFactory.createDataModel(new EjbFacetProjectCreationDataModelProvider());
+		dm.setProperty(IFacetProjectCreationDataModelProperties.FACET_PROJECT_NAME, projectName); //$NON-NLS-1$
+		FacetDataModelMap facetDataModelMap = (FacetDataModelMap) dm
+				.getProperty("IFacetProjectCreationDataModelProperties.FACET_DM_MAP");
+		IDataModel javaFacetDataModel = facetDataModelMap.getFacetDataModel(J2EEProjectUtilities.JAVA);
+		javaFacetDataModel.setProperty(IFacetDataModelProperties.FACET_VERSION, JavaFacetUtils.JAVA_50);
+		IDataModel ejbFacetDataModel = facetDataModelMap.getFacetDataModel(IJ2EEFacetConstants.EJB);
+		ejbFacetDataModel.setProperty(IFacetDataModelProperties.FACET_VERSION, IJ2EEFacetConstants.EJB_30);
+		dm.getDefaultOperation().execute(null, null);
+		IFacetedProject project = ProjectFacetsManager.create(ResourcesPlugin.getWorkspace().getRoot().getProject(
+				projectName));
+		addEjbApiToClassPath(project);
+		return project;
+	}
+
+	public static void deleteProject(final String projectName) throws InterruptedException {
+		Job deleteJob = new WorkspaceJob("Delete project job...") {
+			@Override
+			public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException {
+				ResourcesPlugin.getWorkspace().getRoot().getProject(projectName).delete(true, monitor);
+				return Status.OK_STATUS;
+			}
+		};
+		deleteJob.setRule(ResourcesPlugin.getWorkspace().getRoot());
+		deleteJob.schedule();
+		deleteJob.join();
+	}
+
+	public static void closeProject(final String projectName) throws Exception {
+		ResourcesPlugin.getWorkspace().run(new IWorkspaceRunnable() {
+
+			public void run(IProgressMonitor monitor) throws CoreException {
+				IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
+				project.close(monitor);
+			}
+		}, new NullProgressMonitor());
+	}
+
+	public static IFacetedProject.Action setupEjbInstallAction() {
+		IDataModel ejbFacetInstallDataModel = DataModelFactory.createDataModel(new EjbFacetInstallDataModelProvider());
+		ejbFacetInstallDataModel.setProperty(IEjbFacetInstallDataModelProperties.CONFIG_FOLDER, "ejbModule");
+		ejbFacetInstallDataModel.setProperty(IEjbFacetInstallDataModelProperties.GENERATE_DD, true);
+		IProjectFacetVersion webfacetversion = ProjectFacetsManager.getProjectFacet("jst.ejb").getVersion("3.0");
+		IFacetedProject.Action action = new IFacetedProject.Action(IFacetedProject.Action.Type.INSTALL,
+				webfacetversion, ejbFacetInstallDataModel);
+		return action;
+	}
+
+	public static IFacetedProject.Action setupJavaInstallAction() {
+		IProjectFacetVersion javafacetversion = ProjectFacetsManager.getProjectFacet("jst.java").getVersion("5.0");
+		IDataModel javaFacetInstallDataModel = DataModelFactory
+				.createDataModel(new JavaFacetInstallDataModelProvider());
+		javaFacetInstallDataModel.setProperty(IJavaFacetInstallDataModelProperties.SOURCE_FOLDER_NAME, "ejbModule");
+		IFacetedProject.Action action = new IFacetedProject.Action(IFacetedProject.Action.Type.INSTALL,
+				javafacetversion, javaFacetInstallDataModel);
+		return action;
+	}
+
+	/**
+	 * @param facetProj
+	 * @param installLocation
+	 * @throws JavaModelException
+	 */
+	private static void addEjbApiToClassPath(IFacetedProject facetProj) throws JavaModelException {
+		IPath classPath = new Path(EJB_API_JAR_LOCATION);
+		IJavaProject javaProject = JavaCore.create(facetProj.getProject());
+		IClasspathEntry[] entries = new IClasspathEntry[javaProject.getRawClasspath().length + 1];
+		System.arraycopy(javaProject.getRawClasspath(), 0, entries, 0, entries.length - 1);
+		IClasspathEntry entry = JavaCore.newLibraryEntry(classPath, null, null);
+		entries[entries.length - 1] = entry;
+		javaProject.setRawClasspath(entries, true, new NullProgressMonitor());
+	}
+
+	public static void saveFile(IFile file, String content) throws Exception {
+		JdtChangeListenerWithSemaphore listener = new JdtChangeListenerWithSemaphore(1);
+		JavaCore.addElementChangedListener(listener);
+		if (file.exists())
+			setContents(content, file);
+		else
+			createFile(content, file);
+		if (listener.waitForEvents() == false)
+			throw new AssertionFailedError();
+		JavaCore.removeElementChangedListener(listener);
+	}
+
+	private static void createFile(final String content, final IFile file) throws Exception {
+		BlockProgressMonitor monitor = new BlockProgressMonitor();
+		ResourcesPlugin.getWorkspace().run(new IWorkspaceRunnable() {
+			public void run(IProgressMonitor monitor) throws CoreException {
+				ByteArrayOutputStream stream = new ByteArrayOutputStream();
+				try {
+					stream.write(content.getBytes());
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+				file.create(new ByteArrayInputStream(stream.toByteArray()), true, monitor);
+			}
+		}, ResourcesPlugin.getWorkspace().getRuleFactory().createRule(file), IResource.FORCE, monitor);
+
+		if (monitor.waitForEvent() == false) {
+			throw new IllegalStateException("Monitor not finished...");
+		}
+	}
+
+	private static void setContents(final String content, final IFile file) throws Exception {
+		BlockProgressMonitor monitor = new BlockProgressMonitor();
+		ResourcesPlugin.getWorkspace().run(new IWorkspaceRunnable() {
+			public void run(IProgressMonitor monitor) throws CoreException {
+				ITextFileBufferManager manager = FileBuffers.getTextFileBufferManager();
+				try {
+					manager.connect(file.getFullPath(), LocationKind.IFILE, monitor);
+					ITextFileBuffer buffer = manager.getTextFileBuffer(file.getFullPath(), LocationKind.IFILE);
+					IDocument document = buffer.getDocument();
+					document.set(content);
+					buffer.commit(monitor, true);
+				} finally {
+					manager.disconnect(file.getFullPath(), LocationKind.IFILE, monitor);
+				}
+			}
+		}, ResourcesPlugin.getWorkspace().getRuleFactory().modifyRule(file), IResource.NONE, monitor);
+		if (monitor.waitForEvent() == false)
+			throw new IllegalStateException("Monitor not finished...");
+	}
+
+	public static void deleteFile(final IFile file) throws Exception {
+		JdtChangeListenerWithSemaphore listener = new JdtChangeListenerWithSemaphore(1);
+		JavaCore.addElementChangedListener(listener);
+		ResourcesPlugin.getWorkspace().run(new IWorkspaceRunnable() {
+			public void run(IProgressMonitor monitor) throws CoreException {
+				file.delete(false, monitor);
+				ResourcesPlugin.getWorkspace().getRoot().refreshLocal(IResource.DEPTH_INFINITE, monitor);
+			}
+		}, new NullProgressMonitor());
+		if (listener.waitForEvents() == false)
+			throw new AssertionFailedError();
+		JavaCore.removeElementChangedListener(listener);
+	}
+
+	private static class BlockProgressMonitor implements IProgressMonitor {
+
+		private Semaphore semaphore;
+
+		private boolean canceled;
+
+		public BlockProgressMonitor() throws InterruptedException {
+			semaphore = new Semaphore(2);
+			semaphore.acquire();
+		}
+
+		public void beginTask(String name, int totalWork) {
+			try {
+				semaphore.acquire();
+			} catch (InterruptedException e) {
+				e.printStackTrace();
+			}
+		}
+
+		public boolean waitForEvent() throws InterruptedException {
+			return semaphore.tryAcquire(5, TimeUnit.SECONDS);
+		}
+
+		public void done() {
+			semaphore.release();
+		}
+
+		public void internalWorked(double work) {
+		}
+
+		public boolean isCanceled() {
+			return canceled;
+		}
+
+		public void setCanceled(boolean value) {
+			semaphore.release();
+			canceled = value;
+		}
+
+		public void setTaskName(String name) {
+
+		}
+
+		public void subTask(String name) {
+
+		}
+
+		public void worked(int work) {
+		}
+
+	}
+
+	public static IFacetedProject createWebProject(String projectName) throws Exception {
+		return createWebProject(projectName, IJ2EEFacetConstants.DYNAMIC_WEB_25, JavaFacetUtils.JAVA_50);
+	}
+	
+	public static IFacetedProject createWebProject(String projectName, Object web_version, IProjectFacetVersion java_version) throws Exception {
+		IDataModel dm = DataModelFactory.createDataModel(new WebFacetProjectCreationDataModelProvider());
+		dm.setProperty(IFacetProjectCreationDataModelProperties.FACET_PROJECT_NAME, projectName); //$NON-NLS-1$
+		FacetDataModelMap facetDataModelMap = (FacetDataModelMap) dm
+				.getProperty("IFacetProjectCreationDataModelProperties.FACET_DM_MAP");
+		IDataModel javaFacetDataModel = facetDataModelMap.getFacetDataModel(J2EEProjectUtilities.JAVA);
+		javaFacetDataModel.setProperty(IFacetDataModelProperties.FACET_VERSION, java_version);
+		IDataModel ejbFacetDataModel = facetDataModelMap.getFacetDataModel(IJ2EEFacetConstants.DYNAMIC_WEB);
+		ejbFacetDataModel.setProperty(IJ2EEFacetInstallDataModelProperties.GENERATE_DD, true);
+		ejbFacetDataModel.setProperty(IFacetDataModelProperties.FACET_VERSION, web_version);
+		dm.getDefaultOperation().execute(null, null);
+		IFacetedProject project = ProjectFacetsManager.create(ResourcesPlugin.getWorkspace().getRoot().getProject(
+				projectName));
+		addEjbApiToClassPath(project);
+		return project;
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/tests/AllAnnotationModelTests.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/tests/AllAnnotationModelTests.java
new file mode 100644
index 0000000..bf7a855
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/tests/AllAnnotationModelTests.java
@@ -0,0 +1,85 @@
+/***********************************************************************
+ * Copyright (c) 2008 by SAP AG, Walldorf. 
+ * 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:
+ *     SAP AG - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jst.jee.model.tests;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jst.jee.model.ejb.tests.DeleteProjectTest;
+import org.eclipse.jst.jee.model.ejb.tests.EJB3MergedModelProviderFactoryTest;
+import org.eclipse.jst.jee.model.ejb.tests.EJB3MergedModelProviderTest;
+import org.eclipse.jst.jee.model.ejb.tests.EJBAnnotationReaderWithClientTest;
+import org.eclipse.jst.jee.model.ejb.tests.Ejb3ModelProviderTest;
+import org.eclipse.jst.jee.model.ejb.tests.EjbAnnotationFactoryTest;
+import org.eclipse.jst.jee.model.ejb.tests.EjbAnnotationReaderTest;
+import org.eclipse.jst.jee.model.ejb.tests.EjbReferenceTest;
+import org.eclipse.jst.jee.model.ejb.tests.GenerateDDTest;
+import org.eclipse.jst.jee.model.ejb.tests.LifecycleAnnotationsTest;
+import org.eclipse.jst.jee.model.ejb.tests.NotifyCloseProjectTest;
+import org.eclipse.jst.jee.model.ejb.tests.ResourceReferenceTest;
+import org.eclipse.jst.jee.model.ejb.tests.SecurityRolesTest;
+import org.eclipse.jst.jee.model.web.tests.DeleteWebProjectTest;
+import org.eclipse.jst.jee.model.web.tests.TestWebXmlModelAfterUpdate;
+import org.eclipse.jst.jee.model.web.tests.Web25MergedModelProviderTest;
+import org.eclipse.jst.jee.model.web.tests.Web3AnnotationReaderTest;
+import org.eclipse.jst.jee.model.web.tests.WebAnnotationReaderTest;
+import org.eclipse.wtp.j2ee.headless.tests.plugin.HeadlessTestsPlugin;
+
+/**
+ * @author Kiril Mitov k.mitov@sap.com
+ * 
+ */
+// @SuiteClasses(value = { EjbAnnotationReaderTest.class,
+// EJBModelWithClientProjectTest.class, EjbReferenceTest.class,
+// LifecycleAnnotationsTest.class, ResourceReferenceTest.class,
+// SecurityRolesTest.class, DeleteProjectTest.class,
+// ManyToOneRelationTest.class, RegisterMergedModelProviderTest.class,
+// EjbAnnotationFactoryTest.class,
+// WebAnnotationReaderTest.class, DeleteWebProjectTest.class,
+// NotifyCloseProjectTest.class,
+// Web25MergedModelProviderTest.class })
+// @RunWith(Suite.class)
+public class AllAnnotationModelTests {
+
+	public static Test suite() {
+		try {
+			TestSuite suite = new TestSuite(AllAnnotationModelTests.class.getName());
+			suite.addTest(EjbAnnotationReaderTest.suite());
+			suite.addTest(EJBAnnotationReaderWithClientTest.suite());
+			suite.addTest(EjbReferenceTest.suite());
+			suite.addTest(LifecycleAnnotationsTest.suite());
+			suite.addTest(ResourceReferenceTest.suite());
+			suite.addTest(SecurityRolesTest.suite());
+			suite.addTest(DeleteProjectTest.suite());
+			suite.addTest(ManyToOneRelationTest.suite());
+			suite.addTest(RegisterMergedModelProviderTest.suite());
+			suite.addTest(EjbAnnotationFactoryTest.suite());
+			suite.addTest(WebAnnotationReaderTest.suite());
+			suite.addTest(Web3AnnotationReaderTest.suite());
+			suite.addTest(DeleteWebProjectTest.suite());
+			suite.addTest(NotifyCloseProjectTest.suite());
+			suite.addTest(TestWebXmlModelAfterUpdate.suite());
+			suite.addTest(Web25MergedModelProviderTest.suite());
+			suite.addTest(GenerateDDTest.suite());
+			suite.addTest(EJB3MergedModelProviderFactoryTest.suite());
+			suite.addTest(EJB3MergedModelProviderTest.suite());
+			suite.addTest(Ejb3ModelProviderTest.suite());
+			return suite;
+		} catch (Exception e) {
+			HeadlessTestsPlugin.getDefault().getLog().log(
+					new Status(IStatus.ERROR, "org.eclipse.jst.j2ee.tests", "Error while building the test suite", e));
+		}
+		return null;
+		// return new JUnit4TestAdapter(AllAnnotationModelTests.class);
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/tests/ChangeListenerWithSemaphore.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/tests/ChangeListenerWithSemaphore.java
new file mode 100644
index 0000000..5c00e77
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/tests/ChangeListenerWithSemaphore.java
@@ -0,0 +1,74 @@
+/***********************************************************************
+ * Copyright (c) 2008 by SAP AG, Walldorf. 
+ * 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:
+ *     SAP AG - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jst.jee.model.tests;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.concurrent.Semaphore;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.core.resources.IResourceChangeEvent;
+import org.eclipse.core.resources.IResourceChangeListener;
+import org.eclipse.core.resources.IResourceDelta;
+
+/**
+ * This change listener will release a semaphore after the resource changed
+ * method is called. For every resourceChanged call one release will be called.
+ * 
+ * @author Kiril Mitov k.mitov@sap.com
+ * 
+ */
+public final class ChangeListenerWithSemaphore implements IResourceChangeListener {
+	private final Semaphore s;
+	private final Collection<IResourceDelta> deltas;
+	private final int expectedEvents;
+	private final List<IResourceChangeEvent> receivedEvents;
+
+	public ChangeListenerWithSemaphore(int expectedEvents) throws InterruptedException {
+		this.expectedEvents = expectedEvents;
+		this.s = new Semaphore(1);
+		this.s.acquire();
+		this.deltas = Collections.synchronizedList(new LinkedList<IResourceDelta>());
+		this.receivedEvents = Collections.synchronizedList(new LinkedList<IResourceChangeEvent>());
+	}
+
+	public synchronized void resourceChanged(IResourceChangeEvent event) {
+		receivedEvents.add(event);
+		if (receivedEvents.size() > expectedEvents)
+			throw new IllegalStateException("The expected events were already reached");
+		try {
+			deltas.add(event.getDelta());
+		} catch (Exception e) {
+			throw new RuntimeException(e);
+		} finally {
+			if (expectedEvents == receivedEvents.size())
+				s.release();
+		}
+	}
+
+	public boolean waitForEvents() throws InterruptedException {
+		return s.tryAcquire(5, TimeUnit.SECONDS);
+	}
+
+	public synchronized Collection<IResourceDelta> getDeltas() {
+		return deltas;
+	}
+
+	public synchronized int getEvents() {
+		return receivedEvents.size();
+	}
+
+	public List<IResourceChangeEvent> getReceivedEvents() {
+		return receivedEvents;
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/tests/JEE5LegacyModelTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/tests/JEE5LegacyModelTest.java
new file mode 100644
index 0000000..5f410ab
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/tests/JEE5LegacyModelTest.java
@@ -0,0 +1,207 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.jee.model.tests;
+import java.util.List;
+
+import junit.framework.Assert;
+import junit.framework.Test;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EAttribute;
+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.xml.type.XMLTypePackage;
+import org.eclipse.jem.util.emf.workbench.FlexibleProjectResourceSet;
+import org.eclipse.jem.util.emf.workbench.WorkbenchResourceHelperBase;
+import org.eclipse.jst.j2ee.archive.emftests.GeneralEMFPopulationTest;
+import org.eclipse.jst.j2ee.archive.testutilities.EMFAttributeFeatureGenerator;
+import org.eclipse.jst.j2ee.datamodel.properties.IJ2EEComponentImportDataModelProperties;
+import org.eclipse.jst.j2ee.ejb.EJBJar;
+import org.eclipse.jst.j2ee.ejb.EnterpriseBean;
+import org.eclipse.jst.j2ee.ejb.Session;
+import org.eclipse.jst.j2ee.ejb.componentcore.util.EJBArtifactEdit;
+import org.eclipse.jst.j2ee.ejb.internal.impl.EJBJarResourceFactory;
+import org.eclipse.jst.j2ee.ejb.internal.impl.EJBResourceImpl;
+import org.eclipse.jst.j2ee.internal.J2EEConstants;
+import org.eclipse.jst.j2ee.internal.ejb.project.operations.EJBComponentImportDataModelProvider;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPreferences;
+import org.eclipse.wst.common.componentcore.internal.impl.WTPResourceFactoryRegistry;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.internal.operations.IHeadlessRunnableWithProgress;
+import org.eclipse.wst.common.tests.ProjectUtility;
+import org.eclipse.wst.common.tests.SimpleTestSuite;
+import org.eclipse.wtp.j2ee.headless.tests.plugin.HeadlessTestsPlugin;
+
+public class JEE5LegacyModelTest extends GeneralEMFPopulationTest {
+	
+	private static final String PROJECTNAME = "TESTEJB3Import";
+	private static final String BASE_IMPORT_DIR = "TestData" + java.io.File.separatorChar;
+	public JEE5LegacyModelTest(String name) {
+		super(name);
+	}
+	
+	
+    public static Test suite() {
+        return new SimpleTestSuite(JEE5LegacyModelTest.class);
+    }
+    /**
+	 * @param eObject
+	 */
+	
+    protected Object primCreateAttributeValue(EAttribute att, EObject eObject) {
+        if (att.getEAttributeType() == XMLTypePackage.eINSTANCE.getQName()) 
+        	return null;
+        else
+            return super.primCreateAttributeValue(att, eObject);
+    }
+    public static IDataModel getEJBImportDataModel(String filePath, String projectName, IDataModel creationModel, boolean closeArchiveOnDispose) {
+    	IDataModel importModel = DataModelFactory.createDataModel(new EJBComponentImportDataModelProvider());
+    	
+    	importModel.setProperty(IJ2EEComponentImportDataModelProperties.FILE_NAME, filePath);
+    	importModel.setProperty(IJ2EEComponentImportDataModelProperties.PROJECT_NAME, projectName);
+    	importModel.setProperty(IJ2EEComponentImportDataModelProperties.CLOSE_ARCHIVE_ON_DISPOSE, closeArchiveOnDispose);
+    	
+    	if(creationModel != null) {
+    		importModel.setProperty(IJ2EEComponentImportDataModelProperties.NESTED_MODEL_J2EE_COMPONENT_CREATION, creationModel);
+    	}
+    	
+    	return importModel;
+    }
+    protected String getArchivePath(String archiveName) throws Exception {
+		HeadlessTestsPlugin plugin = HeadlessTestsPlugin.getDefault();
+		String pluginRelativeFileName = BASE_IMPORT_DIR + getTestDataDirectoryName() + java.io.File.separatorChar + archiveName;
+		return ProjectUtility.getFullFileName(plugin, pluginRelativeFileName);
+	}
+    
+	protected void setUp() throws Exception {
+		super.setUp();
+		final IWorkspace workspace = ResourcesPlugin.getWorkspace();
+		if(workspace.getRoot().getProject(PROJECTNAME).isAccessible()) return;
+        final IProjectDescription description = workspace
+                .newProjectDescription(PROJECTNAME);
+        description.setLocation(null);
+
+
+        // create the new project operation
+        IHeadlessRunnableWithProgress op = new IHeadlessRunnableWithProgress() {
+            public void run(IProgressMonitor monitor)
+           {
+                try {
+                	String archiveName = getArchivePath("TestEJB3.jar");
+                	IDataModel importModel = getEJBImportDataModel(archiveName, "TESTEJB3Import", null, true);
+                	IStatus operationStatus = importModel.getDefaultOperation().execute(new NullProgressMonitor(), null);
+				} catch (Exception e) {
+					e.printStackTrace();
+				}
+            }
+        };
+        
+
+        // run the new project creation operation
+        try {
+        	op.run(new NullProgressMonitor());
+        } catch (InterruptedException e) {
+            return;
+        }
+	}
+    
+public void testEJBModel() throws Exception {
+		
+	
+	EMFAttributeFeatureGenerator.reset();
+	String modelPathURI = J2EEConstants.EJBJAR_DD_URI;
+	URI uri = URI.createURI(J2EEPlugin.getDefault().getJ2EEPreferences().getString(J2EEPreferences.Keys.EJB_CONTENT_FOLDER) + "/" + modelPathURI);
+	FlexibleProjectResourceSet resSet = getResourceSet("TESTEJB3Import");
+	
+	EJBResourceImpl ejbRes = (EJBResourceImpl) resSet.getResource(uri,true,EJBJarResourceFactory.getRegisteredFactory());
+	Assert.assertTrue(ejbRes.getContents().size() > 0);
+	
+	
+	Assert.assertTrue(ejbRes.getContents().size() > 0);
+	
+	if (ejbRes.getContents().size() > 0) {
+		org.eclipse.jst.j2ee.ejb.EJBJar jar = ejbRes.getEJBJar();
+		List<EnterpriseBean> beanslist = jar.getEnterpriseBeans();
+		for (EnterpriseBean enterpriseBean : beanslist) {
+			System.out.println(enterpriseBean.getName());
+			System.out.println(enterpriseBean.getHomeInterfaceName());
+			if (enterpriseBean instanceof Session)
+				System.out.println(((Session)enterpriseBean).getServiceEndpointName());
+			enterpriseBean.setDescription("Ugh");
+		}
+	}
+	ejbRes.save(null);
+	
+
+}
+public void testUsingEJBArtifactEdit() {
+	EJBArtifactEdit edit = null;
+	try {
+		edit = EJBArtifactEdit.getEJBArtifactEditForWrite(getProject());
+		EJBJar ejb = edit.getEJBJar();
+		boolean pass = !ejb.getEnterpriseBeans().isEmpty();
+		assertTrue(pass);
+	} finally {
+		if (edit != null) {
+			edit.dispose();
+		}
+	}
+}
+private FlexibleProjectResourceSet getResourceSet(String projName) {
+		IProject proj = getProject(projName);
+		return (FlexibleProjectResourceSet)WorkbenchResourceHelperBase.getResourceSet(proj);
+	}
+
+
+	public IProject getProject() {
+		return ResourcesPlugin.getWorkspace().getRoot().getProject(PROJECTNAME);
+	}
+	public IProject getProject(String projName) {
+		return ResourcesPlugin.getWorkspace().getRoot().getProject(projName);
+	}
+
+
+	private void registerFactory(URI uri, ResourceSet resSet, Resource.Factory factory) {
+		WTPResourceFactoryRegistry registry = (WTPResourceFactoryRegistry) resSet.getResourceFactoryRegistry();
+		registry.registerLastFileSegment(uri.lastSegment(), factory);
+	}
+	private ResourceSet getResourceSet() {
+		ResourceSet set = new ResourceSetImpl();
+		set.setResourceFactoryRegistry(WTPResourceFactoryRegistry.INSTANCE);
+		return set;
+	}
+
+
+
+	
+	protected void tearDown() throws Exception {
+		// Don't delete these files
+	}
+
+
+	protected String getTestDataDirectoryName() {
+		return "EJBImportTests";
+	}
+
+	
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/tests/JEE5ModelTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/tests/JEE5ModelTest.java
new file mode 100644
index 0000000..13014e1
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/tests/JEE5ModelTest.java
@@ -0,0 +1,426 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.jee.model.tests;
+import junit.framework.Assert;
+import junit.framework.Test;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.impl.EObjectImpl;
+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.xml.type.XMLTypePackage;
+import org.eclipse.jem.util.emf.workbench.ProjectResourceSet;
+import org.eclipse.jem.util.emf.workbench.WorkbenchResourceHelperBase;
+import org.eclipse.jst.common.project.facet.IJavaFacetInstallDataModelProperties;
+import org.eclipse.jst.common.project.facet.JavaFacetInstallDataModelProvider;
+import org.eclipse.jst.j2ee.archive.emftests.GeneralEMFPopulationTest;
+import org.eclipse.jst.j2ee.archive.testutilities.EMFAttributeFeatureGenerator;
+import org.eclipse.jst.j2ee.earcreation.IEarFacetInstallDataModelProperties;
+import org.eclipse.jst.j2ee.ejb.project.operations.IEjbFacetInstallDataModelProperties;
+import org.eclipse.jst.j2ee.internal.J2EEConstants;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.j2ee.internal.common.CreationConstants;
+import org.eclipse.jst.j2ee.internal.common.J2EEVersionUtil;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPreferences;
+import org.eclipse.jst.j2ee.project.facet.IAppClientFacetInstallDataModelProperties;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetInstallDataModelProperties;
+import org.eclipse.jst.j2ee.web.project.facet.IWebFacetInstallDataModelProperties;
+import org.eclipse.jst.javaee.application.Application;
+import org.eclipse.jst.javaee.application.internal.util.ApplicationResourceImpl;
+import org.eclipse.jst.javaee.applicationclient.ApplicationClient;
+import org.eclipse.jst.javaee.applicationclient.internal.util.ApplicationclientResourceImpl;
+import org.eclipse.jst.javaee.ejb.EJBJar;
+import org.eclipse.jst.javaee.ejb.internal.util.EjbResourceImpl;
+import org.eclipse.jst.javaee.web.WebApp;
+import org.eclipse.jst.javaee.web.internal.util.WebResourceImpl;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetInstallDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties.FacetDataModelMap;
+import org.eclipse.wst.common.componentcore.internal.impl.WTPResourceFactoryRegistry;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.internal.operations.IHeadlessRunnableWithProgress;
+import org.eclipse.wst.common.internal.emf.resource.RendererFactory;
+import org.eclipse.wst.common.project.facet.core.IProjectFacet;
+import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
+import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
+import org.eclipse.wst.common.tests.SimpleTestSuite;
+import org.eclipse.wtp.j2ee.headless.tests.web.operations.WebProjectCreationOperationTest;
+
+public class JEE5ModelTest extends GeneralEMFPopulationTest {
+	
+	private static final String PROJECTNAME = "TestNewModels";
+	public JEE5ModelTest(String name) {
+		super(name);
+	}
+	
+	
+    public static Test suite() {
+        return new SimpleTestSuite(JEE5ModelTest.class);
+    }
+    /**
+	 * @param eObject
+	 */
+	
+    protected Object primCreateAttributeValue(EAttribute att, EObject eObject) {
+        if (att.getEAttributeType() == XMLTypePackage.eINSTANCE.getQName()) 
+        	return null;
+        else
+            return super.primCreateAttributeValue(att, eObject);
+    }
+    
+    
+	protected void setUp() throws Exception {
+		super.setUp();
+		final IWorkspace workspace = ResourcesPlugin.getWorkspace();
+		RendererFactory.getDefaultRendererFactory().setValidating(false);
+		if(workspace.getRoot().getProject(PROJECTNAME).isAccessible()) return;
+        final IProjectDescription description = workspace
+                .newProjectDescription(PROJECTNAME);
+        description.setLocation(null);
+
+
+        // create the new project operation
+        IHeadlessRunnableWithProgress op = new IHeadlessRunnableWithProgress() {
+            public void run(IProgressMonitor monitor)
+           {
+                try {
+					createProject(description, workspace.getRoot().getProject(PROJECTNAME), monitor);
+				} catch (OperationCanceledException e) {
+					e.printStackTrace();
+				} catch (CoreException e) {
+					e.printStackTrace();
+				}
+            }
+        };
+        
+
+        // run the new project creation operation
+        try {
+        	op.run(new NullProgressMonitor());
+        } catch (InterruptedException e) {
+            return;
+        }
+	}
+    private void createProject(IProjectDescription description,
+            IProject projectHandle, IProgressMonitor monitor)
+            throws CoreException, OperationCanceledException {
+        try {
+            monitor.beginTask("", 2000); //$NON-NLS-1$
+
+            projectHandle.create(description, new SubProgressMonitor(monitor,
+                    1000));
+
+            if (monitor.isCanceled())
+                throw new OperationCanceledException();
+
+            projectHandle.open(IResource.BACKGROUND_REFRESH, new SubProgressMonitor(monitor, 1000));
+
+        } finally {
+            monitor.done();
+        }
+    }
+
+
+
+//    public void testNewEJBModelPopulation() throws Exception {
+//		
+//		EMFAttributeFeatureGenerator.reset();
+//		String newModelPathURI = "/testejbmodel.xml";
+//		URI uri = URI.createPlatformResourceURI("/" + getProject().getName() + newModelPathURI,false);
+//		ResourceSet resSet = getResourceSet();
+//		registerFactory(uri, resSet, new EjbResourceFactoryImpl());
+//
+//		EjbResourceImpl ejbRes = (EjbResourceImpl) resSet.createResource(uri);
+//		
+//		setVersion(J2EEVersionConstants.JEE_5_0_ID);
+//		
+//		EJBJarDeploymentDescriptor DDroot = EjbFactory.eINSTANCE.createEJBJarDeploymentDescriptor();
+//		EJBJar jar = EjbFactory.eINSTANCE.createEJBJar();
+//		ejbRes.getContents().add((EObjectImpl)DDroot);
+//		DDroot.setEjbJar(jar);
+//		populateRoot((EObjectImpl)jar);
+//		
+//		ejbRes.save(null);
+//		
+//
+//	}
+    
+//    public void testReadNewWebModel() throws Exception {
+//		
+//    	String projName = "TestEE5WebProject";//$NON-NLS-1$
+//    	createWebProject(projName);
+//    	
+//    	
+//    	EMFAttributeFeatureGenerator.reset();
+//		String modelPathURI = J2EEConstants.WEBAPP_DD_URI;
+//		URI uri = URI.createURI("web333/" + modelPathURI);
+//		ProjectResourceSet resSet = getResourceSet(projName);
+//		
+//
+//		WebResourceImpl webRes = (WebResourceImpl) resSet.getResource(uri,true);
+//		
+//		if (webRes.getContents().size() > 0) {
+//			WebAppDeploymentDescriptor ddRoot = (WebAppDeploymentDescriptor)webRes.getContents().get(0);
+//			Assert.assertTrue(ddRoot.getWebApp() != null);
+//		}
+//	
+//		
+//
+//	}
+public void testEJBModel() throws Exception {
+		
+	String projName = "TestEE5EjbProject";//$NON-NLS-1$
+	createEjbProject(projName);
+	
+	EMFAttributeFeatureGenerator.reset();
+	String modelPathURI = J2EEConstants.EJBJAR_DD_URI;
+	URI uri = URI.createURI(J2EEPlugin.getDefault().getJ2EEPreferences().getString(J2EEPreferences.Keys.EJB_CONTENT_FOLDER) + "/" + modelPathURI);
+	ProjectResourceSet resSet = getResourceSet(projName);
+	
+	
+	EjbResourceImpl ejbRes = (EjbResourceImpl) resSet.getResource(uri,true);
+	Assert.assertTrue(ejbRes.getContents().size() > 0);
+	
+	if (ejbRes.getContents().size() > 0) {
+		EJBJar jar = ejbRes.getEjbJar();
+		populateRoot((EObjectImpl)jar);
+		ejbRes.save(null);
+	}
+	ejbRes.unload();
+	// OK now load again using a new Resource
+	ejbRes = (EjbResourceImpl) resSet.getResource(uri,true);
+	Assert.assertTrue(ejbRes.getContents().size() > 0);
+	
+	if (ejbRes.getContents().size() > 0) {
+		EJBJar jar = ejbRes.getEjbJar();
+		jar.getDescriptions();
+	}
+	
+
+}
+public void testAppClientModel() throws Exception {
+	
+	String projName = "TestEE5AppClientProject";//$NON-NLS-1$
+	createAppClientProject(projName);
+	
+	EMFAttributeFeatureGenerator.reset();
+	String modelPathURI = J2EEConstants.APP_CLIENT_DD_URI;
+	URI uri = URI.createURI(CreationConstants.DEFAULT_APPCLIENT_SOURCE_FOLDER + "/" + modelPathURI);
+	ProjectResourceSet resSet = getResourceSet(projName);
+	
+	ApplicationclientResourceImpl appClientRes = (ApplicationclientResourceImpl) resSet.getResource(uri,true);
+	Assert.assertTrue(appClientRes.getContents().size() > 0);
+	
+	if (appClientRes.getContents().size() > 0) {
+		ApplicationClient client = appClientRes.getApplicationClient();
+		populateRoot((EObjectImpl)client);
+		appClientRes.save(null);
+	}
+
+}
+public void testEarModel() throws Exception {
+	
+	String projName = "TestEE5EarProject";//$NON-NLS-1$
+	createEarProject(projName);
+	
+	EMFAttributeFeatureGenerator.reset();
+	String modelPathURI = J2EEConstants.APPLICATION_DD_URI;
+	URI uri = URI.createURI(J2EEPlugin.getDefault().getJ2EEPreferences().getString(J2EEPreferences.Keys.APPLICATION_CONTENT_FOLDER) + "/" + modelPathURI);
+	ProjectResourceSet resSet = getResourceSet(projName);
+	
+	ApplicationResourceImpl earRes = (ApplicationResourceImpl) resSet.getResource(uri,true);
+	Assert.assertTrue(earRes.getContents().size() > 0);
+	
+	if (earRes.getContents().size() > 0) {
+		Application ear = earRes.getApplication();
+		populateRoot((EObjectImpl)ear);
+		earRes.save(null);
+	}
+
+}
+public void testWarModel() throws Exception {
+	
+	String projName = "TestEE5WarProject";//$NON-NLS-1$
+	createWebProject(projName);
+	
+	EMFAttributeFeatureGenerator.reset();
+	String modelPathURI = J2EEConstants.WEBAPP_DD_URI;
+	URI uri = URI.createURI(J2EEPlugin.getDefault().getJ2EEPreferences().getString(J2EEPreferences.Keys.WEB_CONTENT_FOLDER) + "/" + modelPathURI);
+	ProjectResourceSet resSet = getResourceSet(projName);
+	
+	WebResourceImpl webRes = (WebResourceImpl) resSet.getResource(uri,true);
+	Assert.assertTrue(webRes.getContents().size() > 0);
+	
+	if (webRes.getContents().size() > 0) {
+		WebApp ear = webRes.getWebApp();
+		populateRoot((EObjectImpl)ear);
+		webRes.save(null);
+	}
+
+}
+
+	private ProjectResourceSet getResourceSet(String projName) {
+		IProject proj = getProject(projName);
+		return (ProjectResourceSet)WorkbenchResourceHelperBase.getResourceSet(proj);
+	}
+
+
+	private IProject createWebProject(String projName) throws ExecutionException {
+		
+			String webVersionString = J2EEVersionUtil.convertVersionIntToString(J2EEVersionConstants.WEB_2_5_ID);
+			IProjectFacet webFacet = ProjectFacetsManager.getProjectFacet(IWebFacetInstallDataModelProperties.DYNAMIC_WEB);
+			IProjectFacetVersion webFacetVersion = webFacet.getVersion(webVersionString);
+			IDataModel dataModel = WebProjectCreationOperationTest.getWebDataModel(projName, null, null, null, null,
+					webFacetVersion, true);
+			dataModel.getDefaultOperation().execute(new NullProgressMonitor(), null);
+			IProject webProj = ResourcesPlugin.getWorkspace().getRoot().getProject(projName);
+			return webProj;
+		
+	}
+	private IProject createEjbProject(String projName) throws ExecutionException {
+		IDataModel dataModel = DataModelFactory.createDataModel(IEjbFacetInstallDataModelProperties.class);
+		String versionString = J2EEVersionUtil.convertVersionIntToString(J2EEVersionConstants.EJB_3_0_ID);
+		IProjectFacet facet = ProjectFacetsManager.getProjectFacet(IEjbFacetInstallDataModelProperties.EJB);
+		IProjectFacetVersion facetVersion = facet.getVersion(versionString); //$NON-NLS-1$
+		addVersionProperties(dataModel, projName, facetVersion,IJ2EEFacetInstallDataModelProperties.EJB);
+		dataModel.setProperty(IFacetDataModelProperties.FACET_PROJECT_NAME, projName);
+		FacetDataModelMap map = (FacetDataModelMap) dataModel
+				.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
+		map.add(setupJavaInstallAction(projName,J2EEPlugin.getDefault().getJ2EEPreferences().getString(J2EEPreferences.Keys.EJB_CONTENT_FOLDER)));
+		dataModel.getDefaultOperation().execute( new NullProgressMonitor(), null);
+		IProject ejbProj = ResourcesPlugin.getWorkspace().getRoot().getProject(projName);
+		return ejbProj;
+	}
+	private IProject createEarProject(String projName) throws ExecutionException {
+		IDataModel dataModel = DataModelFactory.createDataModel(IEarFacetInstallDataModelProperties.class);
+		String versionString = J2EEVersionUtil.convertVersionIntToString(J2EEVersionConstants.JEE_5_0_ID);
+		IProjectFacet facet = ProjectFacetsManager.getProjectFacet(IEarFacetInstallDataModelProperties.ENTERPRISE_APPLICATION);
+		IProjectFacetVersion facetVersion = facet.getVersion(versionString); //$NON-NLS-1$
+		addVersionProperties(dataModel, projName, facetVersion,IJ2EEFacetInstallDataModelProperties.ENTERPRISE_APPLICATION);
+		dataModel.setProperty(IFacetDataModelProperties.FACET_PROJECT_NAME, projName);
+		dataModel.getDefaultOperation().execute( new NullProgressMonitor(), null);
+		IProject webProj = ResourcesPlugin.getWorkspace().getRoot().getProject(projName);
+		return webProj;
+	}
+	private IProject createAppClientProject(String projName) throws ExecutionException {
+		IDataModel dataModel = DataModelFactory.createDataModel(IAppClientFacetInstallDataModelProperties.class);
+		String versionString = J2EEVersionUtil.convertVersionIntToString(J2EEVersionConstants.JEE_5_0_ID);
+		IProjectFacet facet = ProjectFacetsManager.getProjectFacet(IAppClientFacetInstallDataModelProperties.APPLICATION_CLIENT);
+		IProjectFacetVersion facetVersion = facet.getVersion(versionString); //$NON-NLS-1$
+		addVersionProperties(dataModel, projName, facetVersion,IJ2EEFacetInstallDataModelProperties.APPLICATION_CLIENT);
+		dataModel.setProperty(IFacetDataModelProperties.FACET_PROJECT_NAME, projName);
+		FacetDataModelMap map = (FacetDataModelMap) dataModel
+				.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
+		map.add(setupJavaInstallAction(projName,J2EEPlugin.getDefault().getJ2EEPreferences().getString(J2EEPreferences.Keys.APP_CLIENT_CONTENT_FOLDER)));
+		dataModel.getDefaultOperation().execute( new NullProgressMonitor(), null);
+		IProject webProj = ResourcesPlugin.getWorkspace().getRoot().getProject(projName);
+		return webProj;
+	}
+	protected IDataModel setupJavaInstallAction(String aProjectName, String srcFolder) {
+		IDataModel dm = DataModelFactory.createDataModel(new JavaFacetInstallDataModelProvider());
+		dm.setProperty(IFacetDataModelProperties.FACET_PROJECT_NAME, aProjectName);
+		String jVersion = "5.0";
+		dm.setProperty(IFacetDataModelProperties.FACET_VERSION_STR, jVersion); //$NON-NLS-1$
+		dm.setStringProperty(IJavaFacetInstallDataModelProperties.SOURCE_FOLDER_NAME, srcFolder); //$NON-NLS-1$
+		return dm;
+	}
+    private void addWebProjectProperties(IDataModel dataModel, String projName, IProjectFacetVersion web25){
+
+		dataModel.setProperty(IFacetDataModelProperties.FACET_PROJECT_NAME, projName);
+		FacetDataModelMap map = (FacetDataModelMap) dataModel
+				.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
+		IDataModel webmodel = (IDataModel) map.get(IWebFacetInstallDataModelProperties.DYNAMIC_WEB);
+		webmodel.setProperty(IFacetInstallDataModelProperties.FACET_VERSION, web25);
+//		webmodel.setStringProperty(IJ2EEModuleFacetInstallDataModelProperties.CONFIG_FOLDER,"web333"); //$NON-NLS-1$
+//        webmodel.setStringProperty(IWebFacetInstallDataModelProperties.SOURCE_FOLDER, "src444");
+        webmodel.setBooleanProperty(IJ2EEFacetInstallDataModelProperties.GENERATE_DD, true);
+    }
+    
+    private void addVersionProperties(IDataModel dataModel, String projName, IProjectFacetVersion fv, String facetString){
+
+		dataModel.setProperty(IFacetDataModelProperties.FACET_PROJECT_NAME, projName);
+		FacetDataModelMap map = (FacetDataModelMap) dataModel
+				.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
+		IDataModel model = (IDataModel) map.get(facetString);
+		model.setBooleanProperty(IJ2EEFacetInstallDataModelProperties.GENERATE_DD, true);
+		model.setProperty(IFacetInstallDataModelProperties.FACET_VERSION, fv);
+		
+    }
+
+
+//	public void testNewEARModelPopulation() throws Exception {
+//		
+//		EMFAttributeFeatureGenerator.reset();
+//		
+//		String newModelPathURI = "/testearmodel.xml";
+//		URI uri = URI.createPlatformResourceURI("/" + getProject().getName() + newModelPathURI,false);
+//		ResourceSet resSet = getResourceSet();
+//		registerFactory(uri, resSet, new ApplicationResourceFactoryImpl());
+//	
+//		ApplicationResourceImpl ejbRes = (ApplicationResourceImpl) resSet.createResource(uri);
+//		
+//		setVersion(J2EEVersionConstants.JEE_5_0_ID);
+//		
+//		ApplicationDeploymentDescriptor DDroot = ApplicationFactory.eINSTANCE.createApplicationDeploymentDescriptor();
+//		Application ear = ApplicationFactory.eINSTANCE.createApplication();
+//		ejbRes.getContents().add((EObjectImpl)DDroot);
+//		DDroot.setApplication(ear);
+//		populateRoot((EObjectImpl)ear);
+//		
+//		ejbRes.save(null);
+//		
+//	
+//	}
+	public IProject getProject() {
+		return ResourcesPlugin.getWorkspace().getRoot().getProject(PROJECTNAME);
+	}
+	public IProject getProject(String projName) {
+		return ResourcesPlugin.getWorkspace().getRoot().getProject(projName);
+	}
+
+
+	private void registerFactory(URI uri, ResourceSet resSet, Resource.Factory factory) {
+		WTPResourceFactoryRegistry registry = (WTPResourceFactoryRegistry) resSet.getResourceFactoryRegistry();
+		registry.registerLastFileSegment(uri.lastSegment(), factory);
+	}
+	private ResourceSet getResourceSet() {
+		ResourceSet set = new ResourceSetImpl();
+		set.setResourceFactoryRegistry(WTPResourceFactoryRegistry.INSTANCE);
+		return set;
+	}
+
+
+
+	
+	protected void tearDown() throws Exception {
+		// Don't delete these files
+	}
+
+	
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/tests/JEE6ModelTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/tests/JEE6ModelTest.java
new file mode 100644
index 0000000..460ec62
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/tests/JEE6ModelTest.java
@@ -0,0 +1,510 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.jee.model.tests;
+import junit.framework.Assert;
+import junit.framework.Test;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.impl.EObjectImpl;
+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.xml.type.XMLTypePackage;
+import org.eclipse.jem.util.emf.workbench.ProjectResourceSet;
+import org.eclipse.jem.util.emf.workbench.WorkbenchResourceHelperBase;
+import org.eclipse.jst.common.project.facet.IJavaFacetInstallDataModelProperties;
+import org.eclipse.jst.common.project.facet.JavaFacetInstallDataModelProvider;
+import org.eclipse.jst.j2ee.archive.emftests.GeneralEMFPopulationTest;
+import org.eclipse.jst.j2ee.archive.testutilities.EMFAttributeFeatureGenerator;
+import org.eclipse.jst.j2ee.earcreation.IEarFacetInstallDataModelProperties;
+import org.eclipse.jst.j2ee.ejb.project.operations.IEjbFacetInstallDataModelProperties;
+import org.eclipse.jst.j2ee.internal.J2EEConstants;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.j2ee.internal.common.CreationConstants;
+import org.eclipse.jst.j2ee.internal.common.J2EEVersionUtil;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPreferences;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPreferences.Keys;
+import org.eclipse.jst.j2ee.jca.project.facet.IConnectorFacetInstallDataModelProperties;
+import org.eclipse.jst.j2ee.project.facet.IAppClientFacetInstallDataModelProperties;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetConstants;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetInstallDataModelProperties;
+import org.eclipse.jst.j2ee.web.project.facet.IWebFacetInstallDataModelProperties;
+import org.eclipse.jst.javaee.application.Application;
+import org.eclipse.jst.javaee.application.internal.util.ApplicationResourceImpl;
+import org.eclipse.jst.javaee.applicationclient.ApplicationClient;
+import org.eclipse.jst.javaee.applicationclient.internal.util.ApplicationclientResourceImpl;
+import org.eclipse.jst.javaee.ejb.EJBJar;
+import org.eclipse.jst.javaee.ejb.internal.util.EjbResourceImpl;
+import org.eclipse.jst.javaee.jca.Connector;
+import org.eclipse.jst.javaee.jca.internal.util.JcaResourceImpl;
+import org.eclipse.jst.javaee.web.WebApp;
+import org.eclipse.jst.javaee.web.WebFragment;
+import org.eclipse.jst.javaee.web.internal.util.WebResourceImpl;
+import org.eclipse.jst.javaee.webfragment.internal.util.WebfragmentResourceImpl;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetInstallDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties.FacetDataModelMap;
+import org.eclipse.wst.common.componentcore.internal.impl.WTPResourceFactoryRegistry;
+import org.eclipse.wst.common.componentcore.internal.util.IModuleConstants;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.internal.operations.IHeadlessRunnableWithProgress;
+import org.eclipse.wst.common.internal.emf.resource.RendererFactory;
+import org.eclipse.wst.common.project.facet.core.IProjectFacet;
+import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
+import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
+import org.eclipse.wst.common.tests.SimpleTestSuite;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.JavaEEFacetConstants;
+import org.eclipse.wtp.j2ee.headless.tests.web.operations.WebProjectCreationOperationTest;
+import org.eclipse.wtp.j2ee.headless.tests.webfragment.operations.WebFragmentProjectCreationOperationTest;
+
+public class JEE6ModelTest extends GeneralEMFPopulationTest {
+	
+	private static final String PROJECTNAME = "TestNewModels";
+	public JEE6ModelTest(String name) {
+		super(name);
+	}
+	
+	
+    public static Test suite() {
+        return new SimpleTestSuite(JEE6ModelTest.class);
+    }
+    /**
+	 * @param eObject
+	 */
+	
+    protected Object primCreateAttributeValue(EAttribute att, EObject eObject) {
+        if (att.getEAttributeType() == XMLTypePackage.eINSTANCE.getQName()) 
+        	return null;
+        else
+            return super.primCreateAttributeValue(att, eObject);
+    }
+    
+    
+	protected void setUp() throws Exception {
+		super.setUp();
+		final IWorkspace workspace = ResourcesPlugin.getWorkspace();
+		RendererFactory.getDefaultRendererFactory().setValidating(false);
+		if(workspace.getRoot().getProject(PROJECTNAME).isAccessible()) return;
+        final IProjectDescription description = workspace
+                .newProjectDescription(PROJECTNAME);
+        description.setLocation(null);
+
+
+        // create the new project operation
+        IHeadlessRunnableWithProgress op = new IHeadlessRunnableWithProgress() {
+            public void run(IProgressMonitor monitor)
+           {
+                try {
+					createProject(description, workspace.getRoot().getProject(PROJECTNAME), monitor);
+				} catch (OperationCanceledException e) {
+					e.printStackTrace();
+				} catch (CoreException e) {
+					e.printStackTrace();
+				}
+            }
+        };
+        
+
+        // run the new project creation operation
+        try {
+        	op.run(new NullProgressMonitor());
+        } catch (InterruptedException e) {
+            return;
+        }
+	}
+    private void createProject(IProjectDescription description,
+            IProject projectHandle, IProgressMonitor monitor)
+            throws CoreException, OperationCanceledException {
+        try {
+            monitor.beginTask("", 2000); //$NON-NLS-1$
+
+            projectHandle.create(description, new SubProgressMonitor(monitor,
+                    1000));
+
+            if (monitor.isCanceled())
+                throw new OperationCanceledException();
+
+            projectHandle.open(IResource.BACKGROUND_REFRESH, new SubProgressMonitor(monitor, 1000));
+
+        } finally {
+            monitor.done();
+        }
+    }
+
+
+
+//    public void testNewEJBModelPopulation() throws Exception {
+//		
+//		EMFAttributeFeatureGenerator.reset();
+//		String newModelPathURI = "/testejbmodel.xml";
+//		URI uri = URI.createPlatformResourceURI("/" + getProject().getName() + newModelPathURI,false);
+//		ResourceSet resSet = getResourceSet();
+//		registerFactory(uri, resSet, new EjbResourceFactoryImpl());
+//
+//		EjbResourceImpl ejbRes = (EjbResourceImpl) resSet.createResource(uri);
+//		
+//		setVersion(J2EEVersionConstants.JEE_5_0_ID);
+//		
+//		EJBJarDeploymentDescriptor DDroot = EjbFactory.eINSTANCE.createEJBJarDeploymentDescriptor();
+//		EJBJar jar = EjbFactory.eINSTANCE.createEJBJar();
+//		ejbRes.getContents().add((EObjectImpl)DDroot);
+//		DDroot.setEjbJar(jar);
+//		populateRoot((EObjectImpl)jar);
+//		
+//		ejbRes.save(null);
+//		
+//
+//	}
+    
+//    public void testReadNewWebModel() throws Exception {
+//		
+//    	String projName = "TestEE5WebProject";//$NON-NLS-1$
+//    	createWebProject(projName);
+//    	
+//    	
+//    	EMFAttributeFeatureGenerator.reset();
+//		String modelPathURI = J2EEConstants.WEBAPP_DD_URI;
+//		URI uri = URI.createURI("web333/" + modelPathURI);
+//		ProjectResourceSet resSet = getResourceSet(projName);
+//		
+//
+//		WebResourceImpl webRes = (WebResourceImpl) resSet.getResource(uri,true);
+//		
+//		if (webRes.getContents().size() > 0) {
+//			WebAppDeploymentDescriptor ddRoot = (WebAppDeploymentDescriptor)webRes.getContents().get(0);
+//			Assert.assertTrue(ddRoot.getWebApp() != null);
+//		}
+//	
+//		
+//
+//	}
+public void testEJBModel() throws Exception {
+		
+	String projName = "TestEE6EjbProject";//$NON-NLS-1$
+	createEjbProject(projName);
+	
+	EMFAttributeFeatureGenerator.reset();
+	String modelPathURI = J2EEConstants.EJBJAR_DD_URI;
+	URI uri = URI.createURI(J2EEPlugin.getDefault().getJ2EEPreferences().getString(J2EEPreferences.Keys.EJB_CONTENT_FOLDER) + "/" + modelPathURI);
+	ProjectResourceSet resSet = getResourceSet(projName);
+	
+	
+	EjbResourceImpl ejbRes = (EjbResourceImpl) resSet.getResource(uri,true);
+	Assert.assertTrue(ejbRes.getContents().size() > 0);
+	
+	if (ejbRes.getContents().size() > 0) {
+		EJBJar jar = ejbRes.getEjbJar();
+		populateRoot((EObjectImpl)jar);
+		ejbRes.save(null);
+	}
+	ejbRes.unload();
+	// OK now load again using a new Resource
+	ejbRes = (EjbResourceImpl) resSet.getResource(uri,true);
+	Assert.assertTrue(ejbRes.getContents().size() > 0);
+	
+	if (ejbRes.getContents().size() > 0) {
+		EJBJar jar = ejbRes.getEjbJar();
+		jar.getDescriptions();
+	}
+	
+
+}
+public void testAppClientModel() throws Exception {
+	
+	String projName = "TestEE6AppClientProject";//$NON-NLS-1$
+	createAppClientProject(projName);
+	
+	EMFAttributeFeatureGenerator.reset();
+	String modelPathURI = J2EEConstants.APP_CLIENT_DD_URI;
+	URI uri = URI.createURI(CreationConstants.DEFAULT_APPCLIENT_SOURCE_FOLDER + "/" + modelPathURI);
+	ProjectResourceSet resSet = getResourceSet(projName);
+	
+	ApplicationclientResourceImpl appClientRes = (ApplicationclientResourceImpl) resSet.getResource(uri,true);
+	Assert.assertTrue(appClientRes.getContents().size() > 0);
+	
+	if (appClientRes.getContents().size() > 0) {
+		ApplicationClient client = appClientRes.getApplicationClient();
+		populateRoot((EObjectImpl)client);
+		appClientRes.save(null);
+	}
+
+}
+public void testEarModel() throws Exception {
+	
+	String projName = "TestEE6EarProject";//$NON-NLS-1$
+	createEarProject(projName);
+	
+	EMFAttributeFeatureGenerator.reset();
+	String modelPathURI = J2EEConstants.APPLICATION_DD_URI;
+	URI uri = URI.createURI(J2EEPlugin.getDefault().getJ2EEPreferences().getString(J2EEPreferences.Keys.APPLICATION_CONTENT_FOLDER) + "/" + modelPathURI);
+	ProjectResourceSet resSet = getResourceSet(projName);
+	
+	ApplicationResourceImpl earRes = (ApplicationResourceImpl) resSet.getResource(uri,true);
+	Assert.assertTrue(earRes.getContents().size() > 0);
+	
+	if (earRes.getContents().size() > 0) {
+		Application ear = earRes.getApplication();
+		populateRoot((EObjectImpl)ear);
+		earRes.save(null);
+	}
+
+}
+public void testConnectorModel() throws Exception {
+	
+	String projName = "TestEE6ConnectorProject";//$NON-NLS-1$
+	createConnectorProject(projName);
+	
+	EMFAttributeFeatureGenerator.reset();
+	String modelPathURI = J2EEConstants.RAR_DD_URI;
+	URI uri = URI.createURI(J2EEPlugin.getDefault().getJ2EEPreferences().getString(J2EEPreferences.Keys.JCA_CONTENT_FOLDER) + "/" + modelPathURI);
+	ProjectResourceSet resSet = getResourceSet(projName);
+	
+	JcaResourceImpl connectorRes = (JcaResourceImpl) resSet.getResource(uri,true);
+	Assert.assertTrue(connectorRes.getContents().size() > 0);
+	
+	if (connectorRes.getContents().size() > 0) {
+		Connector connector = connectorRes.getConnector();
+		populateRoot((EObjectImpl)connector);
+		connectorRes.save(null);
+	}
+
+}
+public void testWarModel() throws Exception {
+	
+	String projName = "TestEE6WarProject";//$NON-NLS-1$
+	createWebProject(projName);
+	
+	EMFAttributeFeatureGenerator.reset();
+	String modelPathURI = J2EEConstants.WEBAPP_DD_URI;
+	URI uri = URI.createURI(J2EEPlugin.getDefault().getJ2EEPreferences().getString(J2EEPreferences.Keys.WEB_CONTENT_FOLDER) + "/" + modelPathURI);
+	ProjectResourceSet resSet = getResourceSet(projName);
+	
+	WebResourceImpl webRes = (WebResourceImpl) resSet.getResource(uri,true);
+	Assert.assertTrue(webRes.getContents().size() > 0);
+	
+	if (webRes.getContents().size() > 0) {
+		WebApp ear = webRes.getWebApp();
+		populateRoot((EObjectImpl)ear);
+		webRes.save(null);
+	}
+
+}
+
+public void testWebFragmentModel() throws Exception {
+	
+	String projName = "TestEE6WebFragmentProject";//$NON-NLS-1$
+	createWebfragmentProject(projName);
+	
+	EMFAttributeFeatureGenerator.reset();
+	String modelPathURI = J2EEConstants.WEBFRAGMENT_DD_URI;
+	URI uri = URI.createURI( "src/" + modelPathURI);
+	ProjectResourceSet resSet = getResourceSet(projName);
+	
+	WebfragmentResourceImpl webRes = (WebfragmentResourceImpl) resSet.getResource(uri,true);
+	Assert.assertTrue(webRes.getContents().size() > 0);
+	
+	if (webRes.getContents().size() > 0) {
+		WebFragment fragment = webRes.getWebFragment();
+		populateRoot((EObjectImpl)fragment);
+		webRes.save(null);
+	}
+
+}
+
+	private ProjectResourceSet getResourceSet(String projName) {
+		IProject proj = getProject(projName);
+		return (ProjectResourceSet)WorkbenchResourceHelperBase.getResourceSet(proj);
+	}
+
+
+	private IProject createWebProject(String projName) throws ExecutionException {
+		
+			String webVersionString = J2EEVersionUtil.convertVersionIntToString(J2EEVersionConstants.WEB_3_0_ID);
+			IProjectFacet webFacet = ProjectFacetsManager.getProjectFacet(IWebFacetInstallDataModelProperties.DYNAMIC_WEB);
+			IProjectFacetVersion webFacetVersion = webFacet.getVersion(webVersionString);
+			IDataModel dataModel = WebProjectCreationOperationTest.getWebDataModel(projName, null, null, null, null,
+					webFacetVersion, true);
+			dataModel.getDefaultOperation().execute(new NullProgressMonitor(), null);
+			IProject webProj = ResourcesPlugin.getWorkspace().getRoot().getProject(projName);
+			return webProj;
+		
+	}
+	private IProject createWebfragmentProject(String projName) throws ExecutionException {
+		
+		String webFragmentVersionString = J2EEVersionUtil.convertVersionIntToString(J2EEVersionConstants.WEBFRAGMENT_3_0_ID);
+		IProjectFacet javaFacet = ProjectFacetsManager.getProjectFacet(IJ2EEFacetConstants.JAVA);
+		IDataModel javaFacetModel = DataModelFactory.createDataModel(new JavaFacetInstallDataModelProvider());
+		javaFacetModel.setProperty(IFacetProjectCreationDataModelProperties.FACET_PROJECT_NAME, projName);
+    	javaFacetModel.setProperty(IFacetDataModelProperties.FACET_VERSION, JavaEEFacetConstants.JAVA_6);
+		javaFacetModel.setProperty(IJavaFacetInstallDataModelProperties.DEFAULT_OUTPUT_FOLDER_NAME,
+				J2EEPlugin.getDefault().getJ2EEPreferences().getString(Keys.DYN_WEB_OUTPUT_FOLDER) );
+		javaFacetModel.getDefaultOperation().execute(new NullProgressMonitor(), null);
+		IProjectFacet webFragmentFacet = ProjectFacetsManager.getProjectFacet(IJ2EEFacetConstants.WEBFRAGMENT);
+		IProjectFacetVersion webFragmentFacetVersion = webFragmentFacet.getVersion(webFragmentVersionString);
+		IDataModel dataModel = WebFragmentProjectCreationOperationTest.getWebFragmentDataModel(projName, null, null, webFragmentFacetVersion, true);
+		dataModel.getDefaultOperation().execute(new NullProgressMonitor(), null);
+		IProject webFragmentProj = ResourcesPlugin.getWorkspace().getRoot().getProject(projName);
+		return webFragmentProj;	
+	}
+	private IProject createEjbProject(String projName) throws ExecutionException {
+		IDataModel dataModel = DataModelFactory.createDataModel(IEjbFacetInstallDataModelProperties.class);
+		String versionString = J2EEVersionUtil.convertVersionIntToString(J2EEVersionConstants.EJB_3_1_ID);
+		IProjectFacet facet = ProjectFacetsManager.getProjectFacet(IEjbFacetInstallDataModelProperties.EJB);
+		IProjectFacetVersion facetVersion = facet.getVersion(versionString); //$NON-NLS-1$
+		addVersionProperties(dataModel, projName, facetVersion,IJ2EEFacetInstallDataModelProperties.EJB);
+		dataModel.setProperty(IFacetDataModelProperties.FACET_PROJECT_NAME, projName);
+		FacetDataModelMap map = (FacetDataModelMap) dataModel
+				.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
+		map.remove(IModuleConstants.JST_JAVA);
+		map.add(setupJavaInstallAction(projName,J2EEPlugin.getDefault().getJ2EEPreferences().getString(J2EEPreferences.Keys.EJB_CONTENT_FOLDER)));
+		dataModel.getDefaultOperation().execute( new NullProgressMonitor(), null);
+		IProject ejbProj = ResourcesPlugin.getWorkspace().getRoot().getProject(projName);
+		return ejbProj;
+	}
+	private IProject createEarProject(String projName) throws ExecutionException {
+		IDataModel dataModel = DataModelFactory.createDataModel(IEarFacetInstallDataModelProperties.class);
+		String versionString = J2EEVersionUtil.convertVersionIntToString(J2EEVersionConstants.JEE_6_0_ID);
+		IProjectFacet facet = ProjectFacetsManager.getProjectFacet(IEarFacetInstallDataModelProperties.ENTERPRISE_APPLICATION);
+		IProjectFacetVersion facetVersion = facet.getVersion(versionString); //$NON-NLS-1$
+		addVersionProperties(dataModel, projName, facetVersion,IJ2EEFacetInstallDataModelProperties.ENTERPRISE_APPLICATION);
+		dataModel.setProperty(IFacetDataModelProperties.FACET_PROJECT_NAME, projName);
+		dataModel.getDefaultOperation().execute( new NullProgressMonitor(), null);
+		IProject earProj = ResourcesPlugin.getWorkspace().getRoot().getProject(projName);
+		return earProj;
+	}
+	private IProject createAppClientProject(String projName) throws ExecutionException {
+		IDataModel dataModel = DataModelFactory.createDataModel(IAppClientFacetInstallDataModelProperties.class);
+		String versionString = J2EEVersionUtil.convertVersionIntToString(J2EEVersionConstants.JEE_6_0_ID);
+		IProjectFacet facet = ProjectFacetsManager.getProjectFacet(IAppClientFacetInstallDataModelProperties.APPLICATION_CLIENT);
+		IProjectFacetVersion facetVersion = facet.getVersion(versionString); //$NON-NLS-1$
+		addVersionProperties(dataModel, projName, facetVersion,IJ2EEFacetInstallDataModelProperties.APPLICATION_CLIENT);
+		dataModel.setProperty(IFacetDataModelProperties.FACET_PROJECT_NAME, projName);
+		FacetDataModelMap map = (FacetDataModelMap) dataModel
+				.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
+		map.remove(IModuleConstants.JST_JAVA);
+		map.add(setupJavaInstallAction(projName,J2EEPlugin.getDefault().getJ2EEPreferences().getString(J2EEPreferences.Keys.APP_CLIENT_CONTENT_FOLDER)));
+		dataModel.getDefaultOperation().execute( new NullProgressMonitor(), null);
+		IProject webProj = ResourcesPlugin.getWorkspace().getRoot().getProject(projName);
+		return webProj;
+	}
+	private IProject createConnectorProject(String projName) throws ExecutionException {
+		IDataModel dataModel = DataModelFactory.createDataModel(IConnectorFacetInstallDataModelProperties.class);
+		String versionString = J2EEVersionUtil.convertVersionIntToString(J2EEVersionConstants.JCA_1_6_ID);
+		IProjectFacet facet = ProjectFacetsManager.getProjectFacet(IConnectorFacetInstallDataModelProperties.JCA);
+		IProjectFacetVersion facetVersion = facet.getVersion(versionString); //$NON-NLS-1$
+		addVersionProperties(dataModel, projName, facetVersion,IJ2EEFacetInstallDataModelProperties.JCA);
+		dataModel.setProperty(IFacetDataModelProperties.FACET_PROJECT_NAME, projName);
+		FacetDataModelMap map = (FacetDataModelMap) dataModel.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
+		map.remove(IModuleConstants.JST_JAVA);
+		map.add(setupJavaInstallAction(projName,J2EEPlugin.getDefault().getJ2EEPreferences().getString(J2EEPreferences.Keys.JCA_CONTENT_FOLDER)));
+		dataModel.getDefaultOperation().execute( new NullProgressMonitor(), null);
+		IProject connectorProj = ResourcesPlugin.getWorkspace().getRoot().getProject(projName);
+		return connectorProj;
+	}
+	protected IDataModel setupJavaInstallAction(String aProjectName, String srcFolder) {
+		IDataModel dm = DataModelFactory.createDataModel(new JavaFacetInstallDataModelProvider());
+		dm.setProperty(IFacetDataModelProperties.FACET_PROJECT_NAME, aProjectName);
+		String jVersion = "1.6";
+		dm.setProperty(IFacetDataModelProperties.FACET_VERSION_STR, jVersion);
+		dm.setStringProperty(IJavaFacetInstallDataModelProperties.SOURCE_FOLDER_NAME, srcFolder); //$NON-NLS-1$
+		return dm;
+	}
+    private void addWebProjectProperties(IDataModel dataModel, String projName, IProjectFacetVersion web25){
+
+		dataModel.setProperty(IFacetDataModelProperties.FACET_PROJECT_NAME, projName);
+		FacetDataModelMap map = (FacetDataModelMap) dataModel
+				.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
+		IDataModel webmodel = (IDataModel) map.get(IWebFacetInstallDataModelProperties.DYNAMIC_WEB);
+		webmodel.setProperty(IFacetInstallDataModelProperties.FACET_VERSION, web25);
+//		webmodel.setStringProperty(IJ2EEModuleFacetInstallDataModelProperties.CONFIG_FOLDER,"web333"); //$NON-NLS-1$
+//        webmodel.setStringProperty(IWebFacetInstallDataModelProperties.SOURCE_FOLDER, "src444");
+        webmodel.setBooleanProperty(IJ2EEFacetInstallDataModelProperties.GENERATE_DD, true);
+    }
+    
+    private void addVersionProperties(IDataModel dataModel, String projName, IProjectFacetVersion fv, String facetString){
+
+		dataModel.setProperty(IFacetDataModelProperties.FACET_PROJECT_NAME, projName);
+		FacetDataModelMap map = (FacetDataModelMap) dataModel
+				.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
+		IDataModel model = (IDataModel) map.get(facetString);
+		model.setBooleanProperty(IJ2EEFacetInstallDataModelProperties.GENERATE_DD, true);
+		model.setProperty(IFacetInstallDataModelProperties.FACET_VERSION, fv);
+		
+    }
+
+
+//	public void testNewEARModelPopulation() throws Exception {
+//		
+//		EMFAttributeFeatureGenerator.reset();
+//		
+//		String newModelPathURI = "/testearmodel.xml";
+//		URI uri = URI.createPlatformResourceURI("/" + getProject().getName() + newModelPathURI,false);
+//		ResourceSet resSet = getResourceSet();
+//		registerFactory(uri, resSet, new ApplicationResourceFactoryImpl());
+//	
+//		ApplicationResourceImpl ejbRes = (ApplicationResourceImpl) resSet.createResource(uri);
+//		
+//		setVersion(J2EEVersionConstants.JEE_5_0_ID);
+//		
+//		ApplicationDeploymentDescriptor DDroot = ApplicationFactory.eINSTANCE.createApplicationDeploymentDescriptor();
+//		Application ear = ApplicationFactory.eINSTANCE.createApplication();
+//		ejbRes.getContents().add((EObjectImpl)DDroot);
+//		DDroot.setApplication(ear);
+//		populateRoot((EObjectImpl)ear);
+//		
+//		ejbRes.save(null);
+//		
+//	
+//	}
+	public IProject getProject() {
+		return ResourcesPlugin.getWorkspace().getRoot().getProject(PROJECTNAME);
+	}
+	public IProject getProject(String projName) {
+		return ResourcesPlugin.getWorkspace().getRoot().getProject(projName);
+	}
+
+
+	private void registerFactory(URI uri, ResourceSet resSet, Resource.Factory factory) {
+		WTPResourceFactoryRegistry registry = (WTPResourceFactoryRegistry) resSet.getResourceFactoryRegistry();
+		registry.registerLastFileSegment(uri.lastSegment(), factory);
+	}
+	private ResourceSet getResourceSet() {
+		ResourceSet set = new ResourceSetImpl();
+		set.setResourceFactoryRegistry(WTPResourceFactoryRegistry.INSTANCE);
+		return set;
+	}
+
+
+
+	
+	protected void tearDown() throws Exception {
+		// Don't delete these files
+	}
+
+	
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/tests/JdtChangeListenerWithSemaphore.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/tests/JdtChangeListenerWithSemaphore.java
new file mode 100644
index 0000000..7d095b5
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/tests/JdtChangeListenerWithSemaphore.java
@@ -0,0 +1,39 @@
+package org.eclipse.jst.jee.model.tests;
+
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.concurrent.Semaphore;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.jdt.core.ElementChangedEvent;
+import org.eclipse.jdt.core.IElementChangedListener;
+
+public class JdtChangeListenerWithSemaphore implements IElementChangedListener {
+	private final Semaphore s;
+	private final int expectedEvents;
+	private final List<ElementChangedEvent> receivedEvents;
+
+	public JdtChangeListenerWithSemaphore(int expectedEvents) throws InterruptedException {
+		this.expectedEvents = expectedEvents;
+		this.s = new Semaphore(1);
+		this.s.acquire();
+		this.receivedEvents = Collections.synchronizedList(new LinkedList<ElementChangedEvent>());
+	}
+
+	public boolean waitForEvents() throws InterruptedException {
+		return s.tryAcquire(5, TimeUnit.SECONDS);
+	}
+
+	public synchronized int getEvents() {
+		return receivedEvents.size();
+	}
+
+	public void elementChanged(ElementChangedEvent event) {
+		receivedEvents.add(event);
+		if (receivedEvents.size() > expectedEvents)
+			throw new IllegalStateException("The expected events were already reached");
+		if (expectedEvents == receivedEvents.size())
+			s.release();
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/tests/ManyToOneRelationTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/tests/ManyToOneRelationTest.java
new file mode 100644
index 0000000..e575fb0
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/tests/ManyToOneRelationTest.java
@@ -0,0 +1,132 @@
+/***********************************************************************
+ * Copyright (c) 2008 by SAP AG, Walldorf. 
+ * 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:
+ *     SAP AG - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jst.jee.model.tests;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.eclipse.jst.jee.model.internal.common.ManyToOneRelation;
+
+/**
+ * @author Kiril Mitov k.mitov@sap.com
+ * 
+ */
+public class ManyToOneRelationTest extends TestCase {
+
+	private ManyToOneRelation<String, Integer> fixture;
+
+	private ManyToOneRelation<String, Integer> getFixture() {
+		return fixture;
+	}
+
+	public static Test suite() {
+		TestSuite suite = new TestSuite(ManyToOneRelationTest.class);
+		return suite;
+	}
+
+	// @Before
+	public void setUp() throws Exception {
+		super.setUp();
+		fixture = new ManyToOneRelation<String, Integer>();
+	}
+
+	
+	// @Test
+	public void testGetTarget() {
+		getFixture().connect("str1", new Integer(1));
+		assertEquals(new Integer(1), getFixture().getTarget("str1"));
+	}
+
+	public void testConnectToNewTarget() {
+		getFixture().connect("str1", new Integer(1));
+		getFixture().connect("str1", new Integer(2));
+		assertFalse(getFixture().containsTarget(new Integer(1)));
+		assertTrue(getFixture().containsTarget(new Integer(2)));
+	}
+
+	// @Test
+	public void testGetSources() {
+		getFixture().connect("str1", new Integer(1));
+		getFixture().connect("str2", new Integer(1));
+		assertTrue(getFixture().getSources(new Integer(1)).contains("str1"));
+		assertTrue(getFixture().getSources(new Integer(1)).contains("str2"));
+	}
+
+	// @Test
+	public void testGetFilesManyFiles() {
+		getFixture().connect("str1", new Integer(1));
+		getFixture().connect("str2", new Integer(2));
+		assertTrue(getFixture().getSources(new Integer(1)).contains("str1"));
+		assertTrue(getFixture().getSources(new Integer(2)).contains("str2"));
+	}
+
+	// @Test
+	public void testGetModelObjectManyFiles() {
+
+		getFixture().connect("str1", new Integer(1));
+		getFixture().connect("str2", new Integer(1));
+		assertEquals(new Integer(1), getFixture().getTarget("str1"));
+		assertEquals(new Integer(1), getFixture().getTarget("str2"));
+	}
+
+	// @Test
+	public void testContainsFile() {
+
+		getFixture().connect("str1", new Integer(1));
+		getFixture().connect("str2", new Integer(2));
+
+		assertTrue(getFixture().containsSource("str1"));
+		assertTrue(getFixture().containsSource("str2"));
+		assertFalse(getFixture().containsSource(null));
+	}
+
+	// @Test
+	public void testTwoFilesTwoObjects() {
+		getFixture().connect("str1", new Integer(1));
+		getFixture().connect("str2", new Integer(2));
+		assertEquals(new Integer(1), getFixture().getTarget("str1"));
+		assertEquals(new Integer(2), getFixture().getTarget("str2"));
+		assertTrue(getFixture().containsTarget(new Integer(1)));
+		assertTrue(getFixture().containsTarget(new Integer(2)));
+	}
+
+	// @Test
+	public void testDisconnectFile() {
+		getFixture().connect("str1", new Integer(1));
+		getFixture().connect("str2", new Integer(1));
+		assertEquals(new Integer(1), getFixture().getTarget("str1"));
+		assertEquals(new Integer(1), getFixture().getTarget("str2"));
+
+		getFixture().disconnectSource("str1");
+		assertFalse(getFixture().containsSource("str1"));
+		assertNull(getFixture().getTarget("str1"));
+		assertEquals(new Integer(1), new Integer(getFixture().getSources(new Integer(1)).size()));
+		assertTrue(getFixture().getSources(new Integer(1)).contains("str2"));
+	}
+
+	// @Test
+	public void testDisconnectModelObject() {
+		getFixture().connect("str1", new Integer(1));
+		getFixture().connect("str11", new Integer(1));
+		getFixture().connect("str2", new Integer(2));
+		assertEquals(new Integer(1), new Integer(getFixture().getSources(new Integer(2)).size()));
+		assertEquals(new Integer(2), new Integer(getFixture().getSources(new Integer(1)).size()));
+
+		getFixture().disconnect(new Integer(1));
+		assertFalse(getFixture().containsTarget(new Integer(1)));
+		assertFalse(getFixture().containsSource("str1"));
+		assertFalse(getFixture().containsSource("str11"));
+		assertTrue(getFixture().containsSource("str2"));
+		assertTrue(getFixture().containsTarget(new Integer(2)));
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/tests/ModelProviderTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/tests/ModelProviderTest.java
new file mode 100644
index 0000000..a2107a7
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/tests/ModelProviderTest.java
@@ -0,0 +1,786 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.jee.model.tests;
+
+import java.util.List;
+
+import junit.framework.Assert;
+import junit.framework.Test;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.xml.type.XMLTypePackage;
+import org.eclipse.jem.util.emf.workbench.FlexibleProjectResourceSet;
+import org.eclipse.jem.util.emf.workbench.ProjectResourceSet;
+import org.eclipse.jem.util.emf.workbench.WorkbenchResourceHelperBase;
+import org.eclipse.jst.common.project.facet.IJavaFacetInstallDataModelProperties;
+import org.eclipse.jst.common.project.facet.JavaFacetInstallDataModelProvider;
+import org.eclipse.jst.j2ee.archive.emftests.GeneralEMFPopulationTest;
+import org.eclipse.jst.j2ee.client.ApplicationClient;
+import org.eclipse.jst.j2ee.earcreation.IEarFacetInstallDataModelProperties;
+import org.eclipse.jst.j2ee.ejb.project.operations.IEjbFacetInstallDataModelProperties;
+import org.eclipse.jst.j2ee.internal.J2EEConstants;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.j2ee.internal.common.J2EEVersionUtil;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPreferences;
+import org.eclipse.jst.j2ee.model.IModelProvider;
+import org.eclipse.jst.j2ee.model.ModelProviderManager;
+import org.eclipse.jst.j2ee.project.JavaEEProjectUtilities;
+import org.eclipse.jst.j2ee.project.facet.IAppClientFacetInstallDataModelProperties;
+import org.eclipse.jst.j2ee.web.project.facet.IWebFacetInstallDataModelProperties;
+import org.eclipse.jst.javaee.application.Application;
+import org.eclipse.jst.javaee.core.Description;
+import org.eclipse.jst.javaee.core.JavaeeFactory;
+import org.eclipse.jst.javaee.ejb.EJBJar;
+import org.eclipse.jst.javaee.ejb.EJBJarDeploymentDescriptor;
+import org.eclipse.jst.javaee.web.WebApp;
+import org.eclipse.jst.jee.project.facet.IAppClientCreateDeploymentFilesDataModelProperties;
+import org.eclipse.jst.jee.project.facet.ICreateDeploymentFilesDataModelProperties;
+import org.eclipse.jst.jee.project.facet.IEJBCreateDeploymentFilesDataModelProperties;
+import org.eclipse.jst.jee.project.facet.IEarCreateDeploymentFilesDataModelProperties;
+import org.eclipse.jst.jee.project.facet.IWebCreateDeploymentFilesDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetDataModelProperties;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.internal.operations.IHeadlessRunnableWithProgress;
+import org.eclipse.wst.common.internal.emf.resource.RendererFactory;
+import org.eclipse.wst.common.project.facet.core.IProjectFacet;
+import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
+import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
+import org.eclipse.wst.common.tests.SimpleTestSuite;
+import org.eclipse.wtp.j2ee.headless.tests.appclient.operations.AppClientProjectCreationOperationTest;
+import org.eclipse.wtp.j2ee.headless.tests.ear.operations.EARProjectCreationOperationTest;
+import org.eclipse.wtp.j2ee.headless.tests.ejb.operations.EJBProjectCreationOperationTest;
+import org.eclipse.wtp.j2ee.headless.tests.web.operations.WebProjectCreationOperationTest;
+
+public class ModelProviderTest extends GeneralEMFPopulationTest {
+
+	private static final String PROJECTNAME = "TestModelProviders";
+	private final String descText = "Testing setting the desc";
+
+	public ModelProviderTest(String name) {
+		super(name);
+	}
+
+	public static Test suite() {
+		SimpleTestSuite suite = new SimpleTestSuite(ModelProviderTest.class);
+		
+		return suite;
+	}
+
+	/**
+	 * @param eObject
+	 */
+
+	protected Object primCreateAttributeValue(EAttribute att, EObject eObject) {
+		if (att.getEAttributeType() == XMLTypePackage.eINSTANCE.getQName())
+			return null;
+		else
+			return super.primCreateAttributeValue(att, eObject);
+	}
+
+	protected void setUp() throws Exception {
+		super.setUp();
+		
+		RendererFactory.getDefaultRendererFactory().setValidating(false);
+		final IWorkspace workspace = ResourcesPlugin.getWorkspace();
+		if (workspace.getRoot().getProject(PROJECTNAME).isAccessible())
+			return;
+		final IProjectDescription description = workspace.newProjectDescription(PROJECTNAME);
+		description.setLocation(null);
+
+		// create the new project operation
+		IHeadlessRunnableWithProgress op = new IHeadlessRunnableWithProgress() {
+			public void run(IProgressMonitor monitor) {
+				try {
+					createProject(description, workspace.getRoot().getProject(PROJECTNAME), monitor);
+				} catch (OperationCanceledException e) {
+					e.printStackTrace();
+				} catch (CoreException e) {
+					e.printStackTrace();
+				}
+			}
+		};
+
+		// run the new project creation operation
+		try {
+			op.run(new NullProgressMonitor());
+		} catch (InterruptedException e) {
+			return;
+		}
+	}
+
+	private void createProject(IProjectDescription description, IProject projectHandle, IProgressMonitor monitor)
+			throws CoreException, OperationCanceledException {
+		try {
+			monitor.beginTask("", 2000); //$NON-NLS-1$
+
+			projectHandle.create(description, new SubProgressMonitor(monitor, 1000));
+
+			if (monitor.isCanceled())
+				throw new OperationCanceledException();
+
+			projectHandle.open(IResource.BACKGROUND_REFRESH, new SubProgressMonitor(monitor, 1000));
+
+		} finally {
+			monitor.done();
+		}
+	}
+
+	public void testUseEar5Model() throws Exception {
+
+		String projName = PROJECTNAME + "EE5EarProject";//$NON-NLS-1$
+		IProject earProj = createEarProject(projName, J2EEVersionConstants.JEE_5_0_ID, true);
+
+		final IModelProvider provider = ModelProviderManager.getModelProvider(earProj);
+
+		provider.modify(new Runnable() {
+			public void run() {
+				Application ear = (Application) provider.getModelObject();
+				Description desc = JavaeeFactory.eINSTANCE.createDescription();
+				desc.setValue(descText);
+				ear.getDescriptions().add(desc);
+			}
+		}, null);
+
+		// Close project to force flush
+		earProj.close(new NullProgressMonitor());
+		// Re-open project
+		earProj.open(new NullProgressMonitor());
+
+		IModelProvider newProvider = ModelProviderManager.getModelProvider(earProj);
+		Application sameEar = (Application) newProvider.getModelObject();
+		Assert.assertNotNull("Application Model Object should not be null", sameEar);
+
+		Description desc = (Description) sameEar.getDescriptions().get(0);
+		Assert.assertEquals(descText, desc.getValue());
+
+	}
+	public void testUseEar6Model() throws Exception {
+
+		String projName = PROJECTNAME + "EE6EarProject";//$NON-NLS-1$
+		IProject earProj = createEarProject(projName, J2EEVersionConstants.JEE_6_0_ID, true);
+
+		final IModelProvider provider = ModelProviderManager.getModelProvider(earProj);
+
+		provider.modify(new Runnable() {
+			public void run() {
+				Application ear = (Application) provider.getModelObject();
+				Description desc = JavaeeFactory.eINSTANCE.createDescription();
+				desc.setValue(descText);
+				ear.getDescriptions().add(desc);
+			}
+		}, null);
+
+		// Close project to force flush
+		earProj.close(new NullProgressMonitor());
+		// Re-open project
+		earProj.open(new NullProgressMonitor());
+
+		IModelProvider newProvider = ModelProviderManager.getModelProvider(earProj);
+		Application sameEar = (Application) newProvider.getModelObject();
+		Assert.assertNotNull("Application Model Object should not be null", sameEar);
+
+		Description desc = (Description) sameEar.getDescriptions().get(0);
+		Assert.assertEquals(descText, desc.getValue());
+
+	}
+
+	public void testUseEar5NoDDModel() throws Exception {
+
+		String projName = PROJECTNAME + "EE5EarProject";//$NON-NLS-1$
+		IProject earProj = createEarProject(projName, J2EEVersionConstants.JEE_5_0_ID, false);
+
+		// create the DD because the project was created without one
+		IDataModel ddCreateModel = this.getDDCreationDataModel(earProj);
+		ddCreateModel.getDefaultOperation().execute(new NullProgressMonitor(), null);
+
+		final IModelProvider provider = ModelProviderManager.getModelProvider(earProj);
+		provider.modify(new Runnable() {
+			public void run() {
+				Application ear = (Application) provider.getModelObject();
+				if (ear.getDescriptions().isEmpty())
+					ear.getDescriptions().add(JavaeeFactory.eINSTANCE.createDescription());
+				Description desc = (Description) ear.getDescriptions().get(0);
+				desc.setValue(descText);
+			}
+		}, IModelProvider.FORCESAVE);
+
+		// Close project to force flush
+		earProj.close(new NullProgressMonitor());
+		// Re-open project
+		earProj.open(new NullProgressMonitor());
+
+		IModelProvider newProvider = ModelProviderManager.getModelProvider(earProj);
+		Application sameEar = (Application) newProvider.getModelObject();
+		Description desc = (Description) sameEar.getDescriptions().get(0);
+		Assert.assertEquals(descText, desc.getValue());
+
+	}
+
+	public void testUseEar14Model() throws Exception {
+
+		String projName = PROJECTNAME + "EE14EarProject";//$NON-NLS-1$
+		IProject earProj = createEarProject(projName, J2EEVersionConstants.J2EE_1_4_ID, true);
+		final IModelProvider provider = ModelProviderManager.getModelProvider(earProj);
+
+		// Test getting model through path api.
+		org.eclipse.jst.j2ee.application.Application ear = (org.eclipse.jst.j2ee.application.Application) provider
+				.getModelObject(new Path(J2EEConstants.APPLICATION_DD_URI));
+
+		provider.modify(new Runnable() {
+			public void run() {
+				org.eclipse.jst.j2ee.application.Application ear = (org.eclipse.jst.j2ee.application.Application) provider
+						.getModelObject();
+				ear.setDescription(descText);
+
+			}
+		}, null);
+
+		// Close project to force flush
+		earProj.close(new NullProgressMonitor());
+		// Re-open project
+		earProj.open(new NullProgressMonitor());
+
+		IModelProvider newProvider = ModelProviderManager.getModelProvider(earProj);
+		org.eclipse.jst.j2ee.application.Application sameEar = (org.eclipse.jst.j2ee.application.Application) newProvider
+				.getModelObject();
+		org.eclipse.jst.j2ee.common.Description desc = (org.eclipse.jst.j2ee.common.Description) sameEar
+				.getDescriptions().get(0);
+		Assert.assertEquals(descText, desc.getValue());
+	}
+
+	public void testUseWeb25Model() throws Exception {
+
+		String projName = PROJECTNAME + "EE5WebProject";//$NON-NLS-1$
+		IProject webProj = createWebProject(projName, J2EEVersionConstants.WEB_2_5_ID, true);
+
+		final IModelProvider provider = ModelProviderManager.getModelProvider(webProj);
+
+		provider.modify(new Runnable() {
+			public void run() {
+				WebApp webApp = (WebApp) provider.getModelObject();
+				Description desc = JavaeeFactory.eINSTANCE.createDescription();
+				desc.setValue(descText);
+				webApp.getDescriptions().add(desc);
+			}
+		}, null);
+
+		// Close project to force flush
+		webProj.close(new NullProgressMonitor());
+		// Re-open project
+		webProj.open(new NullProgressMonitor());
+
+		IModelProvider newProvider = ModelProviderManager.getModelProvider(webProj);
+		WebApp sameWebApp = (WebApp) newProvider.getModelObject();
+		Description desc = (Description) sameWebApp.getDescriptions().get(0);
+		Assert.assertEquals(descText, desc.getValue());
+
+	}
+	public void testUseWeb30Model() throws Exception {
+
+		String projName = PROJECTNAME + "EE6WebProject";//$NON-NLS-1$
+		IProject webProj = createWebProject(projName, J2EEVersionConstants.WEB_3_0_ID, true);
+
+		final IModelProvider provider = ModelProviderManager.getModelProvider(webProj);
+
+		provider.modify(new Runnable() {
+			public void run() {
+				WebApp webApp = (WebApp) provider.getModelObject();
+				Description desc = JavaeeFactory.eINSTANCE.createDescription();
+				desc.setValue(descText);
+				webApp.getDescriptions().add(desc);
+			}
+		}, null);
+
+		// Close project to force flush
+		webProj.close(new NullProgressMonitor());
+		// Re-open project
+		webProj.open(new NullProgressMonitor());
+
+		IModelProvider newProvider = ModelProviderManager.getModelProvider(webProj);
+		WebApp sameWebApp = (WebApp) newProvider.getModelObject();
+		Description desc = (Description) sameWebApp.getDescriptions().get(0);
+		Assert.assertEquals(descText, desc.getValue());
+
+	}
+
+	public void testUseWeb25NoDDModel() throws Exception {
+		String projName = PROJECTNAME + "EE5WebProject";//$NON-NLS-1$
+		IProject webProj = createWebProject(projName, J2EEVersionConstants.WEB_2_5_ID, false);
+
+		// create the DD because the project was created without one
+		IDataModel ddCreateModel = this.getDDCreationDataModel(webProj);
+		ddCreateModel.getDefaultOperation().execute(new NullProgressMonitor(), null);
+
+		final IModelProvider provider = ModelProviderManager.getModelProvider(webProj);
+
+		provider.modify(new Runnable() {
+			public void run() {
+				WebApp webApp = (WebApp) provider.getModelObject();
+				if (webApp.getDescriptions().isEmpty())
+					webApp.getDescriptions().add(JavaeeFactory.eINSTANCE.createDescription());
+				Description desc = (Description) webApp.getDescriptions().get(0);
+				desc.setValue(descText);
+			}
+		}, IModelProvider.FORCESAVE);
+
+		// Close project to force flush
+		webProj.close(new NullProgressMonitor());
+		// Re-open project
+		webProj.open(new NullProgressMonitor());
+
+		IModelProvider newProvider = ModelProviderManager.getModelProvider(webProj);
+		WebApp sameWebApp = (WebApp) newProvider.getModelObject();
+		Description desc = (Description) sameWebApp.getDescriptions().get(0);
+		Assert.assertEquals(descText, desc.getValue());
+
+	}
+
+	public void testUseWeb24Model() throws Exception {
+
+		String projName = PROJECTNAME + "EE14WebProject";//$NON-NLS-1$
+		IProject webProj = createWebProject(projName, J2EEVersionConstants.WEB_2_4_ID, true);
+		final IModelProvider provider = ModelProviderManager.getModelProvider(webProj);
+
+		provider.modify(new Runnable() {
+			public void run() {
+				org.eclipse.jst.j2ee.webapplication.WebApp webApp = (org.eclipse.jst.j2ee.webapplication.WebApp) provider
+						.getModelObject();
+				webApp.setDescription(descText);
+			}
+		}, null);
+
+		// Close project to force flush
+		webProj.close(new NullProgressMonitor());
+		// Re-open project
+		webProj.open(new NullProgressMonitor());
+
+		IModelProvider newProvider = ModelProviderManager.getModelProvider(webProj);
+		org.eclipse.jst.j2ee.webapplication.WebApp sameWebApp = (org.eclipse.jst.j2ee.webapplication.WebApp) newProvider
+				.getModelObject();
+		org.eclipse.jst.j2ee.common.Description desc = (org.eclipse.jst.j2ee.common.Description) sameWebApp
+				.getDescriptions().get(0);
+		Assert.assertEquals(descText, desc.getValue());
+
+	}
+
+	public void testUseEjb3Model() throws Exception {
+
+		String projName = PROJECTNAME + "EE5EjbProject";//$NON-NLS-1$
+		IProject ejbProj = createEjbProject(projName, J2EEVersionConstants.EJB_3_0_ID, true);
+
+		final IModelProvider provider = ModelProviderManager.getModelProvider(ejbProj);
+
+		provider.modify(new Runnable() {
+			public void run() {
+				EJBJar ejbJar = (EJBJar) provider.getModelObject();
+				Description desc = JavaeeFactory.eINSTANCE.createDescription();
+				desc.setValue(descText);
+				ejbJar.getDescriptions().add(desc);
+			}
+		}, null);
+
+		// Close project to force flush
+		ejbProj.close(new NullProgressMonitor());
+		// Re-open project
+		ejbProj.open(new NullProgressMonitor());
+
+		IModelProvider newProvider = ModelProviderManager.getModelProvider(ejbProj);
+		EJBJar sameEjbJar = (EJBJar) newProvider.getModelObject();
+		Assert.assertNotNull("EJBJar Model Object should not be null", sameEjbJar);
+
+		Description desc = findDescription(sameEjbJar.getDescriptions(), descText);
+		Assert.assertNotNull(desc);
+
+	}
+	public void testUseEjb31Model() throws Exception {
+
+		String projName = PROJECTNAME + "EE6EjbProject";//$NON-NLS-1$
+		IProject ejbProj = createEjbProject(projName, J2EEVersionConstants.EJB_3_1_ID, true);
+
+		final IModelProvider provider = ModelProviderManager.getModelProvider(ejbProj);
+
+		provider.modify(new Runnable() {
+			public void run() {
+				EJBJar ejbJar = (EJBJar) provider.getModelObject();
+				Description desc = JavaeeFactory.eINSTANCE.createDescription();
+				desc.setValue(descText);
+				ejbJar.getDescriptions().add(desc);
+			}
+		}, null);
+
+		// Close project to force flush
+		ejbProj.close(new NullProgressMonitor());
+		// Re-open project
+		ejbProj.open(new NullProgressMonitor());
+
+		IModelProvider newProvider = ModelProviderManager.getModelProvider(ejbProj);
+		EJBJar sameEjbJar = (EJBJar) newProvider.getModelObject();
+		Assert.assertNotNull("EJBJar Model Object should not be null", sameEjbJar);
+
+		Description desc = findDescription(sameEjbJar.getDescriptions(), descText);
+		Assert.assertNotNull(desc);
+
+	}
+
+	private Description findDescription(List list, String descText2) {
+		for (Object object : list) {
+			Description descr = (Description) object;
+			if (descText2.equals(descr.getValue())) {
+				return descr;
+			}
+		}
+		return null;
+	}
+
+	public void testUseEjb3NoDDModel() throws Exception {
+		String projName = PROJECTNAME + "EE5EjbProject";//$NON-NLS-1$
+		IProject ejbProj = createEjbProject(projName, J2EEVersionConstants.EJB_3_0_ID, false);
+
+		// create the DD because the project was created without one
+		IDataModel ddCreateModel = this.getDDCreationDataModel(ejbProj);
+		ddCreateModel.getDefaultOperation().execute(new NullProgressMonitor(), null);
+
+		final IModelProvider provider = ModelProviderManager.getModelProvider(ejbProj);
+
+		provider.modify(new Runnable() {
+			public void run() {
+				EJBJar ejbJar = (EJBJar) provider.getModelObject();
+				if (ejbJar.getDescriptions().isEmpty())
+					ejbJar.getDescriptions().add(JavaeeFactory.eINSTANCE.createDescription());
+				Description desc = (Description) ejbJar.getDescriptions().get(0);
+				desc.setValue(descText);
+			}
+		}, IModelProvider.FORCESAVE);
+
+		// Close project to force flush
+		ejbProj.close(new NullProgressMonitor());
+		// Re-open project
+		ejbProj.open(new NullProgressMonitor());
+
+		IModelProvider newProvider = ModelProviderManager.getModelProvider(ejbProj);
+		EJBJar sameEjbJar = (EJBJar) newProvider.getModelObject();
+		Description desc = (Description) sameEjbJar.getDescriptions().get(0);
+		Assert.assertEquals(descText, desc.getValue());
+
+	}
+
+	public void testUseEjb21Model() throws Exception {
+
+		String projName = PROJECTNAME + "EE14EjbProject";//$NON-NLS-1$
+		IProject ejbProj = createEjbProject(projName, J2EEVersionConstants.EJB_2_1_ID, true);
+		final IModelProvider provider = ModelProviderManager.getModelProvider(ejbProj);
+
+		provider.modify(new Runnable() {
+			public void run() {
+				org.eclipse.jst.j2ee.ejb.EJBJar ejbJar = (org.eclipse.jst.j2ee.ejb.EJBJar) provider.getModelObject();
+				ejbJar.setDescription(descText);
+			}
+		}, null);
+
+		// Close project to force flush
+		ejbProj.close(new NullProgressMonitor());
+		// Re-open project
+		ejbProj.open(new NullProgressMonitor());
+
+		IModelProvider newProvider = ModelProviderManager.getModelProvider(ejbProj);
+		org.eclipse.jst.j2ee.ejb.EJBJar sameEjbJar = (org.eclipse.jst.j2ee.ejb.EJBJar) newProvider.getModelObject();
+		org.eclipse.jst.j2ee.common.Description desc = (org.eclipse.jst.j2ee.common.Description) sameEjbJar
+				.getDescriptions().get(0);
+		Assert.assertEquals(descText, desc.getValue());
+
+	}
+
+	public void testUseAppClient14Model() throws Exception {
+		String projName = PROJECTNAME + "EE14AppClientProject";//$NON-NLS-1$
+		IProject appClientProj = createAppClientProject(projName, J2EEVersionConstants.J2EE_1_4_ID, true);
+		final IModelProvider provider = ModelProviderManager.getModelProvider(appClientProj);
+
+		// Test getting model through path api.
+		ApplicationClient client = (ApplicationClient) provider
+				.getModelObject(new Path(J2EEConstants.APP_CLIENT_DD_URI));
+
+		provider.modify(new Runnable() {
+			public void run() {
+				ApplicationClient client = (ApplicationClient) provider.getModelObject();
+				client.setDescription(descText);
+			}
+		}, null);
+
+		// Close project to force flush
+		appClientProj.close(new NullProgressMonitor());
+		// Re-open project
+		appClientProj.open(new NullProgressMonitor());
+
+		IModelProvider newProvider = ModelProviderManager.getModelProvider(appClientProj);
+		ApplicationClient sameEar = (ApplicationClient) newProvider.getModelObject();
+		org.eclipse.jst.j2ee.common.Description desc = (org.eclipse.jst.j2ee.common.Description) sameEar
+				.getDescriptions().get(0);
+		Assert.assertEquals(descText, desc.getValue());
+	}
+
+	public void testUseAppClient5Model() throws Exception {
+
+		String projName = PROJECTNAME + "EE5AppClientProject";//$NON-NLS-1$
+		IProject appClientProj = createAppClientProject(projName, J2EEVersionConstants.JEE_5_0_ID, true);
+		final IModelProvider provider = ModelProviderManager.getModelProvider(appClientProj);
+
+		// Test getting model through path api.
+		org.eclipse.jst.javaee.applicationclient.ApplicationClient client = (org.eclipse.jst.javaee.applicationclient.ApplicationClient) provider
+				.getModelObject(new Path(J2EEConstants.APP_CLIENT_DD_URI));
+
+		provider.modify(new Runnable() {
+			public void run() {
+				org.eclipse.jst.javaee.applicationclient.ApplicationClient client = (org.eclipse.jst.javaee.applicationclient.ApplicationClient) provider
+						.getModelObject();
+				Description desc = JavaeeFactory.eINSTANCE.createDescription();
+				desc.setValue(descText);
+				client.getDescriptions().add(desc);
+			}
+		}, null);
+
+		// Close project to force flush
+		appClientProj.close(new NullProgressMonitor());
+		// Re-open project
+		appClientProj.open(new NullProgressMonitor());
+
+		IModelProvider newProvider = ModelProviderManager.getModelProvider(appClientProj);
+		org.eclipse.jst.javaee.applicationclient.ApplicationClient sameClient = (org.eclipse.jst.javaee.applicationclient.ApplicationClient) newProvider
+				.getModelObject();
+		Description desc = (Description) sameClient.getDescriptions().get(0);
+		Assert.assertEquals(descText, desc.getValue());
+	}
+	public void testUseAppClient6Model() throws Exception {
+
+		String projName = PROJECTNAME + "EE6AppClientProject";//$NON-NLS-1$
+		IProject appClientProj = createAppClientProject(projName, J2EEVersionConstants.JEE_6_0_ID, true);
+		final IModelProvider provider = ModelProviderManager.getModelProvider(appClientProj);
+
+		// Test getting model through path api.
+		org.eclipse.jst.javaee.applicationclient.ApplicationClient client = (org.eclipse.jst.javaee.applicationclient.ApplicationClient) provider
+				.getModelObject(new Path(J2EEConstants.APP_CLIENT_DD_URI));
+
+		provider.modify(new Runnable() {
+			public void run() {
+				org.eclipse.jst.javaee.applicationclient.ApplicationClient client = (org.eclipse.jst.javaee.applicationclient.ApplicationClient) provider
+						.getModelObject();
+				Description desc = JavaeeFactory.eINSTANCE.createDescription();
+				desc.setValue(descText);
+				client.getDescriptions().add(desc);
+			}
+		}, null);
+
+		// Close project to force flush
+		appClientProj.close(new NullProgressMonitor());
+		// Re-open project
+		appClientProj.open(new NullProgressMonitor());
+
+		IModelProvider newProvider = ModelProviderManager.getModelProvider(appClientProj);
+		org.eclipse.jst.javaee.applicationclient.ApplicationClient sameClient = (org.eclipse.jst.javaee.applicationclient.ApplicationClient) newProvider
+				.getModelObject();
+		Description desc = (Description) sameClient.getDescriptions().get(0);
+		Assert.assertEquals(descText, desc.getValue());
+	}
+
+	public void testUseAppClient5NoDDModel() throws Exception {
+		String projName = PROJECTNAME + "EE5AppClientProject";//$NON-NLS-1$
+		IProject appClientProj = createAppClientProject(projName, J2EEVersionConstants.JEE_5_0_ID, false);
+
+		// create the DD because the project was created without one
+		IDataModel ddCreateModel = this.getDDCreationDataModel(appClientProj);
+		ddCreateModel.getDefaultOperation().execute(new NullProgressMonitor(), null);
+
+		final IModelProvider provider = ModelProviderManager.getModelProvider(appClientProj);
+
+		// Test getting model through path api.
+		org.eclipse.jst.javaee.applicationclient.ApplicationClient client = (org.eclipse.jst.javaee.applicationclient.ApplicationClient) provider
+				.getModelObject(new Path(J2EEConstants.APP_CLIENT_DD_URI));
+
+		provider.modify(new Runnable() {
+			public void run() {
+				org.eclipse.jst.javaee.applicationclient.ApplicationClient client = (org.eclipse.jst.javaee.applicationclient.ApplicationClient) provider
+						.getModelObject();
+				if (client.getDescriptions().isEmpty())
+					client.getDescriptions().add(JavaeeFactory.eINSTANCE.createDescription());
+				Description desc = (Description) client.getDescriptions().get(0);
+				desc.setValue(descText);
+
+			}
+		}, IModelProvider.FORCESAVE);
+
+		// Close project to force flush
+		appClientProj.close(new NullProgressMonitor());
+		// Re-open project
+		appClientProj.open(new NullProgressMonitor());
+
+		IModelProvider newProvider = ModelProviderManager.getModelProvider(appClientProj);
+		org.eclipse.jst.javaee.applicationclient.ApplicationClient sameClient = (org.eclipse.jst.javaee.applicationclient.ApplicationClient) newProvider
+				.getModelObject();
+		Description desc = (Description) sameClient.getDescriptions().get(0);
+		Assert.assertEquals(descText, desc.getValue());
+	}
+
+	private IDataModel getDDCreationDataModel(IProject project) {
+		Class dataModelClass = null;
+		if (JavaEEProjectUtilities.isEARProject(project)) {
+			dataModelClass = IEarCreateDeploymentFilesDataModelProperties.class;
+		} else if (JavaEEProjectUtilities.isEJBProject(project)) {
+			dataModelClass = IEJBCreateDeploymentFilesDataModelProperties.class;
+		} else if (JavaEEProjectUtilities.isDynamicWebProject(project)) {
+			dataModelClass = IWebCreateDeploymentFilesDataModelProperties.class;
+		} else if (JavaEEProjectUtilities.isApplicationClientProject(project)) {
+			dataModelClass = IAppClientCreateDeploymentFilesDataModelProperties.class;
+		}
+		IDataModel dataModel = DataModelFactory.createDataModel(dataModelClass);
+		dataModel.setProperty(ICreateDeploymentFilesDataModelProperties.TARGET_PROJECT, project);
+		return dataModel;
+	}
+
+	private IProject createWebProject(String projName, int vers, boolean createDD) throws ExecutionException {
+		String webVersionString = J2EEVersionUtil.convertVersionIntToString(vers);
+		IProjectFacet webFacet = ProjectFacetsManager.getProjectFacet(IWebFacetInstallDataModelProperties.DYNAMIC_WEB);
+		IProjectFacetVersion webFacetVersion = webFacet.getVersion(webVersionString);
+		IDataModel dataModel = WebProjectCreationOperationTest.getWebDataModel(projName, null, null, null, null,
+				webFacetVersion, createDD);
+		dataModel.getDefaultOperation().execute(new NullProgressMonitor(), null);
+		IProject webProj = ResourcesPlugin.getWorkspace().getRoot().getProject(projName);
+		return webProj;
+	}
+
+	private IProject createEjbProject(String projName, int vers, boolean createDD) throws ExecutionException {
+		String versionString = J2EEVersionUtil.convertVersionIntToString(vers);
+		IProjectFacet facet = ProjectFacetsManager.getProjectFacet(IEjbFacetInstallDataModelProperties.EJB);
+		IProjectFacetVersion facetVersion = facet.getVersion(versionString);
+		IDataModel dataModel = EJBProjectCreationOperationTest.getEJBDataModel(projName, null, null, null,
+				facetVersion, false, createDD);
+		dataModel.getDefaultOperation().execute(new NullProgressMonitor(), null);
+		IProject ejbProj = ResourcesPlugin.getWorkspace().getRoot().getProject(projName);
+		return ejbProj;
+	}
+
+	private IProject createEarProject(String projName, int vers, boolean createDD) throws ExecutionException {
+		String versionString = J2EEVersionUtil.convertVersionIntToString(vers);
+		IProjectFacet facet = ProjectFacetsManager
+				.getProjectFacet(IEarFacetInstallDataModelProperties.ENTERPRISE_APPLICATION);
+		IProjectFacetVersion facetVersion = facet.getVersion(versionString);
+		IDataModel dataModel = EARProjectCreationOperationTest.getEARDataModel(projName, null, null, null,
+				facetVersion, createDD);
+		dataModel.getDefaultOperation().execute(new NullProgressMonitor(), null);
+
+		IProject earProj = ResourcesPlugin.getWorkspace().getRoot().getProject(projName);
+		return earProj;
+	}
+
+	private IProject createAppClientProject(String projName, int vers, boolean createDD) throws ExecutionException {
+		String versionString = J2EEVersionUtil.convertVersionIntToString(vers);
+		IProjectFacet facet = ProjectFacetsManager
+				.getProjectFacet(IAppClientFacetInstallDataModelProperties.APPLICATION_CLIENT);
+		IProjectFacetVersion facetVersion = facet.getVersion(versionString);
+		IDataModel dataModel = AppClientProjectCreationOperationTest.getAppClientCreationDataModel(projName, null,
+				facetVersion, true, createDD);
+		dataModel.getDefaultOperation().execute(new NullProgressMonitor(), null);
+		IProject webProj = ResourcesPlugin.getWorkspace().getRoot().getProject(projName);
+		return webProj;
+	}
+
+	protected IDataModel setupJavaInstallAction(String aProjectName, String srcFolder) {
+		IDataModel dm = DataModelFactory.createDataModel(new JavaFacetInstallDataModelProvider());
+		dm.setProperty(IFacetDataModelProperties.FACET_PROJECT_NAME, aProjectName);
+		String jVersion = "5.0";
+		dm.setProperty(IFacetDataModelProperties.FACET_VERSION_STR, jVersion); //$NON-NLS-1$
+		dm.setStringProperty(IJavaFacetInstallDataModelProperties.SOURCE_FOLDER_NAME, srcFolder); //$NON-NLS-1$
+		return dm;
+	}
+
+	public IProject getProject() {
+		return ResourcesPlugin.getWorkspace().getRoot().getProject(PROJECTNAME);
+	}
+
+	public IProject getProject(String projName) {
+		return ResourcesPlugin.getWorkspace().getRoot().getProject(projName);
+	}
+
+	protected void tearDown() throws Exception {
+		// Don't delete these files
+	}
+
+	private ProjectResourceSet getResourceSet(String projName) {
+		IProject proj = getProject(projName);
+		return (ProjectResourceSet) WorkbenchResourceHelperBase.getResourceSet(proj);
+	}
+
+	public void testListener() throws Exception {
+
+		String projName = PROJECTNAME + "EE5EjbProject";//$NON-NLS-1$
+		IProject ejbProj = createEjbProject(projName, J2EEVersionConstants.EJB_3_0_ID, true);
+
+		// Add description
+		final IModelProvider provider = ModelProviderManager.getModelProvider(ejbProj);
+
+		provider.modify(new Runnable() {
+			public void run() {
+				EJBJar ejbJar = (EJBJar) provider.getModelObject();
+				Description desc = JavaeeFactory.eINSTANCE.createDescription();
+				desc.setValue(descText);
+				ejbJar.getDescriptions().add(desc);
+			}
+		}, null);
+
+		EJBJar jar = (EJBJar) provider.getModelObject();
+		Description oldDesc = (Description) jar.getDescriptions().get(0);
+		String oldString = oldDesc.getValue();
+
+		// set Name via manual resource loading
+		String modelPathURI = J2EEConstants.EJBJAR_DD_URI;
+		URI uri = URI.createURI(J2EEPlugin.getDefault().getJ2EEPreferences().getString(
+				J2EEPreferences.Keys.EJB_CONTENT_FOLDER)
+				+ "/" + modelPathURI);
+		FlexibleProjectResourceSet resSet = (FlexibleProjectResourceSet) getResourceSet(projName);
+
+		Resource ejbRes = (Resource) resSet.getResource(uri, true);
+
+		EObject root = ejbRes.getContents().get(0);
+		EJBJar editJar = null;
+		if (root instanceof EJBJarDeploymentDescriptor)
+			editJar = ((EJBJarDeploymentDescriptor) root).getEjbJar();
+		else
+			editJar = (EJBJar) root;
+		if (editJar.getDescriptions().isEmpty())
+			editJar.getDescriptions().add(JavaeeFactory.eINSTANCE.createDescription());
+		Description desc = (Description) editJar.getDescriptions().get(0);
+		desc.setValue(oldString + "ChangeME");
+		ejbRes.save(null);
+		ejbRes.unload();
+
+		jar = (EJBJar) provider.getModelObject();
+		Description newDesc = (Description) jar.getDescriptions().get(0);
+		String newString = newDesc.getValue();
+
+		Assert.assertEquals(oldString + "ChangeME", newString);
+
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/tests/RegisterMergedModelProviderTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/tests/RegisterMergedModelProviderTest.java
new file mode 100644
index 0000000..ef0313c
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/tests/RegisterMergedModelProviderTest.java
@@ -0,0 +1,89 @@
+/***********************************************************************
+ * Copyright (c) 2008 by SAP AG, Walldorf. 
+ * 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:
+ *     SAP AG - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jst.jee.model.tests;
+
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jst.j2ee.model.IModelProvider;
+import org.eclipse.jst.j2ee.model.IModelProviderFactory;
+import org.eclipse.jst.j2ee.model.ModelProviderManager;
+import org.eclipse.jst.javaee.ejb.EJBJar;
+import org.eclipse.jst.jee.model.internal.EJB3MergedModelProvider;
+import org.eclipse.jst.jee.model.internal.Ejb3MergedModelProviderFactory;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
+import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
+
+/**
+ * @author Kiril Mitov k.mitov@sap.com
+ * 
+ */
+public class RegisterMergedModelProviderTest extends TestCase {
+
+	private IProject fixture;
+
+	public static junit.framework.Test suite() {
+		TestSuite suite = new TestSuite(RegisterMergedModelProviderTest.class);
+		return suite;
+	}
+
+	public void setUp() throws Exception {
+		fixture = AbstractTest.createEjbProject(RegisterMergedModelProviderTest.class.getName()).getProject();
+	}
+
+	public void tearDown() throws Exception {
+		AbstractTest.deleteProject(RegisterMergedModelProviderTest.class.getName());
+	}
+
+	public void testRegister() {
+		IProjectFacetVersion version = ProjectFacetsManager.getProjectFacet("jst.ejb").getVersion("3.0");
+		IModelProvider oldProvider = ModelProviderManager.getModelProvider(getFixture());
+		assertNotNull(oldProvider);
+		ModelProviderManager.registerProvider(new Ejb3MergedModelProviderFactory(), version, "3");
+		IModelProvider provider = ModelProviderManager.getModelProvider(getFixture());
+		assertNotNull(provider);
+		assertTrue(EJB3MergedModelProvider.class.isInstance(provider));
+		assertNotNull(provider.getModelObject());
+		assertTrue(EJBJar.class.isInstance(provider.getModelObject()));
+	}
+
+	/**
+	 * Call register method first without calling getModelProvider method before
+	 * that. Test case for bug [214136]
+	 */
+	public void testCallRegisterMethodFirst() {
+		IProjectFacetVersion version = ProjectFacetsManager.getProjectFacet("jst.ejb").getVersion("3.0");
+		ModelProviderManager.registerProvider(new MyModelProviderFactory(), version, "3");
+		IModelProvider provider = ModelProviderManager.getModelProvider(getFixture());
+		assertNull(provider);
+		
+		// register the real model provider so that this test does not affect
+		// the ather tests.
+		ModelProviderManager.registerProvider(new Ejb3MergedModelProviderFactory(), version, "3");
+	}
+
+	private static class MyModelProviderFactory implements IModelProviderFactory {
+
+		public IModelProvider create(IProject project) {
+			return null;
+		}
+
+		public IModelProvider create(IVirtualComponent component) {
+			return null;
+		}
+	}
+
+	private IProject getFixture() {
+		return fixture;
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/tests/SynchronousModelChangedListener.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/tests/SynchronousModelChangedListener.java
new file mode 100644
index 0000000..b716098
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/tests/SynchronousModelChangedListener.java
@@ -0,0 +1,66 @@
+/***********************************************************************
+ * Copyright (c) 2008 by SAP AG, Walldorf. 
+ * 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:
+ *     SAP AG - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jst.jee.model.tests;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.concurrent.Semaphore;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.jst.j2ee.model.IModelProviderEvent;
+import org.eclipse.jst.j2ee.model.IModelProviderListener;
+
+/**
+ * @author  Kiril Mitov k.mitov@sap.com
+ *
+ */
+public class SynchronousModelChangedListener implements IModelProviderListener {
+
+	private final Semaphore s;
+	private final int expectedEvents;
+	private final Collection<IModelProviderEvent> receivedEvents;
+
+	public SynchronousModelChangedListener(int expectedEvents) throws InterruptedException {
+		this.expectedEvents = expectedEvents;
+		this.s = new Semaphore(1);
+		this.s.acquire();
+		this.receivedEvents = Collections.synchronizedList(new LinkedList<IModelProviderEvent>());
+	}
+
+	public boolean waitForEvents() throws InterruptedException {
+		return s.tryAcquire(5, TimeUnit.SECONDS);
+	}
+
+	public Collection<IModelProviderEvent> getReceivedEvents() {
+		return receivedEvents;
+	}
+
+	public synchronized void modelsChanged(IModelProviderEvent event) {
+		try {
+			receivedEvents.add(event);
+			if (receivedEvents.size() > expectedEvents)
+				throw new IllegalStateException("The expected events were already reached <" + dumpEvent(event) + ">");
+		} finally {
+			if (expectedEvents == receivedEvents.size())
+				s.release();
+		}
+	}
+
+	private String dumpEvent(IModelProviderEvent event) {
+		StringBuilder builder = new StringBuilder();
+		builder.append("Event for project <" + event.getProject() + "> with changed resources: \r\n");
+		for (Object resource : event.getChangedResources()) {
+			builder.append(resource + "\r\n");
+		}
+		return builder.toString();
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/tests/TestUtils.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/tests/TestUtils.java
new file mode 100644
index 0000000..df577e0
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/tests/TestUtils.java
@@ -0,0 +1,163 @@
+/***********************************************************************
+ * Copyright (c) 2008 by SAP AG, Walldorf. 
+ * 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:
+ *     SAP AG - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jst.jee.model.tests;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jst.javaee.core.EjbLocalRef;
+import org.eclipse.jst.javaee.core.LifecycleCallback;
+import org.eclipse.jst.javaee.core.ResourceRef;
+import org.eclipse.jst.javaee.core.SecurityRole;
+import org.eclipse.jst.javaee.core.SecurityRoleRef;
+import org.eclipse.jst.javaee.ejb.ActivationConfigProperty;
+import org.eclipse.jst.javaee.ejb.EJBJar;
+import org.eclipse.jst.javaee.ejb.InitMethodType;
+import org.eclipse.jst.javaee.ejb.MessageDrivenBean;
+import org.eclipse.jst.javaee.ejb.RemoveMethodType;
+import org.eclipse.jst.javaee.ejb.SessionBean;
+import org.eclipse.jst.javaee.web.Servlet;
+import org.eclipse.jst.javaee.web.WebApp;
+
+/**
+ * @author  Kiril Mitov k.mitov@sap.com
+ *
+ */
+public class TestUtils {
+	
+	public static String getFileContent(IFile file) throws CoreException, IOException {
+		InputStream stream = file.getContents();
+		try {
+			ByteArrayOutputStream os = new ByteArrayOutputStream();
+			int i = 0;
+			while ((i = stream.read()) != -1)
+				os.write(i);
+			return os.toString();
+		} finally {
+			stream.close();
+		}
+	}
+
+	public static EjbLocalRef findLocalRefByName(List<EjbLocalRef> localRefs, String refName) {
+		for (Iterator iter = localRefs.iterator(); iter.hasNext();) {
+			EjbLocalRef ref = (EjbLocalRef) iter.next();
+			if (refName.equals(ref.getEjbRefName())) {
+				return ref;
+			}
+		}
+		return null;
+	}
+
+	public static RemoveMethodType findRemoveMethodByName(SessionBean bean, String methodName) {
+		for (Iterator iter = bean.getRemoveMethods().iterator(); iter.hasNext();) {
+			RemoveMethodType removeMethod = (RemoveMethodType) iter.next();
+			if (methodName.equals(removeMethod.getBeanMethod().getMethodName()))
+				return removeMethod;
+		}
+		return null;
+	}
+
+	public static InitMethodType findInitMethodByName(SessionBean bean, String methodName) {
+		for (Iterator iter = bean.getInitMethods().iterator(); iter.hasNext();) {
+			InitMethodType iniMethod = (InitMethodType) iter.next();
+			if (methodName.equals(iniMethod.getBeanMethod().getMethodName()))
+				return iniMethod;
+		}
+		return null;
+	}
+
+	public static LifecycleCallback findLifecycleMethod(List callbacks, String name) {
+		for (Iterator iter = callbacks.iterator(); iter.hasNext();) {
+			LifecycleCallback callback = (LifecycleCallback) iter.next();
+			if (name.equals(callback.getLifecycleCallbackMethod()))
+				return callback;
+		}
+		return null;
+	}
+
+	public static ResourceRef findResourceRefByName(List<ResourceRef> resourceRefs, String name) {
+		for (Iterator iter = resourceRefs.iterator(); iter.hasNext();) {
+			ResourceRef ref = (ResourceRef) iter.next();
+			if (name.equals(ref.getResRefName())) {
+				return ref;
+			}
+		}
+		return null;
+	}
+
+	public static ActivationConfigProperty findActivationConfigProperty(MessageDrivenBean result, String name) {
+		for (Iterator iter = result.getActivationConfig().getActivationConfigProperties().iterator(); iter.hasNext();) {
+			ActivationConfigProperty prop = (ActivationConfigProperty) iter.next();
+			if (name.equals(prop.getActivationConfigPropertyName()))
+				return prop;
+		}
+		return null;
+	}
+
+	public static SecurityRole findSecurityRole(List securityRoles, String roleName) {
+		for (Iterator iter = securityRoles.iterator(); iter.hasNext();) {
+			SecurityRole role = (SecurityRole) iter.next();
+			if (role.getRoleName().equals(roleName))
+				return role;
+		}
+		return null;
+	}
+
+	public static SecurityRoleRef findSecurityRoleRef(List securityRefs, String string) {
+		for (Iterator iter = securityRefs.iterator(); iter.hasNext();) {
+			SecurityRoleRef ref = (SecurityRoleRef) iter.next();
+			if (ref.getRoleName().equals(string)) {
+				return ref;
+			}
+		}
+		return null;
+	}
+
+	public static Servlet findServletByName(WebApp app, String servletName) {
+		for (Iterator iter = app.getServlets().iterator(); iter.hasNext();) {
+			Servlet servlet = (Servlet) iter.next();
+			if (servlet.getServletName().equals(servletName)) {
+				return servlet;
+			}
+		}
+		return null;
+	}
+
+	public static SessionBean getSessionBean(EJBJar jar, String name) {
+		if (jar.getEnterpriseBeans() == null)
+			return null;
+		for (Iterator iter = jar.getEnterpriseBeans().getSessionBeans().iterator(); iter.hasNext();) {
+			SessionBean bean = (SessionBean) iter.next();
+			if (name.equals(bean.getEjbName())) {
+				return bean;
+			}
+		}
+		return null;
+	}
+
+	public static MessageDrivenBean getMessageDrivenBean(EJBJar jar, String name) {
+		if (jar.getEnterpriseBeans() == null)
+			return null;
+		for (Iterator iter = jar.getEnterpriseBeans().getMessageDrivenBeans().iterator(); iter.hasNext();) {
+			MessageDrivenBean bean = (MessageDrivenBean) iter.next();
+			if (name.equals(bean.getEjbName())) {
+				return bean;
+			}
+		}
+		return null;
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/web/tests/DeleteWebProjectTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/web/tests/DeleteWebProjectTest.java
new file mode 100644
index 0000000..7a209a0
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/web/tests/DeleteWebProjectTest.java
@@ -0,0 +1,148 @@
+/***********************************************************************
+ * Copyright (c) 2008 by SAP AG, Walldorf. 
+ * 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:
+ *     SAP AG - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jst.jee.model.web.tests;
+
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IPackageFragment;
+import org.eclipse.jdt.core.IPackageFragmentRoot;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jst.j2ee.dependency.tests.util.ProjectUtil;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.j2ee.model.IModelProvider;
+import org.eclipse.jst.j2ee.model.ModelProviderManager;
+import org.eclipse.jst.javaee.web.WebApp;
+import org.eclipse.jst.jee.model.tests.AbstractTest;
+import org.eclipse.jst.jee.model.tests.SynchronousModelChangedListener;
+import org.eclipse.wst.common.project.facet.core.IFacetedProject;
+import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
+
+/**
+ * @author Kiril Mitov k.mitov@sap.com
+ * 
+ */
+public class DeleteWebProjectTest extends TestCase {
+
+	public static junit.framework.Test suite() {
+		TestSuite suite = new TestSuite(DeleteWebProjectTest.class);
+		return suite;
+	}
+
+	private static void createProjectContent(IFacetedProject facetedProject) throws Exception {
+		IJavaProject javaProject = JavaCore.create(facetedProject.getProject());
+		IFolder srcFolder = javaProject.getProject().getFolder("src");
+		if (!srcFolder.exists())
+			srcFolder.create(true, true, new NullProgressMonitor());
+		IFolder comFolder = javaProject.getProject().getFolder("src/com");
+		comFolder.create(true, true, new NullProgressMonitor());
+		IPackageFragmentRoot root = javaProject.getPackageFragmentRoot(comFolder);
+		IPackageFragment fragment = root.createPackageFragment("sap", true, new NullProgressMonitor());
+		createServlet(fragment);
+		createServletWithSecurity(fragment);
+	}
+
+	private static void createServlet(IPackageFragment fragment) throws Exception {
+		final String content = "package com.sap;" + "import javax.annotation.Resource;import javax.ejb.EJB;"
+				+ "import javax.servlet.http.HttpServlet;" + "public class Servlet1 extends HttpServlet {"
+				+ "private static final long serialVersionUID = 1L;"
+				+ "@EJB private Comparable comp; @EJB public void setComparable(Comparable comp){};"
+				+ "@Resource private Comparable comp2; @Resource public void setComparable2(Comparable comp){} }";
+		IFile file = ((IContainer) fragment.getResource()).getFile(new Path("Servlet1.java"));
+		AbstractTest.saveFile(file, content);
+	}
+
+	private static void createServletWithSecurity(IPackageFragment fragment) throws Exception {
+		final String servletContent = "package com.sap;"
+				+ "import javax.servlet.http.HttpServlet;"
+				+ "@DeclareRoles(value = {\"role1\", \"role2\"})  public class ServletWithSecurity extends HttpServlet {}";
+		IFile file = ((IContainer) fragment.getResource()).getFile(new Path("ServletWithSecurity.java"));
+		AbstractTest.saveFile(file, servletContent);
+	}
+
+	/**
+	 * The same instance of the model provider is preserved during deleting the
+	 * project. After the project is deleted the instance of the IModelProvider
+	 * must return <code>null</code> for model object
+	 * 
+	 * @throws Exception
+	 */
+	// @Test
+	public void testDeleteProjectSameProvider() throws Exception {
+		IProject project = ProjectUtil.createWebProject(DeleteWebProjectTest.class.getSimpleName()
+				+ "testDeleteProjectSameProvider", null, J2EEVersionConstants.WEB_2_5_ID, true);
+		IFacetedProject facetedProject = ProjectFacetsManager.create(project);
+		createProjectContent(facetedProject);
+		IModelProvider provider = ModelProviderManager.getModelProvider(facetedProject.getProject());
+		WebApp firstModel = (WebApp) provider.getModelObject();
+		assertNotNull(firstModel);
+		assertEquals(firstModel, provider.getModelObject());
+
+		SynchronousModelChangedListener listener = new SynchronousModelChangedListener(1);
+		provider.addListener(listener);
+		AbstractTest.deleteProject(facetedProject.getProject().getName());
+		assertTrue(listener.waitForEvents());
+		provider.removeListener(listener);
+
+		try {
+			provider.getModelObject();
+			fail("IllegalStateException expected because the project is deleted and can not be accessed.");
+		} catch (IllegalStateException e) {
+		}
+	}
+
+	// @Test(expected = IllegalArgumentException.class)
+	public void testProviderForNonExistingProject() {
+		IProject nonExistingProject = ResourcesPlugin.getWorkspace().getRoot().getProject(
+				"testProviderForNonExistingProject");
+		assertFalse(nonExistingProject.exists());
+		IModelProvider modelProvider = ModelProviderManager.getModelProvider(nonExistingProject);
+		assertNull(modelProvider);
+	}
+
+	/**
+	 * Get the model for a project. Close the project. Get the model from the
+	 * same model provider. The model should be null because the project is
+	 * closed.
+	 * 
+	 * @throws Exception
+	 */
+	// @Test
+	public void testCloseProjectSameProvider() throws Exception {
+		IFacetedProject facetedProject = AbstractTest.createWebProject(DeleteWebProjectTest.class.getSimpleName()
+				+ "testClose");
+		createProjectContent(facetedProject);
+		IModelProvider provider = ModelProviderManager.getModelProvider(facetedProject.getProject());
+		WebApp firstModel = (WebApp) provider.getModelObject();
+		assertNotNull(firstModel);
+		assertEquals(firstModel, provider.getModelObject());
+
+		SynchronousModelChangedListener listener = new SynchronousModelChangedListener(1);
+		provider.addListener(listener);
+		AbstractTest.closeProject(facetedProject.getProject().getName());
+		assertTrue(listener.waitForEvents());
+		provider.removeListener(listener);
+		try {
+			provider.getModelObject();
+			fail("IllegalStateException expected because the project is closed and can not be accessed.");
+		} catch (IllegalStateException e) {
+		}
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/web/tests/TestWebXmlModelAfterUpdate.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/web/tests/TestWebXmlModelAfterUpdate.java
new file mode 100644
index 0000000..4835254
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/web/tests/TestWebXmlModelAfterUpdate.java
@@ -0,0 +1,284 @@
+package org.eclipse.jst.jee.model.web.tests;
+
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.namespace.NamespaceContext;
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathConstants;
+import javax.xml.xpath.XPathExpressionException;
+import javax.xml.xpath.XPathFactory;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.eclipse.core.filebuffers.FileBuffers;
+import org.eclipse.core.filebuffers.ITextFileBuffer;
+import org.eclipse.core.filebuffers.LocationKind;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.etools.common.test.apitools.ProjectUnzipUtil;
+import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jst.j2ee.model.IModelProvider;
+import org.eclipse.jst.j2ee.model.ModelProviderManager;
+import org.eclipse.jst.javaee.web.Filter;
+import org.eclipse.jst.javaee.web.WebApp;
+import org.eclipse.jst.javaee.web.WebFactory;
+import org.eclipse.text.edits.InsertEdit;
+import org.eclipse.text.edits.MalformedTreeException;
+import org.eclipse.text.edits.MultiTextEdit;
+import org.eclipse.text.edits.TextEdit;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
+import org.eclipse.wtp.j2ee.headless.tests.plugin.HeadlessTestsPlugin;
+import org.w3c.dom.NodeList;
+
+
+@SuppressWarnings("restriction")
+public class TestWebXmlModelAfterUpdate extends TestCase
+{
+    private static final String PROJECT_NAME = "TestJSTL_Web25";
+    private static final Path PROJECT_ZIP_LOCATION = new Path("TestData/WebEditDdExternal/TestJSTL_Web25.zip");
+    private static String[] projectNames = new String[]{PROJECT_NAME}; 
+
+    private static final String TRINIDAD_FILTER_NAME = "trinidad";
+    private static final String TRINIDAD_FILTER_CLASS = "trinidadClass";
+    private static final String DUMMY_FILTER_NAME = "dummyFilter";
+    private static final String DUMMY_FILTER_CLASS = "dummyFilterClass";
+
+    private IProject _iProject;
+
+    public static Test suite() {
+		TestSuite suite = new TestSuite(TestWebXmlModelAfterUpdate.class);
+		return suite;
+	}
+
+    /* (non-Javadoc)
+     * @see junit.framework.TestCase#setUp()
+     */
+    @Override
+    protected void setUp() throws Exception
+    {
+        super.setUp();
+        ProjectUnzipUtil util = new ProjectUnzipUtil(getLocalPath(PROJECT_ZIP_LOCATION), projectNames);
+		util.createProjects();
+		_iProject = ProjectUtilities.getProject(projectNames[0]);
+    }
+
+
+    /**
+     * Writes a filter to web.xml using TextFileBuffer, then tries to remove it
+     * from web.xml using the WTP web.xml model (WebApp).
+     *
+     * @throws Exception
+     */
+    public void testModelAfterWebXmlConfigOperation () 
+    throws CoreException, UnsupportedEncodingException, IOException, 
+           MalformedTreeException, BadLocationException
+    {
+        // Use WTP web.xml model to add dummy filter
+        addDummyFilterUsingWebapp();
+
+        // Use non-WTP web.xml model to add Trinidad filter
+        addTrinidadFilterUsingNonWebapp();
+
+        // Use WTP web.xml model to remove Trinidad filter
+        // (Currently fails as Trinidad filter cannot be found in the model)
+        removeTrinidadFilterUsingWebapp();
+    }
+
+
+    private void removeTrinidadFilterUsingWebapp ()
+    {
+        final IModelProvider modelProvider = ModelProviderManager.getModelProvider(_iProject);
+        modelProvider.modify(new Runnable()
+        {
+
+            public void run ()
+            {
+                final WebApp webapp = (WebApp) modelProvider.getModelObject();
+                assertNotNull("Expected non-null webapp", webapp);
+
+                final List<Filter> filters = webapp.getFilters();
+                assertNotNull("Expected non-null list of filters", filters);
+
+                final Filter filterToRemove = findFilter(webapp, TRINIDAD_FILTER_NAME);
+                assertNotNull("Expected Trinidad filter to be non-null", filterToRemove);
+
+                assertTrue(filters.remove(filterToRemove));
+            }
+
+        }, new Path("WEB-INF/web.xml"));
+    }
+
+
+    private void addDummyFilterUsingWebapp ()
+    {
+        final IModelProvider modelProvider = ModelProviderManager.getModelProvider(_iProject);
+        modelProvider.modify(new Runnable()
+        {
+
+            public void run ()
+            {
+                final Filter filter = WebFactory.eINSTANCE.createFilter();
+                filter.setFilterName(DUMMY_FILTER_NAME);
+                filter.setFilterClass(DUMMY_FILTER_CLASS);
+
+                final WebApp webapp = (WebApp) modelProvider.getModelObject();
+                webapp.getFilters().add(filter);
+            }
+
+        }, new Path("WEB-INF/web.xml"));
+    }
+
+
+    private void addTrinidadFilterUsingNonWebapp ()
+    throws CoreException, UnsupportedEncodingException, IOException, MalformedTreeException, BadLocationException
+    {
+
+        final IFile webXmlIfile = _iProject.getFile("WebContent/WEB-INF/web.xml"); //$NON-NLS-1$
+        assertTrue(webXmlIfile.exists());
+
+        final IDOMModel model = (IDOMModel) StructuredModelManager.getModelManager().getModelForEdit(webXmlIfile);
+        assertNotNull("Expected non-null web.xml DOM model", model);
+
+        final String textToInsert = "<filter>\n"
+                                    + "    <filter-name>" + TRINIDAD_FILTER_NAME + "</filter-name>\n"
+                                    + "    <filter-class>" + TRINIDAD_FILTER_CLASS + "</filter-class>\n"
+                                    + "</filter>\n";
+
+        // Start model change
+        model.aboutToChangeModel();
+
+
+        // Change model (Add a "trinidad" filter tag before the closing </web-app>)
+
+        final IDOMDocument document = model.getDocument();
+        final String namespacePrefix = "ns"; //$NON-NLS-1$
+        final String namespace = "http://java.sun.com/xml/ns/javaee"; //$NON-NLS-1$
+        final String XPATH_WEBAPP = "//ns:web-app";
+        final MapNamespaceContext namespaceContextMap = new MapNamespaceContext();
+        namespaceContextMap.put(namespacePrefix, namespace);
+
+        final NodeList nodeList = resolveXpath(document, XPATH_WEBAPP, namespaceContextMap);
+        final IDOMNode node = (IDOMNode) nodeList.item(0);
+        final int offset = node.getEndStructuredDocumentRegion().getStartOffset(); // just before closing </web-app> tag
+
+        final TextEdit edit = new MultiTextEdit();
+        final InsertEdit insertEdit = new InsertEdit(offset, textToInsert);
+        edit.addChild(insertEdit);
+
+        FileBuffers.getTextFileBufferManager().connect(webXmlIfile.getFullPath(), LocationKind.IFILE, new NullProgressMonitor());
+        final ITextFileBuffer buffer = FileBuffers.getTextFileBufferManager().getTextFileBuffer(webXmlIfile.getFullPath(), LocationKind.IFILE);
+        final IDocument idocument = buffer.getDocument();
+        edit.apply(idocument);
+
+
+        // End model change
+        model.save();
+        model.changedModel();
+    }
+
+
+    private static Filter findFilter (final WebApp webapp,
+                                      final String filterName)
+    {
+        for (final Object filter : webapp.getFilters())
+        {
+            if (((Filter) filter).getFilterName().equals(filterName))
+                return (Filter) filter;
+        }
+
+        return null;
+    }
+
+
+    private static NodeList resolveXpath (final IDOMDocument document,
+                                          final String xPathExpression,
+                                          final NamespaceContext namespaceContext)
+    {
+        final XPathFactory xPathFactory = XPathFactory.newInstance();
+        final XPath xPath = xPathFactory.newXPath();
+
+
+        if (namespaceContext != null)
+            xPath.setNamespaceContext(namespaceContext);
+
+        NodeList nodeList = null;
+        try
+        {
+            final Object nodeEval = xPath.evaluate(xPathExpression, document, XPathConstants.NODESET);
+            if (nodeEval instanceof NodeList)
+                nodeList = (NodeList) nodeEval;
+        }
+        catch (final XPathExpressionException e)
+        {
+            e.printStackTrace();
+        }
+
+        return nodeList;
+    }
+
+
+    private static class MapNamespaceContext implements NamespaceContext
+    {
+        private final Map<String, String> prefixToUri = new HashMap<String, String>();
+        private final Map<String, String> uriToPrefix = new HashMap<String, String>();
+
+
+        public String getNamespaceURI (final String prefix)
+        {
+            return prefixToUri.get(prefix);
+        }
+
+
+        public String getPrefix (final String namespaceURI)
+        {
+            return uriToPrefix.get(namespaceURI);
+        }
+
+
+        public Iterator<String> getPrefixes (final String namespaceURI)
+        {
+            return prefixToUri.keySet().iterator();
+        }
+
+
+        /**
+         * @param prefix
+         * @param uri
+         */
+        public void put (final String prefix, final String uri)
+        {
+            prefixToUri.put(prefix, uri);
+            uriToPrefix.put(uri, prefix);
+        }
+    }
+
+    private static IPath getLocalPath(IPath path) {
+		URL url = FileLocator.find(HeadlessTestsPlugin.getDefault().getBundle(), path, null);
+		try {
+			url = FileLocator.toFileURL(url);
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		return new Path(url.getPath());
+	}
+
+}
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/web/tests/Web25MergedModelProviderTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/web/tests/Web25MergedModelProviderTest.java
new file mode 100644
index 0000000..0dd513d
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/web/tests/Web25MergedModelProviderTest.java
@@ -0,0 +1,166 @@
+/***********************************************************************
+ * Copyright (c) 2008 by SAP AG, Walldorf. 
+ * 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:
+ *     SAP AG - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jst.jee.model.web.tests;
+
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IPackageFragment;
+import org.eclipse.jdt.core.IPackageFragmentRoot;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jst.j2ee.internal.web.operations.INewServletClassDataModelProperties;
+import org.eclipse.jst.j2ee.internal.web.operations.NewServletClassDataModelProvider;
+import org.eclipse.jst.j2ee.model.IModelProvider;
+import org.eclipse.jst.j2ee.model.ModelProviderManager;
+import org.eclipse.jst.javaee.web.WebApp;
+import org.eclipse.jst.jee.model.tests.AbstractTest;
+import org.eclipse.jst.jee.model.tests.SynchronousModelChangedListener;
+import org.eclipse.jst.jee.model.tests.TestUtils;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
+import org.eclipse.wst.common.project.facet.core.IFacetedProject;
+
+/**
+ * @author Kiril Mitov k.mitov@sap.com
+ * 
+ */
+public class Web25MergedModelProviderTest extends TestCase {
+
+	private static IFacetedProject facetedProject;
+
+	private IModelProvider fixture;
+
+	public static TestSuite suite() throws Exception {
+		TestSuite suite = new TestSuite(Web25MergedModelProviderTest.class);
+		return suite;
+	}
+
+	// @Before
+	@Override
+	protected void setUp() throws Exception {
+		setUpProject();
+		fixture = ModelProviderManager.getModelProvider(facetedProject.getProject());
+	}
+
+	protected void tearDown() throws Exception {
+		deleteProjectAndWait(facetedProject.getProject().getName());
+	}
+
+	private void deleteProjectAndWait(String projectName) throws InterruptedException {
+		SynchronousModelChangedListener listener = new SynchronousModelChangedListener(1);
+		fixture.addListener(listener);
+		AbstractTest.deleteProject(projectName);
+		assertTrue(listener.waitForEvents());
+		fixture.removeListener(listener);
+	}
+
+	// @BeforeClass
+	public void setUpProject() throws Exception {
+		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(
+				Web25MergedModelProviderTest.class.getSimpleName() + this.getName());
+		facetedProject = AbstractTest.createWebProject(project.getName());
+		createProjectContent();
+	}
+
+	private static void createProjectContent() throws Exception {
+		IJavaProject javaProject = JavaCore.create(facetedProject.getProject());
+		IFolder comFolder = javaProject.getProject().getFolder("src/com");
+		comFolder.create(true, true, new NullProgressMonitor());
+		IPackageFragmentRoot root = javaProject.getPackageFragmentRoot(comFolder);
+		IPackageFragment fragment = root.createPackageFragment("sap", true, new NullProgressMonitor());
+	}
+
+	// @Test
+	public void testAddServletWithOperation() throws Exception {
+		IDataModel dataModel = createAddServletModel("testAddServletWithOperation");
+		executeAndWait(dataModel.getDefaultOperation());
+
+		WebApp app = (WebApp) fixture.getModelObject();
+		assertNotNull(TestUtils.findServletByName(app, "testAddServletWithOperation"));
+	}
+
+	public void testAddServletFromJSP() throws Exception {
+		AbstractTest.saveFile(facetedProject.getProject().getFile("WebContent/index.jsp"), "");
+		IDataModel dataModel = createAddServletFromJSPModel("index.jsp", "index");
+		executeAndWait(dataModel.getDefaultOperation());
+
+		WebApp app = (WebApp) fixture.getModelObject();
+		assertNotNull(TestUtils.findServletByName(app, "index"));
+	}
+
+	// public void testPreserveListeners() throws Exception {
+	// IDataModel dataModel = createAddServletModel("testPreserveListeners");
+	//
+	// SynchronousModelChangedListener preserveListener = new
+	// SynchronousModelChangedListener(2);
+	// fixture.addListener(preserveListener);
+	// IFile webXml =
+	// facetedProject.getProject().getFile("WebContent/WEB-INF/web.xml");
+	// String content = TestUtils.getFileContent(webXml);
+	//
+	// saveFileAndUpdate(webXml, content);
+	//
+	// int oldEventSize = preserveListener.getReceivedEvents().size();
+	// executeAndWait(dataModel.getDefaultOperation());
+	// WebApp app = (WebApp) fixture.getModelObject();
+	// assertNotNull(TestUtils.findServletByName(app, "testPreserveListeners"));
+	// assertTrue(preserveListener.waitForEvents());
+	// assertTrue(oldEventSize < preserveListener.getReceivedEvents().size());
+	// fixture.removeListener(preserveListener);
+	// }
+
+	private void saveFileAndUpdate(IFile webXml, String content) throws InterruptedException, Exception {
+		SynchronousModelChangedListener listener = new SynchronousModelChangedListener(1);
+		fixture.addListener(listener);
+		AbstractTest.saveFile(webXml, content);
+		assertTrue(listener.waitForEvents());
+		fixture.removeListener(listener);
+	}
+
+	private IDataModel createAddServletFromJSPModel(String className, String dispayName) {
+		IDataModel dataModel;
+		dataModel = DataModelFactory.createDataModel(new NewServletClassDataModelProvider());
+		dataModel.setStringProperty(INewServletClassDataModelProperties.CLASS_NAME, className);
+		dataModel.setStringProperty(INewServletClassDataModelProperties.DISPLAY_NAME, dispayName);
+		dataModel.setStringProperty(INewServletClassDataModelProperties.PROJECT_NAME, facetedProject.getProject()
+				.getName());
+		dataModel.setBooleanProperty(INewServletClassDataModelProperties.USE_EXISTING_CLASS, Boolean.TRUE);
+		dataModel.setBooleanProperty(INewServletClassDataModelProperties.IS_SERVLET_TYPE, Boolean.FALSE);
+		return dataModel;
+	}
+
+	private IDataModel createAddServletModel(String className) {
+		IDataModel dataModel = DataModelFactory.createDataModel(new NewServletClassDataModelProvider());
+		dataModel.setStringProperty(INewServletClassDataModelProperties.CLASS_NAME, className);
+		dataModel.setStringProperty(INewServletClassDataModelProperties.PROJECT_NAME, facetedProject.getProject()
+				.getName());
+		dataModel.setBooleanProperty(INewServletClassDataModelProperties.IS_SERVLET_TYPE, Boolean.TRUE);
+		dataModel.setStringProperty(INewServletClassDataModelProperties.JAVA_PACKAGE, "org.eclipse");
+		return dataModel;
+	}
+
+	private void executeAndWait(IDataModelOperation dataModelOperation) throws InterruptedException, ExecutionException {
+		SynchronousModelChangedListener listener = new SynchronousModelChangedListener(1);
+		fixture.addListener(listener);
+		dataModelOperation.execute(null, null);
+		listener.waitForEvents();
+		fixture.removeListener(listener);
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/web/tests/Web3AnnotationReaderTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/web/tests/Web3AnnotationReaderTest.java
new file mode 100644
index 0000000..7d27643
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/web/tests/Web3AnnotationReaderTest.java
@@ -0,0 +1,403 @@
+/***********************************************************************
+ * Copyright (c) 2008 by SAP AG, Walldorf. 
+ * 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:
+ *     SAP AG - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jst.jee.model.web.tests;
+
+import junit.framework.TestSuite;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IPackageFragment;
+import org.eclipse.jdt.core.IPackageFragmentRoot;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jst.common.project.facet.JavaFacetUtils;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetConstants;
+import org.eclipse.jst.javaee.core.RunAs;
+import org.eclipse.jst.javaee.core.SecurityRole;
+import org.eclipse.jst.javaee.core.SecurityRoleRef;
+import org.eclipse.jst.javaee.web.Servlet;
+import org.eclipse.jst.javaee.web.WebApp;
+import org.eclipse.jst.javaee.web.WebFactory;
+import org.eclipse.jst.jee.model.internal.WebAnnotationReader;
+import org.eclipse.jst.jee.model.tests.AbstractAnnotationModelTest;
+import org.eclipse.jst.jee.model.tests.AbstractTest;
+import org.eclipse.jst.jee.model.tests.TestUtils;
+import org.eclipse.wst.common.project.facet.core.IFacetedProject;
+
+/**
+ * @author Kiril Mitov k.mitov@sap.com
+ * 
+ */
+public class Web3AnnotationReaderTest extends AbstractAnnotationModelTest {
+
+	private static final String TEST_URL_VALUE = "/testUrl";
+	private static final String SERVLET_WITH_URL = "ServletWithUrl";
+	private static final String SERVLET_NO_ARGUMENTS = "ServletNoArguments";
+	private static final String SERVLET_ANNOTATED_NAME = "ServletNameChange";
+	
+	private static String BEAN_WITH_NAME = "package com.sap;" + "import javax.ejb.Stateless;"
+			+ "@Stateless(name=\"%s\") public class BeanWithName implements SessionBeanLocal {}";
+
+	public static TestSuite suite() throws Exception {
+		TestSuite suite = new TestSuite(Web3AnnotationReaderTest.class);
+		return suite;
+	}
+
+	// @BeforeClass
+	public static void setUpProject() throws Exception {
+		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(Web3AnnotationReaderTest.class.getSimpleName());
+		if (!project.exists())
+		{
+			IFacetedProject facetedProject = AbstractTest.createWebProject(Web3AnnotationReaderTest.class.getSimpleName(), IJ2EEFacetConstants.DYNAMIC_WEB_30, JavaFacetUtils.JAVA_60);
+			createProjectContent(facetedProject.getProject());
+		}
+	}
+
+	// @AfterClass
+	public static void tearDownAfterClass() throws InterruptedException {
+		AbstractTest.deleteProject(Web3AnnotationReaderTest.class.getSimpleName());
+	}
+
+	private static void createProjectContent(IProject project) throws Exception {
+		IJavaProject javaProject = JavaCore.create(project);
+		IFolder comFolder = javaProject.getProject().getFolder("src/com");
+		comFolder.create(true, true, new NullProgressMonitor());
+		IPackageFragmentRoot root = javaProject.getPackageFragmentRoot(comFolder);
+		IPackageFragment fragment = root.createPackageFragment("sap", true, new NullProgressMonitor());
+		createServlet3(fragment, SERVLET_NO_ARGUMENTS, null, null);
+		createServlet3(fragment, SERVLET_ANNOTATED_NAME, "test", null);
+		createServlet3(fragment, SERVLET_WITH_URL, null, TEST_URL_VALUE);
+		createServletWithSecurity(fragment);
+	}
+	
+	private static void createServletWithSecurity(IPackageFragment fragment) throws Exception {
+		final String servletContent = "package com.sap;"
+				+ "import javax.servlet.http.HttpServlet;"
+				+ "@DeclareRoles(value = {\"role1\", \"role2\"})  public class ServletWithSecurity extends HttpServlet {}";
+		IFile file = ((IContainer) fragment.getResource()).getFile(new Path("ServletWithSecurity.java"));
+		AbstractTest.saveFile(file, servletContent);
+	}
+	
+	private static void createServlet3(IPackageFragment fragment, String className, String name, String urlPattern) throws Exception {
+		String params = "";
+		if (name != null){
+			params="name=\""+name+"\"";
+		}
+		if (urlPattern != null){
+			if (params.length() > 0){
+				params+=", ";
+			}
+			params+="urlPatterns=\""+urlPattern+"\"";
+		}
+		if(params.length() > 0){
+			params="(" + params+ ")";
+		}
+		final String content = "package com.sap;" + "import javax.annotation.Resource;import javax.ejb.EJB;"
+				+ "import javax.servlet.http.HttpServlet;" + "@WebServlet"+params+" public class "+className+" extends HttpServlet {"
+				+ "private static final long serialVersionUID = 1L;"
+				+ "@EJB private Comparable comp; @EJB public void setComparable(Comparable comp){};"
+				+ "@Resource private Comparable comp2; @Resource public void setComparable2(Comparable comp){} }";
+		IFile file = ((IContainer) fragment.getResource()).getFile(new Path(className+".java"));
+		AbstractTest.saveFile(file, content);
+	}
+
+	private WebApp ddApp;
+
+	// @Before
+	@Override
+	protected void setUp() throws Exception {
+		setUpProject();
+		super.setUp();
+		ddApp = WebFactory.eINSTANCE.createWebApp();
+		addServlet(ddApp, SERVLET_NO_ARGUMENTS, "com.sap.Servlet1");
+		fixture = new WebAnnotationReader(facetedProject, ddApp);
+	}
+
+	// @After
+	@Override
+	protected void tearDown() throws Exception {
+		((WebAnnotationReader) fixture).dispose();
+	}
+
+	// @Tets
+	public void testAddDeleteEjbRef() throws Exception {
+		final String content = "package com.sap;" + "import javax.annotation.Resource;import javax.ejb.EJB;"
+				+ "import javax.servlet.http.HttpServlet;" + "@WebServlet public class testAddDeleteEjbRef extends HttpServlet {"
+				+ "private static final long serialVersionUID = 1L;"
+				+ "@EJB private Comparable comp; @EJB public void setComparable(Comparable comp){};}";
+		IFile file = facetedProject.getProject().getFile("src/com/sap/testAddDeleteEjbRef.java");
+		saveFileAndUpdate(file, content);
+
+		WebApp result = (WebApp) fixture.getModelObject();
+		assertEquals(new Integer(8), new Integer(result.getEjbLocalRefs().size()));
+
+		deleteFileAndUpdate(file);
+		result = (WebApp) fixture.getModelObject();
+		assertEquals(new Integer(6), new Integer(result.getEjbLocalRefs().size()));
+	}
+
+	/**
+	 * The servlet is not described in the web.xml. It is not in the deployment
+	 * descriptor model.
+	 * 
+	 * @throws Exception
+	 */
+	// @Tets
+	public void testNotAServletAddDeleteEjbRef() throws Exception {
+		final String content = "package com.sap;" + "import javax.annotation.Resource;import javax.ejb.EJB;"
+				+ "import javax.servlet.http.HttpServlet;"
+				+ "public class testNotAServletAddDeleteEjbRef {"
+				+ "private static final long serialVersionUID = 1L;"
+				+ "@EJB private Comparable comp; @EJB public void setComparable(Comparable comp){};}";
+		IFile file = facetedProject.getProject().getFile("src/com/sap/testNotAServletAddDeleteEjbRef.java");
+		AbstractTest.saveFile(file, content);
+
+		WebApp result = (WebApp) fixture.getModelObject();
+		assertEquals(new Integer(6), new Integer(result.getEjbLocalRefs().size()));
+
+		AbstractTest.deleteFile(file);
+		result = (WebApp) fixture.getModelObject();
+		assertEquals(new Integer(6), new Integer(result.getEjbLocalRefs().size()));
+	}
+
+	// @Tets
+	public void testAddDeleteResourceRef() throws Exception {
+		final String content = "package com.sap;" + "import javax.annotation.Resource;import javax.ejb.EJB;"
+				+ "import javax.servlet.http.HttpServlet;"
+				+ "@WebServlet public class testAddDeleteResourceRef extends HttpServlet {"
+				+ "private static final long serialVersionUID = 1L;"
+				+ "@Resource private Comparable comp2; @Resource public void setComparable2(Comparable comp){} }";
+		IFile file = facetedProject.getProject().getFile("src/com/sap/testAddDeleteResourceRef.java");
+		saveFileAndUpdate(file, content);
+
+		WebApp result = (WebApp) fixture.getModelObject();
+		assertEquals(new Integer(8), new Integer(result.getResourceRefs().size()));
+		deleteFileAndUpdate(file);
+
+		result = (WebApp) fixture.getModelObject();
+		assertEquals(new Integer(6), new Integer(result.getResourceRefs().size()));
+	}
+
+	// @Tets
+	public void testListener() throws Exception {
+		final String content = "package com.sap;" + "import javax.annotation.Resource;import javax.ejb.EJB;"
+				+ "@WebListener public class testListener {"
+				+ "@EJB private Comparable comp; @EJB public void setComparable(Comparable comp){};"
+				+ "@Resource private Comparable comp2; @Resource public void setComparable2(Comparable comp){} }";
+		IFile file = facetedProject.getProject().getFile("src/com/sap/testListener.java");
+		saveFileAndUpdate(file, content);
+
+		WebApp result = (WebApp) fixture.getModelObject();
+		assertEquals(new Integer(8), new Integer(result.getResourceRefs().size()));
+		assertEquals(new Integer(8), new Integer(result.getEjbLocalRefs().size()));
+
+		deleteFileAndUpdate(file);
+		result = (WebApp) fixture.getModelObject();
+		assertEquals(new Integer(6), new Integer(result.getResourceRefs().size()));
+		assertEquals(new Integer(6), new Integer(result.getEjbLocalRefs().size()));
+	}
+
+	// @Tets
+	public void testFilter() throws Exception {
+		final String content = "package com.sap;" + "import javax.annotation.Resource;import javax.ejb.EJB;"
+				+ "@WebFilter public class testFilter {"
+				+ "@EJB private Comparable comp; @EJB public void setComparable(Comparable comp){};"
+				+ "@Resource private Comparable comp2; @Resource public void setComparable2(Comparable comp){} }";
+		IFile file = facetedProject.getProject().getFile("src/com/sap/testFilter.java");
+		saveFileAndUpdate(file, content);
+
+		WebApp result = (WebApp) fixture.getModelObject();
+		assertEquals(new Integer(8), new Integer(result.getResourceRefs().size()));
+		assertEquals(new Integer(8), new Integer(result.getEjbLocalRefs().size()));
+
+		deleteFileAndUpdate(file);
+		result = (WebApp) fixture.getModelObject();
+		assertEquals(new Integer(6), new Integer(result.getResourceRefs().size()));
+		assertEquals(new Integer(6), new Integer(result.getEjbLocalRefs().size()));
+
+	}
+
+	// @Tets
+	public void testResourcesServlet() throws Exception {
+		final String content = "package com.sap;"
+				+ "import javax.annotation.Resource;import javax.ejb.EJB;"
+				+ "@Resources(value = {"
+				+ "@Resource(name = \"withNotDefaults\", mappedName = \"mappedName\", "
+				+ "	shareable = false, type = java.lang.Comparable.class, "
+				+ "	authenticationType = AuthenticationType.APPLICATION, description = \"description\"),"
+				+ "@Resource(name = \"withDefaults\", type = java.lang.Comparable.class), @Resource(name = \"invalidNoType\") })"
+				+ "@WebServlet public class testResourcesServlet {}";
+		IFile file = facetedProject.getProject().getFile("src/com/sap/testResourcesServlet.java");
+		saveFileAndUpdate(file, content);
+
+		WebApp result = (WebApp) fixture.getModelObject();
+		assertEquals(new Integer(8), new Integer(result.getResourceRefs().size()));
+
+		deleteFileAndUpdate(file);
+		result = (WebApp) fixture.getModelObject();
+		assertEquals(new Integer(6), new Integer(result.getResourceRefs().size()));
+	}
+
+	// @Tets
+	public void testResourcesFilter() throws Exception {
+		final String content = "package com.sap;"
+				+ "import javax.annotation.Resource;import javax.ejb.EJB;"
+				+ "@Resources(value = {"
+				+ "@Resource(name = \"withNotDefaults\", mappedName = \"mappedName\", "
+				+ "	shareable = false, type = java.lang.Comparable.class, "
+				+ "	authenticationType = AuthenticationType.APPLICATION, description = \"description\"),"
+				+ "@Resource(name = \"withDefaults\", type = java.lang.Comparable.class), @Resource(name = \"invalidNoType\") })"
+				+ "@WebFilter public class testResourcesFilter {}";
+		IFile file = facetedProject.getProject().getFile("src/com/sap/testResourcesFilter.java");
+		saveFileAndUpdate(file, content);
+
+		WebApp result = (WebApp) fixture.getModelObject();
+		assertEquals(new Integer(8), new Integer(result.getResourceRefs().size()));
+
+		deleteFileAndUpdate(file);
+		result = (WebApp) fixture.getModelObject();
+		assertEquals(new Integer(6), new Integer(result.getResourceRefs().size()));
+	}
+
+	// @Tets
+	public void testResourcesOnListener() throws Exception {
+		final String content = "package com.sap;"
+				+ "import javax.annotation.Resource;import javax.ejb.EJB;"
+				+ "@Resources(value = {"
+				+ "@Resource(name = \"withNotDefaults\", mappedName = \"mappedName\", "
+				+ "	shareable = false, type = java.lang.Comparable.class, "
+				+ "	authenticationType = AuthenticationType.APPLICATION, description = \"description\"),"
+				+ "@Resource(name = \"withDefaults\", type = java.lang.Comparable.class), @Resource(name = \"invalidNoType\") })"
+				+ "@WebListener public class testResourcesOnListener {}";
+		IFile file = facetedProject.getProject().getFile("src/com/sap/testResourcesOnListener.java");
+		saveFileAndUpdate(file, content);
+
+		WebApp result = (WebApp) fixture.getModelObject();
+		assertEquals(new Integer(8), new Integer(result.getResourceRefs().size()));
+
+		deleteFileAndUpdate(file);
+		result = (WebApp) fixture.getModelObject();
+		assertEquals(new Integer(6), new Integer(result.getResourceRefs().size()));
+	}
+
+	// @Tets
+	public void testDeclareRoles() throws Exception {
+		final String beanContent = "package com.sap;"
+				+ "@DeclareRoles(value = {\"testDeclareRoles1\", \"testDeclareRoles1\"}) "
+				+ "@WebServlet public class testDeclareRoles extends HttpServlet {}";
+		IFile servletFile = facetedProject.getProject().getFile("src/com/sap/testDeclareRoles.java");
+		saveFileAndUpdate(servletFile, beanContent);
+
+		WebApp app = (WebApp) fixture.getModelObject();
+		Servlet result = TestUtils.findServletByName(app, "testDeclareRoles");
+		assertNotNull(result);
+		SecurityRole role1 = TestUtils.findSecurityRole(app.getSecurityRoles(), "testDeclareRoles1");
+		SecurityRole role2 = TestUtils.findSecurityRole(app.getSecurityRoles(), "testDeclareRoles1");
+		assertNotNull(role1);
+		assertNotNull(role2);
+		SecurityRoleRef role1Ref = TestUtils.findSecurityRoleRef(result.getSecurityRoleRefs(), "testDeclareRoles1");
+		assertNotNull(role1Ref);
+		SecurityRoleRef role2Ref = TestUtils.findSecurityRoleRef(result.getSecurityRoleRefs(), "testDeclareRoles1");
+		assertNotNull(role2Ref);
+
+		deleteFileAndUpdate(servletFile);
+		app = (WebApp) fixture.getModelObject();
+		assertNull(TestUtils.findServletByName(app, "testDeclareRoles"));
+		assertNull(TestUtils.findSecurityRole(app.getSecurityRoles(), "testDeclareRoles1"));
+		assertNull(TestUtils.findSecurityRole(app.getSecurityRoles(), "testDeclareRoles1"));
+	}
+
+	// @Tets
+	public void testDeclareRoleOnManyServlets() throws Exception {
+		final String servlet1Content = "package com.sap;"
+				+ "@DeclareRoles(value = {\"testDeclareRoleOnManyBeansRole\"}) "
+				+ "@WebServlet public class testDeclareRoleOnManyServlets1 implements SessionBeanLocal {}";
+		final String servlet2Content = "package com.sap;"
+				+ "@DeclareRoles(value = {\"testDeclareRoleOnManyBeansRole\"}) "
+				+ "@WebServlet public class testDeclareRoleOnManyServlets2 implements SessionBeanLocal {}";
+		IFile bean1File = facetedProject.getProject().getFile("src/com/sap/testDeclareRoleOnManyServlets1.java");
+		IFile bean2File = facetedProject.getProject().getFile("src/com/sap/testDeclareRoleOnManyServlets2.java");
+		saveFileAndUpdate(bean1File, servlet1Content);
+		saveFileAndUpdate(bean2File, servlet2Content);
+		WebApp app = (WebApp) fixture.getModelObject();
+		Servlet result = TestUtils.findServletByName(app, "testDeclareRoleOnManyServlets1");
+		SecurityRole role1 = TestUtils.findSecurityRole(app.getSecurityRoles(), "testDeclareRoleOnManyBeansRole");
+		assertNotNull(role1);
+		SecurityRoleRef role1Ref = TestUtils.findSecurityRoleRef(result.getSecurityRoleRefs(),
+				"testDeclareRoleOnManyBeansRole");
+		assertNotNull(role1Ref);
+
+		deleteFileAndUpdate(bean1File);
+		assertNotNull(TestUtils.findSecurityRole(app.getSecurityRoles(), "testDeclareRoleOnManyBeansRole"));
+		deleteFileAndUpdate(bean2File);
+		assertNull(TestUtils.findSecurityRole(app.getSecurityRoles(), "testDeclareRoleOnManyBeansRole"));
+	}
+
+	// @Tets
+	public void testRunAs() throws Exception {
+		final String servletContent = "package com.sap;"
+				+ "@DeclareRoles(value = {\"testRunAsRole\"}) @RunAs(value = \"testRunAsRole\") "
+				+ "@WebServlet public class testRunAs{}";
+
+		IFile servletFile = facetedProject.getProject().getFile("src/com/sap/testRunAs.java");
+		saveFileAndUpdate(servletFile, servletContent);
+		WebApp app = (WebApp) fixture.getModelObject();
+		Servlet result = TestUtils.findServletByName(app, "testRunAs");
+		SecurityRole role1 = TestUtils.findSecurityRole(app.getSecurityRoles(), "testRunAsRole");
+		assertNotNull(role1);
+		SecurityRoleRef role1Ref = TestUtils.findSecurityRoleRef(result.getSecurityRoleRefs(), "testRunAsRole");
+		assertNotNull(role1Ref);
+		RunAs runAs = (RunAs) result.getRunAs();
+		assertNotNull(runAs);
+		assertEquals("testRunAsRole", runAs.getRoleName());
+
+		deleteFileAndUpdate(servletFile);
+		assertNull(TestUtils.findSecurityRole(((WebApp) fixture.getModelObject()).getSecurityRoles(), "testRunAsRole"));
+	}
+
+	// @Tets
+	public void testAddEjbRefToServlet() throws Exception {
+		final String content1 = "package com.sap;" + "import javax.annotation.Resource;import javax.ejb.EJB;"
+				+ "import javax.servlet.http.HttpServlet;"
+				+ "@WebServlet public class testAddEjbRefToServlet extends HttpServlet {"
+				+ "private static final long serialVersionUID = 1L;}";
+		final String content2 = "package com.sap;" + "import javax.annotation.Resource;import javax.ejb.EJB;"
+				+ "import javax.servlet.http.HttpServlet;"
+				+ "@WebServlet public class testAddEjbRefToServlet extends HttpServlet {"
+				+ "private static final long serialVersionUID = 1L;"
+				+ "@EJB private Comparable comp; @EJB public void setComparable(Comparable comp){};}";
+		IFile file = facetedProject.getProject().getFile("src/com/sap/testAddEjbRefToServlet.java");
+		saveFileAndUpdate(file, content1);
+		WebApp app = (WebApp) fixture.getModelObject();
+		assertEquals(new Integer(6), new Integer(app.getEjbLocalRefs().size()));
+
+		saveFileAndUpdate(file, content2);
+		app = (WebApp) fixture.getModelObject();
+		assertEquals(new Integer(8), new Integer(app.getEjbLocalRefs().size()));
+
+		deleteFileAndUpdate(file);
+		app = (WebApp) fixture.getModelObject();
+		assertEquals(new Integer(6), new Integer(app.getEjbLocalRefs().size()));
+	}
+
+	private static void addServlet(WebApp app, String servletName, String servletClass) {
+		Servlet servlet = WebFactory.eINSTANCE.createServlet();
+		servlet.setServletName(servletName);
+		servlet.setServletClass(servletClass);
+		app.getServlets().add(servlet);
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/web/tests/WebAnnotationReaderTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/web/tests/WebAnnotationReaderTest.java
new file mode 100644
index 0000000..63738b0
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/jee/model/web/tests/WebAnnotationReaderTest.java
@@ -0,0 +1,440 @@
+/***********************************************************************
+ * Copyright (c) 2008 by SAP AG, Walldorf. 
+ * 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:
+ *     SAP AG - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jst.jee.model.web.tests;
+
+import junit.framework.TestSuite;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IPackageFragment;
+import org.eclipse.jdt.core.IPackageFragmentRoot;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jst.javaee.core.JavaeeFactory;
+import org.eclipse.jst.javaee.core.Listener;
+import org.eclipse.jst.javaee.core.RunAs;
+import org.eclipse.jst.javaee.core.SecurityRole;
+import org.eclipse.jst.javaee.core.SecurityRoleRef;
+import org.eclipse.jst.javaee.web.Filter;
+import org.eclipse.jst.javaee.web.Servlet;
+import org.eclipse.jst.javaee.web.WebApp;
+import org.eclipse.jst.javaee.web.WebFactory;
+import org.eclipse.jst.jee.model.internal.WebAnnotationReader;
+import org.eclipse.jst.jee.model.tests.AbstractAnnotationModelTest;
+import org.eclipse.jst.jee.model.tests.AbstractTest;
+import org.eclipse.jst.jee.model.tests.TestUtils;
+import org.eclipse.wst.common.project.facet.core.IFacetedProject;
+
+/**
+ * @author Kiril Mitov k.mitov@sap.com
+ * 
+ */
+public class WebAnnotationReaderTest extends AbstractAnnotationModelTest {
+
+	private static String BEAN_WITH_NAME = "package com.sap;" + "import javax.ejb.Stateless;"
+			+ "@Stateless(name=\"%s\") public class BeanWithName implements SessionBeanLocal {}";
+
+	public static TestSuite suite() throws Exception {
+		TestSuite suite = new TestSuite(WebAnnotationReaderTest.class);
+		return suite;
+	}
+
+	// @BeforeClass
+	public static void setUpProject() throws Exception {
+		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(WebAnnotationReaderTest.class.getSimpleName());
+		if (!project.exists())
+		{
+			IFacetedProject facetedProject = AbstractTest.createWebProject(WebAnnotationReaderTest.class.getSimpleName());
+			createProjectContent(facetedProject.getProject());
+		}
+	}
+
+	// @AfterClass
+	public static void tearDownAfterClass() throws InterruptedException {
+		AbstractTest.deleteProject(WebAnnotationReaderTest.class.getSimpleName());
+	}
+
+	private static void createProjectContent(IProject project) throws Exception {
+		IJavaProject javaProject = JavaCore.create(project);
+		IFolder comFolder = javaProject.getProject().getFolder("src/com");
+		comFolder.create(true, true, new NullProgressMonitor());
+		IPackageFragmentRoot root = javaProject.getPackageFragmentRoot(comFolder);
+		IPackageFragment fragment = root.createPackageFragment("sap", true, new NullProgressMonitor());
+		createServlet(fragment);
+		createServletWithSecurity(fragment);
+	}
+
+	private static void createServlet(IPackageFragment fragment) throws Exception {
+		final String content = "package com.sap;" + "import javax.annotation.Resource;import javax.ejb.EJB;"
+				+ "import javax.servlet.http.HttpServlet;" + "public class Servlet1 extends HttpServlet {"
+				+ "private static final long serialVersionUID = 1L;"
+				+ "@EJB private Comparable comp; @EJB public void setComparable(Comparable comp){};"
+				+ "@Resource private Comparable comp2; @Resource public void setComparable2(Comparable comp){} }";
+		IFile file = ((IContainer) fragment.getResource()).getFile(new Path("Servlet1.java"));
+		AbstractTest.saveFile(file, content);
+	}
+
+	private static void createServletWithSecurity(IPackageFragment fragment) throws Exception {
+		final String servletContent = "package com.sap;"
+				+ "import javax.servlet.http.HttpServlet;"
+				+ "@DeclareRoles(value = {\"role1\", \"role2\"})  public class ServletWithSecurity extends HttpServlet {}";
+		IFile file = ((IContainer) fragment.getResource()).getFile(new Path("ServletWithSecurity.java"));
+		AbstractTest.saveFile(file, servletContent);
+	}
+
+	private WebApp ddApp;
+
+	// @Before
+	@Override
+	protected void setUp() throws Exception {
+		setUpProject();
+		super.setUp();
+		ddApp = WebFactory.eINSTANCE.createWebApp();
+		addServlet(ddApp, "ServletWithSecurity", "com.sap.ServletWithSecurity");
+		addServlet(ddApp, "Servlet1", "com.sap.Servlet1");
+		fixture = new WebAnnotationReader(facetedProject, ddApp);
+	}
+
+	// @After
+	@Override
+	protected void tearDown() throws Exception {
+		((WebAnnotationReader) fixture).dispose();
+	}
+
+	// @Test(expected = IllegalArgumentException.class)
+	public void testCerateReaderWithNullProject() {
+		try {
+			new WebAnnotationReader(null, ddApp);
+		} catch (IllegalArgumentException e) {
+
+		}
+
+	}
+
+	// //@Test
+	public void testServletEjbRef() {
+		WebApp app = (WebApp) fixture.getModelObject();
+		assertNotNull(app);
+		assertEquals(new Integer(2), new Integer(app.getEjbLocalRefs().size()));
+	}
+
+	// @Test
+	public void testServletResourceRef() {
+		WebApp app = (WebApp) fixture.getModelObject();
+		assertNotNull(app);
+		assertEquals(new Integer(2), new Integer(app.getResourceRefs().size()));
+	}
+
+	// @Test
+	public void testSecurityRoles() {
+		WebApp app = (WebApp) fixture.getModelObject();
+		assertNotNull(app);
+		assertEquals(new Integer(2), new Integer(app.getSecurityRoles().size()));
+	}
+
+	// @Tets
+	public void testAddDeleteEjbRef() throws Exception {
+		final String content = "package com.sap;" + "import javax.annotation.Resource;import javax.ejb.EJB;"
+				+ "import javax.servlet.http.HttpServlet;" + "public class testAddDeleteEjbRef extends HttpServlet {"
+				+ "private static final long serialVersionUID = 1L;"
+				+ "@EJB private Comparable comp; @EJB public void setComparable(Comparable comp){};}";
+		addServlet(ddApp, "testAddDeleteEjbRef", "com.sap.testAddDeleteEjbRef");
+		IFile file = facetedProject.getProject().getFile("src/com/sap/testAddDeleteEjbRef.java");
+		saveFileAndUpdate(file, content);
+
+		WebApp result = (WebApp) fixture.getModelObject();
+		assertEquals(new Integer(4), new Integer(result.getEjbLocalRefs().size()));
+
+		deleteFileAndUpdate(file);
+		result = (WebApp) fixture.getModelObject();
+		assertEquals(new Integer(2), new Integer(result.getEjbLocalRefs().size()));
+	}
+
+	/**
+	 * The servlet is not described in the web.xml. It is not in the deployment
+	 * descriptor model.
+	 * 
+	 * @throws Exception
+	 */
+	// @Tets
+	public void testNotAServletAddDeleteEjbRef() throws Exception {
+		final String content = "package com.sap;" + "import javax.annotation.Resource;import javax.ejb.EJB;"
+				+ "import javax.servlet.http.HttpServlet;"
+				+ "public class testNotAServletAddDeleteEjbRef extends HttpServlet {"
+				+ "private static final long serialVersionUID = 1L;"
+				+ "@EJB private Comparable comp; @EJB public void setComparable(Comparable comp){};}";
+		IFile file = facetedProject.getProject().getFile("src/com/sap/testNotAServletAddDeleteEjbRef.java");
+		AbstractTest.saveFile(file, content);
+
+		WebApp result = (WebApp) fixture.getModelObject();
+		assertEquals(new Integer(2), new Integer(result.getEjbLocalRefs().size()));
+
+		AbstractTest.deleteFile(file);
+		result = (WebApp) fixture.getModelObject();
+		assertEquals(new Integer(2), new Integer(result.getEjbLocalRefs().size()));
+	}
+
+	// @Tets
+	public void testAddDeleteResourceRef() throws Exception {
+		final String content = "package com.sap;" + "import javax.annotation.Resource;import javax.ejb.EJB;"
+				+ "import javax.servlet.http.HttpServlet;"
+				+ "public class testAddDeleteResourceRef extends HttpServlet {"
+				+ "private static final long serialVersionUID = 1L;"
+				+ "@Resource private Comparable comp2; @Resource public void setComparable2(Comparable comp){} }";
+		addServlet(ddApp, "testAddDeleteResourceRef", "com.sap.testAddDeleteResourceRef");
+		IFile file = facetedProject.getProject().getFile("src/com/sap/testAddDeleteResourceRef.java");
+		saveFileAndUpdate(file, content);
+
+		WebApp result = (WebApp) fixture.getModelObject();
+		assertEquals(new Integer(4), new Integer(result.getResourceRefs().size()));
+		deleteFileAndUpdate(file);
+
+		result = (WebApp) fixture.getModelObject();
+		assertEquals(new Integer(2), new Integer(result.getResourceRefs().size()));
+	}
+
+	// @Tets
+	public void testListener() throws Exception {
+		final String content = "package com.sap;" + "import javax.annotation.Resource;import javax.ejb.EJB;"
+				+ "public class testListener {"
+				+ "@EJB private Comparable comp; @EJB public void setComparable(Comparable comp){};"
+				+ "@Resource private Comparable comp2; @Resource public void setComparable2(Comparable comp){} }";
+		addListener(ddApp, "com.sap.testListener");
+		IFile file = facetedProject.getProject().getFile("src/com/sap/testListener.java");
+		saveFileAndUpdate(file, content);
+
+		WebApp result = (WebApp) fixture.getModelObject();
+		assertEquals(new Integer(4), new Integer(result.getResourceRefs().size()));
+		assertEquals(new Integer(4), new Integer(result.getEjbLocalRefs().size()));
+
+		deleteFileAndUpdate(file);
+		result = (WebApp) fixture.getModelObject();
+		assertEquals(new Integer(2), new Integer(result.getResourceRefs().size()));
+		assertEquals(new Integer(2), new Integer(result.getEjbLocalRefs().size()));
+	}
+
+	// @Tets
+	public void testFilter() throws Exception {
+		final String content = "package com.sap;" + "import javax.annotation.Resource;import javax.ejb.EJB;"
+				+ "public class testFilter {"
+				+ "@EJB private Comparable comp; @EJB public void setComparable(Comparable comp){};"
+				+ "@Resource private Comparable comp2; @Resource public void setComparable2(Comparable comp){} }";
+		addFilter(ddApp, "com.sap.testFilter");
+		IFile file = facetedProject.getProject().getFile("src/com/sap/testFilter.java");
+		saveFileAndUpdate(file, content);
+
+		WebApp result = (WebApp) fixture.getModelObject();
+		assertEquals(new Integer(4), new Integer(result.getResourceRefs().size()));
+		assertEquals(new Integer(4), new Integer(result.getEjbLocalRefs().size()));
+
+		deleteFileAndUpdate(file);
+		result = (WebApp) fixture.getModelObject();
+		assertEquals(new Integer(2), new Integer(result.getResourceRefs().size()));
+		assertEquals(new Integer(2), new Integer(result.getEjbLocalRefs().size()));
+
+	}
+
+	// @Tets
+	public void testResourcesServlet() throws Exception {
+		final String content = "package com.sap;"
+				+ "import javax.annotation.Resource;import javax.ejb.EJB;"
+				+ "@Resources(value = {"
+				+ "@Resource(name = \"withNotDefaults\", mappedName = \"mappedName\", "
+				+ "	shareable = false, type = java.lang.Comparable.class, "
+				+ "	authenticationType = AuthenticationType.APPLICATION, description = \"description\"),"
+				+ "@Resource(name = \"withDefaults\", type = java.lang.Comparable.class), @Resource(name = \"invalidNoType\") })"
+				+ "public class testResourcesServlet {}";
+		addServlet(ddApp, "testResourcesServlet", "com.sap.testResourcesServlet");
+		IFile file = facetedProject.getProject().getFile("src/com/sap/testResourcesServlet.java");
+		saveFileAndUpdate(file, content);
+
+		WebApp result = (WebApp) fixture.getModelObject();
+		assertEquals(new Integer(4), new Integer(result.getResourceRefs().size()));
+
+		deleteFileAndUpdate(file);
+		result = (WebApp) fixture.getModelObject();
+		assertEquals(new Integer(2), new Integer(result.getResourceRefs().size()));
+	}
+
+	// @Tets
+	public void testResourcesFilter() throws Exception {
+		final String content = "package com.sap;"
+				+ "import javax.annotation.Resource;import javax.ejb.EJB;"
+				+ "@Resources(value = {"
+				+ "@Resource(name = \"withNotDefaults\", mappedName = \"mappedName\", "
+				+ "	shareable = false, type = java.lang.Comparable.class, "
+				+ "	authenticationType = AuthenticationType.APPLICATION, description = \"description\"),"
+				+ "@Resource(name = \"withDefaults\", type = java.lang.Comparable.class), @Resource(name = \"invalidNoType\") })"
+				+ "public class testResourcesFilter {}";
+		addFilter(ddApp, "com.sap.testResourcesFilter");
+		IFile file = facetedProject.getProject().getFile("src/com/sap/testResourcesFilter.java");
+		saveFileAndUpdate(file, content);
+
+		WebApp result = (WebApp) fixture.getModelObject();
+		assertEquals(new Integer(4), new Integer(result.getResourceRefs().size()));
+
+		deleteFileAndUpdate(file);
+		result = (WebApp) fixture.getModelObject();
+		assertEquals(new Integer(2), new Integer(result.getResourceRefs().size()));
+	}
+
+	// @Tets
+	public void testResourcesOnListener() throws Exception {
+		final String content = "package com.sap;"
+				+ "import javax.annotation.Resource;import javax.ejb.EJB;"
+				+ "@Resources(value = {"
+				+ "@Resource(name = \"withNotDefaults\", mappedName = \"mappedName\", "
+				+ "	shareable = false, type = java.lang.Comparable.class, "
+				+ "	authenticationType = AuthenticationType.APPLICATION, description = \"description\"),"
+				+ "@Resource(name = \"withDefaults\", type = java.lang.Comparable.class), @Resource(name = \"invalidNoType\") })"
+				+ "public class testResourcesOnListener {}";
+		addServlet(ddApp, "testResourcesOnListener", "com.sap.testResourcesOnListener");
+		IFile file = facetedProject.getProject().getFile("src/com/sap/testResourcesOnListener.java");
+		saveFileAndUpdate(file, content);
+
+		WebApp result = (WebApp) fixture.getModelObject();
+		assertEquals(new Integer(4), new Integer(result.getResourceRefs().size()));
+
+		deleteFileAndUpdate(file);
+		result = (WebApp) fixture.getModelObject();
+		assertEquals(new Integer(2), new Integer(result.getResourceRefs().size()));
+	}
+
+	// @Tets
+	public void testDeclareRoles() throws Exception {
+		final String beanContent = "package com.sap;"
+				+ "@DeclareRoles(value = {\"testDeclareRoles1\", \"testDeclareRoles1\"}) "
+				+ "public class testDeclareRoles extends HttpServlet {}";
+		addServlet(ddApp, "testDeclareRoles", "com.sap.testDeclareRoles");
+		IFile servletFile = facetedProject.getProject().getFile("src/com/sap/testDeclareRoles.java");
+		saveFileAndUpdate(servletFile, beanContent);
+
+		WebApp app = (WebApp) fixture.getModelObject();
+		Servlet result = TestUtils.findServletByName(app, "testDeclareRoles");
+		assertNotNull(result);
+		SecurityRole role1 = TestUtils.findSecurityRole(app.getSecurityRoles(), "testDeclareRoles1");
+		SecurityRole role2 = TestUtils.findSecurityRole(app.getSecurityRoles(), "testDeclareRoles1");
+		assertNotNull(role1);
+		assertNotNull(role2);
+		SecurityRoleRef role1Ref = TestUtils.findSecurityRoleRef(result.getSecurityRoleRefs(), "testDeclareRoles1");
+		assertNotNull(role1Ref);
+		SecurityRoleRef role2Ref = TestUtils.findSecurityRoleRef(result.getSecurityRoleRefs(), "testDeclareRoles1");
+		assertNotNull(role2Ref);
+
+		deleteFileAndUpdate(servletFile);
+		app = (WebApp) fixture.getModelObject();
+		assertNull(TestUtils.findServletByName(app, "testDeclareRoles"));
+		assertNull(TestUtils.findSecurityRole(app.getSecurityRoles(), "testDeclareRoles1"));
+		assertNull(TestUtils.findSecurityRole(app.getSecurityRoles(), "testDeclareRoles1"));
+	}
+
+	// @Tets
+	public void testDeclareRoleOnManyServlets() throws Exception {
+		final String servlet1Content = "package com.sap;"
+				+ "@DeclareRoles(value = {\"testDeclareRoleOnManyBeansRole\"}) "
+				+ "public class testDeclareRoleOnManyServlets1 implements SessionBeanLocal {}";
+		final String servlet2Content = "package com.sap;"
+				+ "@DeclareRoles(value = {\"testDeclareRoleOnManyBeansRole\"}) "
+				+ "public class testDeclareRoleOnManyServlets2 implements SessionBeanLocal {}";
+		addServlet(ddApp, "testDeclareRoleOnManyServlets1", "com.sap.testDeclareRoleOnManyServlets1");
+		addServlet(ddApp, "testDeclareRoleOnManyServlets2", "com.sap.testDeclareRoleOnManyServlets2");
+		IFile bean1File = facetedProject.getProject().getFile("src/com/sap/testDeclareRoleOnManyServlets1.java");
+		IFile bean2File = facetedProject.getProject().getFile("src/com/sap/testDeclareRoleOnManyServlets2.java");
+		saveFileAndUpdate(bean1File, servlet1Content);
+		saveFileAndUpdate(bean2File, servlet2Content);
+		WebApp app = (WebApp) fixture.getModelObject();
+		Servlet result = TestUtils.findServletByName(app, "testDeclareRoleOnManyServlets1");
+		SecurityRole role1 = TestUtils.findSecurityRole(app.getSecurityRoles(), "testDeclareRoleOnManyBeansRole");
+		assertNotNull(role1);
+		SecurityRoleRef role1Ref = TestUtils.findSecurityRoleRef(result.getSecurityRoleRefs(),
+				"testDeclareRoleOnManyBeansRole");
+		assertNotNull(role1Ref);
+
+		deleteFileAndUpdate(bean1File);
+		assertNotNull(TestUtils.findSecurityRole(app.getSecurityRoles(), "testDeclareRoleOnManyBeansRole"));
+		deleteFileAndUpdate(bean2File);
+		assertNull(TestUtils.findSecurityRole(app.getSecurityRoles(), "testDeclareRoleOnManyBeansRole"));
+	}
+
+	// @Tets
+	public void testRunAs() throws Exception {
+		final String servletContent = "package com.sap;"
+				+ "@DeclareRoles(value = {\"testRunAsRole\"}) @RunAs(value = \"testRunAsRole\") "
+				+ "public class testRunAs{}";
+		addServlet(ddApp, "testRunAs", "com.sap.testRunAs");
+
+		IFile servletFile = facetedProject.getProject().getFile("src/com/sap/testRunAs.java");
+		saveFileAndUpdate(servletFile, servletContent);
+		WebApp app = (WebApp) fixture.getModelObject();
+		Servlet result = TestUtils.findServletByName(app, "testRunAs");
+		SecurityRole role1 = TestUtils.findSecurityRole(app.getSecurityRoles(), "testRunAsRole");
+		assertNotNull(role1);
+		SecurityRoleRef role1Ref = TestUtils.findSecurityRoleRef(result.getSecurityRoleRefs(), "testRunAsRole");
+		assertNotNull(role1Ref);
+		RunAs runAs = (RunAs) result.getRunAs();
+		assertNotNull(runAs);
+		assertEquals("testRunAsRole", runAs.getRoleName());
+
+		deleteFileAndUpdate(servletFile);
+		assertNull(TestUtils.findSecurityRole(((WebApp) fixture.getModelObject()).getSecurityRoles(), "testRunAsRole"));
+	}
+
+	// @Tets
+	public void testAddEjbRefToServlet() throws Exception {
+		final String content1 = "package com.sap;" + "import javax.annotation.Resource;import javax.ejb.EJB;"
+				+ "import javax.servlet.http.HttpServlet;"
+				+ "public class testAddEjbRefToServlet extends HttpServlet {"
+				+ "private static final long serialVersionUID = 1L;}";
+		final String content2 = "package com.sap;" + "import javax.annotation.Resource;import javax.ejb.EJB;"
+				+ "import javax.servlet.http.HttpServlet;"
+				+ "public class testAddEjbRefToServlet extends HttpServlet {"
+				+ "private static final long serialVersionUID = 1L;"
+				+ "@EJB private Comparable comp; @EJB public void setComparable(Comparable comp){};}";
+		addServlet(ddApp, "testAddEjbRefToServlet", "com.sap.testAddEjbRefToServlet");
+		IFile file = facetedProject.getProject().getFile("src/com/sap/testAddEjbRefToServlet.java");
+		saveFileAndUpdate(file, content1);
+		WebApp app = (WebApp) fixture.getModelObject();
+		assertEquals(new Integer(2), new Integer(app.getEjbLocalRefs().size()));
+
+		saveFileAndUpdate(file, content2);
+		app = (WebApp) fixture.getModelObject();
+		assertEquals(new Integer(4), new Integer(app.getEjbLocalRefs().size()));
+
+		deleteFileAndUpdate(file);
+		app = (WebApp) fixture.getModelObject();
+		assertEquals(new Integer(2), new Integer(app.getEjbLocalRefs().size()));
+	}
+
+	private static void addListener(WebApp app, String listenerClass) {
+		Listener listener = JavaeeFactory.eINSTANCE.createListener();
+		listener.setListenerClass(listenerClass);
+		app.getListeners().add(listener);
+	}
+
+	private static void addServlet(WebApp app, String servletName, String servletClass) {
+		Servlet servlet = WebFactory.eINSTANCE.createServlet();
+		servlet.setServletName(servletName);
+		servlet.setServletClass(servletClass);
+		app.getServlets().add(servlet);
+	}
+
+	private static void addFilter(WebApp app, String filterClass) {
+		Filter filter = WebFactory.eINSTANCE.createFilter();
+		filter.setFilterClass(filterClass);
+		app.getFilters().add(filter);
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/appclient/operations/AllTests.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/appclient/operations/AllTests.java
new file mode 100644
index 0000000..7a288b0
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/appclient/operations/AllTests.java
@@ -0,0 +1,30 @@
+/*
+ * Created on Feb 2, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package org.eclipse.wtp.j2ee.headless.tests.appclient.operations;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+
+/**
+ * @author jsholl
+ *
+ * To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+public class AllTests extends TestSuite {
+    public static Test suite(){
+        return new AllTests();
+    }
+    
+    public AllTests(){
+        super("Application Client Operation Tests");
+        addTest(AppClientExportOperationTest.suite());
+        addTest(AppClientImportOperationTest.suite());
+        addTest(AppClientProjectCreationOperationTest.suite());
+    }
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/appclient/operations/AppClientExportOperationTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/appclient/operations/AppClientExportOperationTest.java
new file mode 100644
index 0000000..23049ed
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/appclient/operations/AppClientExportOperationTest.java
@@ -0,0 +1,324 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ * Created on Jan 6, 2004
+ * 
+ * To change the template for this generated file go to Window - Preferences - Java - Code
+ * Generation - Code and Comments
+ */
+package org.eclipse.wtp.j2ee.headless.tests.appclient.operations;
+
+import junit.framework.Test;
+
+import org.eclipse.jst.j2ee.application.internal.operations.AppClientComponentExportDataModelProvider;
+import org.eclipse.jst.j2ee.datamodel.properties.IJ2EEComponentExportDataModelProperties;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.tests.OperationTestCase;
+import org.eclipse.wst.common.tests.SimpleTestSuite;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.JavaEEFacetConstants;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.JavaFileTestingUtilities;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleExportOperationTest;
+
+/**
+ * @author Administrator
+ * @author Ian Tewksbury (ictewksb@us.ibm.com)
+ * 
+ * To change the template for this generated type comment go to Window - Preferences - Java - Code
+ * Generation - Code and Comments
+ */
+public class AppClientExportOperationTest extends ModuleExportOperationTest {
+
+	
+	public AppClientExportOperationTest() {
+		super("AppClientExportOperationTests");
+	}
+	
+	public AppClientExportOperationTest(String name) {
+		super(name);
+	}
+	
+	public static Test suite() {
+		return new SimpleTestSuite(AppClientExportOperationTest.class);
+	}
+	
+    public void testACExport12_Defaults() throws Exception{
+    	IDataModel dm = AppClientProjectCreationOperationTest.getAppClientCreationDataModel("randomApp", null, JavaEEFacetConstants.APP_CLIENT_12, true, true);
+    	OperationTestCase.runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    public void testACExport13_Defaults() throws Exception {
+    	IDataModel dm = AppClientProjectCreationOperationTest.getAppClientCreationDataModel("coolApp", null, JavaEEFacetConstants.APP_CLIENT_13, true, true);
+    	OperationTestCase.runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    public void testACExport14_Defaults() throws Exception {
+    	IDataModel dm = AppClientProjectCreationOperationTest.getAppClientCreationDataModel("awesomeApp", null, JavaEEFacetConstants.APP_CLIENT_14, true, true);
+    	OperationTestCase.runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    public void testACExport50_Defaults() throws Exception {
+    	IDataModel dm = AppClientProjectCreationOperationTest.getAppClientCreationDataModel("amazingApp", null, JavaEEFacetConstants.APP_CLIENT_5, true, false);
+    	OperationTestCase.runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    public void testACExport60_Defaults() throws Exception {
+    	IDataModel dm = AppClientProjectCreationOperationTest.getAppClientCreationDataModel("jazzyApp", null, JavaEEFacetConstants.APP_CLIENT_6, true, false);
+    	OperationTestCase.runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+
+    public void testACExport12_NoDefaultClass() throws Exception{
+    	IDataModel dm = AppClientProjectCreationOperationTest.getAppClientCreationDataModel("randomApp", null, JavaEEFacetConstants.APP_CLIENT_12, false, true);
+    	OperationTestCase.runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    public void testACExport13_NoDefaultClass() throws Exception {
+    	IDataModel dm = AppClientProjectCreationOperationTest.getAppClientCreationDataModel("coolApp", null, JavaEEFacetConstants.APP_CLIENT_13, false, true);
+    	OperationTestCase.runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    public void testACExport14_NoDefaultClass() throws Exception {
+    	IDataModel dm = AppClientProjectCreationOperationTest.getAppClientCreationDataModel("awesomeApp", null, JavaEEFacetConstants.APP_CLIENT_14, false, true);
+    	OperationTestCase.runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    public void testACExport50_NoDefaultClass() throws Exception {
+    	IDataModel dm = AppClientProjectCreationOperationTest.getAppClientCreationDataModel("amazingApp", null, JavaEEFacetConstants.APP_CLIENT_5, false, false);
+    	OperationTestCase.runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+
+    public void testACExport60_NoDefaultClass() throws Exception {
+    	IDataModel dm = AppClientProjectCreationOperationTest.getAppClientCreationDataModel("jazzyApp", null, JavaEEFacetConstants.APP_CLIENT_6, false, false);
+    	OperationTestCase.runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+
+    
+    public void testACExport12_AddToEAR() throws Exception {
+    	IDataModel dm = AppClientProjectCreationOperationTest.getAppClientCreationDataModel("fooAppToEar", "someEar", JavaEEFacetConstants.APP_CLIENT_12, true, true);
+    	OperationTestCase.runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    public void testACExport13_AddToEAR() throws Exception {
+    	IDataModel dm = AppClientProjectCreationOperationTest.getAppClientCreationDataModel("fooAppToEar", "coolEar", JavaEEFacetConstants.APP_CLIENT_13, true, true);
+    	OperationTestCase.runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    public void testACExport14_AddToEAR() throws Exception {
+    	IDataModel dm = AppClientProjectCreationOperationTest.getAppClientCreationDataModel("fooAppToEar", "sweetEar", JavaEEFacetConstants.APP_CLIENT_14, true, true);
+    	OperationTestCase.runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    public void testACExport50_AddToEAR() throws Exception {
+    	IDataModel dm = AppClientProjectCreationOperationTest.getAppClientCreationDataModel("fooAppToEar", "netoEar", JavaEEFacetConstants.APP_CLIENT_5, true, false);
+    	OperationTestCase.runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    public void testACExport60_AddToEAR() throws Exception {
+    	IDataModel dm = AppClientProjectCreationOperationTest.getAppClientCreationDataModel("fooAppToEar", "jelloEar", JavaEEFacetConstants.APP_CLIENT_6, true, false);
+    	OperationTestCase.runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+
+    public void testACExport12_InterestingName() throws Exception{
+    	IDataModel dm = AppClientProjectCreationOperationTest.getAppClientCreationDataModel("kd3(2k_djfD3", null, JavaEEFacetConstants.APP_CLIENT_12, true, true);
+    	OperationTestCase.runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    public void testACExport13_InterestingName() throws Exception{
+    	IDataModel dm = AppClientProjectCreationOperationTest.getAppClientCreationDataModel("a_dD3dj8)f7", null, JavaEEFacetConstants.APP_CLIENT_13, true, true);
+    	OperationTestCase.runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    public void testACExport14_InterestingName() throws Exception{
+    	IDataModel dm = AppClientProjectCreationOperationTest.getAppClientCreationDataModel("_Jid7dh)3a", null, JavaEEFacetConstants.APP_CLIENT_14, true, true);
+    	OperationTestCase.runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    public void testACExport50_InterestingName() throws Exception{
+    	IDataModel dm = AppClientProjectCreationOperationTest.getAppClientCreationDataModel("a_1B2c()3D4", null, JavaEEFacetConstants.APP_CLIENT_5, true, false);
+    	OperationTestCase.runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    public void testACExport60_InterestingName() throws Exception{
+    	IDataModel dm = AppClientProjectCreationOperationTest.getAppClientCreationDataModel("EE6_a_1B2c()3D4", null, JavaEEFacetConstants.APP_CLIENT_6, true, false);
+    	OperationTestCase.runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+
+    public void testACExport12_AddToEAR_InterestingName() throws Exception{
+    	IDataModel dm = AppClientProjectCreationOperationTest.getAppClientCreationDataModel("kd(32k_djfD)3", "hFdf(8G_Fij))3", JavaEEFacetConstants.APP_CLIENT_12, true, true);
+    	OperationTestCase.runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    public void testACExport13_AddToEAR_InterestingName() throws Exception{
+    	IDataModel dm = AppClientProjectCreationOperationTest.getAppClientCreationDataModel("adD__3dj8)df7", "(53_hdj(f8HD", JavaEEFacetConstants.APP_CLIENT_13, true, true);
+    	OperationTestCase.runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    public void testACExport14_AddToEAR_InterestingName() throws Exception{
+    	IDataModel dm = AppClientProjectCreationOperationTest.getAppClientCreationDataModel("J_id7((dh3a_", "d_3Dk)j(f8", JavaEEFacetConstants.APP_CLIENT_14, true, true);
+    	OperationTestCase.runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    public void testACExport50_AddToEAR_InterestingName() throws Exception{
+    	IDataModel dm = AppClientProjectCreationOperationTest.getAppClientCreationDataModel("a1B_2c)3D4", "4D_3c2)B1a", JavaEEFacetConstants.APP_CLIENT_5, true, false);
+    	OperationTestCase.runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+
+    public void testACExport60_AddToEAR_InterestingName() throws Exception{
+    	IDataModel dm = AppClientProjectCreationOperationTest.getAppClientCreationDataModel("EE6_a1B_2c)3D4", "EE6_4D_3c2)B1a", JavaEEFacetConstants.APP_CLIENT_6, true, false);
+    	OperationTestCase.runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    public void testACExport50_WithDD() throws Exception {
+    	IDataModel dm = AppClientProjectCreationOperationTest.getAppClientCreationDataModel("insaneApp", null, JavaEEFacetConstants.APP_CLIENT_5, true, true);
+    	OperationTestCase.runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    public void testACExport60_WithDD() throws Exception {
+    	IDataModel dm = AppClientProjectCreationOperationTest.getAppClientCreationDataModel("insaneApp6", null, JavaEEFacetConstants.APP_CLIENT_6, true, true);
+    	OperationTestCase.runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+
+    public void testACExport50_NoDefaultClass_WithDD() throws Exception {
+    	IDataModel dm = AppClientProjectCreationOperationTest.getAppClientCreationDataModel("insaneApp", null, JavaEEFacetConstants.APP_CLIENT_5, false, true);
+    	OperationTestCase.runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    public void testACExport60_NoDefaultClass_WithDD() throws Exception {
+    	IDataModel dm = AppClientProjectCreationOperationTest.getAppClientCreationDataModel("insaneApp6", null, JavaEEFacetConstants.APP_CLIENT_6, false, true);
+    	OperationTestCase.runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+
+    public void testACExport50_AddToEAR_WithDD() throws Exception {
+    	IDataModel dm = AppClientProjectCreationOperationTest.getAppClientCreationDataModel("appToEARwithDD", "bigEAR", JavaEEFacetConstants.APP_CLIENT_5, true, true);
+    	OperationTestCase.runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    public void testACExport60_AddToEAR_WithDD() throws Exception {
+    	IDataModel dm = AppClientProjectCreationOperationTest.getAppClientCreationDataModel("appToEARwithDD6", "bigEAR6", JavaEEFacetConstants.APP_CLIENT_6, true, true);
+    	OperationTestCase.runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+
+    public void testACExport50_AddToEAR_InterestingName_WithDD() throws Exception {
+    	IDataModel dm = AppClientProjectCreationOperationTest.getAppClientCreationDataModel("D875)_DFj", "7D_3cF2)BaQ", JavaEEFacetConstants.APP_CLIENT_5, true, true);
+    	OperationTestCase.runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    public void testACExport60_AddToEAR_InterestingName_WithDD() throws Exception {
+    	IDataModel dm = AppClientProjectCreationOperationTest.getAppClientCreationDataModel("EE6_D875)_DFj", "EE6_7D_3cF2)BaQ", JavaEEFacetConstants.APP_CLIENT_6, true, true);
+    	OperationTestCase.runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+
+    @Override
+    protected String getModuleExtension() {
+    	return ".jar";
+    }
+    
+	@Override
+	protected IDataModel getExportDataModel(String projectName, String destination, boolean exportSource, boolean runBuild, boolean overwriteExisting) {
+		return getAppClientExportDataModel(projectName, destination, exportSource, runBuild, overwriteExisting);
+	}
+    
+    /**
+     * @param projectName name of the project to export
+     * @param destination destination to export to
+     * @param exportSource if TRUE export source files, else don't
+     * @param runBuild if TRUE run a build before exporting, else don't
+     * @param overwriteExisting if TRUE overwrite existing files, else don't
+     * @return an AppClientComponentExport data model with all of the given settings.
+     */
+    public static IDataModel getAppClientExportDataModel(String projectName, String destination, boolean exportSource, boolean runBuild, boolean overwriteExisting){
+    	IDataModel exportModel = DataModelFactory.createDataModel(new AppClientComponentExportDataModelProvider());
+    	
+		exportModel.setProperty(IJ2EEComponentExportDataModelProperties.PROJECT_NAME, projectName);
+		exportModel.setProperty(IJ2EEComponentExportDataModelProperties.ARCHIVE_DESTINATION, destination);
+		exportModel.setProperty(IJ2EEComponentExportDataModelProperties.EXPORT_SOURCE_FILES, exportSource);
+		exportModel.setProperty(IJ2EEComponentExportDataModelProperties.OVERWRITE_EXISTING, overwriteExisting);
+		exportModel.setProperty(IJ2EEComponentExportDataModelProperties.RUN_BUILD, runBuild);
+		
+		return exportModel;
+    }
+    
+    @Override
+    protected void addJavaFilesToProject(String projectName, String[] classNames, String prackageName) throws Exception {
+    	JavaFileTestingUtilities.addJavaFilesToAppClient(projectName, classNames, prackageName);
+    }
+    
+    @Override
+    protected void verifyJavaFilesExported(String archiveName, String[] classNames, String packageName, boolean withClassFiles, boolean withSource) throws Exception {
+    	JavaFileTestingUtilities.verifyJavaFilesInJAR(archiveName, classNames, packageName, withClassFiles, withSource);
+    }
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/appclient/operations/AppClientImportOperationBaseTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/appclient/operations/AppClientImportOperationBaseTest.java
new file mode 100644
index 0000000..e960b22
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/appclient/operations/AppClientImportOperationBaseTest.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.wtp.j2ee.headless.tests.appclient.operations;
+
+import org.eclipse.jst.j2ee.applicationclient.internal.creation.AppClientComponentImportDataModelProvider;
+import org.eclipse.jst.j2ee.datamodel.properties.IJ2EEComponentImportDataModelProperties;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleImportOperationTest;
+
+public abstract class AppClientImportOperationBaseTest extends ModuleImportOperationTest{
+	
+
+	
+	public AppClientImportOperationBaseTest() {
+		super("AppClientImportOperationBaseTests");
+	}
+	
+	public AppClientImportOperationBaseTest(String name) {
+		super(name);
+	}
+	
+    @Override
+    protected String getModuleExtension() {
+    	return ".jar";
+    }
+	
+    @Override
+    protected IDataModel getImportDataModel(String filePath, String projectName, IDataModel creationModel, boolean closeArchiveOnDispose) {
+    	return getAppClientImportDataModel(filePath, projectName, creationModel, closeArchiveOnDispose);
+    }
+    
+    public static IDataModel getAppClientImportDataModel(String filePath, String projectName, IDataModel creationModel, boolean closeArchiveOnDispose) {
+    	IDataModel importModel = DataModelFactory.createDataModel(new AppClientComponentImportDataModelProvider());
+    	
+    	importModel.setProperty(IJ2EEComponentImportDataModelProperties.FILE_NAME, filePath);
+    	importModel.setProperty(IJ2EEComponentImportDataModelProperties.PROJECT_NAME, projectName);
+    	importModel.setProperty(IJ2EEComponentImportDataModelProperties.CLOSE_ARCHIVE_ON_DISPOSE, closeArchiveOnDispose);
+    	
+    	if(creationModel != null) {
+    		importModel.setProperty(IJ2EEComponentImportDataModelProperties.NESTED_MODEL_J2EE_COMPONENT_CREATION, creationModel);
+    	}
+    	
+    	return importModel;
+    }
+    
+    @Override
+    protected IDataModel getExportDataModel(String projectName, String destination, boolean exportSource, boolean runBuild, boolean overwriteExisting) {
+    	return AppClientExportOperationTest.getAppClientExportDataModel(projectName, destination, exportSource, runBuild, overwriteExisting);
+    }
+
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/appclient/operations/AppClientImportOperationTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/appclient/operations/AppClientImportOperationTest.java
new file mode 100644
index 0000000..23c0e59
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/appclient/operations/AppClientImportOperationTest.java
@@ -0,0 +1,109 @@
+/*
+ * Created on Jan 6, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package org.eclipse.wtp.j2ee.headless.tests.appclient.operations;
+
+import junit.framework.Test;
+
+import org.eclipse.wst.common.tests.SimpleTestSuite;
+
+/**
+ * @author Administrator
+ * @author Ian Tewksbury (ictewksb@us.ibm.com)
+ * 
+ * To change the template for this generated type comment go to Window - Preferences - Java - Code
+ * Generation - Code and Comments
+ */
+public class AppClientImportOperationTest extends AppClientImportOperationBaseTest {
+	
+	public AppClientImportOperationTest() {
+		super("AppClientImportOperationTests");
+	}
+	
+	public AppClientImportOperationTest(String name) {
+		super(name);
+	}
+	
+	public static Test suite() {
+		return new SimpleTestSuite(AppClientImportOperationTest.class);
+	}	
+	
+    public void testACImport12_Defaults() throws Exception{
+    	runImportTests_All("AC12_Defaults");
+    }
+    
+    public void testACImport13_Defaults() throws Exception {
+    	runImportTests_All("AC13_Defaults");
+    }
+    
+    public void testACImport14_Defaults() throws Exception {
+    	runImportTests_All("AC14_Defaults");
+    }
+    
+    public void testACImport12_NoDefaultClass() throws Exception{
+    	runImportTests_All("AC12_NoDefaultClass");
+    }
+    
+    public void testACImport13_NoDefaultClass() throws Exception {
+    	runImportTests_All("AC13_NoDefaultClass");
+    }
+    
+    public void testACImport14_NoDefaultClass() throws Exception {
+    	runImportTests_All("AC14_NoDefaultClass");
+    }
+  
+    public void testACImport12_AddToEAR() throws Exception {
+    	runImportTests_All("AC12_AddToEAR");
+    }
+    
+    public void testACImport13_AddToEAR() throws Exception {
+    	runImportTests_All("AC13_AddToEAR");
+    }
+    
+    public void testACImport14_AddToEAR() throws Exception {
+    	runImportTests_All("AC14_AddToEAR");
+    }
+        
+    public void testACImport12_InterestingName() throws Exception{
+    	runImportTests_All("AC12_InterestingName");
+    }
+    
+    public void testACImport13_InterestingName() throws Exception{
+    	runImportTests_All("AC13_InterestingName");
+    }
+    
+    public void testACImport14_InterestingName() throws Exception{
+    	runImportTests_All("AC14_InterestingName");
+    }
+    
+    public void testACImport12_AddToEAR_InterestingName() throws Exception{
+    	runImportTests_All("AC12_AddToEAR_InterestingName");
+    }
+    
+    public void testACImport13_AddToEAR_InterestingName() throws Exception{
+    	runImportTests_All("AC13_AddToEAR_InterestingName");
+    }
+    
+    public void testACImport14_AddToEAR_InterestingName() throws Exception{
+    	runImportTests_All("AC14_AddToEAR_InterestingName");
+    }
+        
+    public void testACImport50_WithDD() throws Exception {
+    	runImportTests_All("AC50_WithDD");
+    }
+
+    public void testACImport50_NoDefaultClass_WithDD() throws Exception {
+    	runImportTests_All("AC50_NoDefaultClass_WithDD");
+    }
+
+    public void testACImport50_AddToEAR_WithDD() throws Exception {
+    	runImportTests_All("AC50_AddToEAR_WithDD");
+    }
+
+    public void testACImport50_AddToEAR_InterestingName_WithDD() throws Exception {
+    	runImportTests_All("AC50_AddToEAR_InterestingName_WithDD");
+    }
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/appclient/operations/AppClientProjectCreationOperationTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/appclient/operations/AppClientProjectCreationOperationTest.java
new file mode 100644
index 0000000..2fc842d
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/appclient/operations/AppClientProjectCreationOperationTest.java
@@ -0,0 +1,266 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ * Created on Nov 6, 2003
+ *
+ * To change the template for this generated file go to
+ * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
+ */
+package org.eclipse.wtp.j2ee.headless.tests.appclient.operations;
+
+import junit.framework.Test;
+
+import org.eclipse.jst.j2ee.applicationclient.internal.creation.AppClientFacetProjectCreationDataModelProvider;
+import org.eclipse.jst.j2ee.project.facet.IAppClientFacetInstallDataModelProperties;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetConstants;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetInstallDataModelProperties;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetProjectCreationDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties.FacetDataModelMap;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
+import org.eclipse.wst.common.tests.OperationTestCase;
+import org.eclipse.wst.common.tests.SimpleTestSuite;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.JavaEEFacetConstants;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleProjectCreationOperationTest;
+
+/**
+ * @author jsholl
+ * @author Ian Tewksbury (ictewksb@us.ibm.com)
+ */
+public class AppClientProjectCreationOperationTest extends ModuleProjectCreationOperationTest {	
+	public AppClientProjectCreationOperationTest() {
+		super("AppClientProjectCreationOperationTests");
+	}
+	
+	public AppClientProjectCreationOperationTest(String name) {
+		super(name);
+	}
+	
+    public static Test suite() {
+    	return new SimpleTestSuite(AppClientProjectCreationOperationTest.class);
+    }
+ 
+    public void testAC12_Defaults() throws Exception{
+    	IDataModel dm = getAppClientCreationDataModel("randomApp", null, JavaEEFacetConstants.APP_CLIENT_12, true, true);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testAC13_Defaults() throws Exception {
+    	IDataModel dm = getAppClientCreationDataModel("coolApp", null, JavaEEFacetConstants.APP_CLIENT_13, true, true);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testAC14_Defaults() throws Exception {
+    	IDataModel dm = getAppClientCreationDataModel("awesomeApp", null, JavaEEFacetConstants.APP_CLIENT_14, true, true);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testAC50_Defaults() throws Exception {
+    	IDataModel dm = getAppClientCreationDataModel("amazingApp", null, JavaEEFacetConstants.APP_CLIENT_5, true, false);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testAC60_Defaults() throws Exception {
+    	IDataModel dm = getAppClientCreationDataModel("greatApp", null, JavaEEFacetConstants.APP_CLIENT_6, true, false);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    
+    public void testAC12_NoDefaultClass() throws Exception{
+    	IDataModel dm = getAppClientCreationDataModel("randomApp", null, JavaEEFacetConstants.APP_CLIENT_12, false, true);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testAC13_NoDefaultClass() throws Exception {
+    	IDataModel dm = getAppClientCreationDataModel("coolApp", null, JavaEEFacetConstants.APP_CLIENT_13, false, true);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testAC14_NoDefaultClass() throws Exception {
+    	IDataModel dm = getAppClientCreationDataModel("awesomeApp", null, JavaEEFacetConstants.APP_CLIENT_14, false, true);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testAC50_NoDefaultClass() throws Exception {
+    	IDataModel dm = getAppClientCreationDataModel("amazingApp", null, JavaEEFacetConstants.APP_CLIENT_5, false, false);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testAC60_NoDefaultClass() throws Exception {
+    	IDataModel dm = getAppClientCreationDataModel("greatApp", null, JavaEEFacetConstants.APP_CLIENT_6, false, false);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    
+    public void testAC12_AddToEAR() throws Exception {
+    	IDataModel dm = getAppClientCreationDataModel("fooAppToEar", "someEar", JavaEEFacetConstants.APP_CLIENT_12, true, true);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testAC13_AddToEAR() throws Exception {
+    	IDataModel dm = getAppClientCreationDataModel("fooAppToEar", "coolEar", JavaEEFacetConstants.APP_CLIENT_13, true, true);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testAC14_AddToEAR() throws Exception {
+    	IDataModel dm = getAppClientCreationDataModel("fooAppToEar", "sweetEar", JavaEEFacetConstants.APP_CLIENT_14, true, true);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testAC50_AddToEAR() throws Exception {
+    	IDataModel dm = getAppClientCreationDataModel("fooAppToEar", "netoEar", JavaEEFacetConstants.APP_CLIENT_5, true, false);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testAC60_AddToEAR() throws Exception {
+    	IDataModel dm = getAppClientCreationDataModel("fooAppToEar", "niceEar", JavaEEFacetConstants.APP_CLIENT_6, true, false);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    
+    public void testAC12_InterestingName() throws Exception{
+    	IDataModel dm = getAppClientCreationDataModel("kd3(2k_djfD3", null, JavaEEFacetConstants.APP_CLIENT_12, true, true);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testAC13_InterestingName() throws Exception{
+    	IDataModel dm = getAppClientCreationDataModel("a_dD3dj8)f7", null, JavaEEFacetConstants.APP_CLIENT_13, true, true);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testAC14_InterestingName() throws Exception{
+    	IDataModel dm = getAppClientCreationDataModel("_Jid7dh)3a", null, JavaEEFacetConstants.APP_CLIENT_14, true, true);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testAC50_InterestingName() throws Exception{
+    	IDataModel dm = getAppClientCreationDataModel("a_1B2c()3D4", null, JavaEEFacetConstants.APP_CLIENT_5, true, false);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testAC60_InterestingName() throws Exception{
+    	IDataModel dm = getAppClientCreationDataModel("ASDbt_23()Gfr2", null, JavaEEFacetConstants.APP_CLIENT_6, true, false);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    
+    public void testAC12_AddToEAR_InterestingName() throws Exception{
+    	IDataModel dm = getAppClientCreationDataModel("kd(32k_djfD)3", "hFdf(8G_Fij))3", JavaEEFacetConstants.APP_CLIENT_12, true, true);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testAC13_AddToEAR_InterestingName() throws Exception{
+    	IDataModel dm = getAppClientCreationDataModel("adD__3dj8)df7", "(53_hdj(f8HD", JavaEEFacetConstants.APP_CLIENT_13, true, true);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testAC14_AddToEAR_InterestingName() throws Exception{
+    	IDataModel dm = getAppClientCreationDataModel("J_id7((dh3a_", "d_3Dk)j(f8", JavaEEFacetConstants.APP_CLIENT_14, true, true);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testAC50_AddToEAR_InterestingName() throws Exception{
+    	IDataModel dm = getAppClientCreationDataModel("a1B_2c)3D4", "4D_3c2)B1a", JavaEEFacetConstants.APP_CLIENT_5, true, false);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testAC60_AddToEAR_InterestingName() throws Exception{
+    	IDataModel dm = getAppClientCreationDataModel("ASDbt_23()Gfr2", "23Sgsd)(_fg4", JavaEEFacetConstants.APP_CLIENT_6, true, false);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testAC50_WithDD() throws Exception {
+    	IDataModel dm = getAppClientCreationDataModel("insaneApp", null, JavaEEFacetConstants.APP_CLIENT_5, true, true);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testAC50_NoDefaultClass_WithDD() throws Exception {
+    	IDataModel dm = getAppClientCreationDataModel("insaneApp", null, JavaEEFacetConstants.APP_CLIENT_5, false, true);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testAC50_AddToEAR_WithDD() throws Exception {
+    	IDataModel dm = getAppClientCreationDataModel("appToEARwithDD", "bigEAR", JavaEEFacetConstants.APP_CLIENT_5, true, true);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testAC50_AddToEAR_InterestingName_WithDD() throws Exception {
+    	IDataModel dm = getAppClientCreationDataModel("D875)_DFj", "7D_3cF2)BaQ", JavaEEFacetConstants.APP_CLIENT_5, true, true);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testAC60_WithDD() throws Exception {
+    	IDataModel dm = getAppClientCreationDataModel("freshApp", null, JavaEEFacetConstants.APP_CLIENT_6, true, true);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testAC60_NoDefaultClass_WithDD() throws Exception {
+    	IDataModel dm = getAppClientCreationDataModel("freshApp", null, JavaEEFacetConstants.APP_CLIENT_6, false, true);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testAC60_AddToEAR_WithDD() throws Exception {
+    	IDataModel dm = getAppClientCreationDataModel("tryAddToEARWithDD", "tryEAR", JavaEEFacetConstants.APP_CLIENT_6, true, true);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testAC60_AddToEAR_InterestingName_WithDD() throws Exception {
+    	IDataModel dm = getAppClientCreationDataModel("4vG_s(70)", "RAS_b46j)(a)1", JavaEEFacetConstants.APP_CLIENT_6, true, true);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    /**
+     * Creates and returns an Application Client Data Model with the given name and of the given version.
+     * If earName is not null then AppClient will be added to the EAR with earName, and if appropriate
+     * with or without a deployment descriptor.
+     * 
+     * @param projName name of the project to create
+     * @param earName name of the ear to add the project too, if NULL then don't add to an EAR
+     * @param version version of Application Client to use
+     * @param createDefaultMainClass if true then create default main class, else don't
+     * @param createDD only used if version is JEE5, if true then create DD else don't
+     * @return an Application Data Model with the appropriate properties set
+     */
+    public static IDataModel getAppClientCreationDataModel(String projName, String earName, IProjectFacetVersion version, boolean createDefaultMainClass, boolean createDD){
+    	IDataModel dm = DataModelFactory.createDataModel(new AppClientFacetProjectCreationDataModelProvider());
+    	dm.setProperty(IFacetProjectCreationDataModelProperties.FACET_PROJECT_NAME, projName);
+    	
+    	if(earName != null) {
+        	dm.setProperty(IJ2EEFacetProjectCreationDataModelProperties.ADD_TO_EAR, true);
+        	dm.setProperty(IJ2EEFacetProjectCreationDataModelProperties.EAR_PROJECT_NAME, earName);
+    	} else {
+    		dm.setProperty(IJ2EEFacetProjectCreationDataModelProperties.ADD_TO_EAR, false);
+    	}
+    	
+    	FacetDataModelMap facetMap = (FacetDataModelMap) dm.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
+        IDataModel facetModel = facetMap.getFacetDataModel(IJ2EEFacetConstants.APPLICATION_CLIENT);
+        facetModel.setProperty(IFacetDataModelProperties.FACET_VERSION, version);
+        facetModel.setProperty(IAppClientFacetInstallDataModelProperties.CREATE_DEFAULT_MAIN_CLASS, createDefaultMainClass);
+        
+        
+        facetModel.setBooleanProperty(IJ2EEFacetInstallDataModelProperties.GENERATE_DD, createDD);
+        
+        if(version.equals(JavaEEFacetConstants.APP_CLIENT_6))
+    	{
+    		IDataModel javaFacetModel = facetMap.getFacetDataModel(IJ2EEFacetConstants.JAVA);
+	    	javaFacetModel.setProperty(IFacetDataModelProperties.FACET_VERSION, JavaEEFacetConstants.JAVA_6);
+    	}
+    	else{ 
+    		IDataModel javaFacetModel = facetMap.getFacetDataModel(IJ2EEFacetConstants.JAVA);
+    		javaFacetModel.setProperty(IFacetDataModelProperties.FACET_VERSION, JavaEEFacetConstants.JAVA_5);
+    	}
+        
+    	return dm;
+    }
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/ear/operations/AllTests.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/ear/operations/AllTests.java
new file mode 100644
index 0000000..53540e1
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/ear/operations/AllTests.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ * Created on Feb 2, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package org.eclipse.wtp.j2ee.headless.tests.ear.operations;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * @author jsholl
+ *
+ * To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+public class AllTests extends TestSuite {
+
+    public static Test suite(){
+        return new AllTests();
+    }
+    
+    public AllTests(){
+        super("EAR Operation Tests");
+        addTest(EARExportOperationTest.suite());
+        addTest(EARImportOperationTest.suite());
+        addTest(EARProjectCreationOperationTest.suite());
+    }
+    
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/ear/operations/EARExportOperationTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/ear/operations/EARExportOperationTest.java
new file mode 100644
index 0000000..4fd9615
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/ear/operations/EARExportOperationTest.java
@@ -0,0 +1,293 @@
+/*
+ * Created on Jan 6, 2004
+ * 
+ * To change the template for this generated file go to Window - Preferences - Java - Code Generation - Code and
+ * Comments
+ */
+package org.eclipse.wtp.j2ee.headless.tests.ear.operations;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.Test;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jst.j2ee.application.internal.operations.EARComponentExportDataModelProvider;
+import org.eclipse.jst.j2ee.datamodel.properties.IJ2EEComponentExportDataModelProperties;
+import org.eclipse.jst.j2ee.internal.archive.JavaEEArchiveUtilities;
+import org.eclipse.jst.j2ee.project.JavaEEProjectUtilities;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetConstants;
+import org.eclipse.jst.jee.archive.IArchive;
+import org.eclipse.jst.jee.archive.IArchiveResource;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.tests.AssertWarn;
+import org.eclipse.wst.common.tests.OperationTestCase;
+import org.eclipse.wst.common.tests.SimpleTestSuite;
+import org.eclipse.wtp.j2ee.headless.tests.appclient.operations.AppClientExportOperationTest;
+import org.eclipse.wtp.j2ee.headless.tests.ejb.operations.EJBExportOperationTest;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ArchiveTestsUtil;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.JEEExportOperationTest;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.JavaEEFacetConstants;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.JavaFileTestingUtilities;
+import org.eclipse.wtp.j2ee.headless.tests.jca.operations.JCAExportOperationTest;
+import org.eclipse.wtp.j2ee.headless.tests.web.operations.WebExportOperationTest;
+
+/**
+ * @author Changeme
+ * @author Ian Tewksbury (ictewksb@us.ibm.com)
+ * 
+ * To change the template for this generated type comment go to Window - Preferences - Java - Code Generation - Code
+ * and Comments
+ */
+public class EARExportOperationTest extends JEEExportOperationTest {
+	private static final String JAR_EXTENSION = "jar";
+	private static final String RAR_EXTENSION = "rar";
+	private static final String WAR_EXTENSION = "war";
+	
+    public EARExportOperationTest() {
+        super("EARExportOperationTests");
+    }
+    
+    public EARExportOperationTest(String name) {
+        super(name);
+    }
+    
+	public static Test suite() {
+		return new SimpleTestSuite(EARExportOperationTest.class);
+	}
+	
+    public void testEARExport12_WithDependencies() throws Exception{
+    	IDataModel dm = EARProjectCreationOperationTest.getEARDataModel("zEAR", null, EARProjectCreationOperationTest.getJ2EEDependencyList_12(), EARProjectCreationOperationTest.getJavaDependencyList_12(), JavaEEFacetConstants.EAR_12, true);
+    	OperationTestCase.runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    public void testEARExport13_WithDependencies() throws Exception{
+    	IDataModel dm = EARProjectCreationOperationTest.getEARDataModel("yEAR", null, EARProjectCreationOperationTest.getJ2EEDependencyList_13(), EARProjectCreationOperationTest.getJavaDependencyList_13(), JavaEEFacetConstants.EAR_13, true);
+    	OperationTestCase.runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    public void testEARExport14_WithDependencies() throws Exception{
+    	IDataModel dm = EARProjectCreationOperationTest.getEARDataModel("xEAR", null, EARProjectCreationOperationTest.getJ2EEDependencyList_14(), EARProjectCreationOperationTest.getJavaDependencyList_14(), JavaEEFacetConstants.EAR_14, true);
+    	OperationTestCase.runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    public void testEARExport50_WithDependencies() throws Exception{
+    	IDataModel dm = EARProjectCreationOperationTest.getEARDataModel("wEAR", null, EARProjectCreationOperationTest.getJ2EEDependencyList_5(), EARProjectCreationOperationTest.getJavaDependencyList_5(), JavaEEFacetConstants.EAR_5, false);
+    	OperationTestCase.runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    
+    public void testEARExport12_ChangedContentDir_WithDependencies() throws Exception{
+    	IDataModel dm = EARProjectCreationOperationTest.getEARDataModel("zEAR", "myContent", EARProjectCreationOperationTest.getJ2EEDependencyList_12(), EARProjectCreationOperationTest.getJavaDependencyList_12(), JavaEEFacetConstants.EAR_12, true);
+    	OperationTestCase.runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    public void testEARExport13_ChangedContentDir_WithDependencies() throws Exception{
+    	IDataModel dm = EARProjectCreationOperationTest.getEARDataModel("yEAR", "ourContent", EARProjectCreationOperationTest.getJ2EEDependencyList_13(), EARProjectCreationOperationTest.getJavaDependencyList_13(), JavaEEFacetConstants.EAR_13, true);
+    	OperationTestCase.runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    public void testEARExport14_ChangedContentDir_WithDependencies() throws Exception{
+    	IDataModel dm = EARProjectCreationOperationTest.getEARDataModel("xEAR", "theirContent", EARProjectCreationOperationTest.getJ2EEDependencyList_14(), EARProjectCreationOperationTest.getJavaDependencyList_14(), JavaEEFacetConstants.EAR_14, true);
+    	OperationTestCase.runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    public void testEARExport50_ChangedContentDir_WithDependencies() throws Exception{
+    	IDataModel dm = EARProjectCreationOperationTest.getEARDataModel("wEAR", "yourContent", EARProjectCreationOperationTest.getJ2EEDependencyList_5(), EARProjectCreationOperationTest.getJavaDependencyList_5(), JavaEEFacetConstants.EAR_5, false);
+    	OperationTestCase.runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    
+    
+    public void testEARExport50_WithDependencies_WithDD() throws Exception{
+    	IDataModel dm = EARProjectCreationOperationTest.getEARDataModel("anEAR", null, EARProjectCreationOperationTest.getJ2EEDependencyList_5(), EARProjectCreationOperationTest.getJavaDependencyList_5(), JavaEEFacetConstants.EAR_5, true);
+    	OperationTestCase.runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    public void testEARExport50_ChangedContentDir_WithDependencies_WithDD() throws Exception{
+    	IDataModel dm = EARProjectCreationOperationTest.getEARDataModel("theirEAR", "gotContent", EARProjectCreationOperationTest.getJ2EEDependencyList_5(), EARProjectCreationOperationTest.getJavaDependencyList_5(), JavaEEFacetConstants.EAR_5, true);
+    	OperationTestCase.runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+
+    
+	@Override
+	protected String getModuleExtension() {
+		return ".ear";
+	}
+	
+	@Override
+	protected IDataModel getExportDataModel(String projectName, String destination, boolean exportSource, boolean runBuild, boolean overwriteExisting) {
+		return getEARExportDataModel(projectName, destination, exportSource, runBuild, overwriteExisting);
+	}
+	
+    /**
+     * @param projectName name of the project to export
+     * @param destination destination to export to
+     * @param exportSource if TRUE export source files, else don't
+     * @param runBuild if TRUE run a build before exporting, else don't
+     * @param overwriteExisting if TRUE overwrite existing files, else don't
+     * @return an EARComponentExport data model with all of the given settings.
+     */
+    public static IDataModel getEARExportDataModel(String projectName, String destination, boolean exportSource, boolean runBuild, boolean overwriteExisting){
+    	IDataModel exportModel = DataModelFactory.createDataModel(new EARComponentExportDataModelProvider());
+    	
+		exportModel.setProperty(IJ2EEComponentExportDataModelProperties.PROJECT_NAME, projectName);
+		exportModel.setProperty(IJ2EEComponentExportDataModelProperties.ARCHIVE_DESTINATION, destination);
+		exportModel.setProperty(IJ2EEComponentExportDataModelProperties.EXPORT_SOURCE_FILES, exportSource);
+		exportModel.setProperty(IJ2EEComponentExportDataModelProperties.OVERWRITE_EXISTING, overwriteExisting);
+		exportModel.setProperty(IJ2EEComponentExportDataModelProperties.RUN_BUILD, runBuild);
+		
+		return exportModel;
+    }
+
+	@Override
+	protected void runExportTests_All(IDataModel creationModel) throws Exception {
+		String projectName = creationModel.getStringProperty(IFacetProjectCreationDataModelProperties.FACET_PROJECT_NAME);
+		String archiveName = null;
+		String archivePath = null;
+		
+		IProject earProject = JavaEEProjectUtilities.getProject(projectName);
+		JavaFileTestingUtilities.addJavaFilesToAllProjectsInEAR(earProject);
+		
+		archiveName = runAndVerifyExport_Defaults(projectName);
+		archivePath = getDataPath(archiveName);
+		JavaFileTestingUtilities.verifyAllJavaFilesExportedToProjectsInEAR(archivePath, true, false);
+		deleteExported(archivePath);
+		
+		archiveName = runAndVerifyExport_WithSource(projectName);
+		archivePath = getDataPath(archiveName);
+		JavaFileTestingUtilities.verifyAllJavaFilesExportedToProjectsInEAR(archivePath, true, true);
+		deleteExported(archivePath);
+		
+		archiveName = runAndVerifyExport_DontRunBuild(projectName);
+		archivePath = getDataPath(archiveName);
+		deleteExported(archivePath);
+		
+		archiveName = runAndVerifyExport_WithSource_DontRunBuild(projectName);
+		archivePath = getDataPath(archiveName);
+		JavaFileTestingUtilities.verifyAllJavaFilesExportedToProjectsInEAR(archivePath, false, true);
+		deleteExported(archivePath);
+		
+		
+		runTest_AttemptToOverwriteButCant(projectName);
+		runTest_AttemptToOverwriteSholdSucceed(projectName);
+		
+		runAndVerify_CompareProjectsExportedAloneAndExportedInEAR(projectName);
+		
+		JavaFileTestingUtilities.clearJavaFilesForEAR();
+	}
+	
+	/**
+	 * verifies that the archives exported within the EAR are the same as if the projects were exported separately 
+	 */
+	private void runAndVerify_CompareProjectsExportedAloneAndExportedInEAR(String projectName) throws Exception {
+		String archiveName = this.getClass().getSimpleName() + "_" + this.getName() + "_ExportedNestedArchivesTest" + getModuleExtension();
+		String destination = getDataPath(archiveName);
+		
+		IArchive earArchive = null;
+		try {
+			IDataModel exportModel = getExportDataModel(projectName, destination, true, true, true);
+			//IMPROVE PERFORMENCE: don't need to verify export model again here, its already bean done in other tests
+			runDataModel(exportModel);
+			
+			earArchive = JavaEEArchiveUtilities.INSTANCE.openArchive(new Path(destination));
+			List<IArchiveResource> resources = earArchive.getArchiveResources();
+			String extension = null;
+			for(IArchiveResource resource : resources) {
+				extension = resource.getPath().getFileExtension();
+				
+				if(extension != null && (extension.equals(JAR_EXTENSION) || extension.equals(RAR_EXTENSION) || extension.equals(WAR_EXTENSION))) {
+					earArchive.getNestedArchive(resource);
+				}
+			}
+			
+			IProject earProject = JavaEEProjectUtilities.getProject(projectName);
+			IProject[] referencedProjects = earProject.getReferencedProjects();
+			String referencedProjectType = null;
+			String referencedArchiveProjectName = null;
+			String referencedArchiveDestination = null;
+			IDataModel referencedArchiveExportModel = null;
+			Map<String, IPath> referencedProjectsArchiveMap = new HashMap<String, IPath>();
+			for(IProject referencedProject : referencedProjects) {
+				referencedProjectType = JavaEEProjectUtilities.getJ2EEProjectType(referencedProject);
+				
+				referencedArchiveProjectName = referencedProject.getName();
+				referencedArchiveDestination = getDataPath(referencedArchiveProjectName);
+				
+				if(referencedProjectType.equals(IJ2EEFacetConstants.APPLICATION_CLIENT)) {
+					referencedArchiveDestination += "." + JAR_EXTENSION;
+					referencedArchiveExportModel = AppClientExportOperationTest.getAppClientExportDataModel(referencedArchiveProjectName, referencedArchiveDestination, true, true, true);
+				} else if(referencedProjectType.equals(IJ2EEFacetConstants.DYNAMIC_WEB)) {
+					referencedArchiveDestination += "." + WAR_EXTENSION;
+					referencedArchiveExportModel = WebExportOperationTest.getWebExportDataModel(referencedArchiveProjectName, referencedArchiveDestination, true, true, true, false);
+				} else if(referencedProjectType.equals(IJ2EEFacetConstants.EJB)) {
+					referencedArchiveDestination += "." + JAR_EXTENSION;
+					referencedArchiveExportModel = EJBExportOperationTest.getEJBExportDataModel(referencedArchiveProjectName, referencedArchiveDestination, true, true, true);
+				} else if(referencedProjectType.equals(IJ2EEFacetConstants.JCA)) {
+					referencedArchiveDestination += "." + RAR_EXTENSION;
+					referencedArchiveExportModel = JCAExportOperationTest.getRARExportDataModel(referencedArchiveProjectName, referencedArchiveDestination, true, true, true);
+				}
+				
+				//IMPROVE PERFORMENCE: don't need to verify export model again here, its already bean done in other tests
+				runDataModel(referencedArchiveExportModel);
+				
+				referencedProjectsArchiveMap.put(referencedArchiveProjectName, new Path(referencedArchiveDestination));
+			}
+			
+			List<IArchive> nestedArchives = earArchive.getNestedArchives();
+			String nestedArchiveName = null;
+			IPath referencedProjectArchivePath = null;
+			IArchive referencedProjectArchive = null;
+			for(IArchive nestedArchive : nestedArchives) {
+				nestedArchiveName = nestedArchive.getPath().removeFileExtension().lastSegment();
+				referencedProjectArchivePath = referencedProjectsArchiveMap.get(nestedArchiveName);
+				
+				AssertWarn.warnNotNull("There should be an exported project archive path for this EAR's nested archive", referencedProjectArchivePath);
+				if(referencedProjectArchivePath != null) {
+					try {
+						referencedProjectArchive = JavaEEArchiveUtilities.INSTANCE.openArchive(referencedProjectArchivePath);
+						
+						ArchiveTestsUtil.compareArchives(referencedProjectArchive, nestedArchive);						
+					} finally {
+						if(referencedProjectArchive != null) {
+							JavaEEArchiveUtilities.INSTANCE.closeArchive(referencedProjectArchive);
+						}
+					}
+					
+				}
+			}
+			
+		} finally {
+			if(earArchive != null) {
+				JavaEEArchiveUtilities.INSTANCE.closeArchive(earArchive);
+			}
+			
+			deleteExported(archiveName);
+		}
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/ear/operations/EARImportOperationTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/ear/operations/EARImportOperationTest.java
new file mode 100644
index 0000000..362bd47
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/ear/operations/EARImportOperationTest.java
@@ -0,0 +1,379 @@
+package org.eclipse.wtp.j2ee.headless.tests.ear.operations;
+
+import java.util.Collections;
+import java.util.List;
+
+import junit.framework.Assert;
+import junit.framework.Test;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jst.j2ee.application.internal.operations.EARComponentImportDataModelProvider;
+import org.eclipse.jst.j2ee.datamodel.properties.IEARComponentImportDataModelProperties;
+import org.eclipse.jst.j2ee.datamodel.properties.IJ2EEComponentImportDataModelProperties;
+import org.eclipse.jst.j2ee.internal.archive.ArchiveWrapper;
+import org.eclipse.wst.common.componentcore.internal.util.ComponentUtilities;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualFile;
+import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.tests.OperationTestCase;
+import org.eclipse.wst.common.tests.SimpleTestSuite;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.JEEImportOperationTest;
+
+/**
+ * @author itewk
+ * 
+ * To change the template for this generated type comment go to Window - Preferences - Java - Code Generation - Code
+ * and Comments
+ */
+public class EARImportOperationTest extends JEEImportOperationTest {
+	public EARImportOperationTest() {
+		super("EARImportOperationTests");
+	}
+	
+	public EARImportOperationTest(String name) {
+		super(name);
+	}
+	
+	public static Test suite() {
+		return new SimpleTestSuite(EARImportOperationTest.class);
+	}
+	
+    public void testEARImport12_WithDependencies() throws Exception{
+    	runImportTests_All("EAR12");
+    }
+    
+    public void testEARImport13_WithDependencies() throws Exception{
+    	runImportTests_All("EAR13");
+    }
+    
+    public void testEARImport14_WithDependencies() throws Exception{
+    	runImportTests_All("EAR14");
+    }
+    
+    public void testEARImport50_WithDependencies() throws Exception{
+    	runImportTests_All("EAR50");
+    }
+    
+    
+    public void testEARImport12_ChangedContentDir_WithDependencies() throws Exception{
+    	runImportTests_All("EAR12_ChangedContentDir");
+    }
+    
+    public void testEARImport13_ChangedContentDir_WithDependencies() throws Exception{
+    	runImportTests_All("EAR13_ChangedContentDir");
+    }
+    
+    public void testEARImport14_ChangedContentDir_WithDependencies() throws Exception{
+    	runImportTests_All("EAR14_ChangedContentDir");
+    }
+    
+    public void testEARImport50_ChangedContentDir_WithDependencies() throws Exception{
+    	runImportTests_All("EAR50_ChangedContentDir");
+    }
+    
+    
+    public void testEARImport50_EAR5NoDD_DependincesNoDDs() throws Exception {
+    	String archiveName = "EAR5NoDD_DependincesNoDDs" + getModuleExtension();
+    	
+    	runAndVerifyImport_ExportedWithSource(archiveName);
+    	OperationTestCase.deleteAllProjects();
+    	
+    	runAndVerifyImport_DontExplodeAllModules(archiveName);
+    	OperationTestCase.deleteAllProjects();
+    	
+		runAndVerifyImport_DontExplodeAnyModules(archiveName);
+		OperationTestCase.deleteAllProjects();
+    }
+    
+    public void testEARImport50_EAR5NoDD_DependincesNoDDs_WithUtil() throws Exception {
+    	String archiveName = "EAR5NoDD_DependincesNoDDs_WithUtil" + getModuleExtension();
+    	
+    	runAndVerifyImport_ExportedWithSource(archiveName);
+    	OperationTestCase.deleteAllProjects();
+    	
+    	runAndVerifyImport_DontExplodeAllModules(archiveName);
+    	OperationTestCase.deleteAllProjects();
+    	
+		runAndVerifyImport_DontExplodeAnyModules(archiveName);
+		OperationTestCase.deleteAllProjects();
+    }
+    
+    public void testEARImport50_EAR5NoDD_DependincesWithDDs() throws Exception {
+    	String archiveName = "EAR5NoDD_DependincesWithDDs" + getModuleExtension();
+    	
+    	runAndVerifyImport_ExportedWithSource(archiveName);
+    	OperationTestCase.deleteAllProjects();
+    	
+    	runAndVerifyImport_DontExplodeAllModules(archiveName);
+    	OperationTestCase.deleteAllProjects();
+    	
+		runAndVerifyImport_DontExplodeAnyModules(archiveName);
+		OperationTestCase.deleteAllProjects();
+    }
+    
+    public void testEARImport50_EAR5NoDD_DependincesWithDDs_WithUtil() throws Exception {
+    	String archiveName = "EAR5NoDD_DependincesWithDDs_WithUtil" + getModuleExtension();
+    	
+    	runAndVerifyImport_ExportedWithSource(archiveName);
+    	OperationTestCase.deleteAllProjects();
+    	
+    	runAndVerifyImport_DontExplodeAllModules(archiveName);
+    	OperationTestCase.deleteAllProjects();
+    	
+		runAndVerifyImport_DontExplodeAnyModules(archiveName);
+		OperationTestCase.deleteAllProjects();
+    }
+    
+    public void testEARImport50_EAR5NoDD_DependincesNoDDsAndWithDDs() throws Exception {
+    	String archiveName = "EAR5NoDD_DependincesNoDDsAndWithDDs" + getModuleExtension();
+    	
+    	runAndVerifyImport_ExportedWithSource(archiveName);
+    	OperationTestCase.deleteAllProjects();
+    	
+    	runAndVerifyImport_DontExplodeAllModules(archiveName);
+    	OperationTestCase.deleteAllProjects();
+    	
+		runAndVerifyImport_DontExplodeAnyModules(archiveName);
+		OperationTestCase.deleteAllProjects();
+    }
+    
+    public void testEARImport50_EAR5NoDD_DependincesNoDDsAndWithDDs_WithUtil() throws Exception {
+    	String archiveName = "EAR5NoDD_DependincesNoDDsAndWithDDs_WithUtil" + getModuleExtension();
+    	
+    	runAndVerifyImport_ExportedWithSource(archiveName);
+    	OperationTestCase.deleteAllProjects();
+    	
+    	runAndVerifyImport_DontExplodeAllModules(archiveName);
+    	OperationTestCase.deleteAllProjects();
+    	
+		runAndVerifyImport_DontExplodeAnyModules(archiveName);
+		OperationTestCase.deleteAllProjects();
+    }
+    
+    public void testEARImport50_EAR5WithDD_DependincesNoDDs() throws Exception {
+    	String archiveName = "EAR5WithDD_DependincesNoDDs" + getModuleExtension();
+    	
+    	runAndVerifyImport_ExportedWithSource(archiveName);
+    	OperationTestCase.deleteAllProjects();
+    	
+    	runAndVerifyImport_DontExplodeAllModules(archiveName);
+    	OperationTestCase.deleteAllProjects();
+    	
+		runAndVerifyImport_DontExplodeAnyModules(archiveName);
+		OperationTestCase.deleteAllProjects();
+    }
+    
+    public void testEARImport50_EAR5WithDD_DependincesNoDDs_WithUtil() throws Exception {
+    	String archiveName = "EAR5WithDD_DependincesNoDDs_WithUtil" + getModuleExtension();
+    	
+    	runAndVerifyImport_ExportedWithSource(archiveName);
+    	OperationTestCase.deleteAllProjects();
+    	
+    	runAndVerifyImport_DontExplodeAllModules(archiveName);
+    	OperationTestCase.deleteAllProjects();
+    	
+		runAndVerifyImport_DontExplodeAnyModules(archiveName);
+		OperationTestCase.deleteAllProjects();
+    }
+    
+    public void testEARImport50_EAR5WithDD_DependincesWithDDs() throws Exception {
+    	String archiveName = "EAR5WithDD_DependincesWithDDs" + getModuleExtension();
+    	
+    	runAndVerifyImport_ExportedWithSource(archiveName);
+    	OperationTestCase.deleteAllProjects();
+    	
+    	runAndVerifyImport_DontExplodeAllModules(archiveName);
+    	OperationTestCase.deleteAllProjects();
+    	
+		runAndVerifyImport_DontExplodeAnyModules(archiveName);
+		OperationTestCase.deleteAllProjects();
+    }
+    
+    public void testEARImport50_EAR5WithDD_DependincesWithDDs_WithUtil() throws Exception {
+    	String archiveName = "EAR5WithDD_DependincesWithDDs_WithUtil" + getModuleExtension();
+    	
+    	runAndVerifyImport_ExportedWithSource(archiveName);
+    	OperationTestCase.deleteAllProjects();
+    	
+    	runAndVerifyImport_DontExplodeAllModules(archiveName);
+    	OperationTestCase.deleteAllProjects();
+    	
+		runAndVerifyImport_DontExplodeAnyModules(archiveName);
+		OperationTestCase.deleteAllProjects();
+    }
+    
+    public void testEARImport50_EAR5WithDD_DependincesNoDDsAndWithDDs() throws Exception {
+    	String archiveName = "EAR5WithDD_DependincesNoDDsAndWithDDs" + getModuleExtension();
+    	
+    	runAndVerifyImport_ExportedWithSource(archiveName);
+    	OperationTestCase.deleteAllProjects();
+    	
+    	runAndVerifyImport_DontExplodeAllModules(archiveName);
+    	OperationTestCase.deleteAllProjects();
+    	
+		runAndVerifyImport_DontExplodeAnyModules(archiveName);
+		OperationTestCase.deleteAllProjects();
+    }
+    
+    public void testEARImport50_EAR5WithDD_DependincesNoDDsAndWithDDs_WithUtil() throws Exception {
+    	String archiveName = "EAR5WithDD_DependincesNoDDsAndWithDDs_WithUtil" + getModuleExtension();
+    	
+    	runAndVerifyImport_ExportedWithSource(archiveName);
+    	OperationTestCase.deleteAllProjects();
+    	
+    	runAndVerifyImport_DontExplodeAllModules(archiveName);
+    	OperationTestCase.deleteAllProjects();
+    	
+		runAndVerifyImport_DontExplodeAnyModules(archiveName);
+		OperationTestCase.deleteAllProjects();
+    }    
+	
+    public void test288180() throws Exception {
+    	String archiveName = "288180.ear";
+    	String archivePath = getArchivePath(archiveName);
+    	verifyImportArchiveExists(archivePath);
+		IDataModel importModel = getImportDataModel(archivePath, "288180", null, true);
+		IStatus status = importModel.validate();
+		assertTrue(status.isOK());
+		importModel.dispose();
+		OperationTestCase.deleteAllProjects();
+    }
+    
+	@Override
+	protected String getModuleExtension() {
+		return ".ear";
+	}
+
+	@Override
+	protected IDataModel getImportDataModel(String filePath, String projectName, IDataModel creationModel, boolean closeArchiveOnDispose) {
+		return getEARImportDataModel(filePath, projectName, creationModel, closeArchiveOnDispose);
+	}
+	
+	public static IDataModel getEARImportDataModel(String filePath, String projectName, IDataModel creationModel, boolean closeArchiveOnDispose) {
+		IDataModel importModel = DataModelFactory.createDataModel(new EARComponentImportDataModelProvider());
+    	
+    	importModel.setProperty(IJ2EEComponentImportDataModelProperties.FILE_NAME, filePath);
+    	importModel.setProperty(IJ2EEComponentImportDataModelProperties.PROJECT_NAME, projectName);
+    	importModel.setProperty(IJ2EEComponentImportDataModelProperties.CLOSE_ARCHIVE_ON_DISPOSE, closeArchiveOnDispose);
+    	
+    	if(creationModel != null) {
+    		importModel.setProperty(IJ2EEComponentImportDataModelProperties.NESTED_MODEL_J2EE_COMPONENT_CREATION, creationModel);
+    	}
+		
+		return importModel;
+    }
+	
+	public static IDataModel setExtendedEARImportDataModelProperties(IDataModel importModel, IPath nestedModuleRoot, List utilityList, List selectedModelsList, List ejbClientList, List moduleModelsList, List utilityModelsList) {
+    	if(nestedModuleRoot != null) {
+    		importModel.setProperty(IEARComponentImportDataModelProperties.NESTED_MODULE_ROOT, nestedModuleRoot);
+    	}
+    	
+    	if(utilityList != null) {
+    		importModel.setProperty(IEARComponentImportDataModelProperties.UTILITY_LIST, utilityList);
+    	}
+    	
+    	if(selectedModelsList != null) {
+    		importModel.setProperty(IEARComponentImportDataModelProperties.SELECTED_MODELS_LIST, selectedModelsList);
+    	}
+    	
+    	if(ejbClientList != null) {
+    		importModel.setProperty(IEARComponentImportDataModelProperties.EJB_CLIENT_LIST, ejbClientList);
+    	}
+    	
+    	if(moduleModelsList != null) {
+    		importModel.setProperty(IEARComponentImportDataModelProperties.MODULE_MODELS_LIST, moduleModelsList);
+    	}
+    	
+    	if(utilityModelsList != null) {
+    		importModel.setProperty(IEARComponentImportDataModelProperties.UTILITY_MODELS_LIST, utilityModelsList);
+    	}
+    	
+    	return importModel;
+    }
+	
+	@Override
+	protected IDataModel getExportDataModel(String projectName, String destination, boolean exportSource, boolean runBuild, boolean overwriteExisting) {
+		return EARExportOperationTest.getEARExportDataModel(projectName, destination, exportSource, runBuild, overwriteExisting);
+	}
+
+	@Override
+	protected void runImportTests_All(String testName) throws Exception {
+		super.runImportTests_All(testName);
+		
+		runAndVerifyImport_DontExplodeAllModules(testName + "_Source" + getModuleExtension());
+		OperationTestCase.deleteAllProjects();
+		
+		runAndVerifyImport_DontExplodeAnyModules(testName + "_Source" + getModuleExtension());
+		OperationTestCase.deleteAllProjects();
+	}
+	
+	private void runAndVerifyImport_DontExplodeAllModules(String archiveName) throws Exception {
+		String archivePath = getArchivePath(archiveName);
+		String projectName = "exportedWithSource";
+		
+		verifyImportArchiveExists(archivePath);
+		
+		//remove some of the selected models
+		IDataModel importModel = getImportDataModel(archivePath, projectName, null, true);
+    	List selectedModelsList = (List)importModel.getProperty(IEARComponentImportDataModelProperties.SELECTED_MODELS_LIST);
+    	for(int i = 0; i<2 & i<selectedModelsList.size(); i++) {
+    		selectedModelsList.remove(i);
+    	}
+    	
+		importModel = setExtendedEARImportDataModelProperties(importModel, null, null, selectedModelsList, null, null, null);
+		runAndVerify(importModel);
+		
+		runAndVerifyReExportation(importModel, true, true);
+	}
+	
+	private void runAndVerifyImport_DontExplodeAnyModules(String archiveName) throws Exception {
+		String archivePath = getArchivePath(archiveName);
+		String projectName = "exportedWithSource";
+		
+		verifyImportArchiveExists(archivePath);
+		
+		//remove all of the selected models
+		IDataModel importModel = getImportDataModel(archivePath, projectName, null, true);
+		importModel = setExtendedEARImportDataModelProperties(importModel, null, null, Collections.EMPTY_LIST, null, null, null);
+		runAndVerify(importModel);
+		
+		runAndVerifyReExportation(importModel, true, true);
+	}
+	
+	@Override
+	protected void runAndVerifyReExportation(IDataModel importModel, boolean exportSource, boolean runBuild) throws Exception {
+		removeNestedArchivesForExplodedProjects(importModel);
+		super.runAndVerifyReExportation(importModel, exportSource, runBuild);
+	}
+	
+	/**
+	 * this is used to be sure when re-exporting the exploded projects are used and not the nested archives.
+	 * 
+	 * @param importModel
+	 * @throws Exception
+	 */
+	private void removeNestedArchivesForExplodedProjects(IDataModel importModel) throws Exception {
+		List<IDataModel> selectedModelsList = (List<IDataModel>)importModel.getProperty(IEARComponentImportDataModelProperties.SELECTED_MODELS_LIST);
+		String earProjectName = importModel.getStringProperty(IEARComponentImportDataModelProperties.PROJECT_NAME);
+		IVirtualComponent projectVirtComponent = ComponentUtilities.getComponent(earProjectName);
+		IVirtualFolder virtRootFolder = projectVirtComponent.getRootFolder();
+		
+		ArchiveWrapper nestedArchiveWrapper = null;
+		IPath nestedArchivePath = null;
+		IVirtualFile nestedArchiveVirtFile = null;
+		IFile nestedArchiveFile = null;
+		for(IDataModel selectedModel : selectedModelsList) {
+			nestedArchiveWrapper = (ArchiveWrapper)selectedModel.getProperty(IEARComponentImportDataModelProperties.ARCHIVE_WRAPPER);
+			nestedArchivePath = nestedArchiveWrapper.getPath();
+			nestedArchiveVirtFile = virtRootFolder.getFile(nestedArchivePath);
+			Assert.assertTrue("The EAR project should contain the selected module as an archive", nestedArchiveVirtFile.exists());
+			
+			nestedArchiveFile = nestedArchiveVirtFile.getUnderlyingFile();
+			nestedArchiveFile.delete(true, null);
+		}
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/ear/operations/EARProjectCreationOperationTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/ear/operations/EARProjectCreationOperationTest.java
new file mode 100644
index 0000000..69d8d64
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/ear/operations/EARProjectCreationOperationTest.java
@@ -0,0 +1,645 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ * Created on Oct 27, 2003
+ * 
+ * To change the template for this generated file go to Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and
+ * Comments
+ */
+package org.eclipse.wtp.j2ee.headless.tests.ear.operations;
+
+import java.io.ByteArrayInputStream;
+import java.io.FileInputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.Test;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IWorkspaceRunnable;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jdt.core.ClasspathContainerInitializer;
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.internal.core.JavaModelManager;
+import org.eclipse.jst.common.internal.modulecore.ClasspathContainerVirtualComponent;
+import org.eclipse.jst.j2ee.application.internal.operations.AddComponentToEnterpriseApplicationDataModelProvider;
+import org.eclipse.jst.j2ee.application.internal.operations.AddReferenceToEnterpriseApplicationDataModelProvider;
+import org.eclipse.jst.j2ee.classpath.tests.util.ClasspathDependencyTestUtil;
+import org.eclipse.jst.j2ee.earcreation.IEarFacetInstallDataModelProperties;
+import org.eclipse.jst.j2ee.internal.project.facet.EARFacetProjectCreationDataModelProvider;
+import org.eclipse.jst.j2ee.project.JavaEEProjectUtilities;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetInstallDataModelProperties;
+import org.eclipse.jst.j2ee.project.facet.IJavaUtilityProjectCreationDataModelProperties;
+import org.eclipse.jst.j2ee.project.facet.JavaUtilityProjectCreationDataModelProvider;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IAddReferenceDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.ICreateReferenceComponentsDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetInstallDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties.FacetDataModelMap;
+import org.eclipse.wst.common.componentcore.internal.resources.VirtualArchiveComponent;
+import org.eclipse.wst.common.componentcore.internal.resources.VirtualReference;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualFile;
+import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
+import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider;
+import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
+import org.eclipse.wst.common.tests.OperationTestCase;
+import org.eclipse.wst.common.tests.SimpleTestSuite;
+import org.eclipse.wst.server.core.IModule;
+import org.eclipse.wst.server.core.ServerUtil;
+import org.eclipse.wst.server.core.model.IModuleFile;
+import org.eclipse.wst.server.core.model.IModuleFolder;
+import org.eclipse.wst.server.core.model.IModuleResource;
+import org.eclipse.wst.server.core.model.ModuleDelegate;
+import org.eclipse.wtp.j2ee.headless.tests.appclient.operations.AppClientProjectCreationOperationTest;
+import org.eclipse.wtp.j2ee.headless.tests.ejb.operations.EJBProjectCreationOperationTest;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.JEEProjectCreationOperationTest;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.JavaEEFacetConstants;
+import org.eclipse.wtp.j2ee.headless.tests.jca.operations.JCAProjectCreationOperationTest;
+import org.eclipse.wtp.j2ee.headless.tests.web.operations.WebProjectCreationOperationTest;
+
+
+/**
+ * @author jsholl
+ * @author Ian Tewksbury (ictewksb@us.ibm.com)
+ * 
+ * To change the template for this generated type comment go to Window&gt;Preferences&gt;Java&gt;Code
+ * Generation&gt;Code and Comments
+ */
+public class EARProjectCreationOperationTest extends JEEProjectCreationOperationTest {
+	private static final String APP_CLIENT_PROJ_12 = "myAppClient_12";
+	private static final String APP_CLIENT_PROJ_13 = "myAppClient_13";
+	private static final String APP_CLIENT_PROJ_14 = "myAppClient_14";
+	private static final String APP_CLIENT_PROJ_5 = "myAppClient_5";
+	private static final String APP_CLIENT_PROJ_6 = "myAppClient_6";
+	
+	private static final String EJB_PROJ_11 = "myEJB_11";
+	private static final String EJB_PROJ_2 = "myEJB_2";
+	private static final String EJB_PROJ_21 = "myEJB_21";
+	private static final String EJB_PROJ_3 = "myEJB_3";
+	private static final String EJB_PROJ_31 = "myEJB_31";
+	
+	private static final String WEB_PROJ_22 = "myWeb_22";
+	private static final String WEB_PROJ_23 = "myWeb_23";
+	private static final String WEB_PROJ_24 = "myWeb_24";
+	private static final String WEB_PROJ_25 = "myWeb_25";
+	private static final String WEB_PROJ_30 = "myWeb_30";
+	
+	private static final String CONNECTOR_PROJ_1 = "myConnector_1";
+	private static final String CONNECTOR_PROJ_15 = "myConnector_15";
+
+	public EARProjectCreationOperationTest(String name) {
+		super(name);
+	}
+
+    public static Test suite() {
+    	return new SimpleTestSuite(EARProjectCreationOperationTest.class);
+    }
+    
+    public void testEAR12_Defaults() throws Exception{
+    	IDataModel dm = getEARDataModel("aEAR", null, null, null, JavaEEFacetConstants.EAR_12, true);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testEAR13_Defaults() throws Exception{
+    	IDataModel dm = getEARDataModel("bEAR", null, null, null, JavaEEFacetConstants.EAR_13, true);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testEAR14_Defaults() throws Exception{
+    	IDataModel dm = getEARDataModel("cEAR", null, null, null, JavaEEFacetConstants.EAR_14, true);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testEAR50_Defaults() throws Exception{
+    	IDataModel dm = getEARDataModel("dEAR", null, null, null, JavaEEFacetConstants.EAR_5, false);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testEAR60_Defaults() throws Exception{
+    	IDataModel dm = getEARDataModel("eeEAR", null, null, null, JavaEEFacetConstants.EAR_6, false);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    
+    public void testEAR12_ChangedContentDir() throws Exception{
+    	IDataModel dm = getEARDataModel("eEAR", "whosContent", null, null, JavaEEFacetConstants.EAR_12, true);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testEAR13_ChangedContentDir() throws Exception{
+    	IDataModel dm = getEARDataModel("fEAR", "myContent", null, null, JavaEEFacetConstants.EAR_13, true);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testEAR14_ChangedContentDir() throws Exception{
+    	IDataModel dm = getEARDataModel("gEAR", "yourContent", null, null, JavaEEFacetConstants.EAR_14, true);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testEAR50_ChangedContentDir() throws Exception{
+    	IDataModel dm = getEARDataModel("hEAR", "ourContent", null, null, JavaEEFacetConstants.EAR_5, false);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testEAR60_ChangedContentDir() throws Exception{
+    	IDataModel dm = getEARDataModel("iEAR", "herContent", null, null, JavaEEFacetConstants.EAR_6, false);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    
+    public void testEAR12_WithDependencies() throws Exception{
+    	IDataModel dm = getEARDataModel("zEAR", null, getJ2EEDependencyList_12(), getJavaDependencyList_12(), JavaEEFacetConstants.EAR_12, true);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testEAR13_WithDependencies() throws Exception{
+    	IDataModel dm = getEARDataModel("yEAR", null, getJ2EEDependencyList_13(), getJavaDependencyList_13(), JavaEEFacetConstants.EAR_13, true);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testEAR14_WithDependencies() throws Exception{
+    	IDataModel dm = getEARDataModel("xEAR", null, getJ2EEDependencyList_14(), getJavaDependencyList_14(), JavaEEFacetConstants.EAR_14, true);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testEAR50_WithDependencies() throws Exception{
+    	IDataModel dm = getEARDataModel("wEAR", null, getJ2EEDependencyList_5(), getJavaDependencyList_5(), JavaEEFacetConstants.EAR_5, false);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testEAR60_WithDependencies() throws Exception{
+    	IDataModel dm = getEARDataModel("whyEAR", null, getJ2EEDependencyList_6(), getJavaDependencyList_6(), JavaEEFacetConstants.EAR_6, false);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    
+    public void testEAR12_ChangedContentDir_WithDependencies() throws Exception{
+    	IDataModel dm = getEARDataModel("zEAR", "myContent", getJ2EEDependencyList_12(), getJavaDependencyList_12(), JavaEEFacetConstants.EAR_12, true);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testEAR13_ChangedContentDir_WithDependencies() throws Exception{
+    	IDataModel dm = getEARDataModel("yEAR", "ourContent", getJ2EEDependencyList_13(), getJavaDependencyList_13(), JavaEEFacetConstants.EAR_13, true);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testEAR14_ChangedContentDir_WithDependencies() throws Exception{
+    	IDataModel dm = getEARDataModel("xEAR", "theirContent", getJ2EEDependencyList_14(), getJavaDependencyList_14(), JavaEEFacetConstants.EAR_14, true);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testEAR50_ChangedContentDir_WithDependencies() throws Exception{
+    	IDataModel dm = getEARDataModel("wEAR", "yourContent", getJ2EEDependencyList_5(), getJavaDependencyList_5(), JavaEEFacetConstants.EAR_5, false);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testEAR60_ChangedContentDir_WithDependencies() throws Exception{
+    	IDataModel dm = getEARDataModel("xyzEAR", "hisContent", getJ2EEDependencyList_6(), getJavaDependencyList_6(), JavaEEFacetConstants.EAR_6, false);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    
+    public void testEAR50_Defaults_WithDD() throws Exception{
+    	IDataModel dm = getEARDataModel("myEAR", null, null, null, JavaEEFacetConstants.EAR_5, true);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testEAR60_Defaults_WithDD() throws Exception{
+    	IDataModel dm = getEARDataModel("mineEAR", null, null, null, JavaEEFacetConstants.EAR_6, true);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    
+    public void testEAR50_ChangedContentDir_WithDD() throws Exception{
+    	IDataModel dm = getEARDataModel("yourEAR", "ourContent", null, null, JavaEEFacetConstants.EAR_5, true);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testEAR60_ChangedContentDir_WithDD() throws Exception{
+    	IDataModel dm = getEARDataModel("thatEAR", "thatContent", null, null, JavaEEFacetConstants.EAR_6, true);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+/*    
+    public void testEAR50_WithDependencies_WithDD() throws Exception{
+    	IDataModel dm = getEARDataModel("anEAR", null, getJ2EEDependencyList_5(), getJavaDependencyList_5(), JavaEEFacetConstants.EAR_5, true);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testEAR50_ChangedContentDir_WithDependencies_WithDD() throws Exception{
+    	IDataModel dm = getEARDataModel("theirEAR", "gotContent", getJ2EEDependencyList_5(), getJavaDependencyList_5(), JavaEEFacetConstants.EAR_5, true);
+    	OperationTestCase.runAndVerify(dm);
+    }
+*/
+    
+    /**
+     * Creates and returns an EAR Data Model with the given name and of the given version 
+     * 
+     * @param projName name of the project to create
+     * @param version version of EAR to use
+     * @param contentDir directory to store the content in, if NULL use default
+     * @param dependenciesJ2EE list of J2EE IProjects that this EAR depends on, ignored if NULL
+     * @param dependenciesJava list of Java IProjects that this EAR depends on, ignored if NULL
+     * @param createDD only used if version is JEE5, if true then create DD else don't
+     * @return an EAR Data Model with the appropriate properties set
+     */
+    public static IDataModel getEARDataModel(String projName, String contentDir, List dependenciesJ2EE, List dependenciesJava, IProjectFacetVersion version, boolean createDD) {
+    	IDataModel dm = DataModelFactory.createDataModel(new EARFacetProjectCreationDataModelProvider());
+    	dm.setProperty(IFacetProjectCreationDataModelProperties.FACET_PROJECT_NAME, projName);
+
+		FacetDataModelMap factMap = (FacetDataModelMap) dm.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
+		IDataModel facetModel = (IDataModel) factMap.get(IEarFacetInstallDataModelProperties.ENTERPRISE_APPLICATION);
+		facetModel.setProperty(IFacetInstallDataModelProperties.FACET_VERSION, version);
+		
+		
+		if(contentDir != null) {
+			facetModel.setStringProperty(IEarFacetInstallDataModelProperties.CONTENT_DIR,contentDir); 
+		}
+		
+		if(dependenciesJ2EE != null) {
+			facetModel.setProperty(IEarFacetInstallDataModelProperties.J2EE_PROJECTS_LIST, dependenciesJ2EE);
+		}
+		
+		if(dependenciesJava != null) {
+			facetModel.setProperty(IEarFacetInstallDataModelProperties.JAVA_PROJECT_LIST, dependenciesJava);
+		}
+		
+        
+        facetModel.setBooleanProperty(IJ2EEFacetInstallDataModelProperties.GENERATE_DD, createDD);
+        
+		
+    	return dm;
+    }
+    
+    
+    
+    public static List getJ2EEDependencyList_12() throws Exception {
+    	List dependencies = new ArrayList();
+    	List<IDataModel> models = new ArrayList<IDataModel>();
+    	
+    	models.add(AppClientProjectCreationOperationTest.getAppClientCreationDataModel(APP_CLIENT_PROJ_12, null, JavaEEFacetConstants.APP_CLIENT_12, true, true));
+    	
+    	models.add(EJBProjectCreationOperationTest.getEJBDataModel(EJB_PROJ_11, null, null, null, JavaEEFacetConstants.EJB_11, true));
+    	
+    	models.add(WebProjectCreationOperationTest.getWebDataModel(WEB_PROJ_22, null, null, null, null, JavaEEFacetConstants.WEB_22, true));
+    	
+    	for(int i = 0; i < models.size(); i++) {
+    		OperationTestCase.runDataModel(models.get(i));
+    	}
+    	
+    	dependencies.addAll(Arrays.asList(JavaEEProjectUtilities.getAllProjects()));
+    	
+    	return dependencies;
+    }
+    
+    public static List getJavaDependencyList_12() {
+    	return Collections.emptyList();
+    }
+    
+    
+    public static List getJ2EEDependencyList_13() throws Exception {
+    	getJ2EEDependencyList_12();
+    	List dependencies = new ArrayList();
+    	List<IDataModel> models = new ArrayList<IDataModel>();
+    	
+    	models.add(AppClientProjectCreationOperationTest.getAppClientCreationDataModel(APP_CLIENT_PROJ_13, null, JavaEEFacetConstants.APP_CLIENT_13, true, true));
+    	
+    	models.add(EJBProjectCreationOperationTest.getEJBDataModel(EJB_PROJ_2, null, null, null, JavaEEFacetConstants.EJB_2, true));
+    	
+    	models.add(WebProjectCreationOperationTest.getWebDataModel(WEB_PROJ_23, null, null, null, null, JavaEEFacetConstants.WEB_23, true));
+    	
+    	models.add(JCAProjectCreationOperationTest.getConnectorDataModel(CONNECTOR_PROJ_1, null, null, JavaEEFacetConstants.CONNECTOR_1));
+    	
+    	for(int i = 0; i < models.size(); i++) {
+    		OperationTestCase.runDataModel(models.get(i));
+    	}
+    	
+    	dependencies.addAll(Arrays.asList(JavaEEProjectUtilities.getAllProjects()));
+    	
+    	return dependencies;
+    }
+    
+    public static List getJavaDependencyList_13() {
+    	return Collections.emptyList();
+    }
+    
+    
+    public static List getJ2EEDependencyList_14() throws Exception {
+    	getJ2EEDependencyList_13();
+    	List dependencies = new ArrayList();
+    	
+    	List<IDataModel> models = new ArrayList<IDataModel>();
+    	
+    	models.add(AppClientProjectCreationOperationTest.getAppClientCreationDataModel(APP_CLIENT_PROJ_14, null, JavaEEFacetConstants.APP_CLIENT_14, true, true));
+
+    	models.add(EJBProjectCreationOperationTest.getEJBDataModel(EJB_PROJ_21, null, null, null, JavaEEFacetConstants.EJB_21, true));
+
+    	models.add(WebProjectCreationOperationTest.getWebDataModel(WEB_PROJ_24, null, null, null, null, JavaEEFacetConstants.WEB_24, true));
+
+    	for(int i = 0; i < models.size(); i++) {
+    		OperationTestCase.runDataModel(models.get(i));
+    	}
+    	
+    	dependencies.addAll(Arrays.asList(JavaEEProjectUtilities.getAllProjects()));
+    	
+    	return dependencies;
+    }
+    
+    public static List getJavaDependencyList_14() {
+    	return Collections.emptyList();
+    }
+    
+    public static List getJ2EEDependencyList_5() throws Exception {
+    	getJ2EEDependencyList_14();
+    	List dependencies = new ArrayList();
+    	
+    	List<IDataModel> models = new ArrayList<IDataModel>();
+    	
+    	models.add(AppClientProjectCreationOperationTest.getAppClientCreationDataModel(APP_CLIENT_PROJ_5, null, JavaEEFacetConstants.APP_CLIENT_5, true, false));
+    	models.add(AppClientProjectCreationOperationTest.getAppClientCreationDataModel(APP_CLIENT_PROJ_5 + "_WithDD", null, JavaEEFacetConstants.APP_CLIENT_5, true, true));
+    	
+    	models.add(EJBProjectCreationOperationTest.getEJBDataModel(EJB_PROJ_3, null, null, null, JavaEEFacetConstants.EJB_3, false));
+    	models.add(EJBProjectCreationOperationTest.getEJBDataModel(EJB_PROJ_3 + "_WithDD", null, null, null, JavaEEFacetConstants.EJB_3, true));
+    	
+    	models.add(WebProjectCreationOperationTest.getWebDataModel(WEB_PROJ_25, null, null, null, null, JavaEEFacetConstants.WEB_25, false));
+      	models.add(WebProjectCreationOperationTest.getWebDataModel(WEB_PROJ_25 + "_WithDD", null, null, null, null, JavaEEFacetConstants.WEB_25, true));
+    	
+    	for(int i = 0; i < models.size(); i++) {
+    		OperationTestCase.runDataModel(models.get(i));
+    	}
+    	
+    	dependencies.addAll(Arrays.asList(JavaEEProjectUtilities.getAllProjects()));
+    	
+    	return dependencies;
+    }
+    
+    public static List getJavaDependencyList_5() {
+    	return Collections.emptyList();
+    }
+    
+    public static List getJ2EEDependencyList_6() throws Exception {
+    	getJ2EEDependencyList_5();
+    	List dependencies = new ArrayList();
+    	
+    	List<IDataModel> models = new ArrayList<IDataModel>();
+    	
+    	models.add(AppClientProjectCreationOperationTest.getAppClientCreationDataModel(APP_CLIENT_PROJ_6, null, JavaEEFacetConstants.APP_CLIENT_6, true, false));
+    	models.add(AppClientProjectCreationOperationTest.getAppClientCreationDataModel(APP_CLIENT_PROJ_6 + "_WithDD", null, JavaEEFacetConstants.APP_CLIENT_6, true, true));
+    	
+    	models.add(EJBProjectCreationOperationTest.getEJBDataModel(EJB_PROJ_31, null, null, null, JavaEEFacetConstants.EJB_31, false));
+    	models.add(EJBProjectCreationOperationTest.getEJBDataModel(EJB_PROJ_31 + "_WithDD", null, null, null, JavaEEFacetConstants.EJB_31, true));
+    	
+    	models.add(WebProjectCreationOperationTest.getWebDataModel(WEB_PROJ_30, null, null, null, null, JavaEEFacetConstants.WEB_30, false));
+      	models.add(WebProjectCreationOperationTest.getWebDataModel(WEB_PROJ_30 + "_WithDD", null, null, null, null, JavaEEFacetConstants.WEB_30, true));
+    	
+    	for(int i = 0; i < models.size(); i++) {
+    		OperationTestCase.runDataModel(models.get(i));
+    	}
+    	
+    	dependencies.addAll(Arrays.asList(JavaEEProjectUtilities.getAllProjects()));
+    	
+    	return dependencies;
+    }
+    
+    public static List getJavaDependencyList_6() {
+    	return Collections.emptyList();
+    }
+
+    
+    public void testEAR50_WithVariableReference() throws Exception{
+    	IDataModel dm = getEARDataModel("pEAR", "ourContent", null, null, JavaEEFacetConstants.EAR_5, false);
+    	OperationTestCase.runAndVerify(dm);
+    	IProject p = ResourcesPlugin.getWorkspace().getRoot().getProject("pEAR");
+    	if( p != null && p.exists()) {
+    		try {
+	    		IVirtualComponent vc = ComponentCore.createComponent(p);
+	    		addArchiveComponent(vc);
+	    		// now verify
+	    		IModule module = ServerUtil.getModule(p);
+	    		assertNotNull(module);
+	    		ModuleDelegate md = (ModuleDelegate)module.loadAdapter(ModuleDelegate.class, new NullProgressMonitor());
+	    		IModuleResource[] resources = md.members();
+	    		assertEquals(1, resources.length);
+	    		assertEquals(1, ((IModuleFolder)resources[0]).members().length);
+	    		assertTrue(((IModuleFolder)resources[0]).members()[0] instanceof IModuleFile);
+	    		IModuleFile junitjar = (IModuleFile)((IModuleFolder)resources[0]).members()[0];
+	    		assertEquals("junit.jar", junitjar.getName());
+    		} catch( CoreException ce ) {
+    			ce.printStackTrace();
+    		}
+    	}
+    }
+    
+    public void testEAR50_NestedUtil_WithVariableReference() throws Exception{
+    	IDataModel dm = getEARDataModel("zEAR", "zContent", null, null, JavaEEFacetConstants.EAR_5, false);
+    	OperationTestCase.runAndVerify(dm);
+    	IProject earProj = ResourcesPlugin.getWorkspace().getRoot().getProject("zEAR");
+    	
+    	IDataModel dm2 = getUtilityProjectCreationDataModel("nestedUtil", "zEAR");
+    	OperationTestCase.runAndVerify(dm2);
+    	IProject utilProj = ResourcesPlugin.getWorkspace().getRoot().getProject("nestedUtil");
+
+		IVirtualComponent vc = ComponentCore.createComponent(utilProj);
+		addArchiveComponent(vc);
+
+		IModule module = ServerUtil.getModule(utilProj);
+		assertNotNull(module);
+		ModuleDelegate md = (ModuleDelegate)module.loadAdapter(ModuleDelegate.class, new NullProgressMonitor());
+		IModuleResource[] resources = md.members();
+		
+		// ensure a 'lib' is found
+		IModuleResource lib = null;
+		for( int i = 0; i < resources.length; i++ ) {
+			if( resources[i].getName().equals("lib")) {
+				lib = resources[i];
+				break;
+			}
+		}
+		assertNotNull(lib);
+		assertTrue(lib instanceof IModuleFolder);
+		IModuleResource[] libs = ((IModuleFolder)lib).members();
+		assertNotNull(libs);
+		assertTrue(libs.length == 1);
+		assertTrue(libs[0] instanceof IModuleFile);
+		IModuleFile junitjar = (IModuleFile)libs[0];
+		assertEquals("junit.jar", junitjar.getName());
+    }
+    
+    /**
+     * Creates and returns a utility project DM provider with the given name and of the given version.
+     * If earName is not null then util project will be added to the EAR with earName
+     * 
+     * @param projName name of the project to create
+     * @param earName name of the ear to add the project too, if NULL then don't add to an EAR
+     * @param version version of Application Client to use
+     * @return a Utility Project Data Model with the appropriate properties set
+     */
+    public static IDataModel getUtilityProjectCreationDataModel(String projName, String earName){
+    	IDataModel dm = DataModelFactory.createDataModel(new JavaUtilityProjectCreationDataModelProvider());
+    	dm.setProperty(IJavaUtilityProjectCreationDataModelProperties.PROJECT_NAME, projName);
+    	dm.setProperty(IJavaUtilityProjectCreationDataModelProperties.SOURCE_FOLDER, "src");
+    	if(earName != null) {
+    		dm.setProperty(IJavaUtilityProjectCreationDataModelProperties.EAR_PROJECT_NAME, earName);
+    	} 
+    	return dm;
+    }
+
+    public void testEAR_HardDeploymentMapping() throws Exception {
+    	IDataModel dm = getEARDataModel("hardEAR", "ourContent", null, null, JavaEEFacetConstants.EAR_5, false);
+    	OperationTestCase.runAndVerify(dm);
+    	IProject p = ResourcesPlugin.getWorkspace().getRoot().getProject("hardEAR");
+    	IFolder f = p.getFolder("test");
+    	f.create(true, true, new NullProgressMonitor());
+    	IFile file = f.getFile("silly.txt");
+    	file.create(new ByteArrayInputStream("Silly String".getBytes()), true, new NullProgressMonitor());
+    	
+    	IVirtualComponent earComp = ComponentCore.createComponent(p);
+    	IVirtualFolder rootFolder = earComp.getRootFolder();
+    	IVirtualFile vfile = rootFolder.getFile(new Path("out/notsilly.txt"));
+    	vfile.createLink(new Path("test/silly.txt"), 0, new NullProgressMonitor());
+    	
+		IModule module = ServerUtil.getModule(p);
+		assertNotNull(module);
+		ModuleDelegate md = (ModuleDelegate)module.loadAdapter(ModuleDelegate.class, new NullProgressMonitor());
+		IModuleResource[] resources = md.members();
+    	assertTrue(resources.length == 1);
+    	assertTrue(resources[0].getName().equals("out"));
+    	IModuleFolder mf = (IModuleFolder)resources[0];
+    	IModuleResource[] children = mf.members();
+    	assertTrue(children.length == 1);
+    	assertTrue(children[0].getName().equals("notsilly.txt"));
+    }
+    
+    public void testEARWithJarInLibFolder() throws Exception {
+    	IDataModel dm = getEARDataModel("qEAR", "ourContent", null, null, JavaEEFacetConstants.EAR_5, false);
+    	OperationTestCase.runAndVerify(dm);
+    	IProject p = ResourcesPlugin.getWorkspace().getRoot().getProject("qEAR");
+    	IFolder folder = p.getFolder("ourContent/lib");
+    	folder.create(true, true, null);
+    	IFile file = folder.getFile("test1.jar");
+    	file.create(new FileInputStream(ClasspathDependencyTestUtil.TEST1_JAR_PATH.toFile()), 0, new NullProgressMonitor());
+		IModule module = ServerUtil.getModule(p);
+		ModuleDelegate md = (ModuleDelegate)module.loadAdapter(ModuleDelegate.class, new NullProgressMonitor());
+		IModuleResource[] resources = md.members();
+		assertEquals(1, resources.length);
+		assertEquals("lib", resources[0].getName());
+		assertTrue(resources[0] instanceof IModuleFolder);
+		IModuleResource[] children =((IModuleFolder)resources[0]).members(); 
+		assertEquals(1, children.length);
+		assertEquals("test1.jar", children[0].getName());
+    }
+
+    public void testEARWithClasspathContainerReference() throws Exception {
+    	// Find the junit jar
+		ClasspathContainerInitializer initializer= JavaCore.getClasspathContainerInitializer(JavaCore.USER_LIBRARY_CONTAINER_ID);
+		IPath path = new Path("JUNIT_HOME/junit.jar"); //$NON-NLS-1$
+		IPath resolvedPath = JavaCore.getResolvedVariablePath(path);
+		
+		// Make a new user library a999 referencing this jar
+		IClasspathEntry junitEntry = JavaCore.newLibraryEntry(resolvedPath, null, null);
+		JavaModelManager.getUserLibraryManager().setUserLibrary("a999", new IClasspathEntry[]{junitEntry}, false);
+		String containerPath = JavaCore.USER_LIBRARY_CONTAINER_ID + "/a999";
+		
+		// Make an EAR project
+    	IDataModel dm = getEARDataModel("rEAR", "ourContent", null, null, JavaEEFacetConstants.EAR_5, false);
+    	OperationTestCase.runAndVerify(dm);
+    	IProject rootProj = ResourcesPlugin.getWorkspace().getRoot().getProject("rEAR");
+    	final IVirtualComponent rootComp = ComponentCore.createComponent(rootProj);
+    	
+    	// Add a classpath container reference
+    	IVirtualComponent classpathContainerComp = new ClasspathContainerVirtualComponent(rootProj, rootComp, containerPath);
+		final VirtualReference ref = new VirtualReference(rootComp, classpathContainerComp, new Path("/testFolder").makeAbsolute());
+		ref.setDependencyType(IVirtualReference.DEPENDENCY_TYPE_CONSUMES);
+		IWorkspaceRunnable runnable = new IWorkspaceRunnable(){
+			public void run(IProgressMonitor monitor) throws CoreException{
+				IDataModelProvider provider = new AddReferenceToEnterpriseApplicationDataModelProvider();
+				IDataModel dm = DataModelFactory.createDataModel(provider);
+				dm.setProperty(IAddReferenceDataModelProperties.SOURCE_COMPONENT, rootComp);
+				dm.setProperty(IAddReferenceDataModelProperties.TARGET_REFERENCE_LIST, Arrays.asList(ref));
+				
+				IStatus stat = dm.validateProperty(IAddReferenceDataModelProperties.TARGET_REFERENCE_LIST);
+				if (!stat.isOK())
+					throw new CoreException(stat);
+				try {
+					dm.getDefaultOperation().execute(new NullProgressMonitor(), null);
+				} catch (ExecutionException e) {
+					throw new CoreException(new Status(IStatus.ERROR, "blah", "error", e));
+				}	
+			}
+		};
+		try {
+			ResourcesPlugin.getWorkspace().run(runnable, new NullProgressMonitor());
+		} catch( CoreException e ) {
+			e.printStackTrace();
+			fail();
+		}
+		
+		// Verify module stuff!
+		IModule module = ServerUtil.getModule(rootProj);
+		ModuleDelegate delegate = (ModuleDelegate)module.loadAdapter(ModuleDelegate.class, new NullProgressMonitor());
+		IModuleResource[] resources = delegate.members();
+		assertTrue(resources.length == 1);
+		assertTrue(resources[0] instanceof IModuleFolder);
+		assertTrue(resources[0].getName().equals("testFolder"));
+		assertTrue(((IModuleFolder)resources[0]).members().length == 1);
+		assertTrue(((IModuleFolder)resources[0]).members()[0] instanceof IModuleFile);
+		assertTrue(((IModuleFolder)resources[0]).members()[0].getName().equals("junit.jar"));
+    }
+
+    public void addArchiveComponent(IVirtualComponent component) throws CoreException {
+		
+		IPath path = new Path("JUNIT_HOME/junit.jar"); //$NON-NLS-1$
+		IPath resolvedPath = JavaCore.getResolvedVariablePath(path);
+//		java.io.File file = new java.io.File(resolvedPath.toOSString());
+//		if( file.isFile() && file.exists()){
+			String type = VirtualArchiveComponent.VARARCHIVETYPE + IPath.SEPARATOR;
+			IVirtualComponent archive = ComponentCore.createArchiveComponent( component.getProject(), type +
+					path.toString());
+			IDataModelProvider provider = new AddComponentToEnterpriseApplicationDataModelProvider();
+			IDataModel dm = DataModelFactory.createDataModel(provider);
+			dm.setProperty(ICreateReferenceComponentsDataModelProperties.SOURCE_COMPONENT, component);
+			dm.setProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENT_LIST, Arrays.asList(archive));
+			Map<IVirtualComponent, String> uriMap = new HashMap<IVirtualComponent, String>();
+			uriMap.put(archive, "junit.jar");
+			dm.setProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENTS_TO_URI_MAP, uriMap);
+	        dm.setProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENTS_DEPLOY_PATH, "/lib");
+			IStatus stat = dm.validateProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENT_LIST);
+			if (!stat.isOK())
+				throw new CoreException(stat);
+			try {
+				dm.getDefaultOperation().execute(new NullProgressMonitor(), null);
+			} catch (ExecutionException e) {
+				throw new CoreException(new Status(IStatus.ERROR, "test", e.getMessage()));
+			}	
+
+//		}
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/ejb/operations/AddEJBeanOperationTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/ejb/operations/AddEJBeanOperationTest.java
new file mode 100644
index 0000000..fa08bc1
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/ejb/operations/AddEJBeanOperationTest.java
@@ -0,0 +1,240 @@
+package org.eclipse.wtp.j2ee.headless.tests.ejb.operations;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.Preferences;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
+import org.eclipse.jst.j2ee.ejb.internal.operations.AddEjbTimerDataModelProvider;
+import org.eclipse.jst.j2ee.ejb.internal.operations.INewSessionBeanClassDataModelProperties;
+import org.eclipse.jst.j2ee.ejb.internal.operations.NewMessageDrivenBeanClassDataModelProvider;
+import org.eclipse.jst.j2ee.ejb.internal.operations.NewSessionBeanClassDataModelProvider;
+import org.eclipse.jst.j2ee.internal.common.operations.INewJavaClassDataModelProperties;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
+import org.eclipse.wst.common.tests.OperationTestCase;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.JavaEEFacetConstants;
+
+public class AddEJBeanOperationTest extends OperationTestCase implements
+		INewJavaClassDataModelProperties {
+	
+	public static final String EJB_PROJECT_NAME = "EjbProject"; //$NON-NLS-1$
+    public static final String PACKAGE = "test"; //$NON-NLS-1$
+    
+    public static final String SESSION_BEAN_NAME = "TestSessionBean"; //$NON-NLS-1$
+    public static final String SESSION_BEAN_CLASS_NAME = PACKAGE + "." + SESSION_BEAN_NAME; //$NON-NLS-1$
+    public static final String SESSION_BEAN_LOCAL_NAME = SESSION_BEAN_NAME + "Local"; //$NON-NLS-1$
+    public static final String SESSION_BEAN_LOCAL_CLASS_NAME = PACKAGE + "." + SESSION_BEAN_LOCAL_NAME; //$NON-NLS-1$
+    
+    public static final String MESSAGE_DRIVEN_BEAN_NAME = "TestMDBean"; //$NON-NLS-1$
+    public static final String MESSAGE_DRIVEN_BEAN_CLASS_NAME = PACKAGE + "." + MESSAGE_DRIVEN_BEAN_NAME; //$NON-NLS-1$
+    
+    public static final String ASYNCHRONOUS = "@Asynchronous"; //$NON-NLS-1$
+    public static final String ASYNC_WAS_NOT_EXPECTED = "The @Asynchronous was not expected"; //$NON-NLS-1$
+	public static final String ASYNC_EJB_REGEX = ".*(@Asynchronous\\s){1}(@.*\\s)*(public class){1}.*"; //$NON-NLS-1$
+	public static final String ASYNC_WAS_EXPECTED = "The @Asynchronous was expected"; //$NON-NLS-1$
+	public static final String EJB_WITHOUT_ASYNC = "EjbWithooutAsync"; //$NON-NLS-1$
+	public static final String EJB_WITH_ASYNC = "EjbWithAsync"; //$NON-NLS-1$
+	public static final String EJB_WITHOUT_ASYNC_CLASS_NAME = PACKAGE + "." + EJB_WITHOUT_ASYNC; //$NON-NLS-1$
+	public static final String EJB_WITH_ASYNC_CLASS_NAME = PACKAGE + "." + EJB_WITH_ASYNC; //$NON-NLS-1$
+
+    public static final String TIMER_PERSISTENT_CONFIG_EXPECTED = "EJB Timer persistent configuration was expected"; //$NON-NLS-1$
+	public static final String TIMER_NON_PERSISTENT_CONFIG_EXPECTED = "EJB Timer Non-persistent configuration was expected"; //$NON-NLS-1$
+	public static final String NON_PERSISTENT_TIMER_REGEX = "@Schedule\\s*\\(.*\\s.*persistent\\s*=\\s*false\\)";
+	public static final String NON_PERSISTENT_EJB_TIMER = "NonPersistentEjbTimer"; //$NON-NLS-1$
+	public static final String PERSISTENT_EJB_TIMER = "PersistentEjbTimer"; //$NON-NLS-1$
+    public static final String NON_PERSISTENT_EJB_TIMER_CLASS_NAME = PACKAGE + "." + NON_PERSISTENT_EJB_TIMER; //$NON-NLS-1$
+    public static final String PERSISTENT_EJB_TIMER_CLASS_NAME = PACKAGE + "." + PERSISTENT_EJB_TIMER; //$NON-NLS-1$
+    
+	public AddEJBeanOperationTest() {
+		super();
+	}
+	
+	public AddEJBeanOperationTest(String name) {
+		super(name);
+	}
+	
+	public static Test suite() {
+        return new TestSuite(AddEJBeanOperationTest.class);
+    }
+	
+	public void testAddSessionBean_EJB30_Defaults_NoJETEmitter() throws Exception {
+		disableJETEmitter();
+		testAddSessionBean_EJB30_Defaults();
+		enableJETEmitter();
+	}
+	
+	public void testAddSessionBean_EJB30_Defaults() throws Exception {
+    	createEJBProject(EJB_PROJECT_NAME, JavaEEFacetConstants.EJB_3);
+    	IProject proj = ProjectUtilities.getProject(EJB_PROJECT_NAME);
+
+    	addSessionBean_Defaults();
+
+		assertJavaFileExists(SESSION_BEAN_CLASS_NAME);
+		assertJavaFileExists(SESSION_BEAN_LOCAL_CLASS_NAME);
+    	
+    	// no EJB3 annotation model to check yet
+    }
+	
+	/**
+	 * Verifies the @Asynchronous annotation be added properly.
+	 * @throws Exception
+	 */
+	public void testAddSessionBean_EJB31_Asynchronous() throws Exception {
+    	createEJBProject(EJB_PROJECT_NAME, JavaEEFacetConstants.EJB_31);
+    	
+    	addSessionBeanWithAync(EJB_WITH_ASYNC, true);
+    	addSessionBeanWithAync(EJB_WITHOUT_ASYNC, false);
+
+		assertTrue(ASYNC_WAS_EXPECTED, contains(EJB_WITH_ASYNC_CLASS_NAME, ASYNC_EJB_REGEX));
+		assertFalse(ASYNC_WAS_NOT_EXPECTED, contains(EJB_WITHOUT_ASYNC_CLASS_NAME, ASYNCHRONOUS));
+    }
+	
+	
+	/**
+	 * Verifies the EJB Timer be generated properly with the @Schedule annotation with
+	 * the attribute persistent set to false, when the Timer is Non-persistent.
+	 * @throws Exception
+	 */
+	public void testAddEjbTimer_EJB31() throws Exception{
+		createEJBProject(EJB_PROJECT_NAME, JavaEEFacetConstants.EJB_31);
+
+		addEjbTimer(PERSISTENT_EJB_TIMER, false);    
+    	addEjbTimer(NON_PERSISTENT_EJB_TIMER, true); 
+    	
+    	assertFalse(TIMER_PERSISTENT_CONFIG_EXPECTED, contains(PERSISTENT_EJB_TIMER_CLASS_NAME, NON_PERSISTENT_TIMER_REGEX));
+    	assertTrue(TIMER_NON_PERSISTENT_CONFIG_EXPECTED, contains(NON_PERSISTENT_EJB_TIMER_CLASS_NAME, NON_PERSISTENT_TIMER_REGEX));
+	}
+	
+	public void testAddMessageDrivenBean_EJB30_Defaults_NoJETEmitter() throws Exception {
+		disableJETEmitter();
+		testAddMessageDrivenBean_EJB30_Defaults();
+		enableJETEmitter();
+	}
+	
+	public void testAddMessageDrivenBean_EJB30_Defaults() throws Exception {
+    	createEJBProject(EJB_PROJECT_NAME, JavaEEFacetConstants.EJB_3);
+    	IProject proj = ProjectUtilities.getProject(EJB_PROJECT_NAME);
+
+    	addMessageDrivenBean_Defaults();
+
+		assertJavaFileExists(MESSAGE_DRIVEN_BEAN_CLASS_NAME);
+    	
+    	// no EJB3 annotation model to check yet
+    }
+
+	@Override
+	protected void tearDown() throws Exception {
+		// uncomment the below line if you want to dump a check whether the
+		// .JETEmitters projects is created as a result of the executed
+		// operation
+//		System.out.println(".JETEmitters exists : "
+//				+ ResourcesPlugin.getWorkspace().getRoot().getProject(
+//						WTPJETEmitter.PROJECT_NAME).exists());
+		super.tearDown();
+	}
+
+    private void enableJETEmitter() {
+    	Preferences preferences = J2EEPlugin.getDefault().getPluginPreferences();
+		preferences.setValue(J2EEPlugin.DYNAMIC_TRANSLATION_OF_JET_TEMPLATES_PREF_KEY, true);
+	}
+
+	private void disableJETEmitter() {
+		Preferences preferences = J2EEPlugin.getDefault().getPluginPreferences();
+		preferences.setValue(J2EEPlugin.DYNAMIC_TRANSLATION_OF_JET_TEMPLATES_PREF_KEY, false);
+	}
+	
+	private void createEJBProject(String projectName, IProjectFacetVersion version) throws Exception {
+    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel(
+				projectName, null, null, null, version, false);
+    	runAndVerify(dm);
+    }
+	
+	private void addSessionBean_Defaults() throws Exception {
+    	IDataModel dm = DataModelFactory.createDataModel(NewSessionBeanClassDataModelProvider.class);
+    	dm.setProperty(PROJECT_NAME, EJB_PROJECT_NAME);
+    	dm.setProperty(JAVA_PACKAGE, PACKAGE);
+    	dm.setProperty(CLASS_NAME, SESSION_BEAN_NAME);
+        runAndVerify(dm);
+    }
+	
+	private void addSessionBeanWithAync(String ejbName, boolean async) throws Exception {
+    	IDataModel dm = DataModelFactory.createDataModel(NewSessionBeanClassDataModelProvider.class);
+    	dm.setProperty(PROJECT_NAME, EJB_PROJECT_NAME);
+    	dm.setProperty(JAVA_PACKAGE, PACKAGE);
+    	dm.setProperty(CLASS_NAME, ejbName);
+    	dm.setBooleanProperty(INewSessionBeanClassDataModelProperties.ASYNC, async);
+        runAndVerify(dm);
+	}
+	
+	/**
+	 * Creates an EJB Timer.
+	 * @param ejbTimerName name of the EJB Timer.
+	 * @param persistent, <em>Boolean</em> indicating the nature of the timer, <em>null<em> for default, 
+	 * <em>false</em> for Non-persistent or <em>true</em> for persistent.  
+	 * @throws Exception
+	 */
+	private void addEjbTimer(String ejbTimerName, boolean persistent) throws Exception {
+		AddEjbTimerDataModelProvider ejbTimerModel = new AddEjbTimerDataModelProvider();
+		IDataModel dm = DataModelFactory.createDataModel(ejbTimerModel);
+		dm.setProperty(PROJECT_NAME, EJB_PROJECT_NAME);
+    	dm.setProperty(JAVA_PACKAGE, PACKAGE);
+    	dm.setProperty(CLASS_NAME, ejbTimerName);
+    	dm.setBooleanProperty(AddEjbTimerDataModelProvider.NON_PERSISTENT, persistent);
+    	
+    	runAndVerify(dm);
+	}
+	
+	private void addMessageDrivenBean_Defaults() throws Exception {
+    	IDataModel dm = DataModelFactory.createDataModel(NewMessageDrivenBeanClassDataModelProvider.class);
+    	dm.setProperty(PROJECT_NAME, EJB_PROJECT_NAME);
+    	dm.setProperty(JAVA_PACKAGE, PACKAGE);
+    	dm.setProperty(CLASS_NAME, MESSAGE_DRIVEN_BEAN_NAME);
+        runAndVerify(dm);
+    }
+    
+    private IFile assertJavaFileExists(String fullyQualifiedName) throws JavaModelException {
+		IJavaProject javaProject = JavaCore.create(
+				ResourcesPlugin.getWorkspace().getRoot())
+				.getJavaModel().getJavaProject(EJB_PROJECT_NAME);
+		assertNotNull("Java project " + EJB_PROJECT_NAME + " not found", javaProject);
+		IType type = javaProject.findType(fullyQualifiedName);
+		assertNotNull("Java type " + fullyQualifiedName + " not found", type);
+		IFile file = (IFile) type.getResource();
+		assertNotNull("Source file for Java type " + fullyQualifiedName + " not found", file);
+		assertTrue(file.exists());
+		return file;
+    }
+    
+    private boolean contains(String fullyQualifiedName, String regex) throws CoreException, IOException {
+    	IFile file = assertJavaFileExists(fullyQualifiedName);
+		BufferedReader bReader = new BufferedReader(new InputStreamReader(file.getContents()));
+		StringBuilder sb = new StringBuilder();
+		String line;
+		while ((line = bReader.readLine()) != null) {
+	           sb.append(line).append(System.getProperty("line.separator")); //$NON-NLS-1$
+	    }
+		bReader.close();
+		System.out.println(sb);
+		Matcher matcher = Pattern.compile(regex).matcher(sb);
+		
+		return matcher.find();
+    }
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/ejb/operations/AllTests.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/ejb/operations/AllTests.java
new file mode 100644
index 0000000..710ba70
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/ejb/operations/AllTests.java
@@ -0,0 +1,36 @@
+/*
+ * Created on Feb 2, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package org.eclipse.wtp.j2ee.headless.tests.ejb.operations;
+
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.jst.j2ee.flexible.project.fvtests.EJBDeployTest;
+
+/**
+ * @author jsholl
+ *
+ * To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+public class AllTests extends TestSuite {
+
+    public static Test suite(){
+        return new AllTests();
+    }
+    
+    public AllTests(){
+        super("EJB Operation Tests");
+        addTest(EJBExportOperationTest.suite());
+        addTest(EJBImportOperationTest.suite());
+        addTest(EJBProjectCreationOperationTest.suite());
+        addTest(AddEJBeanOperationTest.suite());
+        addTest(EJBDeployTest.suite());
+    }
+    
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/ejb/operations/EJBExportOperationTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/ejb/operations/EJBExportOperationTest.java
new file mode 100644
index 0000000..478e19a
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/ejb/operations/EJBExportOperationTest.java
@@ -0,0 +1,388 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ * Created on Jan 6, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package org.eclipse.wtp.j2ee.headless.tests.ejb.operations;
+
+import junit.framework.Test;
+
+import org.eclipse.jst.j2ee.datamodel.properties.IJ2EEComponentExportDataModelProperties;
+import org.eclipse.jst.j2ee.internal.ejb.project.operations.EJBComponentExportDataModelProvider;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.tests.SimpleTestSuite;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.JavaEEFacetConstants;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.JavaFileTestingUtilities;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleExportOperationTest;
+
+/**
+ * @author Administrator
+ * @author Ian Tewksbury (ictewksb@us.ibm.com)
+ *
+ * To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+public class EJBExportOperationTest extends ModuleExportOperationTest {  
+	public EJBExportOperationTest() {
+		super("EJBExportOperationTests");
+	}
+	
+	public EJBExportOperationTest(String name) {
+		super(name);
+	}
+	
+	public static Test suite() {
+		return new SimpleTestSuite(EJBExportOperationTest.class);
+	}
+	
+	public void testEJBExport11_Defaults() throws Exception {
+    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("insaneEJB", null, null, null, JavaEEFacetConstants.EJB_11, true);
+    	runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    public void testEJBExport20_Defaults() throws Exception {
+    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("fooEJB", null, null, null, JavaEEFacetConstants.EJB_2, true);
+    	runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    public void testEJBExport21_Defaults() throws Exception {
+    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("barEJB", null, null, null, JavaEEFacetConstants.EJB_21, true);
+    	runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    //TODO
+    //NOT sure why, but the annotated beans are not being compiled correctly
+    //so that during validation, their annotations are not read, and this test fails
+    /*
+    public void testEJBExport30_Defaults() throws Exception {
+    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("penEJB", null, null, null, JavaEEFacetConstants.EJB_3, false);
+    	runDataModel(dm);
+    	addStateless(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    */
+    
+    private void addStateless(IDataModel dm) throws Exception {
+    	String projectName = dm.getStringProperty(IFacetProjectCreationDataModelProperties.FACET_PROJECT_NAME);
+		String packageName = "test";
+		String className = "AnnotatedStateless";
+		String classContents = "package test;\n\nimport javax.ejb.Stateless;\n\n@Stateless\npublic class AnnotatedStateless {\n\n}";
+		JavaFileTestingUtilities.addJavaFileToEJB(projectName, className, packageName, classContents);
+	}
+
+	public void testEJBExport11_AddToEAR_Defaults() throws Exception {
+    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("testEJB", null, null, "testEAR", JavaEEFacetConstants.EJB_11, true);
+    	runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    public void testEJBExport20_AddToEAR_Defaults() throws Exception {
+    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("coolEJB", null, null, "booEAR", JavaEEFacetConstants.EJB_2, true);
+    	runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    public void testEJBExport21_AddToEAR_Defaults() throws Exception {
+    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("crazyEJB", null, null, "starEAR", JavaEEFacetConstants.EJB_21, true);
+    	runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    //TODO
+    //NOT sure why, but the annotated beans are not being compiled correctly
+    //so that during validation, their annotations are not read, and this test fails
+    /*
+    public void testEJBExport30_AddToEAR_Defaults() throws Exception {
+    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("netoEJB", null, null, "myEAR", JavaEEFacetConstants.EJB_3, false);
+    	runDataModel(dm);
+    	addStateless(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    */
+    
+    
+    public void testEJBExport11_AddToEAR_NoClient() throws Exception {
+    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("testEJB", null, null, "testEAR", JavaEEFacetConstants.EJB_11, false, true);
+    	runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    public void testEJBExport20_AddToEAR_NoClient() throws Exception {
+    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("coolEJB", null, null, "booEAR", JavaEEFacetConstants.EJB_2, false, true);
+    	runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    public void testEJBExport21_AddToEAR_NoClient() throws Exception {
+    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("crazyEJB", null, null, "starEAR", JavaEEFacetConstants.EJB_21, false, true);
+    	runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    //TODO
+    //NOT sure why, but the annotated beans are not being compiled correctly
+    //so that during validation, their annotations are not read, and this test fails
+    /*
+    public void testEJBExport30_AddToEAR_NoClient() throws Exception {
+    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("netoEJB", null, null, "myEAR", JavaEEFacetConstants.EJB_3, false, false);
+    	runDataModel(dm);
+    	addStateless(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    */
+    
+    
+    public void testEJBExport11_AddToEAR_ChangedEJBClientName() throws Exception {
+    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("fooBarEJB", "testEJBExportClient", null, "theirEAR", JavaEEFacetConstants.EJB_11, true);
+    	runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    public void testEJBExport20_AddToEAR_ChangedEJBClientName() throws Exception {
+    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("saneEJB", "coolEJBClient", null, "yourEAR", JavaEEFacetConstants.EJB_2, true);
+    	runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    public void testEJBExport21_AddToEAR_ChangedEJBClientName() throws Exception {
+    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("clipEJB", "crazyEJBClient", null, "ourEAR", JavaEEFacetConstants.EJB_21, true);
+    	runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    //TODO
+    //NOT sure why, but the annotated beans are not being compiled correctly
+    //so that during validation, their annotations are not read, and this test fails
+    /*
+    public void testEJBExport30_AddToEAR_ChangedEJBClientName() throws Exception {
+    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("phoneEJB", "netoEJBClient", null, "waterEAR", JavaEEFacetConstants.EJB_3, false);
+    	runDataModel(dm);
+    	addStateless(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    */
+    
+    public void testEJBExport11_AddToEAR_ChangedClientSourceFolder() throws Exception {
+    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("cupEJB", null, "src", "openEAR", JavaEEFacetConstants.EJB_11, true);
+    	runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    public void testEJBExport20_AddToEAR_ChangedClientSourceFolder() throws Exception {
+    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("mouseEJB", null, "files", "closedEAR", JavaEEFacetConstants.EJB_2, true);
+    	runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    public void testEJBExport21_AddToEAR_ChangedClientSourceFolder() throws Exception {
+    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("pcEJB", null, "stuff", "batEAR", JavaEEFacetConstants.EJB_21, true);
+    	runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    //TODO
+    //NOT sure why, but the annotated beans are not being compiled correctly
+    //so that during validation, their annotations are not read, and this test fails
+    /*
+    public void testEJBExport30_AddToEAR_ChangedClientSourceFolder() throws Exception {
+    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("keyEJB", null, "foo", "keyEAR", JavaEEFacetConstants.EJB_3, false);
+    	runDataModel(dm);
+    	addStateless(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    */
+    
+    public void testEJBExport11A_ddToEAR_ChangedEJBClientName_ChangedClientSourceFolder() throws Exception {
+    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("cupEJB", "superClient", "src", "openEAR", JavaEEFacetConstants.EJB_11, true);
+    	runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    public void testEJBExport20_AddToEAR_ChangedEJBClientName_ChangedClientSourceFolder() throws Exception {
+    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("mouseEJB", "dudeClient", "files", "closedEAR", JavaEEFacetConstants.EJB_2, true);
+    	runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    public void testEJBExport21_AddToEAR_ChangedEJB_ClientNameChangedClientSourceFolder() throws Exception {
+    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("pcEJB", "fireClient", "stuff", "batEAR", JavaEEFacetConstants.EJB_21, true);
+    	runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    //TODO
+    //NOT sure why, but the annotated beans are not being compiled correctly
+    //so that during validation, their annotations are not read, and this test fails
+    /*
+    public void testEJBExport30_AddToEARChangedEJB_ClientName_ChangedClientSourceFolder() throws Exception {
+    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("keyEJB", "wireClient", "foo", "keyEAR", JavaEEFacetConstants.EJB_3, false);
+    	runDataModel(dm);
+    	addStateless(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    */
+    
+    public void testEJBExport30_Defaults_WithDD() throws Exception {
+    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("tigerEJB", null, null, null, JavaEEFacetConstants.EJB_3, true);
+    	runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    public void testEJBExport31_Defaults_WithDD() throws Exception {
+    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("EE6tigerEJB", null, null, null, JavaEEFacetConstants.EJB_31, true);
+    	runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    public void testEJBExport30_AddToEAR_Defaults_WithDD() throws Exception {
+    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("pandaEJB", null, null, "roundEAR", JavaEEFacetConstants.EJB_3, true);
+    	runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    public void testEJBExport31_AddToEAR_Defaults_WithDD() throws Exception {
+    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("EE6pandaEJB", null, null, "EE6roundEAR", JavaEEFacetConstants.EJB_31, true);
+    	runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    public void testEJBExport30_AddToEAR_NoClient_WithDD() throws Exception {
+    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("netoEJB", null, null, "myEAR", JavaEEFacetConstants.EJB_3, false, true);
+    	runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    public void testEJBExport31_AddToEAR_NoClient_WithDD() throws Exception {
+    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("EE6netoEJB", null, null, "EE6myEAR", JavaEEFacetConstants.EJB_31, false, true);
+    	runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+
+    public void testEJBExport30_AddToEAR_ChangedEJBClientName_WithDD() throws Exception {
+    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("snakeEJB", "client", null, "groundEAR", JavaEEFacetConstants.EJB_3, true);
+    	runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    public void testEJBExport31_AddToEAR_ChangedEJBClientName_WithDD() throws Exception {
+    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("EE6snakeEJB", "EE6client", null, "EE6groundEAR", JavaEEFacetConstants.EJB_31, true);
+    	runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+
+    public void testEJBExport30_AddToEAR_ChangedClientSourceFolder_WithDD() throws Exception {
+    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("lionEJB", null, "barSrc", "pinEAR", JavaEEFacetConstants.EJB_3, true);
+    	runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    public void testEJBExport31_AddToEAR_ChangedClientSourceFolder_WithDD() throws Exception {
+    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("EE6lionEJB", null, "EE6barSrc", "EE6pinEAR", JavaEEFacetConstants.EJB_31, true);
+    	runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    public void testEJBExport30_AddToEAR_ChangedEJBClientName_ChangedClientSourceFolder_WithDD() throws Exception {
+    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("monkeyEJB", "fooFooClient", "fooSrc", "outsideEAR", JavaEEFacetConstants.EJB_3, true);
+    	runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    public void testEJBExport31_AddToEAR_ChangedEJBClientName_ChangedClientSourceFolder_WithDD() throws Exception {
+    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("EE6monkeyEJB", "EE6fooFooClient", "EE6fooSrc", "EE6outsideEAR", JavaEEFacetConstants.EJB_31, true);
+    	runDataModel(dm);
+    	
+    	runExportTests_All(dm);
+    }
+
+    @Override
+    protected String getModuleExtension() {
+    	return ".jar";
+    }
+
+	@Override
+	protected IDataModel getExportDataModel(String projectName, String destination, boolean exportSource, boolean runBuild, boolean overwriteExisting) {
+		return getEJBExportDataModel(projectName, destination, exportSource, runBuild, overwriteExisting);
+	}
+	
+    /**
+     * @param projectName name of the project to export
+     * @param destination destination to export to
+     * @param exportSource if TRUE export source files, else don't
+     * @param runBuild if TRUE run a build before exporting, else don't
+     * @param overwriteExisting if TRUE overwrite existing files, else don't
+     * @return an EJBComponentExport data model with all of the given settings.
+     */
+    public static IDataModel getEJBExportDataModel(String projectName, String destination, boolean exportSource, boolean runBuild, boolean overwriteExisting){
+    	IDataModel exportModel = DataModelFactory.createDataModel(new EJBComponentExportDataModelProvider());
+    	
+		exportModel.setProperty(IJ2EEComponentExportDataModelProperties.PROJECT_NAME, projectName);
+		exportModel.setProperty(IJ2EEComponentExportDataModelProperties.ARCHIVE_DESTINATION, destination);
+		exportModel.setProperty(IJ2EEComponentExportDataModelProperties.EXPORT_SOURCE_FILES, exportSource);
+		exportModel.setProperty(IJ2EEComponentExportDataModelProperties.OVERWRITE_EXISTING, overwriteExisting);
+		exportModel.setProperty(IJ2EEComponentExportDataModelProperties.RUN_BUILD, runBuild);
+		
+		return exportModel;
+    }
+    
+    @Override
+    protected void addJavaFilesToProject(String projectName, String[] classNames, String prackageName) throws Exception {
+    	JavaFileTestingUtilities.addJavaFilesToEJB(projectName, classNames, prackageName);
+    }
+    
+    @Override
+    protected void verifyJavaFilesExported(String archiveName, String[] classNames, String packageName, boolean withClassFiles, boolean withSource) throws Exception {
+    	JavaFileTestingUtilities.verifyJavaFilesInJAR(archiveName, classNames, packageName, withClassFiles, withSource);
+    }
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/ejb/operations/EJBGeneraUseTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/ejb/operations/EJBGeneraUseTest.java
new file mode 100644
index 0000000..44ba513
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/ejb/operations/EJBGeneraUseTest.java
@@ -0,0 +1,106 @@
+/**
+ * 
+ */
+package org.eclipse.wtp.j2ee.headless.tests.ejb.operations;
+
+import java.io.StringBufferInputStream;
+
+import junit.framework.Assert;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.jst.j2ee.datamodel.properties.IJ2EEComponentExportDataModelProperties;
+import org.eclipse.jst.j2ee.datamodel.properties.IJ2EEComponentImportDataModelProperties;
+import org.eclipse.jst.j2ee.internal.ejb.project.operations.EJBComponentExportDataModelProvider;
+import org.eclipse.jst.j2ee.internal.ejb.project.operations.EJBComponentImportDataModelProvider;
+import org.eclipse.jst.j2ee.internal.ejb.project.operations.EjbFacetProjectCreationDataModelProvider;
+import org.eclipse.wst.common.componentcore.internal.util.ComponentUtilities;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualFile;
+import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.internal.operations.IProjectCreationPropertiesNew;
+import org.eclipse.wst.common.tests.OperationTestCase;
+
+/**
+ * @author Ian Tewksbury (ictewksb@us.ibm.com)
+ *
+ */
+public class EJBGeneraUseTest extends OperationTestCase {
+	private static String BASE_DATA_DIR = System.getProperty("user.dir") + java.io.File.separatorChar + "EJBTests" + java.io.File.separatorChar;
+	private final String EJB_NAME = "TestEJB";
+	private final String EJB_ARCHIVE_NAME = EJB_NAME + ".jar";
+	private final String FILE1 = "Test1.java";
+	
+	/**
+	 * used to get a string representing a path where a file with given suffix can be stored.
+	 * 
+	 * @param suffix the suffix to append to the BASE_DATA_DIR
+	 * @return a string containing the BASE_DATA_DIR appended with the given suffix
+	 */
+	private static String getDataPath(String suffix) {
+		return BASE_DATA_DIR + suffix;
+	}
+	
+	/**
+	 * Test create new EJB project, add file, export, delete project,
+	 * then import and verify.
+	 */
+	public void test_GeneralUse() throws Exception{
+		//create EJB
+		IDataModel model = DataModelFactory.createDataModel(new EjbFacetProjectCreationDataModelProvider());
+		model.setProperty(IProjectCreationPropertiesNew.PROJECT_NAME, this.EJB_NAME);
+		this.runAndVerify(model);
+		
+		//verify EJB exists
+		IVirtualComponent ejb = ComponentUtilities.getComponent(this.EJB_NAME);
+		IProject ejbProject = ejb.getProject();
+		IVirtualFolder ejbRootFolder = ejb.getRootFolder();
+		Assert.assertNotNull("New EJB project named " + this.EJB_NAME + " should exist.", ejb);
+		
+		IWorkspace workspace = ejbProject.getWorkspace();
+		IWorkspaceRoot workspaceRoot = workspace.getRoot();
+		
+		//add a file to the EJB
+		IVirtualFile virtFile = ejbRootFolder.getFile(this.FILE1);
+		IFile file = virtFile.getUnderlyingFile();
+		file.create(new StringBufferInputStream(""),true,null);
+		Assert.assertTrue("The file " + this.FILE1 + " should exsist in the project.", file.exists());
+		
+		//export the EJB
+		model = DataModelFactory.createDataModel(new EJBComponentExportDataModelProvider());
+		model.setProperty(IJ2EEComponentExportDataModelProperties.PROJECT_NAME, ejbProject.getName());
+		model.setProperty(IJ2EEComponentExportDataModelProperties.ARCHIVE_DESTINATION, getDataPath(this.EJB_ARCHIVE_NAME));
+		model.setProperty(IJ2EEComponentExportDataModelProperties.EXPORT_SOURCE_FILES, Boolean.TRUE);
+		this.runAndVerify(model);		
+		
+		//delete the EJB, and verify
+		ejbProject.close(null);
+		ejbProject.delete(IResource.ALWAYS_DELETE_PROJECT_CONTENT, null);
+		Assert.assertNull("The " + this.EJB_NAME + " project should no longer exsist.", ComponentUtilities.getComponent(this.EJB_NAME));
+		ejb = null;
+		ejbProject = null;
+		ejbRootFolder = null;
+		virtFile = null;
+		file = null;
+		ejbProject = workspaceRoot.getProject(this.EJB_NAME);
+		Assert.assertFalse("Project should not exsist.", ejbProject.exists());
+		
+		//import the EJB
+		model = DataModelFactory.createDataModel(new EJBComponentImportDataModelProvider());
+		model.setProperty(IJ2EEComponentImportDataModelProperties.FILE_NAME, getDataPath(this.EJB_ARCHIVE_NAME));
+		model.setProperty(IJ2EEComponentImportDataModelProperties.PROJECT_NAME, this.EJB_NAME);
+		this.runAndVerify(model);
+		
+		//verify the import
+		ejb = ComponentUtilities.getComponent(this.EJB_NAME);
+		Assert.assertNotNull("New EJB project named " + this.EJB_NAME + " should exsist", ejb);
+		ejbRootFolder = ejb.getRootFolder();
+		virtFile = ejbRootFolder.getFile(this.FILE1);
+		Assert.assertTrue("The file " + this.FILE1 + " should exsist in the project.", file.exists());
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/ejb/operations/EJBImportOperationBaseTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/ejb/operations/EJBImportOperationBaseTest.java
new file mode 100644
index 0000000..9c75126
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/ejb/operations/EJBImportOperationBaseTest.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.wtp.j2ee.headless.tests.ejb.operations;
+
+import org.eclipse.jst.j2ee.datamodel.properties.IJ2EEComponentImportDataModelProperties;
+import org.eclipse.jst.j2ee.internal.ejb.project.operations.EJBComponentImportDataModelProvider;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleImportOperationTest;
+
+public class EJBImportOperationBaseTest extends ModuleImportOperationTest{
+	
+	public EJBImportOperationBaseTest() {
+		super("EJBImportOperationBaseTest");
+	}
+	
+	public EJBImportOperationBaseTest(String name) {
+		super(name);
+	}
+	
+	@Override
+	protected String getModuleExtension() {
+		return ".jar";
+	}
+	
+	@Override
+	protected IDataModel getImportDataModel(String filePath, String projectName, IDataModel creationModel, boolean closeArchiveOnDispose) {
+		return getEJBImportDataModel(filePath, projectName, creationModel, closeArchiveOnDispose);
+	}
+	
+    public static IDataModel getEJBImportDataModel(String filePath, String projectName, IDataModel creationModel, boolean closeArchiveOnDispose) {
+    	IDataModel importModel = DataModelFactory.createDataModel(new EJBComponentImportDataModelProvider());
+    	
+    	importModel.setProperty(IJ2EEComponentImportDataModelProperties.FILE_NAME, filePath);
+    	importModel.setProperty(IJ2EEComponentImportDataModelProperties.PROJECT_NAME, projectName);
+    	importModel.setProperty(IJ2EEComponentImportDataModelProperties.CLOSE_ARCHIVE_ON_DISPOSE, closeArchiveOnDispose);
+    	
+    	if(creationModel != null) {
+    		importModel.setProperty(IJ2EEComponentImportDataModelProperties.NESTED_MODEL_J2EE_COMPONENT_CREATION, creationModel);
+    	}
+    	
+    	return importModel;
+    }
+	
+	@Override
+	protected IDataModel getExportDataModel(String projectName, String destination, boolean exportSource, boolean runBuild, boolean overwriteExisting) {
+		return EJBExportOperationTest.getEJBExportDataModel(projectName, destination, exportSource, runBuild, overwriteExisting);
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/ejb/operations/EJBImportOperationTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/ejb/operations/EJBImportOperationTest.java
new file mode 100644
index 0000000..3fc6759
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/ejb/operations/EJBImportOperationTest.java
@@ -0,0 +1,137 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ * Created on Jan 5, 2004
+ * 
+ * To change the template for this generated file go to Window - Preferences - Java - Code
+ * Generation - Code and Comments
+ */
+package org.eclipse.wtp.j2ee.headless.tests.ejb.operations;
+
+import junit.framework.Test;
+
+import org.eclipse.wst.common.tests.SimpleTestSuite;
+
+/**
+ * @author Ian Tewksbury (ictewksb@us.ibm.com)
+ * 
+ * To change the template for this generated type comment go to Window - Preferences - Java - Code
+ * Generation - Code and Comments
+ */
+public class EJBImportOperationTest extends EJBImportOperationBaseTest {
+	public EJBImportOperationTest() {
+		super("EJBImportOperationTests");
+	}
+	
+	public EJBImportOperationTest(String name) {
+		super(name);
+	}
+	
+	public static Test suite() {
+		return new SimpleTestSuite(EJBImportOperationTest.class);
+	}
+	
+	public void testEJBImport11_Defaults() throws Exception {
+		runImportTests_All("EJB11_Defaults");
+    }
+    
+    public void testEJBImport20_Defaults() throws Exception {
+		runImportTests_All("EJB20_Defaults");
+    }
+    
+    public void testEJBImport21_Defaults() throws Exception {
+		runImportTests_All("EJB21_Defaults");
+    }
+    
+    public void testEJBImport11_AddToEAR_Defaults() throws Exception {
+		runImportTests_All("EJB11_AddToEAR_Defaults");
+    }
+    
+    public void testEJBImport20_AddToEAR_Defaults() throws Exception {
+		runImportTests_All("EJB20_AddToEAR_Defaults");
+    }
+    
+    public void testEJBImport21_AddToEAR_Defaults() throws Exception {
+		runImportTests_All("EJB21_AddToEAR_Defaults");
+    }
+      
+    public void testEJBImport11_AddToEAR_NoClient() throws Exception {
+		runImportTests_All("EJB11_AddToEAR_NoClient");
+    }
+    
+    public void testEJBImport20_AddToEAR_NoClient() throws Exception {
+		runImportTests_All("EJB20_AddToEAR_NoClient");
+    }
+    
+    public void testEJBImport21_AddToEAR_NoClient() throws Exception {
+		runImportTests_All("EJB21_AddToEAR_NoClient");
+    }
+    
+    public void testEJBImport11_AddToEAR_DiffClientName() throws Exception {
+		runImportTests_All("EJB11_AddToEAR_DiffClientName");
+    }
+    
+    public void testEJBImport20_AddToEAR_DiffClientName() throws Exception {
+		runImportTests_All("EJB20_AddToEAR_DiffClientName");
+    }
+    
+    public void testEJBImport21_AddToEAR_DiffClientName() throws Exception {
+		runImportTests_All("EJB21_AddToEAR_DiffClientName");
+    }
+    
+    public void testEJBImport11_AddToEAR_DiffClientSourceFolder() throws Exception {
+		runImportTests_All("EJB11_AddToEAR_DiffClientSourceFolder");
+    }
+    
+    public void testEJBImport20_AddToEAR_DiffClientSourceFolder() throws Exception {
+		runImportTests_All("EJB20_AddToEAR_DiffClientSourceFolder");
+    }
+    
+    public void testEJBImport21_AddToEAR_DiffClientSourceFolder() throws Exception {
+		runImportTests_All("EJB21_AddToEAR_DiffClientSourceFolder");
+    }
+    
+    public void testEJBImport11_AddToEAR_DiffClientName_DiffClientSourceFolder() throws Exception {
+		runImportTests_All("EJB11_AddToEAR_DiffClientName_DiffClientSourceFolder");
+    }
+    
+    public void testEJBImport20_AddToEAR_DiffClientName_DiffClientSourceFolder() throws Exception {
+		runImportTests_All("EJB20_AddToEAR_DiffClientName_DiffClientSourceFolder");
+    }
+    
+    public void testEJBImport21_AddToEAR_DiffClientName_DiffClientSourceFolder() throws Exception {
+		runImportTests_All("EJB21_AddToEAR_DiffClientName_DiffClientSourceFolder");
+    }
+    
+    public void testEJBImport30_Defaults_WithDD() throws Exception {
+		runImportTests_All("EJB30_Defaults_WithDD");
+    }
+    
+    public void testEJBImport30_AddToEAR_Defaults_WithDD() throws Exception {
+		runImportTests_All("EJB30_AddToEAR_Defaults_WithDD");
+    }
+        
+    public void testEJBImport30_AddToEAR_NoClient_WithDD() throws Exception {
+		runImportTests_All("EJB30_AddToEAR_NoClient_WithDD");
+    }
+    
+    public void testEJBImport30_AddToEAR_DiffClientName_WithDD() throws Exception {
+		runImportTests_All("EJB30_AddToEAR_DiffClientName_WithDD");
+    }
+    
+    public void testEJBImport30_AddToEAR_DiffClientSourceFolder_WithDD() throws Exception {
+		runImportTests_All("EJB30_AddToEAR_DiffClientSourceFolder_WithDD");
+    }
+        
+    public void testEJBImport30_AddToEAR_DiffClientName_DiffClientSourceFolder_WithDD() throws Exception {
+		runImportTests_All("EJB30_AddToEAR_DiffClientName_DiffClientSourceFolder_WithDD");
+    }	
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/ejb/operations/EJBProjectCreationOperationTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/ejb/operations/EJBProjectCreationOperationTest.java
new file mode 100644
index 0000000..d3dd875
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/ejb/operations/EJBProjectCreationOperationTest.java
@@ -0,0 +1,338 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.wtp.j2ee.headless.tests.ejb.operations;
+
+import junit.framework.Test;
+
+import org.eclipse.jst.j2ee.ejb.project.operations.IEjbFacetInstallDataModelProperties;
+import org.eclipse.jst.j2ee.internal.ejb.project.operations.EjbFacetProjectCreationDataModelProvider;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetConstants;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetInstallDataModelProperties;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetProjectCreationDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties.FacetDataModelMap;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
+import org.eclipse.wst.common.tests.SimpleTestSuite;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.JavaEEFacetConstants;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleProjectCreationOperationTest;
+
+public class EJBProjectCreationOperationTest extends ModuleProjectCreationOperationTest {
+
+	public EJBProjectCreationOperationTest() {
+		super("EJBProjectCreationOperationTest");
+	}
+	
+	public EJBProjectCreationOperationTest(String name) {
+		super(name);
+	}
+	
+    public static Test suite() {
+    	return new SimpleTestSuite(EJBProjectCreationOperationTest.class);
+    }
+    
+    public void testEJB11_Defaults() throws Exception {
+    	IDataModel dm = getEJBDataModel("insaneEJB", null, null, null, JavaEEFacetConstants.EJB_11, true);
+    	runAndVerify(dm);
+    }
+    
+    public void testEJB20_Defaults() throws Exception {
+    	IDataModel dm = getEJBDataModel("fooEJB", null, null, null, JavaEEFacetConstants.EJB_2, true);
+    	runAndVerify(dm);
+    }
+    
+    public void testEJB21_Defaults() throws Exception {
+    	IDataModel dm = getEJBDataModel("barEJB", null, null, null, JavaEEFacetConstants.EJB_21, true);
+    	runAndVerify(dm);
+    }
+    
+    public void testEJB30_Defaults() throws Exception {
+    	IDataModel dm = getEJBDataModel("penEJB", null, null, null, JavaEEFacetConstants.EJB_3, false);
+    	runAndVerify(dm);
+    }
+    
+    public void testEJB31_Defaults() throws Exception {
+    	IDataModel dm = getEJBDataModel("blahEJB", null, null, null, JavaEEFacetConstants.EJB_31, false);
+    	runAndVerify(dm);
+    }
+    
+    
+    public void testEJB11_AddToEAR_Defaults() throws Exception {
+    	IDataModel dm = getEJBDataModel("testEJB", null, null, "testEAR", JavaEEFacetConstants.EJB_11, true);
+    	runAndVerify(dm);
+    }
+    
+    public void testEJB20_AddToEAR_Defaults() throws Exception {
+    	IDataModel dm = getEJBDataModel("coolEJB", null, null, "booEAR", JavaEEFacetConstants.EJB_2, true);
+    	runAndVerify(dm);
+    }
+    
+    public void testEJB21_AddToEAR_Defaults() throws Exception {
+    	IDataModel dm = getEJBDataModel("crazyEJB", null, null, "starEAR", JavaEEFacetConstants.EJB_21, true);
+    	runAndVerify(dm);
+    }
+    
+    public void testEJB30_AddToEAR_Defaults() throws Exception {
+    	IDataModel dm = getEJBDataModel("netoEJB", null, null, "myEAR", JavaEEFacetConstants.EJB_3, false);
+    	runAndVerify(dm);
+    }
+    
+    public void testEJB31_AddToEAR_Defaults() throws Exception {
+    	IDataModel dm = getEJBDataModel("booEJB", null, null, "trymeEAR", JavaEEFacetConstants.EJB_31, false);
+    	runAndVerify(dm);
+    }    
+    
+    public void testEJB11_AddToEAR_NoClient() throws Exception {
+    	IDataModel dm = getEJBDataModel("testEJB", null, null, "testEAR", JavaEEFacetConstants.EJB_11, false, true);
+    	runAndVerify(dm);
+    }
+    
+    public void testEJB20_AddToEAR_NoClient() throws Exception {
+    	IDataModel dm = getEJBDataModel("coolEJB", null, null, "booEAR", JavaEEFacetConstants.EJB_2, false, true);
+    	runAndVerify(dm);
+    }
+    
+    public void testEJB21_AddToEAR_NoClient() throws Exception {
+    	IDataModel dm = getEJBDataModel("crazyEJB", null, null, "starEAR", JavaEEFacetConstants.EJB_21, false, true);
+    	runAndVerify(dm);
+    }
+    
+    public void testEJB30_AddToEAR_NoClient() throws Exception {
+    	IDataModel dm = getEJBDataModel("netoEJB", null, null, "myEAR", JavaEEFacetConstants.EJB_3, false, false);
+    	runAndVerify(dm);
+    }
+    
+    public void testEJB31_AddToEAR_NoClient() throws Exception {
+    	IDataModel dm = getEJBDataModel("booEJB", null, null, "trymeEAR", JavaEEFacetConstants.EJB_31, false, false);
+    	runAndVerify(dm);
+    }   
+    
+    public void testEJB11_AddToEAR_ChangedEJBClientName() throws Exception {
+    	IDataModel dm = getEJBDataModel("fooBarEJB", "testEJBClient", null, "theirEAR", JavaEEFacetConstants.EJB_11, true);
+    	runAndVerify(dm);
+    }
+    
+    public void testEJB20_AddToEAR_ChangedEJBClientName() throws Exception {
+    	IDataModel dm = getEJBDataModel("saneEJB", "coolEJBClient", null, "yourEAR", JavaEEFacetConstants.EJB_2, true);
+    	runAndVerify(dm);
+    }
+    
+    public void testEJB21_AddToEAR_ChangedEJBClientName() throws Exception {
+    	IDataModel dm = getEJBDataModel("clipEJB", "crazyEJBClient", null, "ourEAR", JavaEEFacetConstants.EJB_21, true);
+    	runAndVerify(dm);
+    }
+    
+    public void testEJB30_AddToEAR_ChangedEJBClientName() throws Exception {
+    	IDataModel dm = getEJBDataModel("phoneEJB", "netoEJBClient", null, "waterEAR", JavaEEFacetConstants.EJB_3, false);
+    	runAndVerify(dm);
+    }
+    
+    public void testEJB31_AddToEAR_ChangedEJBClientName() throws Exception {
+    	IDataModel dm = getEJBDataModel("scaryEJB", "booEJBClient", null, "scaredEAR", JavaEEFacetConstants.EJB_31, false);
+    	runAndVerify(dm);
+    }
+    
+    public void testEJB11_AddToEAR_ChangedClientSourceFolder() throws Exception {
+    	IDataModel dm = getEJBDataModel("cupEJB", null, "src", "openEAR", JavaEEFacetConstants.EJB_11, true);
+    	runAndVerify(dm);
+    }
+    
+    public void testEJB20_AddToEAR_ChangedClientSourceFolder() throws Exception {
+    	IDataModel dm = getEJBDataModel("mouseEJB", null, "files", "closedEAR", JavaEEFacetConstants.EJB_2, true);
+    	runAndVerify(dm);
+    }
+    
+    public void testEJB21_AddToEAR_ChangedClientSourceFolder() throws Exception {
+    	IDataModel dm = getEJBDataModel("pcEJB", null, "stuff", "batEAR", JavaEEFacetConstants.EJB_21, true);
+    	runAndVerify(dm);
+    }
+    
+    public void testEJB30_AddToEAR_ChangedClientSourceFolder() throws Exception {
+    	IDataModel dm = getEJBDataModel("keyEJB", null, "foo", "keyEAR", JavaEEFacetConstants.EJB_3, false);
+    	runAndVerify(dm);
+    }
+    
+    public void testEJB31_AddToEAR_ChangedClientSourceFolder() throws Exception {
+    	IDataModel dm = getEJBDataModel("goEJB", null, "boo", "goEAR", JavaEEFacetConstants.EJB_31, false);
+    	runAndVerify(dm);
+    }    
+    
+    public void testEJB11A_ddToEAR_ChangedEJBClientName_ChangedClientSourceFolder() throws Exception {
+    	IDataModel dm = getEJBDataModel("cupEJB", "superClient", "src", "openEAR", JavaEEFacetConstants.EJB_11, true);
+    	runAndVerify(dm);
+    }
+    
+    public void testEJB20_AddToEAR_ChangedEJBClientName_ChangedClientSourceFolder() throws Exception {
+    	IDataModel dm = getEJBDataModel("mouseEJB", "dudeClient", "files", "closedEAR", JavaEEFacetConstants.EJB_2, true);
+    	runAndVerify(dm);
+    }
+    
+    public void testEJB21_AddToEAR_ChangedEJB_ClientNameChangedClientSourceFolder() throws Exception {
+    	IDataModel dm = getEJBDataModel("pcEJB", "fireClient", "stuff", "batEAR", JavaEEFacetConstants.EJB_21, true);
+    	runAndVerify(dm);
+    }
+    
+    public void testEJB30_AddToEARChangedEJB_ClientName_ChangedClientSourceFolder() throws Exception {
+    	IDataModel dm = getEJBDataModel("keyEJB", "wireClient", "foo", "keyEAR", JavaEEFacetConstants.EJB_3, false);
+    	runAndVerify(dm);
+    }
+    
+    public void testEJB31_AddToEARChangedEJB_ClientName_ChangedClientSourceFolder() throws Exception {
+    	IDataModel dm = getEJBDataModel("goEJB", "workClient", "boo", "goEAR", JavaEEFacetConstants.EJB_31, false);
+    	runAndVerify(dm);
+    }
+    
+    public void testEJB30_Defaults_WithDD() throws Exception {
+    	IDataModel dm = getEJBDataModel("tigerEJB", null, null, null, JavaEEFacetConstants.EJB_3, true);
+    	runAndVerify(dm);
+    }
+    
+    public void testEJB30_AddToEAR_Defaults_WithDD() throws Exception {
+    	IDataModel dm = getEJBDataModel("pandaEJB", null, null, "roundEAR", JavaEEFacetConstants.EJB_3, true);
+    	runAndVerify(dm);
+    }
+    
+    public void testEJB30_AddToEAR_NoClient_WithDD() throws Exception {
+    	IDataModel dm = getEJBDataModel("netoEJB", null, null, "myEAR", JavaEEFacetConstants.EJB_3, false, true);
+    	runAndVerify(dm);
+    }
+    
+    public void testEJB30_AddToEAR_ChangedEJBClientName_WithDD() throws Exception {
+    	IDataModel dm = getEJBDataModel("snakeEJB", "client", null, "groundEAR", JavaEEFacetConstants.EJB_3, true);
+    	runAndVerify(dm);
+    }
+    
+    public void testEJB30_AddToEAR_ChangedClientSourceFolder_WithDD() throws Exception {
+    	IDataModel dm = getEJBDataModel("lionEJB", null, "barSrc", "pinEAR", JavaEEFacetConstants.EJB_3, true);
+    	runAndVerify(dm);
+    }
+    
+    public void testEJB30_AddToEAR_ChangedEJBClientName_ChangedClientSourceFolder_WithDD() throws Exception {
+    	IDataModel dm = getEJBDataModel("monkeyEJB", "fooFooClient", "fooSrc", "outsideEAR", JavaEEFacetConstants.EJB_3, true);
+    	runAndVerify(dm);
+    }
+    
+    public void testEJB31_Defaults_WithDD() throws Exception {
+    	IDataModel dm = getEJBDataModel("spiderEJB", null, null, null, JavaEEFacetConstants.EJB_31, true);
+    	runAndVerify(dm);
+    }
+    
+    public void testEJB31_AddToEAR_Defaults_WithDD() throws Exception {
+    	IDataModel dm = getEJBDataModel("yogiEJB", null, null, "bearEAR", JavaEEFacetConstants.EJB_31, true);
+    	runAndVerify(dm);
+    }
+    
+    public void testEJB31_AddToEAR_NoClient_WithDD() throws Exception {
+    	IDataModel dm = getEJBDataModel("booEJB", null, null, "trymeEAR", JavaEEFacetConstants.EJB_31, false, true);
+    	runAndVerify(dm);
+    }   
+    
+    public void testEJB31_AddToEAR_ChangedEJBClientName_WithDD() throws Exception {
+    	IDataModel dm = getEJBDataModel("starEJB", "rockstarclient", null, "rockEAR", JavaEEFacetConstants.EJB_31, true);
+    	runAndVerify(dm);
+    }
+    
+    public void testEJB31_AddToEAR_ChangedClientSourceFolder_WithDD() throws Exception {
+    	IDataModel dm = getEJBDataModel("sharkEJB", null, "fishySrc", "fishEAR", JavaEEFacetConstants.EJB_31, true);
+    	runAndVerify(dm);
+    }
+    
+    public void testEJB31_AddToEAR_ChangedEJBClientName_ChangedClientSourceFolder_WithDD() throws Exception {
+    	IDataModel dm = getEJBDataModel("trainEJB", "booClient", "booSrc", "fastEAR", JavaEEFacetConstants.EJB_31, true);
+    	runAndVerify(dm);
+    }
+    /**
+     * Creates and returns an EJB Data Model with the given name and of the given version.
+     * Can also set the clientName to be different then the default.
+     * If earName is not null then AppClient will be added to the EAR with earName, and if appropriate
+     * with or without a deployment descriptor.
+     * 
+     * @param projName name of the project to create
+     * @param clientName name of client jar to create, if NULL or earName is NULL then don't create one
+     * @param clientSourceFolder source folder for client, use default if value is NULL, ignored if clientName is NULL
+     * @param earName name of the EAR to add the project too, if NULL then don't add to an EAR
+     * @param version version of EJB to use
+     * @param createDD only used if version is JEE5, if true then create DD else don't
+     * @return an EJB Model with the appropriate properties set
+     */
+    public static IDataModel getEJBDataModel(String projName, String clientName, String clientSourceFolder, String earName, IProjectFacetVersion version, boolean createDD) {
+    	IDataModel dm = DataModelFactory.createDataModel(new EjbFacetProjectCreationDataModelProvider());
+    	dm.setProperty(IFacetProjectCreationDataModelProperties.FACET_PROJECT_NAME, projName);
+
+    	FacetDataModelMap facetMap = (FacetDataModelMap) dm.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
+    	IDataModel facetModel = facetMap.getFacetDataModel(IJ2EEFacetConstants.EJB);
+    	facetModel.setProperty(IFacetDataModelProperties.FACET_VERSION, version);
+
+    	if(earName != null) {
+    		dm.setProperty(IJ2EEFacetProjectCreationDataModelProperties.ADD_TO_EAR, true);
+    		dm.setProperty(IJ2EEFacetProjectCreationDataModelProperties.EAR_PROJECT_NAME, earName);
+
+    		//only create client if given a client name, and is added to EAR
+    		if(clientName != null) {
+    			facetModel.setBooleanProperty(IEjbFacetInstallDataModelProperties.CREATE_CLIENT, true);
+    			facetModel.setStringProperty(IEjbFacetInstallDataModelProperties.CLIENT_NAME, clientName);
+
+    			//use default source folder unless different name is given
+    			if(clientSourceFolder != null) {
+    				facetModel.setStringProperty(IEjbFacetInstallDataModelProperties.CLIENT_SOURCE_FOLDER, clientSourceFolder);
+    			}
+    		}
+    	} else {
+    		dm.setProperty(IJ2EEFacetProjectCreationDataModelProperties.ADD_TO_EAR, false);
+    	}
+
+    	facetModel.setBooleanProperty(IJ2EEFacetInstallDataModelProperties.GENERATE_DD, createDD);
+
+    	if(version.equals(JavaEEFacetConstants.EJB_31))
+    	{
+    		IDataModel javaFacetModel = facetMap.getFacetDataModel(IJ2EEFacetConstants.JAVA);
+	    	javaFacetModel.setProperty(IFacetDataModelProperties.FACET_VERSION, JavaEEFacetConstants.JAVA_6);
+    	}
+    	else{    
+	    	IDataModel javaFacetModel = facetMap.getFacetDataModel(IJ2EEFacetConstants.JAVA);
+	    	javaFacetModel.setProperty(IFacetDataModelProperties.FACET_VERSION, JavaEEFacetConstants.JAVA_5);
+    	}
+
+        
+    	return dm;
+	}
+    
+    /**
+     * Creates and returns an EJB Data Model with the given name and of the given version.
+     * Can also set the clientName to be different then the default, or choose not to have a client.
+     * If earName is not null then AppClient will be added to the EAR with earName, and if appropriate
+     * with or without a deployment descriptor.
+     * 
+     * Created so EJB's could be created without clients.
+     * 
+     * @param projName name of the project to create
+     * @param clientName name of client jar to create, if NULL or earName is NULL then don't create one
+     * @param clientSourceFolder source folder for client, use default if value is NULL, ignored if clientName is NULL
+     * @param earName name of the EAR to add the project too, if NULL then don't add to an EAR
+     * @param version version of EJB to use
+     * @param createClient if True and earName not NULL then create with client, else dont
+     * @param createDD only used if version is JEE5, if true then create DD else don't
+     * @return an EJB Model with the appropriate properties set
+     */
+    public static IDataModel getEJBDataModel(String projName, String clientName, String clientSourceFolder, String earName, IProjectFacetVersion version, boolean createCleint, boolean createDD) {
+    	IDataModel dm = getEJBDataModel(projName, clientName, clientSourceFolder, earName, version, createDD);
+    	
+    	FacetDataModelMap facetMap = (FacetDataModelMap) dm.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
+    	IDataModel facetModel = facetMap.getFacetDataModel(IJ2EEFacetConstants.EJB);
+    	facetModel.setBooleanProperty(IEjbFacetInstallDataModelProperties.CREATE_CLIENT, createCleint);
+        
+    	return dm;
+	} 
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/ArchiveTestsUtil.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/ArchiveTestsUtil.java
new file mode 100644
index 0000000..d847e3f
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/ArchiveTestsUtil.java
@@ -0,0 +1,191 @@
+package org.eclipse.wtp.j2ee.headless.tests.j2ee.operations;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.Assert;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.jst.j2ee.internal.archive.JavaEEArchiveUtilities;
+import org.eclipse.jst.jee.archive.ArchiveOpenFailureException;
+import org.eclipse.jst.jee.archive.IArchive;
+import org.eclipse.jst.jee.archive.IArchiveResource;
+
+public class ArchiveTestsUtil {
+
+	public static boolean compareFiles(File a, File b) throws IOException {
+		InputStream streamA = null;
+		InputStream streamB = null;
+		try {
+			streamA = new FileInputStream(a);
+			streamB = new FileInputStream(b);
+			return compareStreams(streamA, streamB);
+		} finally {
+			try {
+				if (streamA != null) {
+					streamA.close();
+				}
+			} finally {
+				if (streamB != null) {
+					streamB.close();
+				}
+			}
+		}
+	}
+
+	public static void compareArchives(IPath a, IPath b) throws ArchiveOpenFailureException, IOException {
+		IArchive aArchive = null;
+		IArchive bArchive = null;
+		try {
+			aArchive = JavaEEArchiveUtilities.INSTANCE.openArchive(a);
+			bArchive = JavaEEArchiveUtilities.INSTANCE.openArchive(b);
+			compareArchives(aArchive, bArchive);
+		} finally {
+			if (null != aArchive) {
+				JavaEEArchiveUtilities.INSTANCE.closeArchive(aArchive);
+			}
+			if (null != bArchive) {
+				JavaEEArchiveUtilities.INSTANCE.closeArchive(bArchive);
+			}
+		}
+	}
+
+	public static final String[] ARCHIVE_EXTENSIONS = new String[] { ".jar", ".war", ".rar" };
+
+	public static void compareArchives(IArchive a, IArchive b) throws ArchiveOpenFailureException, IOException {
+		List<IArchiveResource> aResources = a.getArchiveResources();
+		List<IArchiveResource> bResources = new ArrayList<IArchiveResource>();
+		bResources.addAll(b.getArchiveResources());
+
+		for (IArchiveResource aRes : aResources) {
+			if (aRes.getPath().equals(IArchive.EMPTY_MODEL_PATH)) {
+				if (b.containsArchiveResource(aRes.getPath())) {
+					bResources.remove(b.getArchiveResource(aRes.getPath()));
+				}
+				continue;
+			}
+			Assert.assertTrue("IArchive B " + b.getPath() + " is missing " + aRes.getPath(), b.containsArchiveResource(aRes.getPath()));
+			IArchiveResource bRes = b.getArchiveResource(aRes.getPath());
+			Assert.assertNotNull("IArchive B " + b.getPath() + " is missing " + aRes.getPath(), bRes);
+			Assert.assertTrue(bResources.remove(bRes));
+			if (aRes.getType() != bRes.getType()) {
+				boolean throwError = false;
+				// if the resources are loaded by the same adapter type, then
+				// the types should be the same
+				if (a.getLoadAdapter().getClass() == b.getLoadAdapter().getClass()) {
+					throwError = true;
+				} // otherwise, it is possible that a generic adapter may not
+				// know how a nested archive should be treated
+				else if ((aRes.getType() == IArchiveResource.ARCHIVE_TYPE) || bRes.getType() == IArchiveResource.ARCHIVE_TYPE) {
+					throwError = false;
+				} else {
+					throwError = true;
+				}
+				if (throwError) {
+					Assert.assertEquals("IArchiveResource types differ for " + aRes.getPath(), aRes.getType(), bRes.getType());
+				}
+			}
+			InputStream aIn = null;
+			InputStream bIn = null;
+			try {
+				aIn = aRes.getInputStream();
+				bIn = bRes.getInputStream();
+				boolean isDirectory = aRes.getType() == IArchiveResource.DIRECTORY_TYPE;
+				if (isDirectory) {
+					Assert.assertNull(aIn);
+					Assert.assertNull(bIn);
+				} else {
+					Assert.assertNotNull("Failed to get IO stream from A for " + aRes.getPath(), aIn);
+					Assert.assertNotNull("Failed to get IO stream from B for " + bRes.getPath(), bIn);
+					boolean compareArchives = false;
+					String pathString = aRes.getPath().toString();
+					for (int i = 0; i < ARCHIVE_EXTENSIONS.length && !compareArchives; i++) {
+						if (pathString.endsWith(ARCHIVE_EXTENSIONS[i])) {
+							compareArchives = true;
+						}
+					}
+
+					if (compareArchives) {
+						compareArchives(a.getNestedArchive(aRes), b.getNestedArchive(bRes));
+					} else if (!pathString.endsWith(".class")) {
+						Assert.assertTrue("IO Streams are not the same for " + aRes.getPath(), compareStreams(aIn, bIn));
+					}
+				}
+			} finally {
+				if (aIn != null) {
+					try {
+						aIn.close();
+					} finally {
+						if (bIn != null) {
+							bIn.close();
+						}
+					}
+				}
+			}
+		}
+
+		if (!bResources.isEmpty()) {
+			StringBuffer error = new StringBuffer("IArchive B contains");
+			for (int i = 0; i < bResources.size(); i++) {
+				IArchiveResource bRes = bResources.get(i);
+				error.append(" " + bRes.getPath());
+			}
+			Assert.fail(error.toString());
+		}
+
+	}
+
+	public static boolean compareStreams(InputStream a, InputStream b) throws IOException {
+		try {
+			BufferedInputStream buffA = new BufferedInputStream(a);
+			BufferedInputStream buffB = new BufferedInputStream(b);
+			int buffSize = 1024;
+			byte[] bytesA = new byte[buffSize];
+			byte[] bytesB = new byte[buffSize];
+			int aRead = -1;
+			int bRead = -1;
+			while (-1 != (aRead = buffA.read(bytesA))) {
+				bRead = buffB.read(bytesB);
+				if (aRead != bRead) {
+					String aStr = new String(bytesA, 0, aRead);
+					String bStr = new String(bytesB, 0, bRead);
+					printCompareError(aStr, bStr);
+					return false;
+				}
+				for (int i = 0; i < aRead - 1; i++) {
+					if (bytesA[i] != bytesB[i]) {
+						String aStr = new String(bytesA, 0, aRead);
+						String bStr = new String(bytesB, 0, bRead);
+						printCompareError(aStr, bStr);
+						return false;
+					}
+				}
+			}
+
+			return true;
+		} finally {
+			try {
+				a.close();
+			} finally {
+				b.close();
+			}
+		}
+	}
+
+	private static void printCompareError(String aStr, String bStr) {
+		aStr = aStr.replaceAll("\n", "<LF>");
+		bStr = bStr.replaceAll("\n", "<LF>");
+		aStr = aStr.replaceAll("\r", "<CR>");
+		bStr = bStr.replaceAll("\r", "<CR>");
+		aStr = aStr.replaceAll(" ", "<SP>");
+		bStr = bStr.replaceAll(" ", "<SP>");
+		System.err.println("A=[" + aStr + "]");
+		System.err.println("B=[" + bStr + "]");
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/HeaderParserTests.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/HeaderParserTests.java
new file mode 100644
index 0000000..b3eacc3
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/HeaderParserTests.java
@@ -0,0 +1,396 @@
+package org.eclipse.wtp.j2ee.headless.tests.j2ee.operations;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.Assert;
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.j2ee.internal.archive.JavaEEArchiveUtilities;
+import org.eclipse.jst.j2ee.webapplication.WebApp;
+import org.eclipse.jst.jee.archive.IArchive;
+import org.eclipse.jst.jee.archive.IArchiveResource;
+import org.eclipse.jst.jee.util.internal.JavaEEQuickPeek;
+import org.eclipse.wst.common.tests.AssertWarn;
+import org.eclipse.wst.common.tests.BaseTestCase;
+import org.eclipse.wst.common.tests.ProjectUtility;
+import org.eclipse.wtp.j2ee.headless.tests.plugin.HeadlessTestsPlugin;
+
+public class HeaderParserTests extends BaseTestCase {
+
+	public static Test suite() {
+        TestSuite suite = new TestSuite();
+        suite.addTestSuite(HeaderParserTests.class);
+        return suite;
+    }
+	
+	private static final String DATA_DIR = "TestData" + java.io.File.separatorChar + "headerParserTestData" + java.io.File.separatorChar;
+	
+	protected String getDataPath(String shortName) throws Exception {
+		HeadlessTestsPlugin plugin = HeadlessTestsPlugin.getDefault();
+		String pluginRelativeFileName = DATA_DIR + java.io.File.separatorChar + shortName;
+		return ProjectUtility.getFullFileName(plugin, pluginRelativeFileName);
+	}
+
+	private class TestData {
+		String fileName;
+
+		int type;
+
+		int modVersion;
+
+		int eeVersion;
+		
+		boolean deploymentDescriptor;
+
+		Class modelObjectInterface;
+
+		public TestData(String fileName, int type, int modVersion, int eeVersion) {
+			this.fileName = fileName;
+			this.type = type;
+			this.modVersion = modVersion;
+			this.eeVersion = eeVersion;
+		}
+
+		public TestData(String fileName, int type, int modVersion, int eeVersion, Class modelTypeClass) {
+			this(fileName, type, modVersion, eeVersion);
+			this.modelObjectInterface = modelTypeClass;
+		}
+		
+		public TestData(String fileName, int type, int modVersion, int eeVersion, Class modelTypeClass,boolean deploymentDescriptor) {
+			this(fileName, type, modVersion, eeVersion,modelTypeClass);
+			this.deploymentDescriptor = deploymentDescriptor;
+		}
+	}
+	
+	public void testNull() throws Exception {
+		JavaEEQuickPeek quickPeek = new JavaEEQuickPeek(null);
+		Assert.assertEquals(JavaEEQuickPeek.UNKNOWN, quickPeek.getType());
+		Assert.assertEquals(JavaEEQuickPeek.UNKNOWN, quickPeek.getVersion());
+		Assert.assertEquals(JavaEEQuickPeek.UNKNOWN, quickPeek.getJavaEEVersion());
+	}
+
+	public void testJavaEEFromArchive() throws Exception {
+		List data = new ArrayList();
+		data.add(new TestData("application-client12.jar", J2EEVersionConstants.APPLICATION_CLIENT_TYPE, J2EEVersionConstants.J2EE_1_2_ID, J2EEVersionConstants.J2EE_1_2_ID,
+				org.eclipse.jst.j2ee.client.ApplicationClient.class));
+		data.add(new TestData("application-client13.jar", J2EEVersionConstants.APPLICATION_CLIENT_TYPE, J2EEVersionConstants.J2EE_1_3_ID, J2EEVersionConstants.J2EE_1_3_ID,
+				org.eclipse.jst.j2ee.client.ApplicationClient.class));
+		data.add(new TestData("application-client14.jar", J2EEVersionConstants.APPLICATION_CLIENT_TYPE, J2EEVersionConstants.J2EE_1_4_ID, J2EEVersionConstants.J2EE_1_4_ID,
+				org.eclipse.jst.j2ee.client.ApplicationClient.class));
+		data.add(new TestData("application-client5.jar", J2EEVersionConstants.APPLICATION_CLIENT_TYPE, J2EEVersionConstants.JEE_5_0_ID, J2EEVersionConstants.JEE_5_0_ID,
+				org.eclipse.jst.javaee.applicationclient.ApplicationClient.class));
+
+		data.add(new TestData("application12.ear", J2EEVersionConstants.APPLICATION_TYPE, J2EEVersionConstants.J2EE_1_2_ID, J2EEVersionConstants.J2EE_1_2_ID,
+				org.eclipse.jst.j2ee.application.Application.class));
+		data.add(new TestData("application13.ear", J2EEVersionConstants.APPLICATION_TYPE, J2EEVersionConstants.J2EE_1_3_ID, J2EEVersionConstants.J2EE_1_3_ID,
+				org.eclipse.jst.j2ee.application.Application.class));
+		data.add(new TestData("application14.ear", J2EEVersionConstants.APPLICATION_TYPE, J2EEVersionConstants.J2EE_1_4_ID, J2EEVersionConstants.J2EE_1_4_ID,
+				org.eclipse.jst.j2ee.application.Application.class));
+		data.add(new TestData("application5.ear", J2EEVersionConstants.APPLICATION_TYPE, J2EEVersionConstants.JEE_5_0_ID, J2EEVersionConstants.JEE_5_0_ID,
+				org.eclipse.jst.javaee.application.Application.class));
+
+		data.add(new TestData("ejb-jar11.jar", J2EEVersionConstants.EJB_TYPE, J2EEVersionConstants.EJB_1_1_ID, J2EEVersionConstants.J2EE_1_2_ID, org.eclipse.jst.j2ee.ejb.EJBJar.class));
+		data.add(new TestData("ejb-jar20.jar", J2EEVersionConstants.EJB_TYPE, J2EEVersionConstants.EJB_2_0_ID, J2EEVersionConstants.J2EE_1_3_ID, org.eclipse.jst.j2ee.ejb.EJBJar.class));
+		data.add(new TestData("ejb-jar21.jar", J2EEVersionConstants.EJB_TYPE, J2EEVersionConstants.EJB_2_1_ID, J2EEVersionConstants.J2EE_1_4_ID, org.eclipse.jst.j2ee.ejb.EJBJar.class));
+		data.add(new TestData("ejb-jar30.jar", J2EEVersionConstants.EJB_TYPE, J2EEVersionConstants.EJB_3_0_ID, J2EEVersionConstants.JEE_5_0_ID, org.eclipse.jst.javaee.ejb.EJBJar.class));
+
+		data.add(new TestData("ra10.rar", J2EEVersionConstants.CONNECTOR_TYPE, J2EEVersionConstants.JCA_1_0_ID, J2EEVersionConstants.J2EE_1_3_ID, org.eclipse.jst.j2ee.jca.Connector.class));
+		data.add(new TestData("ra15.rar", J2EEVersionConstants.CONNECTOR_TYPE, J2EEVersionConstants.JCA_1_5_ID, J2EEVersionConstants.J2EE_1_4_ID, org.eclipse.jst.j2ee.jca.Connector.class));
+
+		data.add(new TestData("web22.war", J2EEVersionConstants.WEB_TYPE, J2EEVersionConstants.WEB_2_2_ID, J2EEVersionConstants.J2EE_1_2_ID, WebApp.class));
+		data.add(new TestData("web23.war", J2EEVersionConstants.WEB_TYPE, J2EEVersionConstants.WEB_2_3_ID, J2EEVersionConstants.J2EE_1_3_ID, WebApp.class));
+		data.add(new TestData("web24.war", J2EEVersionConstants.WEB_TYPE, J2EEVersionConstants.WEB_2_4_ID, J2EEVersionConstants.J2EE_1_4_ID, WebApp.class));
+		data.add(new TestData("web25.war", J2EEVersionConstants.WEB_TYPE, J2EEVersionConstants.WEB_2_5_ID, J2EEVersionConstants.JEE_5_0_ID, org.eclipse.jst.javaee.web.WebApp.class));
+
+		IArchive archive = null;
+		for (int i = 0; i < data.size(); i++) {
+			try {
+				TestData testData = (TestData) data.get(i);
+				String fileLocation = getDataPath(testData.fileName);
+				IPath filePath = new Path(fileLocation);
+				archive = JavaEEArchiveUtilities.INSTANCE.openArchive(filePath);
+				JavaEEQuickPeek peek = JavaEEArchiveUtilities.INSTANCE.getJavaEEQuickPeek(archive);
+				Assert.assertEquals(testData.type, peek.getType());
+				Assert.assertEquals(testData.modVersion, peek.getVersion());
+				Assert.assertEquals(testData.eeVersion, peek.getJavaEEVersion());
+
+				Object modelObject = archive.getModelObject();
+				Class clazz = modelObject.getClass();
+				boolean foundInterface = false;
+				for (Class anInterface : clazz.getInterfaces()) {
+					if (!foundInterface) {
+						foundInterface = anInterface == testData.modelObjectInterface;
+					}
+				}
+				Assert.assertTrue("Returned Model Object: " + modelObject.getClass().getName() + " does not implement " + testData.modelObjectInterface.getName(), foundInterface);
+			} finally {
+				if (archive != null) {
+					JavaEEArchiveUtilities.INSTANCE.closeArchive(archive);
+				}
+			}
+		}
+	}
+
+	public void testJavaEE() throws Exception {
+
+		List data = getXMLData();
+
+		InputStream in = null;
+
+		for (int i = 0; i < data.size(); i++) {
+			try {
+				TestData testData = (TestData) data.get(i);
+				in = new FileInputStream(new File(getDataPath(testData.fileName)));
+				JavaEEQuickPeek peek = new JavaEEQuickPeek(in);
+				Assert.assertEquals(testData.type, peek.getType());
+				Assert.assertEquals(testData.modVersion, peek.getVersion());
+				Assert.assertEquals(testData.eeVersion, peek.getJavaEEVersion());
+			} finally {
+				if (in != null) {
+					in.close();
+				}
+			}
+		}
+
+	}
+
+	private List getXMLData() {
+		List data = new ArrayList();
+		data.add(new TestData("application-client12.xml", J2EEVersionConstants.APPLICATION_CLIENT_TYPE, J2EEVersionConstants.J2EE_1_2_ID, J2EEVersionConstants.J2EE_1_2_ID));
+		data.add(new TestData("application-client13.xml", J2EEVersionConstants.APPLICATION_CLIENT_TYPE, J2EEVersionConstants.J2EE_1_3_ID, J2EEVersionConstants.J2EE_1_3_ID));
+		data.add(new TestData("application-client14.xml", J2EEVersionConstants.APPLICATION_CLIENT_TYPE, J2EEVersionConstants.J2EE_1_4_ID, J2EEVersionConstants.J2EE_1_4_ID));
+		data.add(new TestData("application-client5.xml", J2EEVersionConstants.APPLICATION_CLIENT_TYPE, J2EEVersionConstants.JEE_5_0_ID, J2EEVersionConstants.JEE_5_0_ID));
+
+		data.add(new TestData("application12.xml", J2EEVersionConstants.APPLICATION_TYPE, J2EEVersionConstants.J2EE_1_2_ID, J2EEVersionConstants.J2EE_1_2_ID));
+		data.add(new TestData("application13.xml", J2EEVersionConstants.APPLICATION_TYPE, J2EEVersionConstants.J2EE_1_3_ID, J2EEVersionConstants.J2EE_1_3_ID));
+		data.add(new TestData("application14.xml", J2EEVersionConstants.APPLICATION_TYPE, J2EEVersionConstants.J2EE_1_4_ID, J2EEVersionConstants.J2EE_1_4_ID));
+		data.add(new TestData("application5.xml", J2EEVersionConstants.APPLICATION_TYPE, J2EEVersionConstants.JEE_5_0_ID, J2EEVersionConstants.JEE_5_0_ID));
+
+		data.add(new TestData("ejb-jar11.xml", J2EEVersionConstants.EJB_TYPE, J2EEVersionConstants.EJB_1_1_ID, J2EEVersionConstants.J2EE_1_2_ID));
+		data.add(new TestData("ejb-jar20.xml", J2EEVersionConstants.EJB_TYPE, J2EEVersionConstants.EJB_2_0_ID, J2EEVersionConstants.J2EE_1_3_ID));
+		data.add(new TestData("ejb-jar21.xml", J2EEVersionConstants.EJB_TYPE, J2EEVersionConstants.EJB_2_1_ID, J2EEVersionConstants.J2EE_1_4_ID));
+		data.add(new TestData("ejb-jar30.xml", J2EEVersionConstants.EJB_TYPE, J2EEVersionConstants.EJB_3_0_ID, J2EEVersionConstants.JEE_5_0_ID));
+
+		data.add(new TestData("ra10.xml", J2EEVersionConstants.CONNECTOR_TYPE, J2EEVersionConstants.JCA_1_0_ID, J2EEVersionConstants.J2EE_1_3_ID));
+		data.add(new TestData("ra15.xml", J2EEVersionConstants.CONNECTOR_TYPE, J2EEVersionConstants.JCA_1_5_ID, J2EEVersionConstants.J2EE_1_4_ID));
+
+		data.add(new TestData("web22.xml", J2EEVersionConstants.WEB_TYPE, J2EEVersionConstants.WEB_2_2_ID, J2EEVersionConstants.J2EE_1_2_ID));
+		data.add(new TestData("web23.xml", J2EEVersionConstants.WEB_TYPE, J2EEVersionConstants.WEB_2_3_ID, J2EEVersionConstants.J2EE_1_3_ID));
+		data.add(new TestData("web24.xml", J2EEVersionConstants.WEB_TYPE, J2EEVersionConstants.WEB_2_4_ID, J2EEVersionConstants.J2EE_1_4_ID));
+		data.add(new TestData("web25.xml", J2EEVersionConstants.WEB_TYPE, J2EEVersionConstants.WEB_2_5_ID, J2EEVersionConstants.JEE_5_0_ID));
+
+		// test some bogus dds as well
+		data.add(new TestData("notxml.xml", J2EEVersionConstants.UNKNOWN, J2EEVersionConstants.UNKNOWN, J2EEVersionConstants.UNKNOWN));
+		data.add(new TestData("notjavaee.xml", J2EEVersionConstants.UNKNOWN, J2EEVersionConstants.UNKNOWN, J2EEVersionConstants.UNKNOWN));
+
+		data.add(new TestData("application-client0.xml", J2EEVersionConstants.APPLICATION_CLIENT_TYPE, J2EEVersionConstants.UNKNOWN, J2EEVersionConstants.UNKNOWN));
+		data.add(new TestData("application-client00.xml", J2EEVersionConstants.APPLICATION_CLIENT_TYPE, J2EEVersionConstants.UNKNOWN, J2EEVersionConstants.UNKNOWN));
+		data.add(new TestData("application-client000.xml", J2EEVersionConstants.APPLICATION_CLIENT_TYPE, J2EEVersionConstants.UNKNOWN, J2EEVersionConstants.UNKNOWN));
+
+		data.add(new TestData("application0.xml", J2EEVersionConstants.APPLICATION_TYPE, J2EEVersionConstants.UNKNOWN, J2EEVersionConstants.UNKNOWN));
+		data.add(new TestData("application00.xml", J2EEVersionConstants.APPLICATION_TYPE, J2EEVersionConstants.UNKNOWN, J2EEVersionConstants.UNKNOWN));
+		data.add(new TestData("application000.xml", J2EEVersionConstants.APPLICATION_TYPE, J2EEVersionConstants.UNKNOWN, J2EEVersionConstants.UNKNOWN));
+
+		data.add(new TestData("ejb-jar0.xml", J2EEVersionConstants.EJB_TYPE, J2EEVersionConstants.UNKNOWN, J2EEVersionConstants.UNKNOWN));
+		data.add(new TestData("ejb-jar00.xml", J2EEVersionConstants.EJB_TYPE, J2EEVersionConstants.UNKNOWN, J2EEVersionConstants.UNKNOWN));
+		data.add(new TestData("ejb-jar000.xml", J2EEVersionConstants.EJB_TYPE, J2EEVersionConstants.UNKNOWN, J2EEVersionConstants.UNKNOWN));
+
+		data.add(new TestData("ra0.xml", J2EEVersionConstants.CONNECTOR_TYPE, J2EEVersionConstants.UNKNOWN, J2EEVersionConstants.UNKNOWN));
+		data.add(new TestData("ra00.xml", J2EEVersionConstants.CONNECTOR_TYPE, J2EEVersionConstants.UNKNOWN, J2EEVersionConstants.UNKNOWN));
+		data.add(new TestData("ra000.xml", J2EEVersionConstants.CONNECTOR_TYPE, J2EEVersionConstants.UNKNOWN, J2EEVersionConstants.UNKNOWN));
+
+		data.add(new TestData("web0.xml", J2EEVersionConstants.WEB_TYPE, J2EEVersionConstants.UNKNOWN, J2EEVersionConstants.UNKNOWN));
+		data.add(new TestData("web00.xml", J2EEVersionConstants.WEB_TYPE, J2EEVersionConstants.UNKNOWN, J2EEVersionConstants.UNKNOWN));
+		data.add(new TestData("web000.xml", J2EEVersionConstants.WEB_TYPE, J2EEVersionConstants.UNKNOWN, J2EEVersionConstants.UNKNOWN));
+		return data;
+	}
+
+	public void testNormalizeSchemaLocation() throws Exception {
+		verifyNormalizeSchemaLocation("", "");
+		verifyNormalizeSchemaLocation("", " ");
+		verifyNormalizeSchemaLocation("", "  ");
+		verifyNormalizeSchemaLocation("", "   ");
+		verifyNormalizeSchemaLocation("", "\n");
+		verifyNormalizeSchemaLocation("", "\n\n");
+		verifyNormalizeSchemaLocation("", "\n\n\n");
+		verifyNormalizeSchemaLocation("", "\n ");
+		verifyNormalizeSchemaLocation("simple", "simple");
+		verifyNormalizeSchemaLocation("simple", "simple ");
+		verifyNormalizeSchemaLocation("simple", "simple  ");
+		verifyNormalizeSchemaLocation("simple", "simple   ");
+		verifyNormalizeSchemaLocation("simple", " simple");
+		verifyNormalizeSchemaLocation("simple", "   simple   ");
+		verifyNormalizeSchemaLocation("simple", "simple\n");
+		verifyNormalizeSchemaLocation("simple", "\nsimple\n");
+		verifyNormalizeSchemaLocation("simple", "simple\r");
+		verifyNormalizeSchemaLocation("simple", "simple\t");
+		verifyNormalizeSchemaLocation("simple", "simple\n\n");
+		verifyNormalizeSchemaLocation("simple", "simple\n\r");
+		verifyNormalizeSchemaLocation("simple", "simple\n\t");
+		verifyNormalizeSchemaLocation("simple", "simple \n");
+		verifyNormalizeSchemaLocation("simple", "simple\r ");
+		verifyNormalizeSchemaLocation("simple", " \t\tsimple\t");
+		verifyNormalizeSchemaLocation("simple", "simple\n \n");
+		verifyNormalizeSchemaLocation("simple", "\r \rsimple \n\r");
+		verifyNormalizeSchemaLocation("simple", " simple\n\t");
+		
+		verifyNormalizeSchemaLocation("simple simple", "simple simple");
+		verifyNormalizeSchemaLocation("simple simple", "simple  simple");
+		verifyNormalizeSchemaLocation("simple simple", "simple\nsimple");
+		verifyNormalizeSchemaLocation("simple simple", "simple\rsimple");
+		verifyNormalizeSchemaLocation("simple simple", "simple\tsimple");
+		verifyNormalizeSchemaLocation("simple simple", "simple  \nsimple");
+		verifyNormalizeSchemaLocation("simple simple", "simple\r  simple");
+		verifyNormalizeSchemaLocation("simple simple", "simple          \t        simple");
+		verifyNormalizeSchemaLocation("simple simple", "simple simple ");
+		verifyNormalizeSchemaLocation("simple simple", " simple  simple");
+		verifyNormalizeSchemaLocation("simple simple", "   simple      simple   ");
+		verifyNormalizeSchemaLocation("simple simple", "simple\n simple\n");
+		verifyNormalizeSchemaLocation("simple simple", "simple\r simple\r");
+		verifyNormalizeSchemaLocation("simple simple", "simple\t simple\t");
+		verifyNormalizeSchemaLocation("simple simple", "simple\n\nsimple");
+		verifyNormalizeSchemaLocation("simple simple", "simple\n\rsimple\n\n");
+		verifyNormalizeSchemaLocation("simple simple", "simple\n\tsimple\n\t");
+		verifyNormalizeSchemaLocation("simple simple", "simple \nsimple \n");
+		verifyNormalizeSchemaLocation("simple simple", "simple\r simple\r ");
+		verifyNormalizeSchemaLocation("simple simple", " \t\tsimple\t \t\tsimple\t");
+		verifyNormalizeSchemaLocation("simple simple", "simple\n \nsimple\n \n");
+		verifyNormalizeSchemaLocation("simple simple", "\r \rsimple \n\r\r \rsimple \n\r");
+		verifyNormalizeSchemaLocation("simple simple", " simple\n\t simple\n\t");
+	}
+
+	private String verifyNormalizeSchemaLocation(String normalizedSchemaLocation, String someSchemaLocation) {
+		String normalizedString = JavaEEQuickPeek.normalizeSchemaLocation(someSchemaLocation);
+		if(!normalizedSchemaLocation.equals(normalizedString)){
+			Assert.assertEquals(normalizedSchemaLocation, normalizedString);	
+		}
+		return normalizedString;
+	} 
+	
+    public void testEAR50Import_NoDD() throws Exception {
+    	List nestedArchiveData = new ArrayList();  	
+    	nestedArchiveData.add(new TestData("application-client12.jar", J2EEVersionConstants.APPLICATION_CLIENT_TYPE, J2EEVersionConstants.J2EE_1_2_ID, J2EEVersionConstants.J2EE_1_2_ID,
+				org.eclipse.jst.j2ee.client.ApplicationClient.class));
+    	nestedArchiveData.add(new TestData("application-client13.jar", J2EEVersionConstants.APPLICATION_CLIENT_TYPE, J2EEVersionConstants.J2EE_1_3_ID, J2EEVersionConstants.J2EE_1_3_ID,
+				org.eclipse.jst.j2ee.client.ApplicationClient.class));
+    	nestedArchiveData.add(new TestData("application-client14.jar", J2EEVersionConstants.APPLICATION_CLIENT_TYPE, J2EEVersionConstants.J2EE_1_4_ID, J2EEVersionConstants.J2EE_1_4_ID,
+				org.eclipse.jst.j2ee.client.ApplicationClient.class));
+    	nestedArchiveData.add(new TestData("AppClient5_NoDD.jar", J2EEVersionConstants.APPLICATION_CLIENT_TYPE, J2EEVersionConstants.JEE_5_0_ID, J2EEVersionConstants.JEE_5_0_ID,
+    			org.eclipse.jst.javaee.applicationclient.ApplicationClient.class));
+    	nestedArchiveData.add(new TestData("AppClient5_WithDD.jar", J2EEVersionConstants.APPLICATION_CLIENT_TYPE, J2EEVersionConstants.JEE_5_0_ID, J2EEVersionConstants.JEE_5_0_ID,
+    			org.eclipse.jst.javaee.applicationclient.ApplicationClient.class));
+    	
+    	nestedArchiveData.add(new TestData("ejb-jar11.jar", J2EEVersionConstants.EJB_TYPE, J2EEVersionConstants.EJB_1_1_ID, J2EEVersionConstants.J2EE_1_2_ID, org.eclipse.jst.j2ee.ejb.EJBJar.class));
+    	nestedArchiveData.add(new TestData("ejb-jar20.jar", J2EEVersionConstants.EJB_TYPE, J2EEVersionConstants.EJB_2_0_ID, J2EEVersionConstants.J2EE_1_3_ID, org.eclipse.jst.j2ee.ejb.EJBJar.class));
+    	nestedArchiveData.add(new TestData("ejb-jar21.jar", J2EEVersionConstants.EJB_TYPE, J2EEVersionConstants.EJB_2_1_ID, J2EEVersionConstants.J2EE_1_4_ID, org.eclipse.jst.j2ee.ejb.EJBJar.class));
+    	nestedArchiveData.add(new TestData("EJB3_NoDD_MessageDriven.jar", J2EEVersionConstants.EJB_TYPE, J2EEVersionConstants.EJB_3_0_ID, J2EEVersionConstants.JEE_5_0_ID, org.eclipse.jst.javaee.ejb.EJBJar.class));
+    	nestedArchiveData.add(new TestData("EJB3_NoDD_Stateful.jar", J2EEVersionConstants.EJB_TYPE, J2EEVersionConstants.EJB_3_0_ID, J2EEVersionConstants.JEE_5_0_ID, org.eclipse.jst.javaee.ejb.EJBJar.class));
+    	nestedArchiveData.add(new TestData("EJB3_NoDD_Stateless.jar", J2EEVersionConstants.EJB_TYPE, J2EEVersionConstants.EJB_3_0_ID, J2EEVersionConstants.JEE_5_0_ID, org.eclipse.jst.javaee.ejb.EJBJar.class));
+    	nestedArchiveData.add(new TestData("EJB3_WithDD.jar", J2EEVersionConstants.EJB_TYPE, J2EEVersionConstants.EJB_3_0_ID, J2EEVersionConstants.JEE_5_0_ID, org.eclipse.jst.javaee.ejb.EJBJar.class));
+    	
+    	nestedArchiveData.add(new TestData("ra10.rar", J2EEVersionConstants.CONNECTOR_TYPE, J2EEVersionConstants.JCA_1_0_ID, J2EEVersionConstants.J2EE_1_3_ID, org.eclipse.jst.j2ee.jca.Connector.class));
+    	nestedArchiveData.add(new TestData("ra15.rar", J2EEVersionConstants.CONNECTOR_TYPE, J2EEVersionConstants.JCA_1_5_ID, J2EEVersionConstants.J2EE_1_4_ID, org.eclipse.jst.j2ee.jca.Connector.class));
+
+    	nestedArchiveData.add(new TestData("web22.war", J2EEVersionConstants.WEB_TYPE, J2EEVersionConstants.WEB_2_2_ID, J2EEVersionConstants.J2EE_1_2_ID, WebApp.class));
+    	nestedArchiveData.add(new TestData("web23.war", J2EEVersionConstants.WEB_TYPE, J2EEVersionConstants.WEB_2_3_ID, J2EEVersionConstants.J2EE_1_3_ID, WebApp.class));
+    	nestedArchiveData.add(new TestData("web24.war", J2EEVersionConstants.WEB_TYPE, J2EEVersionConstants.WEB_2_4_ID, J2EEVersionConstants.J2EE_1_4_ID, WebApp.class));
+    	nestedArchiveData.add(new TestData("Web25_NoDD.war", J2EEVersionConstants.WEB_TYPE, J2EEVersionConstants.WEB_2_5_ID, J2EEVersionConstants.JEE_5_0_ID, org.eclipse.jst.javaee.web.WebApp.class));
+    	nestedArchiveData.add(new TestData("Web25_WithDD.war", J2EEVersionConstants.WEB_TYPE, J2EEVersionConstants.WEB_2_5_ID, J2EEVersionConstants.JEE_5_0_ID, org.eclipse.jst.javaee.web.WebApp.class));
+    	
+    	TestData earData = new TestData("EAR5_NoDD.ear", J2EEVersionConstants.APPLICATION_TYPE, J2EEVersionConstants.JEE_5_0_ID, J2EEVersionConstants.JEE_5_0_ID,
+				org.eclipse.jst.javaee.application.Application.class,false);
+    	runEAR50Tests(earData, nestedArchiveData);
+    }
+    
+    public void testEAR50Import_WithDD() throws Exception {
+    	List nestedArchiveData = new ArrayList();  	
+    	nestedArchiveData.add(new TestData("application-client12.jar", J2EEVersionConstants.APPLICATION_CLIENT_TYPE, J2EEVersionConstants.J2EE_1_2_ID, J2EEVersionConstants.J2EE_1_2_ID,
+				org.eclipse.jst.j2ee.client.ApplicationClient.class));
+    	nestedArchiveData.add(new TestData("application-client13.jar", J2EEVersionConstants.APPLICATION_CLIENT_TYPE, J2EEVersionConstants.J2EE_1_3_ID, J2EEVersionConstants.J2EE_1_3_ID,
+				org.eclipse.jst.j2ee.client.ApplicationClient.class));
+    	nestedArchiveData.add(new TestData("application-client14.jar", J2EEVersionConstants.APPLICATION_CLIENT_TYPE, J2EEVersionConstants.J2EE_1_4_ID, J2EEVersionConstants.J2EE_1_4_ID,
+				org.eclipse.jst.j2ee.client.ApplicationClient.class));
+    	nestedArchiveData.add(new TestData("AppClient5_NoDD.jar", J2EEVersionConstants.APPLICATION_CLIENT_TYPE, J2EEVersionConstants.JEE_5_0_ID, J2EEVersionConstants.JEE_5_0_ID,
+    			org.eclipse.jst.javaee.applicationclient.ApplicationClient.class));
+    	nestedArchiveData.add(new TestData("AppClient5_WithDD.jar", J2EEVersionConstants.APPLICATION_CLIENT_TYPE, J2EEVersionConstants.JEE_5_0_ID, J2EEVersionConstants.JEE_5_0_ID,
+    			org.eclipse.jst.javaee.applicationclient.ApplicationClient.class));
+    	
+    	nestedArchiveData.add(new TestData("ejb-jar11.jar", J2EEVersionConstants.EJB_TYPE, J2EEVersionConstants.EJB_1_1_ID, J2EEVersionConstants.J2EE_1_2_ID, org.eclipse.jst.j2ee.ejb.EJBJar.class));
+    	nestedArchiveData.add(new TestData("ejb-jar20.jar", J2EEVersionConstants.EJB_TYPE, J2EEVersionConstants.EJB_2_0_ID, J2EEVersionConstants.J2EE_1_3_ID, org.eclipse.jst.j2ee.ejb.EJBJar.class));
+    	nestedArchiveData.add(new TestData("ejb-jar21.jar", J2EEVersionConstants.EJB_TYPE, J2EEVersionConstants.EJB_2_1_ID, J2EEVersionConstants.J2EE_1_4_ID, org.eclipse.jst.j2ee.ejb.EJBJar.class));
+    	nestedArchiveData.add(new TestData("EJB3_NoDD_MessageDriven.jar", J2EEVersionConstants.EJB_TYPE, J2EEVersionConstants.EJB_3_0_ID, J2EEVersionConstants.JEE_5_0_ID, org.eclipse.jst.javaee.ejb.EJBJar.class));
+    	nestedArchiveData.add(new TestData("EJB3_NoDD_Stateful.jar", J2EEVersionConstants.EJB_TYPE, J2EEVersionConstants.EJB_3_0_ID, J2EEVersionConstants.JEE_5_0_ID, org.eclipse.jst.javaee.ejb.EJBJar.class));
+    	nestedArchiveData.add(new TestData("EJB3_NoDD_Stateless.jar", J2EEVersionConstants.EJB_TYPE, J2EEVersionConstants.EJB_3_0_ID, J2EEVersionConstants.JEE_5_0_ID, org.eclipse.jst.javaee.ejb.EJBJar.class));
+    	nestedArchiveData.add(new TestData("EJB3_WithDD.jar", J2EEVersionConstants.EJB_TYPE, J2EEVersionConstants.EJB_3_0_ID, J2EEVersionConstants.JEE_5_0_ID, org.eclipse.jst.javaee.ejb.EJBJar.class));
+    	
+    	nestedArchiveData.add(new TestData("ra10.rar", J2EEVersionConstants.CONNECTOR_TYPE, J2EEVersionConstants.JCA_1_0_ID, J2EEVersionConstants.J2EE_1_3_ID, org.eclipse.jst.j2ee.jca.Connector.class));
+    	nestedArchiveData.add(new TestData("ra15.rar", J2EEVersionConstants.CONNECTOR_TYPE, J2EEVersionConstants.JCA_1_5_ID, J2EEVersionConstants.J2EE_1_4_ID, org.eclipse.jst.j2ee.jca.Connector.class));
+
+    	nestedArchiveData.add(new TestData("web22.war", J2EEVersionConstants.WEB_TYPE, J2EEVersionConstants.WEB_2_2_ID, J2EEVersionConstants.J2EE_1_2_ID, WebApp.class));
+    	nestedArchiveData.add(new TestData("web23.war", J2EEVersionConstants.WEB_TYPE, J2EEVersionConstants.WEB_2_3_ID, J2EEVersionConstants.J2EE_1_3_ID, WebApp.class));
+    	nestedArchiveData.add(new TestData("web24.war", J2EEVersionConstants.WEB_TYPE, J2EEVersionConstants.WEB_2_4_ID, J2EEVersionConstants.J2EE_1_4_ID, WebApp.class));
+    	nestedArchiveData.add(new TestData("Web25_NoDD.war", J2EEVersionConstants.WEB_TYPE, J2EEVersionConstants.WEB_2_5_ID, J2EEVersionConstants.JEE_5_0_ID, org.eclipse.jst.javaee.web.WebApp.class));
+    	nestedArchiveData.add(new TestData("Web25_WithDD.war", J2EEVersionConstants.WEB_TYPE, J2EEVersionConstants.WEB_2_5_ID, J2EEVersionConstants.JEE_5_0_ID, org.eclipse.jst.javaee.web.WebApp.class));
+    
+    	TestData earData = new TestData("EAR5_WithDD.ear", J2EEVersionConstants.APPLICATION_TYPE, J2EEVersionConstants.JEE_5_0_ID, J2EEVersionConstants.JEE_5_0_ID,
+				org.eclipse.jst.javaee.application.Application.class,true);
+    	runEAR50Tests(earData, nestedArchiveData);
+    }
+    
+    private void runEAR50Tests(TestData earData, List<TestData> nestedArchiveData) throws Exception {
+    	IArchive earArchive = null;
+    	
+    	try {
+			String earLocation = getDataPath(earData.fileName);
+			IPath earPath = new Path(earLocation);
+    		earArchive = JavaEEArchiveUtilities.INSTANCE.openArchive(earPath);
+    		earArchive.getArchiveOptions().setOption(JavaEEArchiveUtilities.DISCRIMINATE_EJB_ANNOTATIONS, Boolean.TRUE);
+			JavaEEQuickPeek peek = JavaEEArchiveUtilities.INSTANCE.getJavaEEQuickPeek(earArchive);
+			Assert.assertEquals(earData.fileName + " type", earData.type, peek.getType());
+			if (earData.deploymentDescriptor){
+				Assert.assertEquals(earData.fileName + " mod version", earData.modVersion, peek.getVersion());
+				Assert.assertEquals(earData.fileName + " ee version", earData.eeVersion, peek.getJavaEEVersion());
+			}
+			else{
+				Assert.assertTrue(earData.fileName + " mod version", peek.getVersion() >= earData.modVersion);
+				Assert.assertTrue(earData.fileName + " ee version", peek.getJavaEEVersion() >= earData.eeVersion);
+			}
+			IArchiveResource innerArchiveResource;
+			IArchive innerArchive = null;
+			for(TestData testData : nestedArchiveData) {
+				innerArchiveResource = earArchive.getArchiveResource(new Path(testData.fileName));
+				innerArchive = earArchive.getNestedArchive(innerArchiveResource);
+				peek = JavaEEArchiveUtilities.INSTANCE.getJavaEEQuickPeek(innerArchive);
+				AssertWarn.warnEquals(testData.fileName + " type", testData.type, peek.getType());
+				AssertWarn.warnEquals(testData.fileName + " mod version", testData.modVersion, peek.getVersion());
+				AssertWarn.warnEquals(testData.fileName + " ee version", testData.eeVersion, peek.getJavaEEVersion());
+				
+		    	//TODO uncomment this block when this bug is resolved: https://bugs.eclipse.org/bugs/show_bug.cgi?id=199953
+		    	System.err.println("TODO -- can't getModelObject from inner archive of JEE5 EAR");
+		    	System.err.println("     -- see https://bugs.eclipse.org/bugs/show_bug.cgi?id=199953");
+//				Object modelObject = innerArchive.getModelObject();
+//				Class clazz = modelObject.getClass();
+//				boolean foundInterface = false;
+//				for (Class anInterface : clazz.getInterfaces()) {
+//					if (!foundInterface) {
+//						foundInterface = anInterface == testData.modelObjectInterface;
+//					}
+//				}
+//				Assert.assertTrue("Returned Model Object: " + modelObject.getClass().getName() + " does not implement " + testData.modelObjectInterface.getName(), foundInterface);
+			}
+			
+    	} finally {
+    		if(earArchive != null) {
+    			JavaEEArchiveUtilities.INSTANCE.closeArchive(earArchive);
+    		}
+    	}
+    }
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/JEEExportOperationTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/JEEExportOperationTest.java
new file mode 100644
index 0000000..ed1207b
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/JEEExportOperationTest.java
@@ -0,0 +1,199 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wtp.j2ee.headless.tests.j2ee.operations;
+
+import java.io.File;
+
+import junit.framework.Assert;
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.tests.OperationTestCase;
+import org.eclipse.wtp.j2ee.headless.tests.ear.operations.EARExportOperationTest;
+
+/**
+ * @author Ian Tewksbury (ictewksb@us.ibm.com)
+ */
+public abstract class JEEExportOperationTest extends OperationTestCase {
+	protected static final String[] JAVA_FILE_NAMES = {"JavaOne","JavaTwo"};
+	protected static final String BASE_DATA_DIR = System.getProperty("user.dir") + java.io.File.separatorChar + "JEEExportOperationTests" + java.io.File.separatorChar;
+	
+	public JEEExportOperationTest() {
+		super("JEEProjectExportOperationTests");
+	}
+		
+	public JEEExportOperationTest(String name) {
+		super(name);
+	}
+	
+	public static Test suite() {
+        TestSuite suite = new TestSuite("All JEE Export Operation Tests");
+        suite.addTest(ModuleExportOperationTest.suite());
+        suite.addTest(EARExportOperationTest.suite());
+
+        return suite;
+    }
+	
+	/**
+	 * used to get a string representing a path where a file with given suffix can be stored.
+	 * 
+	 * @param suffix the suffix to append to the BASE_DATA_DIR
+	 * @return a string containing the BASE_DATA_DIR appended with the given suffix
+	 */
+	protected static String getDataPath(String suffix) {
+		return BASE_DATA_DIR + suffix;
+	}
+	
+	protected static void deleteExported(String archivePath) {
+		File f = new File(archivePath);
+		f.delete();
+	}
+	
+    /**
+     * @param projectName name of the project to export
+     * @param destination destination to export to
+     * @param exportSource if TRUE export source files, else don't
+     * @param runBuild if TRUE run a build before exporting, else don't
+     * @param overwriteExisting if TRUE overwrite existing files, else don't
+     * @return an Export Data Model data model with all of the given settings.
+     */
+    protected abstract IDataModel getExportDataModel(String projectName, String destination, boolean exportSource, boolean runBuild, boolean overwriteExisting);
+    
+	/**
+	 * Should run all of the needed export tests for the child's type of export
+	 * there needs to be at a project of projectType created in the workspace
+	 * 
+	 * @param creationModel the model used to create the project to export
+	 */
+	protected abstract void runExportTests_All(IDataModel creationModel) throws Exception;
+	
+	protected abstract String getModuleExtension();
+    
+    /**
+     * @param projectName name of the project exported
+     * @return the name of the archive exported
+     * @throws Exception
+     */
+	protected String runAndVerifyExport_Defaults(String projectName) throws Exception {
+		String archiveName = this.getClass().getSimpleName() + "_" + this.getName() + "_Defaults" + getModuleExtension();
+		String destination = getDataPath(archiveName);
+		
+		IDataModel exportModel = getExportDataModel(projectName, destination, false, true, false);
+		runAndVerify(exportModel);
+		
+		return archiveName;
+	}
+	
+    /**
+     * @param projectName name of the project exported
+     * @return the name of the archive exported
+     * @throws Exception
+     */
+	protected String runAndVerifyExport_WithSource(String projectName) throws Exception {
+		String archiveName = this.getClass().getSimpleName() + "_" + this.getName() + "_WithSource" + getModuleExtension();
+		String destination = getDataPath(archiveName);
+
+		IDataModel exportModel = getExportDataModel(projectName, destination, true, true, false);
+		runAndVerify(exportModel);
+		
+		return archiveName;
+	}
+	
+    /**
+     * @param projectName name of the project exported
+     * @return the name of the archive exported
+     * @throws Exception
+     */
+	protected String runAndVerifyExport_DontRunBuild(String projectName) throws Exception {
+		String archiveName = this.getClass().getSimpleName() + "_" + this.getName() + "_DontRunBuild" + getModuleExtension();
+		String destination = getDataPath(archiveName);
+		
+		IDataModel exportModel = getExportDataModel(projectName, destination, false, false, false);
+		runAndVerify(exportModel);
+		
+		return archiveName;
+	}
+	
+    /**
+     * @param projectName name of the project exported
+     * @return the name of the archive exported
+     * @throws Exception
+     */
+	protected String runAndVerifyExport_WithSource_DontRunBuild(String projectName) throws Exception {
+		String archiveName = this.getClass().getSimpleName() + "_" + this.getName() + "_WithSource_DontRunBuild" + getModuleExtension();
+		String destination = getDataPath(archiveName);
+		
+		IDataModel exportModel = getExportDataModel(projectName, destination, true, false, false);
+		runAndVerify(exportModel);
+		
+		return archiveName;
+	}
+	
+	/**
+	 * @param projectName name of the project exported
+	 * @throws Exception
+	 */
+	protected void runTest_AttemptToOverwriteButCant(String projectName) throws Exception {
+		String archiveName = this.getClass().getSimpleName() + "_" + this.getName() + "_AttemptToOverwriteButCant"+ getModuleExtension();
+		String destination = getDataPath(archiveName);
+		
+		try {
+			IDataModel exportModel = getExportDataModel(projectName, destination, false, true, false);
+			//IMPROVE PERFORMENCE: don't need to verify export model again here, its already bean done in other tests
+			runDataModel(exportModel);
+		
+			IDataModel exportModelOverwrite = getExportDataModel(projectName, destination, false, true, false);
+			IStatus status = exportModelOverwrite.validate();
+			int severity = status.getSeverity();
+			Assert.assertEquals("Validate on the model should be returning an error because model should not be able overwrite existing archive", IStatus.ERROR, severity);
+		} finally {
+			deleteExported(archiveName);
+		}
+	}
+	
+	/**
+	 * @param projectName name of the project exported
+	 * @throws Exception
+	 */
+	protected void runTest_AttemptToOverwriteSholdSucceed(String projectName) throws Exception {
+		String archiveName = this.getClass().getSimpleName() + "_" + this.getName() + "_AttemptToOverwriteSholdSucceed" + getModuleExtension();
+		String destination = getDataPath(archiveName);
+		
+		try {
+			IDataModel exportModel = getExportDataModel(projectName, destination, false, true, true);
+			//IMPROVE PERFORMENCE: don't need to verify export model again here, its already bean done in other tests
+			runDataModel(exportModel);
+			
+			IDataModel exportModelOverwrite = getExportDataModel(projectName, destination, false, true, true);
+			IStatus status = exportModelOverwrite.validate();
+			int severity = status.getSeverity();
+			Assert.assertEquals("Data model should be allowed to overwrite existing archive", IStatus.OK, severity);
+		} finally {
+			deleteExported(archiveName);
+		}
+	}
+	
+	@Override
+	protected void tearDown() throws Exception {
+		super.tearDown();
+		
+		//clean up any exported files that got left behind if an error occurred
+		String dataPath = getDataPath("");
+		File dataFolder = new File(dataPath);
+		File[] files = dataFolder.listFiles();
+		
+		for(int i = 0; i < files.length; i++) {
+			files[i].delete();
+		}
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/JEEImportOperationTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/JEEImportOperationTest.java
new file mode 100644
index 0000000..4f1ec4c
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/JEEImportOperationTest.java
@@ -0,0 +1,264 @@
+package org.eclipse.wtp.j2ee.headless.tests.j2ee.operations;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.Assert;
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jst.j2ee.datamodel.properties.IJ2EEComponentImportDataModelProperties;
+import org.eclipse.jst.j2ee.internal.archive.JavaEEArchiveUtilities;
+import org.eclipse.jst.jee.archive.IArchive;
+import org.eclipse.jst.jee.archive.IArchiveResource;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.tests.OperationTestCase;
+import org.eclipse.wst.common.tests.ProjectUtility;
+import org.eclipse.wtp.j2ee.headless.tests.ear.operations.EARImportOperationTest;
+import org.eclipse.wtp.j2ee.headless.tests.plugin.HeadlessTestsPlugin;
+
+/**
+ * @author itewk
+ */
+public abstract class JEEImportOperationTest extends OperationTestCase {
+	
+	public JEEImportOperationTest() {
+		super("JEEImportOperationTests");
+	}
+		
+	public JEEImportOperationTest(String name) {
+		super(name);
+	}
+	
+	public static Test suite() {
+        TestSuite suite = new TestSuite("All JEE Import Operation Tests");
+        suite.addTest(ModuleImportOperationTest.suite());
+        suite.addTest(EARImportOperationTest.suite());
+
+        return suite;
+    }
+	
+	protected String getTestDataDirectoryName() {
+		return this.getClass().getSimpleName();
+	}
+	
+	private static final String BASE_IMPORT_DIR = "TestData" + java.io.File.separatorChar + "JEEImportOperationTests" + java.io.File.separatorChar;
+	
+	protected String getArchivePath(String archiveName) throws Exception {
+		HeadlessTestsPlugin plugin = HeadlessTestsPlugin.getDefault();
+		String pluginRelativeFileName = BASE_IMPORT_DIR + getTestDataDirectoryName() + java.io.File.separatorChar + archiveName;
+		return ProjectUtility.getFullFileName(plugin, pluginRelativeFileName);
+	}
+
+	private static final String TEMP_EXPORT_DIR = System.getProperty("user.dir") + java.io.File.separatorChar + "JEEExportOperationTests" + java.io.File.separatorChar;
+	protected String getExportPath(String archiveName) throws Exception {
+		return TEMP_EXPORT_DIR + archiveName;
+	}
+	
+	/**
+	 * 
+	 * @param filePath
+	 * @param projectName
+	 * @param overwriteHandler
+	 * @param creationModel
+	 * @param closeArchiveOnDispose
+	 * @return
+	 */
+    protected abstract IDataModel getImportDataModel(String filePath, String projectName, IDataModel creationModel, boolean closeArchiveOnDispose) throws Exception;
+    
+    protected abstract IDataModel getExportDataModel(String projectName, String destination, boolean exportSource, boolean runBuild, boolean overwriteExisting);
+    
+	/**
+	 * Should run all of the needed import tests for the child's type of import
+	 */
+	protected void runImportTests_All(String testName) throws Exception {
+		String archiveName = null;
+		
+		archiveName = testName + "_Defaults" + getModuleExtension();
+		runAndVerifyImport_ExportedDefaults(archiveName);
+		OperationTestCase.deleteAllProjects();
+		
+		archiveName = testName + "_Source" + getModuleExtension();
+		runAndVerifyImport_ExportedWithSource(archiveName);
+		OperationTestCase.deleteAllProjects();
+		
+		archiveName = testName + "_NoBuild" + getModuleExtension();
+		runAndVerifyImport_ExportedWithDontRunBuild(archiveName);
+		OperationTestCase.deleteAllProjects();
+		
+		archiveName = testName + "_Source_NoBuild" + getModuleExtension();
+		runAndVerifyImport_ExportedWithSrouce_ExportedWithDontRunBuild(archiveName);
+		OperationTestCase.deleteAllProjects();
+	}
+	
+	protected abstract String getModuleExtension();
+    
+//	protected void runAndVerifyImport(String archivePath, String projectName) throws Exception {
+//		verifyImportArchiveExists(archivePath);
+//		
+//		IDataModel importModel = getImportDataModel(archivePath, projectName, null, null, true);
+//		OperationTestCase.runAndVerify(importModel);
+//	}
+	
+	protected void runAndVerifyImport_ExportedDefaults(String archiveName) throws Exception {
+		String archivePath = getArchivePath(archiveName);
+		String projectName = "exportedDefaults";
+		
+		verifyImportArchiveExists(archivePath);
+		
+		IDataModel importModel = getImportDataModel(archivePath, projectName, null, true);
+		OperationTestCase.runAndVerify(importModel);
+		
+		runAndVerifyReExportation(importModel, true, true);
+	}
+	
+	protected void runAndVerifyImport_ExportedWithSource(String archiveName) throws Exception {
+		String archivePath = getArchivePath(archiveName);
+		String projectName = "exportedWithSource";
+		
+		verifyImportArchiveExists(archivePath);
+		
+		IDataModel importModel = getImportDataModel(archivePath, projectName, null, true);
+		runAndVerify(importModel);
+		
+		runAndVerifyReExportation(importModel, true, true);
+	}
+	
+	protected void runAndVerifyImport_ExportedWithDontRunBuild(String archiveName) throws Exception {
+		String archivePath = getArchivePath(archiveName);
+		String projectName = "exportedWithDontRunBuild";
+		
+		verifyImportArchiveExists(archivePath);
+		
+		IDataModel importModel = getImportDataModel(archivePath, projectName, null, true);
+		runAndVerify(importModel);
+	}
+	
+	protected void runAndVerifyImport_ExportedWithSrouce_ExportedWithDontRunBuild(String archiveName) throws Exception {
+		String archivePath = getArchivePath(archiveName);
+		String projectName = "exportedWithSourceAndDontRunBuild";
+		
+		verifyImportArchiveExists(archivePath);
+		
+		IDataModel importModel = getImportDataModel(archivePath, projectName, null, true);
+		runAndVerify(importModel);
+	}
+	
+	protected void runAndVerifyReExportation(IDataModel importModel, boolean exportSource, boolean runBuild) throws Exception {
+		IArchive importedArchive = null;
+		IArchive exportedArchive = null;
+		
+		String projectName = importModel.getStringProperty(IJ2EEComponentImportDataModelProperties.PROJECT_NAME);
+		String importedArchivePath = importModel.getStringProperty(IJ2EEComponentImportDataModelProperties.FILE_NAME);
+		
+		String exportDestination = getExportPath(projectName + getModuleExtension());
+		
+		try {
+			IDataModel exportModel = getExportDataModel(projectName, exportDestination, exportSource, runBuild, true);
+
+			//IMPROVE PERFORMENCE: don't need to verify export model again here, its already bean done in other tests
+			runDataModel(exportModel);
+			
+			importedArchive = JavaEEArchiveUtilities.INSTANCE.openArchive(new Path(importedArchivePath));
+			exportedArchive = JavaEEArchiveUtilities.INSTANCE.openArchive(new Path(exportDestination));
+			
+			List<IArchiveResource> importedArchiveResources = importedArchive.getArchiveResources();
+			List<IArchiveResource> exportedArchiveResources = exportedArchive.getArchiveResources();
+			
+			List<IPath> importedArchiveFileResourcePaths = new ArrayList<IPath>();
+			List<IPath> exportedArchiveFileResourcePaths = new ArrayList<IPath>();
+			
+			List<IPath> importedArchiveDirResourcePaths = new ArrayList<IPath>();
+			List<IPath> exportedArchiveDirResourcePaths = new ArrayList<IPath>();
+			
+			for(IArchiveResource importedArchiveResource : importedArchiveResources) {
+				if(importedArchiveResource.getType() == IArchiveResource.DIRECTORY_TYPE) {
+					importedArchiveDirResourcePaths.add(importedArchiveResource.getPath());
+				} else {
+					importedArchiveFileResourcePaths.add(importedArchiveResource.getPath());
+				}
+			}
+			
+			for(IArchiveResource exportedArchiveResource : exportedArchiveResources) {
+				if(exportedArchiveResource.getType() == IArchiveResource.DIRECTORY_TYPE) {
+					exportedArchiveDirResourcePaths.add(exportedArchiveResource.getPath());
+				} else {
+					exportedArchiveFileResourcePaths.add(exportedArchiveResource.getPath());
+				}
+			}
+			
+			if(exportedArchiveFileResourcePaths.contains(new Path("/"))){
+				Assert.fail("Exported Archive should not contain a root entry '/'");
+			}
+			
+			List<IPath>missingFromImport = new ArrayList<IPath>();
+			boolean exported;
+			for(IPath importedPath : importedArchiveDirResourcePaths) {
+				exported = exportedArchiveDirResourcePaths.contains(importedPath);
+				if(!exported){
+					if(importedPath.lastSegment() != null){ //don't include root entries
+						missingFromImport.add(importedPath);
+					}
+				}
+			}
+			
+			List<IPath> missingFromExport = new ArrayList<IPath>();
+			for(IPath importedPath : importedArchiveFileResourcePaths){
+				exported = exportedArchiveFileResourcePaths.remove(importedPath);
+				if(!exported){
+					if(importedPath.lastSegment() != null){ //don't include root entries
+						missingFromExport.add(importedPath);
+					}
+				}
+			}
+
+			if(!missingFromExport.isEmpty() || !missingFromImport.isEmpty()){
+				StringBuffer buffer = new StringBuffer();
+				if(!missingFromExport.isEmpty()){
+					buffer.append("The following are missing from the exported IArchive:\n");
+					for(IPath path: missingFromExport){
+						buffer.append(path+"\n");
+					}
+				}
+				if(!missingFromImport.isEmpty()){
+					buffer.append("The following are missing from the imported IArchive:\n");
+					for(IPath path: missingFromImport){
+						buffer.append(path+"\n");
+					}
+				}
+				String str = buffer.toString();
+				System.err.println(str);
+				Assert.fail(str);
+			}			
+		} finally {
+			if (null != importedArchive) {
+				JavaEEArchiveUtilities.INSTANCE.closeArchive(importedArchive);
+			}
+			
+			if (null != exportedArchive) {
+				JavaEEArchiveUtilities.INSTANCE.closeArchive(exportedArchive);
+			}
+			
+			File f = new File(exportDestination);
+			f.delete();
+		}
+	}
+	
+	protected void verifyImportArchiveExists(String archivePath) {
+		Assert.assertNotNull("The path to the archive to import can not be null", archivePath);
+		File archive = new File(archivePath);
+		Assert.assertTrue("The archive to import, " + archivePath + " does not exist", archive.exists());
+	}
+	
+//    @Override
+//    public void run(TestResult result) {
+//    	if(this.result == null) {
+//    		this.result = result;
+//    	}
+//    	
+//    	super.run(result);
+//    }
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/JEEProjectCreationOperationTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/JEEProjectCreationOperationTest.java
new file mode 100644
index 0000000..9613d5d
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/JEEProjectCreationOperationTest.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wtp.j2ee.headless.tests.j2ee.operations;
+
+import org.eclipse.wst.common.tests.OperationTestCase;
+import org.eclipse.wtp.j2ee.headless.tests.ear.operations.EARProjectCreationOperationTest;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * @author Ian Tewksbury (ictewksb@us.ibm.com)
+ */
+public class JEEProjectCreationOperationTest extends OperationTestCase {
+
+	public JEEProjectCreationOperationTest() {
+		super("JEEProjectCreationOperationTests");
+	}
+		
+	public JEEProjectCreationOperationTest(String name) {
+		super(name);
+	}
+	
+	public static Test suite() {
+        TestSuite suite = new TestSuite("All JEE Project Creation Operation Tests");
+        suite.addTest(ModuleProjectCreationOperationTest.suite());
+        suite.addTest(EARProjectCreationOperationTest.suite());
+
+        return suite;
+    }
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/JavaEEFacetConstants.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/JavaEEFacetConstants.java
new file mode 100644
index 0000000..808ff5f
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/JavaEEFacetConstants.java
@@ -0,0 +1,58 @@
+package org.eclipse.wtp.j2ee.headless.tests.j2ee.operations;
+
+import org.eclipse.wst.common.componentcore.internal.util.IModuleConstants;
+import org.eclipse.wst.common.project.facet.core.IProjectFacet;
+import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
+import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
+
+public class JavaEEFacetConstants {
+
+	public static final IProjectFacet APP_CLIENT_FACET = ProjectFacetsManager.getProjectFacet(IModuleConstants.JST_APPCLIENT_MODULE); //$NON-NLS-1$
+	public static final IProjectFacetVersion APP_CLIENT_12 = APP_CLIENT_FACET.getVersion("1.2"); //$NON-NLS-1$
+	public static final IProjectFacetVersion APP_CLIENT_13 = APP_CLIENT_FACET.getVersion("1.3"); //$NON-NLS-1$
+	public static final IProjectFacetVersion APP_CLIENT_14 = APP_CLIENT_FACET.getVersion("1.4"); //$NON-NLS-1$
+	public static final IProjectFacetVersion APP_CLIENT_5 = APP_CLIENT_FACET.getVersion("5.0"); //$NON-NLS-1$
+	public static final IProjectFacetVersion APP_CLIENT_6 = APP_CLIENT_FACET.getVersion("6.0"); //$NON-NLS-1$
+	public static final IProjectFacetVersion APP_CLIENT_7 = APP_CLIENT_FACET.getVersion("7.0"); //$NON-NLS-1$
+	
+	public static final IProjectFacet EJB_FACET = ProjectFacetsManager.getProjectFacet(IModuleConstants.JST_EJB_MODULE); //$NON-NLS-1$
+	public static final IProjectFacetVersion EJB_11 = EJB_FACET.getVersion("1.1"); //$NON-NLS-1$
+	public static final IProjectFacetVersion EJB_2 = EJB_FACET.getVersion("2.0"); //$NON-NLS-1$
+	public static final IProjectFacetVersion EJB_21 = EJB_FACET.getVersion("2.1"); //$NON-NLS-1$
+	public static final IProjectFacetVersion EJB_3 = EJB_FACET.getVersion("3.0"); //$NON-NLS-1$
+	public static final IProjectFacetVersion EJB_31 = EJB_FACET.getVersion("3.1"); //$NON-NLS-1$
+	public static final IProjectFacetVersion EJB_32 = EJB_FACET.getVersion("3.2"); //$NON-NLS-1$
+	
+	public static final IProjectFacet WEB_FACET = ProjectFacetsManager.getProjectFacet(IModuleConstants.JST_WEB_MODULE); //$NON-NLS-1$
+	public static final IProjectFacetVersion WEB_22 = WEB_FACET.getVersion("2.2"); //$NON-NLS-1$
+	public static final IProjectFacetVersion WEB_23 = WEB_FACET.getVersion("2.3"); //$NON-NLS-1$
+	public static final IProjectFacetVersion WEB_24 = WEB_FACET.getVersion("2.4"); //$NON-NLS-1$
+	public static final IProjectFacetVersion WEB_25 = WEB_FACET.getVersion("2.5"); //$NON-NLS-1$
+	public static final IProjectFacetVersion WEB_30 = WEB_FACET.getVersion("3.0"); //$NON-NLS-1$
+	public static final IProjectFacetVersion WEB_31 = WEB_FACET.getVersion("3.1"); //$NON-NLS-1$
+	
+	public static final IProjectFacet CONNECTOR_FACET = ProjectFacetsManager.getProjectFacet(IModuleConstants.JST_CONNECTOR_MODULE); //$NON-NLS-1$
+	public static final IProjectFacetVersion CONNECTOR_1 = CONNECTOR_FACET.getVersion("1.0"); //$NON-NLS-1$
+	public static final IProjectFacetVersion CONNECTOR_15 = CONNECTOR_FACET.getVersion("1.5"); //$NON-NLS-1$
+	public static final IProjectFacetVersion CONNECTOR_16 = CONNECTOR_FACET.getVersion("1.6"); //$NON-NLS-1$
+	public static final IProjectFacetVersion CONNECTOR_17 = CONNECTOR_FACET.getVersion("1.7"); //$NON-NLS-1$
+	
+	public static final IProjectFacet EAR_FACET = ProjectFacetsManager.getProjectFacet(IModuleConstants.JST_EAR_MODULE); //$NON-NLS-1$
+	public static final IProjectFacetVersion EAR_12 = EAR_FACET.getVersion("1.2"); //$NON-NLS-1$
+	public static final IProjectFacetVersion EAR_13 = EAR_FACET.getVersion("1.3"); //$NON-NLS-1$
+	public static final IProjectFacetVersion EAR_14 = EAR_FACET.getVersion("1.4"); //$NON-NLS-1$
+	public static final IProjectFacetVersion EAR_5 = EAR_FACET.getVersion("5.0"); //$NON-NLS-1$
+	public static final IProjectFacetVersion EAR_6 = EAR_FACET.getVersion("6.0"); //$NON-NLS-1$
+	public static final IProjectFacetVersion EAR_7 = EAR_FACET.getVersion("7.0"); //$NON-NLS-1$
+	
+	public static final IProjectFacet JAVA_FACET = ProjectFacetsManager.getProjectFacet(IModuleConstants.JST_JAVA); //$NON-NLS-1$
+	public static final IProjectFacetVersion JAVA_13 = JAVA_FACET.getVersion("1.3"); //$NON-NLS-1$
+	public static final IProjectFacetVersion JAVA_14 = JAVA_FACET.getVersion("1.4"); //$NON-NLS-1$
+	public static final IProjectFacetVersion JAVA_5 = JAVA_FACET.getVersion("5.0"); //$NON-NLS-1$
+	public static final IProjectFacetVersion JAVA_6 = JAVA_FACET.getVersion("6.0"); //$NON-NLS-1$
+	public static final IProjectFacetVersion JAVA_7 = JAVA_FACET.getVersion("1.7"); //$NON-NLS-1$
+
+	public static final IProjectFacet WEBFRAGMENT_FACET = ProjectFacetsManager.getProjectFacet(IModuleConstants.JST_WEBFRAGMENT_MODULE);
+	public static final IProjectFacetVersion WEBFRAGMENT_30 = WEBFRAGMENT_FACET.getVersion("3.0"); //$NON-NLS-1$
+	public static final IProjectFacetVersion WEBFRAGMENT_31 = WEBFRAGMENT_FACET.getVersion("3.1"); //$NON-NLS-1$
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/JavaFileTestingUtilities.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/JavaFileTestingUtilities.java
new file mode 100644
index 0000000..dc063d5
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/JavaFileTestingUtilities.java
@@ -0,0 +1,422 @@
+package org.eclipse.wtp.j2ee.headless.tests.j2ee.operations;
+
+import java.io.FileNotFoundException;
+import java.io.StringBufferInputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.Assert;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jst.common.jdt.internal.javalite.JavaLiteUtilities;
+import org.eclipse.jst.j2ee.internal.archive.JavaEEArchiveUtilities;
+import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
+import org.eclipse.jst.jee.archive.IArchive;
+import org.eclipse.jst.jee.archive.IArchiveResource;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.internal.util.ComponentUtilities;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualFile;
+import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
+
+public class JavaFileTestingUtilities {
+	protected static final int MAX_FILE_CREATION_WAIT = 3000;
+	
+	private static final String WAR_EXTENSION = "war";
+	private static final String JAR_EXTENSION = "jar";
+	private static final String RAR_EXTENSION = "rar";
+	
+	private static final String WEB_PACKAGE = "webSrc";
+	private static final String APP_CLIENT_PACKAGE = "appClientSrc";
+	private static final String EJB_PACKAGE = "ejbSrc";
+	private static final String CONNECTOR_PACKAGE = "connectorSrc";
+	private static final String UTILITY_PACKAGE = "utilitySrc";
+	
+	//key is project name, value is array of java class names added to that project
+	private static Map<String, String[]> webProjectJavaFiles = new HashMap<String, String[]>();
+	private static Map<String, String[]> appClientProjectJavaFiles = new HashMap<String, String[]>();
+	private static Map<String, String[]> ejbProjectJavaFiles = new HashMap<String, String[]>();
+	private static Map<String, String[]> connectorProjectJavaFiles = new HashMap<String, String[]>();
+	private static Map<String, String[]> utilityProjectJavaFiles = new HashMap<String, String[]>();
+	
+	public static void addJavaFilesToAppClient(String projectName, String[] classNames, String prackageName) throws Exception {
+		IVirtualComponent projVirtComp = ComponentUtilities.getComponent(projectName);		
+		IVirtualFolder virtRootFolder = projVirtComp.getRootFolder();
+    	addJavaFilesToSrcFolder(virtRootFolder, classNames, prackageName, null);
+	}
+	
+	public static void addJavaFilesToEJB(String projectName, String[] classNames, String prackageName) throws Exception {
+		IVirtualComponent projVirtComp = ComponentUtilities.getComponent(projectName);		
+		IVirtualFolder virtRootFolder = projVirtComp.getRootFolder();
+    	addJavaFilesToSrcFolder(virtRootFolder, classNames, prackageName, null);
+	}
+	
+	public static void addJavaFileToEJB(String projectName, String className, String packageName, String classContents) throws Exception {
+		IVirtualComponent projVirtComp = ComponentUtilities.getComponent(projectName);		
+		IVirtualFolder virtRootFolder = projVirtComp.getRootFolder();
+    	addJavaFilesToSrcFolder(virtRootFolder, new String [] {className }, packageName, classContents);
+	}
+	
+	public static void addJavaFilesToWeb(String projectName, String[] classNames, String prackageName) throws Exception {
+		IProject proj = J2EEProjectUtilities.getProject(projectName);
+		
+		//for web projects the default src directory is not in the root folder
+		List <IContainer> sourceContainers = JavaLiteUtilities.getJavaSourceContainers(ComponentCore.createComponent(proj));
+		Assert.assertTrue("Project should have at least one source root", sourceContainers.size() > 0);
+		IFolder srcFolder = (IFolder)sourceContainers.get(0);
+		addJavaFilesToSrcFolder(srcFolder, classNames, prackageName, null);
+	}
+	
+	public static void addJavaFilesToConnector(String projectName, String[] classNames, String prackageName) throws Exception {
+		IVirtualComponent projVirtComp = ComponentUtilities.getComponent(projectName);		
+		IVirtualFolder virtRootFolder = projVirtComp.getRootFolder();
+    	addJavaFilesToSrcFolder(virtRootFolder, classNames, prackageName, null);
+	}
+	
+	public static void addJavaFilesToUtility(String projectName, String[] classNames, String prackageName) throws Exception {
+		IVirtualComponent projVirtComp = ComponentUtilities.getComponent(projectName);		
+		IVirtualFolder virtRootFolder = projVirtComp.getRootFolder();
+    	addJavaFilesToSrcFolder(virtRootFolder, classNames, prackageName, null);
+	}
+	
+	public static void verifyJavaFilesInJAR(String archivePath, String[] classNames, String packageName, boolean withClassFiles, boolean withSource) throws Exception {
+		IArchive archive = null;
+		
+		try {
+			archive = JavaEEArchiveUtilities.INSTANCE.openArchive(new Path(archivePath));
+			verifyJavaFilesInJAR(archive, classNames, packageName, withClassFiles, withSource);
+		} finally {
+			if(archive != null) {
+				JavaEEArchiveUtilities.INSTANCE.closeArchive(archive);
+			}
+		}
+	}
+	
+	public static void verifyJavaFilesInWAR(String archivePath, String[] classNames, String packageName, boolean withClassFiles, boolean withSource) throws Exception {
+		IArchive archive = null;
+		
+		try {
+			archive = JavaEEArchiveUtilities.INSTANCE.openArchive(new Path(archivePath));
+			verifyJavaFilesInWAR(archive, classNames, packageName, withClassFiles, withSource);
+		} finally {
+			if(archive != null) {
+				JavaEEArchiveUtilities.INSTANCE.closeArchive(archive);
+			}
+		}
+	}
+	
+	public static void verifyJavaFilesInRAR(String archivePath, String[] classNames, String packageName, boolean withClassFiles, boolean withSource) throws Exception {
+		IArchive archive = null;
+		
+		try {
+			archive = JavaEEArchiveUtilities.INSTANCE.openArchive(new Path(archivePath));
+			verifyJavaFilesInRAR(archive, classNames, packageName, withClassFiles, withSource);
+		} finally {
+			if(archive != null) {
+				JavaEEArchiveUtilities.INSTANCE.closeArchive(archive);
+			}
+		}
+	}
+	
+	public static void verifyJavaFilesInJAR(IArchive archive, String[] classNames, String packageName, boolean withClassFiles, boolean withSource) throws Exception {
+		String srcDirectoryPath = packageName + java.io.File.separatorChar;
+		verifyJavaFilesExported(archive, srcDirectoryPath, classNames, withClassFiles, withSource);
+	}
+	
+	public static void verifyJavaFilesInWAR(IArchive archive, String[] classNames, String packageName, boolean withClassFiles, boolean withSource) throws Exception {
+		String srcDirectoryPath = "WEB-INF" + java.io.File.separatorChar + "classes"+ java.io.File.separatorChar + packageName + java.io.File.separatorChar;
+		verifyJavaFilesExported(archive, srcDirectoryPath, classNames, withClassFiles, withSource);
+	}
+	
+	public static void verifyJavaFilesInRAR(IArchive archive, String[] classNames, String packageName, boolean withClassFiles, boolean withSource) throws Exception {
+		List<IArchiveResource> resources = archive.getArchiveResources();
+		IPath resourcePath = null;
+		String resourceName = null;
+		boolean foundNestedArchiveResource = false;
+		for(IArchiveResource resource : resources) {
+			resourcePath = resource.getPath();
+			resourceName = resourcePath.lastSegment();
+
+			foundNestedArchiveResource = resourceName.contains("_") && resourcePath.getFileExtension().equals("jar");
+			if(foundNestedArchiveResource) {
+				break;
+			}
+		}
+
+		Assert.assertTrue("The connector should contain a nested archive resource", foundNestedArchiveResource);
+
+		IArchiveResource nestedArchiveResource = archive.getArchiveResource(new Path(resourceName));
+		IArchive nestedArchive = archive.getNestedArchive(nestedArchiveResource);
+
+		String srcDirectoryPath = packageName + java.io.File.separatorChar;
+		verifyJavaFilesExported(nestedArchive, srcDirectoryPath, classNames, withClassFiles, withSource);
+	}
+	
+	protected static void addJavaFilesToSrcFolder(IVirtualFolder virtSrcFolder, String[] classNames, String prackageName, String classContents) throws Exception {
+		IVirtualFolder packageVirtFolder = virtSrcFolder.getFolder(prackageName);
+		packageVirtFolder.create(0, null);
+		
+		IVirtualFile virtFile = null;
+		List <IFile>filesList = new ArrayList<IFile>();
+		for(int i = 0; i < classNames.length; i++) {
+			virtFile = packageVirtFolder.getFile(classNames[i] + ".java");
+			filesList.add(virtFile.getUnderlyingFile());
+		}
+		
+		addJavaFilesToSrcFolder(filesList, prackageName, classContents);
+	}
+	
+	protected static void addJavaFilesToSrcFolder(IFolder srcFolder, String[] classNames, String prackageName, String classContents) throws Exception {
+		IFolder packageFolder = srcFolder.getFolder(prackageName);
+		packageFolder.create(0, true, null);
+		
+		IFile file = null;
+		List <IFile>filesList = new ArrayList<IFile>();
+		for(int i = 0; i < classNames.length; i++) {
+			file = packageFolder.getFile(classNames[i] + ".java");
+			filesList.add(file);
+		}
+		
+		addJavaFilesToSrcFolder(filesList, prackageName, classContents);
+	}
+	
+	protected static void addJavaFilesToSrcFolder(List<IFile> filesList, String packageName, String classContents) throws Exception {
+		int maxWait = MAX_FILE_CREATION_WAIT;
+		String fileContents = null;
+		String className = null;
+		try{
+			//add listener to workspace
+			ResourcesPlugin.getWorkspace().addResourceChangeListener(JavaFileUpdateListener.getInstance());
+			
+			//listen for all files in the file list to be created
+			List <IFile> files = new ArrayList<IFile>();
+			files.addAll(filesList);
+			JavaFileUpdateListener.getInstance().setFiles(files);
+			
+			//create Java files
+			for(int i = 0; i < filesList.size(); i++) {
+				className = filesList.get(i).getProjectRelativePath().removeFileExtension().lastSegment();
+				if(classContents == null){
+					fileContents = generateJavaFileContent(className, packageName);
+				} else {
+					fileContents = classContents;
+				}
+				filesList.get(i).create(new StringBufferInputStream(fileContents),true,null);
+			}
+			
+			//Wait until resource change events have been processed for all of the Java files created
+			while(!JavaFileUpdateListener.getInstance().areFilesCreated() && maxWait > 0) {
+				Thread.sleep(10);
+				maxWait -= 10;
+			}
+			Assert.assertTrue("Should not have timed out waiting for Java files to be created", maxWait > 0);
+		
+		} finally{
+			ResourcesPlugin.getWorkspace().removeResourceChangeListener(JavaFileUpdateListener.getInstance());
+		}
+	}
+	
+	protected static String generateJavaFileContent(String className, String packageName) {
+		return "package " + packageName + "; public class " + className + " { }";
+	}
+	
+	protected static void verifyJavaFilesExported(IArchive archive, String srcDirectoryPath, String[] classNames, boolean withClassFiles, boolean withSource) throws Exception {	
+		IArchiveResource resource = null;
+		IPath resourcePath = null;
+		for(int i = 0; i < classNames.length; i++) {
+			if(withClassFiles) {
+				resourcePath = new Path(srcDirectoryPath + classNames[i] + ".class");
+				try{
+					resource = archive.getArchiveResource(resourcePath);
+					if(resource == null){
+						System.err.println("TODO -- There should be an archive resource class file for class " + classNames[i]);
+						System.err.println("     -- see https://bugs.eclipse.org/bugs/show_bug.cgi?id=195668");
+						//Assert.fail("There should be an archive resource class file for class " + classNames[i]);
+					}
+					resource = null;
+					resourcePath = null;
+				} catch (FileNotFoundException e){
+					System.err.println("TODO -- There should be an archive resource class file for class " + classNames[i]);
+					System.err.println("     -- see https://bugs.eclipse.org/bugs/show_bug.cgi?id=195668");
+					//Assert.fail("There should be an archive resource class file for class " + classNames[i]);
+				}
+			}
+
+			if(withSource) {
+				resourcePath = new Path(srcDirectoryPath + classNames[i] + ".java");
+				resource = archive.getArchiveResource(resourcePath);
+				if(resource == null){
+					Assert.fail("There should be an archive resource source file for class " + classNames[i]);
+				}
+				resource = null;
+				resourcePath = null;
+			}
+			else{
+				// if the source was not exported, we verify that no java files are included in the exported file 
+				// (see bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=380581)
+				resourcePath = new Path(srcDirectoryPath + classNames[i] + ".java");
+				try{
+					resource = archive.getArchiveResource(resourcePath);
+					if(resource != null){
+						Assert.fail("There should not be an archive resource source file for class " + classNames[i]);
+					}
+				}
+				catch(FileNotFoundException e){
+					// Left blank intentionally 
+					// archive.getArchiveResource(resourcePath) throws a FileNotFoundException 
+					// if the file cannot be found, which is correct in this case. 
+				}
+				resource = null;
+				resourcePath = null;
+				
+			}
+		}
+	}
+	
+	/**
+	 * adds two java files to every project that this ear references, to verify these files were exported correctly
+	 * run verifyAllJavaFilesExportedToProjectsInEAR
+	 * 
+	 * be sure to run clearJavaFilesForEAR() when done with export verifications.
+	 */
+	public static void addJavaFilesToAllProjectsInEAR(IProject earProject) throws Exception {
+		IProject[] webProjects = J2EEProjectUtilities.getAllProjectsInWorkspaceOfType(J2EEProjectUtilities.DYNAMIC_WEB);
+		IProject[] appClientProjects = J2EEProjectUtilities.getAllProjectsInWorkspaceOfType(J2EEProjectUtilities.APPLICATION_CLIENT);
+		IProject[] connectorProjects = J2EEProjectUtilities.getAllProjectsInWorkspaceOfType(J2EEProjectUtilities.JCA);
+		IProject[] ejbProjects = J2EEProjectUtilities.getAllProjectsInWorkspaceOfType(J2EEProjectUtilities.EJB);
+		IProject[] utilityProjects = J2EEProjectUtilities.getAllProjectsInWorkspaceOfType(J2EEProjectUtilities.UTILITY);
+		
+		String projectName = null;
+		int fileCount = 0;
+		
+		
+		List<IProject> referencedProjects = Arrays.asList(earProject.getReferencedProjects());
+		
+		for(IProject project : webProjects) {
+			if(referencedProjects.contains(project)) {
+				projectName = project.getName();
+				String[] classNameList = {"JavaFile" + (fileCount++), "Javafile" + (fileCount++)};
+				JavaFileTestingUtilities.addJavaFilesToWeb(projectName, classNameList, WEB_PACKAGE);
+				webProjectJavaFiles.put(projectName, classNameList);
+			}
+		}
+		
+		for(IProject project : appClientProjects) {
+			if(referencedProjects.contains(project)) {
+				projectName = project.getName();
+				String[] classNameList = {"JavaFile" + (fileCount++), "Javafile" + (fileCount++)};
+				JavaFileTestingUtilities.addJavaFilesToAppClient(projectName, classNameList, APP_CLIENT_PACKAGE);
+				appClientProjectJavaFiles.put(projectName, classNameList);
+			}
+		}
+
+		for(IProject project : connectorProjects) {
+			if(referencedProjects.contains(project)) {
+				projectName = project.getName();
+				String[] classNameList = {"JavaFile" + (fileCount++), "Javafile" + (fileCount++)};
+				JavaFileTestingUtilities.addJavaFilesToConnector(projectName, classNameList, CONNECTOR_PACKAGE);
+				connectorProjectJavaFiles.put(projectName, classNameList);
+			}
+		}
+
+		for(IProject project : ejbProjects) {
+			if(referencedProjects.contains(project)) {
+				projectName = project.getName();
+				String[] classNameList = {"JavaFile" + (fileCount++), "Javafile" + (fileCount++)};
+				JavaFileTestingUtilities.addJavaFilesToEJB(projectName, classNameList, EJB_PACKAGE);
+				ejbProjectJavaFiles.put(projectName, classNameList);
+			}
+		}
+		
+		for(IProject project : utilityProjects) {
+			if(referencedProjects.contains(project)) {
+				projectName = project.getName();
+				String[] classNameList = {"JavaFile" + (fileCount++), "Javafile" + (fileCount++)};
+				JavaFileTestingUtilities.addJavaFilesToUtility(projectName, classNameList, UTILITY_PACKAGE);
+				utilityProjectJavaFiles.put(projectName, classNameList);
+			}
+		}
+	}
+	
+	/**
+	 * be sure to call addJavaFilesToAllProjectsInEAR() before trying to verify that the files were added
+	 * 
+	 * @param earArchivePath
+	 * @param withClassFiles
+	 * @param withSource
+	 * @throws Exception
+	 */
+	public static void verifyAllJavaFilesExportedToProjectsInEAR(String earArchivePath, boolean withClassFiles, boolean withSource ) throws Exception {
+		IArchive earArchive = null;
+		
+		try {
+			earArchive = JavaEEArchiveUtilities.INSTANCE.openArchive(new Path(earArchivePath));
+			List<IArchiveResource> resources = earArchive.getArchiveResources();
+			
+			String extension = null;
+			IArchive nestedArchive = null;
+			String nestedArchiveName = null;
+			String[] classNames = null;
+			for(IArchiveResource resource : resources) {
+				extension = resource.getPath().getFileExtension();
+				
+				if(extension != null) {
+					if(extension.equals(WAR_EXTENSION)) {
+						nestedArchive = earArchive.getNestedArchive(resource);
+						nestedArchiveName = nestedArchive.getPath().removeFileExtension().lastSegment();
+						classNames = webProjectJavaFiles.get(nestedArchiveName);
+
+						verifyJavaFilesInWAR(nestedArchive, classNames, WEB_PACKAGE, withClassFiles, withSource);
+					} else if(extension.equals(JAR_EXTENSION)) {
+						nestedArchive = earArchive.getNestedArchive(resource);
+						nestedArchiveName = nestedArchive.getPath().removeFileExtension().lastSegment();
+						
+						//EJB, AppClients and Utilitys have the same extension, so if project isn't in AppClient list
+						// check EJB list, if not in EJB list check Utility list
+						classNames = appClientProjectJavaFiles.get(nestedArchiveName);
+						if(classNames == null) {
+							classNames = ejbProjectJavaFiles.get(nestedArchiveName);
+							
+							if(classNames != null) {
+								verifyJavaFilesInJAR(nestedArchive, classNames, EJB_PACKAGE, withClassFiles, withSource);
+							} else {
+								classNames = utilityProjectJavaFiles.get(nestedArchiveName);
+								verifyJavaFilesInJAR(nestedArchive, classNames, UTILITY_PACKAGE, withClassFiles, withSource);
+							}
+						} else {
+							verifyJavaFilesInJAR(nestedArchive, classNames, APP_CLIENT_PACKAGE, withClassFiles, withSource);
+						}
+						
+					} else if(extension.equals(RAR_EXTENSION)) {
+						nestedArchive = earArchive.getNestedArchive(resource);
+						nestedArchiveName = nestedArchive.getPath().removeFileExtension().lastSegment();
+						classNames = connectorProjectJavaFiles.get(nestedArchiveName);
+
+						verifyJavaFilesInRAR(nestedArchive, classNames, CONNECTOR_PACKAGE, withClassFiles, withSource);
+					}
+				}
+			}
+			
+		} finally {
+			if(earArchive != null) {
+				JavaEEArchiveUtilities.INSTANCE.closeArchive(earArchive);
+			}
+		}
+	}
+	
+	public static void clearJavaFilesForEAR() {
+		appClientProjectJavaFiles.clear();
+		ejbProjectJavaFiles.clear();
+		connectorProjectJavaFiles.clear();
+		webProjectJavaFiles.clear();
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/JavaFileUpdateListener.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/JavaFileUpdateListener.java
new file mode 100644
index 0000000..1b89b19
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/JavaFileUpdateListener.java
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wtp.j2ee.headless.tests.j2ee.operations;
+
+import java.util.List;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceChangeEvent;
+import org.eclipse.core.resources.IResourceChangeListener;
+import org.eclipse.core.resources.IResourceDelta;
+import org.eclipse.core.resources.IResourceDeltaVisitor;
+import org.eclipse.core.runtime.CoreException;
+
+public class JavaFileUpdateListener implements IResourceChangeListener, IResourceDeltaVisitor {
+
+	private static JavaFileUpdateListener instance = null;
+	
+	public static JavaFileUpdateListener getInstance(){
+		if(instance == null){
+			instance = new JavaFileUpdateListener();
+		}
+		return instance;
+	}
+	
+	private List <IFile> filesList = null;
+	
+	public void setFiles(List<IFile> filesList){
+		this.filesList = filesList;
+	}
+	
+	public boolean areFilesCreated() {
+		return filesList == null || filesList.size() == 0;
+	}
+	
+	public void resourceChanged(IResourceChangeEvent event) {
+		switch (event.getType()){
+			case IResourceChangeEvent.POST_CHANGE:
+				try {
+					event.getDelta().accept(this);
+				} catch (CoreException e) {
+					e.printStackTrace();
+				}
+			break;
+		}
+	}
+
+	public boolean visit(IResourceDelta delta) throws CoreException {
+		if(filesList == null){
+			return false;
+		}
+		IResource resource = delta.getResource();
+		switch (resource.getType()) {
+			case IResource.ROOT:
+				return true;
+			case IResource.PROJECT:
+				for(int i=0;i<filesList.size(); i++){
+					if(filesList.get(i).getProject().equals(resource)){
+						return true;
+					}
+				}
+				return false;
+			case IResource.FOLDER: 
+				for(int i=0;i<filesList.size(); i++){
+					IContainer container = filesList.get(i).getParent();
+					while(container != null && container.getType() == IResource.FOLDER){
+						if(resource.equals(container)){
+							return true;
+						}
+						container = container.getParent();
+					}
+				}
+				return false;
+			case IResource.FILE:
+				if(filesList.contains(resource)){
+					filesList.remove(resource);
+					if(filesList.isEmpty()){
+						filesList = null;
+					}
+				}
+				return false;
+		}	
+		
+		return false;
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/ModuleExportOperationTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/ModuleExportOperationTest.java
new file mode 100644
index 0000000..2a21857
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/ModuleExportOperationTest.java
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ * Created on Jan 6, 2004
+ * 
+ * To change the template for this generated file go to Window - Preferences - Java - Code
+ * Generation - Code and Comments
+ */
+package org.eclipse.wtp.j2ee.headless.tests.j2ee.operations;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wtp.j2ee.headless.tests.appclient.operations.AppClientExportOperationTest;
+import org.eclipse.wtp.j2ee.headless.tests.ejb.operations.EJBExportOperationTest;
+import org.eclipse.wtp.j2ee.headless.tests.jca.operations.JCAExportOperationTest;
+import org.eclipse.wtp.j2ee.headless.tests.utility.operations.UtilityExportOperationTest;
+import org.eclipse.wtp.j2ee.headless.tests.web.operations.WebExportOperationTest;
+
+/**
+ * @author Administrator
+ * @author Ian Tewksbury (ictewksb@us.ibm.com)
+ * 
+ * To change the template for this generated type comment go to Window - Preferences - Java - Code
+ * Generation - Code and Comments
+ */
+public abstract class ModuleExportOperationTest extends JEEExportOperationTest {
+	protected static final String PACKAGE_NAME = "test";
+	
+	public ModuleExportOperationTest() {
+		super("ModuleExportOperationTests");
+	}
+	
+	public ModuleExportOperationTest(String name) {
+		super(name);
+	}
+	
+	public static Test suite() {
+		TestSuite suite = new TestSuite("All Module ExportOperation Tests");
+		suite.addTestSuite(JCAExportOperationTest.class);
+		suite.addTestSuite(EJBExportOperationTest.class);
+		suite.addTestSuite(WebExportOperationTest.class);
+		suite.addTestSuite(AppClientExportOperationTest.class);
+		suite.addTestSuite(UtilityExportOperationTest.class);
+		
+		return suite;
+	}
+	
+	protected abstract void addJavaFilesToProject(String projectName, String[] classNames, String prackageName) throws Exception;
+	
+	protected abstract void verifyJavaFilesExported(String archivePath, String[] classNames, String packageName, boolean withClassFiles, boolean withSource) throws Exception;
+	
+	@Override
+	protected void runExportTests_All(IDataModel creationModel) throws Exception {
+		String projectName = creationModel.getStringProperty(IFacetProjectCreationDataModelProperties.FACET_PROJECT_NAME);
+		String archiveName = null;
+		String archivePath = null;
+		
+		addJavaFilesToProject(projectName, JAVA_FILE_NAMES, PACKAGE_NAME);
+		
+	    archiveName = runAndVerifyExport_Defaults(projectName);
+	    archivePath = getDataPath(archiveName);
+	    verifyJavaFilesExported(archivePath, JAVA_FILE_NAMES, PACKAGE_NAME, true, false);
+		deleteExported(archivePath);
+			
+		archiveName = runAndVerifyExport_WithSource(projectName);
+		archivePath = getDataPath(archiveName);
+		verifyJavaFilesExported(archivePath, JAVA_FILE_NAMES, PACKAGE_NAME, true, true);
+		deleteExported(archivePath);
+		
+		archiveName = runAndVerifyExport_DontRunBuild(projectName);
+		archivePath = getDataPath(archiveName);
+		deleteExported(archivePath);
+			
+		archiveName = runAndVerifyExport_WithSource_DontRunBuild(projectName);
+		archivePath = getDataPath(archiveName);
+		verifyJavaFilesExported(archivePath, JAVA_FILE_NAMES, PACKAGE_NAME, false, true);
+		deleteExported(archivePath);
+			
+		runTest_AttemptToOverwriteButCant(projectName);
+		runTest_AttemptToOverwriteSholdSucceed(projectName);
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/ModuleImportOperationTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/ModuleImportOperationTest.java
new file mode 100644
index 0000000..83e22c3
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/ModuleImportOperationTest.java
@@ -0,0 +1,129 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ * Created on Jan 6, 2004
+ * 
+ * To change the template for this generated file go to Window - Preferences - Java - Code
+ * Generation - Code and Comments
+ */
+package org.eclipse.wtp.j2ee.headless.tests.j2ee.operations;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.wtp.j2ee.headless.tests.appclient.operations.AppClientImportOperationTest;
+import org.eclipse.wtp.j2ee.headless.tests.ejb.operations.EJBImportOperationTest;
+import org.eclipse.wtp.j2ee.headless.tests.jca.operations.JCAImportOperationTest;
+import org.eclipse.wtp.j2ee.headless.tests.utility.operations.UtilityImportOperationTest;
+import org.eclipse.wtp.j2ee.headless.tests.web.operations.WebImportOperationTest;
+
+/**
+ * @author Administrator
+ * @author Ian Tewksbury (ictewksb@us.ibm.com)
+ * 
+ * To change the template for this generated type comment go to Window - Preferences - Java - Code
+ * Generation - Code and Comments
+ */
+public abstract class ModuleImportOperationTest extends JEEImportOperationTest {
+
+	
+	public ModuleImportOperationTest() {
+		super("ModuleImportOperationTests");
+	}
+	
+	public ModuleImportOperationTest(String name) {
+		super(name);
+	}
+	
+	public static Test suite() {
+		TestSuite suite = new TestSuite("All Module Import Operation Tests");
+		suite.addTestSuite(JCAImportOperationTest.class);
+		suite.addTestSuite(EJBImportOperationTest.class);
+		suite.addTestSuite(WebImportOperationTest.class);
+		suite.addTestSuite(AppClientImportOperationTest.class);
+		suite.addTestSuite(UtilityImportOperationTest.class);
+		return suite;
+	}
+	
+//	@Override
+//	protected void runImportTests_All() throws Exception {	
+//		runAndVerifyImport_ExportedDefaults();
+//		OperationTestCase.deleteAllProjects();
+//		
+//		runAndVerifyImport_ExportedWithSource();
+//		OperationTestCase.deleteAllProjects();
+//		
+//		runAndVerifyImport_ExportedWithDontRunBuild();
+//		OperationTestCase.deleteAllProjects();
+//		
+//		runAndVerifyImport_ExportedWithSrouce_ExportedWithDontRunBuild();
+//		OperationTestCase.deleteAllProjects();
+//	}
+	
+//	protected void runSubTests() {
+//		final String partialPath = getArchivePath("") + this.getClass().getSimpleName() + "_";
+//		
+//    	TestCase defaults = new TestCase(this.getName() + "_Defaults") {
+//    		@Override
+//            public void runTest() throws Exception{
+//    			String archivePath = partialPath + this.getName() + getModuleExtension();
+//    			String projectName = "exportedDefaults";
+//    			
+//        		runAndVerifyImport(archivePath, projectName);
+//        		runAndVerifyReExportation(archivePath, projectName, false, true);
+//        		
+//        		OperationTestCase.deleteAllProjects();
+//            }
+//    	};
+//    	TestCase withSource = new TestCase(this.getName() + "_WithSource") {
+//    		@Override
+//            public void runTest() throws Exception{
+//    			String archivePath = partialPath + this.getName() + getModuleExtension();
+//        		String projectName = "exportedWithSource";
+//        		
+//        		runAndVerifyImport(archivePath, projectName);
+//        		runAndVerifyReExportation(archivePath, projectName, true, true);
+//        		
+//        		OperationTestCase.deleteAllProjects();
+//            }
+//    	};
+//    	TestCase dontRunBuild = new TestCase(this.getName() + "_DontRunBuild") {
+//    		@Override
+//            public void runTest() throws Exception{
+//    			String archivePath = partialPath + this.getName() + getModuleExtension();
+//    			String projectName = "exportedWithDontRunBuild";
+//    			
+//        		runAndVerifyImport(archivePath, projectName);
+//        		
+//        		OperationTestCase.deleteAllProjects();
+//            }
+//    	};
+//    	TestCase withSourceDontRunBuild = new TestCase(this.getName() + "_WithSource_DontRunBuild") {
+//    		@Override
+//            public void runTest() throws Exception{
+//    			String archiveName = partialPath + this.getName() + getModuleExtension();
+//    			String projectName = "exportedWithSourceAndDontRunBuild";
+//    			
+//        		runAndVerifyImport(archiveName, projectName);
+//        		
+//        		OperationTestCase.deleteAllProjects();
+//            }
+//    	};
+//    	
+//    	TestSuite suite = new TestSuite();
+//		suite.addTest(defaults);
+//		suite.addTest(withSource);
+//		suite.addTest(dontRunBuild);
+//		suite.addTest(withSourceDontRunBuild);
+//		suite.setName(this.getClass().getName());
+//    	suite.run(result);
+//	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/ModuleProjectCreationOperationTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/ModuleProjectCreationOperationTest.java
new file mode 100644
index 0000000..0ecce66
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/ModuleProjectCreationOperationTest.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wtp.j2ee.headless.tests.j2ee.operations;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.wtp.j2ee.headless.tests.appclient.operations.AppClientProjectCreationOperationTest;
+import org.eclipse.wtp.j2ee.headless.tests.ejb.operations.EJBProjectCreationOperationTest;
+import org.eclipse.wtp.j2ee.headless.tests.jca.operations.JCAProjectCreationOperationTest;
+import org.eclipse.wtp.j2ee.headless.tests.utility.operations.UtilityProjectCreationOperationTest;
+import org.eclipse.wtp.j2ee.headless.tests.web.operations.WebProjectCreationOperationTest;
+
+public abstract class ModuleProjectCreationOperationTest extends JEEProjectCreationOperationTest {
+   
+	public ModuleProjectCreationOperationTest() {
+	   super("ModuleProjectCreationOperationTests");
+   }
+	
+	public ModuleProjectCreationOperationTest(String name) {
+		super(name);
+	}
+
+	public static Test suite() {
+        TestSuite suite = new TestSuite("All Module Project Creation Operation Tests");
+        suite.addTestSuite(AppClientProjectCreationOperationTest.class);
+        suite.addTestSuite(EJBProjectCreationOperationTest.class);
+        suite.addTestSuite(WebProjectCreationOperationTest.class); 
+        suite.addTestSuite(JCAProjectCreationOperationTest.class);
+        suite.addTestSuite(UtilityProjectCreationOperationTest.class);
+        return suite;
+    }
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/RandomObjectGenerator.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/RandomObjectGenerator.java
new file mode 100644
index 0000000..f825f35
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/RandomObjectGenerator.java
@@ -0,0 +1,101 @@
+/*
+ * Created on Jan 6, 2004
+ * 
+ * To change the template for this generated file go to Window - Preferences - Java - Code Generation - Code and
+ * Comments
+ */
+package org.eclipse.wtp.j2ee.headless.tests.j2ee.operations;
+
+import java.util.Random;
+
+/**
+ * @author blancett
+ * 
+ * To change the template for this generated type comment go to Window - Preferences - Java - Code Generation - Code
+ * and Comments
+ */
+public class RandomObjectGenerator {
+    protected static RandomObjectGenerator randomObjectGenerator;
+    private static Random randomGenerator = new Random();
+    private static int maxNumOfLettersInWords = 15;
+    private static int maxNumberOfProjectsCreated = 5;
+    private static int upperCaseSeed = 65; //ASCII 'A'
+    private static int lowerCaseSeed = 97; //ASCII 'a'
+    private static int invalidCharSeed = 33;
+    private static int numberSeed = 48;
+    private static int alphabetRange = 25;
+    private static int symbolRange = 15;
+    private static int numberRange = 9;
+
+    public static String createCorrectRandomProjectNames() {
+        int numOfletterInWord = Math.max(randomGenerator.nextInt(maxNumOfLettersInWords + 1), 2);
+        String string = new String();
+        for (int i = 0; i < numOfletterInWord; i++) {
+            string = string + createRandomCharacterInAlphabetRange();
+        }
+        return string;
+    }
+
+    public static String createRandomNumbers() {
+        char randomChar;
+        int randomInt = randomGenerator.nextInt(numberRange + 1);
+        randomChar = (char) (randomInt + numberSeed);
+        return (new Character(randomChar)).toString();
+    }
+
+    public static String createRandomInvaildCharacters() {
+        char randomChar;
+        int randomInt = randomGenerator.nextInt(symbolRange + 1);
+        randomChar = (char) (randomInt + invalidCharSeed);
+        return (new Character(randomChar)).toString();
+    }
+    public static int createRandomProjectNumber() {
+        return randomGenerator.nextInt(maxNumberOfProjectsCreated + 1);
+    }
+
+    public static String createRandomCharacterInAlphabetRange() {
+        char randomChar;
+        int randomInt = randomGenerator.nextInt(alphabetRange + 1);
+        if ((randomInt % 2) == 0)
+            randomChar = (char) (randomInt + lowerCaseSeed);
+        else
+            randomChar = (char) (randomInt + upperCaseSeed);
+        return Character.toString(randomChar);
+    }
+
+    public static String createInvalidRandomProjectName() {
+        int numOfletterInWord = randomGenerator.nextInt(maxNumOfLettersInWords + 1);
+        String string = new String();
+        for (int i = 0; i < numOfletterInWord; i++) {
+            string.concat(createRandomInvaildCharacters());
+        }
+        return string;
+    }
+
+    public static String createCorrectRandomProjectNamesAllChars() {
+        int numOfletterInWord = Math.max(randomGenerator.nextInt(maxNumOfLettersInWords + 1), 2);
+        String string = new String();
+        for (int i = 0; i < numOfletterInWord; i++) {
+            if (randomGenerator.nextInt() % 5 == 0) {
+                Character c = new Character('$');
+                string = string + c.toString();
+            }
+
+            if (randomGenerator.nextInt() % 2 == 0) {
+                Character c = new Character('_');
+                string = string + c.toString();
+            }
+            string += createRandomCharacterInAlphabetRange();
+            if (randomGenerator.nextInt() % 3 == 0)
+                string = string + createRandomNumbers();
+        }
+        return string.substring(0, numOfletterInWord - 1);
+    }
+
+    public static RandomObjectGenerator getInstance() {
+        if (randomObjectGenerator == null)
+            randomObjectGenerator = new RandomObjectGenerator();
+        return randomObjectGenerator;
+    }
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/SourceFolderUpdateTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/SourceFolderUpdateTest.java
new file mode 100644
index 0000000..58ac27b
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/SourceFolderUpdateTest.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2008 SAP AG 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:
+ *     SAP AG - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wtp.j2ee.headless.tests.j2ee.operations;
+
+import static org.eclipse.jst.j2ee.internal.common.operations.INewJavaClassDataModelProperties.SOURCE_FOLDER;
+import static org.eclipse.wst.common.componentcore.internal.operation.IArtifactEditOperationDataModelProperties.PROJECT_NAME;
+import junit.framework.Test;
+
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jst.j2ee.internal.common.operations.NewJavaClassDataModelProvider;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.tests.OperationTestCase;
+import org.eclipse.wtp.j2ee.headless.tests.utility.operations.UtilityProjectCreationOperationTest;
+
+public class SourceFolderUpdateTest extends OperationTestCase {
+	
+	public SourceFolderUpdateTest(String name) {
+		super(name);
+	}
+	
+	public static Test suite() {
+		return new SourceFolderUpdateTest("testSourceFolderUpdate");
+	}
+
+	@Override
+	protected void setUp() throws Exception {
+		super.setUp();
+		
+		// create 2 utility projects
+		runAndVerify(UtilityProjectCreationOperationTest.getUtilityDataModel("project1", null));
+		runAndVerify(UtilityProjectCreationOperationTest.getUtilityDataModel("project2", null));
+	}
+	
+	public void testSourceFolderUpdate() {
+		// create the new Java class data model
+		IDataModel model = DataModelFactory.createDataModel(new NewJavaClassDataModelProvider());
+		
+		// set the first project
+		model.setStringProperty(PROJECT_NAME, "project1");
+		
+		// the data model provider should already set the source folder, but we
+		// reset it in order to avoid further calls to the default value
+		model.setStringProperty(SOURCE_FOLDER, "/project1/src");
+		
+		// set the second project
+		model.setStringProperty(PROJECT_NAME, "project2");
+		
+		// check if the source folder has switched to the one of the second project
+		assertEquals(new Path("/project2/src"), new Path(model.getStringProperty(SOURCE_FOLDER)));
+	}
+
+	@Override
+	protected void tearDown() throws Exception {
+		super.tearDown();
+		deleteAllProjects();
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/jca/operations/AllTests.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/jca/operations/AllTests.java
new file mode 100644
index 0000000..3bba930
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/jca/operations/AllTests.java
@@ -0,0 +1,31 @@
+/*
+ * Created on Feb 2, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package org.eclipse.wtp.j2ee.headless.tests.jca.operations;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * @author jsholl
+ *
+ * To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+public class AllTests extends TestSuite {
+
+    public static Test suite(){
+        return new AllTests();
+    }
+    
+    public AllTests(){
+        super("JCA Operation Tests");
+        addTest(JCAProjectCreationOperationTest.suite());
+        addTest(JCAExportOperationTest.suite());
+        addTest(JCAImportOperationTest.suite());
+    }
+    
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/jca/operations/JCAExportOperationTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/jca/operations/JCAExportOperationTest.java
new file mode 100644
index 0000000..28f04f0
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/jca/operations/JCAExportOperationTest.java
@@ -0,0 +1,136 @@
+/*
+ * Created on Jan 6, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package org.eclipse.wtp.j2ee.headless.tests.jca.operations;
+
+import junit.framework.Test;
+
+import org.eclipse.jst.j2ee.datamodel.properties.IJ2EEComponentExportDataModelProperties;
+import org.eclipse.jst.j2ee.internal.jca.operations.ConnectorComponentExportDataModelProvider;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.tests.OperationTestCase;
+import org.eclipse.wst.common.tests.SimpleTestSuite;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.JavaEEFacetConstants;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.JavaFileTestingUtilities;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleExportOperationTest;
+
+/**
+ * @author Administrator
+ * @author Ian Tewksbury (ictewksb@us.ibm.com)
+ *
+ * To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+public class JCAExportOperationTest extends ModuleExportOperationTest {
+	public JCAExportOperationTest() {
+		super("JCAExportOperationTests");
+	}
+	
+	public JCAExportOperationTest(String name) {
+		super(name);
+	}
+	
+	public static Test suite() {
+		return new SimpleTestSuite(JCAExportOperationTest.class);
+	}
+	
+	public void testConnectorExport10_Defaults() throws Exception{
+		IDataModel dm = JCAProjectCreationOperationTest.getConnectorDataModel("aConnector", null, null, JavaEEFacetConstants.CONNECTOR_1);
+		OperationTestCase.runDataModel(dm);
+
+		runExportTests_All(dm);
+	}
+
+	public void testConnectorExport15_Defaults() throws Exception{
+		IDataModel dm = JCAProjectCreationOperationTest.getConnectorDataModel("bConnector", null, null, JavaEEFacetConstants.CONNECTOR_15);
+		OperationTestCase.runDataModel(dm);
+
+		runExportTests_All(dm);
+	}
+
+	public void testConnectorExport10_WithEAR() throws Exception{
+		IDataModel dm = JCAProjectCreationOperationTest.getConnectorDataModel("cConnector", "myEAR", null, JavaEEFacetConstants.CONNECTOR_1);
+		OperationTestCase.runDataModel(dm);
+
+		runExportTests_All(dm);
+	}
+
+	public void testConnectorExport15_WithEAR() throws Exception{
+		IDataModel dm = JCAProjectCreationOperationTest.getConnectorDataModel("dConnector", "yourEAR", null, JavaEEFacetConstants.CONNECTOR_15);
+		OperationTestCase.runDataModel(dm);
+
+		runExportTests_All(dm);
+	}
+
+	public void testConnectorExport10_ChangedSourceFolder() throws Exception{
+		IDataModel dm = JCAProjectCreationOperationTest.getConnectorDataModel("eConnector",null, "mySrc", JavaEEFacetConstants.CONNECTOR_1);
+		OperationTestCase.runDataModel(dm);
+
+		runExportTests_All(dm);
+	}
+
+	public void testConnectorExport15_ChangedSourceFolder() throws Exception{
+		IDataModel dm = JCAProjectCreationOperationTest.getConnectorDataModel("fConnector", null, "ourSrc", JavaEEFacetConstants.CONNECTOR_15);
+		OperationTestCase.runDataModel(dm);
+
+		runExportTests_All(dm);
+	}
+
+	public void testConnectorExport10_ChangedSourceFolder_WithEAR() throws Exception{
+		IDataModel dm = JCAProjectCreationOperationTest.getConnectorDataModel("gConnector", "coolEAR", "theirSrc", JavaEEFacetConstants.CONNECTOR_1);
+		OperationTestCase.runDataModel(dm);
+
+		runExportTests_All(dm);
+	}
+
+	public void testConnectorExport15_ChangedSourceFolder_WithEAR() throws Exception{
+		IDataModel dm = JCAProjectCreationOperationTest.getConnectorDataModel("hConnector", "netoEAR", "weSrc", JavaEEFacetConstants.CONNECTOR_15);
+		OperationTestCase.runDataModel(dm);
+
+		runExportTests_All(dm);
+	}
+	
+	@Override
+	protected String getModuleExtension() {
+		return ".rar";
+	}
+
+	@Override
+	protected IDataModel getExportDataModel(String projectName, String destination, boolean exportSource, boolean runBuild, boolean overwriteExisting) {
+		return getRARExportDataModel(projectName, destination, exportSource, runBuild, overwriteExisting);
+	}
+
+	/**
+	 * @param projectName name of the project to export
+	 * @param destination destination to export to
+	 * @param exportSource if TRUE export source files, else don't
+	 * @param runBuild if TRUE run a build before exporting, else don't
+	 * @param overwriteExisting if TRUE overwrite existing files, else don't
+	 * @return an EJBComponentExport data model with all of the given settings.
+	 */
+	public static IDataModel getRARExportDataModel(String projectName, String destination, boolean exportSource, boolean runBuild, boolean overwriteExisting){
+		IDataModel exportModel = DataModelFactory.createDataModel(new ConnectorComponentExportDataModelProvider());
+
+		exportModel.setProperty(IJ2EEComponentExportDataModelProperties.PROJECT_NAME, projectName);
+		exportModel.setProperty(IJ2EEComponentExportDataModelProperties.ARCHIVE_DESTINATION, destination);
+		exportModel.setProperty(IJ2EEComponentExportDataModelProperties.EXPORT_SOURCE_FILES, exportSource);
+		exportModel.setProperty(IJ2EEComponentExportDataModelProperties.OVERWRITE_EXISTING, overwriteExisting);
+		exportModel.setProperty(IJ2EEComponentExportDataModelProperties.RUN_BUILD, runBuild);
+
+		return exportModel;
+	}
+	
+	@Override
+	protected void addJavaFilesToProject(String projectName, String[] classNames, String prackageName) throws Exception {
+		JavaFileTestingUtilities.addJavaFilesToConnector(projectName, classNames, prackageName);
+	}
+	
+	@Override
+	protected void verifyJavaFilesExported(String archiveName, String[] classNames, String packageName, boolean withClassFiles, boolean withSource) throws Exception {
+		JavaFileTestingUtilities.verifyJavaFilesInRAR(archiveName, classNames, packageName, withClassFiles, withSource);
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/jca/operations/JCAImportOperationTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/jca/operations/JCAImportOperationTest.java
new file mode 100644
index 0000000..e65eb5f
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/jca/operations/JCAImportOperationTest.java
@@ -0,0 +1,99 @@
+/*
+ * Created on Jan 6, 2004
+ * 
+ * To change the template for this generated file go to Window - Preferences - Java - Code
+ * Generation - Code and Comments
+ */
+package org.eclipse.wtp.j2ee.headless.tests.jca.operations;
+
+import junit.framework.Test;
+
+import org.eclipse.jst.j2ee.datamodel.properties.IJ2EEComponentImportDataModelProperties;
+import org.eclipse.jst.j2ee.internal.jca.operations.ConnectorComponentImportDataModelProvider;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.tests.SimpleTestSuite;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleImportOperationTest;
+
+/**
+ * @author Ian Tewksbury (ictewksb@us.ibm.com)
+ * 
+ * To change the template for this generated type comment go to Window - Preferences - Java - Code
+ * Generation - Code and Comments
+ */
+public class JCAImportOperationTest extends ModuleImportOperationTest {
+
+	public JCAImportOperationTest() {
+		super("JCAImportOperationTests");
+	}
+	
+	public JCAImportOperationTest(String name) {
+		super(name);
+	}
+	
+	public static Test suite() {
+		return new SimpleTestSuite(JCAImportOperationTest.class);
+	}
+	
+	public void testConnectorImport10_Defaults() throws Exception{
+		runImportTests_All("Connector10_Defaults");
+	}
+
+	public void testConnectorImport15_Defaults() throws Exception{
+		runImportTests_All("Connector15_Defaults");
+	}
+
+	public void testConnectorImport10_WithEAR() throws Exception{
+		runImportTests_All("Connector10_WithEAR");
+	}
+
+	public void testConnectorImport15_WithEAR() throws Exception{
+		runImportTests_All("Connector15_WithEAR");
+	}
+
+	public void testConnectorImport10_DiffSourceFolder() throws Exception{
+		runImportTests_All("Connector10_DiffSourceFolder");
+	}
+
+	public void testConnectorImport15_DiffSourceFolder() throws Exception{
+		runImportTests_All("Connector15_DiffSourceFolder");
+	}
+
+	public void testConnectorImport10_DiffSourceFolder_WithEAR() throws Exception{
+		runImportTests_All("Connector10_DiffSourceFolder_WithEAR");
+	}
+
+	public void testConnectorImport15_DiffSourceFolder_WithEAR() throws Exception{
+		runImportTests_All("Connector15_DiffSourceFolder_WithEAR");
+	}
+	
+	
+	@Override
+	protected String getModuleExtension() {
+		return ".rar";
+	}
+	
+	@Override
+	protected IDataModel getImportDataModel(String filePath, String projectName, IDataModel creationModel, boolean closeArchiveOnDispose) {
+		return getJCAImportDataModel(filePath, projectName, creationModel, closeArchiveOnDispose);
+	}
+	
+    public static IDataModel getJCAImportDataModel(String filePath, String projectName, IDataModel creationModel, boolean closeArchiveOnDispose) {
+    	IDataModel importModel = DataModelFactory.createDataModel(new ConnectorComponentImportDataModelProvider());
+    	
+    	importModel.setProperty(IJ2EEComponentImportDataModelProperties.FILE_NAME, filePath);
+    	importModel.setProperty(IJ2EEComponentImportDataModelProperties.PROJECT_NAME, projectName);
+    	importModel.setProperty(IJ2EEComponentImportDataModelProperties.CLOSE_ARCHIVE_ON_DISPOSE, closeArchiveOnDispose);
+    	
+    	if(creationModel != null) {
+    		importModel.setProperty(IJ2EEComponentImportDataModelProperties.NESTED_MODEL_J2EE_COMPONENT_CREATION, creationModel);
+    	}
+    	
+    	return importModel;
+    }
+	
+	@Override
+	protected IDataModel getExportDataModel(String projectName, String destination, boolean exportSource, boolean runBuild, boolean overwriteExisting) {
+		return JCAExportOperationTest.getRARExportDataModel(projectName, destination, exportSource, runBuild, overwriteExisting);
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/jca/operations/JCAProjectCreationOperationTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/jca/operations/JCAProjectCreationOperationTest.java
new file mode 100644
index 0000000..c7d9ee6
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/jca/operations/JCAProjectCreationOperationTest.java
@@ -0,0 +1,160 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.wtp.j2ee.headless.tests.jca.operations;
+
+import junit.framework.Test;
+
+import org.eclipse.jst.j2ee.jca.project.facet.ConnectorFacetProjectCreationDataModelProvider;
+import org.eclipse.jst.j2ee.jca.project.facet.IConnectorFacetInstallDataModelProperties;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetConstants;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetProjectCreationDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties.FacetDataModelMap;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
+import org.eclipse.wst.common.tests.OperationTestCase;
+import org.eclipse.wst.common.tests.SimpleTestSuite;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.JavaEEFacetConstants;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleProjectCreationOperationTest;
+
+public class JCAProjectCreationOperationTest extends ModuleProjectCreationOperationTest {
+    
+	public JCAProjectCreationOperationTest() {
+		super("ConnectorProjectCreationOperationTests");
+	}
+
+	public JCAProjectCreationOperationTest(String name) {
+		super(name);
+	}
+
+    public static Test suite() {
+    	return new SimpleTestSuite(JCAProjectCreationOperationTest.class);
+    }
+    
+    public void testConnector10_Defaults() throws Exception{
+    	IDataModel dm = getConnectorDataModel("aConnector", null, null, JavaEEFacetConstants.CONNECTOR_1);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testConnector15_Defaults() throws Exception{
+    	IDataModel dm = getConnectorDataModel("bConnector", null, null, JavaEEFacetConstants.CONNECTOR_15);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testConnector16_Defaults() throws Exception{
+    	IDataModel dm = getConnectorDataModel("iConnector", null, null, JavaEEFacetConstants.CONNECTOR_16);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testConnector10_WithEAR() throws Exception{
+    	IDataModel dm = getConnectorDataModel("cConnector", "myEAR", null, JavaEEFacetConstants.CONNECTOR_1);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testConnector15_WithEAR() throws Exception{
+    	IDataModel dm = getConnectorDataModel("dConnector", "yourEAR", null, JavaEEFacetConstants.CONNECTOR_15);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testConnector16_WithEAR() throws Exception{
+    	IDataModel dm = getConnectorDataModel("jConnector", "herEAR", null, JavaEEFacetConstants.CONNECTOR_16);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testConnector10_ChangedSrouceFolder() throws Exception{
+    	IDataModel dm = getConnectorDataModel("eConnector",null, "mySrc", JavaEEFacetConstants.CONNECTOR_1);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testConnector15_ChangedSrouceFolder() throws Exception{
+    	IDataModel dm = getConnectorDataModel("fConnector", null, "ourSrc", JavaEEFacetConstants.CONNECTOR_15);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testConnector16_ChangedSrouceFolder() throws Exception{
+    	IDataModel dm = getConnectorDataModel("kConnector", null, "herSrc", JavaEEFacetConstants.CONNECTOR_16);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testConnector10_ChangedSrouceFolder_WithEAR() throws Exception{
+    	IDataModel dm = getConnectorDataModel("gConnector", "coolEAR", "theirSrc", JavaEEFacetConstants.CONNECTOR_1);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testConnector15_ChangedSrouceFolder_WithEAR() throws Exception{
+    	IDataModel dm = getConnectorDataModel("hConnector", "netoEAR", "weSrc", JavaEEFacetConstants.CONNECTOR_15);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testConnector16_ChangedSrouceFolder_WithEAR() throws Exception{
+    	IDataModel dm = getConnectorDataModel("lConnector", "niceEAR", "hisSrc", JavaEEFacetConstants.CONNECTOR_16);
+    	OperationTestCase.runAndVerify(dm);
+    }
+
+    /**
+     * Creates and returns an Connector Data Model with the given name and of the given version.
+     * If earName is not null then Connector will be added to the EAR with earName.
+     * Can also specify none default source folder
+     * 
+     * @param projName name of the project to create
+     * @param earName name of the EAR to add the project too, if NULL then don't add to an EAR
+     * @param sourceFolder name of the source folder to use, if NULL then use default
+     * @param version version of Application Client to use
+     * @return a Connector Model with the appropriate properties set
+     */
+    public static IDataModel getConnectorDataModel(String projName, String earName, String sourceFolder, IProjectFacetVersion version){
+    	IDataModel dm = DataModelFactory.createDataModel(new ConnectorFacetProjectCreationDataModelProvider());
+    	dm.setProperty(IFacetProjectCreationDataModelProperties.FACET_PROJECT_NAME, projName);
+    	
+    	if(earName != null) {
+        	dm.setProperty(IJ2EEFacetProjectCreationDataModelProperties.ADD_TO_EAR, true);
+        	dm.setProperty(IJ2EEFacetProjectCreationDataModelProperties.EAR_PROJECT_NAME, earName);
+    	} else {
+    		dm.setProperty(IJ2EEFacetProjectCreationDataModelProperties.ADD_TO_EAR, false);
+    	}
+    	
+    	FacetDataModelMap facetMap = (FacetDataModelMap) dm.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
+        IDataModel facetModel = facetMap.getFacetDataModel(IJ2EEFacetConstants.JCA);
+        facetModel.setProperty(IFacetDataModelProperties.FACET_VERSION, version);
+        
+        if(sourceFolder != null) {
+        	facetModel.setProperty(IConnectorFacetInstallDataModelProperties.CONFIG_FOLDER, sourceFolder);
+        }
+        
+        //be sure to use Java5 with JEE5
+        if(version == JavaEEFacetConstants.CONNECTOR_15){
+            IDataModel javaFacetModel = facetMap.getFacetDataModel(IJ2EEFacetConstants.JAVA);
+            javaFacetModel.setProperty(IFacetDataModelProperties.FACET_VERSION, JavaEEFacetConstants.JAVA_5);
+        }
+        else if(version == JavaEEFacetConstants.CONNECTOR_16) {
+            IDataModel javaFacetModel = facetMap.getFacetDataModel(IJ2EEFacetConstants.JAVA);
+            javaFacetModel.setProperty(IFacetDataModelProperties.FACET_VERSION, JavaEEFacetConstants.JAVA_6);
+        }
+        
+    	return dm;
+    }
+
+//    public IDataModel getComponentCreationDataModel() {
+//        return DataModelFactory.createDataModel(IConnectorFacetInstallDataModelProperties.class);
+//    }
+//    
+//    public IDataModel getComponentCreationDataModelWithEar() {
+//        IDataModel model =  getComponentCreationDataModel();
+//        FacetDataModelMap map = (FacetDataModelMap) model.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
+//        IDataModel facetDM = map.getFacetDataModel(IConnectorFacetInstallDataModelProperties.JCA);
+//        facetDM.setBooleanProperty( IJ2EEModuleFacetInstallDataModelProperties.ADD_TO_EAR, true );
+//        return model;
+//    }   
+    
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/plugin/AllPluginTests.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/plugin/AllPluginTests.java
new file mode 100644
index 0000000..840cd5d
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/plugin/AllPluginTests.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ * Created on Feb 2, 2004
+ * 
+ * To change the template for this generated file go to Window - Preferences - Java - Code Generation - Code and
+ * Comments
+ */
+package org.eclipse.wtp.j2ee.headless.tests.plugin;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.core.runtime.Path;
+import org.eclipse.wst.server.core.IRuntime;
+import org.eclipse.wst.server.core.IRuntimeType;
+import org.eclipse.wst.server.core.IRuntimeWorkingCopy;
+import org.eclipse.wst.server.core.ServerCore;
+
+/**
+ * @author jsholl
+ * 
+ * To change the template for this generated type comment go to Window - Preferences - Java - Code Generation - Code
+ * and Comments
+ */
+public class AllPluginTests extends TestSuite {
+	
+	public static IRuntime JONAS_SERVER = createJONASRuntime();
+
+    public static Test suite() {
+        return new AllPluginTests();
+    }
+
+	public AllPluginTests() {
+		super();
+		addTest(org.eclipse.jst.j2ee.tests.bvt.EnterpriseBVT.suite());
+		addTest(org.eclipse.jst.j2ee.tests.bvt.EJBBVT.suite());
+		addTest(org.eclipse.jst.j2ee.tests.bvt.WebBVT.suite());
+		addTest(org.eclipse.jst.j2ee.tests.bvt.CoreInfrastructureBVT.suite());
+		addTest(org.eclipse.jst.j2ee.tests.bvt.ModelProviderBVT.suite());
+		addTest(org.eclipse.jst.j2ee.tests.bvt.ExtendedModelProviderBVT.suite());
+	}
+    
+    public static IRuntime createJONASRuntime()  {
+    	String s = System.getProperty("org.eclipse.jst.server.jonas.432");
+    	if (s == null || s.length() == 0)
+    		return null;
+    	try {
+    		IRuntimeType rt = ServerCore.findRuntimeType("org.eclipse.jst.server.core.runtimeType");
+    		IRuntimeWorkingCopy wc = rt.createRuntime(null, null);
+    		wc.setLocation(new Path(s));
+    		return wc.save(true, null);
+    	} catch (Exception e) {
+    		e.printStackTrace();
+    		return null;
+    	}
+    }
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/plugin/AllTestsSuite.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/plugin/AllTestsSuite.java
new file mode 100644
index 0000000..2a2c2eb
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/plugin/AllTestsSuite.java
@@ -0,0 +1,73 @@
+/*
+ * Created on Apr 1, 2003
+ *
+ * To change this generated comment go to 
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+package org.eclipse.wtp.j2ee.headless.tests.plugin;
+
+import java.net.URL;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+import junit.textui.TestRunner;
+
+import org.eclipse.core.runtime.IPluginDescriptor;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jst.j2ee.archive.emftests.AllTests;
+import org.eclipse.jst.j2ee.tests.bvt.AutomatedBVT;
+import org.eclipse.wst.common.frameworks.artifactedit.tests.ArtifactEditAPITests;
+import org.eclipse.wst.common.frameworks.datamodel.tests.DataModelAPITests;
+
+
+/**
+ * @author jsholl
+ *
+ * To change this generated comment go to 
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+public class AllTestsSuite extends TestSuite {
+
+    public static String baseDirectory = System.getProperty("user.dir") + java.io.File.separatorChar + "TestData" + java.io.File.separatorChar;
+    
+    static {
+        try {
+            IPluginDescriptor pluginDescriptor = Platform.getPluginRegistry().getPluginDescriptor("org.eclipse.jst.j2ee.tests");
+            URL url = pluginDescriptor.getInstallURL(); 
+        	AutomatedBVT.baseDirectory = Platform.asLocalURL(url).getFile() + "TestData"+ java.io.File.separatorChar;
+		} catch (Exception e) { 
+			System.err.println("Using working directory since a workspace URL could not be located.");
+		} 
+    }
+
+    public static int unimplementedMethods;
+
+    public static void main(String[] args) {
+        unimplementedMethods = 0;
+        TestRunner.run(suite());
+        if (unimplementedMethods > 0) {
+            System.out.println("\nCalls to warnUnimpl: " + unimplementedMethods);
+        }
+    }
+
+    public AllTestsSuite() {
+        super();
+        TestSuite suite = (TestSuite) AutomatedBVT.suite();
+        for (int i = 0; i < suite.testCount(); i++) {
+            addTest(suite.testAt(i));
+        }
+    }
+
+    public static Test suite() {
+        TestSuite suite = new TestSuite("Test for org.eclipse.jst.j2ee.test.bvt");
+        //WST common
+        suite.addTest(org.eclipse.wst.common.frameworks.componentcore.tests.AllTests.suite());
+		suite.addTest(DataModelAPITests.suite());
+		suite.addTest(ArtifactEditAPITests.suite());
+		//j2ee.core
+        suite.addTest(AllTests.suite());
+        //j2ee
+        suite.addTest(AllPluginTests.suite());
+        return suite;
+    }
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/plugin/HeadlessTestsPlugin.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/plugin/HeadlessTestsPlugin.java
new file mode 100644
index 0000000..084ffd3
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/plugin/HeadlessTestsPlugin.java
@@ -0,0 +1,76 @@
+package org.eclipse.wtp.j2ee.headless.tests.plugin;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.Plugin;
+import org.eclipse.wst.common.tests.DataModelVerifierFactory;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.verifiers.DataModelVerifierListGenerator;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The main plugin class to be used in the desktop.
+ */
+public class HeadlessTestsPlugin extends Plugin {
+	//The shared instance.
+	private static HeadlessTestsPlugin plugin;
+	//Resource bundle.
+	private ResourceBundle resourceBundle;
+	
+	/**
+	 * The constructor.
+	 */
+	public HeadlessTestsPlugin() {
+		super();
+		plugin = this;
+		try {
+			resourceBundle= ResourceBundle.getBundle("org.eclipse.wtp.j2ee.wb.tests.TestsPluginResources");
+		} catch (MissingResourceException x) {
+			resourceBundle = null;
+		}
+	}
+
+	/**
+	 * Returns the shared instance.
+	 */
+	public static HeadlessTestsPlugin getDefault() {
+		return plugin;
+	}
+
+	/**
+	 * Returns the workspace instance.
+	 */
+	public static IWorkspace getWorkspace() {
+		return ResourcesPlugin.getWorkspace();
+	}
+
+	/**
+	 * Returns the string from the plugin's resource bundle,
+	 * or 'key' if not found.
+	 */
+	public static String getResourceString(String key) {
+		ResourceBundle bundle= getDefault().getResourceBundle();
+		try {
+			return (bundle!=null ? bundle.getString(key) : key);
+		} catch (MissingResourceException e) {
+			return key;
+		}
+	}
+	
+	@Override
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+		
+		//needed so that jee operation tests will verify correctly
+		DataModelVerifierFactory.getInstance().addToDataModelVerifiersMap(DataModelVerifierListGenerator.getVerifiers());
+	}
+	
+	/**
+	 * Returns the plugin's resource bundle,
+	 */
+	public ResourceBundle getResourceBundle() {
+		return resourceBundle;
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/utility/operations/AllTests.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/utility/operations/AllTests.java
new file mode 100644
index 0000000..7bf64f3
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/utility/operations/AllTests.java
@@ -0,0 +1,20 @@
+package org.eclipse.wtp.j2ee.headless.tests.utility.operations;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * @author itewk
+ */
+public class AllTests extends TestSuite {
+    public static Test suite(){
+        return new AllTests();
+    }
+    
+    public AllTests(){
+        super("Java Utility Operation Tests");
+        addTest(UtilityProjectCreationOperationTest.suite());
+        addTest(UtilityExportOperationTest.suite());
+        addTest(UtilityImportOperationTest.suite());
+    }
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/utility/operations/UtilityExportOperationTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/utility/operations/UtilityExportOperationTest.java
new file mode 100644
index 0000000..c1bc620
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/utility/operations/UtilityExportOperationTest.java
@@ -0,0 +1,134 @@
+/**
+ * 
+ */
+package org.eclipse.wtp.j2ee.headless.tests.utility.operations;
+
+import junit.framework.Test;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jst.j2ee.project.JavaEEProjectUtilities;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.tests.OperationTestCase;
+import org.eclipse.wst.common.tests.SimpleTestSuite;
+import org.eclipse.wtp.j2ee.headless.tests.ear.operations.EARExportOperationTest;
+import org.eclipse.wtp.j2ee.headless.tests.ear.operations.EARProjectCreationOperationTest;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.JavaEEFacetConstants;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.JavaFileTestingUtilities;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleExportOperationTest;
+
+/**
+ * @author itewk
+ *
+ */
+public class UtilityExportOperationTest extends ModuleExportOperationTest {
+	private static final String EAR_PROJECT_NAME = "testEAR";
+	
+	public UtilityExportOperationTest() {
+		super("UtilityExportOperationTests");
+	}
+	
+	public UtilityExportOperationTest(String name) {
+		super(name);
+	}
+	
+	public static Test suite() {
+		return new SimpleTestSuite(UtilityExportOperationTest.class);
+	}
+	
+	
+	public void testUtilityExport_Defaults() throws Exception {
+		IDataModel dm = UtilityProjectCreationOperationTest.getUtilityDataModel("aJavaUtility", EAR_PROJECT_NAME);
+		OperationTestCase.runAndVerify(dm);
+		
+		runExportTests_All(dm);
+	}
+	
+    public void testUtilityExport_AddToExisitingEAR12() throws Exception {
+    	IDataModel earModel = EARProjectCreationOperationTest.getEARDataModel(EAR_PROJECT_NAME, null, null, null, JavaEEFacetConstants.EAR_12, true);
+    	//IMPROVE PERFORMENCE: don't need to verify export model again here, its already bean done in other tests
+		runDataModel(earModel);
+    	
+    	IDataModel dm = UtilityProjectCreationOperationTest.getUtilityDataModel("cJavaUtility", EAR_PROJECT_NAME);
+    	OperationTestCase.runAndVerify(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    public void testUtilityExport_AddToExisitingEAR13() throws Exception {
+    	IDataModel earModel = EARProjectCreationOperationTest.getEARDataModel(EAR_PROJECT_NAME, null, null, null, JavaEEFacetConstants.EAR_13, true);
+    	//IMPROVE PERFORMENCE: don't need to verify export model again here, its already bean done in other tests
+		runDataModel(earModel);
+    	
+    	IDataModel dm = UtilityProjectCreationOperationTest.getUtilityDataModel("dJavaUtility", EAR_PROJECT_NAME);
+    	OperationTestCase.runAndVerify(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    public void testUtilityExport_AddToExisitingEAR14() throws Exception {
+    	IDataModel earModel = EARProjectCreationOperationTest.getEARDataModel(EAR_PROJECT_NAME, null, null, null, JavaEEFacetConstants.EAR_14, true);
+    	//IMPROVE PERFORMENCE: don't need to verify export model again here, its already bean done in other tests
+		runDataModel(earModel);
+    	
+    	IDataModel dm = UtilityProjectCreationOperationTest.getUtilityDataModel("eJavaUtility", EAR_PROJECT_NAME);
+    	OperationTestCase.runAndVerify(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    public void testUtilityExport_AddToExisitingEAR5_WithoutDD() throws Exception {
+    	IDataModel earModel = EARProjectCreationOperationTest.getEARDataModel(EAR_PROJECT_NAME, null, null, null, JavaEEFacetConstants.EAR_5, false);
+    	//IMPROVE PERFORMENCE: don't need to verify export model again here, its already bean done in other tests
+		runDataModel(earModel);
+    	
+    	IDataModel dm = UtilityProjectCreationOperationTest.getUtilityDataModel("fJavaUtility", EAR_PROJECT_NAME);
+    	OperationTestCase.runAndVerify(dm);
+    	
+    	runExportTests_All(dm);
+    }
+    
+    public void testUtilityExport_AddToExisitingEAR5_WithDD() throws Exception {
+    	IDataModel earModel = EARProjectCreationOperationTest.getEARDataModel(EAR_PROJECT_NAME, null, null, null, JavaEEFacetConstants.EAR_5, true);
+    	//IMPROVE PERFORMENCE: don't need to verify export model again here, its already bean done in other tests
+		runDataModel(earModel);
+    	
+    	IDataModel dm = UtilityProjectCreationOperationTest.getUtilityDataModel("gJavaUtility", EAR_PROJECT_NAME);
+    	OperationTestCase.runAndVerify(dm);
+    	
+    	runExportTests_All(dm);
+    }
+	
+	
+	@Override
+	protected void addJavaFilesToProject(String projectName,
+			String[] classNames, String prackageName) throws Exception {
+		
+		//will be exporting the utility project within an EAR thus use utitilities for EARs to added files
+		IProject earProject = JavaEEProjectUtilities.getProject(EAR_PROJECT_NAME);
+		JavaFileTestingUtilities.addJavaFilesToAllProjectsInEAR(earProject);
+	}
+
+	@Override
+	protected void verifyJavaFilesExported(String archivePath,
+			String[] classNames, String packageName, boolean withClassFiles,
+			boolean withSource) throws Exception {
+		
+		//project was exported within an EAR so need to verify files based on this
+		JavaFileTestingUtilities.verifyAllJavaFilesExportedToProjectsInEAR(archivePath, withClassFiles, withSource);
+	}
+
+	@Override
+	protected IDataModel getExportDataModel(String projectName,
+			String destination, boolean exportSource, boolean runBuild,
+			boolean overwriteExisting) {
+		
+		//only makes sence to test exporting the utility project within an EAR
+		return EARExportOperationTest.getEARExportDataModel(EAR_PROJECT_NAME, destination, exportSource, runBuild, overwriteExisting);
+	}
+
+	@Override
+	protected String getModuleExtension() {
+		//using .ear and not .jar because we are testing exporting the utilities within EARs a
+		return ".ear";
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/utility/operations/UtilityImportOperationTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/utility/operations/UtilityImportOperationTest.java
new file mode 100644
index 0000000..0c3fd5c
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/utility/operations/UtilityImportOperationTest.java
@@ -0,0 +1,185 @@
+/**
+ * 
+ */
+package org.eclipse.wtp.j2ee.headless.tests.utility.operations;
+
+import java.util.Collections;
+import java.util.List;
+
+import junit.framework.Test;
+
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jst.j2ee.internal.archive.ArchiveWrapper;
+import org.eclipse.jst.j2ee.internal.archive.JavaEEArchiveUtilities;
+import org.eclipse.jst.jee.archive.IArchive;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.tests.OperationTestCase;
+import org.eclipse.wst.common.tests.SimpleTestSuite;
+import org.eclipse.wtp.j2ee.headless.tests.ear.operations.EARExportOperationTest;
+import org.eclipse.wtp.j2ee.headless.tests.ear.operations.EARImportOperationTest;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleImportOperationTest;
+
+/**
+ * @author itewk
+ *
+ */
+public class UtilityImportOperationTest extends ModuleImportOperationTest {
+	private IArchive archive;
+	
+	public UtilityImportOperationTest() {
+		super("UtilityImportOperationTests");
+		
+		archive = null;
+	}
+	
+	public UtilityImportOperationTest(String name) {
+		super(name);
+	}
+	
+	public static Test suite() {
+		return new SimpleTestSuite(UtilityImportOperationTest.class);
+	}	
+	
+    public void testUtilityImport_Defaults() throws Exception{
+    	runImportTests_All("Utility_Defaults");
+    }
+	
+    public void testUtilityImport_AddToExisitingEAR12() throws Exception {
+    	runImportTests_All("Utility_AddToExisitingEAR12");
+    }
+    
+    public void testUtilityImport_AddToExisitingEAR13() throws Exception {
+    	runImportTests_All("Utility_AddToExisitingEAR13");
+    }
+    
+    public void testUtilityImport_AddToExisitingEAR14() throws Exception {
+    	runImportTests_All("Utility_AddToExisitingEAR14");
+    }
+    
+    /*
+    public void testUtilityImport_AddToExisitingEAR5_WithoutDD() throws Exception {
+    	runImportTests_All("Utility_AddToExisitingEAR5_WithoutDD");
+    }
+    */
+    
+    public void testUtilityImport_AddToExisitingEAR5_WithDD() throws Exception {
+    	runImportTests_All("Utility_AddToExisitingEAR5_WithDD");
+    }
+	
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.JEEImportOperationTest#getExportDataModel(java.lang.String, java.lang.String, boolean, boolean, boolean)
+	 */
+	@Override
+	protected IDataModel getExportDataModel(String projectName,
+			String destination, boolean exportSource, boolean runBuild,
+			boolean overwriteExisting) {
+		
+		//only makes since to test utility projects exported/imported within an EAR
+		return EARExportOperationTest.getEARExportDataModel(projectName, destination, exportSource, runBuild, overwriteExisting);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.JEEImportOperationTest#getImportDataModel(java.lang.String, java.lang.String, org.eclipse.jst.j2ee.internal.archive.operations.IOverwriteHandler, org.eclipse.wst.common.frameworks.datamodel.IDataModel, boolean)
+	 */
+	@Override
+	protected IDataModel getImportDataModel(String filePath,
+			String projectName, 
+			IDataModel creationModel, boolean closeArchiveOnDispose) throws Exception {
+		
+		//only makes sense to test utility projects exported/imported within an EAR
+		IDataModel earImportModel = EARImportOperationTest.getEARImportDataModel(filePath, projectName, creationModel, closeArchiveOnDispose);
+
+		archive = null;
+		List <ArchiveWrapper> utilityArchiveWrappers = Collections.EMPTY_LIST;
+
+		archive = JavaEEArchiveUtilities.INSTANCE.openArchive(new Path(filePath));
+		ArchiveWrapper wrappedArchive = new ArchiveWrapper(archive);
+
+		utilityArchiveWrappers = wrappedArchive.getEARUtilitiesAndWebLibs();
+		if (utilityArchiveWrappers.size() > 0){
+			filterEJBClientJars(utilityArchiveWrappers, wrappedArchive);
+		}
+
+		
+		earImportModel = EARImportOperationTest.setExtendedEARImportDataModelProperties(earImportModel, null, utilityArchiveWrappers, null, null, null, null);
+		return earImportModel;
+	}
+	/**
+	 * Should run all of the needed import tests for the child's type of import
+	 */
+	@Override
+	protected void runImportTests_All(String testName) throws Exception {
+		String archiveName = null;
+		
+		//need to keep the archive open for as long as the ImportDataModel is alive, otherwise it crashes because the
+		// nested Utility archives get closed
+
+		try {
+			archiveName = testName + "_Defaults" + getModuleExtension();
+			runAndVerifyImport_ExportedDefaults(archiveName);
+			OperationTestCase.deleteAllProjects();
+		} finally {
+			if (null != archive) {
+				JavaEEArchiveUtilities.INSTANCE.closeArchive(archive);
+			}
+		}
+		
+		try {
+			archiveName = testName + "_Source" + getModuleExtension();
+			runAndVerifyImport_ExportedWithSource(archiveName);
+			OperationTestCase.deleteAllProjects();
+		} finally {
+			if (null != archive) {
+				JavaEEArchiveUtilities.INSTANCE.closeArchive(archive);
+			}
+		}
+		
+		try {
+			archiveName = testName + "_NoBuild" + getModuleExtension();
+			runAndVerifyImport_ExportedWithDontRunBuild(archiveName);
+			OperationTestCase.deleteAllProjects();
+		} finally {
+			if (null != archive) {
+				JavaEEArchiveUtilities.INSTANCE.closeArchive(archive);
+			}
+		}
+		
+		try {
+			archiveName = testName + "_Source_NoBuild" + getModuleExtension();
+			runAndVerifyImport_ExportedWithSrouce_ExportedWithDontRunBuild(archiveName);
+			OperationTestCase.deleteAllProjects();
+		} finally {
+			if (null != archive) {
+				JavaEEArchiveUtilities.INSTANCE.closeArchive(archive);
+			}
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.JEEImportOperationTest#getModuleExtension()
+	 */
+	@Override
+	protected String getModuleExtension() {
+		//using .ear and not .jar because we are testing exporting the utilities within EARs a
+		return ".ear";
+	}
+	
+	private void filterEJBClientJars(List <ArchiveWrapper> utilities, ArchiveWrapper earWrapper) {
+		List <ArchiveWrapper> modules = earWrapper.getEarModules();
+		for(ArchiveWrapper module : modules){
+			if(module.isEJBJarFile()){
+				ArchiveWrapper clientWrapper = earWrapper.getEJBClientArchiveWrapper(module);
+				if(null != clientWrapper){
+					boolean removed = false;
+					for(int i=0;i<utilities.size() && !removed; i++){
+						if(clientWrapper.getUnderLyingArchive() == utilities.get(i).getUnderLyingArchive()){
+							utilities.remove(i);
+							removed = true;
+						}
+					}
+				}
+			}
+		}
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/utility/operations/UtilityProjectCreationOperationTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/utility/operations/UtilityProjectCreationOperationTest.java
new file mode 100644
index 0000000..2253593
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/utility/operations/UtilityProjectCreationOperationTest.java
@@ -0,0 +1,106 @@
+/**
+ * 
+ */
+package org.eclipse.wtp.j2ee.headless.tests.utility.operations;
+
+import junit.framework.Test;
+
+import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetProjectCreationDataModelProperties;
+import org.eclipse.jst.j2ee.project.facet.UtilityProjectCreationDataModelProvider;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.tests.OperationTestCase;
+import org.eclipse.wst.common.tests.SimpleTestSuite;
+import org.eclipse.wtp.j2ee.headless.tests.ear.operations.EARProjectCreationOperationTest;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.JavaEEFacetConstants;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleProjectCreationOperationTest;
+
+/**
+ * @author itewk
+ */
+public class UtilityProjectCreationOperationTest extends ModuleProjectCreationOperationTest {
+	public UtilityProjectCreationOperationTest() {
+		super("JavaUtilityProjectCreationOperationTests");
+	}
+
+	public UtilityProjectCreationOperationTest(String name) {
+		super(name);
+	}
+	
+    public static Test suite() {
+    	return new SimpleTestSuite(UtilityProjectCreationOperationTest.class);
+    }
+    
+    public void testUtility_Defaults() throws Exception{
+    	IDataModel dm = getUtilityDataModel("aJavaUtility", null);
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testUtility_AddToEAR() throws Exception{
+    	IDataModel dm = getUtilityDataModel("bJavaUtility", "bEAR");
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    
+    public void testUtility_AddToExisitingEAR12() throws Exception {
+    	IDataModel earModel = EARProjectCreationOperationTest.getEARDataModel("cEAR", null, null, null, JavaEEFacetConstants.EAR_12, true);
+    	//IMPROVE PERFORMENCE: don't need to verify export model again here, its already bean done in other tests
+		runDataModel(earModel);
+    	
+    	IDataModel dm = getUtilityDataModel("cJavaUtility", "cEAR");
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testUtility_AddToExisitingEAR13() throws Exception {
+    	IDataModel earModel = EARProjectCreationOperationTest.getEARDataModel("dEAR", null, null, null, JavaEEFacetConstants.EAR_13, true);
+    	//IMPROVE PERFORMENCE: don't need to verify export model again here, its already bean done in other tests
+		runDataModel(earModel);
+    	
+    	IDataModel dm = getUtilityDataModel("dJavaUtility", "dEAR");
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testUtility_AddToExisitingEAR14() throws Exception {
+    	IDataModel earModel = EARProjectCreationOperationTest.getEARDataModel("eEAR", null, null, null, JavaEEFacetConstants.EAR_14, true);
+    	//IMPROVE PERFORMENCE: don't need to verify export model again here, its already bean done in other tests
+		runDataModel(earModel);
+    	
+    	IDataModel dm = getUtilityDataModel("eJavaUtility", "eEAR");
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testUtility_AddToExisitingEAR5_WithoutDD() throws Exception {
+    	IDataModel earModel = EARProjectCreationOperationTest.getEARDataModel("fEAR", null, null, null, JavaEEFacetConstants.EAR_5, false);
+    	//IMPROVE PERFORMENCE: don't need to verify export model again here, its already bean done in other tests
+		runDataModel(earModel);
+    	
+    	IDataModel dm = getUtilityDataModel("fJavaUtility", "fEAR");
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+    public void testUtility_AddToExisitingEAR5_WithDD() throws Exception {
+    	IDataModel earModel = EARProjectCreationOperationTest.getEARDataModel("gEAR", null, null, null, JavaEEFacetConstants.EAR_5, true);
+    	//IMPROVE PERFORMENCE: don't need to verify export model again here, its already bean done in other tests
+		runDataModel(earModel);
+    	
+    	IDataModel dm = getUtilityDataModel("gJavaUtility", "gEAR");
+    	OperationTestCase.runAndVerify(dm);
+    }
+    
+	
+    public static IDataModel getUtilityDataModel(String projName, String earName){
+    	IDataModel model = DataModelFactory.createDataModel(new UtilityProjectCreationDataModelProvider());
+    	
+    	model.setProperty(IFacetProjectCreationDataModelProperties.FACET_PROJECT_NAME, projName);
+    	
+    	if(earName != null) {
+        	model.setProperty(IJ2EEFacetProjectCreationDataModelProperties.ADD_TO_EAR, true);
+        	model.setProperty(IJ2EEFacetProjectCreationDataModelProperties.EAR_PROJECT_NAME, earName);
+    	} else {
+    		model.setProperty(IJ2EEFacetProjectCreationDataModelProperties.ADD_TO_EAR, false);
+    	}
+    	
+    	return model;
+    }
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/AddWebArtifactOperationTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/AddWebArtifactOperationTest.java
new file mode 100644
index 0000000..cfe3cc9
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/AddWebArtifactOperationTest.java
@@ -0,0 +1,878 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2014 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *     Kaloyan Raev, kaloyan.raev@sap.com - bug 218496
+ *******************************************************************************/
+/*
+ * Created on May 13, 2004
+ */
+package org.eclipse.wtp.j2ee.headless.tests.web.operations;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
+import org.eclipse.jst.j2ee.common.Listener;
+import org.eclipse.jst.j2ee.internal.common.operations.INewJavaClassDataModelProperties;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPreferences;
+import org.eclipse.jst.j2ee.internal.web.operations.INewFilterClassDataModelProperties;
+import org.eclipse.jst.j2ee.internal.web.operations.INewServletClassDataModelProperties;
+import org.eclipse.jst.j2ee.internal.web.operations.NewFilterClassDataModelProvider;
+import org.eclipse.jst.j2ee.internal.web.operations.NewListenerClassDataModelProvider;
+import org.eclipse.jst.j2ee.internal.web.operations.NewServletClassDataModelProvider;
+import org.eclipse.jst.j2ee.model.IModelProvider;
+import org.eclipse.jst.j2ee.model.ModelProviderManager;
+import org.eclipse.jst.j2ee.project.WebUtilities;
+import org.eclipse.jst.j2ee.web.componentcore.util.WebArtifactEdit;
+import org.eclipse.jst.j2ee.webapplication.Filter;
+import org.eclipse.jst.j2ee.webapplication.FilterMapping;
+import org.eclipse.jst.j2ee.webapplication.Servlet;
+import org.eclipse.jst.j2ee.webapplication.ServletMapping;
+import org.eclipse.jst.j2ee.webapplication.WebApp;
+import org.eclipse.jst.javaee.core.DisplayName;
+import org.eclipse.jst.javaee.core.UrlPatternType;
+import org.eclipse.jst.jee.model.tests.SynchronousModelChangedListener;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
+import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
+import org.eclipse.wst.common.tests.OperationTestCase;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.JavaEEFacetConstants;
+
+public class AddWebArtifactOperationTest extends OperationTestCase implements
+		INewJavaClassDataModelProperties {
+	
+    public static final String WEB_PROJECT_NAME = "WebProject"; //$NON-NLS-1$
+    public static final String EAR_PROJECT_NAME = "EarProject"; //$NON-NLS-1$
+    
+    public static final String WEB_CONTEXT_ROOT = "WebRoot"; //$NON-NLS-1$
+    
+    public static final String PACKAGE = "test"; //$NON-NLS-1$
+    
+    public static final String SERVLET_NAME = "TestServlet"; //$NON-NLS-1$
+    public static final String SERVLET_CLASS_NAME = PACKAGE + "." + SERVLET_NAME; //$NON-NLS-1$
+    public static final String SERVLET_DEFAULT_MAPPING = "/" + SERVLET_NAME; //$NON-NLS-1$
+    
+    public static final String FILTER_NAME = "TestFilter"; //$NON-NLS-1$
+    public static final String FILTER_CLASS_NAME = PACKAGE + "." + FILTER_NAME; //$NON-NLS-1$
+    public static final String FILTER_DEFAULT_MAPPING = "/" + FILTER_NAME; //$NON-NLS-1$
+    
+    public static final String LISTENER_NAME = "TestListener"; //$NON-NLS-1$
+    public static final String LISTENER_CLASS_NAME = PACKAGE + "." + LISTENER_NAME; //$NON-NLS-1$
+	private IModelProvider mergedModelProvider;
+	
+    /**
+	 * @param name
+	 */
+	public AddWebArtifactOperationTest(String name) {
+		super(name);
+	}
+
+	/**
+	 * Default constructor
+	 */
+	public AddWebArtifactOperationTest() {
+		super();
+	}
+
+	public static Test suite() {
+        return new TestSuite(AddWebArtifactOperationTest.class);
+    }
+	
+	public void testAddServlet_Web24_Defaults_NoJETEmitter() throws Exception {
+		disableJETEmitter();
+		testAddServlet_Web24_Defaults();
+		enableJETEmitter();
+	}
+
+    public void testAddServlet_Web24_Defaults() throws Exception {
+    	createWebProject(WEB_PROJECT_NAME, JavaEEFacetConstants.WEB_24);
+    	WebArtifactEdit webEdit = null;
+    	IProject proj = ProjectUtilities.getProject(WEB_PROJECT_NAME);
+    	try {
+    		webEdit = new WebArtifactEdit(proj, false, true);
+    		WebApp webApp = webEdit.getWebApp();
+        	addServlet_Defaults();
+        	if (webApp != null) {
+        		assertJavaFileExists(SERVLET_CLASS_NAME);
+        		
+        		Servlet servlet = webApp.getServletNamed(SERVLET_NAME);
+        		assertNotNull("Servlet " + SERVLET_NAME + " not found in the model", servlet);
+        		assertEquals("Servlet points to an unexpected deployment descriptor object", 
+        				webApp, servlet.getWebApp());
+        		assertEquals("Servlet name is expected to be " + SERVLET_NAME + ", but it is " + servlet.getServletName(), 
+        				SERVLET_NAME, servlet.getServletName());
+        		assertEquals("Display name is expected to be " + SERVLET_NAME + ", but it is " + servlet.getDisplayName(), 
+        				SERVLET_NAME, servlet.getDisplayName());
+        		
+        		List params = servlet.getInitParams();
+        		assertNotNull("List of initialization parameters cannot be retrieved", params);
+        		assertEquals("None initialization parameter is expected, but " + params.size() + " are found", 
+        				0, params.size());
+        		
+        		List mappings = servlet.getMappings();
+        		assertEquals(1, mappings.size());
+        		ServletMapping mapping = (ServletMapping) mappings.get(0);
+        		assertEquals("Servlet name of the mapping is expected to be " + SERVLET_NAME + ", but it is " + mapping.getName(), 
+        				SERVLET_NAME, mapping.getName());
+        		assertEquals("Servlet mapping URL pattern value is expected to be " + SERVLET_DEFAULT_MAPPING + ", but it is " + mapping.getUrlPattern(),
+        				SERVLET_DEFAULT_MAPPING, mapping.getUrlPattern());
+        		assertEquals("Servlet mapping is expected to point to servlet " + servlet.getServletName() + ", but it points to servlet " + mapping.getServlet().getServletName(), 
+        				servlet, mapping.getServlet());
+        	}
+    	} finally {
+    		if (webEdit != null)
+    			webEdit.dispose();
+    	}
+    }
+	
+	public void testAddServlet_Web25_Defaults_NoJETEmitter() throws Exception {
+		disableJETEmitter();
+		testAddServlet_Web25_Defaults();
+		enableJETEmitter();
+	}
+
+    public void testAddServlet_Web25_Defaults() throws Exception {
+    	createWebProject(WEB_PROJECT_NAME, JavaEEFacetConstants.WEB_25);
+    	IProject proj = ProjectUtilities.getProject(WEB_PROJECT_NAME);
+
+    	IModelProvider provider = ModelProviderManager.getModelProvider(proj);
+		org.eclipse.jst.javaee.web.WebApp webApp = (org.eclipse.jst.javaee.web.WebApp) provider.getModelObject();
+		
+    	addServlet_Defaults();
+    	
+    	assertJavaFileExists(SERVLET_CLASS_NAME);
+    	
+    	List servlets = webApp.getServlets();
+    	assertEquals("Exactly one filter is expected in the model, but " + servlets.size() + " are found", 
+    			1, servlets.size());
+    	org.eclipse.jst.javaee.web.Servlet servlet = (org.eclipse.jst.javaee.web.Servlet) servlets.get(0);
+    	assertEquals("Servlet name is expected to be " + SERVLET_NAME + ", but it is " + servlet.getServletName(), 
+    			SERVLET_NAME, servlet.getServletName());
+    	assertEquals("Servlet class name is expected to be " + SERVLET_CLASS_NAME + ", but it is " + servlet.getServletClass(), 
+    			SERVLET_CLASS_NAME, servlet.getServletClass());
+    	List displayNames = servlet.getDisplayNames();
+    	assertEquals("Exactly one display name is expected, but " + displayNames.size() + " are found", 
+    			1, displayNames.size());
+    	DisplayName displayName = (DisplayName) displayNames.get(0);
+    	assertEquals("Display name is expected to be " + SERVLET_NAME + ", but it is " + displayName.getValue(), 
+    			SERVLET_NAME, displayName.getValue());
+		
+		List params = servlet.getInitParams();
+		assertNotNull("List of initialization parameters cannot be retrieved", params);
+		assertEquals("None initialization parameter is expected, but " + params.size() + " are found", 
+				0, params.size());
+    	
+    	List mappings = webApp.getServletMappings();
+    	assertEquals("Exactly one servlet mapping is expected, but " + mappings.size() + " are found", 
+    			1, mappings.size());
+    	org.eclipse.jst.javaee.web.ServletMapping mapping = (org.eclipse.jst.javaee.web.ServletMapping) mappings.get(0);
+    	assertEquals("Servlet name of the mapping is expected to be " + SERVLET_NAME + ", but it is " + mapping.getServletName(), 
+    			SERVLET_NAME, mapping.getServletName());
+    	List urlPatterns = mapping.getUrlPatterns();
+    	assertEquals("Exactly one URL pattern is expected in the mapping, but " + urlPatterns.size() + " are found", 
+    			1, urlPatterns.size());
+    	UrlPatternType urlPattern = (UrlPatternType) urlPatterns.get(0);
+    	assertEquals("Servlet mapping URL pattern value is expected to be " + SERVLET_DEFAULT_MAPPING + ", but it is " + urlPattern.getValue(), 
+    			SERVLET_DEFAULT_MAPPING, urlPattern.getValue());
+    }
+    
+    
+    public void testAddServlet_Web30_Defaults() throws Exception{
+       	createWebProject(WEB_PROJECT_NAME, JavaEEFacetConstants.WEB_30);
+    	IProject proj = ProjectUtilities.getProject(WEB_PROJECT_NAME);
+
+    	mergedModelProvider = ModelProviderManager.getModelProvider(proj);
+		org.eclipse.jst.javaee.web.WebApp webApp = (org.eclipse.jst.javaee.web.WebApp) mergedModelProvider.getModelObject();
+		
+    	addServlet_Defaults_Annotations();
+    	
+    	assertJavaFileExists(SERVLET_CLASS_NAME);  	
+    	
+       	List servlets = webApp.getServlets();
+    	assertEquals("Exactly one servlet is expected in the model, but " + servlets.size() + " are found", 
+    			1, servlets.size());
+    	org.eclipse.jst.javaee.web.Servlet servlet = (org.eclipse.jst.javaee.web.Servlet) servlets.get(0);
+    	assertEquals("Servlet name is expected to be " + SERVLET_NAME + ", but it is " + servlet.getServletName(), 
+    			SERVLET_NAME, servlet.getServletName());
+    	assertEquals("Servlet class name is expected to be " + SERVLET_CLASS_NAME + ", but it is " + servlet.getServletClass(), 
+    			SERVLET_CLASS_NAME, servlet.getServletClass());
+		
+		List params = servlet.getInitParams();
+		assertNotNull("List of initialization parameters cannot be retrieved", params);
+		assertEquals("None initialization parameter is expected, but " + params.size() + " are found", 
+				0, params.size());
+    	
+    	List mappings = webApp.getServletMappings();
+    	assertEquals("Exactly one servlet mapping is expected, but " + mappings.size() + " are found", 
+    			1, mappings.size());
+    	org.eclipse.jst.javaee.web.ServletMapping mapping = (org.eclipse.jst.javaee.web.ServletMapping) mappings.get(0);
+    	assertEquals("Servlet name of the mapping is expected to be " + SERVLET_NAME + ", but it is " + mapping.getServletName(), 
+    			SERVLET_NAME, mapping.getServletName());
+    	List urlPatterns = mapping.getUrlPatterns();
+    	assertEquals("Exactly one URL pattern is expected in the mapping, but " + urlPatterns.size() + " are found", 
+    			1, urlPatterns.size());
+    	UrlPatternType urlPattern = (UrlPatternType) urlPatterns.get(0);
+    	assertEquals("Servlet mapping URL pattern value is expected to be " + SERVLET_DEFAULT_MAPPING + ", but it is " + urlPattern.getValue(), 
+    			SERVLET_DEFAULT_MAPPING, urlPattern.getValue());    	   	
+    }
+    
+    
+    public void testAddServlet_Web30_Async() throws Exception {
+    	createWebProject(WEB_PROJECT_NAME, JavaEEFacetConstants.WEB_30);
+    	IProject proj = ProjectUtilities.getProject(WEB_PROJECT_NAME);
+
+    	mergedModelProvider = ModelProviderManager.getModelProvider(proj);
+		org.eclipse.jst.javaee.web.WebApp webApp = (org.eclipse.jst.javaee.web.WebApp) mergedModelProvider.getModelObject();
+		
+    	addServlet_Async();
+    	
+    	assertJavaFileExists(SERVLET_CLASS_NAME);  	
+    	
+       	List servlets = webApp.getServlets();
+    	assertEquals("Exactly one servlet is expected in the model, but " + servlets.size() + " are found", 
+    			1, servlets.size());
+    	org.eclipse.jst.javaee.web.Servlet servlet = (org.eclipse.jst.javaee.web.Servlet) servlets.get(0);
+    	assertEquals("Servlet name is expected to be " + SERVLET_NAME + ", but it is " + servlet.getServletName(), 
+    			SERVLET_NAME, servlet.getServletName());
+    	assertEquals("Servlet class name is expected to be " + SERVLET_CLASS_NAME + ", but it is " + servlet.getServletClass(), 
+    			SERVLET_CLASS_NAME, servlet.getServletClass());
+		
+		List params = servlet.getInitParams();
+		assertNotNull("List of initialization parameters cannot be retrieved", params);
+		assertEquals("None initialization parameter is expected, but " + params.size() + " are found", 
+				0, params.size());
+    	
+    	List mappings = webApp.getServletMappings();
+    	assertEquals("Exactly one servlet mapping is expected, but " + mappings.size() + " are found", 
+    			1, mappings.size());
+    	org.eclipse.jst.javaee.web.ServletMapping mapping = (org.eclipse.jst.javaee.web.ServletMapping) mappings.get(0);
+    	assertEquals("Servlet name of the mapping is expected to be " + SERVLET_NAME + ", but it is " + mapping.getServletName(), 
+    			SERVLET_NAME, mapping.getServletName());
+    	List urlPatterns = mapping.getUrlPatterns();
+    	assertEquals("Exactly one URL pattern is expected in the mapping, but " + urlPatterns.size() + " are found", 
+    			1, urlPatterns.size());
+    	UrlPatternType urlPattern = (UrlPatternType) urlPatterns.get(0);
+    	assertEquals("Servlet mapping URL pattern value is expected to be " + SERVLET_DEFAULT_MAPPING + ", but it is " + urlPattern.getValue(), 
+    			SERVLET_DEFAULT_MAPPING, urlPattern.getValue());    	
+    	
+    	
+    	assertTrue(servlet.isAsyncSupported());
+    }
+    
+    public void testAddServlet_Web31_Async() throws Exception {
+    	createWebProject(WEB_PROJECT_NAME, JavaEEFacetConstants.WEB_31);
+    	IProject proj = ProjectUtilities.getProject(WEB_PROJECT_NAME);
+
+    	mergedModelProvider = ModelProviderManager.getModelProvider(proj);
+		org.eclipse.jst.javaee.web.WebApp webApp = (org.eclipse.jst.javaee.web.WebApp) mergedModelProvider.getModelObject();
+		
+    	addServlet_Async();
+    	
+    	assertJavaFileExists(SERVLET_CLASS_NAME);  	
+    	
+       	List servlets = webApp.getServlets();
+    	assertEquals("Exactly one servlet is expected in the model, but " + servlets.size() + " are found", 
+    			1, servlets.size());
+    	org.eclipse.jst.javaee.web.Servlet servlet = (org.eclipse.jst.javaee.web.Servlet) servlets.get(0);
+    	assertEquals("Servlet name is expected to be " + SERVLET_NAME + ", but it is " + servlet.getServletName(), 
+    			SERVLET_NAME, servlet.getServletName());
+    	assertEquals("Servlet class name is expected to be " + SERVLET_CLASS_NAME + ", but it is " + servlet.getServletClass(), 
+    			SERVLET_CLASS_NAME, servlet.getServletClass());
+		
+		List params = servlet.getInitParams();
+		assertNotNull("List of initialization parameters cannot be retrieved", params);
+		assertEquals("None initialization parameter is expected, but " + params.size() + " are found", 
+				0, params.size());
+    	
+    	List mappings = webApp.getServletMappings();
+    	assertEquals("Exactly one servlet mapping is expected, but " + mappings.size() + " are found", 
+    			1, mappings.size());
+    	org.eclipse.jst.javaee.web.ServletMapping mapping = (org.eclipse.jst.javaee.web.ServletMapping) mappings.get(0);
+    	assertEquals("Servlet name of the mapping is expected to be " + SERVLET_NAME + ", but it is " + mapping.getServletName(), 
+    			SERVLET_NAME, mapping.getServletName());
+    	List urlPatterns = mapping.getUrlPatterns();
+    	assertEquals("Exactly one URL pattern is expected in the mapping, but " + urlPatterns.size() + " are found", 
+    			1, urlPatterns.size());
+    	UrlPatternType urlPattern = (UrlPatternType) urlPatterns.get(0);
+    	assertEquals("Servlet mapping URL pattern value is expected to be " + SERVLET_DEFAULT_MAPPING + ", but it is " + urlPattern.getValue(), 
+    			SERVLET_DEFAULT_MAPPING, urlPattern.getValue());    	
+    	
+    	
+    	assertTrue(servlet.isAsyncSupported());
+    }    
+    
+    
+    public void testAddFilter_Web24_Defaults_NoJETEmitter() throws Exception {
+		disableJETEmitter();
+		testAddFilter_Web24_Defaults();
+		enableJETEmitter();
+	}
+    
+    public void testAddFilter_Web24_Defaults() throws Exception {
+    	createWebProject(WEB_PROJECT_NAME, JavaEEFacetConstants.WEB_24);
+    	WebArtifactEdit webEdit = null;
+    	IProject proj = ProjectUtilities.getProject(WEB_PROJECT_NAME);
+    	try {
+    		webEdit = new WebArtifactEdit(proj, false, true);
+    		WebApp webApp = webEdit.getWebApp();
+        	addFilter_Defaults();
+        	if (webApp != null) {
+        		assertJavaFileExists(FILTER_CLASS_NAME);
+        		
+        		Filter filter = webApp.getFilterNamed(FILTER_NAME);
+        		assertNotNull("Filter " + FILTER_NAME + " not found in the model", filter);
+        		assertEquals("Filter name is expected to be " + FILTER_NAME + ", but it is " + filter.getName(), 
+        				FILTER_NAME, filter.getName());
+        		assertEquals("Display name is expected to be " + FILTER_NAME + ", but it is " + filter.getDisplayName(), 
+        				FILTER_NAME, filter.getDisplayName());
+        		assertEquals("Filter class name is expected to be " + FILTER_CLASS_NAME + ", but it is " + filter.getFilterClassName(), 
+        				FILTER_CLASS_NAME, filter.getFilterClassName());
+        		
+        		List params = filter.getInitParams();
+        		assertNotNull("List of initialization parameters cannot be retrieved", params);
+        		assertEquals("None initialization parameter is expected, but " + params.size() + " are found", 
+        				0, params.size());
+        		
+        		List mappings = webApp.getFilterMappings();
+        		assertEquals("Exactly one filter mapping is expected, but " + mappings.size() + " are found", 
+        				1, mappings.size());
+        		FilterMapping mapping = (FilterMapping) mappings.get(0);
+        		assertEquals("Filter of the mapping is expected to be " + filter.getName() + ", but it is " + mapping.getFilter().getName(), 
+        				filter, mapping.getFilter());
+        		assertEquals("Filter mapping URL pattern value is expected to be " + FILTER_DEFAULT_MAPPING + ", but it is " + mapping.getUrlPattern(), 
+        				FILTER_DEFAULT_MAPPING, mapping.getUrlPattern());
+        		assertEquals("The filter mapping is not expected to point to a servlet, but it points to servlet " + mapping.getServlet(), 
+        				null, mapping.getServlet());
+        		assertEquals("The filter mapping is not expected to point to a servlet, but it points to servlet " + mapping.getServlet(),
+        				null, mapping.getServletName());
+        		List dispatchers = mapping.getDispatcherType();
+        		assertEquals("None dispatcher is expected in the filter mapping, but " + dispatchers.size() + " are found", 
+        				0, dispatchers.size());
+        	}
+    	} finally {
+    		if (webEdit != null)
+    			webEdit.dispose();
+    	}
+    }
+    
+    public void testAddFilter_Web25_Defaults_NoJETEmitter() throws Exception {
+		disableJETEmitter();
+		testAddFilter_Web25_Defaults();
+		enableJETEmitter();
+	}
+    
+    public void testAddFilter_Web25_Defaults() throws Exception {
+    	createWebProject(WEB_PROJECT_NAME, JavaEEFacetConstants.WEB_25);
+    	IProject proj = ProjectUtilities.getProject(WEB_PROJECT_NAME);
+
+    	IModelProvider provider = ModelProviderManager.getModelProvider(proj);
+		org.eclipse.jst.javaee.web.WebApp webApp = (org.eclipse.jst.javaee.web.WebApp) provider.getModelObject();
+		
+    	addFilter_Defaults();
+    	
+		assertJavaFileExists(FILTER_CLASS_NAME);
+    	
+    	List filters = webApp.getFilters();
+    	assertEquals("Exactly one filter is expected in the model, but " + filters.size() + " are found", 
+    			1, filters.size());
+    	org.eclipse.jst.javaee.web.Filter filter = (org.eclipse.jst.javaee.web.Filter) filters.get(0);
+    	assertEquals("Filter name is expected to be " + FILTER_NAME + ", but it is " + filter.getFilterName(), 
+    			FILTER_NAME, filter.getFilterName());
+    	assertEquals("Filter class name is expected to be " + FILTER_CLASS_NAME + ", but it is " + filter.getFilterClass(), 
+    			FILTER_CLASS_NAME, filter.getFilterClass());
+    	List displayNames = filter.getDisplayNames();
+    	assertEquals("Exactly one display name is expected, but " + displayNames.size() + " are found", 
+    			1, displayNames.size());
+    	DisplayName displayName = (DisplayName) displayNames.get(0);
+    	assertEquals("Display name is expected to be " + FILTER_NAME + ", but it is " + displayName.getValue(), 
+    			FILTER_NAME, displayName.getValue());
+    	
+    	List params = filter.getInitParams();
+		assertNotNull("List of initialization parameters cannot be retrieved", params);
+		assertEquals("None initialization parameter is expected, but " + params.size() + " are found", 
+				0, params.size());
+    	
+    	List mappings = webApp.getFilterMappings();
+    	assertEquals("Exactly one filter mapping is expected, but " + mappings.size() + " are found", 
+    			1, mappings.size());
+    	org.eclipse.jst.javaee.web.FilterMapping mapping = (org.eclipse.jst.javaee.web.FilterMapping) mappings.get(0);
+    	assertEquals("Filter name of the mapping is expected to be " + FILTER_NAME + ", but it is " + mapping.getFilterName(), 
+    			FILTER_NAME, mapping.getFilterName());
+    	List urlPatterns = mapping.getUrlPatterns();
+    	assertEquals("Exactly one URL pattern is expected in the mapping, but " + urlPatterns.size() + " are found", 
+    			1, urlPatterns.size());
+    	UrlPatternType urlPattern = (UrlPatternType) urlPatterns.get(0);
+    	assertEquals("Filter mapping URL pattern value is expected to be " + FILTER_DEFAULT_MAPPING + ", but it is " + urlPattern.getValue(), 
+    			FILTER_DEFAULT_MAPPING, urlPattern.getValue());
+    	assertEquals("None servlet name is expected in the filter mapping, but " + mapping.getServletNames().size() + " are found", 
+    			0, mapping.getServletNames().size());
+    	assertEquals("None dispatcher is expected in the filter mapping, but " + mapping.getDispatchers().size() + " are found", 
+    			0, mapping.getDispatchers().size());
+    }
+    
+    public void testAddFilter_Web30_Defaults() throws Exception {
+    	createWebProject(WEB_PROJECT_NAME, JavaEEFacetConstants.WEB_30);
+    	IProject proj = ProjectUtilities.getProject(WEB_PROJECT_NAME);
+
+    	mergedModelProvider = ModelProviderManager.getModelProvider(proj);
+		org.eclipse.jst.javaee.web.WebApp webApp = (org.eclipse.jst.javaee.web.WebApp) mergedModelProvider.getModelObject();
+		
+    	addFilter_Defaults_Annotations();
+    	
+		assertJavaFileExists(FILTER_CLASS_NAME);
+    	
+    	List filters = webApp.getFilters();
+    	assertEquals("Exactly one filter is expected in the model, but " + filters.size() + " are found", 
+    			1, filters.size());
+    	org.eclipse.jst.javaee.web.Filter filter = (org.eclipse.jst.javaee.web.Filter) filters.get(0);
+    	assertEquals("Filter name is expected to be " + FILTER_NAME + ", but it is " + filter.getFilterName(), 
+    			FILTER_NAME, filter.getFilterName());
+    	assertEquals("Filter class name is expected to be " + FILTER_CLASS_NAME + ", but it is " + filter.getFilterClass(), 
+    			FILTER_CLASS_NAME, filter.getFilterClass());
+    	
+    	List params = filter.getInitParams();
+		assertNotNull("List of initialization parameters cannot be retrieved", params);
+		assertEquals("None initialization parameter is expected, but " + params.size() + " are found", 
+				0, params.size());
+    	
+    	List mappings = webApp.getFilterMappings();
+    	assertEquals("Exactly one filter mapping is expected, but " + mappings.size() + " are found", 
+    			1, mappings.size());
+    	org.eclipse.jst.javaee.web.FilterMapping mapping = (org.eclipse.jst.javaee.web.FilterMapping) mappings.get(0);
+    	assertEquals("Filter name of the mapping is expected to be " + FILTER_NAME + ", but it is " + mapping.getFilterName(), 
+    			FILTER_NAME, mapping.getFilterName());
+    	List urlPatterns = mapping.getUrlPatterns();
+    	assertEquals("Exactly one URL pattern is expected in the mapping, but " + urlPatterns.size() + " are found", 
+    			1, urlPatterns.size());
+    	UrlPatternType urlPattern = (UrlPatternType) urlPatterns.get(0);
+    	assertEquals("Filter mapping URL pattern value is expected to be " + FILTER_DEFAULT_MAPPING + ", but it is " + urlPattern.getValue(), 
+    			FILTER_DEFAULT_MAPPING, urlPattern.getValue());
+    	assertEquals("None servlet name is expected in the filter mapping, but " + mapping.getServletNames().size() + " are found", 
+    			0, mapping.getServletNames().size());
+    	assertEquals("None dispatcher is expected in the filter mapping, but " + mapping.getDispatchers().size() + " are found", 
+    			0, mapping.getDispatchers().size());    	
+    }
+    
+    public void testAddFilter_Web30_Async() throws Exception {
+    	createWebProject(WEB_PROJECT_NAME, JavaEEFacetConstants.WEB_30);
+    	IProject proj = ProjectUtilities.getProject(WEB_PROJECT_NAME);
+
+    	mergedModelProvider = ModelProviderManager.getModelProvider(proj);
+		org.eclipse.jst.javaee.web.WebApp webApp = (org.eclipse.jst.javaee.web.WebApp) mergedModelProvider.getModelObject();
+		
+    	addFilter_Async();
+    	
+		assertJavaFileExists(FILTER_CLASS_NAME);
+    	
+    	List filters = webApp.getFilters();
+    	assertEquals("Exactly one filter is expected in the model, but " + filters.size() + " are found", 
+    			1, filters.size());
+    	org.eclipse.jst.javaee.web.Filter filter = (org.eclipse.jst.javaee.web.Filter) filters.get(0);
+    	assertEquals("Filter name is expected to be " + FILTER_NAME + ", but it is " + filter.getFilterName(), 
+    			FILTER_NAME, filter.getFilterName());
+    	assertEquals("Filter class name is expected to be " + FILTER_CLASS_NAME + ", but it is " + filter.getFilterClass(), 
+    			FILTER_CLASS_NAME, filter.getFilterClass());
+    	
+    	List params = filter.getInitParams();
+		assertNotNull("List of initialization parameters cannot be retrieved", params);
+		assertEquals("None initialization parameter is expected, but " + params.size() + " are found", 
+				0, params.size());
+    	
+    	List mappings = webApp.getFilterMappings();
+    	assertEquals("Exactly one filter mapping is expected, but " + mappings.size() + " are found", 
+    			1, mappings.size());
+    	org.eclipse.jst.javaee.web.FilterMapping mapping = (org.eclipse.jst.javaee.web.FilterMapping) mappings.get(0);
+    	assertEquals("Filter name of the mapping is expected to be " + FILTER_NAME + ", but it is " + mapping.getFilterName(), 
+    			FILTER_NAME, mapping.getFilterName());
+    	List urlPatterns = mapping.getUrlPatterns();
+    	assertEquals("Exactly one URL pattern is expected in the mapping, but " + urlPatterns.size() + " are found", 
+    			1, urlPatterns.size());
+    	UrlPatternType urlPattern = (UrlPatternType) urlPatterns.get(0);
+    	assertEquals("Filter mapping URL pattern value is expected to be " + FILTER_DEFAULT_MAPPING + ", but it is " + urlPattern.getValue(), 
+    			FILTER_DEFAULT_MAPPING, urlPattern.getValue());
+    	assertEquals("None servlet name is expected in the filter mapping, but " + mapping.getServletNames().size() + " are found", 
+    			0, mapping.getServletNames().size());
+    	assertEquals("None dispatcher is expected in the filter mapping, but " + mapping.getDispatchers().size() + " are found", 
+    			0, mapping.getDispatchers().size());    	
+    }
+    
+    
+    public void testAddFilter_Web31_Async() throws Exception {
+    	createWebProject(WEB_PROJECT_NAME, JavaEEFacetConstants.WEB_31);
+    	IProject proj = ProjectUtilities.getProject(WEB_PROJECT_NAME);
+
+    	mergedModelProvider = ModelProviderManager.getModelProvider(proj);
+		org.eclipse.jst.javaee.web.WebApp webApp = (org.eclipse.jst.javaee.web.WebApp) mergedModelProvider.getModelObject();
+		
+    	addFilter_Async();
+    	
+		assertJavaFileExists(FILTER_CLASS_NAME);
+    	
+    	List filters = webApp.getFilters();
+    	assertEquals("Exactly one filter is expected in the model, but " + filters.size() + " are found", 
+    			1, filters.size());
+    	org.eclipse.jst.javaee.web.Filter filter = (org.eclipse.jst.javaee.web.Filter) filters.get(0);
+    	assertEquals("Filter name is expected to be " + FILTER_NAME + ", but it is " + filter.getFilterName(), 
+    			FILTER_NAME, filter.getFilterName());
+    	assertEquals("Filter class name is expected to be " + FILTER_CLASS_NAME + ", but it is " + filter.getFilterClass(), 
+    			FILTER_CLASS_NAME, filter.getFilterClass());
+    	
+    	List params = filter.getInitParams();
+		assertNotNull("List of initialization parameters cannot be retrieved", params);
+		assertEquals("None initialization parameter is expected, but " + params.size() + " are found", 
+				0, params.size());
+    	
+    	List mappings = webApp.getFilterMappings();
+    	assertEquals("Exactly one filter mapping is expected, but " + mappings.size() + " are found", 
+    			1, mappings.size());
+    	org.eclipse.jst.javaee.web.FilterMapping mapping = (org.eclipse.jst.javaee.web.FilterMapping) mappings.get(0);
+    	assertEquals("Filter name of the mapping is expected to be " + FILTER_NAME + ", but it is " + mapping.getFilterName(), 
+    			FILTER_NAME, mapping.getFilterName());
+    	List urlPatterns = mapping.getUrlPatterns();
+    	assertEquals("Exactly one URL pattern is expected in the mapping, but " + urlPatterns.size() + " are found", 
+    			1, urlPatterns.size());
+    	UrlPatternType urlPattern = (UrlPatternType) urlPatterns.get(0);
+    	assertEquals("Filter mapping URL pattern value is expected to be " + FILTER_DEFAULT_MAPPING + ", but it is " + urlPattern.getValue(), 
+    			FILTER_DEFAULT_MAPPING, urlPattern.getValue());
+    	assertEquals("None servlet name is expected in the filter mapping, but " + mapping.getServletNames().size() + " are found", 
+    			0, mapping.getServletNames().size());
+    	assertEquals("None dispatcher is expected in the filter mapping, but " + mapping.getDispatchers().size() + " are found", 
+    			0, mapping.getDispatchers().size());    	
+    }
+    
+    public void testAddListener_Web24_Defaults_NoJETEmitter() throws Exception {
+		disableJETEmitter();
+		testAddListener_Web24_Defaults();
+		enableJETEmitter();
+	}
+    
+    public void testAddListener_Web24_Defaults() throws Exception {
+    	createWebProject(WEB_PROJECT_NAME, JavaEEFacetConstants.WEB_24);
+    	WebArtifactEdit webEdit = null;
+    	IProject proj = ProjectUtilities.getProject(WEB_PROJECT_NAME);
+    	try {
+    		webEdit = new WebArtifactEdit(proj, false, true);
+    		WebApp webApp = webEdit.getWebApp();
+        	addListener_Defaults();
+        	if (webApp != null) {
+        		assertJavaFileExists(LISTENER_CLASS_NAME);
+        		
+        		List listeners = webApp.getListeners();
+        		assertEquals("Exactly one listener is expected in the model, but " + listeners.size() + " are found", 
+        				1, listeners.size());
+        		Listener listener = (Listener) listeners.get(0);
+        		assertEquals("Listener " + LISTENER_CLASS_NAME + " is expected in the model, but " + listener.getListenerClassName() + " is found", 
+            			LISTENER_CLASS_NAME, listener.getListenerClassName());
+        	}
+    	} finally {
+    		if (webEdit != null)
+    			webEdit.dispose();
+    	}
+    }
+    
+    public void testAddListener_Web25_Defaults_NoJETEmitter() throws Exception {
+		disableJETEmitter();
+		testAddListener_Web25_Defaults();
+		enableJETEmitter();
+	}
+    
+    public void testAddListener_Web25_Defaults() throws Exception {
+    	createWebProject(WEB_PROJECT_NAME, JavaEEFacetConstants.WEB_25);
+    	IProject proj = ProjectUtilities.getProject(WEB_PROJECT_NAME);
+
+    	IModelProvider provider = ModelProviderManager.getModelProvider(proj);
+		org.eclipse.jst.javaee.web.WebApp webApp = (org.eclipse.jst.javaee.web.WebApp) provider.getModelObject();
+		
+    	addListener_Defaults();
+
+		assertJavaFileExists(LISTENER_CLASS_NAME);
+    	
+    	List listeners = webApp.getListeners();
+    	assertEquals("Exactly one listener is expected in the model, but " + listeners.size() + " are found", 
+    			1, listeners.size());
+    	org.eclipse.jst.javaee.core.Listener listener = (org.eclipse.jst.javaee.core.Listener) listeners.get(0);
+    	assertEquals("Listener " + LISTENER_CLASS_NAME + " is expected in the model, but " + listener.getListenerClass() + " is found", 
+    			LISTENER_CLASS_NAME, listener.getListenerClass());
+    }
+
+    
+    public void testAddListener_Web30_Defaults() throws Exception {
+    	createWebProject(WEB_PROJECT_NAME, JavaEEFacetConstants.WEB_30);
+    	IProject proj = ProjectUtilities.getProject(WEB_PROJECT_NAME);
+
+    	mergedModelProvider = ModelProviderManager.getModelProvider(proj);
+		org.eclipse.jst.javaee.web.WebApp webApp = (org.eclipse.jst.javaee.web.WebApp) mergedModelProvider.getModelObject();
+		
+    	addListener_Defaults_Annotations();
+
+		assertJavaFileExists(LISTENER_CLASS_NAME);
+    	
+    	List listeners = webApp.getListeners();
+    	assertEquals("Exactly one listener is expected in the model, but " + listeners.size() + " are found", 
+    			1, listeners.size());
+    	org.eclipse.jst.javaee.core.Listener listener = (org.eclipse.jst.javaee.core.Listener) listeners.get(0);
+    	assertEquals("Listener " + LISTENER_CLASS_NAME + " is expected in the model, but " + listener.getListenerClass() + " is found", 
+    			LISTENER_CLASS_NAME, listener.getListenerClass());
+    }    
+    
+    
+    
+    public void testAddListener_Web31_AsyncListener() throws Exception {
+    	createWebProject(WEB_PROJECT_NAME, JavaEEFacetConstants.WEB_31);
+    	IProject proj = ProjectUtilities.getProject(WEB_PROJECT_NAME);
+
+    	mergedModelProvider = ModelProviderManager.getModelProvider(proj);
+		org.eclipse.jst.javaee.web.WebApp webApp = (org.eclipse.jst.javaee.web.WebApp) mergedModelProvider.getModelObject();
+		
+		addListener_AsyncListener();
+		assertJavaFileExists(LISTENER_CLASS_NAME);
+    	
+    	List listeners = webApp.getListeners();
+    	assertEquals("Exactly one listener is expected in the model, but " + listeners.size() + " are found", 
+    			1, listeners.size());
+    	org.eclipse.jst.javaee.core.Listener listener = (org.eclipse.jst.javaee.core.Listener) listeners.get(0);
+    	assertEquals("Listener " + LISTENER_CLASS_NAME + " is expected in the model, but " + listener.getListenerClass() + " is found", 
+    			LISTENER_CLASS_NAME, listener.getListenerClass());
+    	
+    	
+    }   
+    
+    
+    public void testAddListener_Web31_HttpSessionIdListener() throws Exception {
+    	createWebProject(WEB_PROJECT_NAME, JavaEEFacetConstants.WEB_31);
+    	IProject proj = ProjectUtilities.getProject(WEB_PROJECT_NAME);
+
+    	mergedModelProvider = ModelProviderManager.getModelProvider(proj);
+		org.eclipse.jst.javaee.web.WebApp webApp = (org.eclipse.jst.javaee.web.WebApp) mergedModelProvider.getModelObject();
+		
+		addListener_HttpSessionIdListener();
+		assertJavaFileExists(LISTENER_CLASS_NAME);
+    	
+    	List listeners = webApp.getListeners();
+    	assertEquals("Exactly one listener is expected in the model, but " + listeners.size() + " are found", 
+    			1, listeners.size());
+    	org.eclipse.jst.javaee.core.Listener listener = (org.eclipse.jst.javaee.core.Listener) listeners.get(0);
+    	assertEquals("Listener " + LISTENER_CLASS_NAME + " is expected in the model, but " + listener.getListenerClass() + " is found", 
+    			LISTENER_CLASS_NAME, listener.getListenerClass());
+    	
+    	
+    }        
+    
+    public void testAddListener_Web31_MultiListeners() throws Exception {
+    	createWebProject(WEB_PROJECT_NAME, JavaEEFacetConstants.WEB_31);
+    	IProject proj = ProjectUtilities.getProject(WEB_PROJECT_NAME);
+
+    	mergedModelProvider = ModelProviderManager.getModelProvider(proj);
+		org.eclipse.jst.javaee.web.WebApp webApp = (org.eclipse.jst.javaee.web.WebApp) mergedModelProvider.getModelObject();
+		
+		addListener_MultiInterfaces();
+		assertJavaFileExists(LISTENER_CLASS_NAME);
+    	
+    	List listeners = webApp.getListeners();
+    	assertEquals("Exactly one listener is expected in the model, but " + listeners.size() + " are found", 
+    			1, listeners.size());
+    	org.eclipse.jst.javaee.core.Listener listener = (org.eclipse.jst.javaee.core.Listener) listeners.get(0);
+    	assertEquals("Listener " + LISTENER_CLASS_NAME + " is expected in the model, but " + listener.getListenerClass() + " is found", 
+    			LISTENER_CLASS_NAME, listener.getListenerClass());
+    	
+    	
+    }        
+    
+	@Override
+	protected void tearDown() throws Exception {
+		// uncomment the below line if you want to dump a check whether the
+		// .JETEmitters projects is created as a result of the executed
+		// operation
+//		System.out.println(".JETEmitters exists : "
+//				+ ResourcesPlugin.getWorkspace().getRoot().getProject(
+//						WTPJETEmitter.PROJECT_NAME).exists());
+		super.tearDown();
+	}
+
+    private void enableJETEmitter() {
+    	J2EEPreferences preferences = J2EEPlugin.getDefault().getJ2EEPreferences();
+		preferences.setValue(J2EEPlugin.DYNAMIC_TRANSLATION_OF_JET_TEMPLATES_PREF_KEY, true);
+	}
+
+	private void disableJETEmitter() {
+		J2EEPreferences preferences = J2EEPlugin.getDefault().getJ2EEPreferences();
+		preferences.setValue(J2EEPlugin.DYNAMIC_TRANSLATION_OF_JET_TEMPLATES_PREF_KEY, false);
+	}
+
+    public void createWebProject(String projectName, IProjectFacetVersion version) throws Exception {
+    	IDataModel dm = WebProjectCreationOperationTest.getWebDataModel(
+				projectName, null, null, null, null, version, false);
+     	runAndVerify(dm);
+    }
+
+    private void addServlet_Defaults() throws Exception {
+    	IDataModel dm = DataModelFactory.createDataModel(NewServletClassDataModelProvider.class);
+    	dm.setProperty(PROJECT_NAME, WEB_PROJECT_NAME);
+    	dm.setProperty(JAVA_PACKAGE, PACKAGE);
+    	dm.setProperty(CLASS_NAME, SERVLET_NAME);
+        runAndVerify(dm);
+    }
+    
+    private void addServlet_Defaults_Annotations() throws Exception {
+    	IDataModel dm = DataModelFactory.createDataModel(NewServletClassDataModelProvider.class);
+    	dm.setProperty(PROJECT_NAME, WEB_PROJECT_NAME);
+    	dm.setProperty(JAVA_PACKAGE, PACKAGE);
+    	dm.setProperty(CLASS_NAME, SERVLET_NAME);
+    	executeAndWait(dm.getDefaultOperation());
+    }
+    
+    
+    private void addServlet_Async() throws Exception {
+    	IDataModel dm = DataModelFactory.createDataModel(NewServletClassDataModelProvider.class);
+    	dm.setProperty(PROJECT_NAME, WEB_PROJECT_NAME);
+    	dm.setProperty(JAVA_PACKAGE, PACKAGE);
+    	dm.setProperty(CLASS_NAME, SERVLET_NAME);
+    	dm.setBooleanProperty(INewServletClassDataModelProperties.ASYNC_SUPPORT, true);
+    	executeAndWait(dm.getDefaultOperation());
+    }
+    
+	private void executeAndWait(IDataModelOperation dataModelOperation) throws InterruptedException, ExecutionException {
+		SynchronousModelChangedListener listener = new SynchronousModelChangedListener(1);
+		mergedModelProvider.addListener(listener);
+		dataModelOperation.execute(null, null);
+		listener.waitForEvents();
+		mergedModelProvider.removeListener(listener);
+	}
+    
+    private void addFilter_Defaults() throws Exception {
+    	IDataModel dm = DataModelFactory.createDataModel(NewFilterClassDataModelProvider.class);
+    	dm.setProperty(PROJECT_NAME, WEB_PROJECT_NAME);
+    	dm.setProperty(JAVA_PACKAGE, PACKAGE);
+    	dm.setProperty(CLASS_NAME, FILTER_NAME);
+        runAndVerify(dm);
+    }
+    
+    private void addFilter_Defaults_Annotations() throws Exception {
+    	IDataModel dm = DataModelFactory.createDataModel(NewFilterClassDataModelProvider.class);
+    	dm.setProperty(PROJECT_NAME, WEB_PROJECT_NAME);
+    	dm.setProperty(JAVA_PACKAGE, PACKAGE);
+    	dm.setProperty(CLASS_NAME, FILTER_NAME);
+      	executeAndWait(dm.getDefaultOperation());
+    }   
+    
+    private void addFilter_Async() throws Exception {
+    	IDataModel dm = DataModelFactory.createDataModel(NewFilterClassDataModelProvider.class);
+    	dm.setProperty(PROJECT_NAME, WEB_PROJECT_NAME);
+    	dm.setProperty(JAVA_PACKAGE, PACKAGE);
+    	dm.setProperty(CLASS_NAME, FILTER_NAME);
+    	dm.setBooleanProperty(INewFilterClassDataModelProperties.ASYNC_SUPPORT, true);
+       	executeAndWait(dm.getDefaultOperation());
+    }    
+    
+    private void addListener_Defaults() throws Exception {
+    	IDataModel dm = DataModelFactory.createDataModel(NewListenerClassDataModelProvider.class);
+    	dm.setProperty(PROJECT_NAME, WEB_PROJECT_NAME);
+    	dm.setProperty(JAVA_PACKAGE, PACKAGE);
+    	dm.setProperty(CLASS_NAME, LISTENER_NAME);
+    	List interfaces = new ArrayList();
+    	interfaces.add(NewListenerClassDataModelProvider.LISTENER_INTERFACES[0]);
+    	dm.setProperty(INTERFACES, interfaces);
+        runAndVerify(dm);
+    }
+    
+    
+    private void addListener_Defaults_Annotations() throws Exception {
+    	IDataModel dm = DataModelFactory.createDataModel(NewListenerClassDataModelProvider.class);
+    	dm.setProperty(PROJECT_NAME, WEB_PROJECT_NAME);
+    	dm.setProperty(JAVA_PACKAGE, PACKAGE);
+    	dm.setProperty(CLASS_NAME, LISTENER_NAME);
+    	List interfaces = new ArrayList();
+    	interfaces.add(NewListenerClassDataModelProvider.LISTENER_INTERFACES[0]);
+    	dm.setProperty(INTERFACES, interfaces);
+    	executeAndWait(dm.getDefaultOperation());
+    }
+    
+    
+    private void addListener_AsyncListener() throws Exception {
+    	IDataModel dm = DataModelFactory.createDataModel(NewListenerClassDataModelProvider.class);
+    	dm.setProperty(PROJECT_NAME, WEB_PROJECT_NAME);
+    	dm.setProperty(JAVA_PACKAGE, PACKAGE);
+    	dm.setProperty(CLASS_NAME, LISTENER_NAME);
+    	List interfaces = new ArrayList();
+    	interfaces.add(NewListenerClassDataModelProvider.LISTENER_INTERFACES[9]);
+    	dm.setProperty(INTERFACES, interfaces);
+    	executeAndWait(dm.getDefaultOperation());
+    }
+    
+    private void addListener_HttpSessionIdListener() throws Exception {
+    	IDataModel dm = DataModelFactory.createDataModel(NewListenerClassDataModelProvider.class);
+    	dm.setProperty(PROJECT_NAME, WEB_PROJECT_NAME);
+    	dm.setProperty(JAVA_PACKAGE, PACKAGE);
+    	dm.setProperty(CLASS_NAME, LISTENER_NAME);
+    	List interfaces = new ArrayList();
+    	interfaces.add(NewListenerClassDataModelProvider.LISTENER_INTERFACES[6]);
+    	dm.setProperty(INTERFACES, interfaces);
+    	executeAndWait(dm.getDefaultOperation());
+    }
+    
+    private void addListener_MultiInterfaces() throws Exception{
+    	//add sessionid and async listeners
+    	IDataModel dm = DataModelFactory.createDataModel(NewListenerClassDataModelProvider.class);
+    	dm.setProperty(PROJECT_NAME, WEB_PROJECT_NAME);
+    	dm.setProperty(JAVA_PACKAGE, PACKAGE);
+    	dm.setProperty(CLASS_NAME, LISTENER_NAME);
+    	List interfaces = new ArrayList();
+      	interfaces.add(NewListenerClassDataModelProvider.LISTENER_INTERFACES[9]);
+    	interfaces.add(NewListenerClassDataModelProvider.LISTENER_INTERFACES[6]);
+    	dm.setProperty(INTERFACES, interfaces);
+    	executeAndWait(dm.getDefaultOperation());   	
+    }
+    
+    private void assertJavaFileExists(String fullyQualifiedName) throws JavaModelException {
+		IJavaProject javaProject = JavaCore.create(
+				ResourcesPlugin.getWorkspace().getRoot())
+				.getJavaModel().getJavaProject(WEB_PROJECT_NAME);
+		assertNotNull("Java project " + WEB_PROJECT_NAME + " not found", javaProject);
+		IType type = javaProject.findType(fullyQualifiedName);
+		assertNotNull("Java type " + fullyQualifiedName + " not found", type);
+		IFile file = (IFile) type.getResource();
+		assertNotNull("Source file for Java type " + fullyQualifiedName + " not found", file);
+		assertTrue(file.exists());
+    }
+
+	public void testDefaultWebUtilityContextRoot() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel(
+				WEB_PROJECT_NAME, EAR_PROJECT_NAME, null, null, null, JavaEEFacetConstants.WEB_25, true);
+    	runAndVerify(dm);
+		
+		IProject proj = ProjectUtilities.getProject(WEB_PROJECT_NAME);
+		IProject earproj = ProjectUtilities.getProject(EAR_PROJECT_NAME);
+	
+		assertEquals(WebUtilities.getServerContextRoot(proj, earproj),WEB_PROJECT_NAME);
+	}
+	public void testWebUtilityContextRoot() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel(
+				WEB_PROJECT_NAME, EAR_PROJECT_NAME, WEB_CONTEXT_ROOT, null, null, JavaEEFacetConstants.WEB_25, true);
+    	runAndVerify(dm);
+		
+		IProject proj = ProjectUtilities.getProject(WEB_PROJECT_NAME);
+		IProject earproj = ProjectUtilities.getProject(EAR_PROJECT_NAME);
+	
+		assertEquals(WebUtilities.getServerContextRoot(proj, earproj),WEB_CONTEXT_ROOT);
+	}
+	
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/AllTests.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/AllTests.java
new file mode 100644
index 0000000..a2145a37
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/AllTests.java
@@ -0,0 +1,89 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ * Created on Feb 2, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package org.eclipse.wtp.j2ee.headless.tests.web.operations;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jst.j2ee.flexible.project.fvtests.WebDeployTest;
+import org.eclipse.wst.server.core.IRuntime;
+import org.eclipse.wst.server.core.IRuntimeType;
+import org.eclipse.wst.server.core.IRuntimeWorkingCopy;
+import org.eclipse.wst.server.core.ServerCore;
+
+/**
+ * @author jsholl
+ *
+ * To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+public class AllTests extends TestSuite {
+	
+	public static IRuntime TOMCAT_RUNTIME = createRuntime();
+	public static IRuntime JONAS_TOMCAT_RUNTIME = createJONASRuntime();
+	
+	
+    public static Test suite(){
+        return new AllTests();
+    }
+    
+    public AllTests(){
+        super("Web Operation, Servlet, & Deploy Tests");
+       addTest(WebImportOperationTest.suite());
+       addTest(WebExportOperationTest.suite());
+       addTest(WebProjectCreationOperationTest.suite());
+       
+       addTest(WebDeployTest.suite());
+       addTest(StaticWebProjectCreationOperationTest.suite());
+       addTest(AddWebArtifactOperationTest.suite());
+       addTest(UrlPatternTest.suite());
+       // addTest(WebComponentCreationTest.suite());
+		//addTest(new SimpleTestSuite(WebSaveStrategyTests.class));
+    }
+    
+    public static IRuntime createRuntime()  {
+    	String s = "D:/Program Files/Apache Software Foundation/Tomcat 5.0";
+    	if (s == null || s.length() == 0)
+    		return null;
+    	try {
+    		IRuntimeType rt = ServerCore.findRuntimeType("org.eclipse.jst.server.tomcat.runtime.50");
+    		IRuntimeWorkingCopy wc = rt.createRuntime(null, null);
+    		wc.setLocation(new Path(s));
+    		return wc.save(true, null);
+    	} catch (Exception e) {
+    		e.printStackTrace();
+    		return null;
+    	}
+    }
+    
+    public static IRuntime createJONASRuntime()  {
+    	String s = "D:/JOnAS-4.3.2";
+    	if (s == null || s.length() == 0)
+    		return null;
+    	try {
+    		IRuntimeType rt = ServerCore.findRuntimeType("org.eclipse.jst.server.tomcat.runtime.50");
+    		IRuntimeWorkingCopy wc = rt.createRuntime(null, null);
+    		wc.setLocation(new Path(s));
+    		return wc.save(true, null);
+    	} catch (Exception e) {
+    		e.printStackTrace();
+    		return null;
+    	}
+    }
+    
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/StaticWebProjectCreationOperationTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/StaticWebProjectCreationOperationTest.java
new file mode 100644
index 0000000..845fb88
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/StaticWebProjectCreationOperationTest.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wtp.j2ee.headless.tests.web.operations;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.tests.OperationTestCase;
+import org.eclipse.wst.project.facet.SimpleWebFacetProjectCreationDataModelProvider;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleProjectCreationOperationTest;
+
+public class StaticWebProjectCreationOperationTest extends ModuleProjectCreationOperationTest {
+
+	public StaticWebProjectCreationOperationTest(String name) {
+		super(name);
+	}
+	
+	public static Test suite() {
+        return new TestSuite(StaticWebProjectCreationOperationTest.class);
+    }
+
+	public static IDataModel getStaticWebDataModel(String projName, String earName){
+    	IDataModel model = DataModelFactory.createDataModel(new SimpleWebFacetProjectCreationDataModelProvider());
+    	
+    	model.setProperty(IFacetProjectCreationDataModelProperties.FACET_PROJECT_NAME, projName);
+    	
+    	return model;
+    }
+    
+
+	public void testStatic_Defaults() throws Exception{
+		IDataModel dm = getStaticWebDataModel("aStaticWeb",null);
+		OperationTestCase.runAndVerify(dm);
+	} 
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/UrlPatternTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/UrlPatternTest.java
new file mode 100644
index 0000000..e5727b6
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/UrlPatternTest.java
@@ -0,0 +1,61 @@
+package org.eclipse.wtp.j2ee.headless.tests.web.operations;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.jst.j2ee.web.validation.UrlPattern;
+import org.eclipse.wst.common.tests.BaseTestCase;
+
+public class UrlPatternTest extends BaseTestCase {
+	
+	public static Test suite() {
+        return new TestSuite(UrlPatternTest.class);
+    }
+
+	public void testIsValid() {
+		// test an empty string
+		assertFalse(UrlPattern.isValid(""));
+		
+		// test a string containing Carriage Return char
+		assertFalse(UrlPattern.isValid("\r"));
+		assertFalse(UrlPattern.isValid("/\r"));
+		assertFalse(UrlPattern.isValid("/some\r"));
+		assertFalse(UrlPattern.isValid("/some\rthing"));
+		assertFalse(UrlPattern.isValid("*.something\r"));
+		assertFalse(UrlPattern.isValid("*.some\rthing"));
+		
+		// test a string containing New Line char
+		assertFalse(UrlPattern.isValid("\n"));
+		assertFalse(UrlPattern.isValid("/\n"));
+		assertFalse(UrlPattern.isValid("/some\n"));
+		assertFalse(UrlPattern.isValid("/some\nthing"));
+		assertFalse(UrlPattern.isValid("/some\r\nthing"));
+		assertFalse(UrlPattern.isValid("/some\rthi\nng"));
+		assertFalse(UrlPattern.isValid("*.something\n"));
+		assertFalse(UrlPattern.isValid("*.some\nthing"));
+		
+		// test the path mappings
+		assertTrue(UrlPattern.isValid("/"));
+		assertTrue(UrlPattern.isValid("/*"));
+		assertTrue(UrlPattern.isValid("/something"));
+		assertTrue(UrlPattern.isValid("/something/"));
+		assertTrue(UrlPattern.isValid("/something/*"));
+		assertTrue(UrlPattern.isValid("/some/thing"));
+		assertTrue(UrlPattern.isValid("/some/thing/*"));
+		assertTrue(UrlPattern.isValid("/some/thing/else"));
+		assertFalse(UrlPattern.isValid("/some/thing/*.else"));
+		
+		// test extension mappings
+		assertTrue(UrlPattern.isValid("*."));
+		assertTrue(UrlPattern.isValid("*.some"));
+		assertTrue(UrlPattern.isValid("*.some*thing"));
+		assertFalse(UrlPattern.isValid("*.some/thing"));
+		
+		// test other situations
+		assertFalse(UrlPattern.isValid("something"));
+		assertFalse(UrlPattern.isValid("some/thing"));
+		assertFalse(UrlPattern.isValid(".something"));
+		assertFalse(UrlPattern.isValid(".some/thing"));
+	}
+	
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/WebExportOperationTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/WebExportOperationTest.java
new file mode 100644
index 0000000..05d4da3
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/WebExportOperationTest.java
@@ -0,0 +1,554 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ * Created on Jan 6, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package org.eclipse.wtp.j2ee.headless.tests.web.operations;
+
+import junit.framework.Test;
+
+import org.eclipse.jst.j2ee.datamodel.properties.IJ2EEComponentExportDataModelProperties;
+import org.eclipse.jst.j2ee.internal.web.archive.operations.WebComponentExportDataModelProvider;
+import org.eclipse.jst.j2ee.web.datamodel.properties.IWebComponentExportDataModelProperties;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.tests.OperationTestCase;
+import org.eclipse.wst.common.tests.SimpleTestSuite;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.JavaEEFacetConstants;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.JavaFileTestingUtilities;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleExportOperationTest;
+
+/**
+ * @author Administrator
+ * @author Ian Tewksbury (ictewksb@us.ibm.com)
+ * 
+ * To change the template for this generated type comment go to Window - Preferences - Java - Code
+ * Generation - Code and Comments
+ */
+public class WebExportOperationTest extends ModuleExportOperationTest {	
+	public WebExportOperationTest() {
+		super("WebExportOperationTests");
+	}
+	
+	public WebExportOperationTest(String name) {
+		super(name);
+	}
+	
+	public static Test suite() {
+		return new SimpleTestSuite(WebExportOperationTest.class);
+	}
+	
+	public void testWebExport22_Defaults() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("testWebExport", null, null, null, null, JavaEEFacetConstants.WEB_22, true);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+	
+	public void testWebExport23_Defaults() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("superWeb", null, null, null, null, JavaEEFacetConstants.WEB_23, true);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+	
+	public void testWebExport24_Defaults() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("crazyWeb", null, null, null, null, JavaEEFacetConstants.WEB_24, true);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+	
+	public void testWebExport25_Defaults() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("netoWeb", null, null, null, null, JavaEEFacetConstants.WEB_25, false);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}	
+	
+	public void testWebExport22_ChangedContentDir() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("goodWeb", null, null, "myAwesomeContentDir", null, JavaEEFacetConstants.WEB_22, true);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+	
+	public void testWebExport23_ChangedContentDir() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("niceWeb", null, null, "contentHere", null, JavaEEFacetConstants.WEB_23, true);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+	
+	public void testWebExport24_ChangedContentDir() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("spiderWeb", null, null, "iLikeContent", null, JavaEEFacetConstants.WEB_24, true);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+	
+	public void testWebExport25_ChangedContentDir() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("hotWeb", null, null, "fooContent", null, JavaEEFacetConstants.WEB_25, false);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+	
+	
+	public void testWebExport22_ChangedJavaSrcDir() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("penWeb", null, null, null, "myJavaSrc", JavaEEFacetConstants.WEB_22, true);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+	
+	public void testWebExport23_ChangedJavaSrcDir() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("pencilWeb", null, null, null, "fooSrc", JavaEEFacetConstants.WEB_23, true);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+	
+	public void testWebExport24_ChangedJavaSrcDir() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("clipWeb", null, null, null, "barSrc", JavaEEFacetConstants.WEB_24, true);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+	
+	public void testWebExport25_ChangedJavaSrcDir() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("markerWeb", null, null, null, "srcOfCool", JavaEEFacetConstants.WEB_25, false);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+	
+	
+	public void testWebExport22_ChangedContentDir_ChangedJavaSrcDir() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("aWeb", null, null, "contentA", "srcHi", JavaEEFacetConstants.WEB_22, true);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+	
+	public void testWebExport23_ChangedContentDir_ChangedJavaSrcDir() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("bWeb", null, null, "contentB", "srcBy", JavaEEFacetConstants.WEB_23, true);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+	
+	public void testWebExport24_ChangedContentDir_ChangedJavaSrcDir() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("cWeb", null, null, "contentC", "srcKite", JavaEEFacetConstants.WEB_24, true);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+	
+	public void testWebExport25_ChangedContentDir_ChangedJavaSrcDir() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("dWeb", null, null, "contentD", "srcBike", JavaEEFacetConstants.WEB_25, false);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+	
+	
+	public void testWebExport22_Defaults_WithEAR() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("testWebExport", "teatEAR", null, null, null, JavaEEFacetConstants.WEB_22, true);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+	
+	public void testWebExport23_Defaults_WithEAR() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("superWeb", "superEAR", null, null, null, JavaEEFacetConstants.WEB_23, true);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+	
+	public void testWebExport24_Defaults_WithEAR() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("crazyWeb", "crazyEAR", null, null, null, JavaEEFacetConstants.WEB_24, true);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+	
+	public void testWebExport25_Defaults_WithEAR() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("netoWeb", "netoEAR", null, null, null, JavaEEFacetConstants.WEB_25, false);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+	
+	
+	public void testWebExport22_ChangedContextRoot_WithEAR() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("myWeb", "earMy", "superContextRoot", null, null, JavaEEFacetConstants.WEB_22, true);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+	
+	public void testWebExport23_ChangedContextRoot_WithEAR() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("yourWeb", "earYour", "contextRootFoo", null, null, JavaEEFacetConstants.WEB_23, true);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+	
+	public void testWebExport24_ChangedContextRoot_WithEAR() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("ourWeb", "earOur", "barContextRoot", null, null, JavaEEFacetConstants.WEB_24, true);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+	
+	public void testWebExport25_ChangedContextRoot_WithEAR() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("theirWeb", "earTheir", "theRootOfContext", null, null, JavaEEFacetConstants.WEB_25, false);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+	
+	
+	public void testWebExport22_ChangedContentDir_WithEAR() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("goodWeb", "aEAR", null, "myAwesomeContentDir", null, JavaEEFacetConstants.WEB_22, true);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+	
+	public void testWebExport23_ChangedContentDir_WithEAR() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("niceWeb", "bEAR", null, "contentHere", null, JavaEEFacetConstants.WEB_23, true);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+	
+	public void testWebExport24_ChangedContentDir_WithEAR() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("spiderWeb", "cEAR", null, "iLikeContent", null, JavaEEFacetConstants.WEB_24, true);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+	
+	public void testWebExport25_ChangedContentDir_WithEAR() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("hotWeb", "dEAR", null, "fooContent", null, JavaEEFacetConstants.WEB_25, false);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+	
+	
+	public void testWebExport22_ChangedJavaSrcDir_WithEAR() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("penWeb", "fEAR", null, null, "myJavaSrc", JavaEEFacetConstants.WEB_22, true);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+	
+	public void testWebExport23_ChangedJavaSrcDir_WithEAR() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("pencilWeb", "gEAR", null, null, "fooSrc", JavaEEFacetConstants.WEB_23, true);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+	
+	public void testWebExport24_ChangedJavaSrcDir_WithEAR() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("clipWeb", "hEAR", null, null, "barSrc", JavaEEFacetConstants.WEB_24, true);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+	
+	public void testWebExport25_ChangedJavaSrcDir_WithEAR() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("markerWeb", "iEAR", null, null, "srcOfCool", JavaEEFacetConstants.WEB_25, false);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+	
+	
+	public void testWebExport22_ChangedContextRoot_ChangedContentDir_WithEAR() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("redWeb", "jEAR", "superCR", "content", null, JavaEEFacetConstants.WEB_22, true);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+	
+	public void testWebExport23_ChangedContextRoot_ChangedContentDir_WithEAR() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("yellowWeb", "kEAR", "fooCR", "goContent", null, JavaEEFacetConstants.WEB_23, true);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+	
+	public void testWebExport24_ChangedContextRoot_ChangedContentDir_WithEAR() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("blackWeb", "lEAR", "barCR", "stopContent", null, JavaEEFacetConstants.WEB_24, true);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+	
+	public void testWebExport25_ChangedContextRoot_ChangedContentDir_WithEAR() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("whiteWeb", "mEAR", "theROfC", "testContent", null, JavaEEFacetConstants.WEB_25, false);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+	
+	
+	public void testWebExport22_ChangedContextRoot_ChangedJavaSrcDir_WithEAR() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("farWeb", "nEAR", "ourCR", null, "superSrc", JavaEEFacetConstants.WEB_22, true);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+	
+	public void testWebExport23_ChangedContextRoot_ChangedJavaSrcDir_WithEAR() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("closeWeb", "oEAR", "theirCR", null, "netoSrc", JavaEEFacetConstants.WEB_23, true);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+	
+	public void testWebExport24_ChangedContextRoot_ChangedJavaSrcDir_WithEAR() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("neerWeb", "pEAR", "myCR", null, "niceSrc", JavaEEFacetConstants.WEB_24, true);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+	
+	public void testWebExport25_ChangedContextRoot_ChangedJavaSrcDir_WithEAR() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("awayWeb", "qEAR", "yourCR", null, "coolSrc", JavaEEFacetConstants.WEB_25, false);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+	
+	
+	public void testWebExport22_ChangedContentDir_ChangedJavaSrcDir_WithEAR() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("aWeb", "aEAR", null, "contentA", "srcHi", JavaEEFacetConstants.WEB_22, true);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+	
+	public void testWebExport23_ChangedContentDir_ChangedJavaSrcDir_WithEAR() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("bWeb", "bEAR", null, "contentB", "srcBy", JavaEEFacetConstants.WEB_23, true);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+	
+	public void testWebExport24_ChangedContentDir_ChangedJavaSrcDir_WithEAR() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("cWeb", "cEAR", null, "contentC", "srcKite", JavaEEFacetConstants.WEB_24, true);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+	
+	public void testWebExport25_ChangedContentDir_ChangedJavaSrcDir_WithEAR() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("dWeb", "dEAR", null, "contentD", "srcBike", JavaEEFacetConstants.WEB_25, false);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+	
+	
+	public void testWebExport22_ChangedContextRoot_ChangedContentDir_ChangedJavaSrcDir_WithEAR() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("eWeb", "eEAR", "eRoot", "eContDir", "srcE", JavaEEFacetConstants.WEB_22, true);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+	
+	public void testWebExport23_ChangedContextRoot_ChangedContentDir_ChangedJavaSrcDir_WithEAR() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("fWeb", "fEAR", "fRoot", "fContDir", "srcF", JavaEEFacetConstants.WEB_23, true);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+	
+	public void testWebExport24_ChangedContextRoot_ChangedContentDir_ChangedJavaSrcDir_WithEAR() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("gWeb", "gEAR", "gRoot", "gContDir", "srcG", JavaEEFacetConstants.WEB_24, true);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+	
+	public void testWebExport25_ChangedContextRoot_ChangedContentDir_ChangedJavaSrcDir_WithEAR() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("hWeb", "hEAR", "hRoot", "hContDir", "srgH", JavaEEFacetConstants.WEB_25, false);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+	
+	
+	
+	public void testWebExport25_Defaults_WithDD() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("netoWeb", null, null, null, null, JavaEEFacetConstants.WEB_25, true);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+
+	public void testWebExport25_ChangedContextRoot_WithDD() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("theirWeb", null, "theRootOfContext", null, null, JavaEEFacetConstants.WEB_25, true);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+
+	public void testWebExport25_ChangedContentDir_WithDD() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("hotWeb", null, null, "fooContent", null, JavaEEFacetConstants.WEB_25, true);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+
+	public void testWebExport25_ChangedJavaSrcDir_WithDD() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("markerWeb", null, null, null, "srcOfCool", JavaEEFacetConstants.WEB_25, true);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+
+	public void testWebExport25_ChangedContextRoot_ChangedContentDir_WithDD() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("whiteWeb", null, "theROfC", "testContent", null, JavaEEFacetConstants.WEB_25, true);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+
+	public void testWebExport25_ChangedContextRoot_ChangedJavaSrcDir_WithDD() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("awayWeb", null, "yourCR", null, "coolSrc", JavaEEFacetConstants.WEB_25, true);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+
+	public void testWebExport25_ChangedContentDir_ChangedJavaSrcDir_WithDD() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("dWeb", null, null, "contentD", "srcBike", JavaEEFacetConstants.WEB_25, true);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+
+	public void testWebExport25_ChangedContextRoot_ChangedContentDir_ChangedJavaSrcDir_WithDD() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("hWeb", null, "hRoot", "hContDir", "srgH", JavaEEFacetConstants.WEB_25, true);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+
+	public void testWebExport25_Defaults_WithEAR_WithDD() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("netoWeb", "netoEAR", null, null, null, JavaEEFacetConstants.WEB_25, true);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+
+	public void testWebExport25_ChangedContextRoot_WithEAR_WithDD() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("theirWeb", "earTheir", "theRootOfContext", null, null, JavaEEFacetConstants.WEB_25, true);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+
+	public void testWebExport25_ChangedContentDir_WithEAR_WithDD() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("hotWeb", "dEAR", null, "fooContent", null, JavaEEFacetConstants.WEB_25, true);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+
+	public void testWebExport25_ChangedJavaSrcDir_WithEAR_WithDD() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("markerWeb", "iEAR", null, null, "srcOfCool", JavaEEFacetConstants.WEB_25, true);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+
+	public void testWebExport25_ChangedContextRoot_ChangedContentDir_WithEAR_WithDD() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("whiteWeb", "mEAR", "theROfC", "testContent", null, JavaEEFacetConstants.WEB_25, true);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+
+	public void testWebExport25_ChangedContextRoot_ChangedJavaSrcDir_WithEAR_WithDD() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("awayWeb", "qEAR", "yourCR", null, "coolSrc", JavaEEFacetConstants.WEB_25, true);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+
+	public void testWebExport25_ChangedContentDir_ChangedJavaSrcDir_WithEAR_WithDD() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("dWeb", "dEAR", null, "contentD", "srcBike", JavaEEFacetConstants.WEB_25, true);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+
+	public void testWebExport25_ChangedContextRoot_ChangedContentDir_ChangedJavaSrcDir_WithEAR_WithDD() throws Exception {
+		IDataModel dm = WebProjectCreationOperationTest.getWebDataModel("hWeb", "hEAR", "hRoot", "hContDir", "srgH", JavaEEFacetConstants.WEB_25, true);
+		OperationTestCase.runDataModel(dm);
+		
+		runExportTests_All(dm);
+	}
+	
+    @Override
+    protected String getModuleExtension() {
+    	return ".war";
+    }
+	
+	@Override
+	protected IDataModel getExportDataModel(String projectName, String destination, boolean exportSource, boolean runBuild, boolean overwriteExisting) {
+		return getWebExportDataModel(projectName, destination, exportSource, runBuild, overwriteExisting, false);
+	}
+	
+    /**
+     * @param projectName name of the project to export
+     * @param destination destination to export to
+     * @param exportSource if TRUE export source files, else don't
+     * @param runBuild if TRUE run a build before exporting, else don't
+     * @param overwriteExisting if TRUE overwrite existing files, else don't
+     * @param excludeCompileJSP indicates whether or not to export compiled JSP files
+     * @return an EJBComponentExport data model with all of the given settings.
+     */
+    public static IDataModel getWebExportDataModel(String projectName, String destination, boolean exportSource, boolean runBuild, boolean overwriteExisting, boolean excludeCompileJSP){
+    	IDataModel exportModel = DataModelFactory.createDataModel(new WebComponentExportDataModelProvider());
+    	
+		exportModel.setProperty(IJ2EEComponentExportDataModelProperties.PROJECT_NAME, projectName);
+		exportModel.setProperty(IJ2EEComponentExportDataModelProperties.ARCHIVE_DESTINATION, destination);
+		exportModel.setProperty(IJ2EEComponentExportDataModelProperties.EXPORT_SOURCE_FILES, exportSource);
+		exportModel.setProperty(IJ2EEComponentExportDataModelProperties.OVERWRITE_EXISTING, overwriteExisting);
+		exportModel.setProperty(IJ2EEComponentExportDataModelProperties.RUN_BUILD, runBuild);
+		
+		exportModel.setProperty(IWebComponentExportDataModelProperties.EXCLUDE_COMPILE_JSP, excludeCompileJSP);
+		
+		return exportModel;
+    }
+    
+    @Override
+    protected void addJavaFilesToProject(String projectName, String[] classNames, String prackageName) throws Exception {
+    	JavaFileTestingUtilities.addJavaFilesToWeb(projectName, classNames, prackageName);
+    }
+    
+    @Override
+    protected void verifyJavaFilesExported(String archiveName, String[] classNames, String packageName, boolean withClassFiles, boolean withSource) throws Exception {
+    	JavaFileTestingUtilities.verifyJavaFilesInWAR(archiveName, classNames, packageName, withClassFiles, withSource);
+    }
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/WebImportOperationBaseTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/WebImportOperationBaseTest.java
new file mode 100644
index 0000000..10ef7cb
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/WebImportOperationBaseTest.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.wtp.j2ee.headless.tests.web.operations;
+
+import java.util.List;
+
+import org.eclipse.jst.j2ee.datamodel.properties.IJ2EEComponentImportDataModelProperties;
+import org.eclipse.jst.j2ee.internal.web.archive.operations.WebComponentImportDataModelProvider;
+import org.eclipse.jst.j2ee.web.datamodel.properties.IWebComponentImportDataModelProperties;
+import org.eclipse.jst.jee.archive.IArchive;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleImportOperationTest;
+
+public class WebImportOperationBaseTest extends ModuleImportOperationTest{
+	
+	public WebImportOperationBaseTest() {
+		super("WebImportOperationBaseTest");
+	}
+	
+	public WebImportOperationBaseTest(String name) {
+		super(name);
+	}
+	
+	@Override
+	protected String getModuleExtension() {
+		return ".war";
+	}
+	
+    @Override
+    protected IDataModel getImportDataModel(String filePath, String projectName, IDataModel creationModel, boolean closeArchiveOnDispose) {
+    	return getWebImportDataModel(filePath, projectName, creationModel, closeArchiveOnDispose, null, null);
+    }
+    
+    public static IDataModel getWebImportDataModel(String filePath, String projectName, IDataModel creationModel, boolean closeArchiveOnDispose, List<IArchive> webLibArchivesToExpand, String contextRoot) {
+    	IDataModel importModel = DataModelFactory.createDataModel(new WebComponentImportDataModelProvider());
+    	
+    	importModel.setProperty(IJ2EEComponentImportDataModelProperties.FILE_NAME, filePath);
+    	importModel.setProperty(IJ2EEComponentImportDataModelProperties.PROJECT_NAME, projectName);
+    	importModel.setProperty(IJ2EEComponentImportDataModelProperties.CLOSE_ARCHIVE_ON_DISPOSE, closeArchiveOnDispose);
+    	
+    	
+    	if(creationModel != null) {
+    		importModel.setProperty(IJ2EEComponentImportDataModelProperties.NESTED_MODEL_J2EE_COMPONENT_CREATION, creationModel);
+    	}
+    	
+    	if(webLibArchivesToExpand != null) {
+    		importModel.setProperty(IWebComponentImportDataModelProperties.WEB_LIB_ARCHIVES_SELECTED, webLibArchivesToExpand);
+    	}
+    	
+    	if(contextRoot != null) {
+    		importModel.setProperty(IWebComponentImportDataModelProperties.CONTEXT_ROOT, contextRoot);
+    	}
+    	
+    	return importModel;
+    }
+    
+    @Override
+    protected IDataModel getExportDataModel(String projectName, String destination, boolean exportSource, boolean runBuild, boolean overwriteExisting) {
+    	return WebExportOperationTest.getWebExportDataModel(projectName, destination, exportSource, runBuild, overwriteExisting, false);
+    }
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/WebImportOperationTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/WebImportOperationTest.java
new file mode 100644
index 0000000..053eb37
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/WebImportOperationTest.java
@@ -0,0 +1,240 @@
+/*
+ * Created on Jan 6, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package org.eclipse.wtp.j2ee.headless.tests.web.operations;
+
+import junit.framework.Test;
+
+import org.eclipse.wst.common.tests.SimpleTestSuite;
+
+/**
+ * @author Ian Tewksbury (ictewksb@us.ibm.com)
+ * 
+ * To change the template for this generated type comment go to Window - Preferences - Java - Code
+ * Generation - Code and Comments
+ */
+public class WebImportOperationTest extends WebImportOperationBaseTest {
+
+	public WebImportOperationTest() {
+		super("WebImportOperationTests");
+	}
+	
+	public WebImportOperationTest(String name) {
+		super(name);
+	}
+	
+	public static Test suite() {
+		return new SimpleTestSuite(WebImportOperationTest.class);
+	}
+	
+	public void testWebImport22_Defaults() throws Exception {
+		runImportTests_All("Web22_Defaults");
+	}
+	
+	public void testWebImport23_Defaults() throws Exception {
+		runImportTests_All("Web23_Defaults");
+	}
+	
+	public void testWebImport24_Defaults() throws Exception {
+		runImportTests_All("Web24_Defaults");
+	}
+	
+	public void testWebImport22_DiffContentDir() throws Exception {
+		runImportTests_All("Web22_DiffContentDir");
+	}
+	
+	public void testWebImport23_DiffContentDir() throws Exception {
+		runImportTests_All("Web23_DiffContentDir");
+	}
+	
+	public void testWebImport24_DiffContentDir() throws Exception {
+		runImportTests_All("Web24_DiffContentDir");
+	}
+	
+	public void testWebImport22_DiffSrcDir() throws Exception {
+		runImportTests_All("Web22_DiffSrcDir");
+	}
+	
+	public void testWebImport23_DiffSrcDir() throws Exception {
+		runImportTests_All("Web23_DiffSrcDir");
+	}
+	
+	public void testWebImport24_DiffSrcDir() throws Exception {
+		runImportTests_All("Web24_DiffSrcDir");
+	}
+	
+	public void testWebImport22_DiffContentDir_DiffSrcDir() throws Exception {
+		runImportTests_All("Web22_DiffContentDir_DiffSrcDir");
+	}
+	
+	public void testWebImport23_DiffContentDir_DiffSrcDir() throws Exception {
+		runImportTests_All("Web23_DiffContentDir_DiffSrcDir");
+	}
+	
+	public void testWebImport24_DiffContentDir_DiffSrcDir() throws Exception {
+		runImportTests_All("Web24_DiffContentDir_DiffSrcDir");
+	}
+	
+	public void testWebImport22_Defaults_WithEAR() throws Exception {
+		runImportTests_All("Web22_Defaults_WithEAR");
+	}
+	
+	public void testWebImport23_Defaults_WithEAR() throws Exception {
+		runImportTests_All("Web23_Defaults_WithEAR");
+	}
+	
+	public void testWebImport24_Defaults_WithEAR() throws Exception {
+		runImportTests_All("Web24_Defaults_WithEAR");
+	}
+	
+	public void testWebImport22_DiffContextRoot_WithEAR() throws Exception {
+		runImportTests_All("Web22_DiffContextRoot_WithEAR");
+	}
+	
+	public void testWebImport23_DiffContextRoot_WithEAR() throws Exception {
+		runImportTests_All("Web23_DiffContextRoot_WithEAR");
+	}
+	
+	public void testWebImport24_DiffContextRoot_WithEAR() throws Exception {
+		runImportTests_All("Web24_DiffContextRoot_WithEAR");
+	}
+	
+	public void testWebImport22_DiffContentDir_WithEAR() throws Exception {
+		runImportTests_All("Web22_DiffContentDir_WithEAR");
+	}
+	
+	public void testWebImport23_DiffContentDir_WithEAR() throws Exception {
+		runImportTests_All("Web23_DiffContentDir_WithEAR");
+	}
+	
+	public void testWebImport24_DiffContentDir_WithEAR() throws Exception {
+		runImportTests_All("Web24_DiffContentDir_WithEAR");
+	}
+		
+	public void testWebImport22_DiffSrcDir_WithEAR() throws Exception {
+		runImportTests_All("Web22_DiffSrcDir_WithEAR");
+	}
+	
+	public void testWebImport23_DiffSrcDir_WithEAR() throws Exception {
+		runImportTests_All("Web23_DiffSrcDir_WithEAR");
+	}
+	
+	public void testWebImport24_DiffSrcDir_WithEAR() throws Exception {
+		runImportTests_All("Web24_DiffSrcDir_WithEAR");
+	}
+	
+	public void testWebImport22_DiffContextRoot_DiffContentDir_WithEAR() throws Exception {
+		runImportTests_All("Web22_DiffContextRoot_DiffContentDir_WithEAR");
+	}
+	
+	public void testWebImport23_DiffContextRoot_DiffContentDir_WithEAR() throws Exception {
+		runImportTests_All("Web23_DiffContextRoot_DiffContentDir_WithEAR");
+	}
+	
+	public void testWebImport24_DiffContextRoot_DiffContentDir_WithEAR() throws Exception {
+		runImportTests_All("Web24_DiffContextRoot_DiffContentDir_WithEAR");
+	}
+	
+	public void testWebImport22_DiffContextRoot_DiffSrcDir_WithEAR() throws Exception {
+		runImportTests_All("Web22_DiffContextRoot_DiffSrcDir_WithEAR");
+	}
+	
+	public void testWebImport23_DiffContextRoot_DiffSrcDir_WithEAR() throws Exception {
+		runImportTests_All("Web23_DiffContextRoot_DiffSrcDir_WithEAR");
+	}
+	
+	public void testWebImport24_DiffContextRoot_DiffSrcDir_WithEAR() throws Exception {
+		runImportTests_All("Web24_DiffContextRoot_DiffSrcDir_WithEAR");
+	}
+	
+	public void testWebImport22_DiffContentDir_DiffSrcDir_WithEAR() throws Exception {
+		runImportTests_All("Web22_DiffContentDir_DiffSrcDir_WithEAR");
+	}
+	
+	public void testWebImport23_DiffContentDir_DiffSrcDir_WithEAR() throws Exception {
+		runImportTests_All("Web23_DiffContentDir_DiffSrcDir_WithEAR");
+	}
+	
+	public void testWebImport24_DiffContentDir_DiffSrcDir_WithEAR() throws Exception {
+		runImportTests_All("Web24_DiffContentDir_DiffSrcDir_WithEAR");
+	}
+	
+	public void testWebImport22_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR() throws Exception {
+		runImportTests_All("Web22_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR");
+	}
+	
+	public void testWebImport23_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR() throws Exception {
+		runImportTests_All("Web23_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR");
+	}
+	
+	public void testWebImport24_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR() throws Exception {
+		runImportTests_All("Web24_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR");
+	}
+		
+	public void testWebImport25_Defaults_WithDD() throws Exception {
+		runImportTests_All("Web25_Defaults_WithDD");
+	}
+
+	public void testWebImport25_DiffContextRoot_WithDD() throws Exception {
+		runImportTests_All("Web25_DiffContextRoot_WithDD");
+	}
+
+	public void testWebImport25_DiffContentDir_WithDD() throws Exception {
+		runImportTests_All("Web25_DiffContentDir_WithDD");
+	}
+
+	public void testWebImport25_DiffSrcDir_WithDD() throws Exception {
+		runImportTests_All("Web25_DiffSrcDir_WithDD");
+	}
+
+	public void testWebImport25_DiffContextRoot_DiffContentDir_WithDD() throws Exception {
+		runImportTests_All("Web25_DiffContextRoot_DiffContentDir_WithDD");
+	}
+
+	public void testWebImport25_DiffContextRoot_DiffSrcDir_WithDD() throws Exception {
+		runImportTests_All("Web25_DiffContextRoot_DiffSrcDir_WithDD");
+	}
+
+	public void testWebImport25_DiffContentDir_DiffSrcDir_WithDD() throws Exception {
+		runImportTests_All("Web25_DiffContentDir_DiffSrcDir_WithDD");
+	}
+
+	public void testWebImport25_DiffContextRoot_DiffContentDir_DiffSrcDir_WithDD() throws Exception {
+		runImportTests_All("Web25_DiffContextRoot_DiffContentDir_DiffSrcDir_WithDD");
+	}
+
+	public void testWebImport25_Defaults_WithEAR_WithDD() throws Exception {
+		runImportTests_All("Web25_Defaults_WithEAR_WithDD");
+	}
+
+	public void testWebImport25_DiffContextRoot_WithEAR_WithDD() throws Exception {
+		runImportTests_All("Web25_DiffContextRoot_WithEAR_WithDD");
+	}
+
+	public void testWebImport25_DiffContentDir_WithEAR_WithDD() throws Exception {
+		runImportTests_All("Web25_DiffContentDir_WithEAR_WithDD");
+	}
+
+	public void testWebImport25_DiffSrcDir_WithEAR_WithDD() throws Exception {
+		runImportTests_All("Web25_DiffSrcDir_WithEAR_WithDD");
+	}
+
+	public void testWebImport25_DiffContextRoot_DiffContentDir_WithEAR_WithDD() throws Exception {
+		runImportTests_All("Web25_DiffContextRoot_DiffContentDir_WithEAR_WithDD");
+	}
+
+	public void testWebImport25_DiffContextRoot_DiffSrcDir_WithEAR_WithDD() throws Exception {
+		runImportTests_All("Web25_DiffContextRoot_DiffSrcDir_WithEAR_WithDD");
+	}
+
+	public void testWebImport25_DiffContentDir_DiffSrcDir_WithEAR_WithDD() throws Exception {
+		runImportTests_All("Web25_DiffContentDir_DiffSrcDir_WithEAR_WithDD");
+	}
+
+	public void testWebImport25_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_WithDD() throws Exception {
+		runImportTests_All("Web25_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_WithDD");
+	}	
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/WebProjectCreationOperationTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/WebProjectCreationOperationTest.java
new file mode 100644
index 0000000..3517bfe
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/WebProjectCreationOperationTest.java
@@ -0,0 +1,577 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2014 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ * Created on Nov 7, 2003
+ *
+ * To change the template for this generated file go to
+ * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
+ */
+package org.eclipse.wtp.j2ee.headless.tests.web.operations;
+
+import junit.framework.Test;
+
+import org.eclipse.jst.j2ee.internal.web.archive.operations.WebFacetProjectCreationDataModelProvider;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetConstants;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetInstallDataModelProperties;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetProjectCreationDataModelProperties;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEModuleFacetInstallDataModelProperties;
+import org.eclipse.jst.j2ee.web.project.facet.IWebFacetInstallDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties.FacetDataModelMap;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
+import org.eclipse.wst.common.tests.OperationTestCase;
+import org.eclipse.wst.common.tests.SimpleTestSuite;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.JavaEEFacetConstants;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleProjectCreationOperationTest;
+
+
+public class WebProjectCreationOperationTest extends ModuleProjectCreationOperationTest {
+    
+	public WebProjectCreationOperationTest() {
+		super("WebProjectCreationOperationTests");
+	}
+	
+	public WebProjectCreationOperationTest(String name) {
+		super(name);
+	}
+
+	public static Test suite() {
+		return new SimpleTestSuite(WebProjectCreationOperationTest.class);
+    }
+	
+	public void testWeb22_Defaults() throws Exception {
+		IDataModel dm = getWebDataModel("testWeb", null, null, null, null, JavaEEFacetConstants.WEB_22, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb23_Defaults() throws Exception {
+		IDataModel dm = getWebDataModel("superWeb", null, null, null, null, JavaEEFacetConstants.WEB_23, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb24_Defaults() throws Exception {
+		IDataModel dm = getWebDataModel("crazyWeb", null, null, null, null, JavaEEFacetConstants.WEB_24, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb25_Defaults() throws Exception {
+		IDataModel dm = getWebDataModel("netoWeb", null, null, null, null, JavaEEFacetConstants.WEB_25, false);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_Defaults() throws Exception {
+		IDataModel dm = getWebDataModel("badWeb", null, null, null, null, JavaEEFacetConstants.WEB_30, false);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+
+	public void testWeb22_ChangedContentDir() throws Exception {
+		IDataModel dm = getWebDataModel("goodWeb", null, null, "myAwesomeContentDir", null, JavaEEFacetConstants.WEB_22, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb23_ChangedContentDir() throws Exception {
+		IDataModel dm = getWebDataModel("niceWeb", null, null, "contentHere", null, JavaEEFacetConstants.WEB_23, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb24_ChangedContentDir() throws Exception {
+		IDataModel dm = getWebDataModel("spiderWeb", null, null, "iLikeContent", null, JavaEEFacetConstants.WEB_24, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb25_ChangedContentDir() throws Exception {
+		IDataModel dm = getWebDataModel("hotWeb", null, null, "fooContent", null, JavaEEFacetConstants.WEB_25, false);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_ChangedContentDir() throws Exception {
+		IDataModel dm = getWebDataModel("madWeb", null, null, "madContent", null, JavaEEFacetConstants.WEB_30, false);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb22_ChangedJavaSrcDir() throws Exception {
+		IDataModel dm = getWebDataModel("penWeb", null, null, null, "myJavaSrc", JavaEEFacetConstants.WEB_22, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb23_ChangedJavaSrcDir() throws Exception {
+		IDataModel dm = getWebDataModel("pencilWeb", null, null, null, "fooSrc", JavaEEFacetConstants.WEB_23, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb24_ChangedJavaSrcDir() throws Exception {
+		IDataModel dm = getWebDataModel("clipWeb", null, null, null, "barSrc", JavaEEFacetConstants.WEB_24, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb25_ChangedJavaSrcDir() throws Exception {
+		IDataModel dm = getWebDataModel("markerWeb", null, null, null, "srcOfCool", JavaEEFacetConstants.WEB_25, false);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_ChangedJavaSrcDir() throws Exception {
+		IDataModel dm = getWebDataModel("booWeb", null, null, null, "booSrc", JavaEEFacetConstants.WEB_30, false);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	
+	public void testWeb22_ChangedContentDir_ChangedJavaSrcDir() throws Exception {
+		IDataModel dm = getWebDataModel("aWeb", null, null, "contentA", "srcHi", JavaEEFacetConstants.WEB_22, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb23_ChangedContentDir_ChangedJavaSrcDir() throws Exception {
+		IDataModel dm = getWebDataModel("bWeb", null, null, "contentB", "srcBy", JavaEEFacetConstants.WEB_23, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb24_ChangedContentDir_ChangedJavaSrcDir() throws Exception {
+		IDataModel dm = getWebDataModel("cWeb", null, null, "contentC", "srcKite", JavaEEFacetConstants.WEB_24, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb25_ChangedContentDir_ChangedJavaSrcDir() throws Exception {
+		IDataModel dm = getWebDataModel("dWeb", null, null, "contentD", "srcBike", JavaEEFacetConstants.WEB_25, false);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_ChangedContentDir_ChangedJavaSrcDir() throws Exception {
+		IDataModel dm = getWebDataModel("eeWeb", null, null, "contentEE", "srcTry", JavaEEFacetConstants.WEB_30, false);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	
+	public void testWeb22_Defaults_WithEAR() throws Exception {
+		IDataModel dm = getWebDataModel("testWeb", "teatEAR", null, null, null, JavaEEFacetConstants.WEB_22, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb23_Defaults_WithEAR() throws Exception {
+		IDataModel dm = getWebDataModel("superWeb", "superEAR", null, null, null, JavaEEFacetConstants.WEB_23, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb24_Defaults_WithEAR() throws Exception {
+		IDataModel dm = getWebDataModel("crazyWeb", "crazyEAR", null, null, null, JavaEEFacetConstants.WEB_24, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb25_Defaults_WithEAR() throws Exception {
+		IDataModel dm = getWebDataModel("netoWeb", "netoEAR", null, null, null, JavaEEFacetConstants.WEB_25, false);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_Defaults_WithEAR() throws Exception {
+		IDataModel dm = getWebDataModel("badWeb", "badEAR", null, null, null, JavaEEFacetConstants.WEB_30, false);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb22_ChangedContextRoot_WithEAR() throws Exception {
+		IDataModel dm = getWebDataModel("myWeb", "earMy", "superContextRoot", null, null, JavaEEFacetConstants.WEB_22, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb23_ChangedContextRoot_WithEAR() throws Exception {
+		IDataModel dm = getWebDataModel("yourWeb", "earYour", "contextRootFoo", null, null, JavaEEFacetConstants.WEB_23, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb24_ChangedContextRoot_WithEAR() throws Exception {
+		IDataModel dm = getWebDataModel("ourWeb", "earOur", "barContextRoot", null, null, JavaEEFacetConstants.WEB_24, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb25_ChangedContextRoot_WithEAR() throws Exception {
+		IDataModel dm = getWebDataModel("theirWeb", "earTheir", "theRootOfContext", null, null, JavaEEFacetConstants.WEB_25, false);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_ChangedContextRoot_WithEAR() throws Exception {
+		IDataModel dm = getWebDataModel("herWeb", "earHer", "herContextRoot", null, null, JavaEEFacetConstants.WEB_30, false);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	
+	public void testWeb22_ChangedContentDir_WithEAR() throws Exception {
+		IDataModel dm = getWebDataModel("goodWeb", "aEAR", null, "myAwesomeContentDir", null, JavaEEFacetConstants.WEB_22, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb23_ChangedContentDir_WithEAR() throws Exception {
+		IDataModel dm = getWebDataModel("niceWeb", "bEAR", null, "contentHere", null, JavaEEFacetConstants.WEB_23, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb24_ChangedContentDir_WithEAR() throws Exception {
+		IDataModel dm = getWebDataModel("spiderWeb", "cEAR", null, "iLikeContent", null, JavaEEFacetConstants.WEB_24, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb25_ChangedContentDir_WithEAR() throws Exception {
+		IDataModel dm = getWebDataModel("hotWeb", "dEAR", null, "fooContent", null, JavaEEFacetConstants.WEB_25, false);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_ChangedContentDir_WithEAR() throws Exception {
+		IDataModel dm = getWebDataModel("madWeb", "eeEAR", null, "madContent", null, JavaEEFacetConstants.WEB_30, false);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	
+	public void testWeb22_ChangedJavaSrcDir_WithEAR() throws Exception {
+		IDataModel dm = getWebDataModel("penWeb", "fEAR", null, null, "myJavaSrc", JavaEEFacetConstants.WEB_22, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb23_ChangedJavaSrcDir_WithEAR() throws Exception {
+		IDataModel dm = getWebDataModel("pencilWeb", "gEAR", null, null, "fooSrc", JavaEEFacetConstants.WEB_23, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb24_ChangedJavaSrcDir_WithEAR() throws Exception {
+		IDataModel dm = getWebDataModel("clipWeb", "hEAR", null, null, "barSrc", JavaEEFacetConstants.WEB_24, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb25_ChangedJavaSrcDir_WithEAR() throws Exception {
+		IDataModel dm = getWebDataModel("markerWeb", "iEAR", null, null, "srcOfCool", JavaEEFacetConstants.WEB_25, false);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_ChangedJavaSrcDir_WithEAR() throws Exception {
+		IDataModel dm = getWebDataModel("booWeb", "jjEAR", null, null, "booSrc", JavaEEFacetConstants.WEB_30, false);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	
+	public void testWeb22_ChangedContextRoot_ChangedContentDir_WithEAR() throws Exception {
+		IDataModel dm = getWebDataModel("redWeb", "jEAR", "superCR", "content", null, JavaEEFacetConstants.WEB_22, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb23_ChangedContextRoot_ChangedContentDir_WithEAR() throws Exception {
+		IDataModel dm = getWebDataModel("yellowWeb", "kEAR", "fooCR", "goContent", null, JavaEEFacetConstants.WEB_23, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb24_ChangedContextRoot_ChangedContentDir_WithEAR() throws Exception {
+		IDataModel dm = getWebDataModel("blackWeb", "lEAR", "barCR", "stopContent", null, JavaEEFacetConstants.WEB_24, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb25_ChangedContextRoot_ChangedContentDir_WithEAR() throws Exception {
+		IDataModel dm = getWebDataModel("whiteWeb", "mEAR", "theROfC", "testContent", null, JavaEEFacetConstants.WEB_25, false);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_ChangedContextRoot_ChangedContentDir_WithEAR() throws Exception {
+		IDataModel dm = getWebDataModel("pinkWeb", "nnEAR", "pinkCR", "pinkContent", null, JavaEEFacetConstants.WEB_30, false);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	
+	public void testWeb22_ChangedContextRoot_ChangedJavaSrcDir_WithEAR() throws Exception {
+		IDataModel dm = getWebDataModel("farWeb", "nEAR", "ourCR", null, "superSrc", JavaEEFacetConstants.WEB_22, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb23_ChangedContextRoot_ChangedJavaSrcDir_WithEAR() throws Exception {
+		IDataModel dm = getWebDataModel("closeWeb", "oEAR", "theirCR", null, "netoSrc", JavaEEFacetConstants.WEB_23, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb24_ChangedContextRoot_ChangedJavaSrcDir_WithEAR() throws Exception {
+		IDataModel dm = getWebDataModel("neerWeb", "pEAR", "myCR", null, "niceSrc", JavaEEFacetConstants.WEB_24, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb25_ChangedContextRoot_ChangedJavaSrcDir_WithEAR() throws Exception {
+		IDataModel dm = getWebDataModel("awayWeb", "qEAR", "yourCR", null, "coolSrc", JavaEEFacetConstants.WEB_25, false);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_ChangedContextRoot_ChangedJavaSrcDir_WithEAR() throws Exception {
+		IDataModel dm = getWebDataModel("veryfarWeb", "rEAR", "herCR", null, "verybadSrc", JavaEEFacetConstants.WEB_30, false);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	
+	public void testWeb22_ChangedContentDir_ChangedJavaSrcDir_WithEAR() throws Exception {
+		IDataModel dm = getWebDataModel("aWeb", "aEAR", null, "contentA", "srcHi", JavaEEFacetConstants.WEB_22, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb23_ChangedContentDir_ChangedJavaSrcDir_WithEAR() throws Exception {
+		IDataModel dm = getWebDataModel("bWeb", "bEAR", null, "contentB", "srcBy", JavaEEFacetConstants.WEB_23, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb24_ChangedContentDir_ChangedJavaSrcDir_WithEAR() throws Exception {
+		IDataModel dm = getWebDataModel("cWeb", "cEAR", null, "contentC", "srcKite", JavaEEFacetConstants.WEB_24, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb25_ChangedContentDir_ChangedJavaSrcDir_WithEAR() throws Exception {
+		IDataModel dm = getWebDataModel("dWeb", "dEAR", null, "contentD", "srcBike", JavaEEFacetConstants.WEB_25, false);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_ChangedContentDir_ChangedJavaSrcDir_WithEAR() throws Exception {
+		IDataModel dm = getWebDataModel("eeWeb", "eeEAR", null, "contentEE", "srcTry", JavaEEFacetConstants.WEB_30, false);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	
+	public void testWeb22_ChangedContextRoot_ChangedContentDir_ChangedJavaSrcDir_WithEAR() throws Exception {
+		IDataModel dm = getWebDataModel("eWeb", "eEAR", "eRoot", "eContDir", "srcE", JavaEEFacetConstants.WEB_22, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb23_ChangedContextRoot_ChangedContentDir_ChangedJavaSrcDir_WithEAR() throws Exception {
+		IDataModel dm = getWebDataModel("fWeb", "fEAR", "fRoot", "fContDir", "srcF", JavaEEFacetConstants.WEB_23, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb24_ChangedContextRoot_ChangedContentDir_ChangedJavaSrcDir_WithEAR() throws Exception {
+		IDataModel dm = getWebDataModel("gWeb", "gEAR", "gRoot", "gContDir", "srcG", JavaEEFacetConstants.WEB_24, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb25_ChangedContextRoot_ChangedContentDir_ChangedJavaSrcDir_WithEAR() throws Exception {
+		IDataModel dm = getWebDataModel("hWeb", "hEAR", "hRoot", "hContDir", "srgH", JavaEEFacetConstants.WEB_25, false);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_ChangedContextRoot_ChangedContentDir_ChangedJavaSrcDir_WithEAR() throws Exception {
+		IDataModel dm = getWebDataModel("iiWeb", "iiEAR", "iiRoot", "iiContDir", "srgII", JavaEEFacetConstants.WEB_30, false);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	
+	public void testWeb25_Defaults_WithDD() throws Exception {
+		IDataModel dm = getWebDataModel("netoWeb", null, null, null, null, JavaEEFacetConstants.WEB_25, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+
+	public void testWeb25_ChangedContextRoot_WithDD() throws Exception {
+		IDataModel dm = getWebDataModel("theirWeb", null, "theRootOfContext", null, null, JavaEEFacetConstants.WEB_25, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+
+	public void testWeb25_ChangedContentDir_WithDD() throws Exception {
+		IDataModel dm = getWebDataModel("hotWeb", null, null, "fooContent", null, JavaEEFacetConstants.WEB_25, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+
+	public void testWeb25_ChangedJavaSrcDir_WithDD() throws Exception {
+		IDataModel dm = getWebDataModel("markerWeb", null, null, null, "srcOfCool", JavaEEFacetConstants.WEB_25, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+
+	public void testWeb25_ChangedContextRoot_ChangedContentDir_WithDD() throws Exception {
+		IDataModel dm = getWebDataModel("whiteWeb", null, "theROfC", "testContent", null, JavaEEFacetConstants.WEB_25, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+
+	public void testWeb25_ChangedContextRoot_ChangedJavaSrcDir_WithDD() throws Exception {
+		IDataModel dm = getWebDataModel("awayWeb", null, "yourCR", null, "coolSrc", JavaEEFacetConstants.WEB_25, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+
+	public void testWeb25_ChangedContentDir_ChangedJavaSrcDir_WithDD() throws Exception {
+		IDataModel dm = getWebDataModel("dWeb", null, null, "contentD", "srcBike", JavaEEFacetConstants.WEB_25, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+
+	public void testWeb25_ChangedContextRoot_ChangedContentDir_ChangedJavaSrcDir_WithDD() throws Exception {
+		IDataModel dm = getWebDataModel("hWeb", null, "hRoot", "hContDir", "srgH", JavaEEFacetConstants.WEB_25, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+
+	public void testWeb25_Defaults_WithEAR_WithDD() throws Exception {
+		IDataModel dm = getWebDataModel("netoWeb", "netoEAR", null, null, null, JavaEEFacetConstants.WEB_25, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+
+	public void testWeb25_ChangedContextRoot_WithEAR_WithDD() throws Exception {
+		IDataModel dm = getWebDataModel("theirWeb", "earTheir", "theRootOfContext", null, null, JavaEEFacetConstants.WEB_25, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+
+	public void testWeb25_ChangedContentDir_WithEAR_WithDD() throws Exception {
+		IDataModel dm = getWebDataModel("hotWeb", "dEAR", null, "fooContent", null, JavaEEFacetConstants.WEB_25, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+
+	public void testWeb25_ChangedJavaSrcDir_WithEAR_WithDD() throws Exception {
+		IDataModel dm = getWebDataModel("markerWeb", "iEAR", null, null, "srcOfCool", JavaEEFacetConstants.WEB_25, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+
+	public void testWeb25_ChangedContextRoot_ChangedContentDir_WithEAR_WithDD() throws Exception {
+		IDataModel dm = getWebDataModel("whiteWeb", "mEAR", "theROfC", "testContent", null, JavaEEFacetConstants.WEB_25, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+
+	public void testWeb25_ChangedContextRoot_ChangedJavaSrcDir_WithEAR_WithDD() throws Exception {
+		IDataModel dm = getWebDataModel("awayWeb", "qEAR", "yourCR", null, "coolSrc", JavaEEFacetConstants.WEB_25, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+
+	public void testWeb25_ChangedContentDir_ChangedJavaSrcDir_WithEAR_WithDD() throws Exception {
+		IDataModel dm = getWebDataModel("dWeb", "dEAR", null, "contentD", "srcBike", JavaEEFacetConstants.WEB_25, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+
+	public void testWeb25_ChangedContextRoot_ChangedContentDir_ChangedJavaSrcDir_WithEAR_WithDD() throws Exception {
+		IDataModel dm = getWebDataModel("hWeb", "hEAR", "hRoot", "hContDir", "srgH", JavaEEFacetConstants.WEB_25, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_Defaults_WithDD() throws Exception {
+		IDataModel dm = getWebDataModel("badWeb", null, null, null, null, JavaEEFacetConstants.WEB_30, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_ChangedContextRoot_WithDD() throws Exception {
+		IDataModel dm = getWebDataModel("herWeb", null, "herRootOfContext", null, null, JavaEEFacetConstants.WEB_30, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_ChangedContentDir_WithDD() throws Exception {
+		IDataModel dm = getWebDataModel("madWeb", null, null, "madContent", null, JavaEEFacetConstants.WEB_30, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_ChangedContextRoot_ChangedContentDir_WithDD() throws Exception {
+		IDataModel dm = getWebDataModel("pinkWeb", null, "pinkRC", "tryContent", null, JavaEEFacetConstants.WEB_30, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_ChangedContextRoot_ChangedJavaSrcDir_WithDD() throws Exception {
+		IDataModel dm = getWebDataModel("farawayWeb", null, "farawayCR", null, "farSrc", JavaEEFacetConstants.WEB_30, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_ChangedContentDir_ChangedJavaSrcDir_WithDD() throws Exception {
+		IDataModel dm = getWebDataModel("eeWeb", null, null, "contentE", "srcTry", JavaEEFacetConstants.WEB_30, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_Defaults_WithEAR_WithDD() throws Exception {
+		IDataModel dm = getWebDataModel("badWeb", "badEAR", null, null, null, JavaEEFacetConstants.WEB_30, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_ChangedContextRoot_WithEAR_WithDD() throws Exception {
+		IDataModel dm = getWebDataModel("herWeb", "earHer", "herContextRoot", null, null, JavaEEFacetConstants.WEB_30, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_ChangedContentDir_WithEAR_WithDD() throws Exception {
+		IDataModel dm = getWebDataModel("madWeb", "eeEAR", null, "madContent", null, JavaEEFacetConstants.WEB_30, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_ChangedJavaSrcDir_WithEAR_WithDD() throws Exception {
+		IDataModel dm = getWebDataModel("booWeb", "jjEAR", null, null, "booSrc", JavaEEFacetConstants.WEB_30, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_ChangedContextRoot_ChangedContentDir_WithEAR_WithDD() throws Exception {
+		IDataModel dm = getWebDataModel("pinkWeb", "nnEAR", "pinkCR", "pinkContent", null, JavaEEFacetConstants.WEB_30, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_ChangedContextRoot_ChangedJavaSrcDir_WithEAR_WithDD() throws Exception {
+		IDataModel dm = getWebDataModel("veryfarWeb", "rEAR", "herCR", null, "verybadSrc", JavaEEFacetConstants.WEB_30, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_ChangedContentDir_ChangedJavaSrcDir_WithEAR_WithDD() throws Exception {
+		IDataModel dm = getWebDataModel("eeWeb", "eeEAR", null, "contentEE", "srcTry", JavaEEFacetConstants.WEB_30, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_ChangedContextRoot_ChangedContentDir_ChangedJavaSrcDir_WithEAR_WithDD() throws Exception {
+		IDataModel dm = getWebDataModel("iiWeb", "iiEAR", "iiRoot", "iiContDir", "srgII", JavaEEFacetConstants.WEB_30, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	
+    /**
+     * Creates and returns a Web Data Model with the given name and of the given version.
+     * Can also be used to specify none default context root, content directory, and/or
+     * the java source directory.
+     * If earName is not null then Web will be added to the EAR with earName, and if appropriate
+     * with or without a deployment descriptor.
+     * 
+     * @param projName name of the project to create
+     * @param earName name of the ear to add the project too, if NULL then don't add to an EAR
+     * @param contextRoot the context root to use for this  project, use default if NULL
+     * @param contentDir the content directory to use for this project, use default if NULL
+     * @param javaSrcDir the java source directory to use for this project, use default if NULL
+     * @param version version of Web to use
+     * @param createDD only used if version is JEE5, if true then create DD else don't
+     * @return a Web Data Model with the appropriate properties set
+     */
+    public static IDataModel getWebDataModel(String projName, String earName, String contextRoot, String contentDir, String javaSrcDir, IProjectFacetVersion version, boolean createDD){
+    	IDataModel dm = DataModelFactory.createDataModel(new WebFacetProjectCreationDataModelProvider());
+    	dm.setProperty(IFacetProjectCreationDataModelProperties.FACET_PROJECT_NAME, projName);
+    	
+    	if(earName != null) {
+    		dm.setProperty(IJ2EEFacetProjectCreationDataModelProperties.ADD_TO_EAR, true);
+    		dm.setProperty(IJ2EEFacetProjectCreationDataModelProperties.EAR_PROJECT_NAME, earName);
+    	} else {
+    		dm.setProperty(IJ2EEFacetProjectCreationDataModelProperties.ADD_TO_EAR, false);
+    	}
+    	
+    	FacetDataModelMap facetMap = (FacetDataModelMap) dm.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
+    	IDataModel facetModel = facetMap.getFacetDataModel(IJ2EEFacetConstants.DYNAMIC_WEB);
+    	facetModel.setProperty(IFacetDataModelProperties.FACET_VERSION, version);
+    	
+    	//if no contextRoot provided use default, contextRoot only matters if adding to EAR
+    	if(contextRoot != null && earName != null) {
+    		facetModel.setStringProperty(IWebFacetInstallDataModelProperties.CONTEXT_ROOT, contextRoot);
+    	}
+    	
+    	//if no contentDir provided use default
+    	if(contentDir != null) {
+    		facetModel.setStringProperty(IJ2EEModuleFacetInstallDataModelProperties.CONFIG_FOLDER, contentDir);
+    	}
+    	
+    	//if no javaSrcDir provided use default
+    	if(javaSrcDir != null) {
+    		facetModel.setStringProperty(IWebFacetInstallDataModelProperties.SOURCE_FOLDER, javaSrcDir);
+    	}
+    	
+    	facetModel.setBooleanProperty(IJ2EEFacetInstallDataModelProperties.GENERATE_DD, createDD);
+    	
+    	if (version.equals(JavaEEFacetConstants.WEB_31)){
+    		IDataModel javaFacetModel = facetMap.getFacetDataModel(IJ2EEFacetConstants.JAVA);
+	    	javaFacetModel.setProperty(IFacetDataModelProperties.FACET_VERSION, JavaEEFacetConstants.JAVA_7);   		
+    	}
+    	else if(version.equals(JavaEEFacetConstants.WEB_30))    	{
+    		IDataModel javaFacetModel = facetMap.getFacetDataModel(IJ2EEFacetConstants.JAVA);
+	    	javaFacetModel.setProperty(IFacetDataModelProperties.FACET_VERSION, JavaEEFacetConstants.JAVA_6);
+    	}
+    	else{    		
+            IDataModel javaFacetModel = facetMap.getFacetDataModel(IJ2EEFacetConstants.JAVA);
+            javaFacetModel.setProperty(IFacetDataModelProperties.FACET_VERSION, JavaEEFacetConstants.JAVA_5);
+    	}
+    	
+    	return dm;
+    }
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/webfragment/operations/WebFragmentProjectCreationOperationTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/webfragment/operations/WebFragmentProjectCreationOperationTest.java
new file mode 100644
index 0000000..44a0950
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/webfragment/operations/WebFragmentProjectCreationOperationTest.java
@@ -0,0 +1,219 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wtp.j2ee.headless.tests.webfragment.operations;
+
+import junit.framework.Test;
+
+import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetInstallDataModelProperties;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEModuleFacetInstallDataModelProperties;
+import org.eclipse.jst.j2ee.web.project.facet.IWebFacetInstallDataModelProperties;
+import org.eclipse.jst.j2ee.web.project.facet.WebFragmentFacetInstallDataModelProvider;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
+import org.eclipse.wst.common.tests.OperationTestCase;
+import org.eclipse.wst.common.tests.SimpleTestSuite;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.JavaEEFacetConstants;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleProjectCreationOperationTest;
+
+
+public class WebFragmentProjectCreationOperationTest extends ModuleProjectCreationOperationTest {
+    
+	public WebFragmentProjectCreationOperationTest() {
+		super("WebProjectCreationOperationTests");
+	}
+	
+	public WebFragmentProjectCreationOperationTest(String name) {
+		super(name);
+	}
+
+	public static Test suite() {
+		return new SimpleTestSuite(WebFragmentProjectCreationOperationTest.class);
+    }
+	
+	public void testWeb30_Defaults() throws Exception {
+		IDataModel dm = getWebFragmentDataModel("badWeb", null, null, JavaEEFacetConstants.WEBFRAGMENT_30, false);
+		OperationTestCase.runAndVerify(dm);
+	}
+
+	public void testWeb30_ChangedContentDir() throws Exception {
+		IDataModel dm = getWebFragmentDataModel("madWeb", "madContent", null, JavaEEFacetConstants.WEBFRAGMENT_30, false);
+		OperationTestCase.runAndVerify(dm);
+	}
+
+	public void testWeb30_ChangedJavaSrcDir() throws Exception {
+		IDataModel dm = getWebFragmentDataModel("booWeb", null, "booSrc", JavaEEFacetConstants.WEBFRAGMENT_30, false);
+		OperationTestCase.runAndVerify(dm);
+	}
+
+	public void testWeb30_ChangedContentDir_ChangedJavaSrcDir() throws Exception {
+		IDataModel dm = getWebFragmentDataModel("eeWeb", "contentEE", "srcTry", JavaEEFacetConstants.WEBFRAGMENT_30, false);
+		OperationTestCase.runAndVerify(dm);
+	}
+
+	public void testWeb30_Defaults_WithEAR() throws Exception {
+		IDataModel dm = getWebFragmentDataModel("badWeb", null, null, JavaEEFacetConstants.WEBFRAGMENT_30, false);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_ChangedContextRoot_WithEAR() throws Exception {
+		IDataModel dm = getWebFragmentDataModel("herWeb", null, null, JavaEEFacetConstants.WEBFRAGMENT_30, false);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_ChangedContentDir_WithEAR() throws Exception {
+		IDataModel dm = getWebFragmentDataModel("madWeb", "madContent", null, JavaEEFacetConstants.WEBFRAGMENT_30, false);
+		OperationTestCase.runAndVerify(dm);
+	}
+
+	public void testWeb30_ChangedJavaSrcDir_WithEAR() throws Exception {
+		IDataModel dm = getWebFragmentDataModel("booWeb", null, "booSrc", JavaEEFacetConstants.WEBFRAGMENT_30, false);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_ChangedContextRoot_ChangedContentDir_WithEAR() throws Exception {
+		IDataModel dm = getWebFragmentDataModel("pinkWeb", "pinkContent", null, JavaEEFacetConstants.WEBFRAGMENT_30, false);
+		OperationTestCase.runAndVerify(dm);
+	}
+
+	public void testWeb30_ChangedContextRoot_ChangedJavaSrcDir_WithEAR() throws Exception {
+		IDataModel dm = getWebFragmentDataModel("veryfarWeb", null, "verybadSrc", JavaEEFacetConstants.WEBFRAGMENT_30, false);
+		OperationTestCase.runAndVerify(dm);
+	}
+
+	public void testWeb30_ChangedContentDir_ChangedJavaSrcDir_WithEAR() throws Exception {
+		IDataModel dm = getWebFragmentDataModel("eeWeb", "contentEE", "srcTry", JavaEEFacetConstants.WEBFRAGMENT_30, false);
+		OperationTestCase.runAndVerify(dm);
+	}
+
+	public void testWeb30_ChangedContextRoot_ChangedContentDir_ChangedJavaSrcDir_WithEAR() throws Exception {
+		IDataModel dm = getWebFragmentDataModel("iiWeb", "iiContDir", "srgII", JavaEEFacetConstants.WEBFRAGMENT_30, false);
+		OperationTestCase.runAndVerify(dm);
+	}
+
+	public void testWeb30_Defaults_WithDD() throws Exception {
+		IDataModel dm = getWebFragmentDataModel("badWeb", null, null, JavaEEFacetConstants.WEBFRAGMENT_30, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_ChangedContextRoot_WithDD() throws Exception {
+		IDataModel dm = getWebFragmentDataModel("herWeb", null, null, JavaEEFacetConstants.WEBFRAGMENT_30, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_ChangedContentDir_WithDD() throws Exception {
+		IDataModel dm = getWebFragmentDataModel("madWeb", "madContent", null, JavaEEFacetConstants.WEBFRAGMENT_30, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_ChangedContextRoot_ChangedContentDir_WithDD() throws Exception {
+		IDataModel dm = getWebFragmentDataModel("pinkWeb", "tryContent", null, JavaEEFacetConstants.WEBFRAGMENT_30, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_ChangedContextRoot_ChangedJavaSrcDir_WithDD() throws Exception {
+		IDataModel dm = getWebFragmentDataModel("farawayWeb", null, "farSrc", JavaEEFacetConstants.WEBFRAGMENT_30, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_ChangedContentDir_ChangedJavaSrcDir_WithDD() throws Exception {
+		IDataModel dm = getWebFragmentDataModel("eeWeb", "contentE", "srcTry", JavaEEFacetConstants.WEBFRAGMENT_30, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_Defaults_WithEAR_WithDD() throws Exception {
+		IDataModel dm = getWebFragmentDataModel("badWeb", null, null, JavaEEFacetConstants.WEBFRAGMENT_30, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_ChangedContextRoot_WithEAR_WithDD() throws Exception {
+		IDataModel dm = getWebFragmentDataModel("herWeb", null, null, JavaEEFacetConstants.WEBFRAGMENT_30, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_ChangedContentDir_WithEAR_WithDD() throws Exception {
+		IDataModel dm = getWebFragmentDataModel("madWeb", "madContent", null, JavaEEFacetConstants.WEBFRAGMENT_30, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_ChangedJavaSrcDir_WithEAR_WithDD() throws Exception {
+		IDataModel dm = getWebFragmentDataModel("booWeb", null, "booSrc", JavaEEFacetConstants.WEBFRAGMENT_30, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_ChangedContextRoot_ChangedContentDir_WithEAR_WithDD() throws Exception {
+		IDataModel dm = getWebFragmentDataModel("pinkWeb", "pinkContent", null, JavaEEFacetConstants.WEBFRAGMENT_30, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_ChangedContextRoot_ChangedJavaSrcDir_WithEAR_WithDD() throws Exception {
+		IDataModel dm = getWebFragmentDataModel("veryfarWeb", null, "verybadSrc", JavaEEFacetConstants.WEBFRAGMENT_30, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_ChangedContentDir_ChangedJavaSrcDir_WithEAR_WithDD() throws Exception {
+		IDataModel dm = getWebFragmentDataModel("eeWeb", "contentEE", "srcTry", JavaEEFacetConstants.WEBFRAGMENT_30, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	public void testWeb30_ChangedContextRoot_ChangedContentDir_ChangedJavaSrcDir_WithEAR_WithDD() throws Exception {
+		IDataModel dm = getWebFragmentDataModel("iiWeb", "iiContDir", "srgII", JavaEEFacetConstants.WEBFRAGMENT_30, true);
+		OperationTestCase.runAndVerify(dm);
+	}
+	
+	
+    /**
+     * Creates and returns a Web Fragment Data Model with the given name and of the given version.
+     * Can also be used to specify none default context root, content directory, and/or
+     * the java source directory.
+     * If earName is not null then Web will be added to the EAR with earName, and if appropriate
+     * with or without a deployment descriptor.
+     * 
+     * @param projName name of the project to create
+     * @param contentDir the content directory to use for this project, use default if NULL
+     * @param javaSrcDir the java source directory to use for this project, use default if NULL
+     * @param version version of Web to use
+     * @param createDD - if true then create DD else don't
+     * @return a Web Fragment Data Model with the appropriate properties set
+     */
+    public static IDataModel getWebFragmentDataModel(String projName, String contentDir, String javaSrcDir, IProjectFacetVersion version, boolean createDD){
+    	IDataModel dm = DataModelFactory.createDataModel(new WebFragmentFacetInstallDataModelProvider());
+    	dm.setProperty(IFacetProjectCreationDataModelProperties.FACET_PROJECT_NAME, projName);
+    	dm.setProperty(IFacetDataModelProperties.FACET_VERSION, version);
+
+    	//if no contentDir provided use default
+    	if(contentDir != null) {
+    		dm.setStringProperty(IJ2EEModuleFacetInstallDataModelProperties.CONFIG_FOLDER, contentDir);
+    	}
+    	
+    	//if no javaSrcDir provided use default
+    	if(javaSrcDir != null) {
+    		dm.setStringProperty(IWebFacetInstallDataModelProperties.SOURCE_FOLDER, javaSrcDir);
+    	}
+    	
+    	dm.setBooleanProperty(IJ2EEFacetInstallDataModelProperties.GENERATE_DD, createDD);
+    	
+/* does the Java version get set correctly?
+    	if(version.equals(JavaEEFacetConstants.WEBFRAGMENT_30))    	{
+    		IDataModel javaFacetModel = facetMap.getFacetDataModel(IJ2EEFacetConstants.JAVA);
+	    	javaFacetModel.setProperty(IFacetDataModelProperties.FACET_VERSION, JavaEEFacetConstants.JAVA_6);
+    	}
+    	else{    		
+            IDataModel javaFacetModel = facetMap.getFacetDataModel(IJ2EEFacetConstants.JAVA);
+            javaFacetModel.setProperty(IFacetDataModelProperties.FACET_VERSION, JavaEEFacetConstants.JAVA_5);
+    	}
+*/
+    	
+    	return dm;
+    }
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/ejb/verifiers/EJBExportDataModelVerifier.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/ejb/verifiers/EJBExportDataModelVerifier.java
new file mode 100644
index 0000000..e0f70ca
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/ejb/verifiers/EJBExportDataModelVerifier.java
@@ -0,0 +1,29 @@
+/*
+ * Created on Jan 5, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package org.eclipse.wtp.j2ee.headless.tests.ejb.verifiers;
+
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.verifiers.ModuleExportDataModelVerifier;
+
+/**
+ * @author Administrator
+ *
+ * To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+public class EJBExportDataModelVerifier extends ModuleExportDataModelVerifier {
+	@Override
+	public void verify(IDataModel model) throws Exception {
+		super.verify(model);
+	}
+	
+	@Override
+	protected int getExportType() {
+		return J2EEVersionConstants.EJB_TYPE;
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/ejb/verifiers/EJBImportDataModelVerifier.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/ejb/verifiers/EJBImportDataModelVerifier.java
new file mode 100644
index 0000000..00adc8c
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/ejb/verifiers/EJBImportDataModelVerifier.java
@@ -0,0 +1,75 @@
+/*
+ * Created on Jan 5, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package org.eclipse.wtp.j2ee.headless.tests.ejb.verifiers;
+
+import java.util.Collection;
+
+import junit.framework.Assert;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.jee.archive.IArchive;
+import org.eclipse.jst.jee.archive.IArchiveResource;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.verifiers.ModuleImportDataModelVerifier;
+
+/**
+ * @author Administrator
+ * @author Ian Tewksbury (ictewksb@us.ibm.com)
+ *
+ * To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+public class EJBImportDataModelVerifier extends ModuleImportDataModelVerifier {
+	@Override
+	public void verify(IDataModel model) throws Exception {
+		super.verify(model);
+	}
+	
+	@Override
+	protected int getExportType() {
+		return J2EEVersionConstants.EJB_TYPE;
+	}
+	
+	@Override
+	protected void verifyImportedResources(
+			Collection<IArchiveResource> sourceResources,
+			Collection<IArchiveResource> importedClassesResources,
+			Collection<IArchiveResource> otherResources,
+			Collection<IArchive> nestedArchives,
+			IContainer rootFolder, IFolder importedClassesFolder) {
+		
+		IPath resourcePath = null;
+		IFile resourceFile = null;
+		
+		//verify all of the resources from the archive were imported to the project correctly
+		for(IArchiveResource sourceResource : sourceResources) {
+			resourcePath = sourceResource.getPath();
+			resourceFile = rootFolder.getFile(resourcePath);
+			Assert.assertTrue("The file " + resourcePath + " should exist in the project", resourceFile.exists());
+		}
+		
+		for(IArchiveResource importedClassResource : importedClassesResources) {
+			resourcePath = importedClassResource.getPath();
+			resourceFile = importedClassesFolder.getFile(resourcePath);
+			Assert.assertTrue("The imported class " + resourcePath + " should exist in the project", resourceFile.exists());
+		}
+		
+		for(IArchiveResource otherResource : otherResources) {
+			resourcePath = otherResource.getPath();
+			resourceFile = rootFolder.getFile(resourcePath);
+			Assert.assertTrue("The resource " + resourcePath + " should exist in the project", resourceFile.exists());
+		}
+	
+		for(IArchive nestedArchive : nestedArchives) {
+			
+		}
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/ejb/verifiers/EJBProjectCreationDataModelVerifier.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/ejb/verifiers/EJBProjectCreationDataModelVerifier.java
new file mode 100644
index 0000000..ab75c2e
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/ejb/verifiers/EJBProjectCreationDataModelVerifier.java
@@ -0,0 +1,119 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ * Created on Jan 5, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package org.eclipse.wtp.j2ee.headless.tests.ejb.verifiers;
+
+import junit.framework.Assert;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
+import org.eclipse.jst.j2ee.dependency.tests.util.DependencyVerificationUtil;
+import org.eclipse.jst.j2ee.ejb.project.operations.IEjbFacetInstallDataModelProperties;
+import org.eclipse.jst.j2ee.internal.J2EEConstants;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
+import org.eclipse.jst.j2ee.project.EarUtilities;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetProjectCreationDataModelProperties;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEModuleFacetInstallDataModelProperties;
+import org.eclipse.jst.javaee.ejb.EJBJar;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties.FacetDataModelMap;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.verifiers.ModuleProjectCreationDataModelVerifier;
+
+/**
+ * @author Administrator
+ * @author Ian Tewksbury (ictewksb@us.ibm.com)
+ * 
+ * To change the template for this generated type comment go to Window -
+ * Preferences - Java - Code Generation - Code and Comments
+ */
+public class EJBProjectCreationDataModelVerifier extends ModuleProjectCreationDataModelVerifier {
+	@Override
+	public void verify(IDataModel model) throws Exception {
+		super.verify(model);
+		
+		this.verifyClient();
+	}
+	
+	@Override
+	protected void setFacetProjectType() {
+		this.facetProjectType = J2EEProjectUtilities.EJB;
+	}
+	
+	@Override
+	protected IFile getDDFile() {
+		return component.getRootFolder().getFile(J2EEConstants.EJBJAR_DD_URI).getUnderlyingFile();
+	}
+	
+	@Override
+	protected void verifyDD(Object modelObj) {
+		String version = J2EEProjectUtilities.getJ2EEProjectVersion(project);
+		if(version.equals(J2EEVersionConstants.VERSION_3_0_TEXT) || version.equals(J2EEVersionConstants.VERSION_3_1_TEXT) ){
+			EJBJar ejb = (EJBJar)modelObj;
+			Assert.assertEquals("Invalid project version", version, ejb.getVersion());
+		} else {
+			org.eclipse.jst.j2ee.ejb.EJBJar ejb = (org.eclipse.jst.j2ee.ejb.EJBJar)modelObj;
+			Assert.assertEquals("Invalid project version", version, ejb.getVersion());
+		}
+	}
+	
+	private void verifyClient() throws Exception{
+		FacetDataModelMap facetMap = (FacetDataModelMap) model.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
+        IDataModel facetModel = facetMap.getFacetDataModel(facetProjectType);
+        boolean createClient = facetModel.getBooleanProperty(IEjbFacetInstallDataModelProperties.CREATE_CLIENT);
+        boolean addToEAR = model.getBooleanProperty(IJ2EEFacetProjectCreationDataModelProperties.ADD_TO_EAR);
+       
+        //can only have client if added to EAR
+        if(createClient && addToEAR) {
+        	//be sure the client project exists
+        	String clientName = facetModel.getStringProperty(IEjbFacetInstallDataModelProperties.CLIENT_NAME);
+    		IProject clientProject = ProjectUtilities.getProject(clientName);
+    		Assert.assertTrue("Client project should exist", clientProject.exists());
+    	
+			String earName = model.getStringProperty(IJ2EEFacetProjectCreationDataModelProperties.EAR_PROJECT_NAME);
+			
+			//be sure the created EAR has reference to the created EJB client
+			IProject ear = ProjectUtilities.getProject(earName);
+			boolean foundEARRefToClient = false;
+			IVirtualReference[] refs = EarUtilities.getUtilityModuleReferences(ComponentCore.createComponent(ear));
+			IVirtualComponent clientComp = ComponentCore.createComponent(clientProject);
+			for (int i = 0; i < refs.length; i++) {
+				IVirtualReference virtualReference = refs[i];
+				if (virtualReference.getReferencedComponent().equals(clientComp))
+					foundEARRefToClient = true;
+			}
+			Assert.assertTrue("The created EAR should have a reference to the created EJB client project", foundEARRefToClient);
+			
+			//be sure EJB has a MANIFEST entry to the EJB client
+			String ejbName = facetModel.getStringProperty(IEjbFacetInstallDataModelProperties.FACET_PROJECT_NAME);
+			String ejbClientURI = facetModel.getStringProperty(IEjbFacetInstallDataModelProperties.CLIENT_URI);
+			IProject ejbProject = ProjectUtilities.getProject(ejbName);
+			DependencyVerificationUtil.verifyManifestReference(ejbProject, ejbClientURI, true);   
+			
+			
+			//be sure the EJB client source folder was created
+			String clientSourceFolderPath = facetModel.getStringProperty(IJ2EEModuleFacetInstallDataModelProperties.CONFIG_FOLDER);
+			IFolder clientSourceFolder = clientProject.getFolder(clientSourceFolderPath);
+			Assert.assertTrue("Client source folder should exist", clientSourceFolder.exists());
+        }
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/DataModelVerifierListGenerator.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/DataModelVerifierListGenerator.java
new file mode 100644
index 0000000..a6012dc
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/DataModelVerifierListGenerator.java
@@ -0,0 +1,83 @@
+/**
+ * 
+ */
+package org.eclipse.wtp.j2ee.headless.tests.j2ee.verifiers;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.jst.j2ee.application.internal.operations.AppClientComponentExportDataModelProvider;
+import org.eclipse.jst.j2ee.application.internal.operations.EARComponentExportDataModelProvider;
+import org.eclipse.jst.j2ee.application.internal.operations.EARComponentImportDataModelProvider;
+import org.eclipse.jst.j2ee.application.internal.operations.J2EEUtilityJarImportDataModelProvider;
+import org.eclipse.jst.j2ee.applicationclient.internal.creation.AppClientComponentImportDataModelProvider;
+import org.eclipse.jst.j2ee.applicationclient.internal.creation.AppClientFacetProjectCreationDataModelProvider;
+import org.eclipse.jst.j2ee.internal.ejb.project.operations.EJBComponentExportDataModelProvider;
+import org.eclipse.jst.j2ee.internal.ejb.project.operations.EJBComponentImportDataModelProvider;
+import org.eclipse.jst.j2ee.internal.ejb.project.operations.EjbFacetProjectCreationDataModelProvider;
+import org.eclipse.jst.j2ee.internal.jca.operations.ConnectorComponentExportDataModelProvider;
+import org.eclipse.jst.j2ee.internal.jca.operations.ConnectorComponentImportDataModelProvider;
+import org.eclipse.jst.j2ee.internal.project.facet.EARFacetProjectCreationDataModelProvider;
+import org.eclipse.jst.j2ee.internal.web.archive.operations.WebComponentExportDataModelProvider;
+import org.eclipse.jst.j2ee.internal.web.archive.operations.WebComponentImportDataModelProvider;
+import org.eclipse.jst.j2ee.internal.web.archive.operations.WebFacetProjectCreationDataModelProvider;
+import org.eclipse.jst.j2ee.jca.project.facet.ConnectorFacetProjectCreationDataModelProvider;
+import org.eclipse.jst.j2ee.project.facet.UtilityProjectCreationDataModelProvider;
+import org.eclipse.wtp.j2ee.headless.tests.ejb.verifiers.EJBExportDataModelVerifier;
+import org.eclipse.wtp.j2ee.headless.tests.ejb.verifiers.EJBImportDataModelVerifier;
+import org.eclipse.wtp.j2ee.headless.tests.ejb.verifiers.EJBProjectCreationDataModelVerifier;
+import org.eclipse.wtp.j2ee.headless.tests.jca.verifiers.JCAExportDataModelVerifier;
+import org.eclipse.wtp.j2ee.headless.tests.jca.verifiers.JCAImportDataModelVerifier;
+import org.eclipse.wtp.j2ee.headless.tests.jca.verifiers.JCAProjectCreationDataModelVerifier;
+import org.eclipse.wtp.j2ee.headless.tests.utility.verifiers.UtilityImportDataModelVerifier;
+import org.eclipse.wtp.j2ee.headless.tests.utility.verifiers.UtilityProjectCreationDataModelVerifier;
+import org.eclipse.wtp.j2ee.headless.tests.web.verifiers.WebExportDataModelVerifier;
+import org.eclipse.wtp.j2ee.headless.tests.web.verifiers.WebImportDataModelVerifier;
+import org.eclipse.wtp.j2ee.headless.tests.web.verifiers.WebProjectCreationDataModelVerifier;
+import org.eclipse.wtp.j2ee.headless.tets.appclient.verifiers.AppClientExportDataModelVerifier;
+import org.eclipse.wtp.j2ee.headless.tets.appclient.verifiers.AppClientImportDataModelVerifier;
+import org.eclipse.wtp.j2ee.headless.tets.appclient.verifiers.AppClientProjectCreationDataModelVerifier;
+import org.eclipse.wtp.j2ee.headless.tets.ear.verifiers.EARExportDataModelVerifier;
+import org.eclipse.wtp.j2ee.headless.tets.ear.verifiers.EARImportDataModelVerifier;
+import org.eclipse.wtp.j2ee.headless.tets.ear.verifiers.EARProjectCreationDataModelVerifier;
+
+
+/**
+ * @author Ian Tewksbury (ictewksb@us.ibm.com)
+ *
+ */
+public class DataModelVerifierListGenerator {
+	private static Map verifiers;
+	
+	public static Map getVerifiers() {
+		if(verifiers == null || verifiers.isEmpty()) {
+			verifiers = new HashMap();
+			
+			verifiers.put(AppClientFacetProjectCreationDataModelProvider.class.getName(), AppClientProjectCreationDataModelVerifier.class);
+			verifiers.put(AppClientComponentImportDataModelProvider.class.getName(), AppClientImportDataModelVerifier.class);
+			verifiers.put(AppClientComponentExportDataModelProvider.class.getName(),AppClientExportDataModelVerifier.class);
+			
+			verifiers.put(EjbFacetProjectCreationDataModelProvider.class.getName(), EJBProjectCreationDataModelVerifier.class);
+			verifiers.put(EJBComponentImportDataModelProvider.class.getName(), EJBImportDataModelVerifier.class);
+			verifiers.put(EJBComponentExportDataModelProvider.class.getName(), EJBExportDataModelVerifier.class);
+			
+			verifiers.put(WebFacetProjectCreationDataModelProvider.class.getName(), WebProjectCreationDataModelVerifier.class);
+			verifiers.put(WebComponentImportDataModelProvider.class.getName(), WebImportDataModelVerifier.class);
+			verifiers.put(WebComponentExportDataModelProvider.class.getName(), WebExportDataModelVerifier.class);
+			
+			verifiers.put(ConnectorFacetProjectCreationDataModelProvider.class.getName(), JCAProjectCreationDataModelVerifier.class);
+			verifiers.put(ConnectorComponentImportDataModelProvider.class.getName(), JCAImportDataModelVerifier.class);
+			verifiers.put(ConnectorComponentExportDataModelProvider.class.getName(), JCAExportDataModelVerifier.class);
+			
+			verifiers.put(UtilityProjectCreationDataModelProvider.class.getName(), UtilityProjectCreationDataModelVerifier.class);
+//			verifiers.put(J2EEUtilityJarImportDataModelProvider.class.getName(), UtilityImportDataModelVerifier.class);
+			verifiers.put((new J2EEUtilityJarImportDataModelProvider()).getID(), UtilityImportDataModelVerifier.class);
+			
+			verifiers.put(EARFacetProjectCreationDataModelProvider.class.getName(), EARProjectCreationDataModelVerifier.class);
+			verifiers.put(EARComponentImportDataModelProvider.class.getName(), EARImportDataModelVerifier.class);
+			verifiers.put(EARComponentExportDataModelProvider.class.getName(), EARExportDataModelVerifier.class);
+		}
+		
+		return verifiers;
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/JEEExportDataModelVerifier.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/JEEExportDataModelVerifier.java
new file mode 100644
index 0000000..4cfbff5
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/JEEExportDataModelVerifier.java
@@ -0,0 +1,129 @@
+/*
+ * Created on Jan 5, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package org.eclipse.wtp.j2ee.headless.tests.j2ee.verifiers;
+
+import java.io.File;
+
+import junit.framework.Assert;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
+import org.eclipse.jst.j2ee.datamodel.properties.IJ2EEComponentExportDataModelProperties;
+import org.eclipse.jst.j2ee.internal.J2EEConstants;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.j2ee.internal.archive.JavaEEArchiveUtilities;
+import org.eclipse.jst.j2ee.internal.common.J2EEVersionUtil;
+import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
+import org.eclipse.jst.jee.archive.IArchive;
+import org.eclipse.jst.jee.util.internal.JavaEEQuickPeek;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.tests.AssertWarn;
+import org.eclipse.wst.common.tests.DataModelVerifier;
+
+/**
+ * @author Administrator
+ * @author Ian Tewksbury (ictewksb@us.ibm.com)
+ *
+ * To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+public abstract class JEEExportDataModelVerifier extends DataModelVerifier {
+	protected IDataModel model = null;
+	
+	@Override
+	public void verify(IDataModel model) throws Exception {
+		super.verify(model);
+		
+		this.model = model;
+		
+		this.verifyArchiveExists();
+		this.verifyArchiveTypeAndVersion();
+	}
+	
+	protected abstract int getExportType();
+	
+	private void verifyArchiveExists() {
+		String archivePath = model.getStringProperty(IJ2EEComponentExportDataModelProperties.ARCHIVE_DESTINATION);
+		File archive = new File(archivePath);
+		Assert.assertTrue("The exported archive must exist.", archive.exists());
+	}
+	
+	public static boolean isEE5WithoutDD(IProject project) throws Exception{
+		String sProjVersion = J2EEProjectUtilities.getJ2EEProjectVersion(project);
+		int iProjVersion = J2EEVersionUtil.convertVersionStringToInt(sProjVersion);
+		IArchive projectArchive = null;
+		try {
+			projectArchive = JavaEEArchiveUtilities.INSTANCE.openArchive(ComponentCore.createComponent(project));
+			JavaEEQuickPeek archiveQuickPeek = JavaEEArchiveUtilities.INSTANCE.getJavaEEQuickPeek(projectArchive);
+			if(archiveQuickPeek.getJavaEEVersion() == J2EEVersionConstants.JEE_5_0_ID){
+				boolean hasDD = false;
+				switch(archiveQuickPeek.getType()){
+				case J2EEVersionConstants.APPLICATION_CLIENT_TYPE:
+					hasDD = projectArchive.containsArchiveResource(new Path(J2EEConstants.APP_CLIENT_DD_URI));
+					break;
+				case J2EEVersionConstants.APPLICATION_TYPE:
+					hasDD = projectArchive.containsArchiveResource(new Path(J2EEConstants.APPLICATION_DD_URI));
+					break;
+				case J2EEVersionConstants.EJB_TYPE:
+					hasDD = projectArchive.containsArchiveResource(new Path(J2EEConstants.EJBJAR_DD_URI));
+					break;
+				case J2EEVersionConstants.WEB_TYPE:
+					hasDD = projectArchive.containsArchiveResource(new Path(J2EEConstants.WEBAPP_DD_URI));
+					break;
+				}
+				if(!hasDD){
+					System.err.println("TODO -- NO DD import support needs to be implemented.");
+					System.err.println("     -- see https://bugs.eclipse.org/bugs/show_bug.cgi?id=194679");
+					return true;
+				}
+			}
+		} finally {
+			if (null != projectArchive) {
+				JavaEEArchiveUtilities.INSTANCE.closeArchive(projectArchive);
+			}
+		}
+		return false;
+	}
+	
+	private void verifyArchiveTypeAndVersion() throws Exception {
+		String projName = model.getStringProperty(IJ2EEComponentExportDataModelProperties.PROJECT_NAME);
+		IProject exportedProj = ProjectUtilities.getProject(projName);
+		
+		IArchive projectArchive = null;
+		try {
+			projectArchive = JavaEEArchiveUtilities.INSTANCE.openArchive(ComponentCore.createComponent(exportedProj));
+			JavaEEQuickPeek archiveQuickPeek = JavaEEArchiveUtilities.INSTANCE.getJavaEEQuickPeek(projectArchive);
+			int type = archiveQuickPeek.getType();
+			AssertWarn.warnEquals("Archive type did not match exported type", getExportType(), type);
+		} finally {
+			if (null != projectArchive) {
+				JavaEEArchiveUtilities.INSTANCE.closeArchive(projectArchive);
+			}
+		}
+		
+		String archivePath = model.getStringProperty(IJ2EEComponentExportDataModelProperties.ARCHIVE_DESTINATION);
+		IArchive zipArchive = null;
+		
+		try {
+			zipArchive = JavaEEArchiveUtilities.INSTANCE.openArchive(new Path(archivePath));
+			
+			JavaEEQuickPeek archiveQuickPeek = JavaEEArchiveUtilities.INSTANCE.getJavaEEQuickPeek(zipArchive);
+			int type = archiveQuickPeek.getType();
+			AssertWarn.warnEquals("Archive type did not match exported type", getExportType(), type);
+			int iVersionConstant = archiveQuickPeek.getVersion();
+			String sProjVersion = J2EEProjectUtilities.getJ2EEDDProjectVersion(exportedProj);
+			int iProjVersion = J2EEVersionUtil.convertVersionStringToInt(sProjVersion);
+			AssertWarn.warnEquals("Archive version did not match exported project version", iProjVersion, iVersionConstant);
+		} finally {
+			if (null != zipArchive) {
+				JavaEEArchiveUtilities.INSTANCE.closeArchive(zipArchive);
+			}
+		}
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/JEEImportDataModelVerifier.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/JEEImportDataModelVerifier.java
new file mode 100644
index 0000000..c31b794
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/JEEImportDataModelVerifier.java
@@ -0,0 +1,215 @@
+/*
+ * Created on Jan 5, 2004
+ * 
+ * To change the template for this generated file go to Window - Preferences - Java - Code
+ * Generation - Code and Comments
+ */
+package org.eclipse.wtp.j2ee.headless.tests.j2ee.verifiers;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.StringTokenizer;
+
+import junit.framework.Assert;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jst.j2ee.datamodel.properties.IJ2EEModuleImportDataModelProperties;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.j2ee.internal.archive.JavaEEArchiveUtilities;
+import org.eclipse.jst.j2ee.internal.common.J2EEVersionUtil;
+import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
+import org.eclipse.jst.j2ee.project.JavaEEProjectUtilities;
+import org.eclipse.jst.jee.archive.IArchive;
+import org.eclipse.jst.jee.archive.IArchiveResource;
+import org.eclipse.jst.jee.util.internal.JavaEEQuickPeek;
+import org.eclipse.wst.common.componentcore.internal.util.ComponentUtilities;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.tests.AssertWarn;
+import org.eclipse.wst.common.tests.DataModelVerifier;
+import org.eclipse.wst.common.tests.ProjectUtility;
+
+/**
+ * @author Administrator
+ * @author Ian Tewksbury (ictewksb@us.ibm.com)
+ * 
+ * To change the template for this generated type comment go to Window - Preferences - Java - Code
+ * Generation - Code and Comments
+ */
+public abstract class JEEImportDataModelVerifier extends DataModelVerifier {
+	private static final String CLASS_EXTENSION = "class";
+	private static final String JAVA_EXTENSION = "java";
+	private static final String JAR_EXTENSION = "jar";
+	private static final String RAR_EXTENSION = "rar";
+	private static final String WAR_EXTENSION = "war";
+	
+	protected IDataModel model;
+	protected IProject project;
+
+	@Override
+	public void verify(IDataModel model) throws Exception {
+		super.verify(model);
+
+		this.model = model;
+		String projectName = model.getStringProperty(IJ2EEModuleImportDataModelProperties.PROJECT_NAME);
+		project = ProjectUtility.getProject(projectName);
+
+		this.verifyProjectCreated();
+
+		String archivePath = model.getStringProperty(IJ2EEModuleImportDataModelProperties.FILE_NAME);
+		
+		IArchive archive = null;
+		try {
+			archive = JavaEEArchiveUtilities.INSTANCE.openArchive(new Path(archivePath));
+
+			this.verifyImportedProjectTypeAndVersion(archive);
+			this.verifyAllFilesImported(archive);
+			
+		} finally {
+			if (null != archive && archive.isOpen()) {
+				JavaEEArchiveUtilities.INSTANCE.closeArchive(archive);
+			}
+		}
+	}
+	
+	/**
+	 * used for verifying imported archives that are nested inside of other archives
+	 * 
+	 * @param nestedArchiveImportModel
+	 * @param importedNestedArchive
+	 */
+	public void verify(IDataModel nestedArchiveImportModel, IArchive importedNestedArchive) throws Exception {
+		this.model = nestedArchiveImportModel;
+		String projectName = model.getStringProperty(IJ2EEModuleImportDataModelProperties.PROJECT_NAME);
+		project = ProjectUtility.getProject(projectName);
+
+		this.verifyProjectCreated();
+		
+		this.verifyImportedProjectTypeAndVersion(importedNestedArchive);
+		this.verifyAllFilesImported(importedNestedArchive);
+	}
+
+	protected abstract int getExportType();
+
+	private void verifyImportedProjectTypeAndVersion(IArchive archive) throws Exception {
+		if(JavaEEProjectUtilities.isUtilityProject(project)){
+			JavaEEQuickPeek archiveQuickPeek = JavaEEArchiveUtilities.INSTANCE.getJavaEEQuickPeek(archive);
+			int type = archiveQuickPeek.getType();
+			if(JavaEEQuickPeek.UNKNOWN != type){
+				AssertWarn.warnEquals("Archive is not a utility, but was imported as such, archive="+archive, getExportType(), type);
+			}
+		} else {
+			JavaEEQuickPeek archiveQuickPeek = JavaEEArchiveUtilities.INSTANCE.getJavaEEQuickPeek(archive);
+			int type = archiveQuickPeek.getType();
+			
+			if(getExportType() != type){
+				AssertWarn.warnEquals("Archive type did not match imported project type, archive="+archive, getExportType(), type);
+			}
+	
+			String sProjVersion = J2EEProjectUtilities.getJ2EEDDProjectVersion(project);
+			int iProjVersion = J2EEVersionUtil.convertVersionStringToInt(sProjVersion);
+			int iVersionConstant = archiveQuickPeek.getVersion();
+			if(iProjVersion != iVersionConstant){
+				AssertWarn.warnEquals("Archive version did not match imported project version, archive="+archive, iProjVersion, iVersionConstant);
+			}
+		}
+	}
+
+	private void verifyProjectCreated() {
+		Assert.assertTrue("A project with name, " + project.getName() + ", should have been created by import", project.exists());
+	}
+
+	
+	protected boolean isClassWithoutSource(IArchive archive, IArchiveResource aFile) {
+		String javaUri = classUriToJavaUri(aFile.getPath().toString());
+		if (javaUri == null)
+			return false;
+		return !archive.containsArchiveResource(new Path(javaUri));
+	}
+
+	protected final String DOT_CLASS = ".class"; //$NON-NLS-1$
+
+	protected final String DOT_JAVA = ".java"; //$NON-NLS-1$
+	
+	public String classUriToJavaUri(String classUri) {
+		if (classUri == null || !classUri.endsWith(DOT_CLASS))
+			return null;
+
+		String truncated = truncateIgnoreCase(classUri, DOT_CLASS);
+		StringTokenizer tok = new StringTokenizer(truncated, "$"); //$NON-NLS-1$
+		return tok.nextToken().concat(DOT_JAVA);
+	}
+	
+	/**
+	 * Return a substring of the first parameter, up to the last index of the
+	 * second
+	 */
+	public static String truncateIgnoreCase(String aString, String trailingSubString) {
+		int index = aString.toLowerCase().lastIndexOf(trailingSubString.toLowerCase());
+		if (index != -1)
+			return aString.substring(0, index);
+		return aString;
+	}
+	private void verifyAllFilesImported(IArchive archive) throws Exception {
+		List<IArchiveResource> resources = archive.getArchiveResources();
+		IPath resourcePath = null;
+		IFolder importedClassesFolder = project.getFolder("ImportedClasses");
+
+		IVirtualComponent projectComponent = ComponentUtilities.getComponent(project.getName());
+		IVirtualFolder rootVirtFolder = projectComponent.getRootFolder();
+		IContainer rootFolder = rootVirtFolder.getUnderlyingFolder();
+		Assert.assertTrue("The root folder " + rootFolder.getName() + " should exist in the project" , rootFolder.exists());
+		
+		// when the for loops is done the classes will contain only those classes that were imported,
+		// the sourceResources list will contain a list of all of the java source resources,
+		// the otherResources list will contain all other resources that are not nested archives,
+		// and any nested archive in this archive will have been set as a nested archive in 'archive'
+		List<IArchiveResource> classes = new ArrayList<IArchiveResource>();
+		List<IArchiveResource> sourceResources = new ArrayList<IArchiveResource>();
+		List<IArchiveResource> otherResources = new ArrayList<IArchiveResource>();
+		
+		String extension = null;
+		for(IArchiveResource resource : resources) {
+			resourcePath = resource.getPath();
+
+			switch (resource.getType()) {
+				case IArchiveResource.FILE_TYPE :
+					extension = resourcePath.getFileExtension();
+					
+					// Note: For war archive, the class must be in WEB-INF/classes, otherwise it's just content
+					if(extension.equals(CLASS_EXTENSION) &&
+							((getExportType() == J2EEVersionConstants.WEB_TYPE) ? (resourcePath.segmentCount() > 2 && resourcePath.segment(0).equals("WEB-INF") && resourcePath.segment(1).equals("classes")) : true)){
+						if(isClassWithoutSource(archive, resource)){
+							classes.add(resource);
+						}
+					} else if(extension.equals(JAVA_EXTENSION)){
+						sourceResources.add(resource);
+					} else if(extension.equals(JAR_EXTENSION) || extension.equals(RAR_EXTENSION) || extension.equals(WAR_EXTENSION)) {
+						archive.getNestedArchive(resource);
+					} else {
+						otherResources.add(resource);
+					}
+					
+					break;
+				case IArchiveResource.DIRECTORY_TYPE :
+	
+					break;
+				case IArchiveResource.ARCHIVE_TYPE :
+	
+					break;
+			}
+		}
+		
+		List<IArchive> nestedArchives = archive.getNestedArchives();
+		
+		verifyImportedResources(sourceResources, classes, otherResources, nestedArchives, rootFolder, importedClassesFolder);
+	}
+	
+	protected abstract void verifyImportedResources(Collection<IArchiveResource> sourceResources, Collection<IArchiveResource> importedClassesResources, Collection<IArchiveResource> otherResources, Collection<IArchive> nestedArchives, IContainer rootFolder, IFolder importedClassesFolder) throws Exception;
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/JEEProjectCreationDataModelVerifier.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/JEEProjectCreationDataModelVerifier.java
new file mode 100644
index 0000000..c0fa1b8
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/JEEProjectCreationDataModelVerifier.java
@@ -0,0 +1,119 @@
+/*
+ * Created on Jan 5, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package org.eclipse.wtp.j2ee.headless.tests.j2ee.verifiers;
+
+import junit.framework.Assert;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
+import org.eclipse.jst.j2ee.internal.archive.JavaEEArchiveUtilities;
+import org.eclipse.jst.j2ee.model.IModelProvider;
+import org.eclipse.jst.j2ee.model.ModelProviderManager;
+import org.eclipse.jst.jee.archive.IArchive;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties.FacetDataModelMap;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.project.facet.core.IFacetedProject;
+import org.eclipse.wst.common.project.facet.core.IProjectFacet;
+import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
+import org.eclipse.wst.common.project.facet.core.internal.ProjectFacetVersion;
+import org.eclipse.wst.common.tests.DataModelVerifier;
+
+/**
+ * @author Administrator
+ * @author Ian Tewksbury (ictewksb@us.ibm.com)
+ *
+ * To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+public abstract class JEEProjectCreationDataModelVerifier extends DataModelVerifier {
+	protected IDataModel model = null;
+	protected IProject project = null;
+	protected IVirtualComponent component = null;
+	protected String facetProjectType = null;
+	
+	//need this because Utility Projects don't have ModelProviders
+	protected boolean hasModelProvider = true;
+	
+	public void verify(IDataModel model) throws Exception {
+		super.verify(model);
+		
+		this.model = model;
+		this.setFacetProjectType();
+		
+		String projName = model.getStringProperty(IFacetProjectCreationDataModelProperties.FACET_PROJECT_NAME);
+		project = ProjectUtilities.getProject(projName);
+		this.verifyProject();
+		
+		component = ComponentCore.createComponent(project);
+		this.verifyComponent();
+		
+		this.verifyProjectVersion();
+		
+		if(hasModelProvider) {
+			this.verifyModelProvider();
+		}
+	}
+	
+	protected abstract void setFacetProjectType();
+	
+	protected abstract IFile getDDFile();
+	
+	protected abstract void verifyDD(Object modelObj);
+	
+	private void verifyProject(){
+		Assert.assertTrue("The project should exist", project.exists());
+	}
+	
+	private void verifyComponent() {
+		Assert.assertNotNull("Component should not be null", component);
+		Assert.assertTrue("Component should exist", component.exists());
+	}
+	
+	private void verifyProjectVersion() throws Exception{
+		FacetDataModelMap facetMap = (FacetDataModelMap) model.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
+        IDataModel facetModel = facetMap.getFacetDataModel(facetProjectType);
+        ProjectFacetVersion version = (ProjectFacetVersion)facetModel.getProperty(IFacetDataModelProperties.FACET_VERSION);
+        
+        IProjectFacet projFact = version.getProjectFacet();
+        String projFactID = projFact.getId();
+        boolean verifyVersion = ProjectFacetsManager.isProjectFacetDefined(projFactID);
+        Assert.assertTrue("Project facet: "+projFactID+" should be defined", verifyVersion);
+        
+        IFacetedProject facetedProject =  ProjectFacetsManager.create(project);
+        Assert.assertTrue("Project fact version: "+version+"should be defined", facetedProject.getProjectFacets().contains(version));
+	}
+	
+	
+	protected void verifyModelProvider() throws Exception {
+		IModelProvider provider = ModelProviderManager.getModelProvider(project);
+		Object modelObj = provider.getModelObject();
+		Assert.assertNotNull("Project Deployment Descriptor should not be null", modelObj);
+		this.verifyDD(modelObj);
+		IArchive archive = null;
+        try{
+        	archive = JavaEEArchiveUtilities.INSTANCE.openArchive(component);
+        	if(archive.containsModelObject()){
+	        	Object modelObj2 = archive.getModelObject();
+	        	Assert.assertNotNull("Archive Deployment Descriptor should not be null", modelObj2);
+	    		if(modelObj != modelObj2){
+	            	System.err.println("TODO -- Project and IArchive Deployment Descriptor should be equal");
+	            	System.err.println("     -- see https://bugs.eclipse.org/bugs/show_bug.cgi?id=195670");
+	            	//AssertWarn.warnTrue("Project and IArchive Deployment Descriptor should be equal", modelObj == modelObj2);
+	            }
+        	}
+        } finally {
+        	if(archive != null){
+        		JavaEEArchiveUtilities.INSTANCE.closeArchive(archive);
+        	}
+        }
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/ModuleExportDataModelVerifier.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/ModuleExportDataModelVerifier.java
new file mode 100644
index 0000000..560483c
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/ModuleExportDataModelVerifier.java
@@ -0,0 +1,54 @@
+/*
+ * Created on Jan 5, 2004
+ * 
+ * To change the template for this generated file go to Window - Preferences - Java - Code
+ * Generation - Code and Comments
+ */
+package org.eclipse.wtp.j2ee.headless.tests.j2ee.verifiers;
+
+import java.io.FileInputStream;
+import java.util.jar.JarInputStream;
+import java.util.jar.Manifest;
+
+import junit.framework.Assert;
+
+import org.eclipse.jst.j2ee.datamodel.properties.IJ2EEComponentExportDataModelProperties;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+/**
+ * @author mdelder
+ * @author Ian Tewksbury (ictewksb@us.ibm.com)
+ */
+public abstract class ModuleExportDataModelVerifier extends JEEExportDataModelVerifier {
+	@Override
+	public void verify(IDataModel model) throws Exception {
+		super.verify(model);
+	
+		if(checkManifest()){
+			/**
+			 * The manifest must be the first file in the archive.
+			 */
+			String archivePath = model.getStringProperty(IJ2EEComponentExportDataModelProperties.ARCHIVE_DESTINATION);
+			
+			FileInputStream fIn = null;
+			Manifest mf = null;
+			try {
+				fIn = new FileInputStream(archivePath);
+				JarInputStream jarIn = new JarInputStream(fIn);
+				mf = jarIn.getManifest();
+				
+			} finally{
+				if(fIn != null){
+					fIn.close();
+				}
+			}
+			if(null == mf){
+				Assert.assertNotNull(mf);
+			}
+		}
+	}
+
+	protected boolean checkManifest() {
+		return true;
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/ModuleImportDataModelVerifier.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/ModuleImportDataModelVerifier.java
new file mode 100644
index 0000000..cd4bab0
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/ModuleImportDataModelVerifier.java
@@ -0,0 +1,23 @@
+/*
+ * Created on Jan 5, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package org.eclipse.wtp.j2ee.headless.tests.j2ee.verifiers;
+
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+/**
+ * @author Administrator
+ * @author Ian Tewksbury (ictewksb@us.ibm.com)
+ *
+ * To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+public abstract class ModuleImportDataModelVerifier extends JEEImportDataModelVerifier {
+	@Override
+	public void verify(IDataModel model) throws Exception {
+		super.verify(model);
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/ModuleProjectCreationDataModelVerifier.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/ModuleProjectCreationDataModelVerifier.java
new file mode 100644
index 0000000..2c72b80
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/ModuleProjectCreationDataModelVerifier.java
@@ -0,0 +1,47 @@
+/*
+ * Created on Jan 5, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package org.eclipse.wtp.j2ee.headless.tests.j2ee.verifiers;
+
+import junit.framework.Assert;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetProjectCreationDataModelProperties;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+/**
+ * @author Administrator
+ *
+ * To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+public abstract class ModuleProjectCreationDataModelVerifier extends JEEProjectCreationDataModelVerifier {
+    /* (non-Javadoc)
+     * @see org.eclipse.wtp.j2ee.headless.tests.j2ee.verifiers.J2EEProjectCreationDataModelVerifier#verify(org.eclipse.wtp.common.operation.WTPOperationDataModel)
+     */
+    public void verify(IDataModel model) throws Exception {
+        super.verify(model);
+        
+        this.verifyProjectAddToEAR();
+    }
+
+    private void verifyProjectAddToEAR() throws Exception{
+		boolean addToEAR = model.getBooleanProperty(IJ2EEFacetProjectCreationDataModelProperties.ADD_TO_EAR);
+		if(addToEAR) {
+			String earName = model.getStringProperty(IJ2EEFacetProjectCreationDataModelProperties.EAR_PROJECT_NAME);
+			IProject ear = ProjectUtilities.getProject(earName);
+			Assert.assertTrue("The EAR should exist", ear.exists());
+		
+			IProject[] referencedProjs = ear.getReferencedProjects();
+			boolean foundRef = false;
+			for(int i = 0; i < referencedProjs.length && !foundRef; i++) {
+				foundRef = referencedProjs[i].getName().equals(project.getName());
+			}
+			Assert.assertTrue("EAR did not have a reference to the project", foundRef);			
+		}
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/jca/verifiers/JCAExportDataModelVerifier.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/jca/verifiers/JCAExportDataModelVerifier.java
new file mode 100644
index 0000000..d0662af
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/jca/verifiers/JCAExportDataModelVerifier.java
@@ -0,0 +1,30 @@
+/*
+ * Created on Jan 5, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package org.eclipse.wtp.j2ee.headless.tests.jca.verifiers;
+
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.verifiers.ModuleExportDataModelVerifier;
+
+/**
+ * @author Administrator
+ * @author Ian Tewksbury (ictewksb@us.ibm.com)
+ *
+ * To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+public class JCAExportDataModelVerifier extends ModuleExportDataModelVerifier {
+	@Override
+	public void verify(IDataModel model) throws Exception {
+		super.verify(model);
+	}
+	
+	@Override
+	protected int getExportType() {
+		return J2EEVersionConstants.CONNECTOR_TYPE;
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/jca/verifiers/JCAImportDataModelVerifier.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/jca/verifiers/JCAImportDataModelVerifier.java
new file mode 100644
index 0000000..f6f9625
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/jca/verifiers/JCAImportDataModelVerifier.java
@@ -0,0 +1,75 @@
+/*
+ * Created on Jan 5, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package org.eclipse.wtp.j2ee.headless.tests.jca.verifiers;
+
+import java.util.Collection;
+
+import junit.framework.Assert;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.jee.archive.IArchive;
+import org.eclipse.jst.jee.archive.IArchiveResource;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.verifiers.ModuleImportDataModelVerifier;
+
+/**
+ * @author Administrator
+ * @author Ian Tewksbury (ictewksb@us.ibm.com)
+ *
+ * To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+public class JCAImportDataModelVerifier extends ModuleImportDataModelVerifier {
+	@Override
+	public void verify(IDataModel model) throws Exception {
+		super.verify(model);
+	}
+	
+	@Override
+	protected int getExportType() {
+		return J2EEVersionConstants.CONNECTOR_TYPE;
+	}
+	
+	@Override
+	protected void verifyImportedResources(
+			Collection<IArchiveResource> sourceResources,
+			Collection<IArchiveResource> importedClassesResources,
+			Collection<IArchiveResource> otherResources,
+			Collection<IArchive> nestedArchives,
+			IContainer rootFolder, IFolder importedClassesFolder) {
+		
+		IPath resourcePath = null;
+		IFile resourceFile = null;
+		
+		//verify all of the resources from the archive were imported to the project correctly
+		for(IArchiveResource sourceResource : sourceResources) {
+			resourcePath = sourceResource.getPath();
+			resourceFile = rootFolder.getFile(resourcePath);
+			Assert.assertTrue("The file " + resourcePath + " should exist in the project", resourceFile.exists());
+		}
+		
+		for(IArchiveResource importedClassResource : importedClassesResources) {
+			resourcePath = importedClassResource.getPath();
+			resourceFile = importedClassesFolder.getFile(resourcePath);
+			Assert.assertTrue("The imported class " + resourcePath + " should exist in the project", resourceFile.exists());
+		}
+		
+		for(IArchiveResource otherResource : otherResources) {
+			resourcePath = otherResource.getPath();
+			resourceFile = rootFolder.getFile(resourcePath);
+			Assert.assertTrue("The resource " + resourcePath + " should exist in the project", resourceFile.exists());
+		}
+	
+		for(IArchive nestedArchive : nestedArchives) {
+			
+		}
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/jca/verifiers/JCAProjectCreationDataModelVerifier.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/jca/verifiers/JCAProjectCreationDataModelVerifier.java
new file mode 100644
index 0000000..613c941
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/jca/verifiers/JCAProjectCreationDataModelVerifier.java
@@ -0,0 +1,78 @@
+/*
+ * Created on Jan 5, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package org.eclipse.wtp.j2ee.headless.tests.jca.verifiers;
+
+import junit.framework.Assert;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jst.j2ee.internal.J2EEConstants;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
+import org.eclipse.jst.j2ee.jca.Connector;
+import org.eclipse.jst.j2ee.jca.project.facet.IConnectorFacetInstallDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties.FacetDataModelMap;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.verifiers.ModuleProjectCreationDataModelVerifier;
+
+/**
+ * @author Administrator
+ * @author Ian Tewksbury (ictewksb@us.ibm.com)
+ *
+ * To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+public class JCAProjectCreationDataModelVerifier extends ModuleProjectCreationDataModelVerifier {
+	@Override
+	public void verify(IDataModel model) throws Exception {
+		super.verify(model);
+		
+		this.verifySourceFolder();
+	}
+	
+	@Override
+	protected void setFacetProjectType() {
+		this.facetProjectType = J2EEProjectUtilities.JCA;
+	}
+	
+	@Override
+	protected IFile getDDFile() {
+		return component.getRootFolder().getFile(J2EEConstants.RAR_DD_URI).getUnderlyingFile();
+	}
+	
+	@Override
+	protected void verifyDD(Object modelObj) {
+		String projectVersion = J2EEProjectUtilities.getJ2EEProjectVersion(project);
+		String modelVersion = null;
+		if (J2EEVersionConstants.VERSION_1_6_TEXT.equals(projectVersion))
+		{
+			org.eclipse.jst.javaee.jca.Connector connector = (org.eclipse.jst.javaee.jca.Connector)modelObj;
+			modelVersion = connector.getVersion(); 
+		}
+		else
+		{
+			Connector connector = (Connector)modelObj;
+			modelVersion = connector.getVersion();
+		}
+		if(projectVersion == null || !projectVersion.equals(modelVersion)){
+			//TODO see https://bugs.eclipse.org/bugs/show_bug.cgi?id=197014
+			System.err.println("TODO -- connector version incorrect.");
+			System.err.println("     -- see https://bugs.eclipse.org/bugs/show_bug.cgi?id=197014");
+			//AssertWarn.warnEquals("Invalid project version", projectVersion, modelVersion);
+		}
+	}
+	
+    private void verifySourceFolder() {
+    	FacetDataModelMap facetMap = (FacetDataModelMap) model.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
+    	IDataModel facetModel = facetMap.getFacetDataModel(J2EEProjectUtilities.JCA);
+		String sourceFolder = facetModel.getStringProperty(IConnectorFacetInstallDataModelProperties.CONFIG_FOLDER);
+		IPath sourceFolderPath = new Path(sourceFolder);
+		Assert.assertTrue("Source directory should exist", project.exists(sourceFolderPath));
+    }
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/utility/verifiers/UtilityImportDataModelVerifier.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/utility/verifiers/UtilityImportDataModelVerifier.java
new file mode 100644
index 0000000..59b314d
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/utility/verifiers/UtilityImportDataModelVerifier.java
@@ -0,0 +1,87 @@
+/**
+ * 
+ */
+package org.eclipse.wtp.j2ee.headless.tests.utility.verifiers;
+
+import java.util.Collection;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.jee.archive.IArchive;
+import org.eclipse.jst.jee.archive.IArchiveResource;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.tests.AssertWarn;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.verifiers.ModuleImportDataModelVerifier;
+
+/**
+ * @author itewk
+ *
+ */
+public class UtilityImportDataModelVerifier extends ModuleImportDataModelVerifier {
+	@Override
+	public void verify(IDataModel model) throws Exception {
+		//super.verify(model);
+	}
+	
+	@Override
+	public void verify(IDataModel nestedArchiveImportModel,
+			IArchive importedNestedArchive) throws Exception {
+		
+		super.verify(nestedArchiveImportModel, importedNestedArchive);
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.wtp.j2ee.headless.tests.j2ee.verifiers.JEEImportDataModelVerifier#getExportType()
+	 */
+	@Override
+	protected int getExportType() {
+		return J2EEVersionConstants.UNKNOWN;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.wtp.j2ee.headless.tests.j2ee.verifiers.JEEImportDataModelVerifier#verifyImportedResources(java.util.Collection, java.util.Collection, java.util.Collection, java.util.Collection, org.eclipse.core.resources.IFolder, org.eclipse.core.resources.IFolder)
+	 */
+	@Override
+	protected void verifyImportedResources(
+			Collection<IArchiveResource> sourceResources,
+			Collection<IArchiveResource> importedClassesResources,
+			Collection<IArchiveResource> otherResources,
+			Collection<IArchive> nestedArchives, IContainer rootFolder,
+			IFolder importedClassesFolder) throws Exception {
+		
+		IPath resourcePath = null;
+		IFile resourceFile = null;
+		
+		//verify all of the resources from the archive were imported to the project correctly
+		for(IArchiveResource sourceResource : sourceResources) {
+			resourcePath = sourceResource.getPath();
+			resourceFile = rootFolder.getFile(resourcePath);
+//			Assert.assertTrue("The file " + resourcePath + " should exist in the project in the " + rootFolder.getFullPath() + " directory", resourceFile.exists());
+			AssertWarn.warnTrue("The file " + resourcePath + " should exist in the project in the " + rootFolder.getFullPath() + " directory", resourceFile.exists());
+		}
+		
+		for(IArchiveResource importedClassResource : importedClassesResources) {
+			resourcePath = importedClassResource.getPath();
+			resourceFile = importedClassesFolder.getFile(resourcePath);
+//			Assert.assertTrue("The imported class " + resourcePath + " should exist in the project in the " + importedClassesFolder.getFullPath() + " directory", resourceFile.exists());
+			if(!resourceFile.exists()){
+				AssertWarn.warnTrue("The imported class " + resourcePath + " should exist in the project in the " + importedClassesFolder.getFullPath() + " directory", resourceFile.exists());
+			}
+		}
+		
+		for(IArchiveResource otherResource : otherResources) {
+			resourcePath = otherResource.getPath();
+			resourceFile = rootFolder.getFile(resourcePath);
+//			Assert.assertTrue("The resource " + resourcePath + " should exist in the project in the " + rootFolder.getFullPath() + " directory", resourceFile.exists());
+			AssertWarn.warnTrue("The resource " + resourcePath + " should exist in the project in the " + rootFolder.getFullPath() + " directory", resourceFile.exists());
+		}
+	
+		for(IArchive nestedArchive : nestedArchives) {
+			
+		}
+	}
+
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/utility/verifiers/UtilityProjectCreationDataModelVerifier.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/utility/verifiers/UtilityProjectCreationDataModelVerifier.java
new file mode 100644
index 0000000..e846755
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/utility/verifiers/UtilityProjectCreationDataModelVerifier.java
@@ -0,0 +1,35 @@
+package org.eclipse.wtp.j2ee.headless.tests.utility.verifiers;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.verifiers.ModuleProjectCreationDataModelVerifier;
+
+/**
+ * @author itewk
+ */
+public class UtilityProjectCreationDataModelVerifier extends ModuleProjectCreationDataModelVerifier {	
+	@Override
+	public void verify(IDataModel model) throws Exception {
+		this.hasModelProvider = false;
+		
+		super.verify(model);
+	}
+
+	@Override
+	protected IFile getDDFile() {
+		//Utility projects don't have DDs
+		return null;
+	}
+
+	@Override
+	protected void setFacetProjectType() {
+		this.facetProjectType = J2EEProjectUtilities.UTILITY;
+	}
+
+	@Override
+	protected void verifyDD(Object modelObj) {
+		//Utility projects don't have DDs
+		return;
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/web/verifiers/WebExportDataModelVerifier.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/web/verifiers/WebExportDataModelVerifier.java
new file mode 100644
index 0000000..7b72fe8
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/web/verifiers/WebExportDataModelVerifier.java
@@ -0,0 +1,29 @@
+/*
+ * Created on Jan 5, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package org.eclipse.wtp.j2ee.headless.tests.web.verifiers;
+
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.verifiers.ModuleExportDataModelVerifier;
+
+/**
+ * @author Administrator
+ *
+ * To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+public class WebExportDataModelVerifier extends ModuleExportDataModelVerifier {
+	@Override
+	public void verify(IDataModel model) throws Exception {
+		super.verify(model);
+	}
+	
+	@Override
+	protected int getExportType() {
+		return J2EEVersionConstants.WEB_TYPE;
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/web/verifiers/WebImportDataModelVerifier.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/web/verifiers/WebImportDataModelVerifier.java
new file mode 100644
index 0000000..cbbfffd
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/web/verifiers/WebImportDataModelVerifier.java
@@ -0,0 +1,127 @@
+/*
+ * Created on Jan 5, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package org.eclipse.wtp.j2ee.headless.tests.web.verifiers;
+
+import java.io.FileNotFoundException;
+import java.util.Collection;
+
+import junit.framework.Assert;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveConstants;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.util.ArchiveUtil;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.jee.archive.IArchive;
+import org.eclipse.jst.jee.archive.IArchiveResource;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.verifiers.ModuleImportDataModelVerifier;
+
+/**
+ * @author Administrator
+ * @author Ian Tewksbury (ictewksb@us.ibm.com)
+ *
+ * To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+public class WebImportDataModelVerifier extends ModuleImportDataModelVerifier {
+	@Override
+	public void verify(IDataModel model) throws Exception {
+		super.verify(model);
+	}
+	
+	@Override
+	protected int getExportType() {
+		return J2EEVersionConstants.WEB_TYPE;
+	}
+	
+	@Override
+	protected void verifyImportedResources(
+			Collection<IArchiveResource> sourceResources,
+			Collection<IArchiveResource> importedClassesResources,
+			Collection<IArchiveResource> otherResources,
+			Collection<IArchive> nestedArchives,
+			IContainer rootFolder, IFolder importedClassesFolder) {
+		
+		IPath resourcePath = null;
+		IFile resourceFile = null;
+		IFolder sourceFolder = project.getFolder("src");
+		
+		//verify all of the resources from the archive were imported to the project correctly
+		for(IArchiveResource sourceResource : sourceResources) {
+			resourcePath = sourceResource.getPath();
+			resourcePath = resourcePath.removeFirstSegments(2);
+			resourceFile = sourceFolder.getFile(resourcePath);
+			Assert.assertTrue("The file " + resourcePath + " should exist in the project", resourceFile.exists());
+		}
+		
+		for(IArchiveResource importedClassResource : importedClassesResources) {
+			resourcePath = importedClassResource.getPath().removeFirstSegments(2);
+			resourceFile = importedClassesFolder.getFile(resourcePath);
+			if(!resourceFile.exists()){
+				Assert.fail("The imported class " + resourcePath + " should exist in the project");
+			}
+		}
+		
+		for(IArchiveResource otherResource : otherResources) {
+			resourcePath = otherResource.getPath();
+			resourceFile = rootFolder.getFile(resourcePath);
+			Assert.assertTrue("The resource " + resourcePath + " should exist in the project", resourceFile.exists());
+		}
+	
+		for(IArchive nestedArchive : nestedArchives) {
+			
+		}
+	}
+	
+	protected boolean isClassWithoutSource(IArchive archive, IArchiveResource aFile) {
+		String javaUri = ArchiveUtil.classUriToJavaUri(aFile.getPath().toString());
+		if (javaUri == null)
+			return true;
+		IPath javaPath = new Path(javaUri);
+		if (archive.containsArchiveResource(javaPath)) {
+			return false;
+		}
+		// see if it is a JSP
+		String jspUri = javaUri.substring(0, javaUri.indexOf(ArchiveUtil.DOT_JAVA));
+		int lastSlash = jspUri.lastIndexOf('/');
+		int _index = lastSlash == -1 ? ArchiveConstants.WEBAPP_CLASSES_URI.length() : lastSlash + 1;
+		if (jspUri.length() > _index && jspUri.charAt(_index) == '_') {
+			jspUri = jspUri.substring(ArchiveConstants.WEBAPP_CLASSES_URI.length(), _index) + jspUri.substring(_index + 1) + ArchiveUtil.DOT_JSP;
+			IPath jspPath = new Path(jspUri);
+			if (archive.containsArchiveResource(jspPath)) {
+				return false;
+			}
+		}
+
+		//This is to handle archives created by an earlier version
+		//The format was to include the source files in a directory called source in WEB-INF
+		//Example: class  is in WEB-INF/classes/test/Foo.class
+		//         source is in WEB-INF/source/test/Foo.java
+		if(javaPath.segmentCount() > 2 && javaPath.segment(0).equals("WEB-INF") && javaPath.segment(1).equals("classes")){
+			String alternateJavaUri = javaUri.replaceFirst("classes", "source");
+			IPath alternateJavaPath = new Path(alternateJavaUri);
+			if (archive.containsArchiveResource(alternateJavaPath)){
+				IArchiveResource sourceFile;
+				try {
+					sourceFile = archive.getArchiveResource(alternateJavaPath);
+					if(sourceFile != null){
+						return false;
+					}
+				} catch (FileNotFoundException e) {
+				}
+				
+			}
+			
+		}
+		
+		return true;
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/web/verifiers/WebProjectCreationDataModelVerifier.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/web/verifiers/WebProjectCreationDataModelVerifier.java
new file mode 100644
index 0000000..310bfcb
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/web/verifiers/WebProjectCreationDataModelVerifier.java
@@ -0,0 +1,140 @@
+/*
+ * Created on Jan 5, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package org.eclipse.wtp.j2ee.headless.tests.web.verifiers;
+
+import junit.framework.Assert;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
+import org.eclipse.jst.j2ee.application.WebModule;
+import org.eclipse.jst.j2ee.internal.J2EEConstants;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
+import org.eclipse.jst.j2ee.model.IModelProvider;
+import org.eclipse.jst.j2ee.model.ModelProviderManager;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetProjectCreationDataModelProperties;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEModuleFacetInstallDataModelProperties;
+import org.eclipse.jst.j2ee.web.project.facet.IWebFacetInstallDataModelProperties;
+import org.eclipse.jst.javaee.application.Application;
+import org.eclipse.jst.javaee.application.Module;
+import org.eclipse.jst.javaee.web.WebApp;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties.FacetDataModelMap;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualFile;
+import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
+import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.verifiers.ModuleProjectCreationDataModelVerifier;
+
+/**
+ * @author Administrator
+ * @author Ian Tewksbury (ictewksb@us.ibm.com)
+ *
+ * To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+public class WebProjectCreationDataModelVerifier extends ModuleProjectCreationDataModelVerifier {
+    @Override
+    public void verify(IDataModel model) throws Exception {
+    	super.verify(model);
+    	
+    	this.verifyContextRoot();
+    	this.verifyContentDir();
+    	this.verifyJavaSrcDir();
+    }
+    
+    @Override
+    protected void setFacetProjectType() {
+    	this.facetProjectType = J2EEProjectUtilities.DYNAMIC_WEB;
+    }
+    
+    @Override
+    protected IFile getDDFile() {
+    	return component.getRootFolder().getFile(J2EEConstants.WEBAPP_DD_URI).getUnderlyingFile();
+    }
+    
+    @Override
+    protected void verifyDD(Object modelObj) {
+		String version = J2EEProjectUtilities.getJ2EEProjectVersion(project);
+		if(version.equals(J2EEVersionConstants.VERSION_2_5_TEXT) || version.equals(J2EEVersionConstants.VERSION_3_0_TEXT) || version.equals(J2EEVersionConstants.VERSION_3_1_TEXT)){
+			WebApp web = (WebApp)modelObj;
+			Assert.assertEquals("Invalid project version", version, web.getVersion().getLiteral());
+		} else {
+			org.eclipse.jst.j2ee.webapplication.WebApp web = (org.eclipse.jst.j2ee.webapplication.WebApp)modelObj;
+			Assert.assertEquals("Invalid project version", version, web.getVersion());
+		}
+    }
+    
+    private void verifyContextRoot() {
+    	FacetDataModelMap facetMap = (FacetDataModelMap) model.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
+    	IDataModel facetModel = facetMap.getFacetDataModel(J2EEProjectUtilities.DYNAMIC_WEB);
+
+    	
+    	boolean addToEAR = model.getBooleanProperty(IJ2EEFacetProjectCreationDataModelProperties.ADD_TO_EAR);
+    	
+		//context root need only be tested if project added to EAR
+		if(addToEAR) {
+	    	String expectedContextRoot = facetModel.getStringProperty(IWebFacetInstallDataModelProperties.CONTEXT_ROOT);
+			String earName = model.getStringProperty(IJ2EEFacetProjectCreationDataModelProperties.EAR_PROJECT_NAME);
+			IProject ear = ProjectUtilities.getProject(earName);
+			
+	    	IVirtualComponent earComponent = ComponentCore.createComponent(ear);
+	    	IVirtualReference projRef = J2EEProjectUtilities.getComponentReference(earComponent, project.getName());
+	    	IVirtualComponent projComponentFromEARRef = projRef.getReferencedComponent();
+	    	IProject projFromEARRef = projComponentFromEARRef.getProject();
+	    	Assert.assertTrue("EAR reference to the project should be identical to the project", project == projFromEARRef);
+	    	
+	    	//TODO this check should be replaced with the proper API defined in https://bugs.eclipse.org/bugs/show_bug.cgi?id=199920
+	    	IModelProvider earProvider = ModelProviderManager.getModelProvider(ear);
+	    	System.err.println("TODO -- see https://bugs.eclipse.org/bugs/show_bug.cgi?id=199920");
+	    	IVirtualFolder rootFolder = earComponent.getRootFolder();
+	    	IPath path = new Path(J2EEConstants.APPLICATION_DD_URI);
+	    	IVirtualFile vFile = rootFolder.getFile(path);
+	    	if(vFile.exists()){
+		    	Object earModelObj = earProvider.getModelObject();
+		    	//this test can only be performed if EAR had DD
+		    	if(earModelObj != null) {
+		    		String actualContextRoot = null;
+			    	String projArchiveName = projRef.getArchiveName();
+			    	String version = J2EEProjectUtilities.getJ2EEProjectVersion(project);
+					if(version.equals(J2EEVersionConstants.VERSION_2_5_TEXT)){
+						Application earApp = (Application)earModelObj;
+						Module projMod = earApp.getFirstModule(projArchiveName);
+						actualContextRoot = projMod.getWeb().getContextRoot();
+					} else {
+						org.eclipse.jst.j2ee.application.Application earApp = (org.eclipse.jst.j2ee.application.Application)earModelObj;
+						org.eclipse.jst.j2ee.application.Module projMod = earApp.getFirstModule(projArchiveName);
+						WebModule webModule = (WebModule)projMod;
+						actualContextRoot = webModule.getContextRoot();
+					}
+					Assert.assertEquals("EAR should have module with context root: " + expectedContextRoot, expectedContextRoot, actualContextRoot);
+		    	}
+	    	}
+		}
+    }
+    
+    private void verifyContentDir() {
+    	FacetDataModelMap facetMap = (FacetDataModelMap) model.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
+    	IDataModel facetModel = facetMap.getFacetDataModel(J2EEProjectUtilities.DYNAMIC_WEB);
+		String contentDir = facetModel.getStringProperty(IJ2EEModuleFacetInstallDataModelProperties.CONFIG_FOLDER);
+		IPath contentDirPath = new Path(contentDir);
+		Assert.assertTrue("Content directory should exist", project.exists(contentDirPath));
+    }
+    
+    private void verifyJavaSrcDir() {
+    	FacetDataModelMap facetMap = (FacetDataModelMap) model.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
+    	IDataModel facetModel = facetMap.getFacetDataModel(J2EEProjectUtilities.DYNAMIC_WEB);
+		String javaSrcDir = facetModel.getStringProperty(IWebFacetInstallDataModelProperties.SOURCE_FOLDER);
+		IPath javaSrcDirPath = new Path(javaSrcDir);
+		Assert.assertTrue("Java source directory should exist", project.exists(javaSrcDirPath));
+    }
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tets/appclient/verifiers/AppClientExportDataModelVerifier.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tets/appclient/verifiers/AppClientExportDataModelVerifier.java
new file mode 100644
index 0000000..b2551a5
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tets/appclient/verifiers/AppClientExportDataModelVerifier.java
@@ -0,0 +1,30 @@
+/*
+ * Created on Jan 5, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package org.eclipse.wtp.j2ee.headless.tets.appclient.verifiers;
+
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.verifiers.ModuleExportDataModelVerifier;
+
+/**
+ * @author Administrator
+ * @author Ian Tewksbury (ictewksb@us.ibm.com)
+ *
+ * To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+public class AppClientExportDataModelVerifier extends ModuleExportDataModelVerifier {
+	@Override
+	public void verify(IDataModel model) throws Exception {
+		super.verify(model);
+	}
+	
+	@Override
+	protected int getExportType() {
+		return J2EEVersionConstants.APPLICATION_CLIENT_TYPE;
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tets/appclient/verifiers/AppClientImportDataModelVerifier.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tets/appclient/verifiers/AppClientImportDataModelVerifier.java
new file mode 100644
index 0000000..c8c5adc
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tets/appclient/verifiers/AppClientImportDataModelVerifier.java
@@ -0,0 +1,78 @@
+/*
+ * Created on Jan 5, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package org.eclipse.wtp.j2ee.headless.tets.appclient.verifiers;
+
+import java.util.Collection;
+
+import junit.framework.Assert;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.jee.archive.IArchive;
+import org.eclipse.jst.jee.archive.IArchiveResource;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.verifiers.ModuleImportDataModelVerifier;
+
+/**
+ * @author Administrator
+ * @author Ian Tewksbury (ictewksb@us.ibm.com)
+ *
+ * To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+public class AppClientImportDataModelVerifier extends ModuleImportDataModelVerifier {
+	@Override
+	public void verify(IDataModel model) throws Exception {
+		super.verify(model);
+	}
+	
+	@Override
+	protected int getExportType() {
+		return J2EEVersionConstants.APPLICATION_CLIENT_TYPE;
+	}
+	
+	@Override
+	protected void verifyImportedResources(
+			Collection<IArchiveResource> sourceResources,
+			Collection<IArchiveResource> importedClassesResources,
+			Collection<IArchiveResource> otherResources,
+			Collection<IArchive> nestedArchives,
+			IContainer rootFolder, IFolder importedClassesFolder) {
+		
+		IPath resourcePath = null;
+		IFile resourceFile = null;
+		
+		//verify all of the resources from the archive were imported to the project correctly
+		for(IArchiveResource sourceResource : sourceResources) {
+			resourcePath = sourceResource.getPath();
+			resourceFile = rootFolder.getFile(resourcePath);
+			if(!resourceFile.exists()){
+				Assert.fail("The file " + resourcePath + " should exist in the project");
+			}
+		}
+		
+		for(IArchiveResource importedClassResource : importedClassesResources) {
+			resourcePath = importedClassResource.getPath();
+			resourceFile = importedClassesFolder.getFile(resourcePath);
+			Assert.assertTrue("The imported class " + resourcePath + " should exist in the project", resourceFile.exists());
+		}
+		
+		for(IArchiveResource otherResource : otherResources) {
+			resourcePath = otherResource.getPath();
+			resourceFile = rootFolder.getFile(resourcePath);
+			Assert.assertTrue("The resource " + resourcePath + " should exist in the project", resourceFile.exists());
+		}
+	
+		for(IArchive nestedArchive : nestedArchives) {
+			
+		}
+	}
+	
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tets/appclient/verifiers/AppClientProjectCreationDataModelVerifier.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tets/appclient/verifiers/AppClientProjectCreationDataModelVerifier.java
new file mode 100644
index 0000000..dc77adc
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tets/appclient/verifiers/AppClientProjectCreationDataModelVerifier.java
@@ -0,0 +1,83 @@
+/* Created on Jan 5, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package org.eclipse.wtp.j2ee.headless.tets.appclient.verifiers;
+
+import junit.framework.Assert;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
+import org.eclipse.jst.j2ee.internal.J2EEConstants;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
+import org.eclipse.jst.j2ee.project.facet.IAppClientFacetInstallDataModelProperties;
+import org.eclipse.jst.javaee.applicationclient.ApplicationClient;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties.FacetDataModelMap;
+import org.eclipse.wst.common.componentcore.internal.util.ComponentUtilities;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualFile;
+import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.verifiers.ModuleProjectCreationDataModelVerifier;
+
+/**
+ * @author Administrator
+ * @author Ian Tewksbury (ictewksb@us.ibm.com)
+ *
+ * To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+public class AppClientProjectCreationDataModelVerifier extends ModuleProjectCreationDataModelVerifier {
+
+	
+	@Override
+	public void verify(IDataModel model) throws Exception {
+		super.verify(model);
+		
+		this.verifyMainClassField();
+	}
+	
+	@Override
+	protected void setFacetProjectType() {
+		this.facetProjectType = J2EEProjectUtilities.APPLICATION_CLIENT;
+	}
+	
+	@Override
+	protected IFile getDDFile() {
+		return component.getRootFolder().getFile(J2EEConstants.APP_CLIENT_DD_URI).getUnderlyingFile();
+	}
+	
+	@Override
+	protected void verifyDD(Object modelObj) {
+		String version = J2EEProjectUtilities.getJ2EEProjectVersion(project);
+		if(version.equals(J2EEVersionConstants.VERSION_5_0_TEXT)){
+			ApplicationClient client = (ApplicationClient)modelObj;
+			Assert.assertEquals("Invalid project version", J2EEVersionConstants.VERSION_5_TEXT, client.getVersion());
+		} else if(version.equals(J2EEVersionConstants.VERSION_6_0_TEXT)){
+			ApplicationClient client = (ApplicationClient)modelObj;
+			Assert.assertEquals("Invalid project version", J2EEVersionConstants.VERSION_6_TEXT, client.getVersion());
+		} else {
+			org.eclipse.jst.j2ee.client.ApplicationClient client = (org.eclipse.jst.j2ee.client.ApplicationClient)modelObj;
+			Assert.assertEquals("Invalid project version", version, client.getVersion());
+		}
+	}
+	
+	private void verifyMainClassField() {
+    	FacetDataModelMap facetMap = (FacetDataModelMap) model.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
+        IDataModel facetModel = facetMap.getFacetDataModel(J2EEProjectUtilities.APPLICATION_CLIENT);
+        boolean createDefaultClass = facetModel.getBooleanProperty(IAppClientFacetInstallDataModelProperties.CREATE_DEFAULT_MAIN_CLASS);
+        
+        if(createDefaultClass) {
+        	String projName = model.getStringProperty(IFacetProjectCreationDataModelProperties.FACET_PROJECT_NAME);
+        	IProject proj = ProjectUtilities.getProject(projName);
+        	IVirtualComponent appClient = ComponentUtilities.getComponent(projName);
+        	IVirtualFolder appClientRootFolder = appClient.getRootFolder();
+        	IVirtualFile vertMainClass = appClientRootFolder.getFile("Main.java");
+        	Assert.assertTrue("Default main class Main.java should exist", vertMainClass.exists());
+        }
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tets/ear/verifiers/EARExportDataModelVerifier.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tets/ear/verifiers/EARExportDataModelVerifier.java
new file mode 100644
index 0000000..b136fcf
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tets/ear/verifiers/EARExportDataModelVerifier.java
@@ -0,0 +1,34 @@
+/*
+ * Created on Jan 5, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package org.eclipse.wtp.j2ee.headless.tets.ear.verifiers;
+
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.verifiers.JEEExportDataModelVerifier;
+
+/**
+ * @author Administrator
+ * @author Ian Tewksbury (ictewksb@us.ibm.com)
+ *
+ * To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+public class EARExportDataModelVerifier extends JEEExportDataModelVerifier {
+	@Override
+	public void verify(IDataModel model) throws Exception {
+		super.verify(model);
+	}
+	
+	@Override
+	protected int getExportType() {
+		return J2EEVersionConstants.APPLICATION_TYPE;
+	}
+	
+	protected boolean checkManifest() {
+		return false;
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tets/ear/verifiers/EARImportDataModelVerifier.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tets/ear/verifiers/EARImportDataModelVerifier.java
new file mode 100644
index 0000000..dc6eabf
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tets/ear/verifiers/EARImportDataModelVerifier.java
@@ -0,0 +1,108 @@
+/*
+ * Created on Jan 5, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package org.eclipse.wtp.j2ee.headless.tets.ear.verifiers;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.Assert;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.jst.j2ee.datamodel.properties.IEARComponentImportDataModelProperties;
+import org.eclipse.jst.j2ee.datamodel.properties.IJ2EEModuleImportDataModelProperties;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.j2ee.internal.archive.ArchiveWrapper;
+import org.eclipse.jst.jee.archive.IArchive;
+import org.eclipse.jst.jee.archive.IArchiveResource;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.internal.operations.IProjectCreationPropertiesNew;
+import org.eclipse.wst.common.tests.AssertWarn;
+import org.eclipse.wst.common.tests.DataModelVerifierFactory;
+import org.eclipse.wst.common.tests.ProjectUtility;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.verifiers.JEEImportDataModelVerifier;
+
+/**
+ * @author Administrator
+ * @author itewk
+ *
+ * To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+public class EARImportDataModelVerifier extends JEEImportDataModelVerifier {
+
+    public void verify(IDataModel model) throws Exception {
+        super.verify(model);
+    }
+    
+    @Override
+    protected int getExportType() {
+    	return J2EEVersionConstants.APPLICATION_TYPE;
+    }
+    
+    @Override
+	protected void verifyImportedResources (
+			Collection<IArchiveResource> sourceResources,
+			Collection<IArchiveResource> importedClassesResources,
+			Collection<IArchiveResource> otherResources,
+			Collection<IArchive> nestedArchives,
+			IContainer rootFolder, IFolder importedClassesFolder)throws Exception {
+		
+		IPath resourcePath = null;
+		IFile resourceFile = null;
+    	
+		for(IArchiveResource otherResource : otherResources) {
+			resourcePath = otherResource.getPath();
+			resourceFile = rootFolder.getFile(resourcePath);
+			if(resourceFile.getName().equalsIgnoreCase("Manifest.mf")) {
+				AssertWarn.warnTrue("The resource " + resourcePath + " should exist in the project " + project.getName(), resourceFile.exists());
+			} else {
+				Assert.assertTrue("The resource " + resourcePath + " should exist in the project " + project.getName(), resourceFile.exists());
+			}
+		}
+		
+		Map<IPath,IArchive> nestedArchiveMap = new HashMap<IPath,IArchive>();
+		for(IArchive nestedArchive : nestedArchives) {
+			resourcePath = nestedArchive.getPath();
+			resourceFile = rootFolder.getFile(resourcePath);
+			Assert.assertTrue("The nested archive " + resourcePath + " should exist in the project", resourceFile.exists());
+			nestedArchiveMap.put(nestedArchive.getPath(), nestedArchive);
+		}
+		
+		List<IDataModel> selectedModelsList = (List)model.getProperty(IEARComponentImportDataModelProperties.SELECTED_MODELS_LIST);
+		DataModelVerifierFactory verifierFactory = DataModelVerifierFactory.getInstance();
+		JEEImportDataModelVerifier verifier = null;
+		ArchiveWrapper nestedArchiveWrapper = null;
+		IArchive nestedArchive = null;
+		for(IDataModel selectedModel : selectedModelsList) {
+			verifier = (JEEImportDataModelVerifier)verifierFactory.createVerifier(selectedModel);
+			nestedArchiveWrapper = (ArchiveWrapper)selectedModel.getProperty(IJ2EEModuleImportDataModelProperties.ARCHIVE_WRAPPER);
+			nestedArchive = nestedArchiveMap.get(nestedArchiveWrapper.getPath());
+			Assert.assertNotNull("There should be a nested archive object for this selected model: " + selectedModel, nestedArchive);
+			verifier.verify(selectedModel, nestedArchive);
+		}
+		
+		List<IDataModel> moduleModelsList = (List)model.getProperty(IEARComponentImportDataModelProperties.MODULE_MODELS_LIST);
+		moduleModelsList.removeAll(selectedModelsList);
+		String projectName = null;
+		nestedArchive = null;
+		for(IDataModel nonExplodedNestedModels : moduleModelsList) {
+			projectName = nonExplodedNestedModels.getStringProperty(IProjectCreationPropertiesNew.PROJECT_NAME);
+			nestedArchiveWrapper = (ArchiveWrapper)nonExplodedNestedModels.getProperty(IJ2EEModuleImportDataModelProperties.ARCHIVE_WRAPPER);
+			Assert.assertFalse("The nested archive, " + nestedArchiveWrapper.getPath() + " should not have been exploded into a project.", ProjectUtility.getProject(projectName).exists());
+		}
+		
+		
+		List utilityList = (List)model.getProperty(IEARComponentImportDataModelProperties.UTILITY_LIST);
+		List ejbClientList = (List)model.getProperty(IEARComponentImportDataModelProperties.EJB_CLIENT_LIST);
+		List utilityModelsList = (List)model.getProperty(IEARComponentImportDataModelProperties.UTILITY_MODELS_LIST);
+	}    
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tets/ear/verifiers/EARProjectCreationDataModelVerifier.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tets/ear/verifiers/EARProjectCreationDataModelVerifier.java
new file mode 100644
index 0000000..c5a05ca
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tets/ear/verifiers/EARProjectCreationDataModelVerifier.java
@@ -0,0 +1,113 @@
+/*
+ * Created on Jan 5, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package org.eclipse.wtp.j2ee.headless.tets.ear.verifiers;
+
+import java.util.List;
+
+import junit.framework.Assert;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jst.j2ee.earcreation.IEarFacetInstallDataModelProperties;
+import org.eclipse.jst.j2ee.internal.J2EEConstants;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
+import org.eclipse.jst.javaee.application.Application;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties.FacetDataModelMap;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.verifiers.JEEProjectCreationDataModelVerifier;
+
+/**
+ * @author Administrator
+ *
+ * To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+public class EARProjectCreationDataModelVerifier extends JEEProjectCreationDataModelVerifier {
+	@Override
+	public void verify(IDataModel model) throws Exception {
+		super.verify(model);
+		
+		this.verifyContentDir();
+		this.verifyProjectDependencies();
+	}
+	
+	@Override
+	protected void setFacetProjectType() {
+		this.facetProjectType = J2EEProjectUtilities.ENTERPRISE_APPLICATION;
+	}
+	
+	@Override
+	protected IFile getDDFile() {
+		return component.getRootFolder().getFile(J2EEConstants.APPLICATION_DD_URI).getUnderlyingFile();
+	}
+	
+	@Override
+	protected void verifyDD(Object modelObj) {
+		String version = J2EEProjectUtilities.getJ2EEProjectVersion(project);
+		if(version.equals(J2EEVersionConstants.VERSION_5_0_TEXT)){
+			Application ear = (Application)modelObj;
+			Assert.assertEquals("Invalid project version", J2EEVersionConstants.VERSION_5_TEXT, ear.getVersion());
+		} else if(version.equals(J2EEVersionConstants.VERSION_6_0_TEXT)){
+			Application ear = (Application)modelObj;
+			Assert.assertEquals("Invalid project version", J2EEVersionConstants.VERSION_6_TEXT, ear.getVersion());
+		} else {
+			org.eclipse.jst.j2ee.application.Application ear = (org.eclipse.jst.j2ee.application.Application)modelObj;
+			Assert.assertEquals("Invalid project version", version, ear.getVersion());
+		}
+	}
+	
+	private void verifyContentDir() {
+		FacetDataModelMap factMap = (FacetDataModelMap) model.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
+		IDataModel earModel = (IDataModel) factMap.get(IEarFacetInstallDataModelProperties.ENTERPRISE_APPLICATION);
+		String contentDir = earModel.getStringProperty(IEarFacetInstallDataModelProperties.CONTENT_DIR);
+		
+		IFolder contentFolder = project.getFolder(contentDir);
+		Assert.assertTrue("Content directory should exist", contentFolder.exists());
+	}
+	
+	private void verifyProjectDependencies()throws Exception {
+		FacetDataModelMap factMap = (FacetDataModelMap) model.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
+		IDataModel earModel = (IDataModel) factMap.get(IEarFacetInstallDataModelProperties.ENTERPRISE_APPLICATION);
+		
+		List j2eeDependencies = (List)earModel.getProperty(IEarFacetInstallDataModelProperties.J2EE_PROJECTS_LIST);
+		List javaDependencies = (List)earModel.getProperty(IEarFacetInstallDataModelProperties.JAVA_PROJECT_LIST);
+		
+		IProject[] referencedProjs = project.getReferencedProjects();
+		
+		boolean foundDependency = false;
+		IProject dependencyProj = null;
+		
+		//be sure this EAR has a referenced project for each J2EE dependency
+		if(j2eeDependencies != null) {
+			for(int i = 0; i < j2eeDependencies.size(); i++) {
+				dependencyProj = (IProject)j2eeDependencies.get(i);
+				
+				for(int j = 0; j < referencedProjs.length && !foundDependency; j++) {
+					foundDependency = (dependencyProj == referencedProjs[j]);
+				}
+				
+				Assert.assertTrue("EAR should have a referenced project " + dependencyProj.getName(), foundDependency);
+			}
+		}
+		
+		//be sure this EAR has a referenced project for each Java dependency
+		if(javaDependencies != null) {
+			for(int i = 0; i < javaDependencies.size(); i++) {
+				dependencyProj = (IProject)javaDependencies.get(i);
+				
+				for(int j = 0; j < referencedProjs.length && !foundDependency; j++) {
+					foundDependency = (dependencyProj == referencedProjs[j]);
+				}
+				
+				Assert.assertTrue("EAR should have a referenced project " + dependencyProj.getName(), foundDependency);
+			}
+		}
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/plugin.xml b/tests/org.eclipse.jst.j2ee.tests/plugin.xml
new file mode 100644
index 0000000..5da2b7a
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/plugin.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+
+     <extension
+         point="org.eclipse.wst.common.tests.collector.suites">
+      <suite
+            class="org.eclipse.wtp.j2ee.headless.tests.web.operations.AllTests"
+            name="Web Operations"/>
+      <suite
+            class="org.eclipse.jst.j2ee.core.tests.bvt.AutomatedBVT"
+            name="J2EE Headless BVT Tests"/>
+      <suite
+            class="org.eclipse.wtp.headless.tests.savestrategy.AllTests"
+            name="SaveStrategy Tests"/>
+      <suite
+            class="org.eclipse.jst.j2ee.defect.tests.DefectVerificationTestsSuite"
+            name="J2EE Defect Verification Tests"/>
+            
+   </extension>
+
+   <extension
+         point="org.eclipse.jst.common.annotations.core.annotationsProvider">
+      <annotationsProvider
+         className="org.eclipse.jst.common.annotations.tests.TestAnnotationProvider"/>
+   </extension>
+
+   
+   <extension
+         id="org.eclipse.jst.j2ee.bindingshelper.tests.TestBindingHelper"
+         point="org.eclipse.jst.j2ee.core.jndiBindingsHelpers">
+      <jndiBindingsHelper
+            class="org.eclipse.jst.j2ee.bindingshelper.tests.FooBindingsHelper"
+            id="org.eclipse.jst.j2ee.bindingshelper.tests.fooBindingsHelper"/>
+      <jndiBindingsHelper
+            class="org.eclipse.jst.j2ee.bindingshelper.tests.BarBindingsHelper"
+            id="org.eclipse.jst.j2ee.bindingshelper.tests.barBindingsHelper"/>
+   </extension>
+   <extension
+         point="org.eclipse.wst.common.modulecore.referenceResolver">
+      <resolver
+            class="org.eclipse.wtp.j2ee.headless.tests.exportmodel.TestExportReferenceResolver"
+            id="org.eclipse.jst.j2ee.tests.resolver1">
+      </resolver>
+   </extension>
+   
+
+</plugin>
diff --git a/tests/org.eclipse.jst.j2ee.tests/pom.xml b/tests/org.eclipse.jst.j2ee.tests/pom.xml
new file mode 100644
index 0000000..5142618
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/pom.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Copyright (c) 2012, 2013 Eclipse Foundation and others.
+  All rights reserved. This program and the accompanying materials
+  are made available under the terms of the Eclipse Distribution License v1.0
+  which accompanies this distribution, and is available at
+  http://www.eclipse.org/org/documents/edl-v10.php
+ 
+  Contributors:
+    Thanh Ha (Eclipse Foundation) - initial implementation
+-->
+
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.eclipse.webtools.javaee</groupId>
+    <artifactId>javaee.tests</artifactId>
+    <version>3.6.0-SNAPSHOT</version>
+  </parent>
+
+  <groupId>org.eclipse.webtools.javaee</groupId>
+  <artifactId>org.eclipse.jst.j2ee.tests</artifactId>
+  <version>1.1.700-SNAPSHOT</version>
+  <packaging>eclipse-plugin</packaging>
+  
+  <!-- Do not sign inner jars, see bug 274743 - Some unit tests are sensitive to details of build -->
+  <profiles>
+   <profile>
+     <id>eclipse-sign</id>
+     <build>
+       <plugins>
+         <plugin>
+           <groupId>org.eclipse.cbi.maven.plugins</groupId>
+           <artifactId>eclipse-jarsigner-plugin</artifactId>
+           <version>${cbi-plugins.version}</version>
+           <executions>
+             <execution>
+               <id>sign</id>
+               <phase>verify</phase>
+               <goals>
+                 <goal>sign</goal>
+               </goals>
+               <configuration>
+                 <excludeInnerJars>true</excludeInnerJars>
+               </configuration>
+             </execution>
+           </executions>
+         </plugin>
+       </plugins>
+     </build>
+   </profile>
+ </profiles>
+   
+</project>
diff --git a/tests/org.eclipse.jst.j2ee.tests/savestrategy-tests/org/eclipse/wtp/headless/tests/savestrategy/ThreadingTest.java b/tests/org.eclipse.jst.j2ee.tests/savestrategy-tests/org/eclipse/wtp/headless/tests/savestrategy/ThreadingTest.java
new file mode 100644
index 0000000..7ad07b5
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/savestrategy-tests/org/eclipse/wtp/headless/tests/savestrategy/ThreadingTest.java
@@ -0,0 +1,233 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ * Created on Jan 6, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package org.eclipse.wtp.headless.tests.savestrategy;
+
+import java.io.File;
+import java.net.URL;
+import java.util.List;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jst.j2ee.datamodel.properties.IJ2EEComponentImportDataModelProperties;
+import org.eclipse.jst.j2ee.internal.web.archive.operations.WebComponentImportDataModelProvider;
+import org.eclipse.wst.common.componentcore.internal.StructureEdit;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.tests.OperationTestCase;
+import org.eclipse.wst.common.tests.ProjectUtility;
+import org.eclipse.wtp.j2ee.headless.tests.plugin.HeadlessTestsPlugin;
+
+public class ThreadingTest extends OperationTestCase {
+
+	public final String WEB_TESTS_PATH;
+
+	public ThreadingTest(String name) {
+		super(name);
+		String relativeImportTestsPath = "TestData" + File.separator + getDirectory() + File.separator;
+		URL fullImportTestsPath = HeadlessTestsPlugin.getDefault().find(new Path(relativeImportTestsPath));
+		WEB_TESTS_PATH = fullImportTestsPath.getPath();
+	}
+
+	public static Test suite() {
+		return new TestSuite(ThreadingTest.class);
+	}
+
+	protected String getDirectory() {
+		return "WARImportTests";
+	}
+
+	protected List getImportableArchiveFileNames() {
+		return ProjectUtility.getWarsInDirectory(HeadlessTestsPlugin.getDefault(), WEB_TESTS_PATH);
+	}
+
+	protected IDataModel getModelInstance() {
+		return DataModelFactory.createDataModel(new WebComponentImportDataModelProvider());
+	}
+
+	public void testThreading() throws Exception {
+		final List projects = getImportableArchiveFileNames();
+		final IProject[] projectArray = new IProject[projects.size()];
+		final int iterationMax = 20;
+		for (int iterationCount = 0; iterationCount < iterationMax; iterationCount++) {
+			System.out.println("Importing Projects " + iterationCount);
+			for (int i = 0; i < projects.size(); i++) {
+				String jarName = projects.get(i).toString();
+				String projectName = jarName.substring(jarName.lastIndexOf(File.separator) + 1, jarName.length() - 4);
+				IDataModel dataModel = getModelInstance();
+				dataModel.setProperty(IJ2EEComponentImportDataModelProperties.FILE_NAME, jarName);
+				dataModel.setProperty(IJ2EEComponentImportDataModelProperties.PROJECT_NAME, projectName);
+				runDataModel(dataModel);
+				projectArray[i] = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
+			}
+			final Thread[] threads = new Thread[10 + 10 * iterationCount];
+
+			class ReadyCounter {
+
+				private boolean kill = false;
+				private boolean ready = false;
+				private int count = 0;
+
+				private int requiredCount = 0;
+
+				public ReadyCounter(int requiredCount) {
+					this.requiredCount = requiredCount;
+				}
+
+				public synchronized void increment() {
+					if (ready) {
+						throw new RuntimeException();
+					}
+					count++;
+					if (count == requiredCount) {
+						ready = true;
+					}
+				}
+
+				public synchronized void decrement() {
+					count--;
+				}
+
+				public int getCurrentCount() {
+					return count;
+				}
+
+				public synchronized boolean isReady() {
+					return ready || kill;
+				}
+
+				public synchronized boolean isZero() {
+					return count == 0;
+				}
+
+				public boolean isKill() {
+					return kill;
+				}
+
+				public void kill() {
+					System.out.println("Killing!!!!");
+					kill = true;
+				}
+
+			}
+
+			final ReadyCounter readyCounter = new ReadyCounter(threads.length);
+
+			for (int threadCount = 0; threadCount < threads.length; threadCount++) {
+				final int threadNum = threadCount;
+				threads[threadCount] = new Thread(new Runnable() {
+
+					private void kill(Exception e) {
+						e.printStackTrace();
+						readyCounter.kill();
+						sleep(1);
+					}
+
+					public void run() {
+						System.out.println("Thread " + threadNum + " started.");
+						try {
+							readyCounter.increment();
+							for (int waitCount = 1; !readyCounter.isReady(); waitCount *= 2) {
+								System.out.println("Thread " + threadNum + " waiting  " + waitCount + " currentCount=" + readyCounter.getCurrentCount());
+								sleep(waitCount);
+							}
+							for (int iterationCount = 0; iterationCount < iterationMax; iterationCount++) {
+								StructureEdit[][] readStructureEdits = new StructureEdit[iterationMax][projects.size()];
+								StructureEdit[][] writeStructureEdits = new StructureEdit[readStructureEdits.length][projectArray.length];
+
+								try {
+									for (int structureEditCount = 0; structureEditCount < readStructureEdits.length; structureEditCount++) {
+										for (int projectCount = 0; projectCount < projectArray.length; projectCount++) {
+											readStructureEdits[structureEditCount][projectCount] = StructureEdit.getStructureEditForRead(projectArray[projectCount]);
+											writeStructureEdits[structureEditCount][projectCount] = StructureEdit.getStructureEditForWrite(projectArray[projectCount]);
+										}
+									}
+
+									for (int structureEditCount = 0; structureEditCount < readStructureEdits.length; structureEditCount++) {
+										for (int projectCount = 0; projectCount < projects.size(); projectCount++) {
+											if (null != readStructureEdits[structureEditCount][projectCount]) {
+												readStructureEdits[structureEditCount][projectCount].getComponentModelRoot();
+											}
+											if (null != writeStructureEdits[structureEditCount][projectCount]) {
+												IProject project = StructureEdit.getContainingProject(writeStructureEdits[structureEditCount][projectCount].getComponent());
+											}
+										}
+									}
+
+
+								} catch (IllegalStateException e) {
+									if (!e.getMessage().equals("Edit Model already disposed")) {
+										kill(e);
+									}
+								} catch (RuntimeException e) {
+									if (!e.getMessage().equals("This resource has been deleted and can no longer be used.")) {
+										kill(e);
+									}
+								} catch (Exception e) {
+									kill(e);
+								} finally {
+									for (int structureEditCount = 0; structureEditCount < readStructureEdits.length; structureEditCount++) {
+										for (int projectCount = 0; projectCount < projectArray.length; projectCount++) {
+											if (null != readStructureEdits[structureEditCount][projectCount]) {
+												readStructureEdits[structureEditCount][projectCount].dispose();
+											}
+											if (null != writeStructureEdits[structureEditCount][projectCount]) {
+												writeStructureEdits[structureEditCount][projectCount].dispose();
+											}
+										}
+									}
+								}
+							}
+						} finally {
+							System.out.println("Thread " + threadNum + " finshed.");
+							readyCounter.decrement();
+						}
+					}
+				});
+			}
+			System.out.println("Starting Threads " + iterationCount);
+			for (int threadCount = 0; threadCount < threads.length; threadCount++) {
+				threads[threadCount].start();
+			}
+			while (!readyCounter.isReady()) {
+				System.out.println("Main Thread Waiting ---------");
+				sleep(1);
+			}
+			sleep(1);
+			System.out.println("Before Deleting Projects " + iterationCount);
+			ProjectUtility.deleteAllProjects();
+			System.out.println("After Deleting Projects " + iterationCount);
+			while (!readyCounter.isZero()) {
+				sleep(1);
+			}
+			if (readyCounter.isKill()) {
+				fail();
+			}
+		}
+	}
+
+	private static void sleep(int time) {
+		try {
+			Thread.sleep(time);
+		} catch (InterruptedException e) {
+			e.printStackTrace();
+		}
+	}
+}
diff --git a/tests/org.eclipse.jst.j2ee.tests/testHOLD.xml b/tests/org.eclipse.jst.j2ee.tests/testHOLD.xml
new file mode 100644
index 0000000..33fe416
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/testHOLD.xml
@@ -0,0 +1,122 @@
+<?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}\..\.." />
+
+	<!-- sets the properties eclipse-home, and library-file -->
+	<property name="plugin-name" value="org.eclipse.jst.j2ee.tests" />
+	<property name="library-file" value="${eclipse-home}/plugins/org.eclipse.test_3.3.0/library.xml" />
+	<property name="extraVMargs" value="-Dorg.eclipse.jst.server.jonas.432=${jonas432Dir}" />
+
+	<property name="workspace" value="${basedir}/${plugin-name}" />
+
+	<!-- Read the properties that will enable/disable the different targets below. -->
+	<property file="bvt.properties" />
+
+	<!-- 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*.xml" />
+		</delete>
+		<delete dir="${workspace}" quiet="true" />
+	</target>
+
+	<target name="AutomatedBVTSuite" if="org.eclipse.jst.j2ee.tests.bvt.ALL">
+		<ant target="core-test" antfile="${library-file}" dir="${eclipse-home}">
+			<property name="data-dir" value="${workspace}" />
+			<property name="plugin-name" value="${plugin-name}" />
+			<property name="classname" value="org.eclipse.jst.j2ee.tests.bvt.AutomatedBVT" />
+			<property name="extraVMargs" value="${extraVMargs}" />
+		</ant>
+		<antcall target="cleanup"/>
+	</target>
+
+	<target name="EnterpriseBVTSuite" if="org.eclipse.jst.j2ee.tests.bvt.EnterpriseBVT" unless="org.eclipse.jst.j2ee.tests.bvt.ALL">
+		<ant target="core-test" antfile="${library-file}" dir="${eclipse-home}">
+			<property name="data-dir" value="${workspace}" />
+			<property name="plugin-name" value="${plugin-name}" />
+			<property name="classname" value="org.eclipse.jst.j2ee.tests.bvt.EnterpriseBVT" />
+			<property name="extraVMargs" value="${extraVMargs}" />
+		</ant>
+		<antcall target="cleanup"/>
+	</target>
+
+	<target name="WebBVTSuite" if="org.eclipse.jst.j2ee.tests.bvt.WebBVT" unless="org.eclipse.jst.j2ee.tests.bvt.ALL">
+		<ant target="core-test" antfile="${library-file}" dir="${eclipse-home}">
+			<property name="data-dir" value="${workspace}" />
+			<property name="plugin-name" value="${plugin-name}" />
+			<property name="classname" value="org.eclipse.jst.j2ee.tests.bvt.WebBVT" />
+			<property name="extraVMargs" value="${extraVMargs}" />
+		</ant>
+		<antcall target="cleanup"/>
+	</target>
+
+	<target name="EJBBVTSuite" if="org.eclipse.jst.j2ee.tests.bvt.EJBBVT" unless="org.eclipse.jst.j2ee.tests.bvt.ALL">
+		<ant target="core-test" antfile="${library-file}" dir="${eclipse-home}">
+			<property name="data-dir" value="${workspace}" />
+			<property name="plugin-name" value="${plugin-name}" />
+			<property name="classname" value="org.eclipse.jst.j2ee.tests.bvt.EJBBVT" />
+			<property name="extraVMargs" value="${extraVMargs}" />
+		</ant>
+		<antcall target="cleanup"/>
+	</target>
+
+	<target name="CoreBVTSuite" if="org.eclipse.jst.j2ee.tests.bvt.CoreInfrastructureBVT" unless="org.eclipse.jst.j2ee.tests.bvt.ALL">
+		<ant target="core-test" antfile="${library-file}" dir="${eclipse-home}">
+			<property name="data-dir" value="${workspace}" />
+			<property name="plugin-name" value="${plugin-name}" />
+			<property name="classname" value="org.eclipse.jst.j2ee.tests.bvt.CoreInfrastructureBVT" />
+			<property name="extraVMargs" value="${extraVMargs}" />
+		</ant>
+		<antcall target="cleanup"/>
+	</target>
+
+	<target name="ModelProviderBVTSuite" if="org.eclipse.jst.j2ee.tests.bvt.ModelProviderBVT" unless="org.eclipse.jst.j2ee.tests.bvt.ALL">
+		<ant target="core-test" antfile="${library-file}" dir="${eclipse-home}">
+			<property name="data-dir" value="${workspace}" />
+			<property name="plugin-name" value="${plugin-name}" />
+			<property name="classname" value="org.eclipse.jst.j2ee.tests.bvt.ModelProviderBVT" />
+			<property name="extraVMargs" value="${extraVMargs}" />
+		</ant>
+		<antcall target="cleanup"/>
+	</target>
+
+	<target name="ExtendedModelProviderBVTSuite" if="org.eclipse.jst.j2ee.tests.bvt.ExtendedModelProviderBVT" unless="org.eclipse.jst.j2ee.tests.bvt.ALL">
+		<ant target="core-test" antfile="${library-file}" dir="${eclipse-home}">
+			<property name="data-dir" value="${workspace}" />
+			<property name="plugin-name" value="${plugin-name}" />
+			<property name="classname" value="org.eclipse.jst.j2ee.tests.bvt.ExtendedModelProviderBVT" />
+			<property name="extraVMargs" value="${extraVMargs}" />
+		</ant>
+		<antcall target="cleanup"/>
+	</target>
+
+	<!-- This target defines the tests that need to be run. -->
+	<target name="suite" depends="AutomatedBVTSuite, EnterpriseBVTSuite, WebBVTSuite, EJBBVTSuite, CoreBVTSuite, ModelProviderBVTSuite, ExtendedModelProviderBVTSuite">
+	</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">
+		<delete dir="${workspace}" quiet="true" />
+	</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*.xml" />
+			<property name="output-file" value="${plugin-name}.xml" />
+		</ant>
+	</target>
+
+</project>
+
+
+
diff --git a/tests/org.eclipse.jst.j2ee.tests/webmodule-tests/org/eclipse/wtp/j2ee/headless/tests/web/container/WebAppLibrariesContainerTests.java b/tests/org.eclipse.jst.j2ee.tests/webmodule-tests/org/eclipse/wtp/j2ee/headless/tests/web/container/WebAppLibrariesContainerTests.java
new file mode 100644
index 0000000..6699571
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/webmodule-tests/org/eclipse/wtp/j2ee/headless/tests/web/container/WebAppLibrariesContainerTests.java
@@ -0,0 +1,384 @@
+/******************************************************************************
+ * Copyright (c) 2006 BEA Systems, Inc.
+ * 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:
+ *    Konstantin Komissarchik - initial API and implementation
+ ******************************************************************************/
+
+package org.eclipse.wtp.j2ee.headless.tests.web.container;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jst.common.project.facet.JavaFacetUtils;
+import org.eclipse.jst.j2ee.internal.web.classpath.WebAppLibrariesContainer;
+import org.eclipse.jst.j2ee.web.project.facet.WebFacetUtils;
+import org.eclipse.wst.common.project.facet.core.IFacetedProject;
+import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
+import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
+import org.osgi.framework.Bundle;
+
+/**
+ * @author <a href="mailto:kosta@bea.com">Konstantin Komissarchik</a>
+ */
+
+public final class WebAppLibrariesContainerTests
+
+    extends TestCase
+    
+{
+    private static final String WEBCONTENT_DIR = "WebContent";
+    private static final String WEBINF_DIR = WEBCONTENT_DIR + "/WEB-INF";
+    private static final String WEBINFLIB_DIR = WEBINF_DIR + "/lib"; 
+    
+    private static final String ABC_JAR_NAME = "abc.jar";
+    
+    private static final String ABC_JAR_PATH 
+        = "TestData/WebAppLibrariesContainerTests/" + ABC_JAR_NAME;
+    
+    private static final String FOO_JAR_NAME = "foo.jar";
+    
+    private static final String FOO_JAR_PATH
+        = "TestData/WebAppLibrariesContainerTests/" + FOO_JAR_NAME;
+    
+    private static final IProjectFacetVersion UTILITY_FACET
+        = ProjectFacetsManager.getProjectFacet( "jst.utility" ).getVersion( "1.0" );
+    
+    private IProject webProject;
+    private IProject utilityProject;
+    
+    private IFile jarFile1;
+    private IPath jarFile1Path;
+    private IFile jarFile2;
+    private IPath jarFile2Path;
+    
+    private final Set resourcesToCleanup = new HashSet();
+
+    private WebAppLibrariesContainerTests( final String name )
+    {
+        super( name );
+    }
+    
+    public static Test suite()
+    {
+        final TestSuite suite = new TestSuite();
+        
+        suite.setName( "Web App Libraries Container Tests" );
+
+        suite.addTest( new WebAppLibrariesContainerTests( "testDetectionOfAddedJar" ) );
+        suite.addTest( new WebAppLibrariesContainerTests( "testDetectionOfTwoAddedJars" ) );
+        suite.addTest( new WebAppLibrariesContainerTests( "testDetectionOfRemovedJar" ) );
+        suite.addTest( new WebAppLibrariesContainerTests( "testDetectionOfTwoRemovedJars" ) );
+        
+        return suite;
+    }
+    
+    public void testDetectionOfAddedJar()
+    
+        throws Exception
+        
+    {
+        copyFromPlugin( ABC_JAR_PATH, this.jarFile1 );
+        waitForCondition( cpContains( this.webProject, this.jarFile1Path ) );
+        waitForCondition( cpContains( this.utilityProject, this.jarFile1Path ) );
+    }
+
+    public void testDetectionOfTwoAddedJars()
+    
+        throws Exception
+        
+    {
+        copyFromPlugin( ABC_JAR_PATH, this.jarFile1 );
+        waitForCondition( cpContains( this.webProject, this.jarFile1Path ) );
+        waitForCondition( cpContains( this.utilityProject, this.jarFile1Path ) );
+
+        copyFromPlugin( FOO_JAR_PATH, this.jarFile2 );
+        waitForCondition( cpContains( this.webProject, this.jarFile2Path ) );
+        waitForCondition( cpContains( this.utilityProject, this.jarFile2Path ) );
+    }
+
+    public void testDetectionOfRemovedJar()
+    
+        throws Exception
+        
+    {
+        copyFromPlugin( ABC_JAR_PATH, this.jarFile1 );
+        waitForCondition( cpContains( this.webProject, this.jarFile1Path ) );
+        waitForCondition( cpContains( this.utilityProject, this.jarFile1Path ) );
+        
+        this.jarFile1.delete( true, null );
+        waitForCondition( cpDoesNotContain( this.webProject, this.jarFile1Path ) );
+        waitForCondition( cpDoesNotContain( this.utilityProject, this.jarFile1Path ) );
+    }
+
+    public void testDetectionOfTwoRemovedJars()
+    
+        throws Exception
+        
+    {
+        copyFromPlugin( ABC_JAR_PATH, this.jarFile1 );
+        waitForCondition( cpContains( this.webProject, this.jarFile1Path ) );
+        waitForCondition( cpContains( this.utilityProject, this.jarFile1Path ) );
+        
+        copyFromPlugin( FOO_JAR_PATH, this.jarFile2 );
+        waitForCondition( cpContains( this.webProject, this.jarFile2Path ) );
+        waitForCondition( cpContains( this.utilityProject, this.jarFile2Path ) );
+        
+        this.jarFile1.delete( true, null );
+        waitForCondition( cpDoesNotContain( this.webProject, this.jarFile1Path ) );
+        assertCondition( cpContains( this.webProject, this.jarFile2Path ) );
+        waitForCondition( cpDoesNotContain( this.utilityProject, this.jarFile1Path ) );
+        assertCondition( cpContains( this.utilityProject, this.jarFile2Path ) );
+        
+        this.jarFile2.delete( true, null );
+        waitForCondition( cpDoesNotContain( this.webProject, this.jarFile2Path ) );
+        waitForCondition( cpDoesNotContain( this.utilityProject, this.jarFile2Path ) );
+    }
+    
+    protected void setUp()
+    
+        throws Exception
+        
+    {
+        System.setProperty( "wtp.autotest.noninteractive", "true" );
+        
+        IFacetedProject fpj;
+        
+        fpj = ProjectFacetsManager.create( "abc", null, null );
+
+        fpj.installProjectFacet( JavaFacetUtils.JAVA_50, null, null );
+        fpj.installProjectFacet( WebFacetUtils.WEB_24, null, null );
+        
+        this.webProject = fpj.getProject();
+        
+        this.jarFile1 = this.webProject.getFile( WEBINFLIB_DIR + "/" + ABC_JAR_NAME );
+        this.jarFile1Path = this.jarFile1.getLocation();
+        
+        this.jarFile2 = this.webProject.getFile( WEBINFLIB_DIR + "/" + FOO_JAR_NAME );
+        this.jarFile2Path = this.jarFile2.getLocation();
+        
+        addResourceToCleanup( this.webProject );
+
+        fpj = ProjectFacetsManager.create( "subordinate", null, null );
+        
+        fpj.installProjectFacet( JavaFacetUtils.JAVA_50, null, null );
+        fpj.installProjectFacet( UTILITY_FACET, null, null );
+        
+        final IPath path 
+            = ( new Path( WebAppLibrariesContainer.CONTAINER_ID ) ).append( "abc" );
+        
+        final IClasspathEntry cpe = JavaCore.newContainerEntry( path );
+        
+        addToClasspath( JavaCore.create( fpj.getProject() ), cpe );
+        
+        this.utilityProject = fpj.getProject();
+        
+        addResourceToCleanup( this.utilityProject );
+    }
+    
+    protected void tearDown() 
+    
+        throws Exception 
+        
+    {
+        for( Iterator itr = this.resourcesToCleanup.iterator(); itr.hasNext(); )
+        {
+            final IResource r = (IResource) itr.next();
+            r.delete( true, null );
+        }
+    }
+    
+    private void addResourceToCleanup( final IResource resource )
+    {
+        this.resourcesToCleanup.add( resource );
+    }
+
+    private static void copyFromPlugin( final String src,
+                                        final IFile dest )
+
+        throws CoreException, IOException
+
+    {
+        final Bundle bundle = Platform.getBundle( "org.eclipse.jst.j2ee.tests" );
+        final URL entryUrl = bundle.getEntry( src );
+        final InputStream in = entryUrl.openStream();
+        
+        try
+        {
+            dest.create( in, true, null );
+        }
+        finally
+        {
+            try
+            {
+                in.close();
+            }
+            catch( IOException e ) {}
+        }
+    }
+    
+    private static void addToClasspath( final IJavaProject jproj,
+                                        final IClasspathEntry cpe )
+    
+        throws JavaModelException
+        
+    {
+        final IClasspathEntry[] oldcp = jproj.getRawClasspath();
+        final IClasspathEntry[] newcp = new IClasspathEntry[ oldcp.length + 1 ];
+        
+        System.arraycopy( oldcp, 0, newcp, 0, oldcp.length );
+        newcp[ oldcp.length ] = cpe;
+        
+        jproj.setRawClasspath( newcp, null );
+    }
+    
+    private static void waitForCondition( final ICondition condition )
+    
+        throws Exception
+        
+    {
+        waitForCondition( condition, 10 );
+    }
+    
+    private static void waitForCondition( final ICondition condition,
+                                          final int seconds )
+    
+        throws Exception
+        
+    {
+        for( int i = 0; i < seconds && ! condition.check(); i++ )
+        {
+            try
+            {
+                Thread.sleep( 1000 );
+            }
+            catch( InterruptedException e ) {}
+        }
+        
+        assertCondition( condition );
+    }
+    
+    private static void assertCondition( final ICondition condition )
+    
+        throws Exception
+        
+    {
+        assertTrue( condition.check() );
+    }
+    
+    private static ICondition cpContains( final IProject project,
+                                          final IPath entry )
+    {
+        return new ClasspathContainsCondition( project, entry );
+    }
+    
+    private static ICondition cpDoesNotContain( final IProject project,
+                                                final IPath entry )
+    {
+        return new ClasspathDoesNotContainCondition( project, entry );
+    }
+    
+    private static interface ICondition
+    {
+        boolean check() throws Exception;
+    }
+    
+    private static abstract class AbstractClasspathCondition
+    
+        implements ICondition
+        
+    {
+        private final IProject project;
+        private final IPath entry;
+        
+        public AbstractClasspathCondition( final IProject project,
+                                           final IPath entry )
+        {
+            this.project = project;
+            this.entry = entry;
+        }
+        
+        protected boolean internalCheck()
+        
+            throws Exception
+            
+        {
+            final IJavaProject jproj = JavaCore.create( this.project );
+            final IClasspathEntry[] cp = jproj.getResolvedClasspath( true );
+            
+            for( int i = 0; i < cp.length; i++ )
+            {
+                if( cp[ i ].getPath().equals( this.entry ) )
+                {
+                    return true;
+                }
+            }
+            
+            return false;
+        }
+    }
+
+    private static final class ClasspathContainsCondition
+    
+        extends AbstractClasspathCondition
+        
+    {
+        public ClasspathContainsCondition( final IProject project,
+                                           final IPath entry )
+        {
+            super( project, entry );
+        }
+        
+        public boolean check()
+        
+            throws Exception
+            
+        {
+            return internalCheck();
+        }
+    }
+
+    private static final class ClasspathDoesNotContainCondition
+    
+        extends AbstractClasspathCondition
+        
+    {
+        public ClasspathDoesNotContainCondition( final IProject project,
+                                                 final IPath entry )
+        {
+            super( project, entry );
+        }
+        
+        public boolean check()
+        
+            throws Exception
+            
+        {
+            return ! internalCheck();
+        }
+    }
+    
+}
diff --git a/tests/org.eclipse.jst.jee.tests/.classpath b/tests/org.eclipse.jst.jee.tests/.classpath
new file mode 100644
index 0000000..1bc4c24
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="jee-tests"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/tests/org.eclipse.jst.jee.tests/.project b/tests/org.eclipse.jst.jee.tests/.project
new file mode 100644
index 0000000..0519860
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.jst.jee.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/tests/org.eclipse.jst.jee.tests/.settings/org.eclipse.jdt.core.prefs b/tests/org.eclipse.jst.jee.tests/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..d5ac5e5
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,59 @@
+#Fri Nov 19 14:37:44 CST 2010
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.problem.nullReference=ignore
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.unusedImport=error
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.source=1.6
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
diff --git a/tests/org.eclipse.jst.jee.tests/.settings/org.eclipse.jdt.ui.prefs b/tests/org.eclipse.jst.jee.tests/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..5993ccb
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,3 @@
+#Sat Mar 24 11:01:21 EDT 2007
+eclipse.preferences.version=1
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates/>
diff --git a/tests/org.eclipse.jst.jee.tests/.settings/org.eclipse.pde.prefs b/tests/org.eclipse.jst.jee.tests/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..ed07971
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,15 @@
+#Sat Mar 24 10:56:39 EDT 2007
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=1
+compilers.p.unknown-attribute=1
+compilers.p.unknown-class=1
+compilers.p.unknown-element=1
+compilers.p.unknown-resource=1
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/tests/org.eclipse.jst.jee.tests/META-INF/MANIFEST.MF b/tests/org.eclipse.jst.jee.tests/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..42df3ac
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/META-INF/MANIFEST.MF
@@ -0,0 +1,20 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name
+Bundle-SymbolicName: org.eclipse.jst.jee.tests;singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Bundle-ClassPath: jee-tests.jar
+Bundle-Activator: org.eclipse.wtp.jee.headless.tests.plugin.HeadlessTestsPlugin
+Bundle-Localization: plugin
+Export-Package: org.eclipse.jst.jee.tests.bvt,
+ org.eclipse.wtp.jee.headless.tests.appclient.operations,
+ org.eclipse.wtp.jee.headless.tests.ejb.operations,
+ org.eclipse.wtp.jee.headless.tests.plugin,
+ org.eclipse.wtp.jee.headless.tests.web.operations
+Require-Bundle: org.eclipse.jst.j2ee.tests,
+ org.eclipse.wst.common.tests,
+ org.eclipse.wst.server.core,
+ org.eclipse.jem.util,
+ org.eclipse.core.runtime
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
diff --git a/tests/org.eclipse.jst.jee.tests/META-INF/eclipse.inf b/tests/org.eclipse.jst.jee.tests/META-INF/eclipse.inf
new file mode 100644
index 0000000..d988f4d
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/META-INF/eclipse.inf
@@ -0,0 +1,5 @@
+# We do not want any nested jars 
+# signed or normalized for packing
+# see bug 274743 Some unit tests are sensitive to details of build
+# https://bugs.eclipse.org/bugs/show_bug.cgi?id=274743
+jarprocessor.exclude=true
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_Defaults.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_Defaults.jar
new file mode 100644
index 0000000..2d6a578
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_InterestingName_Defaults.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_InterestingName_Defaults.jar
new file mode 100644
index 0000000..1be3b0e
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_InterestingName_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_InterestingName_NoBuild.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_InterestingName_NoBuild.jar
new file mode 100644
index 0000000..1be3b0e
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_InterestingName_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_InterestingName_Source.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_InterestingName_Source.jar
new file mode 100644
index 0000000..1be3b0e
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_InterestingName_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_InterestingName_Source_NoBuild.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_InterestingName_Source_NoBuild.jar
new file mode 100644
index 0000000..1be3b0e
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_InterestingName_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_NoBuild.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_NoBuild.jar
new file mode 100644
index 0000000..2d6a578
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_Source.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_Source.jar
new file mode 100644
index 0000000..2d6a578
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_Source_NoBuild.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_Source_NoBuild.jar
new file mode 100644
index 0000000..2d6a578
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_AddToEAR_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_Defaults_Defaults.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_Defaults_Defaults.jar
new file mode 100644
index 0000000..8f4fee5
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_Defaults_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_Defaults_NoBuild.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_Defaults_NoBuild.jar
new file mode 100644
index 0000000..8f4fee5
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_Defaults_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_Defaults_Source.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_Defaults_Source.jar
new file mode 100644
index 0000000..8f4fee5
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_Defaults_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_Defaults_Source_NoBuild.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_Defaults_Source_NoBuild.jar
new file mode 100644
index 0000000..8f4fee5
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_Defaults_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_InterestingName_Defaults.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_InterestingName_Defaults.jar
new file mode 100644
index 0000000..c5d2706
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_InterestingName_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_InterestingName_NoBuild.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_InterestingName_NoBuild.jar
new file mode 100644
index 0000000..c5d2706
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_InterestingName_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_InterestingName_Source.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_InterestingName_Source.jar
new file mode 100644
index 0000000..c5d2706
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_InterestingName_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_InterestingName_Source_NoBuild.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_InterestingName_Source_NoBuild.jar
new file mode 100644
index 0000000..c5d2706
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_InterestingName_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_NoDefaultClass_Defaults.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_NoDefaultClass_Defaults.jar
new file mode 100644
index 0000000..1d17147
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_NoDefaultClass_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_NoDefaultClass_NoBuild.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_NoDefaultClass_NoBuild.jar
new file mode 100644
index 0000000..1d17147
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_NoDefaultClass_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_NoDefaultClass_Source.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_NoDefaultClass_Source.jar
new file mode 100644
index 0000000..1d17147
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_NoDefaultClass_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_NoDefaultClass_Source_NoBuild.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_NoDefaultClass_Source_NoBuild.jar
new file mode 100644
index 0000000..1d17147
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC50_NoDefaultClass_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_AddToEAR_InterestingName_WithDD_Defaults.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_AddToEAR_InterestingName_WithDD_Defaults.jar
new file mode 100644
index 0000000..a6350a2
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_AddToEAR_InterestingName_WithDD_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_AddToEAR_InterestingName_WithDD_NoBuild.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_AddToEAR_InterestingName_WithDD_NoBuild.jar
new file mode 100644
index 0000000..6319172
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_AddToEAR_InterestingName_WithDD_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_AddToEAR_InterestingName_WithDD_Source.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_AddToEAR_InterestingName_WithDD_Source.jar
new file mode 100644
index 0000000..8afc75c
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_AddToEAR_InterestingName_WithDD_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_AddToEAR_InterestingName_WithDD_Source_NoBuild.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_AddToEAR_InterestingName_WithDD_Source_NoBuild.jar
new file mode 100644
index 0000000..fbc1719
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_AddToEAR_InterestingName_WithDD_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_AddToEAR_WithDD_Defaults.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_AddToEAR_WithDD_Defaults.jar
new file mode 100644
index 0000000..fd2e0a9
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_AddToEAR_WithDD_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_AddToEAR_WithDD_NoBuild.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_AddToEAR_WithDD_NoBuild.jar
new file mode 100644
index 0000000..a4ec26d
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_AddToEAR_WithDD_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_AddToEAR_WithDD_Source.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_AddToEAR_WithDD_Source.jar
new file mode 100644
index 0000000..7cf87d2
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_AddToEAR_WithDD_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_AddToEAR_WithDD_Source_NoBuild.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_AddToEAR_WithDD_Source_NoBuild.jar
new file mode 100644
index 0000000..5eb844e
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_AddToEAR_WithDD_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_NoDefaultClass_WithDD_Defaults.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_NoDefaultClass_WithDD_Defaults.jar
new file mode 100644
index 0000000..30abbed
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_NoDefaultClass_WithDD_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_NoDefaultClass_WithDD_NoBuild.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_NoDefaultClass_WithDD_NoBuild.jar
new file mode 100644
index 0000000..9e98f9b
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_NoDefaultClass_WithDD_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_NoDefaultClass_WithDD_Source.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_NoDefaultClass_WithDD_Source.jar
new file mode 100644
index 0000000..8160341
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_NoDefaultClass_WithDD_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_NoDefaultClass_WithDD_Source_NoBuild.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_NoDefaultClass_WithDD_Source_NoBuild.jar
new file mode 100644
index 0000000..4e10e37
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_NoDefaultClass_WithDD_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_WithDD_Defaults.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_WithDD_Defaults.jar
new file mode 100644
index 0000000..cacb37c
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_WithDD_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_WithDD_NoBuild.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_WithDD_NoBuild.jar
new file mode 100644
index 0000000..de17b04
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_WithDD_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_WithDD_Source.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_WithDD_Source.jar
new file mode 100644
index 0000000..fd4e308
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_WithDD_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_WithDD_Source_NoBuild.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_WithDD_Source_NoBuild.jar
new file mode 100644
index 0000000..6849c8c
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/AppClientImportOperationTest/AC60_WithDD_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_Defaults_Defaults.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_Defaults_Defaults.jar
new file mode 100644
index 0000000..b09afce
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_Defaults_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_Defaults_NoBuild.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_Defaults_NoBuild.jar
new file mode 100644
index 0000000..da70bea
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_Defaults_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_Defaults_Source.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_Defaults_Source.jar
new file mode 100644
index 0000000..da70bea
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_Defaults_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_Defaults_Source_NoBuild.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_Defaults_Source_NoBuild.jar
new file mode 100644
index 0000000..da70bea
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_Defaults_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_Defaults.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_Defaults.jar
new file mode 100644
index 0000000..0b4213a
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_DiffClientSourceFolder_Defaults.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_DiffClientSourceFolder_Defaults.jar
new file mode 100644
index 0000000..bce64a3
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_DiffClientSourceFolder_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_DiffClientSourceFolder_NoBuild.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_DiffClientSourceFolder_NoBuild.jar
new file mode 100644
index 0000000..bce64a3
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_DiffClientSourceFolder_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_DiffClientSourceFolder_Source.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_DiffClientSourceFolder_Source.jar
new file mode 100644
index 0000000..bce64a3
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_DiffClientSourceFolder_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_DiffClientSourceFolder_Source_NoBuild.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_DiffClientSourceFolder_Source_NoBuild.jar
new file mode 100644
index 0000000..bce64a3
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_DiffClientSourceFolder_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_NoBuild.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_NoBuild.jar
new file mode 100644
index 0000000..0b4213a
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_Source.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_Source.jar
new file mode 100644
index 0000000..0b4213a
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_Source_NoBuild.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_Source_NoBuild.jar
new file mode 100644
index 0000000..0b4213a
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientName_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientSourceFolder_Defaults.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientSourceFolder_Defaults.jar
new file mode 100644
index 0000000..7a3f0bd
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientSourceFolder_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientSourceFolder_NoBuild.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientSourceFolder_NoBuild.jar
new file mode 100644
index 0000000..7a3f0bd
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientSourceFolder_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientSourceFolder_Source.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientSourceFolder_Source.jar
new file mode 100644
index 0000000..7a3f0bd
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientSourceFolder_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientSourceFolder_Source_NoBuild.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientSourceFolder_Source_NoBuild.jar
new file mode 100644
index 0000000..7a3f0bd
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_DiffClientSourceFolder_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_NoClient_Defaults.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_NoClient_Defaults.jar
new file mode 100644
index 0000000..ee27df2
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_NoClient_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_NoClient_NoBuild.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_NoClient_NoBuild.jar
new file mode 100644
index 0000000..ee27df2
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_NoClient_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_NoClient_Source.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_NoClient_Source.jar
new file mode 100644
index 0000000..ee27df2
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_NoClient_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_NoClient_Source_NoBuild.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_NoClient_Source_NoBuild.jar
new file mode 100644
index 0000000..ee27df2
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_AddToEAR_NoClient_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_Defaults_Defaults.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_Defaults_Defaults.jar
new file mode 100644
index 0000000..ae70f7a
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_Defaults_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_Defaults_NoBuild.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_Defaults_NoBuild.jar
new file mode 100644
index 0000000..ae70f7a
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_Defaults_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_Defaults_Source.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_Defaults_Source.jar
new file mode 100644
index 0000000..ae70f7a
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_Defaults_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_Defaults_Source_NoBuild.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_Defaults_Source_NoBuild.jar
new file mode 100644
index 0000000..ae70f7a
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB30_Defaults_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_Defaults_WithDD_Defaults.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_Defaults_WithDD_Defaults.jar
new file mode 100644
index 0000000..183137e
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_Defaults_WithDD_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_Defaults_WithDD_NoBuild.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_Defaults_WithDD_NoBuild.jar
new file mode 100644
index 0000000..99e278a
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_Defaults_WithDD_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_Defaults_WithDD_Source.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_Defaults_WithDD_Source.jar
new file mode 100644
index 0000000..3fdead6
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_Defaults_WithDD_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_Defaults_WithDD_Source_NoBuild.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_Defaults_WithDD_Source_NoBuild.jar
new file mode 100644
index 0000000..aa208aa
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_Defaults_WithDD_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientName_DiffClientSourceFolder_WithDD_Defaults.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientName_DiffClientSourceFolder_WithDD_Defaults.jar
new file mode 100644
index 0000000..17d5b5c
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientName_DiffClientSourceFolder_WithDD_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientName_DiffClientSourceFolder_WithDD_NoBuild.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientName_DiffClientSourceFolder_WithDD_NoBuild.jar
new file mode 100644
index 0000000..0422489
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientName_DiffClientSourceFolder_WithDD_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientName_DiffClientSourceFolder_WithDD_Source.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientName_DiffClientSourceFolder_WithDD_Source.jar
new file mode 100644
index 0000000..274aaf5
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientName_DiffClientSourceFolder_WithDD_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientName_DiffClientSourceFolder_WithDD_Source_NoBuild.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientName_DiffClientSourceFolder_WithDD_Source_NoBuild.jar
new file mode 100644
index 0000000..9fd3d2c
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientName_DiffClientSourceFolder_WithDD_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientName_WithDD_Defaults.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientName_WithDD_Defaults.jar
new file mode 100644
index 0000000..af93e19
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientName_WithDD_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientName_WithDD_NoBuild.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientName_WithDD_NoBuild.jar
new file mode 100644
index 0000000..8342436
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientName_WithDD_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientName_WithDD_Source.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientName_WithDD_Source.jar
new file mode 100644
index 0000000..a88a79e
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientName_WithDD_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientName_WithDD_Source_NoBuild.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientName_WithDD_Source_NoBuild.jar
new file mode 100644
index 0000000..d19297e
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientName_WithDD_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientSourceFolder_WithDD_Defaults.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientSourceFolder_WithDD_Defaults.jar
new file mode 100644
index 0000000..c9f8808
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientSourceFolder_WithDD_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientSourceFolder_WithDD_NoBuild.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientSourceFolder_WithDD_NoBuild.jar
new file mode 100644
index 0000000..46f09c5
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientSourceFolder_WithDD_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientSourceFolder_WithDD_Source.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientSourceFolder_WithDD_Source.jar
new file mode 100644
index 0000000..2346692
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientSourceFolder_WithDD_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientSourceFolder_WithDD_Source_NoBuild.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientSourceFolder_WithDD_Source_NoBuild.jar
new file mode 100644
index 0000000..da365c3
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_DiffClientSourceFolder_WithDD_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_NoClient_WithDD_Defaults.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_NoClient_WithDD_Defaults.jar
new file mode 100644
index 0000000..ffcaa28
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_NoClient_WithDD_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_NoClient_WithDD_NoBuild.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_NoClient_WithDD_NoBuild.jar
new file mode 100644
index 0000000..5f7dde6
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_NoClient_WithDD_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_NoClient_WithDD_Source.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_NoClient_WithDD_Source.jar
new file mode 100644
index 0000000..26cb865
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_NoClient_WithDD_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_NoClient_WithDD_Source_NoBuild.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_NoClient_WithDD_Source_NoBuild.jar
new file mode 100644
index 0000000..38db407
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_AddToEAR_NoClient_WithDD_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_Defaults_WithDD_Defaults.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_Defaults_WithDD_Defaults.jar
new file mode 100644
index 0000000..dd0647d
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_Defaults_WithDD_Defaults.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_Defaults_WithDD_NoBuild.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_Defaults_WithDD_NoBuild.jar
new file mode 100644
index 0000000..2592c8b
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_Defaults_WithDD_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_Defaults_WithDD_Source.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_Defaults_WithDD_Source.jar
new file mode 100644
index 0000000..731966f
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_Defaults_WithDD_Source.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_Defaults_WithDD_Source_NoBuild.jar b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_Defaults_WithDD_Source_NoBuild.jar
new file mode 100644
index 0000000..2e2d5c3
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/EJBImportOperationTest/EJB31_Defaults_WithDD_Source_NoBuild.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_Defaults.war b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_Defaults.war
new file mode 100644
index 0000000..ac74c9c
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_NoBuild.war b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_NoBuild.war
new file mode 100644
index 0000000..ac74c9c
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_Source.war b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_Source.war
new file mode 100644
index 0000000..ac74c9c
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_Source_NoBuild.war b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_Source_NoBuild.war
new file mode 100644
index 0000000..ac74c9c
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_WithEAR_Defaults.war b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_WithEAR_Defaults.war
new file mode 100644
index 0000000..1a24ade
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_WithEAR_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_WithEAR_NoBuild.war b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_WithEAR_NoBuild.war
new file mode 100644
index 0000000..1a24ade
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_WithEAR_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_WithEAR_Source.war b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_WithEAR_Source.war
new file mode 100644
index 0000000..1a24ade
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_WithEAR_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_WithEAR_Source_NoBuild.war b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_WithEAR_Source_NoBuild.war
new file mode 100644
index 0000000..1a24ade
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_Defaults_WithEAR_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_Defaults.war b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_Defaults.war
new file mode 100644
index 0000000..95687f8
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_Defaults.war b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_Defaults.war
new file mode 100644
index 0000000..2aaf30e
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_NoBuild.war b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_NoBuild.war
new file mode 100644
index 0000000..2aaf30e
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_Source.war b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_Source.war
new file mode 100644
index 0000000..2aaf30e
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_Source_NoBuild.war b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_Source_NoBuild.war
new file mode 100644
index 0000000..2aaf30e
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_WithEAR_Defaults.war b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_WithEAR_Defaults.war
new file mode 100644
index 0000000..5d22dac
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_WithEAR_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_WithEAR_NoBuild.war b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_WithEAR_NoBuild.war
new file mode 100644
index 0000000..5d22dac
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_WithEAR_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_WithEAR_Source.war b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_WithEAR_Source.war
new file mode 100644
index 0000000..5d22dac
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_WithEAR_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_WithEAR_Source_NoBuild.war b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_WithEAR_Source_NoBuild.war
new file mode 100644
index 0000000..5d22dac
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_DiffSrcDir_WithEAR_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_NoBuild.war b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_NoBuild.war
new file mode 100644
index 0000000..95687f8
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_Source.war b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_Source.war
new file mode 100644
index 0000000..95687f8
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_Source_NoBuild.war b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_Source_NoBuild.war
new file mode 100644
index 0000000..95687f8
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_WithEAR_Defaults.war b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_WithEAR_Defaults.war
new file mode 100644
index 0000000..5080a4b
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_WithEAR_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_WithEAR_NoBuild.war b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_WithEAR_NoBuild.war
new file mode 100644
index 0000000..5080a4b
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_WithEAR_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_WithEAR_Source.war b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_WithEAR_Source.war
new file mode 100644
index 0000000..5080a4b
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_WithEAR_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_WithEAR_Source_NoBuild.war b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_WithEAR_Source_NoBuild.war
new file mode 100644
index 0000000..5080a4b
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContentDir_WithEAR_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_Defaults.war b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_Defaults.war
new file mode 100644
index 0000000..81ad6ea
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_NoBuild.war b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_NoBuild.war
new file mode 100644
index 0000000..81ad6ea
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_Source.war b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_Source.war
new file mode 100644
index 0000000..81ad6ea
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_Source_NoBuild.war b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_Source_NoBuild.war
new file mode 100644
index 0000000..81ad6ea
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_WithEAR_Defaults.war b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_WithEAR_Defaults.war
new file mode 100644
index 0000000..5ae3c0b
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_WithEAR_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_WithEAR_NoBuild.war b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_WithEAR_NoBuild.war
new file mode 100644
index 0000000..5ae3c0b
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_WithEAR_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_WithEAR_Source.war b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_WithEAR_Source.war
new file mode 100644
index 0000000..5ae3c0b
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_WithEAR_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_WithEAR_Source_NoBuild.war b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_WithEAR_Source_NoBuild.war
new file mode 100644
index 0000000..5ae3c0b
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffContentDir_WithEAR_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffSrcDir_WithEAR_Defaults.war b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffSrcDir_WithEAR_Defaults.war
new file mode 100644
index 0000000..fb15fca
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffSrcDir_WithEAR_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffSrcDir_WithEAR_NoBuild.war b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffSrcDir_WithEAR_NoBuild.war
new file mode 100644
index 0000000..fb15fca
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffSrcDir_WithEAR_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffSrcDir_WithEAR_Source.war b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffSrcDir_WithEAR_Source.war
new file mode 100644
index 0000000..fb15fca
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffSrcDir_WithEAR_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffSrcDir_WithEAR_Source_NoBuild.war b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffSrcDir_WithEAR_Source_NoBuild.war
new file mode 100644
index 0000000..fb15fca
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_DiffSrcDir_WithEAR_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_WithEAR_Defaults.war b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_WithEAR_Defaults.war
new file mode 100644
index 0000000..30c1bf4
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_WithEAR_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_WithEAR_NoBuild.war b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_WithEAR_NoBuild.war
new file mode 100644
index 0000000..30c1bf4
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_WithEAR_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_WithEAR_Source.war b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_WithEAR_Source.war
new file mode 100644
index 0000000..30c1bf4
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_WithEAR_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_WithEAR_Source_NoBuild.war b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_WithEAR_Source_NoBuild.war
new file mode 100644
index 0000000..30c1bf4
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffContextRoot_WithEAR_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_Defaults.war b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_Defaults.war
new file mode 100644
index 0000000..119beda
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_NoBuild.war b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_NoBuild.war
new file mode 100644
index 0000000..119beda
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_Source.war b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_Source.war
new file mode 100644
index 0000000..119beda
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_Source_NoBuild.war b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_Source_NoBuild.war
new file mode 100644
index 0000000..119beda
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_Source_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_WithEAR_Defaults.war b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_WithEAR_Defaults.war
new file mode 100644
index 0000000..3fad1a9
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_WithEAR_Defaults.war
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_WithEAR_NoBuild.war b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_WithEAR_NoBuild.war
new file mode 100644
index 0000000..3fad1a9
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_WithEAR_NoBuild.war
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_WithEAR_Source.war b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_WithEAR_Source.war
new file mode 100644
index 0000000..3fad1a9
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_WithEAR_Source.war
Binary files differ
diff --git a/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_WithEAR_Source_NoBuild.war b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_WithEAR_Source_NoBuild.war
new file mode 100644
index 0000000..3fad1a9
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/TestData/JEEImportOperationTests/WebImportOperationTest/Web25_DiffSrcDir_WithEAR_Source_NoBuild.war
Binary files differ
diff --git a/docs/org.eclipse.wst.web.ui.infopop/about.html b/tests/org.eclipse.jst.jee.tests/about.html
similarity index 100%
copy from docs/org.eclipse.wst.web.ui.infopop/about.html
copy to tests/org.eclipse.jst.jee.tests/about.html
diff --git a/tests/org.eclipse.jst.jee.tests/build.properties b/tests/org.eclipse.jst.jee.tests/build.properties
new file mode 100644
index 0000000..4a01f5b
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/build.properties
@@ -0,0 +1,28 @@
+###############################################################################
+# Copyright (c) 2005, 2007 IBM 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:
+#     IBM Corporation - initial API and implementation
+###############################################################################
+source.jee-tests.jar = 
+output.jee-tests.jar = bin/
+bin.includes = plugin.xml,\
+               jee-tests.jar,\
+               TestData/,\
+               test.xml,\
+               about.html,\
+               DefectTestData/,\
+               META-INF/,\
+               bvt.properties,\
+               plugin.properties
+src.includes = build.properties,\
+               test.xml,\
+               plugin.xml,\
+               TestData/,\
+               DefectTestData/,\
+               bvt.properties
+source.jee-tests.jar = jee-tests/
diff --git a/tests/org.eclipse.jst.jee.tests/bvt.properties b/tests/org.eclipse.jst.jee.tests/bvt.properties
new file mode 100644
index 0000000..8a742a0
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/bvt.properties
@@ -0,0 +1,20 @@
+###############################################################################
+# Copyright (c) 2010 IBM 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:
+#     IBM Corporation - initial API and implementation
+###############################################################################
+
+# To run all the buckets in the BVT, uncomment org.eclipse.jst.j2ee.tests.bvt.ALL (the rest of the
+# properties will be ignored). 
+# To run individual buckets, comment out org.eclipse.jst.2ee.tests.bvt.ALL and
+# uncomment the corresponding properties.
+
+#org.eclipse.jst.jee.tests.bvt.ALL = true
+org.eclipse.jst.jee.tests.bvt.EnterpriseBVT = true
+org.eclipse.jst.jee.tests.bvt.EJBBVT = true
+org.eclipse.jst.jee.tests.bvt.WebBVT = true
diff --git a/tests/org.eclipse.jst.jee.tests/jee-tests/org/eclipse/jst/jee/tests/bvt/AutomatedBVT.java b/tests/org.eclipse.jst.jee.tests/jee-tests/org/eclipse/jst/jee/tests/bvt/AutomatedBVT.java
new file mode 100644
index 0000000..ade654c
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/jee-tests/org/eclipse/jst/jee/tests/bvt/AutomatedBVT.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.jst.jee.tests.bvt;
+
+import java.net.URL;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+import junit.textui.TestRunner;
+
+import org.eclipse.core.runtime.IPluginDescriptor;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.wtp.jee.headless.tests.plugin.AllPluginTests;
+
+
+public class AutomatedBVT extends TestSuite {
+
+    public static String baseDirectory = System.getProperty("user.dir") + java.io.File.separatorChar + "TestData" + java.io.File.separatorChar;
+    
+    static {
+        try {
+            IPluginDescriptor pluginDescriptor = Platform.getPluginRegistry().getPluginDescriptor("org.eclipse.jst.jee.tests");
+            URL url = pluginDescriptor.getInstallURL(); 
+        	AutomatedBVT.baseDirectory = Platform.asLocalURL(url).getFile() + "TestData"+ java.io.File.separatorChar;
+		} catch (Exception e) { 
+			System.err.println("Using working directory since a workspace URL could not be located.");
+		} 
+    }
+
+    public static int unimplementedMethods;
+
+    public static void main(String[] args) {
+        unimplementedMethods = 0;
+        TestRunner.run(suite());
+        if (unimplementedMethods > 0) {
+            System.out.println("\nCalls to warnUnimpl: " + unimplementedMethods);
+        }
+    }
+
+    public AutomatedBVT() {
+        super();
+        TestSuite suite = (TestSuite) AutomatedBVT.suite();
+        for (int i = 0; i < suite.testCount(); i++) {
+            addTest(suite.testAt(i));
+        }
+    }
+
+    public static Test suite() {
+        TestSuite suite = new TestSuite("Test for org.eclipse.jst.jee.test.bvt");
+        suite.addTest(AllPluginTests.suite());
+        return suite;
+    }
+}
diff --git a/tests/org.eclipse.jst.jee.tests/jee-tests/org/eclipse/jst/jee/tests/bvt/EJBBVT.java b/tests/org.eclipse.jst.jee.tests/jee-tests/org/eclipse/jst/jee/tests/bvt/EJBBVT.java
new file mode 100644
index 0000000..af25392
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/jee-tests/org/eclipse/jst/jee/tests/bvt/EJBBVT.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.jst.jee.tests.bvt;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+public class EJBBVT extends TestSuite {
+
+    public EJBBVT() {
+        super();
+        addTest(org.eclipse.wtp.jee.headless.tests.ejb.operations.AllTests.suite());      
+    }
+    
+    public static Test suite(){
+    	return new EJBBVT();
+    }
+    
+}
diff --git a/tests/org.eclipse.jst.jee.tests/jee-tests/org/eclipse/jst/jee/tests/bvt/EnterpriseBVT.java b/tests/org.eclipse.jst.jee.tests/jee-tests/org/eclipse/jst/jee/tests/bvt/EnterpriseBVT.java
new file mode 100644
index 0000000..e0097e3
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/jee-tests/org/eclipse/jst/jee/tests/bvt/EnterpriseBVT.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.jst.jee.tests.bvt;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+public class EnterpriseBVT extends TestSuite {
+
+	public EnterpriseBVT(){
+		super();
+		addTest(org.eclipse.wtp.jee.headless.tests.appclient.operations.AllTests.suite());
+	}
+	
+    public static Test suite(){
+    	return new EnterpriseBVT();
+    }
+}
diff --git a/tests/org.eclipse.jst.jee.tests/jee-tests/org/eclipse/jst/jee/tests/bvt/WebBVT.java b/tests/org.eclipse.jst.jee.tests/jee-tests/org/eclipse/jst/jee/tests/bvt/WebBVT.java
new file mode 100644
index 0000000..e524d42
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/jee-tests/org/eclipse/jst/jee/tests/bvt/WebBVT.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.jst.jee.tests.bvt;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+public class WebBVT extends TestSuite {
+
+	public WebBVT() {
+        super();
+        addTest(org.eclipse.wtp.jee.headless.tests.web.operations.AllTests.suite());     
+    }
+	public static Test suite(){
+		return new WebBVT();
+	}
+}
diff --git a/tests/org.eclipse.jst.jee.tests/jee-tests/org/eclipse/wtp/jee/headless/tests/appclient/operations/AllTests.java b/tests/org.eclipse.jst.jee.tests/jee-tests/org/eclipse/wtp/jee/headless/tests/appclient/operations/AllTests.java
new file mode 100644
index 0000000..1ed2bd3
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/jee-tests/org/eclipse/wtp/jee/headless/tests/appclient/operations/AllTests.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.wtp.jee.headless.tests.appclient.operations;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+public class AllTests extends TestSuite {
+    public static Test suite(){
+        return new AllTests();
+    }
+    
+    public AllTests(){
+        super("Application Client Operation Tests");
+        addTest(AppClientImportOperationTest.suite());
+    }
+}
diff --git a/tests/org.eclipse.jst.jee.tests/jee-tests/org/eclipse/wtp/jee/headless/tests/appclient/operations/AppClientImportOperationTest.java b/tests/org.eclipse.jst.jee.tests/jee-tests/org/eclipse/wtp/jee/headless/tests/appclient/operations/AppClientImportOperationTest.java
new file mode 100644
index 0000000..9e8f339
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/jee-tests/org/eclipse/wtp/jee/headless/tests/appclient/operations/AppClientImportOperationTest.java
@@ -0,0 +1,102 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.wtp.jee.headless.tests.appclient.operations;
+
+import junit.framework.Test;
+
+import org.eclipse.wst.common.tests.SimpleTestSuite;
+import org.eclipse.wtp.j2ee.headless.tests.appclient.operations.AppClientImportOperationBaseTest;
+
+public class AppClientImportOperationTest extends AppClientImportOperationBaseTest {
+	
+	public AppClientImportOperationTest() {
+		super("AppClientImportOperationTests");
+	}
+	
+	public AppClientImportOperationTest(String name) {
+		super(name);
+	}
+	
+	public static Test suite() {
+		return new SimpleTestSuite(AppClientImportOperationTest.class);
+	}	
+	    
+    public void testACImport50_Defaults() throws Exception {
+    	runImportTests_All("AC50_Defaults");
+    }
+    
+    //TODO -- annotations to scan?
+    //EE6TODO 
+//    public void testACImport60_Defaults() throws Exception {
+//    	runImportTests_All("AC60_Defaults");
+//    }
+    
+    public void testACImport50_NoDefaultClass() throws Exception {
+    	runImportTests_All("AC50_NoDefaultClass");
+    }
+    
+    //TODO -- annotations to scan?
+    //EE6TODO 
+//    public void testACImport60_NoDefaultClass() throws Exception {
+//    	runImportTests_All("AC60_NoDefaultClass");
+//    }
+    
+    
+    public void testACImport50_AddToEAR() throws Exception {
+    	runImportTests_All("AC50_AddToEAR");
+    }
+
+    //TODO -- annotations to scan?
+    //EE6TODO 
+//    public void testACImport60_AddToEAR() throws Exception {
+//    	runImportTests_All("AC60_AddToEAR");
+//    }
+    
+    
+    public void testACImport50_InterestingName() throws Exception{
+    	runImportTests_All("AC50_InterestingName");
+    }
+
+    //TODO -- annotations to scan?
+    //EE6TODO 
+//    public void testACImport60_InterestingName() throws Exception{
+//    	runImportTests_All("AC60_InterestingName");
+//    }
+
+    
+    public void testACImport50_AddToEAR_InterestingName() throws Exception{
+    	runImportTests_All("AC50_AddToEAR_InterestingName");
+    }
+
+    //TODO -- annotations to scan?
+    //EE6TODO 
+//    public void testACImport60_AddToEAR_InterestingName() throws Exception{
+//    	runImportTests_All("AC60_AddToEAR_InterestingName");
+//    }
+    
+
+    public void testACImport60_WithDD() throws Exception {
+    	runImportTests_All("AC60_WithDD");
+    }
+
+    public void testACImport60_NoDefaultClass_WithDD() throws Exception {
+    	runImportTests_All("AC60_NoDefaultClass_WithDD");
+    }
+
+    public void testACImport60_AddToEAR_WithDD() throws Exception {
+    	runImportTests_All("AC60_AddToEAR_WithDD");
+    }
+    
+    public void testACImport60_AddToEAR_InterestingName_WithDD() throws Exception {
+    	runImportTests_All("AC60_AddToEAR_InterestingName_WithDD");
+    }
+}
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.jee.tests/jee-tests/org/eclipse/wtp/jee/headless/tests/ejb/operations/AllTests.java b/tests/org.eclipse.jst.jee.tests/jee-tests/org/eclipse/wtp/jee/headless/tests/ejb/operations/AllTests.java
new file mode 100644
index 0000000..b3dc584
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/jee-tests/org/eclipse/wtp/jee/headless/tests/ejb/operations/AllTests.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.wtp.jee.headless.tests.ejb.operations;
+
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+
+public class AllTests extends TestSuite {
+
+    public static Test suite(){
+        return new AllTests();
+    }
+    
+    public AllTests(){
+        super("EJB Operation Tests");
+        addTest(EJBImportOperationTest.suite());
+    }
+    
+}
diff --git a/tests/org.eclipse.jst.jee.tests/jee-tests/org/eclipse/wtp/jee/headless/tests/ejb/operations/EJBImportOperationTest.java b/tests/org.eclipse.jst.jee.tests/jee-tests/org/eclipse/wtp/jee/headless/tests/ejb/operations/EJBImportOperationTest.java
new file mode 100644
index 0000000..c87b65e
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/jee-tests/org/eclipse/wtp/jee/headless/tests/ejb/operations/EJBImportOperationTest.java
@@ -0,0 +1,113 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.wtp.jee.headless.tests.ejb.operations;
+
+import junit.framework.Test;
+
+import org.eclipse.wst.common.tests.SimpleTestSuite;
+import org.eclipse.wtp.j2ee.headless.tests.ejb.operations.EJBImportOperationBaseTest;
+
+
+public class EJBImportOperationTest extends EJBImportOperationBaseTest {
+	public EJBImportOperationTest() {
+		super("EJBImportOperationTests");
+	}
+	
+	public EJBImportOperationTest(String name) {
+		super(name);
+	}
+	
+	public static Test suite() {
+		return new SimpleTestSuite(EJBImportOperationTest.class);
+	}
+	    
+    public void testEJBImport30_Defaults() throws Exception {
+		runImportTests_All("EJB30_Defaults");
+    }
+    //TODO -- annotations to scan?
+    //EE6TODO 
+//    public void testEJBImport31_Defaults() throws Exception {
+//		runImportTests_All("EJB31_Defaults");
+//    }
+    
+    public void testEJBImport30_AddToEAR_Defaults() throws Exception {
+		runImportTests_All("EJB30_AddToEAR_Defaults");
+    }
+    
+    public void testEJBImport31_AddToEAR_Defaults() throws Exception {
+		runImportTests_All("EJB30_AddToEAR_Defaults");
+    }
+
+    public void testEJBImport30_AddToEAR_NoClient() throws Exception {
+		runImportTests_All("EJB30_AddToEAR_NoClient");
+    }
+    
+    //TODO -- annotations to scan?
+    //EE6TODO 
+//    public void testEJBImport31_AddToEAR_NoClient() throws Exception {
+//		runImportTests_All("EJB31_AddToEAR_NoClient");
+//    }
+    
+    public void testEJBImport30_AddToEAR_DifClientName() throws Exception {
+		runImportTests_All("EJB30_AddToEAR_DiffClientName");
+    }
+    
+    //TODO -- annotations to scan?
+    //EE6TODO 
+//    public void testEJBImport31_AddToEAR_DifClientName() throws Exception {
+//		runImportTests_All("EJB31_AddToEAR_DiffClientName");
+//    }
+    
+    public void testEJBImport30_AddToEAR_DiffClientSourceFolder() throws Exception {
+		runImportTests_All("EJB30_AddToEAR_DiffClientSourceFolder");
+    }
+    
+    //TODO -- annotations to scan?
+    //EE6TODO 
+//    public void testEJBImport31_AddToEAR_DiffClientSourceFolder() throws Exception {
+//		runImportTests_All("EJB31_AddToEAR_DiffClientSourceFolder");
+//    }
+    
+    public void testEJBImport30_AddToEAR_DiffClientName_DiffClientSourceFolder() throws Exception {
+		runImportTests_All("EJB30_AddToEAR_DiffClientName_DiffClientSourceFolder");
+    }
+
+    //TODO -- annotations to scan?
+    //EE6TODO 
+//    public void testEJBImport31_AddToEAR_DiffClientName_DiffClientSourceFolder() throws Exception {
+//		runImportTests_All("EJB31_AddToEAR_DiffClientName_DiffClientSourceFolder");
+//    }
+    
+    public void testEJBImport31_Defaults_WithDD() throws Exception {
+		runImportTests_All("EJB31_Defaults_WithDD");
+    }
+    
+    public void testEJBImport31_AddToEAR_Defaults_WithDD() throws Exception {
+		runImportTests_All("EJB31_AddToEAR_Defaults_WithDD");
+    }
+
+    public void testEJBImport31_AddToEAR_NoClient_WithDD() throws Exception {
+		runImportTests_All("EJB31_AddToEAR_NoClient_WithDD");
+    }
+    
+    public void testEJBImport31_AddToEAR_DiffClientName_WithDD() throws Exception {
+		runImportTests_All("EJB31_AddToEAR_DiffClientName_WithDD");
+    }
+    
+    public void testEJBImport31_AddToEAR_DiffClientSourceFolder_WithDD() throws Exception {
+		runImportTests_All("EJB31_AddToEAR_DiffClientSourceFolder_WithDD");
+    }
+    
+    public void testEJBImport31_AddToEAR_DiffClientName_DiffClientSourceFolder_WithDD() throws Exception {
+		runImportTests_All("EJB31_AddToEAR_DiffClientName_DiffClientSourceFolder_WithDD");
+    }
+}
diff --git a/tests/org.eclipse.jst.jee.tests/jee-tests/org/eclipse/wtp/jee/headless/tests/plugin/AllPluginTests.java b/tests/org.eclipse.jst.jee.tests/jee-tests/org/eclipse/wtp/jee/headless/tests/plugin/AllPluginTests.java
new file mode 100644
index 0000000..3f72a6c
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/jee-tests/org/eclipse/wtp/jee/headless/tests/plugin/AllPluginTests.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+
+package org.eclipse.wtp.jee.headless.tests.plugin;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.core.runtime.Path;
+import org.eclipse.wst.server.core.IRuntime;
+import org.eclipse.wst.server.core.IRuntimeType;
+import org.eclipse.wst.server.core.IRuntimeWorkingCopy;
+import org.eclipse.wst.server.core.ServerCore;
+
+
+public class AllPluginTests extends TestSuite {
+	
+	public static IRuntime JONAS_SERVER = createJONASRuntime();
+
+    public static Test suite() {
+        return new AllPluginTests();
+    }
+
+	public AllPluginTests() {
+		super();
+		addTest(org.eclipse.jst.jee.tests.bvt.EnterpriseBVT.suite());
+		addTest(org.eclipse.jst.jee.tests.bvt.EJBBVT.suite());
+		addTest(org.eclipse.jst.jee.tests.bvt.WebBVT.suite());
+	}
+    
+    public static IRuntime createJONASRuntime()  {
+    	String s = System.getProperty("org.eclipse.jst.server.jonas.432");
+    	if (s == null || s.length() == 0)
+    		return null;
+    	try {
+    		IRuntimeType rt = ServerCore.findRuntimeType("org.eclipse.jst.server.core.runtimeType");
+    		IRuntimeWorkingCopy wc = rt.createRuntime(null, null);
+    		wc.setLocation(new Path(s));
+    		return wc.save(true, null);
+    	} catch (Exception e) {
+    		e.printStackTrace();
+    		return null;
+    	}
+    }
+
+}
diff --git a/tests/org.eclipse.jst.jee.tests/jee-tests/org/eclipse/wtp/jee/headless/tests/plugin/HeadlessTestsPlugin.java b/tests/org.eclipse.jst.jee.tests/jee-tests/org/eclipse/wtp/jee/headless/tests/plugin/HeadlessTestsPlugin.java
new file mode 100644
index 0000000..134031f
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/jee-tests/org/eclipse/wtp/jee/headless/tests/plugin/HeadlessTestsPlugin.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.wtp.jee.headless.tests.plugin;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.Plugin;
+import org.eclipse.wst.common.tests.DataModelVerifierFactory;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.verifiers.DataModelVerifierListGenerator;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The main plugin class to be used in the desktop.
+ */
+public class HeadlessTestsPlugin extends Plugin {
+	//The shared instance.
+	private static HeadlessTestsPlugin plugin;
+	//Resource bundle.
+	private ResourceBundle resourceBundle;
+	
+	/**
+	 * The constructor.
+	 */
+	public HeadlessTestsPlugin() {
+		super();
+		plugin = this;
+		try {
+			resourceBundle= ResourceBundle.getBundle("org.eclipse.wtp.jee.wb.tests.TestsPluginResources");
+		} catch (MissingResourceException x) {
+			resourceBundle = null;
+		}
+	}
+
+	/**
+	 * Returns the shared instance.
+	 */
+	public static HeadlessTestsPlugin getDefault() {
+		return plugin;
+	}
+
+	/**
+	 * Returns the workspace instance.
+	 */
+	public static IWorkspace getWorkspace() {
+		return ResourcesPlugin.getWorkspace();
+	}
+
+	/**
+	 * Returns the string from the plugin's resource bundle,
+	 * or 'key' if not found.
+	 */
+	public static String getResourceString(String key) {
+		ResourceBundle bundle= getDefault().getResourceBundle();
+		try {
+			return (bundle!=null ? bundle.getString(key) : key);
+		} catch (MissingResourceException e) {
+			return key;
+		}
+	}
+	
+	@Override
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+		
+		//needed so that jee operation tests will verify correctly
+		DataModelVerifierFactory.getInstance().addToDataModelVerifiersMap(DataModelVerifierListGenerator.getVerifiers());
+	}
+	
+	/**
+	 * Returns the plugin's resource bundle,
+	 */
+	public ResourceBundle getResourceBundle() {
+		return resourceBundle;
+	}
+}
diff --git a/tests/org.eclipse.jst.jee.tests/jee-tests/org/eclipse/wtp/jee/headless/tests/web/operations/AllTests.java b/tests/org.eclipse.jst.jee.tests/jee-tests/org/eclipse/wtp/jee/headless/tests/web/operations/AllTests.java
new file mode 100644
index 0000000..bb6e47a
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/jee-tests/org/eclipse/wtp/jee/headless/tests/web/operations/AllTests.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+
+package org.eclipse.wtp.jee.headless.tests.web.operations;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+public class AllTests extends TestSuite {
+	
+    public static Test suite(){
+        return new AllTests();
+    }
+    
+    public AllTests(){
+       super("Web Operation, Servlet, & Deploy Tests");
+       addTest(WebImportOperationTest.suite());
+    }    
+}
diff --git a/tests/org.eclipse.jst.jee.tests/jee-tests/org/eclipse/wtp/jee/headless/tests/web/operations/WebImportOperationTest.java b/tests/org.eclipse.jst.jee.tests/jee-tests/org/eclipse/wtp/jee/headless/tests/web/operations/WebImportOperationTest.java
new file mode 100644
index 0000000..fb958de
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/jee-tests/org/eclipse/wtp/jee/headless/tests/web/operations/WebImportOperationTest.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+
+package org.eclipse.wtp.jee.headless.tests.web.operations;
+
+import junit.framework.Test;
+
+import org.eclipse.wst.common.tests.SimpleTestSuite;
+import org.eclipse.wtp.j2ee.headless.tests.web.operations.WebImportOperationBaseTest;
+
+public class WebImportOperationTest extends WebImportOperationBaseTest {
+
+	public WebImportOperationTest() {
+		super("WebImportOperationTests");
+	}
+	
+	public WebImportOperationTest(String name) {
+		super(name);
+	}
+	
+	public static Test suite() {
+		return new SimpleTestSuite(WebImportOperationTest.class);
+	}
+	
+	public void testWebImport25_Defaults() throws Exception {
+		runImportTests_All("Web25_Defaults");
+	}	
+	
+	public void testWebImport25_DiffContentDir() throws Exception {
+		runImportTests_All("Web25_DiffContentDir");
+	}
+		
+	public void testWebImport25_DiffSrcDir() throws Exception {
+		runImportTests_All("Web25_DiffSrcDir");
+	}
+
+	public void testWebImport25_DiffContentDir_DiffSrcDir() throws Exception {
+		runImportTests_All("Web25_DiffContentDir_DiffSrcDir");
+	}
+	
+	public void testWebImport25_Defaults_WithEAR() throws Exception {
+		runImportTests_All("Web25_Defaults_WithEAR");
+	}
+	
+	public void testWebImport25_DiffContextRoot_WithEAR() throws Exception {
+		runImportTests_All("Web25_DiffContextRoot_WithEAR");
+	}
+
+	public void testWebImport25_DiffContentDir_WithEAR() throws Exception {
+		runImportTests_All("Web25_DiffContentDir_WithEAR");
+	}
+	
+	public void testWebImport25_DiffSrcDir_WithEAR() throws Exception {
+		runImportTests_All("Web25_DiffSrcDir_WithEAR");
+	}
+	
+	public void testWebImport25_DiffContextRoot_DiffContentDir_WithEAR() throws Exception {
+		runImportTests_All("Web25_DiffContextRoot_DiffContentDir_WithEAR");
+	}
+	
+	public void testWebImport25_DiffContextRoot_DiffSrcDir_WithEAR() throws Exception {
+		runImportTests_All("Web25_DiffContextRoot_DiffSrcDir_WithEAR");
+	}
+	
+	public void testWebImport25_DiffContentDir_DiffSrcDir_WithEAR() throws Exception {
+		runImportTests_All("Web25_DiffContentDir_DiffSrcDir_WithEAR");
+	}
+
+	public void testWebImport25_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR() throws Exception {
+		runImportTests_All("Web25_DiffContextRoot_DiffContentDir_DiffSrcDir_WithEAR");
+	}
+}
diff --git a/tests/org.eclipse.jst.jee.tests/plugin.properties b/tests/org.eclipse.jst.jee.tests/plugin.properties
new file mode 100644
index 0000000..a8f2ce8
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/plugin.properties
@@ -0,0 +1,12 @@
+###############################################################################
+# Copyright (c) 2010 IBM 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:
+# IBM Corporation - initial API and implementation
+###############################################################################
+#Properties file for org.eclipse.jst.jee.tests
+Bundle-Name = JEE Tests Plug-in
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.jee.tests/plugin.xml b/tests/org.eclipse.jst.jee.tests/plugin.xml
new file mode 100644
index 0000000..a95eea2
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/plugin.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+
+
+
+   
+   
+
+</plugin>
diff --git a/tests/org.eclipse.jst.jee.tests/pom.xml b/tests/org.eclipse.jst.jee.tests/pom.xml
new file mode 100644
index 0000000..c12cb16
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/pom.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Copyright (c) 2012, 2013 Eclipse Foundation and others.
+  All rights reserved. This program and the accompanying materials
+  are made available under the terms of the Eclipse Distribution License v1.0
+  which accompanies this distribution, and is available at
+  http://www.eclipse.org/org/documents/edl-v10.php
+ 
+  Contributors:
+    Thanh Ha (Eclipse Foundation) - initial implementation
+-->
+
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.eclipse.webtools.javaee</groupId>
+    <artifactId>javaee.tests</artifactId>
+    <version>3.6.0-SNAPSHOT</version>
+  </parent>
+
+  <groupId>org.eclipse.webtools.javaee</groupId>
+  <artifactId>org.eclipse.jst.jee.tests</artifactId>
+  <version>1.0.0-SNAPSHOT</version>
+  <packaging>eclipse-plugin</packaging>
+  
+  <!-- Do not sign inner jars, see bug 274743 - Some unit tests are sensitive to details of build -->
+  <profiles>
+   <profile>
+     <id>eclipse-sign</id>
+     <build>
+       <plugins>
+         <plugin>
+           <groupId>org.eclipse.cbi.maven.plugins</groupId>
+           <artifactId>eclipse-jarsigner-plugin</artifactId>
+           <version>${cbi-plugins.version}</version>
+           <executions>
+             <execution>
+               <id>sign</id>
+               <phase>verify</phase>
+               <goals>
+                 <goal>sign</goal>
+               </goals>
+               <configuration>
+                 <excludeInnerJars>true</excludeInnerJars>
+               </configuration>
+             </execution>
+           </executions>
+         </plugin>
+       </plugins>
+     </build>
+   </profile>
+ </profiles>
+  
+</project>
diff --git a/tests/org.eclipse.jst.jee.tests/test.xml b/tests/org.eclipse.jst.jee.tests/test.xml
new file mode 100644
index 0000000..df8e3e9
--- /dev/null
+++ b/tests/org.eclipse.jst.jee.tests/test.xml
@@ -0,0 +1,96 @@
+<?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}\..\.." />
+
+	<!-- sets the properties eclipse-home, and library-file -->
+	<property name="plugin-name" value="org.eclipse.jst.jee.tests" />
+	<property name="library-file" value="${eclipse-home}/plugins/org.eclipse.test_3.3.0/library.xml" />
+	<property name="extraVMargs" value="-Dorg.eclipse.jst.server.jonas.432=${jonas432Dir}" />
+
+	<property name="workspace" value="${basedir}/${plugin-name}" />
+
+	<!-- Read the properties that will enable/disable the different targets below. -->
+	<property file="bvt.properties" />
+	<property name="org.eclipse.jst.jee.tests.bvt.EnterpriseBVT" value="true" />
+	<property name="org.eclipse.jst.jee.tests.bvt.EJBBVT" value="true" />
+	<property name="org.eclipse.jst.jee.tests.bvt.WebBVT" value="true" />
+
+	<!-- 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*.xml" />
+		</delete>
+		<delete dir="${workspace}" quiet="true" />
+	</target>
+
+	<target name="AutomatedBVTSuite" if="org.eclipse.jst.jee.tests.bvt.ALL">
+		<ant target="core-test" antfile="${library-file}" dir="${eclipse-home}">
+			<property name="data-dir" value="${workspace}" />
+			<property name="plugin-name" value="${plugin-name}" />
+			<property name="classname" value="org.eclipse.jst.jee.tests.bvt.AutomatedBVT" />
+			<property name="extraVMargs" value="${extraVMargs}" />
+		</ant>
+		<antcall target="cleanup"/>
+	</target>
+
+	<target name="EnterpriseBVTSuite" if="org.eclipse.jst.jee.tests.bvt.EnterpriseBVT" unless="org.eclipse.jst.jee.tests.bvt.ALL">
+		<ant target="core-test" antfile="${library-file}" dir="${eclipse-home}">
+			<property name="data-dir" value="${workspace}" />
+			<property name="plugin-name" value="${plugin-name}" />
+			<property name="classname" value="org.eclipse.jst.jee.tests.bvt.EnterpriseBVT" />
+			<property name="extraVMargs" value="${extraVMargs}" />
+		</ant>
+		<antcall target="cleanup"/>
+	</target>
+
+	<target name="WebBVTSuite" if="org.eclipse.jst.jee.tests.bvt.WebBVT" unless="org.eclipse.jst.jee.tests.bvt.ALL">
+		<ant target="core-test" antfile="${library-file}" dir="${eclipse-home}">
+			<property name="data-dir" value="${workspace}" />
+			<property name="plugin-name" value="${plugin-name}" />
+			<property name="classname" value="org.eclipse.jst.jee.tests.bvt.WebBVT" />
+			<property name="extraVMargs" value="${extraVMargs}" />
+		</ant>
+		<antcall target="cleanup"/>
+	</target>
+
+	<target name="EJBBVTSuite" if="org.eclipse.jst.jee.tests.bvt.EJBBVT" unless="org.eclipse.jst.jee.tests.bvt.ALL">
+		<ant target="core-test" antfile="${library-file}" dir="${eclipse-home}">
+			<property name="data-dir" value="${workspace}" />
+			<property name="plugin-name" value="${plugin-name}" />
+			<property name="classname" value="org.eclipse.jst.jee.tests.bvt.EJBBVT" />
+			<property name="extraVMargs" value="${extraVMargs}" />
+		</ant>
+		<antcall target="cleanup"/>
+	</target>
+
+
+	<!-- This target defines the tests that need to be run. -->
+	<target name="suite" depends="AutomatedBVTSuite, EnterpriseBVTSuite, WebBVTSuite, EJBBVTSuite">
+	</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">
+		<delete dir="${workspace}" quiet="true" />
+	</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*.xml" />
+			<property name="output-file" value="${plugin-name}.xml" />
+		</ant>
+	</target>
+
+</project>
+
+
+
diff --git a/tests/org.eclipse.jst.servlet.tests/.classpath b/tests/org.eclipse.jst.servlet.tests/.classpath
new file mode 100644
index 0000000..95657ee
--- /dev/null
+++ b/tests/org.eclipse.jst.servlet.tests/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="webmodule-tomcat-tests"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/tests/org.eclipse.jst.servlet.tests/.cvsignore b/tests/org.eclipse.jst.servlet.tests/.cvsignore
new file mode 100644
index 0000000..3336e34
--- /dev/null
+++ b/tests/org.eclipse.jst.servlet.tests/.cvsignore
@@ -0,0 +1,5 @@
+bin
+temp.folder
+build.xml
+ui.jar
+tests.jar
diff --git a/tests/org.eclipse.jst.servlet.tests/.project b/tests/org.eclipse.jst.servlet.tests/.project
new file mode 100644
index 0000000..732c1cf
--- /dev/null
+++ b/tests/org.eclipse.jst.servlet.tests/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.jst.j2ee.servlet.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/tests/org.eclipse.jst.servlet.tests/.settings/org.eclipse.jdt.core.prefs b/tests/org.eclipse.jst.servlet.tests/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..f9abbd1
--- /dev/null
+++ b/tests/org.eclipse.jst.servlet.tests/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+#Sun Jun 03 01:24:17 EDT 2007
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
+org.eclipse.jdt.core.compiler.compliance=1.4
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning
+org.eclipse.jdt.core.compiler.source=1.3
diff --git a/tests/org.eclipse.jst.servlet.tests/META-INF/MANIFEST.MF b/tests/org.eclipse.jst.servlet.tests/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..1189cc2
--- /dev/null
+++ b/tests/org.eclipse.jst.servlet.tests/META-INF/MANIFEST.MF
@@ -0,0 +1,27 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %PLUGIN
+Bundle-SymbolicName: org.eclipse.jst.servlet.tests
+Bundle-Version: 1.1.400.qualifier
+Bundle-ClassPath: tests.jar
+Bundle-Activator: org.eclipse.jst.servlet.tests.ServletTestsPlugin
+Bundle-Vendor: %Bundle-Vendor.0
+Bundle-Localization: plugin
+Export-Package: org.eclipse.jst.servlet.tests,
+ org.eclipse.jst.servlet.tests.bvt,
+ org.eclipse.jst.servlet.tomcat.tests
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.core.commands,
+ org.eclipse.jst.common.frameworks,
+ org.eclipse.wst.common.frameworks,
+ org.eclipse.jst.j2ee.core,
+ org.eclipse.jst.j2ee.web,
+ org.eclipse.wst.common.tests,
+ org.junit,
+ org.eclipse.jst.j2ee.tests,
+ org.eclipse.jst.j2ee,
+ org.eclipse.wst.server.core,
+ org.eclipse.wst.common.modulecore,
+ org.eclipse.wst.common.project.facet.core
+Eclipse-LazyStart: true
+Bundle-RequiredExecutionEnvironment: J2SE-1.4
diff --git a/tests/org.eclipse.jst.servlet.tests/WARImportTests/Example1.war b/tests/org.eclipse.jst.servlet.tests/WARImportTests/Example1.war
new file mode 100644
index 0000000..9c30a38
--- /dev/null
+++ b/tests/org.eclipse.jst.servlet.tests/WARImportTests/Example1.war
Binary files differ
diff --git a/tests/org.eclipse.jst.servlet.tests/WARImportTests/Test12Web.war b/tests/org.eclipse.jst.servlet.tests/WARImportTests/Test12Web.war
new file mode 100644
index 0000000..ba220b1
--- /dev/null
+++ b/tests/org.eclipse.jst.servlet.tests/WARImportTests/Test12Web.war
Binary files differ
diff --git a/tests/org.eclipse.jst.servlet.tests/WARImportTests/Test13Web.war b/tests/org.eclipse.jst.servlet.tests/WARImportTests/Test13Web.war
new file mode 100644
index 0000000..22aa926
--- /dev/null
+++ b/tests/org.eclipse.jst.servlet.tests/WARImportTests/Test13Web.war
Binary files differ
diff --git a/tests/org.eclipse.jst.servlet.tests/WARImportTests/Test14Web.war b/tests/org.eclipse.jst.servlet.tests/WARImportTests/Test14Web.war
new file mode 100644
index 0000000..1eb2a3f
--- /dev/null
+++ b/tests/org.eclipse.jst.servlet.tests/WARImportTests/Test14Web.war
Binary files differ
diff --git a/tests/org.eclipse.jst.servlet.tests/WARImportTests/YourCompanyExample.war b/tests/org.eclipse.jst.servlet.tests/WARImportTests/YourCompanyExample.war
new file mode 100644
index 0000000..1c9628c
--- /dev/null
+++ b/tests/org.eclipse.jst.servlet.tests/WARImportTests/YourCompanyExample.war
Binary files differ
diff --git a/docs/org.eclipse.wst.web.ui.infopop/about.html b/tests/org.eclipse.jst.servlet.tests/about.html
similarity index 100%
copy from docs/org.eclipse.wst.web.ui.infopop/about.html
copy to tests/org.eclipse.jst.servlet.tests/about.html
diff --git a/tests/org.eclipse.jst.servlet.tests/build.properties b/tests/org.eclipse.jst.servlet.tests/build.properties
new file mode 100644
index 0000000..a5c1353
--- /dev/null
+++ b/tests/org.eclipse.jst.servlet.tests/build.properties
@@ -0,0 +1,18 @@
+###############################################################################
+# Copyright (c) 2005, 2007 IBM 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:
+#     IBM Corporation - initial API and implementation
+###############################################################################
+source.tests.jar = webmodule-tomcat-tests/
+output.tests.jar = bin/
+bin.includes = tests.jar,\
+               WARImportTests/,\
+               testHOLD.xml,\
+               about.html,\
+               plugin.properties,\
+               META-INF/
diff --git a/tests/org.eclipse.jst.servlet.tests/plugin.properties b/tests/org.eclipse.jst.servlet.tests/plugin.properties
new file mode 100644
index 0000000..5da3c3c
--- /dev/null
+++ b/tests/org.eclipse.jst.servlet.tests/plugin.properties
@@ -0,0 +1,13 @@
+###############################################################################
+# Copyright (c) 2003, 2007 IBM 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:
+# IBM Corporation - initial API and implementation
+###############################################################################
+
+PLUGIN=org.eclipse.jst.servlet.tests
+Bundle-Vendor.0 = Eclipse Web Tools Platform
diff --git a/tests/org.eclipse.jst.servlet.tests/pom.xml b/tests/org.eclipse.jst.servlet.tests/pom.xml
new file mode 100644
index 0000000..13b5b2b
--- /dev/null
+++ b/tests/org.eclipse.jst.servlet.tests/pom.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Copyright (c) 2012, 2013 Eclipse Foundation and others.
+  All rights reserved. This program and the accompanying materials
+  are made available under the terms of the Eclipse Distribution License v1.0
+  which accompanies this distribution, and is available at
+  http://www.eclipse.org/org/documents/edl-v10.php
+ 
+  Contributors:
+    Thanh Ha (Eclipse Foundation) - initial implementation
+-->
+
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.eclipse.webtools.javaee</groupId>
+    <artifactId>javaee.tests</artifactId>
+    <version>3.6.0-SNAPSHOT</version>
+  </parent>
+
+  <groupId>org.eclipse.webtools.javaee</groupId>
+  <artifactId>org.eclipse.jst.servlet.tests</artifactId>
+  <version>1.1.400-SNAPSHOT</version>
+  <packaging>eclipse-plugin</packaging>
+</project>
diff --git a/tests/org.eclipse.jst.servlet.tests/testHOLD.xml b/tests/org.eclipse.jst.servlet.tests/testHOLD.xml
new file mode 100644
index 0000000..cbbb98f
--- /dev/null
+++ b/tests/org.eclipse.jst.servlet.tests/testHOLD.xml
@@ -0,0 +1,50 @@
+<?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.servlet.tests"/>
+  <property name="library-file" value="${eclipse-home}/plugins/org.eclipse.test_3.1.0/library.xml"/>
+  <property name="extraVMargs" value="-Dorg.eclipse.jst.server.tomcat.50=${testDir}/${tomcat50Dir}"/>
+
+  <!-- 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*.xml"/>
+    </delete>
+  </target>
+
+  <!-- This target defines the tests that need to be run. -->
+  <target name="suite">
+    <property name="jst-folder" value="${eclipse-home}/jst_folder"/>
+    <delete dir="${jst-folder}" quiet="true"/>
+    <ant target="core-test" antfile="${library-file}" dir="${eclipse-home}">
+      <property name="data-dir" value="${jst-folder}"/>
+      <property name="plugin-name" value="${plugin-name}"/>
+      <property name="classname" value="org.eclipse.jst.servlet.tests.bvt.AutomatedBVT" />
+   	  <property name="extraVMargs" value="${extraVMargs}"/>
+    </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*.xml"/>
+      <property name="output-file" value="${plugin-name}.xml"/>
+    </ant>
+  </target>
+</project>
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.servlet.tests/webmodule-tomcat-tests/org/eclipse/jst/servlet/tests/ServletTestsPlugin.java b/tests/org.eclipse.jst.servlet.tests/webmodule-tomcat-tests/org/eclipse/jst/servlet/tests/ServletTestsPlugin.java
new file mode 100644
index 0000000..34b2a7a
--- /dev/null
+++ b/tests/org.eclipse.jst.servlet.tests/webmodule-tomcat-tests/org/eclipse/jst/servlet/tests/ServletTestsPlugin.java
@@ -0,0 +1,74 @@
+package org.eclipse.jst.servlet.tests;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+import org.eclipse.core.runtime.Plugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The main plugin class to be used in the desktop.
+ */
+public class ServletTestsPlugin extends Plugin {
+	//The shared instance.
+	private static ServletTestsPlugin plugin;
+	//Resource bundle.
+	private ResourceBundle resourceBundle;
+	
+	/**
+	 * The constructor.
+	 */
+	public ServletTestsPlugin() {
+		super();
+		plugin = this;
+	}
+
+	/**
+	 * This method is called upon plug-in activation
+	 */
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+	}
+
+	/**
+	 * This method is called when the plug-in is stopped
+	 */
+	public void stop(BundleContext context) throws Exception {
+		super.stop(context);
+		plugin = null;
+		resourceBundle = null;
+	}
+
+	/**
+	 * Returns the shared instance.
+	 */
+	public static ServletTestsPlugin getDefault() {
+		return plugin;
+	}
+
+	/**
+	 * Returns the string from the plugin's resource bundle,
+	 * or 'key' if not found.
+	 */
+	public static String getResourceString(String key) {
+		ResourceBundle bundle = ServletTestsPlugin.getDefault().getResourceBundle();
+		try {
+			return (bundle != null) ? bundle.getString(key) : key;
+		} catch (MissingResourceException e) {
+			return key;
+		}
+	}
+
+	/**
+	 * Returns the plugin's resource bundle,
+	 */
+	public ResourceBundle getResourceBundle() {
+		try {
+			if (resourceBundle == null)
+				resourceBundle = ResourceBundle.getBundle("org.eclipse.jst.servlet.tests.ServletTestsPluginResources"); //$NON-NLS-1$
+		} catch (MissingResourceException x) {
+			resourceBundle = null;
+		}
+		return resourceBundle;
+	}
+}
diff --git a/tests/org.eclipse.jst.servlet.tests/webmodule-tomcat-tests/org/eclipse/jst/servlet/tests/bvt/AutomatedBVT.java b/tests/org.eclipse.jst.servlet.tests/webmodule-tomcat-tests/org/eclipse/jst/servlet/tests/bvt/AutomatedBVT.java
new file mode 100644
index 0000000..69b2b28
--- /dev/null
+++ b/tests/org.eclipse.jst.servlet.tests/webmodule-tomcat-tests/org/eclipse/jst/servlet/tests/bvt/AutomatedBVT.java
@@ -0,0 +1,60 @@
+/*
+ * Created on Apr 1, 2003
+ *
+ * To change this generated comment go to 
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+package org.eclipse.jst.servlet.tests.bvt;
+
+import java.net.URL;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+import junit.textui.TestRunner;
+
+import org.eclipse.core.runtime.Platform;
+
+
+/**
+ * @author jsholl
+ *
+ * To change this generated comment go to 
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+public class AutomatedBVT extends TestSuite {
+
+    public static String baseDirectory = System.getProperty("user.dir") + java.io.File.separatorChar + "WARImportTests" + java.io.File.separatorChar; //$NON-NLS-1$ //$NON-NLS-2$
+    
+    static {
+        try {
+            URL url = Platform.getBundle("org.eclipse.jst.servlet.tests").getEntry("/"); //$NON-NLS-1$ //$NON-NLS-2$
+        	AutomatedBVT.baseDirectory = Platform.asLocalURL(url).getFile() + "TestData"+ java.io.File.separatorChar; //$NON-NLS-1$
+		} catch (Exception e) { 
+			System.err.println("Using working directory since a workspace URL could not be located."); //$NON-NLS-1$
+		} 
+    }
+
+    public static int unimplementedMethods;
+
+    public static void main(String[] args) {
+        unimplementedMethods = 0;
+        TestRunner.run(suite());
+        if (unimplementedMethods > 0) {
+            System.out.println("\nCalls to warnUnimpl: " + unimplementedMethods); //$NON-NLS-1$
+        }
+    }
+
+    public AutomatedBVT() {
+        super();
+        TestSuite suite = (TestSuite) AutomatedBVT.suite();
+        for (int i = 0; i < suite.testCount(); i++) {
+            addTest(suite.testAt(i));
+        }
+    }
+
+    public static Test suite() {
+        TestSuite suite = new TestSuite("Test for org.eclipse.jst.servlet.tests.bvt"); //$NON-NLS-1$
+        //suite.addTest(AllTomcatTests.suite());
+        return suite;
+    }
+}
diff --git a/tests/org.eclipse.jst.servlet.tests/webmodule-tomcat-tests/org/eclipse/jst/servlet/tests/bvt/AutomatedBVTEclipse.java b/tests/org.eclipse.jst.servlet.tests/webmodule-tomcat-tests/org/eclipse/jst/servlet/tests/bvt/AutomatedBVTEclipse.java
new file mode 100644
index 0000000..f71ff0c
--- /dev/null
+++ b/tests/org.eclipse.jst.servlet.tests/webmodule-tomcat-tests/org/eclipse/jst/servlet/tests/bvt/AutomatedBVTEclipse.java
@@ -0,0 +1,31 @@
+/*
+ * Created on Mar 25, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package org.eclipse.jst.servlet.tests.bvt;
+
+import java.io.IOException;
+import java.net.URL;
+
+import org.eclipse.core.runtime.Platform;
+
+/**
+ * @author jsholl
+ *
+ * To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+public class AutomatedBVTEclipse extends AutomatedBVT {
+	
+	public AutomatedBVTEclipse(){
+		super();
+		URL url = Platform.getBundle("org.eclipse.jst.servlet.tests").getEntry("/"); //$NON-NLS-1$ //$NON-NLS-2$
+        try {
+        	AutomatedBVT.baseDirectory = Platform.asLocalURL(url).getFile() + "WARImportTests"+ java.io.File.separatorChar; //$NON-NLS-1$
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+}
diff --git a/tests/org.eclipse.jst.servlet.tests/webmodule-tomcat-tests/org/eclipse/jst/servlet/tomcat/tests/AllTomcatTests.java b/tests/org.eclipse.jst.servlet.tests/webmodule-tomcat-tests/org/eclipse/jst/servlet/tomcat/tests/AllTomcatTests.java
new file mode 100644
index 0000000..948e35e
--- /dev/null
+++ b/tests/org.eclipse.jst.servlet.tests/webmodule-tomcat-tests/org/eclipse/jst/servlet/tomcat/tests/AllTomcatTests.java
@@ -0,0 +1,55 @@
+/*
+ * Created on Feb 2, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package org.eclipse.jst.servlet.tomcat.tests;
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.core.runtime.Path;
+import org.eclipse.wst.server.core.IRuntime;
+import org.eclipse.wst.server.core.IRuntimeType;
+import org.eclipse.wst.server.core.IRuntimeWorkingCopy;
+import org.eclipse.wst.server.core.ServerCore;
+
+/**
+ * @author jsholl
+ *
+ * To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+public class AllTomcatTests extends TestSuite {
+	
+	public static IRuntime TOMCAT_RUNTIME = createRuntime();
+	
+    public static Test suite(){
+        return new AllTomcatTests();
+    }
+    
+    public AllTomcatTests(){
+        super("WEB Tests"); //$NON-NLS-1$
+        addTest(WebProjectCreationTomcatTest.suite());
+        addTest(WebImportOperationTomcatTest.suite());
+        addTest(WebExportOperationTomcatTest.suite());
+        
+    }
+    
+    public static IRuntime createRuntime()  {
+    	String s = System.getProperty("org.eclipse.jst.server.tomcat.50"); //$NON-NLS-1$
+    	
+    	if (s == null || s.length() == 0)
+    		return null;
+    	try {
+    		IRuntimeType rt = ServerCore.findRuntimeType("org.eclipse.jst.server.tomcat.runtime.50"); //$NON-NLS-1$
+    		IRuntimeWorkingCopy wc = rt.createRuntime(null, null);
+    		wc.setLocation(new Path(s));
+    		return wc.save(true, null);
+    	} catch (Exception e) {
+    		e.printStackTrace();
+    		return null;
+    	}
+    }
+    
+}
diff --git a/tests/org.eclipse.jst.servlet.tests/webmodule-tomcat-tests/org/eclipse/jst/servlet/tomcat/tests/WebExportOperationTomcatTest.java b/tests/org.eclipse.jst.servlet.tests/webmodule-tomcat-tests/org/eclipse/jst/servlet/tomcat/tests/WebExportOperationTomcatTest.java
new file mode 100644
index 0000000..926b017
--- /dev/null
+++ b/tests/org.eclipse.jst.servlet.tests/webmodule-tomcat-tests/org/eclipse/jst/servlet/tomcat/tests/WebExportOperationTomcatTest.java
@@ -0,0 +1,157 @@
+/*
+ * Created on Jan 6, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package org.eclipse.jst.servlet.tomcat.tests;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.Test;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jst.j2ee.application.internal.operations.J2EEComponentExportDataModelProvider;
+import org.eclipse.jst.j2ee.internal.web.archive.operations.WebComponentExportDataModelProvider;
+import org.eclipse.jst.j2ee.project.JavaEEProjectUtilities;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.tests.ProjectUtility;
+import org.eclipse.wst.common.tests.SimpleTestSuite;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleExportOperationTest;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleImportOperationTest;
+
+/**
+ * @author Administrator
+ * 
+ * To change the template for this generated type comment go to Window - Preferences - Java - Code
+ * Generation - Code and Comments
+ */
+public class WebExportOperationTomcatTest extends ModuleExportOperationTest {
+
+	protected boolean excludeCompileJsp = false;
+	protected boolean exportSourceFiles = false;
+	protected boolean overwriteExisting = false;
+	protected boolean dataModelShouldBeValid = true;
+
+	public WebExportOperationTomcatTest(String name) {
+		super(name);
+	}
+
+	public static Test suite() {
+		return new SimpleTestSuite(WebExportOperationTomcatTest.class);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.OperationTestCase#setUp()
+	 */
+	protected void setUp() throws Exception {
+		super.setUp();
+		excludeCompileJsp = false;
+	}
+
+	public void testExcludeCompileJspOn() throws Exception {
+		excludeCompileJsp = true;
+		testAllExportTestCases();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleExportOperationTestCase#getModelInstance()
+	 */
+	protected IDataModel getModelInstance() {
+		return DataModelFactory.createDataModel(new WebComponentExportDataModelProvider());
+	}
+	protected IProject[] getExportableProjects() throws Exception {
+		
+		deleteAllProjects();
+		WebImportOperationTomcatTest importTestCase = (WebImportOperationTomcatTest)getImportTestCase(); 
+		importTestCase.testAllImportTestCases();
+
+		// if the projects aren't created successfully, the previous
+		// line will fail so there's no need to verify
+		IProject[] projs = ProjectUtility.getAllProjects();
+		
+		List filteredProjs = new ArrayList();
+		for (int i = 0; i < projs.length; i++) {
+			IProject project = projs[i];
+			if (JavaEEProjectUtilities.isDynamicWebProject(project))
+				filteredProjs.add(project);
+		}
+		return (IProject[]) filteredProjs.toArray(new IProject[filteredProjs.size()]);
+		
+	}
+	
+	public void testAllExportTestCases() throws Exception {
+
+		File exportDirectory = new File(BASE_DATA_DIR);
+		if (exportDirectory.isDirectory()) {
+			File[] contents = exportDirectory.listFiles();
+			for (int i = 0; i < contents.length; i++) {
+				if (!contents[i].isDirectory())
+					contents[i].delete();
+			}
+		}
+		IProject[] projects = getExportableProjects();
+		for (int i = 0; i < projects.length; i++) {
+			testExport(ComponentCore.createComponent(projects[i]), getFileName(projects[i].getName()));
+		}
+	}
+	
+	public String getFileName(String baseName) {
+		StringBuffer result = new StringBuffer(baseName);
+		result.append((exportSourceFiles) ? "_withSource" : "_withoutSource").append(getModuleExtension());
+		return result.toString();
+	}
+	
+	public void testExport(IVirtualComponent component, String filename) throws Exception {
+		IDataModel dataModel = getModelInstance();
+		dataModel.setProperty(J2EEComponentExportDataModelProvider.ARCHIVE_DESTINATION, BASE_DATA_DIR + filename);
+		dataModel.setProperty(J2EEComponentExportDataModelProvider.COMPONENT, component);
+		dataModel.setBooleanProperty(J2EEComponentExportDataModelProvider.EXPORT_SOURCE_FILES, exportSourceFiles);
+		dataModel.setBooleanProperty(J2EEComponentExportDataModelProvider.OVERWRITE_EXISTING, overwriteExisting);
+
+		if (dataModelShouldBeValid)
+			runAndVerify(dataModel);
+		else
+			verifyInvalidDataModel(dataModel);
+	}
+
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleExportOperationTestCase#getImportTestCase()
+	 */
+	protected ModuleImportOperationTest getImportTestCase() {
+		return new WebImportOperationTomcatTest(""); //$NON-NLS-1$
+	}
+	
+
+	protected void addJavaFilesToProject(String projectName,
+			String[] classNames, String prackageName) throws Exception {
+	}
+
+	protected void verifyJavaFilesExported(String archivePath,
+			String[] classNames, String packageName, boolean withClassFiles,
+			boolean withSource) throws Exception {
+		
+	}
+
+	protected IDataModel getExportDataModel(String projectName,
+			String destination, boolean exportSource, boolean runBuild,
+			boolean overwriteExisting) {
+		return null;
+	}
+
+	protected String getModuleExtension() {
+		return ".war";//$NON-NLS-1$
+	}
+}
diff --git a/tests/org.eclipse.jst.servlet.tests/webmodule-tomcat-tests/org/eclipse/jst/servlet/tomcat/tests/WebImportOperationTomcatTest.java b/tests/org.eclipse.jst.servlet.tests/webmodule-tomcat-tests/org/eclipse/jst/servlet/tomcat/tests/WebImportOperationTomcatTest.java
new file mode 100644
index 0000000..b22b16a
--- /dev/null
+++ b/tests/org.eclipse.jst.servlet.tests/webmodule-tomcat-tests/org/eclipse/jst/servlet/tomcat/tests/WebImportOperationTomcatTest.java
@@ -0,0 +1,171 @@
+/*
+ * Created on Jan 6, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package org.eclipse.jst.servlet.tomcat.tests;
+
+import java.io.File;
+import java.util.List;
+
+import junit.framework.Test;
+
+import org.eclipse.jst.j2ee.datamodel.properties.IJ2EEComponentImportDataModelProperties;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.tests.ProjectUtility;
+import org.eclipse.wst.common.tests.SimpleTestSuite;
+import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleImportOperationTest;
+import org.eclipse.wtp.j2ee.headless.tests.plugin.HeadlessTestsPlugin;
+
+/**
+ * @author Administrator
+ * 
+ * To change the template for this generated type comment go to Window - Preferences - Java - Code
+ * Generation - Code and Comments
+ */
+public class WebImportOperationTomcatTest extends ModuleImportOperationTest {
+
+	private static final String TESTS_PATH = System.getProperty("user.dir") + java.io.File.separatorChar + "TestData" + java.io.File.separatorChar + "WARImportTests";
+	protected boolean dataModelShouldBeValid = true;
+	
+	public WebImportOperationTomcatTest() {
+		super("WebImportOperationTomcatTests");
+	}
+	
+	public WebImportOperationTomcatTest(String name) {
+		super(name);
+	}
+
+	public static Test suite() {
+		return new SimpleTestSuite(WebImportOperationTomcatTest.class);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleImportOperationTestCase#getModelInstance()
+	 */
+	protected IDataModel getModelInstance() {
+		return null; // new WebModuleImportDataModel();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleImportOperationTestCase#getImportableArchiveFileNames()
+	 */
+	protected List getImportableArchiveFileNames() {
+		return ProjectUtility.getWarsInDirectory(HeadlessTestsPlugin.getDefault(), TESTS_PATH);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleImportOperationTestCase#setServerTargetProperty(org.eclipse.jst.j2ee.application.operations.J2EEModuleImportDataModel)
+	 */
+	public void setServerTargetProperty(IDataModel dataModel) {
+		// dataModel.setProperty(ServerTargetDataModel.RUNTIME_TARGET_ID,AllTomcatTests.TOMCAT_RUNTIME.getId());
+	}
+	
+	public void testAllImportTestCases() throws Exception {
+
+		List projects = getImportableArchiveFileNames();
+		for (int i = 0; i < projects.size(); i++) {
+			String jarName = projects.get(i).toString();
+			String projectName = jarName.substring(jarName.lastIndexOf(File.separator) + 1, jarName.length() - 4);
+			testImport(projectName, jarName);
+		}
+	}
+	
+	public void testImportTestCase_0() throws Exception {
+		importIndex(0);
+	}
+
+	public void testImportTestCase_1() throws Exception {
+		importIndex(1);
+	}
+
+	public void testImportTestCase_2() throws Exception {
+		importIndex(2);
+	}
+
+	public void testImportTestCase_3() throws Exception {
+		importIndex(3);
+	}
+
+	public void testImportTestCase_4() throws Exception {
+		importIndex(4);
+	}
+
+	public void testImportTestCase_5() throws Exception {
+		importIndex(5);
+	}
+
+	public void testImportTestCase_6() throws Exception {
+		importIndex(6);
+	}
+
+	public void testImportTestCase_7() throws Exception {
+		importIndex(7);
+	}
+
+	public void testImportTestCase_8() throws Exception {
+		importIndex(8);
+	}
+
+	public void testImportTestCase_9() throws Exception {
+		importIndex(9);
+	}
+	
+	private void importIndex(int index) throws Exception {
+		List projects = getImportableArchiveFileNames();
+		if (index < projects.size()) {
+			String jarName = projects.get(index).toString();
+			String projectName = jarName.substring(jarName.lastIndexOf(File.separator) + 1, jarName.length() - 4);
+			testImport(projectName, jarName);
+		}
+	}
+	
+	public void testImportTestCase_rest() throws Exception {
+		List projects = getImportableArchiveFileNames();
+		for (int i = 10; i < projects.size(); i++) {
+			String jarName = projects.get(i).toString();
+			String projectName = jarName.substring(jarName.lastIndexOf(File.separator) + 1, jarName.length() - 4);
+			testImport(projectName, jarName);
+		}
+	}
+	
+	public void testImport(String projectName, String filename) throws Exception {
+		IDataModel dataModel = getModelInstance();
+		dataModel.setProperty(IJ2EEComponentImportDataModelProperties.FILE_NAME, filename);
+		dataModel.setProperty(IJ2EEComponentImportDataModelProperties.PROJECT_NAME, projectName);
+		if (dataModelShouldBeValid)
+			runAndVerify(dataModel);
+		else
+			verifyInvalidDataModel(dataModel);
+	}
+
+	public void testBadFileName() throws Exception {
+
+		dataModelShouldBeValid = false;
+		testImport("BobTheProject", "BobTheFile");
+	}
+	
+	protected IDataModel getExportDataModel(String projectName,
+			String destination, boolean exportSource, boolean runBuild,
+			boolean overwriteExisting) {
+		return null;
+	}
+
+	protected IDataModel getImportDataModel(String filePath,
+			String projectName, 
+			IDataModel creationModel, boolean closeArchiveOnDispose) {
+		return null;
+	}
+	
+	protected String getModuleExtension() {
+		return null;
+	}
+
+}
diff --git a/tests/org.eclipse.jst.servlet.tests/webmodule-tomcat-tests/org/eclipse/jst/servlet/tomcat/tests/WebProjectCreationTomcatTest.java b/tests/org.eclipse.jst.servlet.tests/webmodule-tomcat-tests/org/eclipse/jst/servlet/tomcat/tests/WebProjectCreationTomcatTest.java
new file mode 100644
index 0000000..1a12f55
--- /dev/null
+++ b/tests/org.eclipse.jst.servlet.tests/webmodule-tomcat-tests/org/eclipse/jst/servlet/tomcat/tests/WebProjectCreationTomcatTest.java
@@ -0,0 +1,218 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ * Created on Jan 6, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package org.eclipse.jst.servlet.tomcat.tests;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jst.j2ee.application.internal.operations.IAnnotationsDataModel;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.j2ee.internal.common.operations.INewJavaClassDataModelProperties;
+import org.eclipse.jst.j2ee.internal.web.archive.operations.WebFacetProjectCreationDataModelProvider;
+import org.eclipse.jst.j2ee.internal.web.operations.AddServletOperation;
+import org.eclipse.jst.j2ee.internal.web.operations.INewServletClassDataModelProperties;
+import org.eclipse.jst.j2ee.internal.web.operations.NewServletClassDataModelProvider;
+import org.eclipse.jst.j2ee.web.project.facet.IWebFacetInstallDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties.FacetDataModelMap;
+import org.eclipse.wst.common.componentcore.internal.operation.IArtifactEditOperationDataModelProperties;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
+import org.eclipse.wst.common.tests.LogUtility;
+import org.eclipse.wst.common.tests.ProjectUtility;
+import org.eclipse.wst.common.tests.SimpleTestSuite;
+import org.eclipse.wst.common.tests.TaskViewUtility;
+
+/** 
+ * @author blancett
+ * 
+ * To change the template for this generated type comment go to Window -
+ * Preferences - Java - Code Generation - Code and Comments
+ */
+public class WebProjectCreationTomcatTest extends TestCase {
+    
+    public void createSimpleProject(String projectName) throws Exception {
+        IDataModel dataModel = DataModelFactory.createDataModel(new WebFacetProjectCreationDataModelProvider());
+        dataModel.setProperty(IFacetProjectCreationDataModelProperties.FACET_PROJECT_NAME, projectName);
+        setServerTargetProperty(dataModel);
+        dataModel.getDefaultOperation().execute(new NullProgressMonitor(), null);
+    }
+
+    /**
+     * @param dataModel
+     */
+    public void setServerTargetProperty(IDataModel dataModel) {
+        dataModel.setProperty(IFacetProjectCreationDataModelProperties.FACET_RUNTIME, AllTomcatTests.TOMCAT_RUNTIME.getId());
+    }
+
+    public static void createServlet(IDataModel model) throws Exception {
+         AddServletOperation op = new AddServletOperation(model);
+         op.execute(null,null);
+         ProjectUtility.verifyProject(op.getTargetProject().getName(), true); 
+         TaskViewUtility.verifyNoErrors();
+    }
+
+    public IDataModel setupStandaloneWebProject(String projectName, int j2eeVersion) throws Exception {
+        createSimpleProject(projectName);
+        IDataModel model = getWebComponentCreationDataModel(projectName, j2eeVersion);
+        createStandaloneWebProject(model);
+        createServlet(projectName);
+        return model;
+    }
+
+    public IDataModel setupStandaloneAnnotatedWebProject(String projectName, int j2eeVersion) throws Exception {
+        createSimpleProject(projectName);
+
+        IDataModel model = getWebComponentCreationDataModel(projectName, j2eeVersion);
+        createStandaloneWebProject(model);
+        createAnnotatedServlet(projectName);
+        return model;
+    }
+    
+    public static void createStandaloneWebProject(IDataModel model) throws Exception {
+        IDataModelOperation webOp = model.getDefaultOperation();
+        webOp.execute(new NullProgressMonitor(), null);
+        // ProjectUtility.verifyProject(model.getTargetProject().getName(),
+        // true);
+        TaskViewUtility.verifyNoErrors();
+    }
+    
+    private IDataModel getWebComponentCreationDataModel(String projectName, int j2eeVersion) {
+        IProject javaProject = ProjectUtility.getProject(projectName);
+        String moduleName = projectName + "WebModule"; //$NON-NLS-1$
+        String moduleDeployName = moduleName + ".war"; //$NON-NLS-1$
+        IDataModel model = DataModelFactory.createDataModel(IWebFacetInstallDataModelProperties.class);
+        model.setProperty(IFacetProjectCreationDataModelProperties.FACET_PROJECT_NAME, javaProject.getName());
+        FacetDataModelMap map = (FacetDataModelMap) model.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
+        IDataModel webModel = map.getFacetDataModel(IWebFacetInstallDataModelProperties.DYNAMIC_WEB);
+        webModel.setIntProperty(IFacetDataModelProperties.FACET_VERSION,j2eeVersion);
+        return model;
+    }
+
+    /**
+     * @throws Exception
+     */
+    private void createServlet(String projectName) throws Exception {
+        IDataModel servletModel = setupServletCreationDataModel(projectName, false);
+        createServlet(servletModel);
+    }
+
+    /**
+     * @throws Exception
+     */
+    private void createAnnotatedServlet(String projectName) throws Exception {
+        IDataModel servletModel = setupServletCreationDataModel(projectName, true);
+        createServlet(servletModel);
+    }
+
+    public IDataModel setupServletCreationDataModel(String projectName, boolean isAnnotated) {
+    	IDataModel servletDataModel = DataModelFactory.createDataModel(NewServletClassDataModelProvider.class);
+        servletDataModel.setProperty(IArtifactEditOperationDataModelProperties.PROJECT_NAME, projectName);
+        servletDataModel.setProperty(IArtifactEditOperationDataModelProperties.COMPONENT_NAME, projectName);
+        servletDataModel.setProperty(INewJavaClassDataModelProperties.CLASS_NAME, "FooServlet"); //$NON-NLS-1$
+        servletDataModel.setProperty(INewServletClassDataModelProperties.DISPLAY_NAME, "FooServlet"); //$NON-NLS-1$
+        servletDataModel.setBooleanProperty(IAnnotationsDataModel.USE_ANNOTATIONS, isAnnotated);
+        return servletDataModel;
+    }
+
+    public void createVaildProjectAndServletCreation(String projectName, int j2eeVersion) throws Exception {
+        LogUtility.getInstance().resetLogging();
+        IDataModel model = null;
+        model = setupStandaloneWebProject(projectName, j2eeVersion);
+        LogUtility.getInstance().verifyNoWarnings();
+        checkValidDataModel(model);
+    }
+
+    public void createVaildAnnotatedProjectAndServletCreation(String projectName, int j2eeVersion) throws Exception {
+        LogUtility.getInstance().resetLogging();
+        IDataModel model = null;
+        model = setupStandaloneAnnotatedWebProject(projectName, j2eeVersion);
+        LogUtility.getInstance().verifyNoWarnings();
+        checkValidDataModel(model);
+    }
+
+    /**
+     * @param model
+     */
+    protected void checkValidDataModel(IDataModel model) {
+        // DataModelVerifier verifier =
+        // DataModelVerifierFactory.getInstance().createVerifier(model);
+        // try {
+        // verifier.verify(model);
+        // } catch (Exception e) {
+        // e.printStackTrace();
+        // }
+
+    }
+
+    public void testVaild12WebProjectNameCreation() throws Exception {
+        ProjectUtility.deleteAllProjects();
+        createVaildProjectAndServletCreation("FooTomcatWebProject12", J2EEVersionConstants.WEB_2_2_ID); //$NON-NLS-1$
+    }
+
+    /*
+     * TODO Uncomment this method when Annotation support for servlets is
+     * enabled public void testVaild12AnnotatedWebProjectNameCreation() throws
+     * Exception { ProjectUtility.deleteAllProjects();
+     * createVaildAnnotatedProjectAndServletCreation("FooAnnotatedTomcatWebProject12",
+     * J2EEVersionConstants.WEB_2_2_ID); }
+     */
+
+    public void testVaild13WebProjectNameCreation() throws Exception {
+        ProjectUtility.deleteAllProjects();
+        createVaildProjectAndServletCreation("Foo1TomcatWebProject13", J2EEVersionConstants.WEB_2_3_ID); //$NON-NLS-1$
+    }
+
+    /*
+     * TODO Uncomment this method when Annotation support for servlets is
+     * enabled public void testVaild13AnnotatedWebProjectNameCreation() throws
+     * Exception { ProjectUtility.deleteAllProjects();
+     * createVaildAnnotatedProjectAndServletCreation("Foo1TomcatWebProject13",
+     * J2EEVersionConstants.WEB_2_3_ID); }
+     */
+
+    public void testVaild14WebProjectNameCreation() throws Exception {
+        ProjectUtility.deleteAllProjects();
+        createVaildProjectAndServletCreation("Foo1TomcatWebProject14", J2EEVersionConstants.WEB_2_4_ID); //$NON-NLS-1$
+    }
+
+    /*
+     * TODO Uncomment this method when Annotation support for servlets is
+     * enabled public void testVaild14AnnotatedWebProjectNameCreation() throws
+     * Exception { ProjectUtility.deleteAllProjects();
+     * createVaildAnnotatedProjectAndServletCreation("Foo1TomcatWebProject14",
+     * J2EEVersionConstants.WEB_2_4_ID); }
+     */
+
+    public static Test suite() {
+        return new SimpleTestSuite(WebProjectCreationTomcatTest.class);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleProjectCreationOperationTest#getProjectCreationDataModel()
+     */
+    public IDataModel getProjectCreationDataModel() {
+        return null;
+    }
+
+}
diff --git a/tests/org.eclipse.jst.validation.sample/.classpath b/tests/org.eclipse.jst.validation.sample/.classpath
new file mode 100644
index 0000000..f562172
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.sample/.classpath
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="propertiesValidator/"/>
+	<classpathentry kind="src" path="propertiesValFS/"/>
+	<classpathentry kind="src" path="propertiesValWB/"/>
+	<classpathentry kind="src" path="filesystemFWK/"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/tests/org.eclipse.jst.validation.sample/.cvsignore b/tests/org.eclipse.jst.validation.sample/.cvsignore
new file mode 100644
index 0000000..512f021
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.sample/.cvsignore
@@ -0,0 +1,4 @@
+bin
+build.xml
+runtime
+temp.folder
diff --git a/tests/org.eclipse.jst.validation.sample/.project b/tests/org.eclipse.jst.validation.sample/.project
new file mode 100644
index 0000000..190b477
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.sample/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.jst.validation.sample</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.jdt.core.javanature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+	</natures>
+</projectDescription>
diff --git a/tests/org.eclipse.jst.validation.sample/META-INF/MANIFEST.MF b/tests/org.eclipse.jst.validation.sample/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..6ac7f4c
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.sample/META-INF/MANIFEST.MF
@@ -0,0 +1,21 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name.0
+Bundle-SymbolicName: org.eclipse.jst.validation.sample; singleton:=true
+Bundle-Version: 1.1.1.qualifier
+Bundle-ClassPath: runtime/propertiesValidator.jar
+Bundle-Activator: org.eclipse.jst.validation.sample.workbenchimpl.PropertiesValidatorPlugin
+Bundle-Localization: plugin
+Export-Package: org.eclipse.jst.validation.sample,
+ org.eclipse.jst.validation.sample.filesystem,
+ org.eclipse.jst.validation.sample.filesystemimpl,
+ org.eclipse.jst.validation.sample.parser,
+ org.eclipse.jst.validation.sample.workbenchimpl
+Require-Bundle: org.eclipse.core.resources,
+ org.eclipse.jdt.core,
+ org.eclipse.wst.validation,
+ org.eclipse.help,
+ org.eclipse.jem.util,
+ org.eclipse.wst.common.frameworks,
+ org.eclipse.core.runtime
+Bundle-ActivationPolicy: lazy
diff --git a/docs/org.eclipse.wst.web.ui.infopop/about.html b/tests/org.eclipse.jst.validation.sample/about.html
similarity index 100%
copy from docs/org.eclipse.wst.web.ui.infopop/about.html
copy to tests/org.eclipse.jst.validation.sample/about.html
diff --git a/tests/org.eclipse.jst.validation.sample/build.properties b/tests/org.eclipse.jst.validation.sample/build.properties
new file mode 100644
index 0000000..186cb0a
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.sample/build.properties
@@ -0,0 +1,13 @@
+source.runtime/propertiesValidator.jar = propertiesValidator/,\
+                                         propertiesValFS/,\
+                                         propertiesValWB/,\
+                                         filesystemFWK/
+bin.includes = runtime/propertiesValidator.jar,\
+               plugin.xml,\
+               filesystem.bat,\
+               prop.bat,\
+               about.html,\
+               META-INF/,\
+               plugin.properties
+jars.compile.order = runtime/propertiesValidator.jar
+output.runtime/propertiesValidator.jar = bin/
diff --git a/tests/org.eclipse.jst.validation.sample/filesystem.bat b/tests/org.eclipse.jst.validation.sample/filesystem.bat
new file mode 100644
index 0000000..2dc85a9
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.sample/filesystem.bat
@@ -0,0 +1,46 @@
+@echo off
+REM Licensed Material - Property of IBM 
+REM (C) Copyright IBM Corp. 2002, 2003 - All Rights Reserved. 
+REM US Government Users Restricted Rights - Use, duplication or disclosure 
+REM restricted by GSA ADP Schedule Contract with IBM Corp. 
+REM 
+REM DISCLAIMER OF WARRANTIES.
+REM The following [enclosed] code is sample code created by IBM
+REM Corporation. This sample code is not part of any standard or IBM
+REM product and is provided to you solely for the purpose of assisting
+REM you in the development of your applications.  The code is provided
+REM "AS IS". IBM MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT
+REM NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+REM FOR A PARTICULAR PURPOSE, REGARDING THE FUNCTION OR PERFORMANCE OF
+REM THIS CODE.  THIS CODE MAY CONTAIN ERRORS.  IBM shall not be liable
+REM for any damages arising out of your use of the sample code, even
+REM if it has been advised of the possibility of such damages.
+REM 
+REM This batch file runs the "filesystem framework"'s application
+REM
+setlocal
+
+if "%JAVA_HOME%" EQU "" goto syntax
+
+set CLASSPATH=%CLASSPATH%;..\com.ibm.etools.logging.util_5.1.0\runtime\logutil.jar
+set CLASSPATH=%CLASSPATH%;..\com.ibm.etools.validation.core_5.1.0\runtime\common.jar
+set CLASSPATH=%CLASSPATH%;.\runtime\propertiesValidator.jar
+set CLASSPATH=%CLASSPATH%;.\runtime\filesystemFWK.jar
+set CLASSPATH=%CLASSPATH%;.\runtime\propertiesValWB.jar
+set CLASSPATH=%CLASSPATH%;.\runtime\propertiesValFS.jar
+
+%JAVA_HOME%\bin\java com.ibm.etools.validation.filesystem.FilesystemApplication %1
+goto :end
+
+:syntax
+echo.
+echo The JAVA_HOME environment variable must be set to the JRE directory.
+echo e.g., set JAVA_HOME=C:\JRE
+echo where JRE has a subdirectory named "bin"
+echo.
+echo.
+goto :end
+
+:end
+endlocal
+@echo on
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.validation.sample/filesystemFWK/filesystem.properties b/tests/org.eclipse.jst.validation.sample/filesystemFWK/filesystem.properties
new file mode 100644
index 0000000..a728349
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.sample/filesystemFWK/filesystem.properties
@@ -0,0 +1,21 @@
+#
+# Licensed Material - Property of IBM 
+# (C) Copyright IBM Corp. 2002, 2003 - All Rights Reserved. 
+# US Government Users Restricted Rights - Use, duplication or disclosure 
+# restricted by GSA ADP Schedule Contract with IBM Corp. 
+#
+#  DISCLAIMER OF WARRANTIES.
+#  The following [enclosed] code is sample code created by IBM
+#  Corporation. This sample code is not part of any standard or IBM
+#  product and is provided to you solely for the purpose of assisting
+#  you in the development of your applications.  The code is provided
+#  "AS IS". IBM MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT
+#  NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+#  FOR A PARTICULAR PURPOSE, REGARDING THE FUNCTION OR PERFORMANCE OF
+#  THIS CODE.  THIS CODE MAY CONTAIN ERRORS.  IBM shall not be liable
+#  for any damages arising out of your use of the sample code, even
+#  if it has been advised of the possibility of such damages.
+#
+
+# VFFS = Validation Framework File System 
+VFFS0000 = VFFS0000E: Internal error caused premature termination of validator {0}. See the stack trace below.
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.validation.sample/filesystemFWK/org/eclipse/jst/validation/sample/filesystem/FilesystemApplication.java b/tests/org.eclipse.jst.validation.sample/filesystemFWK/org/eclipse/jst/validation/sample/filesystem/FilesystemApplication.java
new file mode 100644
index 0000000..4100732
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.sample/filesystemFWK/org/eclipse/jst/validation/sample/filesystem/FilesystemApplication.java
@@ -0,0 +1,82 @@
+package org.eclipse.jst.validation.sample.filesystem;
+/*
+ * Licensed Material - Property of IBM 
+ * (C) Copyright IBM Corp. 2002, 2003 - All Rights Reserved. 
+ * US Government Users Restricted Rights - Use, duplication or disclosure 
+ * restricted by GSA ADP Schedule Contract with IBM Corp. 
+ *
+ * DISCLAIMER OF WARRANTIES.
+ * The following [enclosed] code is sample code created by IBM
+ * Corporation. This sample code is not part of any standard or IBM
+ * product and is provided to you solely for the purpose of assisting
+ * you in the development of your applications.  The code is provided
+ * "AS IS". IBM MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT
+ * NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE, REGARDING THE FUNCTION OR PERFORMANCE OF
+ * THIS CODE.  THIS CODE MAY CONTAIN ERRORS.  IBM shall not be liable
+ * for any damages arising out of your use of the sample code, even
+ * if it has been advised of the possibility of such damages.
+ * 
+ */
+
+
+import org.eclipse.wst.validation.internal.core.IFileDelta;
+import org.eclipse.wst.validation.internal.core.Message;
+import org.eclipse.wst.validation.internal.core.ValidationException;
+import org.eclipse.wst.validation.internal.core.ValidatorLauncher;
+import org.eclipse.wst.validation.internal.provisional.core.IMessage;
+import org.eclipse.wst.validation.internal.provisional.core.IReporter;
+
+/**
+ * This class is the representation of a file system based application
+ * which needs to use the common validation APIs.
+ */
+public class FilesystemApplication {
+	/**
+	 * The argv[] parameter needs to be a fully-qualified list of file names 
+	 * of files that should be validated. 
+	 */
+	public static void main(String argv[]) {
+		IFileDelta[] files = FilesystemManager.getManager().getFileDeltas(argv);
+		boolean fullBuild = ((files == null) || (files.length == 0));
+
+		IReporter reporter = null;
+		if (fullBuild) {
+			reporter = new FullReporter();
+		}
+		else {
+			reporter = new IncrementalReporter();
+		}
+
+		FilesystemLoader loaders[] = FilesystemManager.getManager().getLoaders(files);
+		for (int i=0; i<loaders.length; i++) {
+			FilesystemLoader loader = loaders[i];
+			try {
+				ValidatorLauncher.getLauncher().start(loader.getHelper(), loader.getValidator(), reporter);
+				if (!fullBuild) {
+					((IncrementalReporter)reporter).report();
+				}
+			}
+			catch (ValidationException exc) {
+				Message message = new Message("filesystem", IMessage.HIGH_SEVERITY, "VFFS0000", new String[]{loader.getValidator().getClass().getName()}); //$NON-NLS-1$  //$NON-NLS-2$
+				reporter.displaySubtask(loader.getValidator(), message);
+				
+				if(exc.getAssociatedMessage() != null) {
+					System.out.println(exc.getAssociatedMessage());
+				}
+				
+				exc.printStackTrace();
+				if(exc.getAssociatedException() != null) {
+					exc.getAssociatedException().printStackTrace();
+				}
+				// continue with the next validation
+			}
+			catch (Exception exc) {
+				Message message = new Message("filesystem", IMessage.HIGH_SEVERITY, "VFFS0000", new String[]{loader.getValidator().getClass().getName()}); //$NON-NLS-1$ //$NON-NLS-2$
+				reporter.displaySubtask(loader.getValidator(), message);
+				// continue with the next validation
+				exc.printStackTrace();
+			}
+		}
+	}
+}
diff --git a/tests/org.eclipse.jst.validation.sample/filesystemFWK/org/eclipse/jst/validation/sample/filesystem/FilesystemLoader.java b/tests/org.eclipse.jst.validation.sample/filesystemFWK/org/eclipse/jst/validation/sample/filesystem/FilesystemLoader.java
new file mode 100644
index 0000000..9b44fc6
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.sample/filesystemFWK/org/eclipse/jst/validation/sample/filesystem/FilesystemLoader.java
@@ -0,0 +1,62 @@
+package org.eclipse.jst.validation.sample.filesystem;
+/*
+ * Licensed Material - Property of IBM 
+ * (C) Copyright IBM Corp. 2002, 2003 - All Rights Reserved. 
+ * US Government Users Restricted Rights - Use, duplication or disclosure 
+ * restricted by GSA ADP Schedule Contract with IBM Corp. 
+ *
+ * DISCLAIMER OF WARRANTIES.
+ * The following [enclosed] code is sample code created by IBM
+ * Corporation. This sample code is not part of any standard or IBM
+ * product and is provided to you solely for the purpose of assisting
+ * you in the development of your applications.  The code is provided
+ * "AS IS". IBM MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT
+ * NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE, REGARDING THE FUNCTION OR PERFORMANCE OF
+ * THIS CODE.  THIS CODE MAY CONTAIN ERRORS.  IBM shall not be liable
+ * for any damages arising out of your use of the sample code, even
+ * if it has been advised of the possibility of such damages.
+ * 
+ */
+
+import org.eclipse.wst.validation.internal.provisional.core.IValidator;
+
+/**
+ * This class associates a Validator with a Helper and the file extensions that
+ * the validator runs on.
+ */
+public class FilesystemLoader {
+	private IFilesystemHelper _helper = null;
+	private IValidator _validator = null;
+	private String[] _fileExtensions = null;
+	
+	public FilesystemLoader(String[] fileExtensions, IFilesystemHelper helper, IValidator validator) {
+		super();
+
+		_fileExtensions = fileExtensions;
+		_helper = helper;
+		_validator = validator;
+	}
+	
+	/**
+	 * Return the helper that the validator needs to access information 
+	 * in the filesystem validation framework.
+	 */
+	public IFilesystemHelper getHelper() {
+		return _helper;
+	}
+
+	/**
+	 * Return the validator that checks the rules.
+	 */
+	public IValidator getValidator() {
+		return _validator;
+	}
+	
+	/**
+	 * Return a list of file name extensions that this validator validates.
+	 */
+	public String[] getFileExtensions() {
+		return _fileExtensions;
+	}
+}
diff --git a/tests/org.eclipse.jst.validation.sample/filesystemFWK/org/eclipse/jst/validation/sample/filesystem/FilesystemManager.java b/tests/org.eclipse.jst.validation.sample/filesystemFWK/org/eclipse/jst/validation/sample/filesystem/FilesystemManager.java
new file mode 100644
index 0000000..cad383a
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.sample/filesystemFWK/org/eclipse/jst/validation/sample/filesystem/FilesystemManager.java
@@ -0,0 +1,220 @@
+package org.eclipse.jst.validation.sample.filesystem;
+/*
+ * Licensed Material - Property of IBM 
+ * (C) Copyright IBM Corp. 2002, 2003 - All Rights Reserved. 
+ * US Government Users Restricted Rights - Use, duplication or disclosure 
+ * restricted by GSA ADP Schedule Contract with IBM Corp. 
+ *
+ * DISCLAIMER OF WARRANTIES.
+ * The following [enclosed] code is sample code created by IBM
+ * Corporation. This sample code is not part of any standard or IBM
+ * product and is provided to you solely for the purpose of assisting
+ * you in the development of your applications.  The code is provided
+ * "AS IS". IBM MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT
+ * NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE, REGARDING THE FUNCTION OR PERFORMANCE OF
+ * THIS CODE.  THIS CODE MAY CONTAIN ERRORS.  IBM shall not be liable
+ * for any damages arising out of your use of the sample code, even
+ * if it has been advised of the possibility of such damages.
+ * 
+ */
+
+
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+import org.eclipse.wst.validation.internal.core.FileDelta;
+import org.eclipse.wst.validation.internal.core.IFileDelta;
+import org.eclipse.wst.validation.internal.provisional.core.IValidator;
+
+/**
+ * This class is the heart of the filesystem validation framework.
+ * It &quot;loads&quot; each validator's metadata
+ */
+public class FilesystemManager {
+	private static FilesystemManager _inst = null;
+	private Set _loaders = null;
+	
+	private FilesystemManager() {
+		_loaders = new HashSet();
+		
+		// Please pretend that this metadata, i.e., the file extension, fully-qualified
+		// class name of the helper, and fully-qualified class name of the validator, 
+		// was loaded generically somehow. In practice, this information could be stored
+		// in .xml files, in a configuration file, etc., that the framework would read
+		// to find the installed validators.
+		try {
+			_loaders.add(new FilesystemLoader(new String[]{".properties"}, loadHelper("org.eclipse.jst.validation.sample.filesystemimpl.FilesystemPropertiesHelper"), loadValidator("org.eclipse.jst.validation.sample.PropertiesValidator"))); //$NON-NLS-1$  //$NON-NLS-2$ //$NON-NLS-3$
+		}
+		catch(IllegalArgumentException exc) {
+			exc.printStackTrace();
+		}
+		catch(ClassNotFoundException exc) {
+			exc.printStackTrace();
+		}
+		catch(IllegalAccessException exc) {
+			exc.printStackTrace();
+		}
+		catch(InstantiationException exc) {
+			exc.printStackTrace();
+		}
+	}
+	
+	/**
+	 * Given a fully-qualified name of a helper, return an instance of it.
+	 */
+	private static IFilesystemHelper loadHelper(String className) throws IllegalArgumentException, ClassNotFoundException, IllegalAccessException, InstantiationException  {
+		return (IFilesystemHelper)loadClass(className);
+	}
+	
+	/**
+	 * Given a fully-qualified name of a validator, return an instance of it.
+	 */
+	private static IValidator loadValidator(String className) throws IllegalArgumentException, ClassNotFoundException, IllegalAccessException, InstantiationException  {
+		return (IValidator)loadClass(className);
+	}
+	
+	/**
+	 * Return an instance of the class identified by the className parameter,
+	 * which contains the fully-qualified class name of the class.
+	 */
+	private static Object loadClass(String className) throws IllegalArgumentException, ClassNotFoundException, IllegalAccessException, InstantiationException {
+		if(className == null) {
+			throw new IllegalArgumentException("loadClass argument must not be null"); //$NON-NLS-1$
+		}
+		
+		Class clazz = Class.forName(className);
+		return clazz.newInstance();		
+	}
+	
+	/**
+	 * Return the FilesystemManager singleton.
+	 */
+	public static FilesystemManager getManager() {
+		if(_inst == null) {
+			_inst = new FilesystemManager();
+		}
+		return _inst;
+	}
+
+	/**
+	 * Given an array of file names, return an array of IFileDelta
+	 * instances to pass to the validator instance.
+	 */
+	public IFileDelta[] getFileDeltas(String[] fileNames) {
+		if((fileNames == null) || (fileNames.length == 0)) {
+			return null;
+		}
+		
+		FileDelta[] files = new FileDelta[fileNames.length];
+		for(int i=0; i<fileNames.length; i++) {
+			files[i] = new FileDelta(fileNames[i], IFileDelta.CHANGED);
+		}
+		return files;
+	}
+	
+	/**
+	 * Given an array of IFileDelta instances, return an array
+	 * of the IValidator instances, with their associated IValidationContext instances,
+	 * that validate these particular delta instances.
+	 */
+	public FilesystemLoader[] getLoaders(IFileDelta[] deltas) {
+		if(deltas == null) {
+			return getAllLoaders();
+		}
+
+		Set loaders = new HashSet();		
+		for(int i=0; i<deltas.length; i++) {
+			FilesystemLoader[] loaderArray = getLoadersFor(deltas[i]);
+			if(loaderArray != null) {
+				for(int j=0; j<loaderArray.length; j++) {
+					loaders.add(loaderArray[j]);
+				}
+			}
+		}
+		
+		FilesystemLoader[] result = new FilesystemLoader[loaders.size()];
+		loaders.toArray(result);
+		return result;
+	}
+	
+	/**
+	 * Given an IValidator instance, return the IValidationContext instance that the
+	 * IValidator uses to load information from the filesystem validation
+	 * framework environment.
+	 */
+	public IFilesystemHelper getHelper(IValidator validator) {
+		if(validator == null) {
+			return null;
+		}
+		
+		Iterator iterator = _loaders.iterator();
+		while(iterator.hasNext()) {
+			FilesystemLoader loader = (FilesystemLoader)iterator.next();
+			if(validator.equals(loader.getValidator())) {
+				return loader.getHelper();
+			}
+		}
+		
+		return null;
+	}
+	
+	/**
+	 * Given the fully-qualified name of the validator, return the IValidator instance.
+	 * null will be returned if the IValidator cannot be found.
+	 */
+	public IValidator getValidator(String validatorClassName) {
+		if(validatorClassName == null) {
+			return null;
+		}
+		
+		Iterator iterator = _loaders.iterator();
+		while(iterator.hasNext()) {
+			FilesystemLoader loader = (FilesystemLoader)iterator.next();
+			if(validatorClassName.equals(loader.getValidator().getClass().getName())) {
+				return loader.getValidator();
+			}
+		}
+		
+		return null;
+	}
+	
+	/**
+	 * Return an array of all FilesystemLoader instances. Each loader has
+	 * one IValidator and one IValidationContext.
+	 */
+	public FilesystemLoader[] getAllLoaders() {
+		FilesystemLoader[] result = new FilesystemLoader[_loaders.size()];
+		_loaders.toArray(result);
+		return result;
+	}
+
+	/**
+	 * Given a file name, return the loader which contains the validator & helper
+	 * which can validate that file, if one exists.
+	 */
+	public FilesystemLoader[] getLoadersFor(IFileDelta delta) {
+		Iterator iterator = _loaders.iterator();
+		FilesystemLoader[] tempLoaders = new FilesystemLoader[_loaders.size()];
+		int count = 0;
+		while(iterator.hasNext()) {
+			FilesystemLoader loader = (FilesystemLoader)iterator.next();
+			String[] fileExtensions = loader.getFileExtensions();
+			if(fileExtensions == null) {
+				continue;
+			}
+			
+			for(int i=0; i<fileExtensions.length; i++) {
+				if(delta.getFileName().endsWith(fileExtensions[i]) && (delta.getDeltaType() == IFileDelta.ADDED || delta.getDeltaType() == IFileDelta.CHANGED || delta.getDeltaType() == IFileDelta.DELETED)) {
+					tempLoaders[count++] = loader;
+				}
+			}
+		}
+		
+		FilesystemLoader[] result = new FilesystemLoader[count];
+		System.arraycopy(tempLoaders, 0, result, 0, count);
+		return result;
+	}
+
+}
diff --git a/tests/org.eclipse.jst.validation.sample/filesystemFWK/org/eclipse/jst/validation/sample/filesystem/FullReporter.java b/tests/org.eclipse.jst.validation.sample/filesystemFWK/org/eclipse/jst/validation/sample/filesystem/FullReporter.java
new file mode 100644
index 0000000..1959b2a
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.sample/filesystemFWK/org/eclipse/jst/validation/sample/filesystem/FullReporter.java
@@ -0,0 +1,92 @@
+package org.eclipse.jst.validation.sample.filesystem;
+/*
+ * Licensed Material - Property of IBM 
+ * (C) Copyright IBM Corp. 2002, 2003 - All Rights Reserved. 
+ * US Government Users Restricted Rights - Use, duplication or disclosure 
+ * restricted by GSA ADP Schedule Contract with IBM Corp. 
+ *
+ * DISCLAIMER OF WARRANTIES.
+ * The following [enclosed] code is sample code created by IBM
+ * Corporation. This sample code is not part of any standard or IBM
+ * product and is provided to you solely for the purpose of assisting
+ * you in the development of your applications.  The code is provided
+ * "AS IS". IBM MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT
+ * NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE, REGARDING THE FUNCTION OR PERFORMANCE OF
+ * THIS CODE.  THIS CODE MAY CONTAIN ERRORS.  IBM shall not be liable
+ * for any damages arising out of your use of the sample code, even
+ * if it has been advised of the possibility of such damages.
+ * 
+ */
+
+import java.util.List;
+
+import org.eclipse.wst.validation.internal.provisional.core.IMessage;
+import org.eclipse.wst.validation.internal.provisional.core.IReporter;
+import org.eclipse.wst.validation.internal.provisional.core.IValidator;
+
+/**
+ * This reporter is used when full validation is needed. It doesn't cache
+ * anything, so it's faster than the IncrementalReporter.
+ */
+public class FullReporter implements IReporter {
+	public FullReporter() {
+		super();
+	}
+
+	/**
+	 * @see IReporter#addMessage(IValidator, IMessage)
+	 */
+	public void addMessage(IValidator validator, IMessage message) {
+		if (message == null) {
+			return;
+		}
+
+		System.out.println(MessageManager.formatMessage(validator, message));
+	}
+	
+	/**
+	 * @see IReporter#displaySubtask(IValidator, IMessage)
+	 */
+	public void displaySubtask(IValidator validator, IMessage message) {
+		// Flush the message to the user immediately.
+		System.err.println(message.getText());
+	}
+	
+	/**
+	 * @see IReporter#getMessages()
+	 */
+	public List getMessages() {
+		// this reporter does not support message access 
+		return null;
+	}
+	
+	/**
+	 * @see IReporter#isCancelled()
+	 */
+	public boolean isCancelled() {
+		// to make things easy, do not allow the user to cancel validation.
+		return false;
+	}
+	
+	/**
+	 * @see IReporter#removeAllMessages(IValidator)
+	 */
+	public void removeAllMessages(IValidator validator) {
+		// since no messages are stored, there's nothing to remove
+	}
+	
+	/**
+	 * @see IReporter#removeAllMessages(IValidator, Object)
+	 */
+	public void removeAllMessages(IValidator validator, Object object) {
+		// since no messages are stored, there's nothing to remove
+	}
+	
+	/**
+	 * @see IReporter#removeMessageSubset(IValidator, Object, String)
+	 */
+	public void removeMessageSubset(IValidator validator, Object obj, String groupName) {
+		// Since this reporter doesn't store messages, there is no removal of any messages
+	}
+}
diff --git a/tests/org.eclipse.jst.validation.sample/filesystemFWK/org/eclipse/jst/validation/sample/filesystem/IFilesystemHelper.java b/tests/org.eclipse.jst.validation.sample/filesystemFWK/org/eclipse/jst/validation/sample/filesystem/IFilesystemHelper.java
new file mode 100644
index 0000000..9938513
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.sample/filesystemFWK/org/eclipse/jst/validation/sample/filesystem/IFilesystemHelper.java
@@ -0,0 +1,34 @@
+package org.eclipse.jst.validation.sample.filesystem;
+/*
+ * Licensed Material - Property of IBM 
+ * (C) Copyright IBM Corp. 2002, 2003 - All Rights Reserved. 
+ * US Government Users Restricted Rights - Use, duplication or disclosure 
+ * restricted by GSA ADP Schedule Contract with IBM Corp. 
+ *
+ * DISCLAIMER OF WARRANTIES.
+ * The following [enclosed] code is sample code created by IBM
+ * Corporation. This sample code is not part of any standard or IBM
+ * product and is provided to you solely for the purpose of assisting
+ * you in the development of your applications.  The code is provided
+ * "AS IS". IBM MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT
+ * NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE, REGARDING THE FUNCTION OR PERFORMANCE OF
+ * THIS CODE.  THIS CODE MAY CONTAIN ERRORS.  IBM shall not be liable
+ * for any damages arising out of your use of the sample code, even
+ * if it has been advised of the possibility of such damages.
+ * 
+ */
+
+import org.eclipse.wst.validation.internal.provisional.core.IMessage;
+import org.eclipse.wst.validation.internal.provisional.core.IValidationContext;
+
+/**
+ * To integrate a validator into this framework, an implementation of this
+ * IValidationContext must be provided.
+ */
+public interface IFilesystemHelper extends IValidationContext {
+	/**
+	 * Return the fully-qualified name of the file which the IMessage is reported against.
+	 */
+	public String getFileName(IMessage message);
+}
diff --git a/tests/org.eclipse.jst.validation.sample/filesystemFWK/org/eclipse/jst/validation/sample/filesystem/IncrementalReporter.java b/tests/org.eclipse.jst.validation.sample/filesystemFWK/org/eclipse/jst/validation/sample/filesystem/IncrementalReporter.java
new file mode 100644
index 0000000..e8e3dba
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.sample/filesystemFWK/org/eclipse/jst/validation/sample/filesystem/IncrementalReporter.java
@@ -0,0 +1,168 @@
+package org.eclipse.jst.validation.sample.filesystem;
+/*
+ * Licensed Material - Property of IBM 
+ * (C) Copyright IBM Corp. 2002, 2003 - All Rights Reserved. 
+ * US Government Users Restricted Rights - Use, duplication or disclosure 
+ * restricted by GSA ADP Schedule Contract with IBM Corp. 
+ *
+ * DISCLAIMER OF WARRANTIES.
+ * The following [enclosed] code is sample code created by IBM
+ * Corporation. This sample code is not part of any standard or IBM
+ * product and is provided to you solely for the purpose of assisting
+ * you in the development of your applications.  The code is provided
+ * "AS IS". IBM MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT
+ * NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE, REGARDING THE FUNCTION OR PERFORMANCE OF
+ * THIS CODE.  THIS CODE MAY CONTAIN ERRORS.  IBM shall not be liable
+ * for any damages arising out of your use of the sample code, even
+ * if it has been advised of the possibility of such damages.
+ * 
+ */
+
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.wst.validation.internal.provisional.core.IMessage;
+import org.eclipse.wst.validation.internal.provisional.core.IReporter;
+import org.eclipse.wst.validation.internal.provisional.core.IValidator;
+
+/**
+ * This class is the file system specific implementation of an incremental IReporter.
+ * It caches validation messages, so that messages can both be added and deleted.
+ */
+public class IncrementalReporter implements IReporter {
+	
+	public IncrementalReporter() {
+		super();
+	}
+	
+	/**
+	 * @see IReporter#addMessage(IValidator, IMessage)
+	 */
+	public void addMessage(IValidator validator, IMessage message) {
+		if (validator == null) {
+			return;
+		}
+
+		if (message == null) {
+			return;
+		}
+
+		ValidatorMessages vm = MessageManager.getManager().getMessages(validator);
+		if (vm != null) {
+			vm.addValidationMessage(message);
+		}
+	}
+
+	/**
+	 * @see IReporter#displaySubtask(IValidator, IMessage)
+	 */
+	public void displaySubtask(IValidator validator, IMessage message) {
+		// Flush the message to the user immediately.
+		System.err.println(message.getText());
+	}
+
+	/**
+	 * @see IReporter#getMessages()
+	 */
+	public List getMessages() {
+		return null;
+	}
+
+	/**
+	 * Return a Map of String fully-qualified validator class names,
+	 * with a value of Collection, and the Collection contains the
+	 * MessageMetaData reported by the validator, of the given severity.
+	 */
+	public Map getMessages(int messageType) {
+		return MessageManager.getManager().getMessages(messageType);
+	}
+
+	/**
+	 * @see IReporter#isCancelled()
+	 */
+	public boolean isCancelled() {
+		// For simplicity, never allow cancellation.
+		// In a production system, this method might query another object to find out its cancellation status.
+		return false;
+	}
+
+	/**
+	 * @see IReporter#removeAllMessages(IValidator)
+	 */
+	public void removeAllMessages(IValidator validator) {
+		if (validator == null) {
+			return;
+		}
+		MessageManager.getManager().removeAllMessages(validator);
+	}
+
+	/**
+	 * @see IReporter#removeAllMessages(IValidator, Object)
+	 */
+	public void removeAllMessages(IValidator validator, Object object) {
+		if (validator == null) {
+			return;
+		}
+		
+
+		MessageManager.getManager().removeAllMessages(validator, object);
+	}
+
+	/**
+	 * @see IReporter#removeMessageSubset(IValidator, Object, String)
+	 */
+	public void removeMessageSubset(IValidator validator, Object obj, String groupName) {
+		// implement later
+	}
+
+	/**
+	 * Display a formatted list of all of the problems found while
+	 * validating the file.
+	 */
+	public void report() {
+		System.out.println();
+		System.out.println("Error messages"); //$NON-NLS-1$
+		Map messages = getMessages(IMessage.HIGH_SEVERITY);
+		report(messages);
+
+		System.out.println();
+		System.out.println("Warning messages"); //$NON-NLS-1$
+		messages = getMessages(IMessage.NORMAL_SEVERITY);
+		report(messages);
+
+		System.out.println();
+		System.out.println("Information messages"); //$NON-NLS-1$
+		messages = getMessages(IMessage.LOW_SEVERITY);
+		report(messages);
+	}
+	
+	/**
+	 * @see IReporter#report(Map)
+	 */
+	protected static void report(Map messages) {
+		if(messages.size() == 0) {
+			return;
+		}
+		
+		Iterator iterator = messages.keySet().iterator();
+		while(iterator.hasNext()) {
+			String validatorClassName = (String)iterator.next();
+			IValidator validator = FilesystemManager.getManager().getValidator(validatorClassName);
+			IFilesystemHelper helper = FilesystemManager.getManager().getHelper(validator);
+			List mssgList = (List)messages.get(validator);
+			if(mssgList == null) {
+				continue;
+			}
+			
+			Collections.sort(mssgList, MessageManager.getManager().getMessageComparator(helper));
+			
+			for(int i=0; i<mssgList.size(); i++) {
+				IMessage mssg = (IMessage)mssgList.get(i);
+				System.out.println(MessageManager.formatMessage(validator, mssg));
+			}
+		}
+	}
+}
diff --git a/tests/org.eclipse.jst.validation.sample/filesystemFWK/org/eclipse/jst/validation/sample/filesystem/MessageManager.java b/tests/org.eclipse.jst.validation.sample/filesystemFWK/org/eclipse/jst/validation/sample/filesystem/MessageManager.java
new file mode 100644
index 0000000..2db1c9e
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.sample/filesystemFWK/org/eclipse/jst/validation/sample/filesystem/MessageManager.java
@@ -0,0 +1,254 @@
+package org.eclipse.jst.validation.sample.filesystem;
+/*
+ * Licensed Material - Property of IBM 
+ * (C) Copyright IBM Corp. 2002, 2003 - All Rights Reserved. 
+ * US Government Users Restricted Rights - Use, duplication or disclosure 
+ * restricted by GSA ADP Schedule Contract with IBM Corp. 
+ *
+ * DISCLAIMER OF WARRANTIES.
+ * The following [enclosed] code is sample code created by IBM
+ * Corporation. This sample code is not part of any standard or IBM
+ * product and is provided to you solely for the purpose of assisting
+ * you in the development of your applications.  The code is provided
+ * "AS IS". IBM MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT
+ * NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE, REGARDING THE FUNCTION OR PERFORMANCE OF
+ * THIS CODE.  THIS CODE MAY CONTAIN ERRORS.  IBM shall not be liable
+ * for any damages arising out of your use of the sample code, even
+ * if it has been advised of the possibility of such damages.
+ * 
+ */
+
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.eclipse.wst.validation.internal.provisional.core.IMessage;
+import org.eclipse.wst.validation.internal.provisional.core.IValidator;
+
+/**
+ * This class manages the validation messages for each validator. Each validator's
+ * messages can be retrieved by using the validator's unique name as a key into the
+ * table. (i.e., call getMessages with the validator's unique name as the parameter.)
+ */
+public class MessageManager {
+	private static MessageManager _singleton = null;
+	private Comparator _comparator = null;
+
+	private Map _validationMessages = null;
+
+	private MessageManager() {
+		super();
+
+		_validationMessages = new HashMap(10);
+	}
+
+	/**
+	 * Return the MessageManager singleton.
+	 */
+	public static MessageManager getManager() {
+		if (_singleton == null) {
+			_singleton = new MessageManager();
+		}
+		return _singleton;
+	}
+	
+	/**
+	 * Return a map of all messages of the given severity. The key of the map
+	 * is the IValidator, the value of the IValidator is the List of IMessage
+	 * instances of the given severity.
+	 */
+	public Map getMessages(int messageTypes) {
+		Map messages = new HashMap();
+
+		Iterator iterator = _validationMessages.values().iterator();
+		while(iterator.hasNext()) {
+			ValidatorMessages mssg = (ValidatorMessages) iterator.next();
+
+			messages.put(mssg.getValidator().getClass().getName(), mssg.getMessages(messageTypes));
+		}
+		return messages;
+	}
+	
+	/**
+	 * This method returns the ValidationMessage owned by the identified validator,
+	 * if one exists. If one doesn't exist, it is created & registered, and then 
+	 * returned.
+	 */
+	public ValidatorMessages getMessages(IValidator validator) {
+		if (validator == null) {
+			return null;
+		}
+
+		ValidatorMessages message = (ValidatorMessages) _validationMessages.get(validator.getClass().getName());
+		if (message == null) {
+			// if it doesn't exist, create it.
+			message = new ValidatorMessages(validator);
+			_validationMessages.put(validator.getClass().getName(), message);
+		}
+		return message;
+	}
+	
+	/**
+	 * Remove all messages owned by the identified validator.
+	 */
+	public void removeAllMessages(IValidator validator) {
+		if (validator == null) {
+			return;
+		}
+
+		_validationMessages.remove(validator.getClass().getName());
+	}
+	
+	/**
+	 * Remove all messages, owned by the identified validator, reported
+	 * against the given target object.
+	 */
+	public void removeAllMessages(IValidator validator, Object object) {
+		if (validator == null) {
+			return;
+		}
+
+		ValidatorMessages message = getMessages(validator);
+		if (message != null) {
+			message.removeAllMessages(object);
+		}
+	}
+	
+	/**
+	 * To support removal of a subset of validation messages, an IValidator
+	 * may assign group names to IMessages. An IMessage subset will be identified
+	 * by the name of its group. Default (null) means no group. This method will
+	 * remove only the IMessage's that are in the group identified by groupName.
+	 */
+	public void removeMessageSubset(IValidator validator, Object object, String groupName) {
+		if (validator == null) {
+			return;
+		}
+
+		ValidatorMessages message = getMessages(validator);
+		if (message != null) {
+			message.removeAllMessages(object);
+		}
+	}
+
+	/**
+	 * Return the IMessage as a String suitable for displaying to the user.
+	 */
+	public static String formatMessage(IValidator validator, IMessage message) {
+		if (message == null) {
+			return ""; //$NON-NLS-1$
+		}
+
+		int severity = message.getSeverity();
+		Object object = message.getTargetObject();
+		StringBuffer formattedMessage = new StringBuffer();
+		switch (severity) {
+			case (IMessage.HIGH_SEVERITY) :
+				{
+					formattedMessage.append("Error: "); //$NON-NLS-1$
+					break;
+				}
+
+			case (IMessage.LOW_SEVERITY) :
+				{
+					formattedMessage.append("Information: "); //$NON-NLS-1$
+					break;
+				}
+
+			case (IMessage.NORMAL_SEVERITY) :
+			default :
+				{
+					formattedMessage.append("Warning: "); //$NON-NLS-1$
+					break;
+				}
+		}
+
+		formattedMessage.append(message.getText());
+
+		if (object != null) {
+			String fileName = FilesystemManager.getManager().getHelper(validator).getFileName(message);
+			int lineNumber = message.getLineNumber();
+
+			if((fileName != null) || (lineNumber != IMessage.LINENO_UNSET)) {
+				formattedMessage.append("["); //$NON-NLS-1$
+				if(fileName != null) {
+					formattedMessage.append(fileName);
+				}
+				if(lineNumber != IMessage.LINENO_UNSET) {
+					formattedMessage.append(" line number: "); //$NON-NLS-1$
+					formattedMessage.append(String.valueOf(lineNumber));
+				}
+				formattedMessage.append("] "); //$NON-NLS-1$
+			}
+		}
+
+		return formattedMessage.toString();
+	}
+
+	/**
+	 * This Comparator is used to sort messages first by file name, then by line number.
+	 */
+	public Comparator getMessageComparator(final IFilesystemHelper helper) {
+		if(_comparator == null) {
+			_comparator = 	new Comparator() {
+				protected int compare(String a, String b) {
+					if((a == null) && (b == null)) {
+						return 0;
+					}
+					else if(a == null) {
+						return -1;
+					}
+					else if(b == null) {
+						return 1;
+					}
+					
+					return a.compareTo(b);
+				}
+				
+				protected int compare(int a, int b) {
+					if((a == IMessage.LINENO_UNSET) && (b == IMessage.LINENO_UNSET)) {
+						return 0;
+					}
+					else if(a == IMessage.LINENO_UNSET) {
+						return -1;
+					}
+					else if(b == IMessage.LINENO_UNSET) {
+						return 1;
+					}
+					
+					return (a - b);
+				}
+				
+				public int compare(Object a, Object b) {
+					if((a == null) && (b == null)) {
+						return 0;
+					}
+					else if(a == null) {
+						return -1;
+					}
+					else if(b == null) {
+						return 1;
+					}
+					
+					IMessage aMssg = (IMessage)a;
+					IMessage bMssg = (IMessage)b;
+					
+					// Sort by file name, then line number. Unset line numbers go to the start of the list.
+					String aFileName = helper.getFileName(aMssg);
+					String bFileName = helper.getFileName(bMssg);
+					int result = compare(aFileName, bFileName);
+					if(result != 0) {
+						return result;
+					}
+					
+					int aLineNumber = aMssg.getLineNumber();
+					int bLineNumber = bMssg.getLineNumber();
+					return compare(aLineNumber, bLineNumber);
+				}
+			};
+		}
+		return _comparator;
+	}
+}
diff --git a/tests/org.eclipse.jst.validation.sample/filesystemFWK/org/eclipse/jst/validation/sample/filesystem/ValidatorMessages.java b/tests/org.eclipse.jst.validation.sample/filesystemFWK/org/eclipse/jst/validation/sample/filesystem/ValidatorMessages.java
new file mode 100644
index 0000000..f316df0
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.sample/filesystemFWK/org/eclipse/jst/validation/sample/filesystem/ValidatorMessages.java
@@ -0,0 +1,171 @@
+package org.eclipse.jst.validation.sample.filesystem;
+/*
+ * Licensed Material - Property of IBM 
+ * (C) Copyright IBM Corp. 2002, 2003 - All Rights Reserved. 
+ * US Government Users Restricted Rights - Use, duplication or disclosure 
+ * restricted by GSA ADP Schedule Contract with IBM Corp. 
+ *
+ * DISCLAIMER OF WARRANTIES.
+ * The following [enclosed] code is sample code created by IBM
+ * Corporation. This sample code is not part of any standard or IBM
+ * product and is provided to you solely for the purpose of assisting
+ * you in the development of your applications.  The code is provided
+ * "AS IS". IBM MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT
+ * NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE, REGARDING THE FUNCTION OR PERFORMANCE OF
+ * THIS CODE.  THIS CODE MAY CONTAIN ERRORS.  IBM shall not be liable
+ * for any damages arising out of your use of the sample code, even
+ * if it has been advised of the possibility of such damages.
+ * 
+ */
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.wst.validation.internal.provisional.core.IMessage;
+import org.eclipse.wst.validation.internal.provisional.core.IValidator;
+
+/**
+ * This class manages messages for one validator. Each validator 
+ * can store three types of messages: error (SeverityEnum.HIGH_SEVERITY), 
+ * warning (SeverityEnum.NORMAL_SEVERITY), and info (SeverityEnum.LOW_SEVERITY).
+ * Each message is associated with an Object (for incremental validation).
+ * If a message does not apply to a particular Object, the default Object
+ * is used.
+ *
+ * Each Object is associated with either 0, 1, or >1 messages. 
+ */
+public class ValidatorMessages {
+	private Map _messages = null;
+	private IValidator _validator = null;
+	protected static final Object DEFAULT_OBJECT = new Object();
+
+	public ValidatorMessages(IValidator validator) {
+		_messages = new HashMap();
+		_validator = validator;
+	}
+	
+	/**
+	 * Return the validator that owns these messages.
+	 */
+	public IValidator getValidator() {
+		return _validator;
+	}
+	
+	/**
+	 * Add an IMessage to the default group.
+	 */
+	public void addValidationMessage(IMessage message) {
+		addValidationMessage(message, null);
+	}
+	
+	/**
+	 * Add an IMessage to the named group.
+	 */
+	public void addValidationMessage(IMessage message, String groupName) {
+		if (message == null) {
+			return;
+		}
+
+		if (message.getTargetObject() == null) {
+			// If object is null, the error message does not apply to a particular object.
+			//
+			// This value might be used if, for example, the validator experiences an internal, unrecoverable error.
+			// You need to let the user know that validation terminated abnormally, but a list
+			// of the validation which proceeded normally can help to narrow down what part of the
+			// code caused a problem.
+			//
+			// Or it could be something generic, e.g. it applies to a .jar file, instead of a file in the .jar.
+			message.setTargetObject(getDefaultObject());
+		}
+		
+		if(groupName != null) {
+			message.setGroupName(groupName);
+		}
+
+		List list = (List) _messages.get(message.getTargetObject());
+		if (list == null) {
+			list = new ArrayList();
+		}
+		list.add(message);
+		_messages.put(message.getTargetObject(), list);
+	}
+	
+	/**
+	 * If the IMessage does not have a target object, the object
+	 * returned by this method is used as the key in the Map.
+	 */
+	public static Object getDefaultObject() {
+		return DEFAULT_OBJECT;
+	}
+	
+	/**
+	 * Return all messages whose severity matches the messageTypes severity.
+	 */
+	public List getMessages(int messageTypes) {
+		List messages = new ArrayList();
+
+		Iterator iterator = _messages.values().iterator();
+		while (iterator.hasNext()) {
+			List list = (List) iterator.next();
+
+			Object[] listContents = list.toArray();
+			for (int i = 0; i < listContents.length; i++) {
+				IMessage message = (IMessage) listContents[i];
+
+				if ((messageTypes & message.getSeverity()) != 0) {
+					messages.add(message);
+				}
+			}
+		}
+		return messages;
+	}
+	
+	/**
+	 * Remove all messages that apply to the given object. If object is
+	 * null, the messages owned by the default object are removed.
+	 */
+	public void removeAllMessages(Object object) {
+		if (object == null) {
+			object = getDefaultObject();
+		}
+
+		_messages.remove(object);
+	}
+	
+	/**
+	 * Remove all messages that apply to the given object which are in
+	 * the named group. If Object is null, the default object is used.
+	 */
+	public void removeMessageSubset(Object object, String groupName) {
+		if (groupName == null) {
+			removeAllMessages(object);
+			return;
+		}
+
+		if (object == null) {
+			object = getDefaultObject();
+		}
+
+		List list = (List) _messages.get(object);
+		if (list == null) {
+			return;
+		}
+
+		if (list.size() == 0) {
+			return;
+		}
+
+		Iterator iterator = list.iterator();
+		while (iterator.hasNext()) {
+			IMessage msg = (IMessage) iterator.next();
+			String msgGroupName = msg.getGroupName();
+			if (groupName.equals(msgGroupName)) {
+				list.remove(msg);
+			}
+		}
+	}
+}
diff --git a/tests/org.eclipse.jst.validation.sample/plugin.properties b/tests/org.eclipse.jst.validation.sample/plugin.properties
new file mode 100644
index 0000000..ae36f62
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.sample/plugin.properties
@@ -0,0 +1,2 @@
+#Properties file for org.eclipse.jst.validation.sample
+Bundle-Name.0 = Properties Validator
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.validation.sample/plugin.xml b/tests/org.eclipse.jst.validation.sample/plugin.xml
new file mode 100644
index 0000000..02e2e2b
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.sample/plugin.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+
+    
+<!--=======================================-->
+<!-- Properties Validator Contributions    -->
+<!--=======================================-->
+   <extension
+         id="PropertiesValidator"
+         name="Properties Validator"
+         point="org.eclipse.wst.validation.validator">
+      <validator>
+         <projectNature
+               id="org.eclipse.jdt.core.javanature">
+         </projectNature>
+         <filter
+               objectClass="org.eclipse.core.resources.IFile"
+               nameFilter="*.properties"
+               action="add, change">
+         </filter>
+         <run
+               enabled="false"
+               async="false"
+               class="org.eclipse.jst.validation.sample.PropertiesValidator">
+         </run>
+         <helper
+               class="org.eclipse.jst.validation.sample.workbenchimpl.PropertiesHelper">
+         </helper>
+      </validator>
+   </extension>
+<!--=======================================-->
+<!-- Validation Documentation              -->
+<!--=======================================-->
+<!--                                       -->
+<!-- Validator Developer's Guide           -->
+<!--                                       -->
+<!--
+   <extension
+         point="org.eclipse.help.toc">
+      <toc
+            file="doc/developerGuide/toc.xml"
+            primary="true">
+      </toc>
+   </extension>
+-->
+<!--                                       -->
+<!-- Validation Guide                      -->
+<!--                                       -->
+<!--
+   <extension
+         point="org.eclipse.help.toc">
+      <toc
+            file="doc/guide/toc.xml"
+            primary="true">
+      </toc>
+   </extension>
+-->
+
+</plugin>
diff --git a/tests/org.eclipse.jst.validation.sample/pom.xml b/tests/org.eclipse.jst.validation.sample/pom.xml
new file mode 100644
index 0000000..fdd9a46
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.sample/pom.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Copyright (c) 2012, 2013 Eclipse Foundation and others.
+  All rights reserved. This program and the accompanying materials
+  are made available under the terms of the Eclipse Distribution License v1.0
+  which accompanies this distribution, and is available at
+  http://www.eclipse.org/org/documents/edl-v10.php
+ 
+  Contributors:
+    Thanh Ha (Eclipse Foundation) - initial implementation
+-->
+
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.eclipse.webtools.javaee</groupId>
+    <artifactId>javaee.tests</artifactId>
+    <version>3.6.0-SNAPSHOT</version>
+  </parent>
+
+  <groupId>org.eclipse.webtools.javaee</groupId>
+  <artifactId>org.eclipse.jst.validation.sample</artifactId>
+  <version>1.1.1-SNAPSHOT</version>
+  <packaging>eclipse-plugin</packaging>
+</project>
diff --git a/tests/org.eclipse.jst.validation.sample/prop.bat b/tests/org.eclipse.jst.validation.sample/prop.bat
new file mode 100644
index 0000000..80bf940
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.sample/prop.bat
@@ -0,0 +1,45 @@
+@echo off
+REM Licensed Material - Property of IBM 
+REM (C) Copyright IBM Corp. 2002, 2003 - All Rights Reserved. 
+REM US Government Users Restricted Rights - Use, duplication or disclosure 
+REM restricted by GSA ADP Schedule Contract with IBM Corp. 
+REM 
+REM DISCLAIMER OF WARRANTIES.
+REM The following [enclosed] code is sample code created by IBM
+REM Corporation. This sample code is not part of any standard or IBM
+REM product and is provided to you solely for the purpose of assisting
+REM you in the development of your applications.  The code is provided
+REM "AS IS". IBM MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT
+REM NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+REM FOR A PARTICULAR PURPOSE, REGARDING THE FUNCTION OR PERFORMANCE OF
+REM THIS CODE.  THIS CODE MAY CONTAIN ERRORS.  IBM shall not be liable
+REM for any damages arising out of your use of the sample code, even
+REM if it has been advised of the possibility of such damages.
+REM 
+REM This batch file fires off the property file parse or comparison.
+REM
+setlocal
+
+if "%JAVA_HOME%" EQU "" goto NO_JAVA
+
+set CLASSPATH=%CLASSPATH%;..\com.ibm.etools.validation.core_5.1.0\runtime\common.jar
+set CLASSPATH=%CLASSPATH%;.\runtime\propertiesValidator.jar
+if "%1" == "" goto syntax
+
+%JAVA_HOME%\bin\java com.ibm.etools.parser.Main %1 %2 %3
+goto :end
+
+:NO_JAVA
+echo.
+echo The JAVA_HOME environment variable must be set to the JRE directory.
+echo e.g., set JAVA_HOME=C:\JRE
+echo where JRE has a subdirectory named "bin"
+echo.
+goto :end
+
+:syntax
+%JAVA_HOME%\bin\java com.ibm.etools.parser.Main
+
+:end
+endlocal
+@echo on
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.validation.sample/propertiesValFS/org/eclipse/jst/validation/sample/filesystemimpl/FilesystemPropertiesHelper.java b/tests/org.eclipse.jst.validation.sample/propertiesValFS/org/eclipse/jst/validation/sample/filesystemimpl/FilesystemPropertiesHelper.java
new file mode 100644
index 0000000..32bbfb3
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.sample/propertiesValFS/org/eclipse/jst/validation/sample/filesystemimpl/FilesystemPropertiesHelper.java
@@ -0,0 +1,203 @@
+package org.eclipse.jst.validation.sample.filesystemimpl;
+/*
+ * Licensed Material - Property of IBM 
+ * (C) Copyright IBM Corp. 2002, 2003 - All Rights Reserved. 
+ * US Government Users Restricted Rights - Use, duplication or disclosure 
+ * restricted by GSA ADP Schedule Contract with IBM Corp. 
+ *
+ * DISCLAIMER OF WARRANTIES.
+ * The following [enclosed] code is sample code created by IBM
+ * Corporation. This sample code is not part of any standard or IBM
+ * product and is provided to you solely for the purpose of assisting
+ * you in the development of your applications.  The code is provided
+ * "AS IS". IBM MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT
+ * NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE, REGARDING THE FUNCTION OR PERFORMANCE OF
+ * THIS CODE.  THIS CODE MAY CONTAIN ERRORS.  IBM shall not be liable
+ * for any damages arising out of your use of the sample code, even
+ * if it has been advised of the possibility of such damages.
+ * 
+ */
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.LineNumberReader;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+import org.eclipse.jst.validation.sample.PModelEnum;
+import org.eclipse.jst.validation.sample.filesystem.IFilesystemHelper;
+import org.eclipse.jst.validation.sample.parser.APropertyFile;
+import org.eclipse.jst.validation.sample.parser.PropertyLine;
+import org.eclipse.wst.validation.internal.core.FileDelta;
+import org.eclipse.wst.validation.internal.core.IFileDelta;
+import org.eclipse.wst.validation.internal.provisional.core.IMessage;
+
+/**
+ * This class is the IValidationContext implementation, used by the PropertiesValidator,
+ * when the validator is run in the filesystem validation framework.
+ */
+public class FilesystemPropertiesHelper implements IFilesystemHelper {
+	public FilesystemPropertiesHelper() {
+		super();
+	}
+
+	/**
+	 * @see com.ibm.etools.validation.core.IValidationContext#loadModel(String)
+	 */
+	public Object loadModel(String symbolicName) {
+		return loadModel(symbolicName, null);
+	}
+
+	/**
+	 * @see com.ibm.etools.validation.core.IValidationContext#loadModel(String, Object[])
+	 */
+	public Object loadModel(String symbolicName, Object[] parm) {
+		if ((symbolicName == null) || (symbolicName.equals(""))) { //$NON-NLS-1$
+			return null;
+		}
+
+		if (symbolicName.equals(PModelEnum.LINEINPUTREADER) && (parm != null) && (parm.length == 1) && (parm[0] instanceof String)) {
+			return loadLineNumberReader((String) parm[0]);
+		}
+		else if (symbolicName.equals(PModelEnum.RELEASE_LINEINPUTREADER) && (parm != null) && (parm.length == 1) && (parm[0] instanceof LineNumberReader)) {
+			return releaseLineNumberReader((LineNumberReader) parm[0]);
+		}
+		else if (symbolicName.equals(PModelEnum.ALL_PROPERTIES_FILES)) {
+			return loadAllPropertiesFiles();
+		}
+		else if(symbolicName.equals(PModelEnum.FILTER)) {
+			// Because this environment does not copy resources into a "bin" directory,
+			// the input is already filtered.
+			return parm;
+		}
+		else {
+			return null;
+		}
+	}
+
+	/**
+	 * Given the file name of an existing .properties file, return
+	 * the LineNumberReader that will read the file.
+	 */
+	protected Object loadLineNumberReader(String fileName) {
+		File propertyFile = new File(fileName);
+		if (!propertyFile.exists() || !propertyFile.isFile()) {
+			return null;
+		}
+
+		FileReader input = null;
+		try {
+			input = new FileReader(propertyFile);
+		}
+		catch (FileNotFoundException e) {
+			return null;
+		}
+
+		// Because we want to read in a line at a time from the file, convert the FileReader to a LineReader
+		LineNumberReader lineInput = new LineNumberReader(input);
+		return lineInput;
+	}
+
+	/**
+	 * This method doesn't load anything; it releases the resources allocated
+	 * by the loadLineNumberReader method. Its result will never be used, so always
+	 * return null.
+	 */
+	protected Object releaseLineNumberReader(LineNumberReader reader) {
+		if (reader == null) {
+			return null;
+		}
+
+		try {
+			reader.close();
+		}
+		catch (IOException e) {
+		}
+
+		return null;
+	}
+
+	/**
+	 * When the validator is told to perform a full validation, this
+	 * method returns an IFileDelta[], with one IFileDelta for every
+	 * .properties file in the current directory and its subdirectories.
+	 */
+	protected Object loadAllPropertiesFiles() {
+		String pwd = System.getProperty("user.dir"); //$NON-NLS-1$
+		File pwdDir = new File(pwd);
+		if (!pwdDir.exists()) {
+			return null;
+		}
+
+		if (!pwdDir.isDirectory()) {
+			return null;
+		}
+
+		Set tempSet = new HashSet();
+		traverseDirectories(pwdDir, tempSet);
+		
+		IFileDelta[] result = new IFileDelta[tempSet.size()];
+		Iterator iterator = tempSet.iterator();
+		int count = 0;
+		while(iterator.hasNext()) {
+			File file = (File)iterator.next();
+			result[count++] = new FileDelta(file.getAbsolutePath(), IFileDelta.CHANGED);
+		}
+		tempSet.clear();
+		tempSet = null;
+		iterator = null;
+		return result;
+	}
+
+	/**
+	 * Traverse the directory, looking for .properties files, and if a
+	 * .properties file is found then add it to the Set.
+	 */
+	protected void traverseDirectories(File directoryToSearch, Set result) {
+		if (directoryToSearch == null) {
+			return;
+		}
+
+		if (directoryToSearch.isDirectory()) {
+			// Traverse into this directory's children.
+			String[] children = directoryToSearch.list();
+			for (int i = 0; i < children.length; i++) {
+				File child = new File(directoryToSearch, children[i]);
+				traverseDirectories(child, result);
+			}
+		}
+		else if(directoryToSearch.isFile()) {
+			String fileName = directoryToSearch.getName();
+			if((fileName != null) && fileName.endsWith("properties")) { //$NON-NLS-1$
+				result.add(directoryToSearch);
+			}
+		}
+	}
+	
+	/**
+	 * Given an IMessage, return the file name of the .properties file that
+	 * the message was reported against.
+	 */
+	public String getFileName(IMessage message) {
+		Object object = message.getTargetObject();
+		if(object instanceof PropertyLine) {
+			PropertyLine line = (PropertyLine)object;
+			APropertyFile pFile = line.getFile();
+			return pFile.getQualifiedFileName(); // a ValidationPropertyFile returns the file name as its qualified name
+		}
+		else if(object instanceof APropertyFile) {
+			APropertyFile pFile = (APropertyFile)object;
+			return pFile.getQualifiedFileName(); // a ValidationPropertyFile returns the file name as its qualified name
+		}
+		return "";	//$NON-NLS-1$
+	}
+
+	public String[] getURIs() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+}
diff --git a/tests/org.eclipse.jst.validation.sample/propertiesValWB/org/eclipse/jst/validation/sample/workbenchimpl/PluginPropertyFile.java b/tests/org.eclipse.jst.validation.sample/propertiesValWB/org/eclipse/jst/validation/sample/workbenchimpl/PluginPropertyFile.java
new file mode 100644
index 0000000..f1da946
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.sample/propertiesValWB/org/eclipse/jst/validation/sample/workbenchimpl/PluginPropertyFile.java
@@ -0,0 +1,239 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2008 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.jst.validation.sample.workbenchimpl;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.LineNumberReader;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.Locale;
+import java.util.logging.Level;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPluginDescriptor;
+import org.eclipse.core.runtime.IPluginRegistry;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Plugin;
+import org.eclipse.jem.util.logger.proxy.Logger;
+import org.eclipse.jst.validation.sample.parser.APropertyFile;
+import org.eclipse.jst.validation.sample.parser.MessageMetaData;
+import org.eclipse.wst.validation.internal.provisional.core.IMessage;
+
+/**
+ * A PluginPropertyFile represents a resource bundle that is exported by a plugin.
+ */
+public class PluginPropertyFile extends APropertyFile {
+	private String _bundleName = null;
+	private String _pluginId = null;
+	private String _langVariant = null; // e.g., en_US vs en
+	private ClassLoader _classLoader = null; // the ClassLoader used to load the bundle
+	
+	
+	/**
+	 * Both the pluginId and the bundleName must not be null, must
+	 * refer to an existing plugin, and must refer to an existing bundle 
+	 * exported by that plugin.
+	 */
+	public PluginPropertyFile(String pluginId, String bundleName) {
+		_pluginId = pluginId;
+		_bundleName = bundleName;
+		
+		ClassLoader cl = null;
+		InputStream inS = null;
+		Plugin plugin = getPlugin(pluginId);			
+		if(bundleName.equals("plugin")) { //$NON-NLS-1$
+			// Try loading it from the Plugin parent (a "plugin.properties")
+			cl = getPluginPropertiesClassLoader(plugin);
+		}
+		else {
+			cl = plugin.getDescriptor().getPluginClassLoader();
+		}
+		inS = getInputStream(cl, bundleName);
+		
+		InputStreamReader inR = new InputStreamReader(inS);
+		LineNumberReader lineR = new LineNumberReader(inR);
+		parseFile(lineR); // populate this property file
+		try {
+			lineR.close();
+			inR.close();
+		}
+		catch(IOException exc) {
+			Logger logger = PropertiesValidatorPlugin.getPlugin().getMsgLogger();;
+			if(logger.isLoggingLevel(Level.SEVERE)) {
+				logger.write(Level.SEVERE, exc);
+			}
+		}
+		
+		try {
+			if(inS != null) {
+				inS.close();
+			}
+		}
+		catch(IOException exc) {
+			Logger logger = PropertiesValidatorPlugin.getPlugin().getMsgLogger();
+			if(logger.isLoggingLevel(Level.SEVERE)) {
+				logger.write(Level.SEVERE, exc);
+			}
+		}
+		
+		_classLoader = cl; // store the ClassLoader which was used to load the bundle
+	}
+	
+	private InputStream getInputStream(ClassLoader cl, String bundleName) {
+		Locale l = Locale.getDefault();
+		String language = l.getLanguage();
+		String country = l.getCountry();
+		String variant = l.getVariant();
+		
+		String lang = null;
+		String lang_country = null;
+		String lang_country_variant = null;
+		if((language != null) && !(language.equals(""))) { //$NON-NLS-1$
+			lang = "_" + language; //$NON-NLS-1$
+		}
+
+		if((country != null) && !(country.equals(""))) { //$NON-NLS-1$
+			lang_country = lang + "_" + country; //$NON-NLS-1$
+		}
+
+		if((variant != null) && !(variant.equals(""))) { //$NON-NLS-1$
+			lang_country_variant = lang_country + "_" + variant; //$NON-NLS-1$
+		}
+		
+		InputStream inS = null;
+		if(lang_country_variant != null) {
+			inS = getResourceAsStream(cl, bundleName, lang_country_variant);
+			if(inS != null) {
+				_langVariant = lang_country_variant;
+				return inS;
+			}
+		}
+		
+		if(lang_country != null) {
+			inS = getResourceAsStream(cl, bundleName, lang_country);
+			if(inS != null) {
+				_langVariant = lang_country;
+				return inS;
+			}
+		}
+		
+		if(lang != null) {
+			inS = getResourceAsStream(cl, bundleName, lang);
+			if(inS != null) {
+				_langVariant = lang;
+				return inS;
+			}
+		}
+		
+		if(Locale.getDefault().equals(Locale.US)) {
+			// Running the TVT plugin in en_US mode, so return the default .properties file.
+			inS = getResourceAsStream(cl, bundleName, ""); //$NON-NLS-1$
+			if(inS != null) {
+				_langVariant = ""; //$NON-NLS-1$
+				return inS;
+			}
+		}
+		
+		return null;
+	}
+	
+	private final static InputStream getResourceAsStream(final ClassLoader cl, final String bundleName, final String language) {
+		String resName = bundleName.replace('.', '/') + language + ".properties"; //$NON-NLS-1$
+		return cl.getResourceAsStream(resName);
+	}
+	
+	private static ClassLoader getPluginPropertiesClassLoader(Plugin p) {
+		// Copied from PluginDescriptor.java's getResourceBundle method.
+		URL[] cp = ((URLClassLoader)p.getDescriptor().getPluginClassLoader()).getURLs();
+		URL[] newcp = new URL[cp.length+1];
+		for (int i=0; i<cp.length; i++) newcp[i+1] = cp[i];
+		try {
+			newcp[0] = Platform.resolve(p.getBundle().getEntry("/")); //$NON-NLS-1$ // always try to resolve URLs used in loaders
+		} catch(IOException e) {
+			newcp[0] = p.getBundle().getEntry("/"); //$NON-NLS-1$
+		}
+		ClassLoader resourceLoader = new URLClassLoader(newcp, null);
+		return resourceLoader;
+	}
+	
+	private static Plugin getPlugin(String pluginId) {
+		if (pluginId == null) {
+			return null;
+		}
+
+		IPluginRegistry registry = Platform.getPluginRegistry();
+		IPluginDescriptor pluginDesc = registry.getPluginDescriptor(pluginId);
+		if(pluginDesc == null) {
+			return null;
+		}
+		
+		try {
+			return pluginDesc.getPlugin();
+		}
+		catch(CoreException exc) {
+			Logger logger = PropertiesValidatorPlugin.getPlugin().getMsgLogger();;
+			if(logger.isLoggingLevel(Level.SEVERE)) {
+				logger.write(Level.SEVERE, exc);
+			}
+			return null;
+		}
+		
+	}
+
+	
+	/*
+	 * @see APropertyFile#report(String)
+	 */
+	public void report(String str) {
+		addParseWarning(new MessageMetaData(str));
+	}
+	
+	public void report(IMessage message) {
+		MessageMetaData mmd = new MessageMetaData(message.getBundleName(), message.getSeverity(), message.getId(), message.getParams(), message.getTargetObject(), message.getLineNumber(), message.getOffset(), message.getLength());
+		addParseWarning(mmd);
+	}
+	
+	public void report(MessageMetaData mmd) {
+		addParseWarning(mmd);
+	}
+	
+	public void addParseWarning(IMessage message) {
+		MessageMetaData mmd = new MessageMetaData(message.getBundleName(), message.getSeverity(), message.getId(), message.getParams(), message.getTargetObject(), message.getLineNumber(), message.getOffset(), message.getLength());
+		addParseWarning(mmd);
+	}
+	
+	public String getPluginId() {
+		return _pluginId;
+	}
+
+	public String getBundleName() {
+		return _bundleName;
+	}
+	
+	public String getQualifiedFileName() {
+		StringBuffer buffer = new StringBuffer(getPluginId());
+		buffer.append("::"); //$NON-NLS-1$
+		buffer.append(getBundleName());
+		buffer.append(_langVariant);
+		return buffer.toString();
+	}
+
+	public String getLangVariant() {
+		return _langVariant;
+	}
+	
+	public ClassLoader getClassLoader() {
+		return _classLoader;
+	}	
+}
diff --git a/tests/org.eclipse.jst.validation.sample/propertiesValWB/org/eclipse/jst/validation/sample/workbenchimpl/PropertiesHelper.java b/tests/org.eclipse.jst.validation.sample/propertiesValWB/org/eclipse/jst/validation/sample/workbenchimpl/PropertiesHelper.java
new file mode 100644
index 0000000..f3fa8aa
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.sample/propertiesValWB/org/eclipse/jst/validation/sample/workbenchimpl/PropertiesHelper.java
@@ -0,0 +1,234 @@
+package org.eclipse.jst.validation.sample.workbenchimpl;
+/*
+ * Licensed Material - Property of IBM 
+ * (C) Copyright IBM Corp. 2002, 2003 - All Rights Reserved. 
+ * US Government Users Restricted Rights - Use, duplication or disclosure 
+ * restricted by GSA ADP Schedule Contract with IBM Corp. 
+ *
+ * DISCLAIMER OF WARRANTIES.
+ * The following [enclosed] code is sample code created by IBM
+ * Corporation. This sample code is not part of any standard or IBM
+ * product and is provided to you solely for the purpose of assisting
+ * you in the development of your applications.  The code is provided
+ * "AS IS". IBM MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT
+ * NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE, REGARDING THE FUNCTION OR PERFORMANCE OF
+ * THIS CODE.  THIS CODE MAY CONTAIN ERRORS.  IBM shall not be liable
+ * for any damages arising out of your use of the sample code, even
+ * if it has been advised of the possibility of such damages.
+ * 
+ */
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.LineNumberReader;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.logging.Level;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceVisitor;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jem.util.logger.proxy.Logger;
+import org.eclipse.jst.validation.sample.PModelEnum;
+import org.eclipse.jst.validation.sample.parser.APropertyFile;
+import org.eclipse.jst.validation.sample.parser.PropertyLine;
+import org.eclipse.wst.validation.internal.core.IFileDelta;
+import org.eclipse.wst.validation.internal.operations.WorkbenchContext;
+import org.eclipse.wst.validation.internal.operations.WorkbenchFileDelta;
+
+/**
+ * This class implements the WebSphere Studio IValidationContext for the 
+ * Properties Validator.
+ */
+public class PropertiesHelper extends WorkbenchContext {
+	public PropertiesHelper() {
+		super();
+		 
+		registerModel(PModelEnum.LINEINPUTREADER, "loadLineNumberReader", new Class[]{java.lang.String.class}); //$NON-NLS-1$
+		registerModel(PModelEnum.RELEASE_LINEINPUTREADER, "releaseLineNumberReader", new Class[]{java.io.LineNumberReader.class}); //$NON-NLS-1$
+		registerModel(PModelEnum.ALL_PROPERTIES_FILES, "loadAllPropertiesFiles"); //$NON-NLS-1$
+		registerModel(PModelEnum.MSGLOGGER, "getMsgLogger"); //$NON-NLS-1$
+		registerModel(PModelEnum.FILTER, "filter", new Class[]{IFileDelta[].class}); //$NON-NLS-1$
+	}
+
+	/**
+	 * @see com.ibm.etools.validate.IWorkbenchContext#getTargetObjectName(Object)
+	 */
+	public String getTargetObjectName(Object object) {
+		return null;
+	}
+	
+	/**
+	 * @see com.ibm.etools.validate.IWorkbenchContext#getResource(Object)
+	 */
+	public IResource getResource(Object object) {
+		IFile file = null;
+		if(object instanceof PropertyLine) {
+			PropertyLine line = (PropertyLine)object;
+			APropertyFile pFile = line.getFile();
+			String fileName = pFile.getQualifiedFileName(); // a ValidationPropertyFile returns the file name as its qualified name
+			file = getFile(fileName);
+		}
+		else if(object instanceof APropertyFile) {
+			APropertyFile pFile = (APropertyFile)object;
+			String fileName = pFile.getQualifiedFileName(); // a ValidationPropertyFile returns the file name as its qualified name
+			file = getFile(fileName);
+		}
+		
+		if((file == null) || (!file.exists())) {
+			return super.getResource(object);
+		}
+		return file;
+	}
+	
+	/**
+	 * When a full validation is performed, this method returns an
+	 * IFileDelta[] containing one IFileDelta for each .properties 
+	 * file in the IProject.
+	 */
+	public IFileDelta[] loadAllPropertiesFiles() {
+		IProject project = getProject();
+		
+		final Set files = new HashSet();
+		IResourceVisitor visitor = new IResourceVisitor() {
+			public boolean visit(IResource res) throws CoreException {
+				if(!res.isAccessible()) {
+					return false; // if the resource isn't accessible then neither are its children
+				}
+				
+				if(isSrcFile(res)) { //$NON-NLS-1$
+					WorkbenchFileDelta newFileDelta = new WorkbenchFileDelta(res.getFullPath().toString(), IFileDelta.CHANGED, res);
+					files.add(newFileDelta);
+				}
+
+				return true; // visit the resource's children as well
+			}
+		};
+
+		try {
+			project.accept(visitor, IResource.DEPTH_INFINITE, true); // true means include phantom resources
+		}
+		catch(CoreException e) {
+			Logger logger = getMsgLogger();
+			if(logger.isLoggingLevel(Level.SEVERE)) {
+				logger.write(e);
+			}
+		}
+		
+		IFileDelta[] result = new IFileDelta[files.size()];
+		files.toArray(result);
+		return result;
+	}
+	
+	/**
+	 * Return the IFile handle for the file identified by fileName.
+	 * null will be returned if the file does not exist.
+	 */
+	public IFile getFile(String fileName) {
+		IFile file = (IFile)ResourcesPlugin.getWorkspace().getRoot().findMember(fileName);
+		return file;
+	}
+	
+	/**
+	 * Given the file name of an existing .properties file, return
+	 * the LineNumberReader that will read the file.
+	 */
+	public LineNumberReader loadLineNumberReader(String fileName) {
+		try {
+			IFile file = getFile(fileName);
+			InputStream in = file.getContents();
+			InputStreamReader reader = new InputStreamReader(in);
+	
+			// Because we want to read in a line at a time from the file, convert the InputStreamReader to a LineReader
+			LineNumberReader lineInput = new LineNumberReader(reader);
+			return lineInput;
+		}
+		catch(CoreException exc) {
+			Logger logger = getMsgLogger();
+			if(logger.isLoggingLevel(Level.SEVERE)) {
+				logger.write(exc);
+			}
+			return null;
+		}
+	}
+	
+	/**
+	 * This method doesn't load anything; it releases the resources allocated
+	 * by the loadLineNumberReader method. Its result will never be used, so always
+	 * return null.
+	 */
+	public LineNumberReader releaseLineNumberReader(LineNumberReader reader) {
+		if(reader == null) {
+			return null;
+		}
+		
+		try {
+			reader.close();
+		}
+		catch (IOException exc) {
+			Logger logger = getMsgLogger();
+			if(logger.isLoggingLevel(Level.SEVERE)) {
+				logger.write(exc);
+			}
+		}
+
+		return null;
+	}
+	
+	/**
+	 * The MsgLogger from this method can be used to log exceptions.
+	 * This method will never return null.
+	 */
+	public Logger getMsgLogger() {
+		return PropertiesValidatorPlugin.getPlugin().getMsgLogger();
+	}
+	
+	// package visibility for performance reasons (synthetic accessor method)
+	boolean isSrcFile(IResource res) {
+		// Want to filter out the copies in the "bin" directory.
+		if(res == null) {
+			return false;
+		}
+		
+		if(!(res instanceof IFile)) {
+			return false;
+		}
+		
+		if(!"properties".equals(res.getFileExtension())) { //$NON-NLS-1$
+			return false; 		
+		}
+		
+		if(res.isDerived()) {
+			// Created by eclipse
+			return false;
+		}
+		
+		return true;
+	}
+	
+	public IFileDelta[] filter(IFileDelta[] changedFiles) {
+		IFileDelta[] temp = new IFileDelta[changedFiles.length];
+		int count = 0;
+		for(int i=0; i<changedFiles.length; i++) {
+			IFileDelta fd = changedFiles[i];
+			IResource resource = ((WorkbenchFileDelta)fd).getResource();
+			if(isSrcFile(resource)) {
+				temp[count++] = fd;
+			}
+		}
+		
+		if(count == changedFiles.length) {
+			return changedFiles;
+		}
+		
+		IFileDelta[] result = new IFileDelta[count];
+		System.arraycopy(temp, 0, result, 0, count);
+		return result;
+	}
+
+}
diff --git a/tests/org.eclipse.jst.validation.sample/propertiesValWB/org/eclipse/jst/validation/sample/workbenchimpl/PropertiesValidatorPlugin.java b/tests/org.eclipse.jst.validation.sample/propertiesValWB/org/eclipse/jst/validation/sample/workbenchimpl/PropertiesValidatorPlugin.java
new file mode 100644
index 0000000..e4ba65d
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.sample/propertiesValWB/org/eclipse/jst/validation/sample/workbenchimpl/PropertiesValidatorPlugin.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2008 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.jst.validation.sample.workbenchimpl;
+
+import org.eclipse.jem.util.logger.proxy.Logger;
+import org.eclipse.wst.common.frameworks.internal.WTPPlugin;
+/**
+ * This class is the Plugin class identified by the com.ibm.etools.validation.core.prop's plugin.xml
+ * file (i.e., the &lt;plugin <br><br>
+ * class=&quot;class="com.ibm.etools.validation.core.properties.workbenchimpl.PropertiesValidatorPlugin"&quot&gt;
+ */
+public class PropertiesValidatorPlugin extends WTPPlugin {
+	private static PropertiesValidatorPlugin _inst = null;
+	public static final String PLUGIN_ID = "org.eclipse.jst.validation.sample"; //$NON-NLS-1$
+	private static Logger _logger;
+	public PropertiesValidatorPlugin() {
+		super();
+		if (_inst == null) {
+			_inst = this;
+		}
+	}
+	public static PropertiesValidatorPlugin getPlugin() {
+		return _inst;
+	}
+	public Logger getMsgLogger() {
+		if (_logger == null)
+			_logger = Logger.getLogger();
+		return _logger;
+	}
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.ibm.wtp.common.WTPPlugin#getPluginID()
+	 */
+	public String getPluginID() {
+		return PLUGIN_ID;
+	}
+}
diff --git a/tests/org.eclipse.jst.validation.sample/propertiesValidator/org/eclipse/jst/validation/sample/PModelEnum.java b/tests/org.eclipse.jst.validation.sample/propertiesValidator/org/eclipse/jst/validation/sample/PModelEnum.java
new file mode 100644
index 0000000..5616eed
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.sample/propertiesValidator/org/eclipse/jst/validation/sample/PModelEnum.java
@@ -0,0 +1,35 @@
+package org.eclipse.jst.validation.sample;
+/*
+ * Licensed Material - Property of IBM 
+ * (C) Copyright IBM Corp. 2002, 2003 - All Rights Reserved. 
+ * US Government Users Restricted Rights - Use, duplication or disclosure 
+ * restricted by GSA ADP Schedule Contract with IBM Corp. 
+ *
+ * DISCLAIMER OF WARRANTIES.
+ * The following [enclosed] code is sample code created by IBM
+ * Corporation. This sample code is not part of any standard or IBM
+ * product and is provided to you solely for the purpose of assisting
+ * you in the development of your applications.  The code is provided
+ * "AS IS". IBM MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT
+ * NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE, REGARDING THE FUNCTION OR PERFORMANCE OF
+ * THIS CODE.  THIS CODE MAY CONTAIN ERRORS.  IBM shall not be liable
+ * for any damages arising out of your use of the sample code, even
+ * if it has been advised of the possibility of such damages.
+ * 
+ */
+
+/**
+ * This class contains the constants that uniquely identify each
+ * model that the Properties Validator's helper must load. All of
+ * these models must be supported by the IValidationContext implementation
+ * or the helper cannot be used to support the Properties Validator.
+ */
+public interface PModelEnum {
+	public static final String LINEINPUTREADER = "get a LineInputReader for a .properties file"; //$NON-NLS-1$
+	public static final String RELEASE_LINEINPUTREADER = "relase (close) the LineInputReader"; //$NON-NLS-1$
+	public static final String ALL_PROPERTIES_FILES = "return an IFileDelta[] of all of the .properties files in the project"; //$NON-NLS-1$
+	public static final String MSGLOGGER = "get the MsgLogger needed to log messages. This MsgLogger must never be null."; //$NON-NLS-1$
+	public static final String FILTER = "get only the .properties files that are in src dir; filter out the .properties files that are in bin dir (i.e., don't validate the same file twice"; //$NON-NLS-1$
+
+}
diff --git a/tests/org.eclipse.jst.validation.sample/propertiesValidator/org/eclipse/jst/validation/sample/PropertiesValidator.java b/tests/org.eclipse.jst.validation.sample/propertiesValidator/org/eclipse/jst/validation/sample/PropertiesValidator.java
new file mode 100644
index 0000000..2ebfb28
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.sample/propertiesValidator/org/eclipse/jst/validation/sample/PropertiesValidator.java
@@ -0,0 +1,107 @@
+package org.eclipse.jst.validation.sample;
+/*
+ * Licensed Material - Property of IBM 
+ * (C) Copyright IBM Corp. 2002, 2003 - All Rights Reserved. 
+ * US Government Users Restricted Rights - Use, duplication or disclosure 
+ * restricted by GSA ADP Schedule Contract with IBM Corp. 
+ *
+ * DISCLAIMER OF WARRANTIES.
+ * The following [enclosed] code is sample code created by IBM
+ * Corporation. This sample code is not part of any standard or IBM
+ * product and is provided to you solely for the purpose of assisting
+ * you in the development of your applications.  The code is provided
+ * "AS IS". IBM MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT
+ * NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE, REGARDING THE FUNCTION OR PERFORMANCE OF
+ * THIS CODE.  THIS CODE MAY CONTAIN ERRORS.  IBM shall not be liable
+ * for any damages arising out of your use of the sample code, even
+ * if it has been advised of the possibility of such damages.
+ * 
+ */
+
+import java.io.LineNumberReader;
+import java.util.logging.Level;
+
+import org.eclipse.jem.util.logger.proxy.Logger;
+import org.eclipse.jst.validation.sample.parser.IValidationConstants;
+import org.eclipse.wst.validation.internal.core.IFileDelta;
+import org.eclipse.wst.validation.internal.core.Message;
+import org.eclipse.wst.validation.internal.core.ValidationException;
+import org.eclipse.wst.validation.internal.provisional.core.IMessage;
+import org.eclipse.wst.validation.internal.provisional.core.IReporter;
+import org.eclipse.wst.validation.internal.provisional.core.IValidationContext;
+import org.eclipse.wst.validation.internal.provisional.core.IValidator;
+
+/**
+ * This class checks that the .properties files has no syntax or
+ * or problems. This validator can run in any validation framework
+ * implementation.
+ */
+public class PropertiesValidator implements IValidator {
+
+	/*
+	 * @see IValidator#cleanup(IReporter)
+	 */
+	public void cleanup(IReporter reporter) {
+		// This validator doesn't cache anything so it doesn't need to clean anything up.
+	}
+
+	/*
+	 * @see IValidator#validate(IValidationContext, IReporter, IFileDelta[])
+	 */
+	public void validate(IValidationContext helper, IReporter reporter) throws ValidationException {
+		IFileDelta[] fileURIs = null;
+		if((fileURIs == null) || (fileURIs.length == 0)) {
+			fileURIs = (IFileDelta[])helper.loadModel(PModelEnum.ALL_PROPERTIES_FILES);
+		}
+		else {
+			// Filter out the files that are in the "bin" directory.
+			fileURIs = (IFileDelta[])helper.loadModel(PModelEnum.FILTER, new Object[]{helper.getURIs()});
+		}
+		if(fileURIs == null) {
+			// Problem loading the files. 
+			Logger logger = (Logger)helper.loadModel(PModelEnum.MSGLOGGER);
+			if(logger.isLoggingLevel(Level.SEVERE)) {
+				logger.write(Level.SEVERE,"changedFiles == null; terminating validation"); //$NON-NLS-1$
+				return;
+			}
+		}
+		String[] uris = helper.getURIs();
+		for (int i = 0; i < uris.length; i++) {
+			// Load the reader for the file
+			LineNumberReader reader = null;
+			try {
+				reader = (LineNumberReader)helper.loadModel(PModelEnum.LINEINPUTREADER, new Object[]{uris[i]});
+				if(reader == null) {
+					// Either: 
+					// 1. The file doesn't exist or
+					// 2. The file isn't a .properties file or
+					// 3. The file can't be read
+					IMessage message = new Message(IValidationConstants.BUNDLENAME, IMessage.NORMAL_SEVERITY, IValidationConstants.ABCD0090, new String[]{uris[i]});
+					reporter.addMessage(this, message);
+					continue;
+				}
+	
+				// If we can get a reader then we can get a PropertyFile
+				ValidatorPropertyFile propFile = new ValidatorPropertyFile(reader, uris[i], reporter, this);
+				propFile.printSyntaxWarnings();
+				propFile.printDuplicateMessageId();
+				propFile.printDuplicateMessagePrefix();
+			}
+			finally {
+				// Don't catch Throwable, MessageLimitException, OperationCanceledException, or ValidationException.
+				// Let them travel up to the framework and the framework will log or cleanup as appropriate.
+				if(reader != null) {
+					// Release the reader for the file.
+					// Because different validation frameworks may allocate LineNumberReaders
+					// differently, don't close the reader in the validator. Instead, pass the
+					// reader back to the helper, and regardless of whether the reader should 
+					// be closed or reused, the helper knows the right thing to do for its
+					// framework environment.
+					helper.loadModel(PModelEnum.RELEASE_LINEINPUTREADER, new Object[]{reader});
+				}
+			}
+		}
+	}
+	
+}
diff --git a/tests/org.eclipse.jst.validation.sample/propertiesValidator/org/eclipse/jst/validation/sample/ValidatorPropertyFile.java b/tests/org.eclipse.jst.validation.sample/propertiesValidator/org/eclipse/jst/validation/sample/ValidatorPropertyFile.java
new file mode 100644
index 0000000..d1dd36e
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.sample/propertiesValidator/org/eclipse/jst/validation/sample/ValidatorPropertyFile.java
@@ -0,0 +1,115 @@
+package org.eclipse.jst.validation.sample;
+/*
+ * Licensed Material - Property of IBM 
+ * (C) Copyright IBM Corp. 2002, 2003 - All Rights Reserved. 
+ * US Government Users Restricted Rights - Use, duplication or disclosure 
+ * restricted by GSA ADP Schedule Contract with IBM Corp. 
+ *
+ * DISCLAIMER OF WARRANTIES.
+ * The following [enclosed] code is sample code created by IBM
+ * Corporation. This sample code is not part of any standard or IBM
+ * product and is provided to you solely for the purpose of assisting
+ * you in the development of your applications.  The code is provided
+ * "AS IS". IBM MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT
+ * NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE, REGARDING THE FUNCTION OR PERFORMANCE OF
+ * THIS CODE.  THIS CODE MAY CONTAIN ERRORS.  IBM shall not be liable
+ * for any damages arising out of your use of the sample code, even
+ * if it has been advised of the possibility of such damages.
+ * 
+ */
+
+import java.io.LineNumberReader;
+
+import org.eclipse.jst.validation.sample.parser.APropertyFile;
+import org.eclipse.jst.validation.sample.parser.MessageMetaData;
+import org.eclipse.wst.validation.internal.core.Message;
+import org.eclipse.wst.validation.internal.provisional.core.IMessage;
+import org.eclipse.wst.validation.internal.provisional.core.IReporter;
+import org.eclipse.wst.validation.internal.provisional.core.IValidator;
+
+/**
+ * This class represents an APropertyFile that is instantiated by a validator.
+ */
+public class ValidatorPropertyFile extends APropertyFile {
+	private IReporter _reporter = null;
+	private IValidator _validator = null;
+	private String _fileName = null; // if this is created from a reader instead of a file name, we only have the bundle name
+	
+	public ValidatorPropertyFile(LineNumberReader reader, String fileName, IReporter reporter, IValidator validator) {
+		super();
+		setFileName(fileName);
+		_reporter = reporter;
+		_validator = validator;
+		parseFile(reader);
+	}
+	
+	public void setFileName(String bundleName) {
+		_fileName = bundleName;
+	}
+	
+	/**
+	 * Return the name of the .properties file (or bundle).
+	 */
+	public String getFileName() {
+		return _fileName;
+	}
+	
+	/*
+	 * @see APropertyFile#report(String)
+	 */
+	public void report(String str) {
+		// Never print titles like "DUPLICATE MESSAGE IDS". Print only the IMessage.
+	}
+	
+	/*
+	 * @see APropertyFile#report(MessageMetaData)
+	 */
+	public void report(MessageMetaData mmd) {
+		IMessage message = new Message();
+		message.setBundleName(mmd.getBundleName());
+		message.setSeverity(getSeverity(mmd.getSeverity()));
+		message.setId(mmd.getId());
+		message.setParams(mmd.getParams());
+		message.setTargetObject(mmd.getTargetObject());
+		message.setLineNo(mmd.getLineNumber());
+		message.setLength(mmd.getLength());
+		message.setOffset(mmd.getOffset());
+		message.setLength(mmd.getLength());
+		_reporter.addMessage(getValidator(), message);
+	}
+	
+	/**
+	 * Given the severity of the MessageMetaData, return the corresponding
+	 * severity of the validation framework.
+	 */
+	private static int getSeverity(int mmdSeverity) {
+		switch(mmdSeverity) {
+			case(MessageMetaData.ERROR): {
+				return IMessage.HIGH_SEVERITY;
+			}
+			
+			case(MessageMetaData.INFO): {
+				return IMessage.LOW_SEVERITY;
+			}
+			
+			default: {
+				return IMessage.NORMAL_SEVERITY;
+			}
+		}
+	}
+	
+	/**
+	 * Return the IValidator instance that is checking this file.
+	 */
+	public IValidator getValidator() {
+		return _validator;
+	}
+
+	/**
+	 * Return the name of this file that identifies this file uniquely.
+	 */
+	public String getQualifiedFileName() {
+		return getFileName();
+	}
+}
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.validation.sample/propertiesValidator/org/eclipse/jst/validation/sample/parser/APropertyFile.java b/tests/org.eclipse.jst.validation.sample/propertiesValidator/org/eclipse/jst/validation/sample/parser/APropertyFile.java
new file mode 100644
index 0000000..2dc8b9e
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.sample/propertiesValidator/org/eclipse/jst/validation/sample/parser/APropertyFile.java
@@ -0,0 +1,728 @@
+package org.eclipse.jst.validation.sample.parser;
+/*
+ * Licensed Material - Property of IBM 
+ * (C) Copyright IBM Corp. 2002, 2003 - All Rights Reserved. 
+ * US Government Users Restricted Rights - Use, duplication or disclosure 
+ * restricted by GSA ADP Schedule Contract with IBM Corp. 
+ *
+ * DISCLAIMER OF WARRANTIES.
+ * The following [enclosed] code is sample code created by IBM
+ * Corporation. This sample code is not part of any standard or IBM
+ * product and is provided to you solely for the purpose of assisting
+ * you in the development of your applications.  The code is provided
+ * "AS IS". IBM MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT
+ * NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE, REGARDING THE FUNCTION OR PERFORMANCE OF
+ * THIS CODE.  THIS CODE MAY CONTAIN ERRORS.  IBM shall not be liable
+ * for any damages arising out of your use of the sample code, even
+ * if it has been advised of the possibility of such damages.
+ * 
+ */
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.LineNumberReader;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * This class represents a .properties file; extensions of this class implement
+ * environment-specific messages, such as how to report the known problems. This
+ * class, and every class in the org.eclipse.jst.validation.sample.parser package, is independent
+ * of the framework environment.
+ */
+public abstract class APropertyFile {
+	private static final String EQUALS = "="; //$NON-NLS-1$
+
+	private List _propertyLines = null; // The List of PropertyLine instances.
+	private List _parseWarnings = null; // The List of MessageMetaData warnings found when parsing the .properties file.
+	private boolean _debug = false;
+
+	/**
+	 * Return a name that identifies this file uniquely.
+	 */
+	public abstract String getQualifiedFileName();
+	
+	/**
+	 * Tell the user that there is a problem - in WebSphere Studio, this
+	 * shows up as a row in the Task View; in the sample filesystem framework,
+	 * this appears as a message to System.out.
+	 */
+	public abstract void report(String str);
+	
+	/**
+	 * Tell the user that there is a problem - in WebSphere Studio, this
+	 * shows up as a row in the Task View; in the sample filesystem framework,
+	 * this appears as a message to System.out.
+	 */
+	public abstract void report(MessageMetaData mmd);
+	
+	protected APropertyFile() {
+		_propertyLines = new ArrayList();
+		_parseWarnings = new ArrayList();
+	}
+	
+	/**
+	 * Add the List of MessageMetaData to the list of warning messages.
+	 */
+	public void addParseWarnings(List list) {
+		_parseWarnings.addAll(list);
+	}
+
+	/**
+	 * Add a single warning message to the list of parse warnings.
+	 */
+	public void addParseWarning(MessageMetaData mmd) {
+		_parseWarnings.add(mmd);
+	}
+		
+	/**
+	 * Return the List of warning messages that report problems found
+	 * while parsing the .properties file.
+	 */
+	public List getParseWarnings() {
+		return _parseWarnings;
+	}
+	
+	
+	public String toString() {
+		return getQualifiedFileName();
+	}
+
+	/**
+	 * Should debug information be printed when parsing?
+	 */	
+	public boolean debug() {
+		return _debug;
+	}
+	
+	protected void setDebug(boolean d) {
+		_debug = d;
+	}
+	
+	public boolean equals(Object o) {
+		if(o == null) {
+			return false;
+		}
+		
+		if(!(o instanceof PropertyFile)) {
+			return false;
+		}
+		
+		PropertyFile file = (PropertyFile)o;
+		return getQualifiedFileName().equals(file.getQualifiedFileName());
+	}
+	
+	public int hashCode() {
+		return getQualifiedFileName().hashCode();
+	}
+
+	/**
+	 * Return the number of messages in the file, including duplicates & blanks.
+	 */
+	public int getNumProperties() {
+		return _propertyLines.size();
+	}
+
+	/**
+	 * Excluding message ids and error ids, output the number of words in the
+	 * .properties file.
+	 */
+	public int getNumWords() {
+		// NOT a fast method....how to optimize?
+		Iterator iterator = _propertyLines.iterator();
+		int count = 0;
+		while (iterator.hasNext()) {
+			PropertyLine line = (PropertyLine) iterator.next();
+			count += line.getNumWords();
+		}
+		return count;
+	}
+	
+	/**
+	 * Return a count of the number of unique message prefixes in the file.
+	 * (A message prefix starts the message text, e.g., ABCD0000E.)
+	 */
+	public int getNumUniquePrefixes() {
+		Set uniqueIds = new HashSet();
+		Iterator iterator = getPropertyLines().iterator();
+		while(iterator.hasNext()) {
+			PropertyLine line = (PropertyLine)iterator.next();
+			if(line.hasMessagePrefix()) {
+				uniqueIds.add(line.getMessagePrefix());
+			}
+		}
+		return uniqueIds.size();
+	}
+	
+	/**
+	 * Return a count of the number of message prefixes used in the file.
+	 * Usually this is the same as the number of unique prefixes, but if 
+	 * a .properties file has variations of a message (slightly different 
+	 * wording for a different context), then the number of prefixes will 
+	 * be larger than the number of unique prefixess.
+	 */
+	public int getNumPrefixes() {
+		int count = 0;
+		Iterator iterator = getPropertyLines().iterator();
+		while(iterator.hasNext()) {
+			PropertyLine line = (PropertyLine)iterator.next();
+			if(line.hasMessagePrefix()) {
+				count++;
+			}
+		}
+		return count;
+	}
+
+	/**
+	 * Return a count of the number of messages that do not use prefixes in the file.
+	 */
+	public int getNumWithoutPrefixes() {
+		int count = 0;
+		Iterator iterator = getPropertyLines().iterator();
+		while(iterator.hasNext()) {
+			PropertyLine line = (PropertyLine)iterator.next();
+			if(!line.hasMessagePrefix()) {
+				count++;
+			}
+		}
+		return count;
+	}
+
+	/**
+	 * Return a List of the PropertyLine instances contained in this file.
+	 */
+	public List getPropertyLines() {
+		return _propertyLines;
+	}
+	
+	/**
+	 * Return the PropertyLine instance that is identified by the 
+	 * given messageId.
+	 */
+	public PropertyLine getPropertyLine(String messageId) {
+		Collections.sort(_propertyLines, PropertyLineComparator.getMessageIdComparator());
+		int index = Collections.binarySearch(_propertyLines, messageId, PropertyLineComparator.getMessageIdComparator());
+		if(index < 0) {
+			return null;
+		}
+		
+		PropertyLine result = (PropertyLine)_propertyLines.get(index);
+		return result;
+	}
+
+	/**
+	 * Parse the file to create a collection of uniquely identified 
+	 * keys with their associated values. If there are any duplicate 
+	 * keys, the last value is the one that is stored. Store the 
+	 * value of the duplicate keys, and the line number on which 
+	 * each instance of the key (and its value) are located.
+	 */
+	protected void parseFile(File propertyFile) {
+		FileReader input = null;
+		LineNumberReader lineInput = null;
+		try {
+			input = new FileReader(propertyFile);
+		}
+		catch (FileNotFoundException e) {
+			// We can ignore this exception because we have already checked in the constructor that the
+			// file exists.
+		}
+
+		// Because we want to read in a line at a time from the file, convert the FileReader to a LineReader
+		lineInput = new LineNumberReader(input);
+		
+		parseFile(lineInput);
+		
+		try {
+			lineInput.close();
+		}
+		catch (IOException e) {
+		}
+		input = null;
+		lineInput = null;
+	}
+		
+	/**
+	 * Given a LineNumberReader on a .properties file, read the
+	 * file and note any problems that may need to be reported to
+	 * the user.
+	 */
+	protected void parseFile(LineNumberReader lineInput) {
+		_propertyLines.clear();
+		_parseWarnings.clear();
+
+		boolean isNewKey = true;
+		String key = null;
+		int lineNumber = 0;
+		String value = null;
+		int offset = 0; // each .properties line needs to know its offset so that columns in the line can be calculated.
+		int messageOffset = 0; // the offset, relative to the start of the line, where the message prefix starts
+		String line = null;
+		while (true) {
+			try {
+				line = lineInput.readLine(); // calculate the offset in the finally block
+				if (line == null)
+					break;
+				line = line.trim();
+
+				// ignore blank lines
+				if (line.equals("")) //$NON-NLS-1$
+					continue;
+
+				// strip off lines that begin with '#'
+				if (line.startsWith("#")) //$NON-NLS-1$
+					continue;
+
+				// strip off lines that begin with '/'
+				if (line.startsWith("/")) //$NON-NLS-1$
+					continue;
+
+				if (isNewKey) {
+					// We know that the line is of the form
+					//
+					// KEYNAME = VALUE
+					//
+					if (line.indexOf(EQUALS) != -1) {
+						// Make sure the line is not of the form " = Message" (i.e., missing the message id).
+						if(line.indexOf(EQUALS) == 0) {
+							throw new java.util.NoSuchElementException();
+						}
+						
+						// The user may or may not put spaces between the key
+						// name, the equals sign, and the value. This gives us four cases:
+						//    1. keyname=value
+						//    2. keyname= value
+						//    3. keyname =value
+						//    4. keyname = value
+						// The way to deal with all four cases is to find the index of the
+						// '=' sign, and the value is the remainder of the line after the
+						// sign.
+						//
+						key = line.substring(0, line.indexOf(EQUALS));
+						key = key.trim();
+
+						// add 1 to the EQUALS index because '=' is one character long
+						value = line.substring(line.indexOf(EQUALS) + 1);
+						value = value.trim();
+
+						messageOffset = line.indexOf(value);
+
+						lineNumber = lineInput.getLineNumber();
+					}
+					else {
+						// error in line syntax
+						throw new java.util.NoSuchElementException();
+					}
+				}
+				else {
+					// need to read in the multiple lines to get the multi-line value
+					value += line;
+				}
+
+				if (value.endsWith("\\")) { //$NON-NLS-1$
+					// multi-line value
+					// read in every line from the file until you reach an end-of-line
+					isNewKey = false;
+				}
+				else {
+					// end of multi-line value, or end of single-line value
+					isNewKey = true;
+					PropertyLine pline = new PropertyLine(this, offset, messageOffset, key, value, lineNumber);
+					_propertyLines.add(pline);
+				}
+			}
+			catch (IOException e) {
+				// When there is an IOException, we have reached the end of the file.
+				break;
+			}
+			catch (NullPointerException e) {
+				// If a line is not of the form KEYNAME = VALUE, there might be a null exception.
+				// Just continue onto the next line in the file
+				MessageMetaData mmd = new MessageMetaData(IValidationConstants.BUNDLENAME, MessageMetaData.ERROR, IValidationConstants.ABCD0080, null, this, lineInput.getLineNumber());
+				report(mmd);
+				break;
+			}
+			catch (java.util.NoSuchElementException e) {
+				// If a line is not of the form KEYNAME = VALUE, there might be a NoSuchElement exception.
+				// Just continue onto the next line in the file
+				MessageMetaData mmd = new MessageMetaData(IValidationConstants.BUNDLENAME, MessageMetaData.ERROR, IValidationConstants.ABCD0080, null, this, lineInput.getLineNumber());
+				report(mmd);
+			}
+			finally {
+				if(line != null) {
+					offset += line.length() + 2; // hack. 
+					// Can't get offset from BufferedReader, and since the reader strips 
+					// the '\n' and '\r' from the line before the line is returned, the 
+					// true length of the line can't be ascertained. This hack will not 
+					// work on Unix because unix's EOL char is different than Windows.
+					//
+					// When there's time, need to find an alternative to LineNumberReader.
+				}
+			}
+		}
+	}
+	
+	/**
+	 * Print a list of all message prefixes, e.g., ABCD0000E, that are used
+	 * in the .properties file.
+	 */
+	public void printAllMessagePrefixes() {
+		report("Line Number\tMessage prefix\tMessage id"); //$NON-NLS-1$
+		Collections.sort(_propertyLines, PropertyLineComparator.getMessagePrefixComparator());
+		Iterator iterator = _propertyLines.iterator();
+		while(iterator.hasNext()) {
+			PropertyLine line = (PropertyLine)iterator.next();
+			if((line.getMessagePrefix() != null) && (!line.getMessagePrefix().equals(""))) { //$NON-NLS-1$
+				StringBuffer buffer = new StringBuffer(String.valueOf(line.getLineNumber()));
+				buffer.append("\t"); //$NON-NLS-1$
+				buffer.append(line.getMessagePrefix());
+				buffer.append("\t"); //$NON-NLS-1$
+				buffer.append(line.getMessageId());
+				report(buffer.toString());
+			}
+		}
+	}
+
+	/**
+	 * Print a list of all of the message prefixes, e.g., ABCD1111E, 
+	 * that are not used in the file. A message prefix is considered
+	 * &quot;missing&quot; if a message prefix that precedes it, 
+	 * e.g. ABCD0000E, and a message prefix that follows it, 
+	 * e.g. ABCD2222E, are contained in the file, but the prefix is not.
+	 * This list is useful when adding a new message to the file;
+	 * the prefixes printed by this method are unused and one can be
+	 * selected for the new method.
+	 */
+	public void printAllMissingMessagePrefixes() {
+		int lastNumber = -1;
+		
+		Collections.sort(_propertyLines, PropertyLineComparator.getMessagePrefixComparator());
+		Iterator iterator = _propertyLines.iterator();
+		while(iterator.hasNext()) {
+			PropertyLine line = (PropertyLine)iterator.next();
+			String prefix = line.getMessagePrefix();
+			int prefixNumber = 0;
+			if(prefix == null) {
+				continue;
+			}
+			
+			if(prefix.equals("")) { //$NON-NLS-1$
+				continue;
+			}
+			
+			String prefixLetters = prefix.substring(0, 4); // "ABCD" of "ABCD0000W"
+			try {
+				// Re: magic numbers "4" and "8" below.
+				// Since the message prefix is of the form ABCD0000E,
+				// strip off the first four characters up to (and excluding) the 
+				// eighth character, "E".
+				prefixNumber = Integer.parseInt(prefix.substring(4, 8));
+			}
+			catch(NumberFormatException e) {
+				// just continue
+				continue;
+			}
+			if(lastNumber != -1) {
+				if(prefixNumber != (lastNumber + 1)) {
+					// Start at lastNumber + 1 because lastNumber exists.
+					// Exclude prefixNumber because prefixNumber exists.
+					for(int i=lastNumber+1; i<prefixNumber; i++) {
+						report(prefixLetters + i);
+					}
+				}
+			}
+			lastNumber = prefixNumber;
+		}
+	}
+
+	/**
+	 * Print all of the messages in the .properties file that use
+	 * a message prefix, e.g. ABCD0000E.
+	 */
+	public void printAllMessagesWithAMessagePrefix() {
+		report("MESSAGES WITH PREFIXES"); //$NON-NLS-1$
+		Collections.sort(_propertyLines, PropertyLineComparator.getLineNoComparator());
+		Iterator iterator = _propertyLines.iterator();
+		while(iterator.hasNext()) {
+			PropertyLine line = (PropertyLine)iterator.next();
+			if(line.hasMessagePrefix()) {
+				report(line.toString());
+			}
+		}
+	}
+
+	/**
+	 * Print all of the messages in the .properties file whose message
+	 * text does not begin with a message prefix, e.g., ABCD0000E.
+	 */
+	public void printAllMessagesWithoutAMessagePrefix() {
+		report("BLANK MESSAGE PREFIX"); //$NON-NLS-1$
+		Collections.sort(_propertyLines, PropertyLineComparator.getLineNoComparator());
+		Iterator iterator = _propertyLines.iterator();
+		while(iterator.hasNext()) {
+			PropertyLine line = (PropertyLine)iterator.next();
+			if(!line.hasMessagePrefix()) {
+				report(line.toString());
+			}
+		}
+	}
+	
+	/**
+	 * Print a list of all messages whose text is the empty string (&quot;&quot;).
+	 */
+	public void printAllMessagesWhichAreBlank() {
+		report("BLANK MESSAGES"); //$NON-NLS-1$
+		Collections.sort(_propertyLines, PropertyLineComparator.getLineNoComparator());
+		Iterator iterator = _propertyLines.iterator();
+		while(iterator.hasNext()) {
+			PropertyLine line = (PropertyLine)iterator.next();
+			if(line.getMessage().equals("")) { //$NON-NLS-1$
+				StringBuffer buffer = new StringBuffer("line number "); //$NON-NLS-1$
+				buffer.append(line.getLineNumber());
+				buffer.append(", message id "); //$NON-NLS-1$
+				buffer.append(line.getMessageId());
+				report(buffer.toString());
+			}
+		}
+	}
+	
+	/**
+	 * Print a list of the lines that have syntax errors, for example,
+	 * missing the equals sign between the message id and the message 
+	 * text.
+	 */
+	public void printSyntaxWarnings() {
+		List parseWarnings = getParseWarnings();
+		Iterator iterator = parseWarnings.iterator();
+		while (iterator.hasNext()) {
+			report((MessageMetaData)iterator.next());
+		}
+	}
+
+	/**
+	 * Print a list of all of the messages in the .properties file that
+	 * use the same message id. If more than one message uses the same
+	 * id, when the ResourceBundle is asked for that message id, it will
+	 * return the last message (i.e., the largest line number) with that
+	 * id in the file.
+	 */
+	public void printDuplicateMessageId() {
+		printDuplicateMessageId(true);
+	}
+	
+	/**
+	 * Print a list of all of the messages in the .properties file that
+	 * use the same message id. If more than one message uses the same
+	 * id, when the ResourceBundle is asked for that message id, it will
+	 * return the last message (i.e., the largest line number) with that
+	 * id in the file.
+	 * 
+	 * The boolean parameter is used to determine whether or not 
+	 * the &quot;DUPLICATE MESSAGE IDS&quot; title is emitted before 
+	 * the list of duplicates.
+	 */
+	public void printDuplicateMessageId(boolean printTitle) {
+		if(printTitle) {
+			report("DUPLICATE MESSAGE IDS"); //$NON-NLS-1$
+		}
+		Comparator c = PropertyLineComparator.getMessageIdComparator();
+		String messageId = IValidationConstants.ABCD0060;
+		Collections.sort(_propertyLines, c);
+		Iterator iterator = _propertyLines.iterator();
+		PropertyLine lastLine = null;
+		PropertyLine line = null;
+		boolean needToPrintLast = false;
+		while(iterator.hasNext()) {
+			lastLine = line;
+			line = (PropertyLine)iterator.next();
+			
+			if(c.compare(lastLine, line) == 0) {
+				needToPrintLast = true;
+				MessageMetaData mmd = new MessageMetaData(IValidationConstants.BUNDLENAME, MessageMetaData.WARNING, messageId, new String[]{lastLine.getMessageId()}, lastLine, lastLine.getLineNumber());
+				report(mmd);
+			}
+			else if(needToPrintLast) {
+				// The last duplicate line needs to be printed, because lastLine is always printed but line needs to be printed too.
+				needToPrintLast = false;
+				MessageMetaData mmd = new MessageMetaData(IValidationConstants.BUNDLENAME, MessageMetaData.WARNING, messageId, new String[]{lastLine.getMessageId()}, lastLine, lastLine.getLineNumber());
+				report(mmd);
+			}
+		}
+
+		if(needToPrintLast) {
+			// The last duplicate line needs to be printed, because lastLine is always printed but line needs to be printed too.
+			MessageMetaData mmd = new MessageMetaData(IValidationConstants.BUNDLENAME, MessageMetaData.WARNING, messageId, new String[]{line.getMessageId()}, line, line.getLineNumber());
+			report(mmd);
+		}
+	}
+	
+	/**
+	 * Print a list of all of the messages in the .properties file that
+	 * do not use a unique message prefix (e.g., ABCD0000E), with the 
+	 * exception of all messages which are intended to be duplicates.
+	 * Generally, users expect one message prefix per problem, so 
+	 * reused message prefixes can be confusing. Any message which 
+	 * deliberately reuses a message prefix must use a message id 
+	 * that starts with that prefix.
+	 */
+	public void printDuplicateMessagePrefix() {
+		printDuplicateMessagePrefix(true);
+	}
+	
+	/**
+	 * Print a list of all of the messages in the .properties file that
+	 * do not use a unique message prefix (e.g., ABCD0000E), with the 
+	 * exception of all messages which are intended to be duplicates.
+	 * Generally, users expect one message prefix per problem, so 
+	 * reused message prefixes can be confusing. Any message which 
+	 * deliberately reuses a message prefix must use a message id 
+	 * that starts with that prefix.
+	 * 
+	 * The boolean parameter is used to determine whether or not 
+	 * the &quot;DUPLICATE MESSAGE PREFIXESS&quot; title is emitted 
+	 * before the list of duplicates.
+	 */	
+	public void printDuplicateMessagePrefix(boolean printTitle) {
+		if(printTitle) {
+			report("DUPLICATE MESSAGE PREFIXES"); //$NON-NLS-1$
+		}
+		Comparator c = PropertyLineComparator.getMessagePrefixComparator();
+		Collections.sort(_propertyLines, c);
+		String messageId = IValidationConstants.ABCD0070;
+		Iterator iterator = _propertyLines.iterator();
+		PropertyLine lastLine = null;
+		PropertyLine line = null;
+		boolean needToPrintLast = false;
+		while(iterator.hasNext()) {
+			lastLine = line;
+			line = (PropertyLine)iterator.next();
+			
+			if(lastLine != null) {
+				if(!lastLine.getMessageId().startsWith(lastLine.getShortMessagePrefix())) {
+					if(c.compare(lastLine, line) == 0) {
+						needToPrintLast = true;
+						MessageMetaData mmd = new MessageMetaData(IValidationConstants.BUNDLENAME, MessageMetaData.WARNING, messageId, new String[]{lastLine.getMessagePrefix()}, lastLine, lastLine.getLineNumber());
+						report(mmd);
+					}
+					else if(needToPrintLast) {
+						// The last duplicate line needs to be printed, because lastLine is always printed but line needs to be printed too.
+						needToPrintLast = false;
+						MessageMetaData mmd = new MessageMetaData(IValidationConstants.BUNDLENAME, MessageMetaData.WARNING, messageId, new String[]{lastLine.getMessagePrefix()}, lastLine, lastLine.getLineNumber());
+						report(mmd);
+					}
+				}
+			}
+		}
+
+		if(lastLine != null) {
+			if(!lastLine.getMessageId().startsWith(lastLine.getShortMessagePrefix())) {
+				if(needToPrintLast) {
+					// The last duplicate line needs to be printed, because lastLine is always printed but line needs to be printed too.
+					MessageMetaData mmd = new MessageMetaData(IValidationConstants.BUNDLENAME, MessageMetaData.WARNING, messageId, new String[]{line.getMessagePrefix()}, line, line.getLineNumber());
+					report(mmd);
+				}
+			}
+		}
+	}
+
+	/**
+	 * Print a list of message prefixes whose first characters match
+	 * the prefix parameter. This method is useful when you want to see
+	 * if a range of prefixes is in use or not.
+	 */
+	public void printMessagePrefixStartingWith(final String prefix) {
+		report("Find all error prefixes starting with " + prefix); //$NON-NLS-1$
+		Comparator c = PropertyLineComparator.getMessagePrefixComparator();
+		Collections.sort(_propertyLines, c);
+		Iterator iterator = _propertyLines.iterator();
+		PropertyLine line = null;
+		while(iterator.hasNext()) {
+			line = (PropertyLine)iterator.next();
+			if (line.getMessagePrefix().startsWith(prefix)) {
+				StringBuffer buffer = new StringBuffer(String.valueOf(line.getLineNumber()));
+				buffer.append("\t"); //$NON-NLS-1$
+				buffer.append(line.getMessagePrefix());
+				buffer.append("\t"); //$NON-NLS-1$
+				buffer.append(line.getMessageId());
+				report(buffer.toString());
+			}
+		}
+	}
+	
+	/**
+	 * Print the last prefix (i.e., the one with the largest number, 
+	 * e.g. ABCD2222 is larger than ABCD1111 or ABCD0000) in the file 
+	 * whose first characters match the prefix parameter. 
+	 */
+	public void printLastMessagePrefixStartingWith(final String prefix) {
+		report("Find last error prefix starting with " + prefix); //$NON-NLS-1$
+		Comparator c = PropertyLineComparator.getMessagePrefixComparator();
+		Collections.sort(_propertyLines, c);
+		PropertyLine[] lines = new PropertyLine[_propertyLines.size()];
+		_propertyLines.toArray(lines);
+		boolean found = false;
+		for(int i=lines.length; i>-1; i--) {
+			PropertyLine line = lines[i];
+			if (line.getMessagePrefix().startsWith(prefix)) {
+				report(line.toString());
+				found = true;
+				break;
+			}
+		}
+		if(!found) {
+			report("No error ids were found that started with " + prefix); //$NON-NLS-1$
+		}
+	}
+
+	/**
+	 * Given an estimate of the number of characters in a substitution parameter,
+	 * print a list of the number of characters in a given message, if each 
+	 * parameter is replaced with &quot;length&quot; characters.
+	 */
+	public void printExpectedStringLength(final int length) {
+		report("EXPECTED LENGTH OF MESSAGE WITH PARAMETERS " + length + " LONG"); //$NON-NLS-1$ //$NON-NLS-2$
+		Comparator c = PropertyLineComparator.getStringLengthComparator(length);
+		Collections.sort(_propertyLines, c);
+		Iterator iterator = _propertyLines.iterator();
+		while(iterator.hasNext()) {
+			PropertyLine line = (PropertyLine)iterator.next();
+
+			StringBuffer buffer = new StringBuffer("Length: "); //$NON-NLS-1$
+			buffer.append(line.getExpectedLength(length));
+			buffer.append("\t"); //$NON-NLS-1$
+			buffer.append(line.toStringWithExpectedLength(length));
+			report(buffer.toString());
+		}
+	}
+
+	/**
+	 * Print the number of characters in each message.
+	 */
+	public void printStringLength() {
+		// "0" means no substitution
+		printExpectedStringLength(0);
+	}
+
+	/**
+	 * Print the contents of the .properties file, sorted by message id.
+	 */
+	public void printContents() {
+		report("CONTENTS OF .properties FILE, SORTED BY MESSAGE ID"); //$NON-NLS-1$
+		Comparator c = PropertyLineComparator.getMessageIdComparator();
+		Collections.sort(_propertyLines, c);
+		Iterator iterator = _propertyLines.iterator();
+		while(iterator.hasNext()) {
+			PropertyLine line = (PropertyLine)iterator.next();
+			report(line.toString());
+		}
+	}
+
+}
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.validation.sample/propertiesValidator/org/eclipse/jst/validation/sample/parser/CompareProperties.java b/tests/org.eclipse.jst.validation.sample/propertiesValidator/org/eclipse/jst/validation/sample/parser/CompareProperties.java
new file mode 100644
index 0000000..93ab411
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.sample/propertiesValidator/org/eclipse/jst/validation/sample/parser/CompareProperties.java
@@ -0,0 +1,377 @@
+package org.eclipse.jst.validation.sample.parser;
+/*
+ * Licensed Material - Property of IBM 
+ * (C) Copyright IBM Corp. 2002, 2003 - All Rights Reserved. 
+ * US Government Users Restricted Rights - Use, duplication or disclosure 
+ * restricted by GSA ADP Schedule Contract with IBM Corp. 
+ *
+ * DISCLAIMER OF WARRANTIES.
+ * The following [enclosed] code is sample code created by IBM
+ * Corporation. This sample code is not part of any standard or IBM
+ * product and is provided to you solely for the purpose of assisting
+ * you in the development of your applications.  The code is provided
+ * "AS IS". IBM MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT
+ * NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE, REGARDING THE FUNCTION OR PERFORMANCE OF
+ * THIS CODE.  THIS CODE MAY CONTAIN ERRORS.  IBM shall not be liable
+ * for any damages arising out of your use of the sample code, even
+ * if it has been advised of the possibility of such damages.
+ * 
+ */
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import java.util.StringTokenizer;
+import java.util.TreeMap;
+import java.util.TreeSet;
+
+/**
+ * This class compares two .properties file and outputs a list
+ * of the differences. This class is used to count the number
+ * of words that have changed.
+ */
+public class CompareProperties {
+	public static final String lineSeparator = java.lang.System.getProperty("line.separator"); //$NON-NLS-1$
+	private TreeSet _deleted = null;
+	private TreeMap _changed = null;
+	private TreeSet _added = null;
+//	private PropertyFile _oldFile = null;
+	private PropertyFile _newFile = null;
+
+	/**
+	 * This class is used to store PropertyLine instances which have the same
+	 * message id, but different values. When the list of differences is output,
+	 * all values are output so that the user can compare the lines manually, to
+	 * see what's different.
+	 */
+	class CompareLine implements Comparable {
+		private ArrayList _lines;
+		private final String _messageId;
+
+		public CompareLine(String messageId) {
+			_messageId = messageId;
+			_lines = new ArrayList();
+		}
+
+		public void add(PropertyLine oldLine, PropertyLine newLine) {
+			_lines.add(new PropertyLine[]{oldLine, newLine});
+		}
+
+		public String toString() {
+			StringBuffer buffer = new StringBuffer();
+			Iterator iterator = _lines.iterator();
+			while (iterator.hasNext()) {
+				buffer.append(lineSeparator);
+				buffer.append("\t"); //$NON-NLS-1$
+				PropertyLine[] lines = (PropertyLine[])iterator.next();
+				
+				buffer.append(lines[0]);
+				buffer.append("\n"); //$NON-NLS-1$
+				buffer.append(lines[1]);
+			}
+			return buffer.toString();
+		}
+
+		/**
+		 * Since this is a changed string, return the absolute difference of words between the strings.
+		 */		
+		public int getNumWords() {
+			int numWords = 0;
+			Iterator iterator = _lines.iterator();
+			while (iterator.hasNext()) {
+				PropertyLine[] lines = (PropertyLine[])iterator.next();
+				numWords = numWords + compare(lines[0], lines[1]);
+			}
+			return numWords;
+		}
+		
+		private int compare(PropertyLine oldLine, PropertyLine newLine) {
+			// For every word in the old string, see if it exists in the new
+			// string. The position of the word doesn't matter - if the word
+			// exists in the new, then the word is not counted as a "changed"
+			// word. 
+			//    1. If the word exists, remove the word from the newLine and
+			//       advance to the next old token. (Remove word from newLine
+			//       in case the word existed twice in the old string but only
+			//       once in the new. The second oldWord should be counted as
+			//       a changed word.)
+			//    2. If the word doesn't exist, numChanged++ and advance to the
+			//       next old token.
+			//    3. Once all of the oldWords have been checked, tokenize the
+			//       remaining newWord and count the number of words in the string.
+			//       These words have been added and each one counts as a 
+			//       changed word.
+			int numChangedWords = 0;
+			StringTokenizer oldTokenizer = new StringTokenizer(oldLine.getMessage());
+
+			// Need to be careful...want the entire word, not oldWord="on" mistaken for newWord="one" or newWord="bond"
+			// Easier to create a list of new words to compare against.
+			StringTokenizer newTokenizer = new StringTokenizer(newLine.getMessage());
+			List newWords = new ArrayList(); // Can't use a set in case the newLine uses a word, e.g. "the", more than once.
+			while(newTokenizer.hasMoreTokens()) {
+				newWords.add(newTokenizer.nextToken());
+			}
+			
+			while(oldTokenizer.hasMoreTokens()) {
+				String oldWord = oldTokenizer.nextToken();
+				if(newWords.contains(oldWord)) {
+					newWords.remove(oldWord);
+				}
+				else {
+					numChangedWords++;
+				}
+			}
+
+			// Can count the tokens but not the elments.
+			numChangedWords += newWords.size();
+			return numChangedWords;
+		}
+
+		public String getMessageId() {
+			return _messageId;
+		}
+
+		public int compareTo(Object o) {
+			// by default, sort by message id
+			if (!(o instanceof CompareLine)) {
+				// then how on earth did this method get called??
+				// put it at the end of the list
+				return 1;
+			}
+
+			return getMessageId().compareTo(((CompareLine) o).getMessageId());
+		}
+	}
+
+	/**
+	 * Compare the two PropertyFile and print out a list of the differences; 
+	 * the first parameter is the older .properties file, and the second 
+	 * parameter is the newer .properties file.
+	 */
+	public CompareProperties(PropertyFile oldFile, PropertyFile newFile) {
+		_deleted = new TreeSet();
+		_changed = new TreeMap();
+		_added = new TreeSet();
+		
+//		_oldFile = oldFile;
+		_newFile = newFile;
+
+		compare(oldFile, newFile);
+	}
+	
+	/**
+	 * In the older PropertyFile, the message text was different; cache the
+	 * older version of the PropertyLine and the newer version of the PropertyLine.
+	 */
+	private void addChanged(PropertyLine oldLine, PropertyLine newLine) {
+		CompareLine cl = (CompareLine) _changed.get(oldLine.getMessageId());
+		if (cl == null) {
+			cl = new CompareLine(oldLine.getMessageId());
+		}
+		cl.add(oldLine, newLine);
+		_changed.put(oldLine.getMessageId(), cl);
+	}
+	
+	/**
+	 * Compare the two property files and build the collections of variable names with
+	 * their associated values.
+	 */
+	public void compare(PropertyFile oldFile, PropertyFile newFile) {
+		_added.clear();
+		_deleted.clear();
+		_changed.clear();
+
+		// For each element in file 1, see if it exists in file 2
+		//   a) if it doesn't exist, add it to the list of "deleted" strings
+		//   b) if it exists, and if the value is different, add it to the list of "changed" strings
+		//   c) if it exists, and if the value is the same, add it to the list of "not changed" strings
+		//   d) delete the entry, if it exists, from file 2's hashtable so we don't check it twice.
+		// For each element in file 2 not checked already, it cannot exist in file 1, so add it to the list of "new" strings
+		//
+		// Need some way to abort comparison if either of the files contains duplicate
+		// message ids.
+		//
+		List oldKeys = new ArrayList(oldFile.getPropertyLines());
+		List newKeys = new ArrayList(newFile.getPropertyLines());
+		Collections.sort(oldKeys, PropertyLineComparator.getMessageIdComparator());
+		Collections.sort(newKeys, PropertyLineComparator.getMessageIdComparator());
+		Iterator oldIterator = oldKeys.iterator();
+		Iterator newIterator = newKeys.iterator();
+		PropertyLine oldLine = (oldIterator.hasNext()) ? (PropertyLine) oldIterator.next() : null;
+		PropertyLine newLine = (newIterator.hasNext()) ? (PropertyLine) newIterator.next() : null;
+		while ((oldLine != null) && (newLine != null)) {
+			// oldLine message id is either <, =, or > newLine message id.
+			// if <, message id has been deleted.
+			// if =, see if changed (or just compare message ids.)
+			// if >, new line is a new message id.
+			// to increment, increment only the < (whether it's oldLine or newLine).
+			int compare = oldLine.getMessageId().compareTo(newLine.getMessageId());
+			if (compare < 0) {
+				// deleted
+				_deleted.add(oldLine);
+				if (oldIterator.hasNext()) {
+					oldLine = (PropertyLine) oldIterator.next();
+				}
+				else {
+					oldLine = null;
+				}
+			}
+			else if (compare == 0) {
+				// existed before. Check if changed.
+				if (!oldLine.getMessage().equals(newLine.getMessage())) {
+					// changed
+					addChanged(oldLine, newLine);
+				}
+				if (oldIterator.hasNext() && newIterator.hasNext()) {
+					oldLine = (PropertyLine) oldIterator.next();
+					newLine = (PropertyLine) newIterator.next();
+				}
+				else {
+					oldLine = null;
+					newLine = null;
+				}
+
+			}
+			else {
+				// added
+				_added.add(newLine);
+				if (newIterator.hasNext()) {
+					newLine = (PropertyLine) newIterator.next();
+				}
+				else {
+					newLine = null;
+				}
+			}
+		}
+
+		if (oldLine != null) {
+			_deleted.add(oldLine);
+		}
+
+		if (newLine != null) {
+			_added.add(newLine);
+		}
+
+		while (oldIterator.hasNext()) {
+			// all of the rest have been deleted
+			_deleted.add(oldIterator.next());
+		}
+
+		while (newIterator.hasNext()) {
+			// all of the rest have been added
+			_added.add(newIterator.next());
+		}
+	}
+	
+	/**
+	 * Return a Collction of PropertyLine instances that exist in
+	 * the newer PropertyFile that aren't in the older PropertyFile.
+	 */
+	public Set getAdded() {
+		return _added;
+	}
+	
+	/**
+	 * Return a Collection of CompareLine instances that represent
+	 * the two PropertyLine instances; one from the older PropertyFile,
+	 * and one from the newer PropertyFile.
+	 */
+	public Collection getChanged() {
+		return _changed.values();
+	}
+	
+	/**
+	 * Return a Collection of PropertyLine instances that do not
+	 * exist in the newer PropertyFile yet that exist in the older
+	 * PropertyFile.
+	 */
+	public Set getDeleted() {
+		return _deleted;
+	}
+	
+	/**
+	 * Print out all of the collections of variable strings.
+	 */
+	public void printResults() {
+		// create an output log in the current directory, and in it list the strings in a section each.
+		int numNew = printStrings("NEW PROPERTIES", _added); //$NON-NLS-1$
+		
+		int numWordsDeleted = printStrings("DELETED PROPERTIES", _deleted); //$NON-NLS-1$
+		int numWordsChanged =  printStrings("CHANGED PROPERTIES", _changed.values()); //$NON-NLS-1$
+		float totalChange = numNew + numWordsDeleted + numWordsChanged;
+		float numWords = _newFile.getNumWords();
+		float percent = totalChange / numWords * 100;
+		
+		System.out.println();
+		System.out.println("Number of new words: " + numNew); //$NON-NLS-1$
+		System.out.println("Number of words in deleted messages: " + numWordsDeleted); //$NON-NLS-1$
+		System.out.println("Number of changed words in modified messages: " + numWordsChanged); //$NON-NLS-1$
+		System.out.println("Number of words in file " + _newFile.getQualifiedFileName() + ": " + numWords); //$NON-NLS-1$ //$NON-NLS-2$
+		System.out.println("Total change of words: " + totalChange + ", which is a " + percent + "% change."); //$NON-NLS-1$  //$NON-NLS-2$ //$NON-NLS-3$
+	}
+	
+	public void printResultsForTranslation() {
+		// create an output log in the current directory, and in it list the strings in a section each.
+		printStringsForTranslation("DELETED PROPERTIES", _deleted); //$NON-NLS-1$
+		printStringsForTranslation("NEW PROPERTIES", _added); //$NON-NLS-1$
+		printStringsForTranslation("CHANGED PROPERTIES", _changed.values()); //$NON-NLS-1$
+	}
+	
+	/**
+	 * Print the number of lines in the .properties file.
+	 */
+	private int printStrings(String header, Collection lines) {
+		System.out.println();
+		System.out.println(header);
+		int count = 0;
+		int numWords = 0;
+		Iterator iterator = lines.iterator();
+		while (iterator.hasNext()) {
+			Object line = iterator.next();
+			if(line instanceof PropertyLine) {
+				numWords += ((PropertyLine)line).getNumWords();
+			}
+			else {
+				// must be a compare line
+				numWords += ((CompareLine)line).getNumWords();
+			}
+			
+			count++;
+			System.out.println(line);
+		}
+		System.out.println("Number of properties: " + count); //$NON-NLS-1$
+		System.out.println();
+		return numWords;
+	}
+	
+	/**
+	 * Print the contents of the sorted collection of lines from the .properties file.
+	 */
+	private void printStringsForTranslation(String header, Collection lines) {
+		System.out.println();
+		System.out.println(header);
+		int count = 0;
+		Iterator iterator = lines.iterator();
+		while (iterator.hasNext()) {
+			count++;
+			Object line = iterator.next();
+			if (line instanceof PropertyLine) {
+				PropertyLine propline = (PropertyLine) line;
+				System.out.println(propline.getMessageId());
+			}
+			else if (line instanceof CompareLine) {
+				CompareLine propline = (CompareLine) line;
+				System.out.println(propline.getMessageId());
+			}
+			else {
+				System.out.println("instance of " + line.getClass().getName()); //$NON-NLS-1$
+			}
+		}
+		System.out.println("Total: " + count); //$NON-NLS-1$
+		System.out.println();
+	}
+}
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.validation.sample/propertiesValidator/org/eclipse/jst/validation/sample/parser/IValidationConstants.java b/tests/org.eclipse.jst.validation.sample/propertiesValidator/org/eclipse/jst/validation/sample/parser/IValidationConstants.java
new file mode 100644
index 0000000..c8ae9e4
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.sample/propertiesValidator/org/eclipse/jst/validation/sample/parser/IValidationConstants.java
@@ -0,0 +1,46 @@
+package org.eclipse.jst.validation.sample.parser;
+/*
+ * Licensed Material - Property of IBM 
+ * (C) Copyright IBM Corp. 2002, 2003 - All Rights Reserved. 
+ * US Government Users Restricted Rights - Use, duplication or disclosure 
+ * restricted by GSA ADP Schedule Contract with IBM Corp. 
+ *
+ * DISCLAIMER OF WARRANTIES.
+ * The following [enclosed] code is sample code created by IBM
+ * Corporation. This sample code is not part of any standard or IBM
+ * product and is provided to you solely for the purpose of assisting
+ * you in the development of your applications.  The code is provided
+ * "AS IS". IBM MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT
+ * NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE, REGARDING THE FUNCTION OR PERFORMANCE OF
+ * THIS CODE.  THIS CODE MAY CONTAIN ERRORS.  IBM shall not be liable
+ * for any damages arising out of your use of the sample code, even
+ * if it has been advised of the possibility of such damages.
+ * 
+ */
+
+/**
+ * This interface contains the message ids of all of the Properties
+ * Validator's messages, and the name of the resource bundle that 
+ * contains those messages. 
+ */
+public interface IValidationConstants {
+	/*package*/ static final String BUNDLENAME = "propertiesValidator"; //$NON-NLS-1$
+	
+	/*package*/ static final String ABCD0000 = "ABCD0000"; //$NON-NLS-1$
+	/*package*/ static final String ABCD0010E = "ABCD0010E"; //$NON-NLS-1$
+	/*package*/ static final String ABCD0010W = "ABCD0010W"; //$NON-NLS-1$
+	/*package*/ static final String ABCD0020 = "ABCD0020"; //$NON-NLS-1$
+	/*package*/ static final String ABCD0030 = "ABCD0030"; //$NON-NLS-1$
+	/*package*/ static final String ABCD0040 = "ABCD0040"; //$NON-NLS-1$
+	/*package*/ static final String ABCD0050 = "ABCD0050"; //$NON-NLS-1$
+	/*package*/ static final String ABCD0060 = "ABCD0060"; //$NON-NLS-1$
+	/*package*/ static final String ABCD0070 = "ABCD0070"; //$NON-NLS-1$
+	/*package*/ static final String ABCD0080 = "ABCD0080"; //$NON-NLS-1$
+	/*package*/ static final String ABCD0090 = "ABCD0090"; //$NON-NLS-1$
+	/*package*/ static final String ABCD0110 = "ABCD0110"; //$NON-NLS-1$
+	/*package*/ static final String ABCD0120 = "ABCD0120"; //$NON-NLS-1$
+	/*package*/ static final String ABCD0130 = "ABCD0130"; //$NON-NLS-1$
+
+	/*package*/ static final String LINE_LOC = "LINE_LOC"; //$NON-NLS-1$
+}
diff --git a/tests/org.eclipse.jst.validation.sample/propertiesValidator/org/eclipse/jst/validation/sample/parser/Main.java b/tests/org.eclipse.jst.validation.sample/propertiesValidator/org/eclipse/jst/validation/sample/parser/Main.java
new file mode 100644
index 0000000..a4d6ee1
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.sample/propertiesValidator/org/eclipse/jst/validation/sample/parser/Main.java
@@ -0,0 +1,451 @@
+package org.eclipse.jst.validation.sample.parser;
+/*
+ * Licensed Material - Property of IBM 
+ * (C) Copyright IBM Corp. 2002, 2003 - All Rights Reserved. 
+ * US Government Users Restricted Rights - Use, duplication or disclosure 
+ * restricted by GSA ADP Schedule Contract with IBM Corp. 
+ *
+ * DISCLAIMER OF WARRANTIES.
+ * The following [enclosed] code is sample code created by IBM
+ * Corporation. This sample code is not part of any standard or IBM
+ * product and is provided to you solely for the purpose of assisting
+ * you in the development of your applications.  The code is provided
+ * "AS IS". IBM MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT
+ * NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE, REGARDING THE FUNCTION OR PERFORMANCE OF
+ * THIS CODE.  THIS CODE MAY CONTAIN ERRORS.  IBM shall not be liable
+ * for any damages arising out of your use of the sample code, even
+ * if it has been advised of the possibility of such damages.
+ * 
+ */
+
+import java.io.File;
+
+/**
+ * This class is used to perform validation or .properties file queries
+ * without using an IValidator. 
+ */
+public class Main {
+	public static void main(String[] argv) {
+		if(argv.length < 1) {
+			System.out.println("prop -tr [-a | -ac | -am | -an | -al PREFIX | -ap PREFIX | -au | -b | -di | -dp | -l | -le <positive integer> | -p ] f:\\dir1\\dir2\\myPropertiesFile.properties"); //$NON-NLS-1$
+			System.out.println("or "); //$NON-NLS-1$
+			System.out.println("prop [-c|-ct] f:\\dir1\\dir2\\myPropertiesFile.properties f:\\dir1\\dir2\\myNewPropertiesFile.properties"); //$NON-NLS-1$
+			System.out.println("   -a: print all error/warning/info prefixes in the file"); //$NON-NLS-1$
+			System.out.println("  -ac: print a count of messages with and without prefixes in the file"); //$NON-NLS-1$
+			System.out.println("  -am: print all messages with a prefix"); //$NON-NLS-1$
+			System.out.println("  -an: print all messages without an error prefix"); //$NON-NLS-1$
+			System.out.println("  -al: print the last error/warning/info prefix, starting with PREFIX, in the file"); //$NON-NLS-1$
+			System.out.println("  -ap: print any error/warning/info prefixes, starting with PREFIX, in the file"); //$NON-NLS-1$
+			System.out.println("  -au: print all error/warning/info prefixes that are not used in the file"); //$NON-NLS-1$
+			System.out.println("   -b: print any blank messages in the properties file"); //$NON-NLS-1$
+			System.out.println("   -c: compare the two property files listed. The first is the older, and the second is the newer."); //$NON-NLS-1$
+			System.out.println("  -ct: compare the two property files listed. The first is the older, and the second is the newer. Output a list of the added, deleted, and changed strings, but print only the message id."); //$NON-NLS-1$
+			System.out.println("  -di: print any duplicate message ids and syntax errors in the properties file"); //$NON-NLS-1$
+			System.out.println("  -dp: print any duplicate error/warning/info prefixes in the file"); //$NON-NLS-1$
+			System.out.println("   -l: print the length of each message in the file"); //$NON-NLS-1$
+			System.out.println("  -le: print the length of each message in the file if each parameter is <positive integer> characters long."); //$NON-NLS-1$
+			System.out.println("   -n: print the number of words in the file, including message prefixes and parameters"); //$NON-NLS-1$
+			System.out.println("   -p: print the contents of the property file, sorted by message id"); //$NON-NLS-1$
+			System.out.println("  -tr: print trace information while parsing the .properties file"); //$NON-NLS-1$
+			System.out.println();
+			System.out.println("The default action is to print the syntax errors, duplicates, and other types of errors in the given .properties file."); //$NON-NLS-1$
+			System.exit(-1);
+		}
+
+		// This is not robust error-checking by any stretch of the imagination!
+		int index = 0;
+		String option = argv[index++].toLowerCase();
+		boolean trace = false;
+		if(option.equals("-tr")) { //$NON-NLS-1$
+			trace = true;
+			option = argv[index++].toLowerCase();
+		}
+		
+		if (option.equals("-a") && (argv.length >= 2)) { //$NON-NLS-1$
+			String[] files = new String[argv.length-1];
+			System.arraycopy(argv, 1, files, 0, files.length);
+			printAllErrorPrefix(trace, files);
+		}
+		else if (option.equals("-ac") && (argv.length >= 2)) { //$NON-NLS-1$
+			String[] files = new String[argv.length-1];
+			System.arraycopy(argv, 1, files, 0, files.length);
+			printPrefixCount(trace, files);
+		}
+		else if (option.equals("-al") && (argv.length >= 3)) { //$NON-NLS-1$
+			String[] files = new String[argv.length-2];
+			System.arraycopy(argv, 2, files, 0, files.length);
+			printErrorPrefix(trace, argv[index], files);
+		}
+		else if (option.equals("-am") && (argv.length >= 2)) { //$NON-NLS-1$
+			String[] files = new String[argv.length-1];
+			System.arraycopy(argv, 1, files, 0, files.length);
+			printErrorMessages(trace, files);
+		}
+		else if (option.equals("-an") && (argv.length >= 2)) { //$NON-NLS-1$
+			String[] files = new String[argv.length-1];
+			System.arraycopy(argv, 1, files, 0, files.length);
+			printMessagesWithoutPrefixes(trace, files);
+		}
+		else if (option.equals("-ap") && (argv.length >= 3)) { //$NON-NLS-1$
+			String[] files = new String[argv.length-2];
+			System.arraycopy(argv, 2, files, 0, files.length);
+			printErrorPrefixRange(trace, argv[index], files);
+		}
+		else if (option.equals("-au") && (argv.length >= 2)) { //$NON-NLS-1$
+			String[] files = new String[argv.length-1];
+			System.arraycopy(argv, 1, files, 0, files.length);
+			printAllMissingErrorPrefix(trace, files);
+		}
+		else if (option.equals("-b") && (argv.length >= 2)) { //$NON-NLS-1$
+			String[] files = new String[argv.length-1];
+			System.arraycopy(argv, 1, files, 0, files.length);
+			printBlanks(trace, files);
+		}
+		else if (option.equals("-c") && (argv.length == 3)) { //$NON-NLS-1$
+			File oldFile = new File(argv[index++]);
+			File newFile = new File(argv[index]);
+			compareFiles(trace, oldFile, newFile);
+		}
+		else if (option.equals("-ct") && (argv.length == 3)) { //$NON-NLS-1$
+			File oldFile = new File(argv[index++]);
+			File newFile = new File(argv[index]);
+			compareFilesForTranslation(trace, oldFile, newFile);
+		}
+		else if (option.equals("-di") && (argv.length >= 2)) { //$NON-NLS-1$
+			String[] files = new String[argv.length-1];
+			System.arraycopy(argv, 1, files, 0, files.length);
+			printDuplicateIds(trace, files);
+		}
+		else if (option.equals("-dp") && (argv.length >= 2)) { //$NON-NLS-1$
+			String[] files = new String[argv.length-1];
+			System.arraycopy(argv, 1, files, 0, files.length);
+			printDuplicatePrefixes(trace, files);
+		}
+		else if (option.equals("-l") && (argv.length >= 2)) { //$NON-NLS-1$
+			String[] files = new String[argv.length-1];
+			System.arraycopy(argv, 1, files, 0, files.length);
+			printStringLength(trace, files);
+		}
+		else if (option.equals("-le") && (argv.length >= 3)) { //$NON-NLS-1$
+			String[] files = new String[argv.length-2];
+			System.arraycopy(argv, 2, files, 0, files.length);
+			printExpectedStringLength(trace, argv[index], files);
+		}
+		else if (option.equals("-n") && (argv.length >= 2)) { //$NON-NLS-1$
+			String[] files = new String[argv.length-1];
+			System.arraycopy(argv, 1, files, 0, files.length);
+			printWordCount(trace, files);
+		}
+		else if (option.equals("-p") && (argv.length >= 2)) { //$NON-NLS-1$
+			String[] files = new String[argv.length-1];
+			System.arraycopy(argv, 1, files, 0, files.length);
+			printFileContents(trace, files);
+		}
+		else {
+			printDefault(trace, argv);
+		}
+	}
+
+	public static void printAllErrorPrefix(boolean trace, String[] files) {
+		for (int i = 0; i < files.length; i++) {
+			try {
+				System.out.println("******************************************"); //$NON-NLS-1$
+				PropertyFile propFile = new PropertyFile(files[i], trace);
+				propFile.printAllMessagePrefixes();
+				System.out.println("******************************************"); //$NON-NLS-1$
+				System.out.println();
+			}
+			catch (java.io.IOException e) {
+				System.out.println(e.getMessage());
+			}
+		}
+	}
+
+	public static void printAllMissingErrorPrefix(boolean trace, String[] files) {
+		for (int i = 0; i < files.length; i++) {
+			try {
+				System.out.println("******************************************"); //$NON-NLS-1$
+				PropertyFile propFile = new PropertyFile(files[i], trace);
+				propFile.printAllMissingMessagePrefixes();
+				System.out.println("******************************************"); //$NON-NLS-1$
+				System.out.println();
+			}
+			catch (java.io.IOException e) {
+				System.out.println(e.getMessage());
+			}
+		}
+	}
+
+	public static void printBlanks(boolean trace, String[] files) {
+		for (int i = 0; i < files.length; i++) {
+			try {
+				System.out.println("******************************************"); //$NON-NLS-1$
+				PropertyFile propFile = new PropertyFile(files[i], trace);
+				propFile.printAllMessagesWhichAreBlank();
+				System.out.println("******************************************"); //$NON-NLS-1$
+				System.out.println();
+			}
+			catch (java.io.IOException e) {
+				System.out.println(e.getMessage());
+			}
+		}
+	}
+
+	public static void printMessagesWithoutPrefixes(boolean trace, String[] files) {
+		for (int i = 0; i < files.length; i++) {
+			try {
+				System.out.println("******************************************"); //$NON-NLS-1$
+				PropertyFile propFile = new PropertyFile(files[i], trace);
+				propFile.printAllMessagesWithoutAMessagePrefix();
+				System.out.println("******************************************"); //$NON-NLS-1$
+				System.out.println();
+			}
+			catch (java.io.IOException e) {
+				System.out.println(e.getMessage());
+			}
+		}
+	}
+
+	public static void compareFiles(boolean trace, File oldFile, File newFile) {
+		if(oldFile.isFile() && newFile.isFile()) {
+			try {
+				PropertyFile oldPropFile = new PropertyFile(oldFile.getAbsolutePath(), trace);
+				PropertyFile newPropFile = new PropertyFile(newFile.getAbsolutePath(), trace);
+				CompareProperties cp = new CompareProperties(oldPropFile, newPropFile);
+				cp.printResults();
+			}
+			catch (java.io.IOException e) {
+				System.out.println(e.getMessage());
+			}
+		}
+		else if(oldFile.isDirectory() && newFile.isDirectory()) {
+			String[] oldChildren = oldFile.list();
+			for(int i=0; i<oldChildren.length; i++) {
+				File newChild = new File(newFile, oldChildren[i]);
+				if(newChild.exists()) {
+					// Found a file or directory that is named the same in the old & new. Compare.
+					compareFiles(trace, new File(oldFile, oldChildren[i]), newChild);
+				}
+			}
+		}
+		else {
+			System.out.println("Compare two files or two directories. Do not compare a file to a directory (" + oldFile.getName() + ", " + newFile.getName() + ")."); //$NON-NLS-1$  //$NON-NLS-2$ //$NON-NLS-3$
+		}
+	}
+
+	public static void compareFilesForTranslation(boolean trace, File oldFile, File newFile) {
+		if(oldFile.isFile() && newFile.isFile()) {
+			try {
+				PropertyFile oldPropFile = new PropertyFile(oldFile.getAbsolutePath(), trace);
+				PropertyFile newPropFile = new PropertyFile(newFile.getAbsolutePath(), trace);
+				CompareProperties cp = new CompareProperties(oldPropFile, newPropFile);
+				cp.printResultsForTranslation();
+			}
+			catch (java.io.IOException e) {
+				System.out.println(e.getMessage());
+			}
+		}
+		else if(oldFile.isDirectory() && newFile.isDirectory()) {
+			String[] oldChildren = oldFile.list();
+			for(int i=0; i<oldChildren.length; i++) {
+				File newChild = new File(newFile, oldChildren[i]);
+				if(newChild.exists()) {
+					// Found a file or directory that is named the same in the old & new. Compare.
+					compareFilesForTranslation(trace, new File(oldFile, oldChildren[i]), newChild);
+				}
+			}
+		}
+		else {
+			System.out.println("Compare two files or two directories. Do not compare a file to a directory (" + oldFile.getName() + ", " + newFile.getName() + ")."); //$NON-NLS-1$  //$NON-NLS-2$ //$NON-NLS-3$
+		}
+	}
+
+	public static void printDuplicateIds(boolean trace, String[] files) {
+		for (int i = 0; i < files.length; i++) {
+			try {
+				System.out.println("******************************************"); //$NON-NLS-1$
+				PropertyFile propFile = new PropertyFile(files[i], trace);
+				propFile.printDuplicateMessageId();
+				System.out.println("******************************************"); //$NON-NLS-1$
+				System.out.println();
+			}
+			catch (java.io.IOException e) {
+				System.out.println(e.getMessage());
+			}
+		}
+	}
+
+	public static void printErrorPrefix(boolean trace, String prefix, String[] files) {
+		for (int i = 0; i < files.length; i++) {
+			try {
+				System.out.println("******************************************"); //$NON-NLS-1$
+				PropertyFile propFile = new PropertyFile(files[i], trace);
+				propFile.printLastMessagePrefixStartingWith(prefix);
+				System.out.println("******************************************"); //$NON-NLS-1$
+				System.out.println();
+			}
+			catch (java.io.IOException e) {
+				System.out.println(e.getMessage());
+			}
+		}
+	}
+
+	public static void printErrorPrefixRange(boolean trace, String prefix, String[] files) {
+		for (int i = 0; i < files.length; i++) {
+			try {
+				System.out.println("******************************************"); //$NON-NLS-1$
+				PropertyFile propFile = new PropertyFile(files[i], trace);
+				propFile.printMessagePrefixStartingWith(prefix);
+				System.out.println("******************************************"); //$NON-NLS-1$
+				System.out.println();
+			}
+			catch (java.io.IOException e) {
+				System.out.println(e.getMessage());
+			}
+		}
+	}
+
+	public static void printDuplicatePrefixes(boolean trace, String[] files) {
+		for (int i = 0; i < files.length; i++) {
+			try {
+				System.out.println("******************************************"); //$NON-NLS-1$
+				PropertyFile propFile = new PropertyFile(files[i], trace);
+				propFile.printDuplicateMessagePrefix();
+				System.out.println("******************************************"); //$NON-NLS-1$
+				System.out.println();
+			}
+			catch (java.io.IOException e) {
+				System.out.println(e.getMessage());
+			}
+		}
+	}
+
+	public static void printStringLength(boolean trace, String[] files) {
+		for (int i = 0; i < files.length; i++) {
+			try {
+				System.out.println("******************************************"); //$NON-NLS-1$
+				PropertyFile propFile = new PropertyFile(files[i], trace);
+				propFile.printStringLength();
+				System.out.println("******************************************"); //$NON-NLS-1$
+				System.out.println();
+			}
+			catch (java.io.IOException e) {
+				System.out.println(e.getMessage());
+			}
+		}
+	}
+
+	public static void printExpectedStringLength(boolean trace, String slength, String[] files) {
+		int length = 0;
+		
+		try {
+			length = new Integer(slength).intValue();
+		}
+		catch(NumberFormatException exc) {
+			System.out.println();
+			System.out.println("Parameter must be an integer."); //$NON-NLS-1$
+			System.out.println();
+			return;
+		}
+		
+		for (int i = 0; i < files.length; i++) {
+			try {
+				System.out.println("******************************************"); //$NON-NLS-1$
+				PropertyFile propFile = new PropertyFile(files[i], trace);
+				propFile.printExpectedStringLength(length);
+				System.out.println("******************************************"); //$NON-NLS-1$
+				System.out.println();
+			}
+			catch (java.io.IOException e) {
+				System.out.println(e.getMessage());
+			}
+		}
+	}
+
+	public static void printErrorMessages(boolean trace, String[] files) {
+		for (int i = 0; i < files.length; i++) {
+			try {
+				System.out.println("******************************************"); //$NON-NLS-1$
+				PropertyFile propFile = new PropertyFile(files[i], trace);
+				propFile.printAllMessagesWithAMessagePrefix();
+				System.out.println("******************************************"); //$NON-NLS-1$
+				System.out.println();
+			}
+			catch (java.io.IOException e) {
+				System.out.println(e.getMessage());
+			}
+		}
+	}
+
+	public static void printWordCount(boolean trace, String[] files) {
+		for (int i = 0; i < files.length; i++) {
+			try {
+				System.out.println("******************************************"); //$NON-NLS-1$
+				PropertyFile propFile = new PropertyFile(files[i], trace);
+				System.out.println(propFile.getQualifiedFileName() + ":: Number of words :: " + propFile.getNumWords()); //$NON-NLS-1$
+				System.out.println("******************************************"); //$NON-NLS-1$
+				System.out.println();
+			}
+			catch (java.io.IOException e) {
+				System.out.println(e.getMessage());
+			}
+		}
+	}
+
+	public static void printPrefixCount(boolean trace, String[] files) {
+		for (int i = 0; i < files.length; i++) {
+			try {
+				System.out.println("******************************************"); //$NON-NLS-1$
+				PropertyFile propFile = new PropertyFile(files[i], trace);
+				System.out.println("Usually the number of unique prefixes and the number of prefixes is the same, but if a .properties file has variations of a message (slightly different wording for a different context), then the number of prefix messages will be larger than the number of unique prefixes."); //$NON-NLS-1$
+				System.out.println(propFile.getQualifiedFileName() + ":: Number of unique prefixes :: " + propFile.getNumUniquePrefixes()); //$NON-NLS-1$
+				System.out.println(propFile.getQualifiedFileName() + ":: Number of messages with prefixes :: " + propFile.getNumPrefixes()); //$NON-NLS-1$
+				System.out.println(propFile.getQualifiedFileName() + ":: Number of messages without prefixes :: " + propFile.getNumWithoutPrefixes()); //$NON-NLS-1$
+				System.out.println("******************************************"); //$NON-NLS-1$
+				System.out.println();
+			}
+			catch (java.io.IOException e) {
+				System.out.println(e.getMessage());
+			}
+		}
+	}
+	public static void printFileContents(boolean trace, String[] files) {
+		for (int i = 0; i < files.length; i++) {
+			try {
+				System.out.println("******************************************"); //$NON-NLS-1$
+				PropertyFile propFile = new PropertyFile(files[i], trace);
+				propFile.printContents();
+				System.out.println("******************************************"); //$NON-NLS-1$
+				System.out.println();
+			}
+			catch (java.io.IOException e) {
+				System.out.println(e.getMessage());
+			}
+		}
+	}
+
+	public static void printDefault(boolean trace, String[] files) {
+		for (int i = 0; i < files.length; i++) {
+			try {
+				// print all errors, warnings, etc.
+				System.out.println("******************************************"); //$NON-NLS-1$
+				PropertyFile propFile = new PropertyFile(files[i], trace);
+				propFile.printSyntaxWarnings();
+				propFile.printDuplicateMessageId();
+				propFile.printDuplicateMessagePrefix();
+				System.out.println("******************************************"); //$NON-NLS-1$
+				System.out.println();
+			}
+			catch (java.io.IOException e) {
+				System.out.println(e.getMessage());
+			}
+		}
+	}
+
+	public static void print(String[] argv) {
+		for(int i =0;i<argv.length; i++) {
+			System.out.println(i + ". " + argv[i]); //$NON-NLS-1$
+		}
+	}
+}
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.validation.sample/propertiesValidator/org/eclipse/jst/validation/sample/parser/MessageMetaData.java b/tests/org.eclipse.jst.validation.sample/propertiesValidator/org/eclipse/jst/validation/sample/parser/MessageMetaData.java
new file mode 100644
index 0000000..907e558
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.sample/propertiesValidator/org/eclipse/jst/validation/sample/parser/MessageMetaData.java
@@ -0,0 +1,211 @@
+package org.eclipse.jst.validation.sample.parser;
+/*
+ * Licensed Material - Property of IBM 
+ * (C) Copyright IBM Corp. 2002, 2003 - All Rights Reserved. 
+ * US Government Users Restricted Rights - Use, duplication or disclosure 
+ * restricted by GSA ADP Schedule Contract with IBM Corp. 
+ *
+ * DISCLAIMER OF WARRANTIES.
+ * The following [enclosed] code is sample code created by IBM
+ * Corporation. This sample code is not part of any standard or IBM
+ * product and is provided to you solely for the purpose of assisting
+ * you in the development of your applications.  The code is provided
+ * "AS IS". IBM MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT
+ * NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE, REGARDING THE FUNCTION OR PERFORMANCE OF
+ * THIS CODE.  THIS CODE MAY CONTAIN ERRORS.  IBM shall not be liable
+ * for any damages arising out of your use of the sample code, even
+ * if it has been advised of the possibility of such damages.
+ * 
+ */
+
+import java.util.Locale;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+
+/**
+ * This class holds the metadata for an IMessage that must be 
+ * reported to the user (i.e., a validation error, warning,
+ * or information message). 
+ */
+public class MessageMetaData {
+	public static final int INT_UNSET = -1;
+	public static final int ERROR = 1;
+	public static final int WARNING = 2;
+	public static final int INFO = 3;
+	
+	private String _bundleName = null;
+	private int _severity = INT_UNSET;
+	private String _messageId = null;
+	private String[] _parms = null;
+	private Object _targetObject = null;
+	private int _lineNumber = INT_UNSET;
+	private int _offset = INT_UNSET;
+	private int _length = INT_UNSET;
+	private String _text = null;
+	
+	/**
+	 * This constructor should be used if the message text has already
+	 * been translated.
+	 */
+	public MessageMetaData(String messageText) {
+		_text = messageText;
+	}
+	
+	/**
+	 * This constructor should be used if the message text is not translated
+	 * until just before the text should be shown to the user.
+	 * 
+	 * @param bundleName - The name of the resource bundle in which the message is contained
+	 * @param severity - One of the com.ibm.etools.validation.core.SeverityEnum constants; this parameter represents the severity of the IMessage.
+	 * @param messageId - The message id that uniquely identifies the message to be retrieved from the bundle.
+	 * @param parms - The parameters to be substituted into the java.text.MessageText's patterns.
+	 * @param targetObject - The target object of the IMessage (see com.ibm.etools.validation.core.IMessage).
+	 * @param lineNumber - The line number where the problem can be found.
+	 */
+	public MessageMetaData(String bundleName, int severity, String messageId, String[] parms, Object targetObject, int lineNumber) {
+		this(bundleName, severity, messageId, parms, targetObject, lineNumber, INT_UNSET, INT_UNSET);
+	}
+	
+	/**
+	 * This constructor should be used if the message text is not translated
+	 * until just before the text should be shown to the user.
+	 * 
+	 * @param bundleName - The name of the resource bundle in which the message is contained
+	 * @param severity - One of the com.ibm.etools.validation.core.SeverityEnum constants; this parameter represents the severity of the IMessage.
+	 * @param messageId - The message id that uniquely identifies the message to be retrieved from the bundle.
+	 * @param parms - The parameters to be substituted into the java.text.MessageText's patterns.
+	 * @param targetObject - The target object of the IMessage (see com.ibm.etools.validation.core.IMessage).
+	 * @param lineNumber - The line number where the problem can be found.
+	 * @param offset - In number of characters, how many characters from the start of the .properties file to the location of the problem.
+	 * @param length - In number of characters, how many characters from the offset to the end of the problem.
+	 */
+	public MessageMetaData(String bundleName, int severity, String messageId, String[] parms, Object targetObject, int lineNumber, int offset, int length) {
+		_bundleName = bundleName;
+		_severity = severity;
+		_messageId = messageId;
+		_parms = parms;
+		_targetObject = targetObject;
+		_lineNumber = lineNumber;
+		_offset = offset;
+		_length = length;
+	}
+	
+	public String getBundleName() {
+		return _bundleName;
+	}
+	
+	public int getSeverity() {
+		return _severity;
+	}
+	
+	public String getId() {
+		return _messageId;
+	}
+	
+	public String[] getParams() {
+		return _parms;
+	}
+	
+	public Object getTargetObject() {
+		return _targetObject;
+	}
+	
+	public int getLineNumber() {
+		return _lineNumber;
+	}
+	
+	public int getOffset() {
+		return _offset;
+	}
+
+	public int getLength() {
+		return _length;
+	}
+	
+	/**
+	 * Use the given ClassLoader to load this message's text
+	 * from the resource bundle.
+	 */
+	public String getText(ClassLoader classLoader) {
+		if(_text == null) {
+			return getText(Locale.getDefault(), classLoader);
+		}
+		return _text;
+	}
+
+	/**
+	 * Use the given ClassLoader to load this message's text,
+	 * for the Locale, from the resource bundle.
+	 */	
+	public String getText(Locale locale, ClassLoader classLoader) {
+		if(_text == null) {
+			return getText(getBundleName(), locale, classLoader, getId(), getParams());
+		}
+		
+		return _text;
+	}
+	
+	/**
+	 * Return the translated message.
+	 * 
+	 * @param bundleName The name of the resource bundle to search for the message.
+	 * @param locale The Locale for which the message should be loaded.
+	 * @param classLoader The ClassLoader which can locate the resource bundle.
+	 * @param messageId The unique id, in the resource bundle, that identifies the message.
+	 * @param parms The parameters to substitute into the pattern of the java.text.MessageFormat message.
+	 */
+	public static java.lang.String getText(String bundleName, Locale locale, ClassLoader classLoader, String messageId, String[] parms) {
+		String message = ""; //$NON-NLS-1$
+
+		if (locale == null) {
+			return message;
+		}
+
+		ResourceBundle bundle = getBundle(bundleName, locale, classLoader);
+		if (bundle == null) {
+			return message;
+		}
+
+		try {
+			message = bundle.getString(messageId);
+
+			if (parms != null) {
+				message = java.text.MessageFormat.format(message, parms);
+			}
+		}
+		catch (MissingResourceException exc) {
+			System.err.println(exc.getMessage());
+			System.err.println(messageId);
+		}
+		catch (NullPointerException exc) {
+			System.err.println(exc.getMessage());
+			System.err.println(messageId);
+		}
+
+		return message;
+	}
+
+	/**
+	 * Return the resource bundle which contains the messages, as identified by
+	 * @link #getBundleName()
+	 */
+	public static ResourceBundle getBundle(String bundleName, Locale locale, ClassLoader classLoader) {
+		ResourceBundle bundle = null;
+		try {
+			if (classLoader == null) {
+				bundle = ResourceBundle.getBundle(bundleName, locale);
+			}
+			else {
+				bundle = ResourceBundle.getBundle(bundleName, locale, classLoader);
+			}
+		}
+		catch (MissingResourceException e) {
+			e.printStackTrace();
+		}
+		return bundle;
+	}
+	
+}
+
diff --git a/tests/org.eclipse.jst.validation.sample/propertiesValidator/org/eclipse/jst/validation/sample/parser/PropertyFile.java b/tests/org.eclipse.jst.validation.sample/propertiesValidator/org/eclipse/jst/validation/sample/parser/PropertyFile.java
new file mode 100644
index 0000000..8b60b14
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.sample/propertiesValidator/org/eclipse/jst/validation/sample/parser/PropertyFile.java
@@ -0,0 +1,106 @@
+package org.eclipse.jst.validation.sample.parser;
+/*
+ * Licensed Material - Property of IBM 
+ * (C) Copyright IBM Corp. 2002, 2003 - All Rights Reserved. 
+ * US Government Users Restricted Rights - Use, duplication or disclosure 
+ * restricted by GSA ADP Schedule Contract with IBM Corp. 
+ *
+ * DISCLAIMER OF WARRANTIES.
+ * The following [enclosed] code is sample code created by IBM
+ * Corporation. This sample code is not part of any standard or IBM
+ * product and is provided to you solely for the purpose of assisting
+ * you in the development of your applications.  The code is provided
+ * "AS IS". IBM MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT
+ * NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE, REGARDING THE FUNCTION OR PERFORMANCE OF
+ * THIS CODE.  THIS CODE MAY CONTAIN ERRORS.  IBM shall not be liable
+ * for any damages arising out of your use of the sample code, even
+ * if it has been advised of the possibility of such damages.
+ * 
+ */
+
+import java.io.File;
+
+/**
+ * This PropertyFile is instantiated by code that isn't an IValidator.
+ */
+public class PropertyFile extends APropertyFile {
+	private String _enclosingZipFileName = null;
+	private String _propertyFileName = null;
+	private String _fileName = null;
+	
+	public PropertyFile(String fileName) throws java.io.IOException {
+		this(fileName, false);
+	}
+
+	public PropertyFile(String fileName, boolean trace) throws java.io.IOException {
+		this(new File(fileName), trace);
+	}
+	
+	public PropertyFile(File propertyFile) throws java.io.IOException {
+		this(propertyFile, false);
+	}
+	
+	public PropertyFile(File propertyFile, boolean trace) throws java.io.IOException {
+		this(null, propertyFile, trace);
+	}
+	
+	public PropertyFile(String enclosingZipFileName, File propertyFile) throws java.io.IOException {
+		this(enclosingZipFileName, propertyFile, false);
+	}
+
+	public PropertyFile(String enclosingZipFileName, File propertyFile, boolean debug) throws java.io.IOException {
+		if (!propertyFile.exists())
+			throw new java.io.IOException("Cannot find file " + propertyFile.getName()); //$NON-NLS-1$
+		if (!propertyFile.isFile())
+			throw new java.io.IOException(propertyFile.getName() + " is not a file"); //$NON-NLS-1$
+		if (!propertyFile.canRead())
+			throw new java.io.IOException("Cannot read " + propertyFile.getName()); //$NON-NLS-1$
+		if (!propertyFile.getName().endsWith("properties")) //$NON-NLS-1$
+			throw new java.io.IOException("Can parse only .properties files; ignoring " + propertyFile.getName()); //$NON-NLS-1$
+
+		setDebug(debug);
+			
+		_enclosingZipFileName = enclosingZipFileName;
+		
+		_fileName = propertyFile.getName();
+		
+		report("File name: " + _fileName); //$NON-NLS-1$
+		parseFile(propertyFile);
+		report(""); //$NON-NLS-1$
+
+		propertyFile = null;
+	}
+	
+	/*
+	 * @see APropertyFile#report(String)
+	 */
+	public void report(String str) {
+		System.out.println(str);
+	}
+	
+	/*
+	 * @see APropertyFile#report(MessageMetaData)
+	 */
+	public void report(MessageMetaData message) {
+		StringBuffer buffer = new StringBuffer(message.getText(getClass().getClassLoader()));
+		buffer.append(ResourceHandler.getExternalizedMessage(IValidationConstants.BUNDLENAME, IValidationConstants.LINE_LOC, new String[]{String.valueOf(message.getLineNumber()), getQualifiedFileName()}));
+		report(buffer.toString());
+	}
+	
+	public String getQualifiedFileName() {
+		if (_propertyFileName == null) {
+			if (_enclosingZipFileName == null) {
+				_propertyFileName = _fileName;
+			}
+			else {
+				_propertyFileName = _enclosingZipFileName + "::" + _fileName; //$NON-NLS-1$
+			}
+		}
+		return _propertyFileName;
+	}
+
+	public String getFileName() {
+		return _fileName;
+	}
+}
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.validation.sample/propertiesValidator/org/eclipse/jst/validation/sample/parser/PropertyLine.java b/tests/org.eclipse.jst.validation.sample/propertiesValidator/org/eclipse/jst/validation/sample/parser/PropertyLine.java
new file mode 100644
index 0000000..c769c7f
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.sample/propertiesValidator/org/eclipse/jst/validation/sample/parser/PropertyLine.java
@@ -0,0 +1,642 @@
+package org.eclipse.jst.validation.sample.parser;
+/*
+ * Licensed Material - Property of IBM 
+ * (C) Copyright IBM Corp. 2002, 2003 - All Rights Reserved. 
+ * US Government Users Restricted Rights - Use, duplication or disclosure 
+ * restricted by GSA ADP Schedule Contract with IBM Corp. 
+ *
+ * DISCLAIMER OF WARRANTIES.
+ * The following [enclosed] code is sample code created by IBM
+ * Corporation. This sample code is not part of any standard or IBM
+ * product and is provided to you solely for the purpose of assisting
+ * you in the development of your applications.  The code is provided
+ * "AS IS". IBM MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT
+ * NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE, REGARDING THE FUNCTION OR PERFORMANCE OF
+ * THIS CODE.  THIS CODE MAY CONTAIN ERRORS.  IBM shall not be liable
+ * for any damages arising out of your use of the sample code, even
+ * if it has been advised of the possibility of such damages.
+ * 
+ */
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.List;
+import java.util.StringTokenizer;
+
+/**
+ * PropertyLine represents a line in a PropertyFile. It has a message id,
+ * a message value (the text of the property; this is the text which is
+ * translated), a line number, and, optionally, an unique error id (of the
+ * form ABCD1234{E|W|I}).
+ */
+public class PropertyLine implements Comparable {
+	private String _messageId; // the message id (not translated)
+	private String _message = null; // the message value with the error id (translated)
+	private String _messagePrefix = null; // the prefix (e.g. ABCD1234{E|W|I}
+	private String _shortMessage = null; // the message value without the error id (translated)
+	private int _lineNumber = -1; // the line number of this message value
+	private int _numWords = -1;
+	private final String EMPTY = ""; //$NON-NLS-1$
+	private APropertyFile _file = null;
+	private int _offset = -1; // the offset, in the .properties file, where this line begins
+	private int _messageOffset = -1;  // the offset in the line, after the EQUALS, where the message prefix begins
+	
+	private static final char QUOTE = '\'';
+	private static final char OBRACKET = '{';
+	private static final char CBRACKET = '}';
+
+	// The Enum for the message severity can be one of these four values. If there is an error id,
+	// UNASSIGNED indicates an invalid value. 
+	public final static int UNASSIGNED = 0;
+	public final static int ERROR = 0x1;
+	public final static int WARNING = 0x2;
+	public final static int INFO = 0x3;
+
+	private int _severity = UNASSIGNED; // the severity of the message, if this message has an error id. UNASSIGNED means either that the severity was an invalid severity (not info, warn, or error), or that the message has no error id. Check the value of the error id to find out which of the two is the case.
+	private int _numParms = 0;
+	
+	private static final char[] BLANK = "                                                                                                    ".toCharArray(); // this string is 100 characters long. It's used to quickly get a blank string in the getBlank(int) method. Hopefully the user will never want more than 100 char in a given parameter. //$NON-NLS-1$
+
+	public PropertyLine(APropertyFile file, int offset, int messageOffset, String messageId, String message, int lineNumber) {
+		// Comment on the use of intern().
+		// Because it's likely that we'll be comparing this string a lot,
+		// load it into the Java constants space through intern(). Since we won't
+		// be modifying this string, it's safe to load it into the constants space.
+		//
+		_offset = offset; // the offset in the .properties file where this line begins
+		_messageOffset = messageOffset; // the offset in the line, after the EQUALS, where the message prefix begins
+		_messageId = messageId;
+		_message = message; // re: intern(). Ditto.
+		_lineNumber = lineNumber;
+		_file = file;
+
+		parse(message);
+	}
+
+	public int compareTo(Object o) {
+		// by default, sort by message id
+		if (!(o instanceof PropertyLine)) {
+			// then how on earth did this method get called??
+			// put it at the end of the list
+			return 1;
+		}
+
+		return getMessageId().compareTo(((PropertyLine) o).getMessageId());
+	}
+
+	public APropertyFile getFile() {
+		return _file;
+	}
+
+	public String getMessagePrefix() {
+		return _messagePrefix;
+	}
+	
+	public boolean hasMessagePrefix() {
+		if(_messagePrefix == null) {
+			return false;
+		}
+		
+		if(_messagePrefix.equals(EMPTY)) {
+			return false;
+		}
+		
+		return true;
+	}
+	
+	public int getLineNumber() {
+		return _lineNumber;
+	}
+	public String getMessage() {
+		return _message;
+	}
+	public String getMessageId() {
+		return _messageId;
+	}
+	public String getShortMessage() {
+		return _shortMessage;
+	}
+	
+	/**
+	 * This method returns the number of words in the message excluding 
+	 * the message error id prefix.
+	 */
+	public int getNumWords() {
+		if(_numWords == -1) {
+			_numWords = 0;
+			StringTokenizer tokenizer = new StringTokenizer(getShortMessage());
+			_numWords = tokenizer.countTokens();
+		}
+		return _numWords;
+	}
+	
+	/**
+	 * This method returns the number of characters in the 
+	 * message including the message prefix and parameters. (i.e., {0} would
+	 * be counted as three characters.)
+	 */
+	public int getLength() {
+		return getMessage().length();
+	}
+	
+	/**
+	 * This method returns the number of characters in the 
+	 * message including the message prefix and the expected 
+	 * number of characters. (That is, the lengthParm parameter
+	 * is used as an approximation of the length of each parameter
+	 * in the message.)
+	 */
+	public int getExpectedLength(int lengthParm) {
+		if(hasParameters() && (lengthParm > 0)) {
+			return getExpectedMessage(lengthParm).length();
+		}
+		return getLength();
+	}
+	
+	/**
+	 * This method substitutes a blank stub of the given length
+	 * every place in the string where there is a parm.
+	 */
+	public String getExpectedMessage(int lengthParm) {
+		if(hasParameters() && (lengthParm > 0)) {
+			// message cannot be null or blank or it wouldn't have parameters
+			String blank = getBlank(lengthParm);
+			
+			int numParm = getNumParameters();
+			String[] parm = new String[numParm];
+			for(int i=0; i<parm.length; i++) {
+				parm[i] = blank;
+			}
+			
+			try {
+				return java.text.MessageFormat.format(getMessage(), parm);
+			}
+			catch(IllegalArgumentException exc) {
+				if(getFile().debug()) {
+					getFile().report(exc.getMessage());
+					getFile().report(getFile().getQualifiedFileName() + "::" + getMessageId()); //$NON-NLS-1$
+				}
+				return getMessage();
+			}
+		}
+		return getMessage();
+	}
+	
+	/**
+	 * Return a blank string of the given length.
+	 */
+	public static String getBlank(int length) {
+		char[] blank = new char[length];
+		if(length > BLANK.length) {
+			for(int i=0; i<length; i++) {
+				blank[i] = ' ';
+			}
+		}
+		else {
+			System.arraycopy(BLANK, 0, blank, 0, length);
+		}
+		return new String(blank);
+	}
+
+	/**
+	 * Return true if the line has java.text.MessageFormat patterns.
+	 */
+	public boolean hasParameters() {
+		return getNumParameters() > 0;
+	}
+	
+	/**
+	 * Return the number of java.text.MessageFormat patterns in the property line.
+	 */
+	public int getNumParameters() {
+		return _numParms;
+	}
+	
+	/**
+	 * Return the number of characters, from the start of the file, to
+	 * the beginning of the message.
+	 */
+	public int getMessageOffset() {
+		return _messageOffset;
+	}
+	
+	/**
+	 * The offset, in the .properties file, where this line begins.
+	 */
+	public int getOffset() {
+		return _offset;
+	}
+	
+	/**
+	 * The severity of the message, if this message has an error id. 
+	 * UNASSIGNED means either that the severity was an invalid severity 
+	 * (not info, warn, or error), or that the message has no error id. Check 
+	 * the value of the error id to find out which of the two is the case.
+	 */
+	public int getSeverity() {
+		return _severity;
+	}
+
+	/**
+	* Parse the message value to extract the unique error id, if any exists.
+	* This method initializes some of the fields in this class.
+	*/
+	public void parse(String message) {
+		// To see why it's safe to call intern(), read the comment in the
+		// constructor.
+
+		// Case 1: ABCD0000E: Blah Blah Blah
+		// Case 2: ABCD0000E  Blah Blah Blah
+		// Case 3: ABCD0000E : Blah Blah Blah
+		// Case 4: ABCD0000E  Blah:Blah Blah
+		// Case 5: ABCD0000E :
+		// Case 6: Blah Blah Blah (i.e., no prefix)
+		// Case 7: ABCD0000E: Blah
+		// Case 8: ABCD0000E  Blah
+		// Case 9: ABCD0000E : Blah
+		// Case 10: ABCD0000E Blah
+		// Case 11: ABCD0000E
+
+		if (message == null) {
+			_messagePrefix = EMPTY;
+			_shortMessage = EMPTY;
+			return;
+		}
+
+		StringTokenizer tokenizer = new StringTokenizer(message);
+		int numTokens = tokenizer.countTokens();
+		if (numTokens == 0) {
+			_messagePrefix = EMPTY;
+			_shortMessage = message;
+		}
+		else {
+			String errorId = tokenizer.nextToken();
+			boolean prefixExists = false;
+
+			// Sometimes the ':' isn't there or isn't in the right place, so don't determine the message prefix based on that.
+			String afterPrefix = null;
+			if(errorId.length() >= 9) {
+				afterPrefix = errorId.substring(0, 9); // Must be of the form ABCD1234E, which is 9 char long
+				char[] temp = afterPrefix.toCharArray();
+				prefixExists = Character.isLetter(temp[0]) && Character.isUpperCase(temp[0]);
+				prefixExists = prefixExists && Character.isLetter(temp[1]) && Character.isUpperCase(temp[0]);
+				prefixExists = prefixExists && Character.isLetter(temp[2]) && Character.isUpperCase(temp[0]);
+				prefixExists = prefixExists && Character.isLetter(temp[3]) && Character.isUpperCase(temp[0]);
+				prefixExists = prefixExists && Character.isDigit(temp[4]);
+				prefixExists = prefixExists && Character.isDigit(temp[5]);
+				prefixExists = prefixExists && Character.isDigit(temp[6]);
+				prefixExists = prefixExists && Character.isDigit(temp[7]);
+				prefixExists = prefixExists && Character.isLetter(temp[8]) && Character.isUpperCase(temp[0]);
+
+				if (prefixExists) {
+					switch (temp[8]) {
+						case ('E') :
+							{
+								_severity = ERROR;
+								break;
+							}
+						case ('W') :
+							{
+								_severity = WARNING;
+								break;
+							}
+						case ('I') :
+							{
+								_severity = INFO;
+								break;
+							}
+	
+						default :
+							{
+								_severity = UNASSIGNED;
+								break;
+							}
+					}
+					_messagePrefix = afterPrefix;
+					
+					int colonIndex = errorId.indexOf(':');
+					boolean noColon = (colonIndex == -1);
+	
+					int shortMessageIndex = 10; // assume that only the ABCD0000E prefix will be stripped (i.e., no colon)
+					if(noColon) {
+						// No colon following message prefix immediately.
+						// Is there whitespace before the colon?
+						if (numTokens > 1) {
+							String nextToken = tokenizer.nextToken();
+							colonIndex = nextToken.indexOf(':');
+							noColon = ((colonIndex == -1) || (nextToken.trim().indexOf(':') != 0)); // case 4 trim condition will be true
+							
+							// ":" should follow the message prefix immediately
+							// Know there's a prefix, and that's 9 char
+							if(noColon) {
+								// Case 2, 4, 8 or 10
+//								MessageMetaData mmd = new MessageMetaData(IValidationConstants.BUNDLENAME, MessageMetaData.INFO, IValidationConstants.ABCD0120, new String[]{}, this, getLineNumber());
+//								getFile().addParseWarning(mmd);
+								shortMessageIndex = 10;
+							}
+							else {
+//								MessageMetaData mmd = new MessageMetaData(IValidationConstants.BUNDLENAME, MessageMetaData.INFO, IValidationConstants.ABCD0130, new String[]{}, this, getLineNumber());
+//								getFile().addParseWarning(mmd);
+								
+								if(numTokens > 2) {
+									// Case 3 or 9
+									nextToken = tokenizer.nextToken();
+									shortMessageIndex = message.indexOf(nextToken);
+								}
+								else {
+									// Case 5
+									shortMessageIndex = colonIndex + 1;
+								}								
+							}
+							_shortMessage = message.substring(shortMessageIndex, message.length());
+						}
+						else {
+							// Case 11
+							_shortMessage = EMPTY;
+						}
+					}
+					else {
+						// Case 1 or 7
+						shortMessageIndex = colonIndex + 1;
+						_shortMessage = message.substring(shortMessageIndex, message.length());
+					}
+				}
+	
+			}
+
+			if (!prefixExists) {
+				// Case 6
+				_messagePrefix = EMPTY;
+				_shortMessage = message;
+			}
+		}
+
+		getFile().addParseWarnings(parseMessage());
+	}
+
+	/**
+	 * Once the field that holds the message text has been set (i.e., parse(String)
+	 * has been called), this method parses the message text, finds any syntax or
+	 * other problems, and returns a List of MessageMetaData, with one MessageMetaData
+	 * for each problem.
+	 */
+	public List parseMessage() {
+		// now parse to see if all apostrophes are in pairs, if there are parameters or not, etc.
+		ArrayList intList = new ArrayList();
+		int numObrackets = 0;
+		int numCbrackets = 0;
+		int index = 0;
+		char token;
+		int singleQuoteIndex = -1;
+		int doubleQuoteIndex = -1;
+		int missingTerminatingQuoteIndex = -1;
+		boolean parmExists = false;
+		int numCharBeforeShort = getMessageOffset() + getMessage().indexOf(getShortMessage());
+		
+		while (index < getShortMessage().length()) {
+			token = getShortMessage().charAt(index++);
+			if (token == QUOTE) {
+				if (index < getShortMessage().length()) {
+					token = getShortMessage().charAt(index++);
+				}
+				else {
+					token = ' ';
+				}
+				
+				if ((token == OBRACKET) || (token == CBRACKET)){
+					if (index < getShortMessage().length()) {
+						token = getShortMessage().charAt(index++);
+					}
+					else {
+						token = ' ';
+					}
+					
+					// Does the { or } character have a terminating single quote?
+					if(token != QUOTE) {
+						missingTerminatingQuoteIndex = (numCharBeforeShort + index-1);
+					}
+				}
+				else if ((token == QUOTE)) {
+					doubleQuoteIndex = (numCharBeforeShort + index-1);
+				}
+				else  {
+					// '{' means that a { will be output,
+					// '}' means that a } will be output,
+					// '' means that a ' will be output.
+					
+					// Since the quote is a special character, and the opening bracket is a 
+					// special character, keep track of the number of open brackets. If the
+					// following character isn't a quote or opening bracket, warn the user 
+					// that it takes two apostrophes to see one apostrophe.
+					singleQuoteIndex = (numCharBeforeShort + index-1);
+				}
+				
+			}
+			else if (token == OBRACKET) {
+				numObrackets++;
+				parmExists = true;
+				StringBuffer numBuffer = null;
+				if (index < getShortMessage().length()) {
+					numBuffer = new StringBuffer();
+					while (index < getShortMessage().length()) {
+						char digit = getShortMessage().charAt(index);
+						if ((Character.isDigit(digit)) || (digit == '-') || (digit == '+')) {
+							numBuffer.append(digit);
+							index++;
+						}
+						else {
+							break;
+						}
+					}
+				}
+				else {
+					// not an error; just not a number. Could be one of the other 
+					// ChoiceFormat, or whatever, formats. Do not get the next 
+					// token, because we still need to process this one.
+					continue;
+				}
+
+				try {
+					if ((numBuffer != null) && (numBuffer.length() > 0)) {
+						Integer parmNum = Integer.valueOf(numBuffer.toString());
+						intList.add(parmNum);
+					}
+				}
+				catch (NumberFormatException exc) {
+					// not an error; just not a number. Could be one of the other 
+					// ChoiceFormat, or whatever, formats. Do not get the next 
+					// token, because we still need to process this one.
+				}
+			}
+			else if (token == CBRACKET) {
+				numCbrackets++;
+			}
+		}
+		
+		_numParms = Math.max(numObrackets, numCbrackets);
+
+		// find parse warnings
+		List messages = new ArrayList();
+		if (numObrackets != numCbrackets) {
+			MessageMetaData mmd = new MessageMetaData(IValidationConstants.BUNDLENAME, MessageMetaData.ERROR, IValidationConstants.ABCD0000, new String[]{String.valueOf(numObrackets), String.valueOf(numCbrackets)}, this, getLineNumber());
+			messages.add(mmd);
+		}
+		
+		if(missingTerminatingQuoteIndex != -1) {
+			MessageMetaData mmd = new MessageMetaData(IValidationConstants.BUNDLENAME, MessageMetaData.INFO, IValidationConstants.ABCD0110, new String[]{String.valueOf(missingTerminatingQuoteIndex)}, this, getLineNumber(), getOffset() + missingTerminatingQuoteIndex, 1); // magic number 1 because a quote is one character long
+			messages.add(mmd);
+		}
+
+		// Now sort the list, to see if there's any numbers missing, duplicated, or negative
+		Collections.sort(intList, new Comparator() {
+			public int compare(Object a, Object b) {
+				// negative = b before a
+				// zero = a = b
+				// positive = a before b
+				return ((Integer) a).intValue() - ((Integer) b).intValue();
+			}
+		});
+		Iterator iterator = intList.iterator();
+		int parmCount = 0;
+		int lastNumber = -1;
+		int largestNumber = -1;
+		while (iterator.hasNext()) {
+			Integer parm = (Integer) iterator.next();
+			if (parm.intValue() < 0) {
+				MessageMetaData mmd = new MessageMetaData(IValidationConstants.BUNDLENAME, MessageMetaData.ERROR, IValidationConstants.ABCD0010E, new String[]{String.valueOf(parm.intValue())}, this, getLineNumber());
+				messages.add(mmd);
+			}
+			else if (parm.intValue() == lastNumber) {
+				MessageMetaData mmd = new MessageMetaData(IValidationConstants.BUNDLENAME, MessageMetaData.INFO, IValidationConstants.ABCD0020, new String[]{String.valueOf(lastNumber)}, this, getLineNumber());
+				messages.add(mmd);
+			}
+			else if (parm.intValue() != parmCount) {
+				MessageMetaData mmd = new MessageMetaData(IValidationConstants.BUNDLENAME, MessageMetaData.INFO, IValidationConstants.ABCD0030, new String[]{String.valueOf(parmCount)}, this, getLineNumber());
+				messages.add(mmd);
+			}
+			else {
+				parmCount++;
+			}
+			lastNumber = parm.intValue();
+			largestNumber = Math.max(largestNumber, parm.intValue());
+		}
+		if(largestNumber > 0) {
+			// Not a choice format.
+			//
+			// Although the first default (counting the number of 
+			// brackets) is okay in most cases, sometimes a parameter 
+			// is missing, and so the number of paramters passed into 
+			// the MessageFormat needs to be larger. (e.g. {0} {2}, 
+			// need String[] to be {"", "", ""}, not {"", ""}). 
+			
+			// Need to add "1" to it because the numbers start at a 0 index.
+			_numParms = largestNumber + 1; 
+		}
+		
+		if(largestNumber > 9) {
+			// MessageFormat will not substitute in parameters after the 10 parameter (i.e., number 9).
+			MessageMetaData mmd = new MessageMetaData(IValidationConstants.BUNDLENAME, MessageMetaData.WARNING, IValidationConstants.ABCD0010W, new String[]{String.valueOf(largestNumber)}, this, getLineNumber());
+			messages.add(mmd);
+		}
+
+		if ((singleQuoteIndex > -1) && parmExists) {
+			MessageMetaData mmd = new MessageMetaData(IValidationConstants.BUNDLENAME, MessageMetaData.INFO, IValidationConstants.ABCD0040, new String[]{String.valueOf(singleQuoteIndex)}, this, getLineNumber(), getOffset() + singleQuoteIndex, 1); // magic number 1 because a quote is one character long
+			messages.add(mmd);
+		}
+		else if ((doubleQuoteIndex > -1) && !parmExists) {
+			MessageMetaData mmd = new MessageMetaData(IValidationConstants.BUNDLENAME, MessageMetaData.INFO, IValidationConstants.ABCD0050, new String[]{String.valueOf(doubleQuoteIndex)}, this, getLineNumber(), getOffset() + doubleQuoteIndex, 1); // magic number 1 because a quote is one character long
+			messages.add(mmd);
+		}
+
+		return messages;
+	}
+
+	/**
+	 * Format this .properties line for display.
+	 */
+	public String toString() {
+		StringBuffer buffer = null;
+		if(getFile() == null) {
+			buffer = new StringBuffer();
+		}
+		else {
+			buffer = new StringBuffer(getFile().getQualifiedFileName());
+		}
+		buffer.append("\tLine number: "); //$NON-NLS-1$
+		buffer.append(String.valueOf(getLineNumber()));
+		buffer.append("\t"); //$NON-NLS-1$
+		buffer.append(getMessageId());
+		buffer.append(" = "); //$NON-NLS-1$
+		buffer.append(getMessage());
+		return buffer.toString();
+	}
+	
+	/**
+	 * Format this .properties line for display, and substitute a stub,
+	 * of the specified length, into each java.text.MessageFormat pattern.
+	 */
+	public String toStringWithExpectedLength(int length) {
+		StringBuffer buffer = null;
+		if(getFile() == null) {
+			buffer = new StringBuffer();
+		}
+		else {
+			buffer = new StringBuffer(getFile().getQualifiedFileName());
+		}
+		buffer.append("\tLine number: "); //$NON-NLS-1$
+		buffer.append(String.valueOf(getLineNumber()));
+		buffer.append("\t"); //$NON-NLS-1$
+		buffer.append(getMessageId());
+		buffer.append(" = "); //$NON-NLS-1$
+		buffer.append(getExpectedMessage(length));
+		return buffer.toString();
+	}
+	
+	/**
+	 * Return the message prefix without the severity, e.g.,
+	 * ABCD0000 instead of ABCD0000E.
+	 */
+	public String getShortMessagePrefix() {
+		String prefix = getMessagePrefix();
+		if(prefix.equals("")) { //$NON-NLS-1$
+			return ""; //$NON-NLS-1$
+		}
+		
+		char prefixEnd = prefix.charAt(prefix.length() - 1);
+		if ((prefixEnd == 'E') || (prefixEnd == 'W') || (prefixEnd == 'I')) {
+			prefix = prefix.substring(0, prefix.length() - 1);
+		}
+		return prefix;
+	}
+	
+	/**
+	 * A PropertyLine is equal if it is in the same file and on the same line number.
+	 */
+	public boolean equals(Object o) {
+		if(o == null) {
+			return false;
+		}
+		
+		if(!(o instanceof PropertyLine)) {
+			return false;
+		}
+		
+		PropertyLine oLine = (PropertyLine)o;
+		if(!(getLineNumber() == oLine.getLineNumber())) {
+			return false;
+		}
+		
+		if(!getFile().equals(oLine.getFile())) {
+			return false;
+		}
+		
+		return true;
+	}
+	
+	public int hashCode() {
+		return (getFile().hashCode() + getLineNumber());
+	}
+}
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.validation.sample/propertiesValidator/org/eclipse/jst/validation/sample/parser/PropertyLineComparator.java b/tests/org.eclipse.jst.validation.sample/propertiesValidator/org/eclipse/jst/validation/sample/parser/PropertyLineComparator.java
new file mode 100644
index 0000000..7daad29
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.sample/propertiesValidator/org/eclipse/jst/validation/sample/parser/PropertyLineComparator.java
@@ -0,0 +1,254 @@
+package org.eclipse.jst.validation.sample.parser;
+/*
+ * Licensed Material - Property of IBM 
+ * (C) Copyright IBM Corp. 2002, 2003 - All Rights Reserved. 
+ * US Government Users Restricted Rights - Use, duplication or disclosure 
+ * restricted by GSA ADP Schedule Contract with IBM Corp. 
+ *
+ * DISCLAIMER OF WARRANTIES.
+ * The following [enclosed] code is sample code created by IBM
+ * Corporation. This sample code is not part of any standard or IBM
+ * product and is provided to you solely for the purpose of assisting
+ * you in the development of your applications.  The code is provided
+ * "AS IS". IBM MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT
+ * NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE, REGARDING THE FUNCTION OR PERFORMANCE OF
+ * THIS CODE.  THIS CODE MAY CONTAIN ERRORS.  IBM shall not be liable
+ * for any damages arising out of your use of the sample code, even
+ * if it has been advised of the possibility of such damages.
+ * 
+ */
+
+import java.util.Comparator;
+
+/**
+ * This class contains all of the Comparator classes that can be used
+ * to sort PropertyLine instances in an APropertyFile. (For example,
+ * to find duplicate message ids, the MessageIdComparator would be used
+ * to sort the lines according to message id. The sorted list is 
+ * traversed to find out if one line has an identical message id 
+ * to the line that follows it, and if so, a parse warning is reported.)
+ */
+public class PropertyLineComparator {
+	private static PropertyLineComparator inst = new PropertyLineComparator();
+	
+	private static final Comparator _messagePrefixComparator = inst.new MessagePrefixComparator();
+	private static final Comparator _messageIdComparator = inst.new MessageIdComparator();
+	private static Comparator _stringLengthComparator = new StringLengthComparator();
+	private static final Comparator _valueComparator = inst.new ValueComparator();
+	private static final Comparator _lineNoComparator = inst.new LineNoComparator();
+
+	private PropertyLineComparator() {
+	}	
+
+	/**
+	 * This class compares PropertyLine instances and sorts them according to 
+	 * their message prefix (e.g., ABCD0000E).
+	 */
+	private class MessagePrefixComparator implements java.util.Comparator {
+		public int compare(Object a, Object b) {
+			if((a == null) && (b == null)) {
+				return 0;
+			}
+			else if(a == null) {
+				return -1;
+			}
+			else if(b == null) {
+				return 1;
+			}
+			
+			// Can't just look to see if they're the same; need to mark
+			// them as the same even if the last letter (E|W|I) is different.
+			String aid = ((PropertyLine) a).getMessagePrefix();
+			String bid = ((PropertyLine) b).getMessagePrefix();
+			if((aid == null) && (bid == null)) {
+				return 0;
+			}
+			else if(aid == null) {
+				return -1;
+			}
+			else if(bid == null) {
+				return 1;
+			}
+				
+			aid = aid.toUpperCase().trim();
+			bid = bid.toUpperCase().trim();
+
+			if((aid.equals("")) && (bid.equals(""))) { //$NON-NLS-1$  //$NON-NLS-2$
+				return 0;
+			}
+			else if(aid.equals("")) { //$NON-NLS-1$
+				return -1;
+			}
+			else if(bid.equals("")) { //$NON-NLS-1$
+				return 1;
+			}
+
+			return ((PropertyLine)a).getShortMessagePrefix().toUpperCase().compareTo(((PropertyLine)b).getShortMessagePrefix().toUpperCase());
+		}
+	}
+	
+	/**
+	 * This comparator sorts PropertyLine by their message id.
+	 */
+	private class MessageIdComparator implements java.util.Comparator {
+		public int compare(Object a, Object b) {
+			if((a == null) && (b == null)) {
+				return 0;
+			}
+			else if(a == null) {
+				return -1;
+			}
+			else if(b == null) {
+				return 1;
+			}
+			
+			String aMessageId = null;
+			String bMessageId = null;
+			if(a instanceof PropertyLine) {
+				aMessageId = ((PropertyLine)a).getMessageId();
+			}
+			else {
+				aMessageId = (String)a;
+			}
+			
+			if(b instanceof PropertyLine) {
+				bMessageId = ((PropertyLine)b).getMessageId();
+			}
+			else {
+				bMessageId = (String)b;
+			}
+				
+			
+			if((aMessageId == null) && (bMessageId == null)) {
+				return 0;
+			}
+			else if(aMessageId == null) {
+				return -1;
+			}
+			else if(bMessageId == null) {
+				return 1;
+			}
+			else {
+				return aMessageId.compareTo(bMessageId);
+			}
+		}
+	}
+	
+	/**
+	 * Sort the PropertyLine by the length of characters in the message text;
+	 * if you want to substitute characters for the message parameters, 
+	 * set the length field.
+	 */
+	static class StringLengthComparator implements java.util.Comparator {
+		public static int length = 0;
+		
+		public int compare(Object a, Object b) {
+			// return a negative number if object a is less than object b
+			// return a zero if the objects are equal
+			// return a positive number if object a is greater than object b
+			if((a == null) && (b == null)) {
+				return 0;
+			}
+			else if(a == null) {
+				return -1;
+			}
+			else if(b == null) {
+				return 1;
+			}
+			
+			int aLength = ((PropertyLine)a).getExpectedLength(length);
+			int bLength = ((PropertyLine)b).getExpectedLength(length);
+				
+			return (aLength - bLength);
+		}
+	}
+	
+	/**
+	 * Alphabetize the message text of the PropertyLine.
+	 */
+	private class ValueComparator implements java.util.Comparator {
+		public int compare(Object a, Object b) {
+			if((a == null) && (b == null)) {
+				return 0;
+			}
+			else if(a == null) {
+				return -1;
+			}
+			else if(b == null) {
+				return 1;
+			}
+			
+			String aMessage = ((PropertyLine)a).getMessage();
+			String bMessage = ((PropertyLine)b).getMessage();
+			if((aMessage == null) && (bMessage == null)) {
+				return 0;
+			}
+			else if(aMessage == null) {
+				return -1;
+			}
+			else if(bMessage == null) {
+				return 1;
+			}
+				
+			return aMessage.compareTo(bMessage);
+		}
+	}
+	
+	/**
+	 * Sort by line number of the PropertyLine, with the smallest line
+	 * number first in the list.
+	 */
+	private class LineNoComparator implements java.util.Comparator {
+		public int compare(Object a, Object b) {
+			// return a negative number if object a is less than object b
+			// return a zero if the objects are equal
+			// return a positive number if object a is greater than object b
+			if((a == null) && (b == null)) {
+				return 0;
+			}
+			else if(a == null) {
+				return -1;
+			}
+			else if(b == null) {
+				return 1;
+			}
+			
+			int aLineNo = ((PropertyLine)a).getLineNumber();
+			int bLineNo = ((PropertyLine)b).getLineNumber();
+			if((aLineNo < 0) && (bLineNo < 0)) {
+				return 0;
+			}
+			else if(aLineNo < 0) {
+				return -1;
+			}
+			else if(bLineNo < 0) {
+				return 1;
+			}
+			
+			return (aLineNo - bLineNo);
+		}
+	}
+
+	public static Comparator getMessagePrefixComparator() {
+		return _messagePrefixComparator;
+	}
+
+	public static Comparator getMessageIdComparator() {
+		return _messageIdComparator;
+	}
+
+	public static Comparator getStringLengthComparator(int length) {
+		StringLengthComparator.length = length;
+		return _stringLengthComparator;
+	}
+
+	public static Comparator getValueComparator() {
+		return _valueComparator;
+	}
+	
+	public static Comparator getLineNoComparator() {
+		return _lineNoComparator;
+	}
+}
+
diff --git a/tests/org.eclipse.jst.validation.sample/propertiesValidator/org/eclipse/jst/validation/sample/parser/ResourceHandler.java b/tests/org.eclipse.jst.validation.sample/propertiesValidator/org/eclipse/jst/validation/sample/parser/ResourceHandler.java
new file mode 100644
index 0000000..4dd7b55
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.sample/propertiesValidator/org/eclipse/jst/validation/sample/parser/ResourceHandler.java
@@ -0,0 +1,90 @@
+package org.eclipse.jst.validation.sample.parser;
+/*
+ * Licensed Material - Property of IBM 
+ * (C) Copyright IBM Corp. 2002, 2003 - All Rights Reserved. 
+ * US Government Users Restricted Rights - Use, duplication or disclosure 
+ * restricted by GSA ADP Schedule Contract with IBM Corp. 
+ *
+ * DISCLAIMER OF WARRANTIES.
+ * The following [enclosed] code is sample code created by IBM
+ * Corporation. This sample code is not part of any standard or IBM
+ * product and is provided to you solely for the purpose of assisting
+ * you in the development of your applications.  The code is provided
+ * "AS IS". IBM MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT
+ * NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE, REGARDING THE FUNCTION OR PERFORMANCE OF
+ * THIS CODE.  THIS CODE MAY CONTAIN ERRORS.  IBM shall not be liable
+ * for any damages arising out of your use of the sample code, even
+ * if it has been advised of the possibility of such damages.
+ * 
+ */
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+/**
+ * This class retrieves the Strings from the .properties file appropriate
+ * for the machine's Locale.
+ */
+public final class ResourceHandler {
+	private static ResourceBundle _bundle = null;
+	
+	private ResourceHandler() {
+		super();
+	}
+	
+	/**
+	 * Return the resource bundle which contains the messages
+	 * in the resource identified by bundleName.
+	 */
+	private static ResourceBundle getBundle(String bundleName) {
+		if (_bundle == null) {
+			try {
+				_bundle = ResourceBundle.getBundle(bundleName);
+			}
+			catch (MissingResourceException exc) {
+				_bundle = null;
+				exc.printStackTrace();
+			}
+		}
+		return _bundle;
+	}
+
+	/**
+	 * Given the name of the bundle and the message id (key) into the
+	 * bundle, return the message text identified by the id.
+	 */	
+	public static String getExternalizedMessage(String bundleName, String key) {
+		try {
+			ResourceBundle bundle = getBundle(bundleName);
+			if (bundle == null) {
+				return key;
+			}
+
+			return bundle.getString(key);
+		}
+		catch (NullPointerException exc) {
+			exc.printStackTrace();
+		}
+		return key;
+	}
+	
+	/**
+	 * Given the name of the bundle, the message id (key) into the
+	 * bundle, and parameters to be substituted into the java.text.MessageFormat's
+	 * patterns, return the message with the parameters substituted in.
+	 */	
+	public static String getExternalizedMessage(String bundleName, String key, String[] parms) {
+		String res = ""; //$NON-NLS-1$
+		try {
+			res = java.text.MessageFormat.format(getExternalizedMessage(bundleName, key), parms);
+		}
+		catch (MissingResourceException exc) {
+			exc.printStackTrace();
+		}
+		catch (NullPointerException exc) {
+			exc.printStackTrace();
+		}
+		return res;
+	}
+}
diff --git a/tests/org.eclipse.jst.validation.sample/propertiesValidator/propertiesValidator.properties b/tests/org.eclipse.jst.validation.sample/propertiesValidator/propertiesValidator.properties
new file mode 100644
index 0000000..43a5bde
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.sample/propertiesValidator/propertiesValidator.properties
@@ -0,0 +1,41 @@
+#
+# Licensed Material - Property of IBM 
+# (C) Copyright IBM Corp. 2002, 2003 - All Rights Reserved. 
+# US Government Users Restricted Rights - Use, duplication or disclosure 
+# restricted by GSA ADP Schedule Contract with IBM Corp. 
+#
+#  DISCLAIMER OF WARRANTIES.
+#  The following [enclosed] code is sample code created by IBM
+#  Corporation. This sample code is not part of any standard or IBM
+#  product and is provided to you solely for the purpose of assisting
+#  you in the development of your applications.  The code is provided
+#  "AS IS". IBM MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT
+#  NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+#  FOR A PARTICULAR PURPOSE, REGARDING THE FUNCTION OR PERFORMANCE OF
+#  THIS CODE.  THIS CODE MAY CONTAIN ERRORS.  IBM shall not be liable
+#  for any damages arising out of your use of the sample code, even
+#  if it has been advised of the possibility of such damages.
+#
+
+ABCD0000 = ABCD0000E: Match the braces in the message. There are {0} '{' and {1} '}'. MessageFormat will throw a NullPointerException when there are mismatching braces.
+ABCD0010E = ABCD0010E: Change argument ('{'{0}'}') to an integer between 0 and 9 inclusive in the message. MessageFormat cannot process an integer parameter that is less than 0.
+ABCD0010W = ABCD0010W: Change argument ('{'{0}'}') to an integer between 0 and 9 inclusive in the message. MessageFormat ignores any parameters larger than 9.
+ABCD0020 = ABCD0020I: Remove redundant parameter '{'{0}'}' from the message. Make messages succinct.
+ABCD0030 = ABCD0030I: Check that argument '{'{0}'}' was omitted from the message deliberately. If it was omitted accidentally, and the code does not provide enough parameters, MessageFormat will throw a NullPointerException.
+ABCD0040 = ABCD0040I: Use two apostrophes in the message at column {0}. MessageFormat removes single apostrophes; for the message to display an apostrophe, two apostrophes must exist in the string. (An apostrophe is a reserved character of MessageFormat.)
+ABCD0050 = ABCD0050I: Use one apostrophe in the message at column {0}. MessageFormat processes only messages with parameters; without MessageFormat, the extra apostrophe will not be removed.
+
+ABCD0060 = ABCD0060W: Make {0} unique. When an id is used more than once in a file, ResourceBundle will use the value of the last message id.
+ABCD0070 = ABCD0070W: {0} may need to be unique. Conventionally, a message prefix applies to only one error condition.
+
+ABCD0080 = ABCD0080E: Fix the syntax error; each line must form MESSAGE_ID = MESSAGE.
+ABCD0090 = ABCD0090W: Check the read permissions of file {0}. The PropertiesValidator either cannot read or cannot find the file.
+
+ABCD0110 = ABCD0110I: Add a terminating apostrophe at column {0}. The '{' and '}' characters must be enclosed in apostrophes.
+
+ABCD0120 = ABCD0120I: Terminate message prefix {0} with a '':''. The IBM standard requires that message prefixes end with a colon.
+ABCD0130 = ABCD0130I: Remove the whitespace between {0} and the '':''. The IBM standard requires an absence of whitespace between the alphanumeric characters and the colon.
+
+# Outside WSAD, append the line number and file name to the end of the message.
+LINE_LOC = Line {0}, file {1}.
+
diff --git a/tests/org.eclipse.jst.validation.sample/test/test.properties b/tests/org.eclipse.jst.validation.sample/test/test.properties
new file mode 100644
index 0000000..90bc982
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.sample/test/test.properties
@@ -0,0 +1,67 @@
+#
+# Licensed Material - Property of IBM 
+# (C) Copyright IBM Corp. 2002, 2003 - All Rights Reserved. 
+# US Government Users Restricted Rights - Use, duplication or disclosure 
+# restricted by GSA ADP Schedule Contract with IBM Corp. 
+#
+#  DISCLAIMER OF WARRANTIES.
+#  The following [enclosed] code is sample code created by IBM
+#  Corporation. This sample code is not part of any standard or IBM
+#  product and is provided to you solely for the purpose of assisting
+#  you in the development of your applications.  The code is provided
+#  "AS IS". IBM MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT
+#  NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+#  FOR A PARTICULAR PURPOSE, REGARDING THE FUNCTION OR PERFORMANCE OF
+#  THIS CODE.  THIS CODE MAY CONTAIN ERRORS.  IBM shall not be liable
+#  for any damages arising out of your use of the sample code, even
+#  if it has been advised of the possibility of such damages.
+#
+
+# This file is used to test the Properties Validator.
+#
+
+MISMATCHED_BRACES = This line has '{0}' mismatching braces.
+MISMATCHED_BRACES_2 = This line has { a mismatching brace.
+MISMATCHED_BRACES_3 = This line has } a mismatching brace.
+MISMATCHED_BRACES_OKAY = This line has no '{' mismatching braces '}'.
+MISMATCHED_BRACES_OKAY2 = This line also has no mismatching braces {0} '{' '}'.
+
+TOO_MANY_ARGUMENTS = MessageFormat formats only 10 parameters {0} {1} {2} {3} {4} {5} {6} {7} {8} {9} {10}.
+TOO_MANY_ARGUMENTS_2 = MessageFormat formats only 10 parameters {10}.
+
+NEGATIVE_ARGUMENT = This line uses a negative {-1} argument.
+B = okay
+REDUNDANT_ARGUMENT = This line uses a redundant {0} {0} argument.
+MISSED_PARM = This line uses {0} and {2} but not (1).
+NEEDS_DOUBLE_APOS = This line uses a single apostrophe (') but should use two {0}.
+NEEDS_SINGLE_APOS = This line uses a double apostrophe ('') but should use one.
+A = okay
+SYM
+DUPLICATE_ID = This line uses a duplicate message id.
+DUPLICATE_ID = This line also uses a duplicate message id.
+DUPLICATE_PREFIX = AAAA0000W: This line uses a duplicate message prefix.
+= jjj
+
+DUPLICATE_PREFIX2 = AAAA0000W: This line also uses a duplicate message prefix.
+Z_DUPLICATE = jjj
+Z_DUPLICATE = mmm
+
+# This is a comment
+Z_DUPLICATE = nnn
+C = okay
+F = a \
+b \
+c
+D = okay
+
+CASE1 = ABCD0000E: Blah Blah Blah
+CASE2 = ABCD0000E  Blah Blah Blah
+CASE3 = ABCD0000E : Blah Blah Blah
+CASE4 = ABCD0000E  Blah:Blah Blah
+CASE5 = ABCD0000E :
+CASE6 = Blah Blah Blah (i.e., no prefix)
+CASE7 = ABCD0000E: Blah
+CASE8 = ABCD0000E  Blah
+CASE9 = ABCD0000E : Blah
+CASE10 = ABCD0000E Blah
+CASE11 = ABCD0000E
diff --git a/tests/org.eclipse.jst.validation.sample/test/test2.properties b/tests/org.eclipse.jst.validation.sample/test/test2.properties
new file mode 100644
index 0000000..fdc0f32
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.sample/test/test2.properties
@@ -0,0 +1,24 @@
+#
+# Licensed Material - Property of IBM 
+# (C) Copyright IBM Corp. 2002, 2003 - All Rights Reserved. 
+# US Government Users Restricted Rights - Use, duplication or disclosure 
+# restricted by GSA ADP Schedule Contract with IBM Corp. 
+#
+#  DISCLAIMER OF WARRANTIES.
+#  The following [enclosed] code is sample code created by IBM
+#  Corporation. This sample code is not part of any standard or IBM
+#  product and is provided to you solely for the purpose of assisting
+#  you in the development of your applications.  The code is provided
+#  "AS IS". IBM MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT
+#  NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+#  FOR A PARTICULAR PURPOSE, REGARDING THE FUNCTION OR PERFORMANCE OF
+#  THIS CODE.  THIS CODE MAY CONTAIN ERRORS.  IBM shall not be liable
+#  for any damages arising out of your use of the sample code, even
+#  if it has been advised of the possibility of such damages.
+#
+
+#
+# This file is used to test the Properties Validator.
+#
+
+ID1 = This file has no errors in it.
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.validation.sample/tvtplugin.xml b/tests/org.eclipse.jst.validation.sample/tvtplugin.xml
new file mode 100644
index 0000000..a5250a3
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.sample/tvtplugin.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plugin
+   id="com.ibm.etools.validation.prop"
+   name="Properties Validator"
+   version="5.1.0"
+   class="com.ibm.etools.validation.properties.workbenchimpl.PropertiesValidatorPlugin">
+
+	<!--=================================================================-->
+	<!-- When testing TVT in EJBDeploy, because org.eclipse.help isn't   -->
+	<!-- packaged with EJBDeploy, this plugin is deactivated. However,   -->
+	<!-- because the TVT plugin doesn't ship the documentation, all      -->
+	<!-- references to the help can be removed.                          -->
+	<!--=================================================================-->
+	
+   <runtime>
+      <library name="runtime/propertiesValidator.jar">
+         <export name="*"/>
+      </library>
+      <library name="runtime/propertiesValFS.jar">
+         <export name="*"/>
+      </library>
+      <library name="runtime/propertiesValWB.jar">
+         <export name="*"/>
+      </library>
+      <library name="runtime/filesystemFWK.jar">
+         <export name="*"/>
+      </library>
+   </runtime>
+   
+    <requires>
+       <import plugin="org.eclipse.core.runtime" version="2.1" match="equivalent"/>
+       <import plugin="org.eclipse.core.resources" version="2.1" match="equivalent"/>
+       <import plugin="org.eclipse.jdt.core" version="2.1" match="equivalent"/>
+       <import plugin="com.ibm.etools.validation" export="true" version="5.1" match="equivalent"/>
+       <import plugin="com.ibm.etools.logging.util" version="5.1" match="equivalent"/>
+    </requires>
+
+    <!--=======================================-->
+    <!-- Properties Validator Contributions    -->
+    <!--=======================================-->
+    <extension
+       id="PropertiesValidator"
+       name="Properties Validator"
+       point="com.ibm.etools.validation.validator">
+       <validator>
+           <projectNature id="org.eclipse.jdt.core.javanature"/>
+           <filter objectClass="org.eclipse.core.resources.IFile" nameFilter="*.properties" action="add, change"/>
+           <run class="com.ibm.etools.validation.properties.PropertiesValidator" enabled="false" async="true"/>
+           <helper class="com.ibm.etools.validation.properties.workbenchimpl.PropertiesHelper"/>
+       </validator>
+    </extension>
+</plugin>
diff --git a/tests/org.eclipse.jst.validation.test/.classpath b/tests/org.eclipse.jst.validation.test/.classpath
new file mode 100644
index 0000000..7c27a9c
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/.classpath
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="jUnitWrapper/"/>
+	<classpathentry kind="src" path="test/"/>
+	<classpathentry kind="src" path="testFwk/"/>
+	<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="output" path="bin"/>
+</classpath>
diff --git a/tests/org.eclipse.jst.validation.test/.cvsignore b/tests/org.eclipse.jst.validation.test/.cvsignore
new file mode 100644
index 0000000..0684c5d
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/.cvsignore
@@ -0,0 +1,4 @@
+bin
+build.xml
+temp.folder
+validationtest.jar
diff --git a/tests/org.eclipse.jst.validation.test/.project b/tests/org.eclipse.jst.validation.test/.project
new file mode 100644
index 0000000..fca5c40
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.jst.validation.test</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.jdt.core.javanature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+	</natures>
+</projectDescription>
diff --git a/tests/org.eclipse.jst.validation.test/.settings/org.eclipse.jdt.core.prefs b/tests/org.eclipse.jst.validation.test/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..8c71ba3
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,62 @@
+#Fri Feb 15 05:43:08 EST 2008
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=_
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=_
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=error
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
diff --git a/tests/org.eclipse.jst.validation.test/.settings/org.eclipse.jdt.ui.prefs b/tests/org.eclipse.jst.validation.test/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..0dd6b9c
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,6 @@
+#Fri Feb 15 05:43:08 EST 2008
+eclipse.preferences.version=1
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
diff --git a/tests/org.eclipse.jst.validation.test/META-INF/MANIFEST.MF b/tests/org.eclipse.jst.validation.test/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..03ff4b7
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/META-INF/MANIFEST.MF
@@ -0,0 +1,31 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name.0
+Bundle-SymbolicName: org.eclipse.jst.validation.test;singleton:=true
+Bundle-Version: 1.1.100.qualifier
+Bundle-Localization: plugin
+Bundle-Activator: org.eclipse.jst.validation.test.BVTValidationPlugin
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.core.resources,
+ org.eclipse.wst.validation,
+ org.junit,
+ org.eclipse.jst.validation.sample,
+ org.eclipse.jem.util,
+ org.eclipse.wst.common.frameworks,
+ org.eclipse.jem,
+ org.eclipse.emf.ecore,
+ org.eclipse.jdt.core,
+ org.eclipse.jem.workbench,
+ org.eclipse.jst.j2ee
+Bundle-ActivationPolicy: lazy
+Bundle-Vendor: %Bundle-Vendor.0
+Export-Package: org.eclipse.jst.validation.api.test,
+ org.eclipse.jst.validation.test,
+ org.eclipse.jst.validation.test.fwk,
+ org.eclipse.jst.validation.test.fwk.validator,
+ org.eclipse.jst.validation.test.internal.registry,
+ org.eclipse.jst.validation.test.internal.util,
+ org.eclipse.jst.validation.test.junit,
+ org.eclipse.jst.validation.test.setup
+Bundle-ClassPath: validationtest.jar
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/docs/org.eclipse.wst.web.ui.infopop/about.html b/tests/org.eclipse.jst.validation.test/about.html
similarity index 100%
copy from docs/org.eclipse.wst.web.ui.infopop/about.html
copy to tests/org.eclipse.jst.validation.test/about.html
diff --git a/tests/org.eclipse.jst.validation.test/build.properties b/tests/org.eclipse.jst.validation.test/build.properties
new file mode 100644
index 0000000..42b026b
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/build.properties
@@ -0,0 +1,17 @@
+source.validationtest.jar = jUnitWrapper/,\
+                            test/,\
+                            testFwk/,\
+                            validators/
+bin.includes = plugin.xml,\
+               testInput/,\
+               validationtest.jar,\
+               about.html,\
+               META-INF/,\
+               test.xml,\
+               plugin.properties
+output.validationtest.jar = bin/
+jars.compile.order = validationtest.jar
+source.validationtest.jar = jUnitWrapper/,\
+                            test/,\
+                            testFwk/
+              
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.validation.test/build/buildcontrol.properties b/tests/org.eclipse.jst.validation.test/build/buildcontrol.properties
new file mode 100644
index 0000000..94147de
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/build/buildcontrol.properties
@@ -0,0 +1,6 @@
+CONTACT=ruthdaly@ca.ibm.com
+ComponentShortName=ValTest
+ComponentFullName=Validation BVT Plugin
+ComponentCompetency=BVT
+JavaCompile.1=srcjar
+BuildVerification.1=dir
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.validation.test/build/package.xml b/tests/org.eclipse.jst.validation.test/build/package.xml
new file mode 100644
index 0000000..a590d8b
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/build/package.xml
@@ -0,0 +1,20 @@
+<project name="com.ibm.etools.validation.test" default="packagingPlugin" basedir="./..">
+    <target name="init">
+        <property name="packageDir" value=""/>
+        <property name="plugin.directory"  value="${basedir}"/>
+        <property name="plugin.id" value="com.ibm.etools.validation.test"/>
+        <property name="plugin.version"  value=""/>
+    </target>
+    <target name="packagingPlugin" depends="init">
+        <echo message="${plugin.id}"/>
+        <copy todir="${packageDir}/plugins/${plugin.id}_${plugin.version}">
+            <fileset dir="${plugin.directory}">
+                <include name="plugin.xml"/>
+                <include name="testvalidation.bat"/>
+                <include name="testvalidation.sh"/>
+                <include name="runtime/test.jar"/>
+                <include name="runtime/jUnitWrapper.jar"/>
+            </fileset>
+        </copy>
+    </target>
+</project>
diff --git a/tests/org.eclipse.jst.validation.test/build/sourcejar.txt b/tests/org.eclipse.jst.validation.test/build/sourcejar.txt
new file mode 100644
index 0000000..69bd473
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/build/sourcejar.txt
@@ -0,0 +1,6 @@
+test
+jUnitWrapper
+
+
+
+
diff --git a/tests/org.eclipse.jst.validation.test/build/wsBuild.xml b/tests/org.eclipse.jst.validation.test/build/wsBuild.xml
new file mode 100644
index 0000000..dedb95a
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/build/wsBuild.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<!DOCTYPE project [
+	<!ENTITY baseBuild SYSTEM "file:../../wsBuildDef.xml">
+]>
+
+<project name="buildPlugin" default="build" basedir="./..">
+
+<!-- include the common xml build file -->
+&baseBuild;
+
+<!-- customize the jar creation here for multi-jar builds -->
+<target name="build" depends="prepare" if="plugin.id">
+    <antcall target="buildjar">
+        <param name="jarname" value="test"/>
+        <param name="jarclasspath" value="${plugin.classpath}"/>
+    </antcall>
+
+    <antcall target="buildjar">
+        <param name="jarname" value="jUnitWrapper"/>
+        <param name="jarclasspath" value="${plugin.classpath};${plugin.directory}/${plugin.library.directory}/test.jar"/>
+    </antcall>
+
+</target>
+
+</project>
diff --git a/tests/org.eclipse.jst.validation.test/jUnitWrapper/org/eclipse/jst/validation/test/junit/AutomatedValidationBVT.java b/tests/org.eclipse.jst.validation.test/jUnitWrapper/org/eclipse/jst/validation/test/junit/AutomatedValidationBVT.java
new file mode 100644
index 0000000..c9548cc
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/jUnitWrapper/org/eclipse/jst/validation/test/junit/AutomatedValidationBVT.java
@@ -0,0 +1,64 @@
+/*
+ * Created on Feb 9, 2005
+ *
+ * TODO To change the template for this generated file go to
+ * Window - Preferences - Java - Code Style - Code Templates
+ */
+package org.eclipse.jst.validation.test.junit;
+
+
+import java.io.File;
+import java.net.URL;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+import junit.textui.TestRunner;
+
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.jst.validation.api.test.ApiTestsSuite;
+import org.eclipse.jst.validation.test.BVTValidationPlugin;
+
+
+/**
+ * @author jsholl
+ * @author jialin
+ *
+ */
+public class AutomatedValidationBVT extends TestSuite {
+
+    public static String baseDirectory = null;
+    
+    static {
+        try {
+        	URL url = BVTValidationPlugin.getPlugin().getBundle().getEntry("/");
+        	AutomatedValidationBVT.baseDirectory = FileLocator.toFileURL(url).getFile() + "validationResources" + File.separatorChar;
+		} catch (Exception e) { 
+			System.err.println("Using working directory since a workspace URL could not be located.");
+		} 
+    }
+
+    public static int unimplementedMethods;
+
+    public static void main(String[] args) {
+        unimplementedMethods = 0;
+        TestRunner.run(suite());
+        if (unimplementedMethods > 0) {
+            System.out.println("\nCalls to warnUnimpl: " + unimplementedMethods);
+        }
+    }
+
+    public AutomatedValidationBVT() {
+        super();
+        TestSuite suite = (TestSuite) AutomatedValidationBVT.suite();
+        for (int i = 0; i < suite.testCount(); i++) {
+            addTest(suite.testAt(i));
+        }
+    }
+
+    public static Test suite() {
+        TestSuite suite = new TestSuite("Test for org.eclipse.jst.validation.test");
+        //suite.addTest(BVTSuite.suite());
+		suite.addTest(ApiTestsSuite.suite());
+        return suite;
+    }
+}
diff --git a/tests/org.eclipse.jst.validation.test/jUnitWrapper/org/eclipse/jst/validation/test/junit/BVTSuite.java b/tests/org.eclipse.jst.validation.test/jUnitWrapper/org/eclipse/jst/validation/test/junit/BVTSuite.java
new file mode 100644
index 0000000..e373455
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/jUnitWrapper/org/eclipse/jst/validation/test/junit/BVTSuite.java
@@ -0,0 +1,81 @@
+package org.eclipse.jst.validation.test.junit;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jst.validation.test.internal.registry.OperationTestcase;
+import org.eclipse.jst.validation.test.internal.registry.ValidatorTestcase;
+import org.eclipse.jst.validation.test.internal.util.BVTValidationUtility;
+import org.eclipse.wst.validation.internal.ValidatorMetaData;
+
+/**
+ * Wraps the existing validation bvt code in a JUnit artifact
+ * so that the tests can be run within JUnit. Instances of this
+ * class wrap all of the ValidatorSuite instances that must be run.
+ */
+public class BVTSuite extends TestSuite {
+	private Map _validatorSuites = null;
+	
+	public BVTSuite() {
+		_validatorSuites = new HashMap();
+		loadValidatorSuites();
+		loadOperationSuites();
+	}
+	
+	private void loadValidatorSuites() {
+		IProgressMonitor monitor = new NullProgressMonitor();
+		
+		ValidatorTestcase[] tmds = BVTValidationUtility.getValidatorTests(monitor);
+		for(int i=0; i<tmds.length; i++) {
+			ValidatorTestcase tmd = tmds[i];
+
+			if(tmd.isVisible()) {
+				ValidatorMetaData vmd = tmd.getValidatorMetaData();
+				ValidatorSuite vs = (ValidatorSuite)_validatorSuites.get(vmd);
+				if(vs == null) {
+					vs = new ValidatorSuite(vmd);
+				}
+				ValidatorTest vt = new ValidatorTest(tmd, vs);
+				vs.addTest(vt);
+				_validatorSuites.put(vmd, vs);
+			}
+		}
+		
+		Iterator iterator = _validatorSuites.values().iterator();
+		while(iterator.hasNext()) {
+			ValidatorSuite vs = (ValidatorSuite)iterator.next();
+			addTest(vs);
+		}
+	}
+	
+	private void loadOperationSuites() {
+		IProgressMonitor monitor = new NullProgressMonitor();
+		
+		OperationTestcase[] tmds = BVTValidationUtility.getOperationTests(monitor);
+		OperationSuite os = new OperationSuite();
+		for(int i=0; i<tmds.length; i++) {
+			OperationTestcase tmd = tmds[i];
+
+			if(tmd.isVisible()) {
+				OperationTest ot = new OperationTest(tmd, os);
+				os.addTest(ot);
+			}
+		}
+		
+		addTest(os);
+	}
+
+	public static Test suite() {
+		return new BVTSuite();
+	}
+
+	public String toString() {
+		return "Validation BVT Suite"; //$NON-NLS-1$
+	}
+}
diff --git a/tests/org.eclipse.jst.validation.test/jUnitWrapper/org/eclipse/jst/validation/test/junit/BuildInfo.java b/tests/org.eclipse.jst.validation.test/jUnitWrapper/org/eclipse/jst/validation/test/junit/BuildInfo.java
new file mode 100644
index 0000000..aef06d1
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/jUnitWrapper/org/eclipse/jst/validation/test/junit/BuildInfo.java
@@ -0,0 +1,7 @@
+package org.eclipse.jst.validation.test.junit;
+public class BuildInfo {
+  public static final String copyright = "Licensed Materials -- Property of IBM\n(c) Copyright International Business Machines Corporation, 2001,2003\nUS Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp.";
+  public static final String fgBuildLevel = "20031112_1915-WB212-AD-V511D-W5";
+  public static String level() { return fgBuildLevel; }
+  public static String getWSABuildLevel() { return fgBuildLevel; }
+}
diff --git a/tests/org.eclipse.jst.validation.test/jUnitWrapper/org/eclipse/jst/validation/test/junit/JUnitBuffer.java b/tests/org.eclipse.jst.validation.test/jUnitWrapper/org/eclipse/jst/validation/test/junit/JUnitBuffer.java
new file mode 100644
index 0000000..ae9fe60
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/jUnitWrapper/org/eclipse/jst/validation/test/junit/JUnitBuffer.java
@@ -0,0 +1,123 @@
+/*
+ * Created on Apr 16, 2003
+ *
+ * To change this generated comment go to 
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+package org.eclipse.jst.validation.test.junit;
+
+import java.io.File;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jst.validation.test.BVTValidationPlugin;
+import org.eclipse.jst.validation.test.BufferedTaskStatus;
+import org.eclipse.jst.validation.test.setup.IBuffer;
+
+
+/**
+ * When the tests are run as part of JUnit, redirect the output
+ * to the JUnit test case.
+ */
+public class JUnitBuffer implements IBuffer {
+	private String _logFileName = null;
+	private BufferedTaskStatus _status = null;
+	
+	JUnitBuffer(String logFileName) {
+		_status = new BufferedTaskStatus(getLogFileName(logFileName), new NullProgressMonitor());
+	}
+	
+	public void setProgressMonitor(IProgressMonitor monitor) {
+		_status.setProgressMonitor(monitor);
+	}
+	
+	private String getLogFileName(String logFileName) {
+		if(_logFileName == null) {
+			logFileName = logFileName.replace(' ', '_');
+			IPath stateLocation = BVTValidationPlugin.getPlugin().getStateLocation();
+			File log = new File(stateLocation.toOSString(), logFileName); //$NON-NLS-1$
+			_logFileName = log.getAbsolutePath();
+		}
+		return _logFileName;
+	}
+	
+	public String getLogFileName() {
+		return _status.getLogFileName();
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jst.validation.test.setup.ITestStatus#clear()
+	 */
+	public void clear() {
+		_status.clear();
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jst.validation.test.setup.IBuffer#delineate(java.lang.String)
+	 */
+	public void delineate(String taskName) {
+		_status.delineate(taskName);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jst.validation.test.setup.IBuffer#getProgressMonitor()
+	 */
+	public IProgressMonitor getProgressMonitor() {
+		return _status.getProgressMonitor();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jst.validation.test.setup.IBuffer#report()
+	 */
+	public void report() {
+		_status.report();
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jst.validation.test.setup.IBuffer#write(java.lang.String)
+	 */
+	public void write(String message) {
+		_status.write(message);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jst.validation.test.setup.ITestStatus#addElapsedTime(java.lang.String, long)
+	 */
+	public void addElapsedTime(String taskName, long elapsedTime) {
+		_status.addElapsedTime(taskName, elapsedTime);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jst.validation.test.setup.ITestStatus#addExecutionStatus(java.lang.String, int, org.eclipse.jst.validation.test.setup.IBuffer, java.lang.String)
+	 */
+	public void addExecutionStatus(String testcaseName, String subTaskName, int passOrFail, IBuffer buffer, String message) {
+		_status.addExecutionStatus(testcaseName, subTaskName, passOrFail, buffer, message);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jst.validation.test.setup.ITestStatus#addGlobalExecutionStatus(java.lang.String, int)
+	 */
+	public void addExecutionStatus(String testPassName, boolean pass) {
+		_status.addExecutionStatus(testPassName, pass);
+	}
+
+	public void addExecutionStatus(String testPassName, String subTaskName, boolean pass) {
+		_status.addExecutionStatus(testPassName, subTaskName, pass);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jst.validation.test.setup.ITestStatus#isSuccessful()
+	 */
+	public boolean isSuccessful() {
+		return _status.isSuccessful();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jst.validation.test.setup.ITestStatus#isSuccessful()
+	 */
+	public boolean isSuccessful(String testName) {
+		return _status.isSuccessful(testName);
+	}
+
+}
diff --git a/tests/org.eclipse.jst.validation.test/jUnitWrapper/org/eclipse/jst/validation/test/junit/OperationSuite.java b/tests/org.eclipse.jst.validation.test/jUnitWrapper/org/eclipse/jst/validation/test/junit/OperationSuite.java
new file mode 100644
index 0000000..cff7d0b
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/jUnitWrapper/org/eclipse/jst/validation/test/junit/OperationSuite.java
@@ -0,0 +1,35 @@
+package org.eclipse.jst.validation.test.junit;
+
+import junit.framework.TestResult;
+import junit.framework.TestSuite;
+
+/**
+ * Instances of this class wrap all of the operations, in plugin.xml,
+ * for the validation framework.
+ */
+public class OperationSuite extends TestSuite {
+	private JUnitBuffer _buffer = null;
+
+	public OperationSuite() {
+	}
+	
+	public String toString() {
+		return "Validation Framework Tests"; //$NON-NLS-1$
+	}
+
+	public JUnitBuffer getBuffer() {
+		if(_buffer == null) {
+			_buffer = new JUnitBuffer(toString() + System.currentTimeMillis() + ".log"); //$NON-NLS-1$ //$NON-NLS-2$
+		}
+		return _buffer;
+	}
+
+	/* (non-Javadoc)
+	 * @see junit.framework.Test#run(junit.framework.TestResult)
+	 */
+	public void run(TestResult result) {
+		super.run(result);
+		getBuffer().report(); // report only after all of the tests in this suite have finished
+		getBuffer().clear();
+	}
+}
diff --git a/tests/org.eclipse.jst.validation.test/jUnitWrapper/org/eclipse/jst/validation/test/junit/OperationTest.java b/tests/org.eclipse.jst.validation.test/jUnitWrapper/org/eclipse/jst/validation/test/junit/OperationTest.java
new file mode 100644
index 0000000..6c0b76b
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/jUnitWrapper/org/eclipse/jst/validation/test/junit/OperationTest.java
@@ -0,0 +1,60 @@
+package org.eclipse.jst.validation.test.junit;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jst.validation.test.internal.registry.OperationTestcase;
+import org.eclipse.jst.validation.test.internal.registry.TestcaseUtility;
+import org.eclipse.jst.validation.test.internal.util.BVTRunner;
+
+
+/**
+ * Instances of this class run an IWorkspaceRunnable that tests the
+ * validation framework.
+ */
+public class OperationTest extends TestCase {
+	private OperationSuite _suite = null;
+	private OperationTestcase _tmd = null;
+
+	public OperationTest(OperationTestcase tmd, OperationSuite suite) {
+		super(tmd.getName()); // the method named "test" runs the test.
+		_tmd = tmd;
+		_suite = suite;
+	}
+	
+	public JUnitBuffer getBuffer() {
+		return _suite.getBuffer();
+	}
+	
+	public String toString() {
+		return _tmd.getName();
+	}
+	
+	/* (non-Javadoc)
+	 * @see junit.framework.TestCase#runTest()
+	 */
+	protected void runTest() throws Throwable {
+		try {
+			IProject project = TestcaseUtility.findProject(_tmd);
+			if((project == null) || !project.exists()) {
+				// File needs to be imported (i.e., set up the test).
+				if(!BVTRunner.singleton().setupTests(getBuffer(), _tmd, false)) {
+					fail("Could not import input from directory " + TestcaseUtility.getInputDir(_tmd)); //$NON-NLS-1$
+				}
+			}
+			
+			if(!project.isAccessible()) {
+				fail("Project " + project.getName() + " is not accessible."); //$NON-NLS-1$ //$NON-NLS-2$
+			}
+			
+			_tmd.run(getBuffer(), project);
+			if(!getBuffer().isSuccessful(_tmd.getName())) {
+				fail(_tmd.getName() + " failed. Read the log for details. " + getBuffer().getLogFileName()); //$NON-NLS-1$
+			}
+		}
+		finally {
+			// Whether this test case fails or not, send its results to the log.
+			getBuffer().delineate(_tmd.getName());
+		}
+	}
+}
diff --git a/tests/org.eclipse.jst.validation.test/jUnitWrapper/org/eclipse/jst/validation/test/junit/ValidatorSuite.java b/tests/org.eclipse.jst.validation.test/jUnitWrapper/org/eclipse/jst/validation/test/junit/ValidatorSuite.java
new file mode 100644
index 0000000..b6fea36
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/jUnitWrapper/org/eclipse/jst/validation/test/junit/ValidatorSuite.java
@@ -0,0 +1,40 @@
+package org.eclipse.jst.validation.test.junit;
+
+import junit.framework.TestResult;
+import junit.framework.TestSuite;
+
+import org.eclipse.wst.validation.internal.ValidatorMetaData;
+
+/**
+ * Instances of this class wrap all of the <test> instances,
+ * contributed in plugin.xml, for one validator.
+ */
+public class ValidatorSuite extends TestSuite {
+	private ValidatorMetaData _vmd = null;
+	private JUnitBuffer _buffer = null;
+
+	public ValidatorSuite(ValidatorMetaData vmd) {
+		_vmd = vmd;
+	}
+	
+	public String toString() {
+		return _vmd.getValidatorDisplayName();
+	}
+	
+	public JUnitBuffer getBuffer() {
+		if(_buffer == null) {
+			_buffer = new JUnitBuffer(toString() + System.currentTimeMillis() + ".log"); //$NON-NLS-1$ //$NON-NLS-2$
+		}
+		return _buffer;
+	}
+
+	/* (non-Javadoc)
+	 * @see junit.framework.Test#run(junit.framework.TestResult)
+	 */
+	public void run(TestResult result) {
+		super.run(result);
+		getBuffer().report(); // report only after all of the tests in this suite have finished
+		getBuffer().clear();
+	}
+}
+
diff --git a/tests/org.eclipse.jst.validation.test/jUnitWrapper/org/eclipse/jst/validation/test/junit/ValidatorTest.java b/tests/org.eclipse.jst.validation.test/jUnitWrapper/org/eclipse/jst/validation/test/junit/ValidatorTest.java
new file mode 100644
index 0000000..3abd0fb
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/jUnitWrapper/org/eclipse/jst/validation/test/junit/ValidatorTest.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.validation.test.junit;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jst.validation.test.internal.registry.TestcaseUtility;
+import org.eclipse.jst.validation.test.internal.registry.ValidatorTestcase;
+import org.eclipse.jst.validation.test.internal.util.BVTRunner;
+import org.eclipse.wst.validation.internal.operations.ValidatorManager;
+
+
+/**
+ * Instances of this class represent one <test>, contributed in
+ * plugin.xml, for one validator.
+ */
+public class ValidatorTest extends TestCase {
+	private ValidatorTestcase _tmd = null;
+	private ValidatorSuite _suite = null;
+
+	public ValidatorTest(ValidatorTestcase tmd, ValidatorSuite suite) {
+		super(tmd.getName()); // the method named "test" runs the test.
+		_tmd = tmd;
+		_suite = suite;
+	}
+	
+	public JUnitBuffer getBuffer() {
+		return _suite.getBuffer();
+	}
+	
+	public String toString() {
+		return _tmd.getProjectName();
+	}
+
+	/* (non-Javadoc)
+	 * @see junit.framework.TestCase#runTest()
+	 */
+	protected void runTest() throws Throwable {
+		try {
+			IProject project = TestcaseUtility.findProject(_tmd);
+			if((project == null) || !project.exists()) {
+				// File needs to be imported (i.e., set up the test).
+				if(!BVTRunner.singleton().setupTests(getBuffer(), _tmd, false)) {
+					fail("Could not import input from directory " + TestcaseUtility.getInputDir(_tmd)); //$NON-NLS-1$
+				}
+			}
+
+			if(!project.isAccessible()) {
+				fail("Project " + project.getName() + " is not accessible."); //$NON-NLS-1$ //$NON-NLS-2$
+			}
+			
+			_tmd.run(getBuffer(), project);
+			if(!getBuffer().isSuccessful(_tmd.getName())) {
+				fail(_tmd.getName() + " failed. Read the log for details. " + getBuffer().getLogFileName()); //$NON-NLS-1$
+			}
+			ValidatorManager vm = ValidatorManager.getManager();
+			ValidatorManager.addProjectBuildValidationSupport(project);
+			vm.enableValidator("ClasspathDependencyValidator");
+			vm.disableValidator("EarValidator");
+			vm.enableValidator("WarValidator", project, true, false);
+			vm.disableValidator("EJBValidator", project, true, true);
+		}
+		finally {
+			// Whether this test case fails or not, send its results to the log.
+			getBuffer().delineate(_tmd.getName());
+		}
+	}
+}
diff --git a/tests/org.eclipse.jst.validation.test/plugin.properties b/tests/org.eclipse.jst.validation.test/plugin.properties
new file mode 100644
index 0000000..d647a6f
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/plugin.properties
@@ -0,0 +1,3 @@
+Bundle-Name.0 = Testcases for Validation Framework
+Bundle-Vendor.0 = Eclipse Web Tools Platform
+
diff --git a/tests/org.eclipse.jst.validation.test/plugin.xml b/tests/org.eclipse.jst.validation.test/plugin.xml
new file mode 100644
index 0000000..5442c08
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/plugin.xml
@@ -0,0 +1,422 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+
+<!--============================-->
+<!-- Validation Contributions   -->
+<!--============================-->
+<!-- Validation extension points -->
+   <extension-point id="test" name="validator test"/>
+   <extension-point id="testSetup" name="testSetup"/>
+   <extension-point id="opTest" name="operation test"/>
+
+<!-- ====================================================== -->
+<!--           JUnit BVT Test Suite                         -->
+<!-- ====================================================== -->
+   <extension
+         point="org.eclipse.wst.common.tests.collector.suites">
+      <suite
+            name="Validation BVT Suite"
+            class="org.eclipse.jst.validation.test.junit.BVTSuite">
+      </suite>
+   </extension>
+<!-- batch BVT -->
+  <!-- <extension
+         id="bvt_batch"
+         point="org.eclipse.core.runtime.applications">
+      <application>
+         <run
+               class="org.eclipse.jst.validation.test.BVTValidationBatch">
+         </run>
+      </application>
+   </extension> -->
+   
+<!--========================================-->
+<!-- Builder (used only for BVT test input) -->
+<!--========================================-->
+   <extension
+         id="bvtbuilder"
+         name="Validation BVT Test Builder"
+         point="org.eclipse.core.resources.builders">
+      <builder>
+         <run
+               class="org.eclipse.jst.validation.test.fwk.TestOpConstrBuilder">
+         </run>
+      </builder>
+   </extension>
+<!--=============================================================-->
+<!--                   FWK Test Validators                       -->
+<!--                                                             -->
+<!-- These validators must not be enabled by default or some     -->
+<!-- other BVT test cases (e.g. j2ee) will fail because          -->
+<!-- messages will exist in the task list.                       -->
+<!--=============================================================-->
+<!-- 
+       The FWKTestValidator supports full validation, and manual 
+       incremental build validation, but not automatic incremental 
+       build validation. 
+    -->
+   <extension
+         id="FwkTestValidator"
+         name="VF Test Validator"
+         point="org.eclipse.wst.validation.validator">
+      <validator>
+         <projectNature
+               id="org.eclipse.jdt.core.javanature">
+         </projectNature>
+         <filter
+               objectClass="org.eclipse.core.resources.IFile"
+               nameFilter="*.java">
+         </filter>
+         <helper
+               class="org.eclipse.jst.validation.test.fwk.validator.FwkTestHelper">
+         </helper>
+         <run
+               enabled="false"
+               class="org.eclipse.jst.validation.test.fwk.validator.FwkTestValidator"
+               incremental="false">
+         </run>
+      </validator>
+   </extension>
+<!-- 
+       The FWKNoBuildTestValidator supports full validation, and does not
+       support any build validation. 
+    -->
+   <extension
+         id="FwkNoBuildTestValidator"
+         name="VF NoBuild Test Validator"
+         point="org.eclipse.wst.validation.validator">
+      <validator>
+         <projectNature
+               id="org.eclipse.jdt.core.javanature">
+         </projectNature>
+         <filter
+               objectClass="org.eclipse.core.resources.IFile"
+               nameFilter="*.java">
+         </filter>
+         <helper
+               class="org.eclipse.jst.validation.test.fwk.validator.FwkNoBuildTestHelper">
+         </helper>
+         <run
+               fullBuild="false"
+               enabled="false"
+               class="org.eclipse.jst.validation.test.fwk.validator.FwkNoBuildTestValidator"
+               incremental="false">
+         </run>
+      </validator>
+   </extension>
+<!--=====================================-->
+<!-- Fwk Test Validator BVT test setup   -->
+<!--=====================================-->
+   <extension
+         id="FwkTestValidatorBVT_testSetup"
+         name="Fwk Test Validator BVT TestSetup"
+         point="org.eclipse.jst.validation.test.testSetup">
+      <import
+            input="FWK/BVT/opConstr.jar"
+            operation="org.eclipse.jst.validation.test.setup.JARImportOperation">
+      </import>
+   </extension>
+<!--=============================================================-->
+<!--               Visible Framework BVT tests                   -->
+<!--=============================================================-->
+   <extension
+         id="TestOpConstructors"
+         name="Test Operation Constructors"
+         point="org.eclipse.jst.validation.test.opTest">
+      <optest
+            input="FWK/BVT/opConstr.jar"
+            operation="org.eclipse.jst.validation.test.fwk.TestOpConstrOperation"
+            project="opConstr"
+            visible="false">
+      </optest>
+   </extension>
+   <!--<extension
+         id="VALFWK02"
+         name="VALFWK02"
+         point="org.eclipse.jst.validation.test.opTest">
+      <optest
+            input="FWK/BVT/opConstr.jar"
+            operation="org.eclipse.jst.validation.test.fwk.VALFWK02Operation"
+            project="opConstr"
+            visible="false">
+      </optest>
+   </extension>-->
+<!--=============================================================-->
+<!--               Fwk Test Validator BVT tests                  -->
+<!-- None of these tests are visible on the Test Collector menu  -->
+<!-- Instead, these are used as part of the VALFWK02 and         -->
+<!-- TestOpConstr tests.                                         -->
+<!--=============================================================-->
+   <extension
+         id="FwkTestValidatorBVT"
+         name="Fwk Test Validator BVT Tests"
+         point="org.eclipse.jst.validation.test.test">
+      <test
+            input="FWK/BVT/opConstr.jar"
+            validator="org.eclipse.jst.validation.test.fwk.validator.FwkTestValidator"
+            project="opConstr"
+            visible="false">
+         <message
+               location="1"
+               prefix=""
+               resource="ITest.java"
+               text="This is a test message for the validation framework, reported by VF Test Validator. Please ignore.">
+         </message>
+         <message
+               location="1"
+               prefix=""
+               resource="Test1.java"
+               text="This is a test message for the validation framework, reported by VF Test Validator. Please ignore.">
+         </message>
+         <message
+               location="1"
+               prefix=""
+               resource="test2/ITest2.java"
+               text="This is a test message for the validation framework, reported by VF Test Validator. Please ignore.">
+         </message>
+         <message
+               location="1"
+               prefix=""
+               resource="test2/Test2.java"
+               text="This is a test message for the validation framework, reported by VF Test Validator. Please ignore.">
+         </message>
+      </test>
+   </extension>
+   <extension
+         id="FwkNoBuildTestValidatorBVT"
+         name="Fwk NoBuild Test Validator BVT Tests"
+         point="org.eclipse.jst.validation.test.test">
+      <test
+            input="FWK/BVT/opConstr.jar"
+            validator="org.eclipse.jst.validation.test.fwk.validator.FwkNoBuildTestValidator"
+            project="opConstr"
+            visible="false">
+         <message
+               location="1"
+               prefix=""
+               resource="ITest.java"
+               text="This is a test message for the validation framework, reported by VF NoBuild Test Validator. Please ignore.">
+         </message>
+         <message
+               location="1"
+               prefix=""
+               resource="Test1.java"
+               text="This is a test message for the validation framework, reported by VF NoBuild Test Validator. Please ignore.">
+         </message>
+         <message
+               location="1"
+               prefix=""
+               resource="test2/ITest2.java"
+               text="This is a test message for the validation framework, reported by VF NoBuild Test Validator. Please ignore.">
+         </message>
+         <message
+               location="1"
+               prefix=""
+               resource="test2/Test2.java"
+               text="This is a test message for the validation framework, reported by VF NoBuild Test Validator. Please ignore.">
+         </message>
+      </test>
+   </extension>
+   <extension
+         id="PropertiesValidatorBVT"
+         name="Properties Validator BVT Tests"
+         point="org.eclipse.jst.validation.test.test">
+      <test
+            input="FWK/BVT/opConstr.jar"
+            validator="org.eclipse.jst.validation.sample.PropertiesValidator"
+            project="opConstr"
+            visible="false">
+         <message
+               location="3"
+               prefix="ABCD0000"
+               resource="resources/test.properties"
+               text="ABCD0000E: Match the braces in the message. There are 0 { and 1 }. MessageFormat will throw a NullPointerException when there are mismatching braces.">
+         </message>
+         <message
+               location="2"
+               prefix="ABCD0000"
+               resource="resources/test.properties"
+               text="ABCD0000E: Match the braces in the message. There are 1 { and 0 }. MessageFormat will throw a NullPointerException when there are mismatching braces.">
+         </message>
+         <message
+               location="1"
+               prefix="ABCD0000"
+               resource="resources/test.properties"
+               text="ABCD0000E: Match the braces in the message. There are 0 { and 1 }. MessageFormat will throw a NullPointerException when there are mismatching braces.">
+         </message>
+         <message
+               location="10"
+               prefix="ABCD0010"
+               resource="resources/test.properties"
+               text="ABCD0010E: Change argument ({-1}) to an integer between 0 and 9 inclusive in the message. MessageFormat cannot process an integer parameter that is less than 0.">
+         </message>
+         <message
+               location="8"
+               prefix="ABCD0010"
+               resource="resources/test.properties"
+               text="ABCD0010W: Change argument ({10}) to an integer between 0 and 9 inclusive in the message. MessageFormat ignores any parameters larger than 9.">
+         </message>
+         <message
+               location="7"
+               prefix="ABCD0010"
+               resource="resources/test.properties"
+               text="ABCD0010W: Change argument ({10}) to an integer between 0 and 9 inclusive in the message. MessageFormat ignores any parameters larger than 9.">
+         </message>
+         <message
+               location="12"
+               prefix="ABCD0020"
+               resource="resources/test.properties"
+               text="ABCD0020I: Remove redundant parameter {0} from the message. Make messages succinct.">
+         </message>
+         <message
+               location="13"
+               prefix="ABCD0030"
+               resource="resources/test.properties"
+               text="ABCD0030I: Check that argument {1} was omitted from the message deliberately. If it was omitted accidentally, and the code does not provide enough parameters, MessageFormat will throw a NullPointerException.">
+         </message>
+         <message
+               location="8"
+               prefix="ABCD0030"
+               resource="resources/test.properties"
+               text="ABCD0030I: Check that argument {0} was omitted from the message deliberately. If it was omitted accidentally, and the code does not provide enough parameters, MessageFormat will throw a NullPointerException.">
+         </message>
+         <message
+               location="14"
+               prefix="ABCD0040"
+               resource="resources/test.properties"
+               text="ABCD0040I: Use two apostrophes in the message at column 57. MessageFormat removes single apostrophes; for the message to display an apostrophe, two apostrophes must exist in the string. (An apostrophe is a reserved character of MessageFormat.)">
+         </message>
+         <message
+               location="15"
+               prefix="ABCD0050"
+               resource="resources/test.properties"
+               text="ABCD0050I: Use one apostrophe in the message at column 57. MessageFormat processes only messages with parameters; without MessageFormat, the extra apostrophe will not be removed.">
+         </message>
+         <message
+               location="25"
+               prefix="ABCD0060"
+               resource="resources/test.properties"
+               text="ABCD0060W: Make Z_DUPLICATE unique. When an id is used more than once in a file, ResourceBundle will use the value of the last message id.">
+         </message>
+         <message
+               location="24"
+               prefix="ABCD0060"
+               resource="resources/test.properties"
+               text="ABCD0060W: Make Z_DUPLICATE unique. When an id is used more than once in a file, ResourceBundle will use the value of the last message id.">
+         </message>
+         <message
+               location="19"
+               prefix="ABCD0060"
+               resource="resources/test.properties"
+               text="ABCD0060W: Make DUPLICATE_ID unique. When an id is used more than once in a file, ResourceBundle will use the value of the last message id.">
+         </message>
+         <message
+               location="18"
+               prefix="ABCD0060"
+               resource="resources/test.properties"
+               text="ABCD0060W: Make DUPLICATE_ID unique. When an id is used more than once in a file, ResourceBundle will use the value of the last message id.">
+         </message>
+         <message
+               location="28"
+               prefix="ABCD0060"
+               resource="resources/test.properties"
+               text="ABCD0060W: Make Z_DUPLICATE unique. When an id is used more than once in a file, ResourceBundle will use the value of the last message id.">
+         </message>
+         <message
+               location="43"
+               prefix="ABCD0070"
+               resource="resources/test.properties"
+               text="ABCD0070W: ABCD0000E may need to be unique. Conventionally, a message prefix applies to only one error condition.">
+         </message>
+         <message
+               location="42"
+               prefix="ABCD0070"
+               resource="resources/test.properties"
+               text="ABCD0070W: ABCD0000E may need to be unique. Conventionally, a message prefix applies to only one error condition.">
+         </message>
+         <message
+               location="41"
+               prefix="ABCD0070"
+               resource="resources/test.properties"
+               text="ABCD0070W: ABCD0000E may need to be unique. Conventionally, a message prefix applies to only one error condition.">
+         </message>
+         <message
+               location="39"
+               prefix="ABCD0070"
+               resource="resources/test.properties"
+               text="ABCD0070W: ABCD0000E may need to be unique. Conventionally, a message prefix applies to only one error condition.">
+         </message>
+         <message
+               location="38"
+               prefix="ABCD0070"
+               resource="resources/test.properties"
+               text="ABCD0070W: ABCD0000E may need to be unique. Conventionally, a message prefix applies to only one error condition.">
+         </message>
+         <message
+               location="37"
+               prefix="ABCD0070"
+               resource="resources/test.properties"
+               text="ABCD0070W: ABCD0000E may need to be unique. Conventionally, a message prefix applies to only one error condition.">
+         </message>
+         <message
+               location="36"
+               prefix="ABCD0070"
+               resource="resources/test.properties"
+               text="ABCD0070W: ABCD0000E may need to be unique. Conventionally, a message prefix applies to only one error condition.">
+         </message>
+         <message
+               location="45"
+               prefix="ABCD0070"
+               resource="resources/test.properties"
+               text="ABCD0070W: ABCD0000E may need to be unique. Conventionally, a message prefix applies to only one error condition.">
+         </message>
+         <message
+               location="44"
+               prefix="ABCD0070"
+               resource="resources/test.properties"
+               text="ABCD0070W: ABCD0000E may need to be unique. Conventionally, a message prefix applies to only one error condition.">
+         </message>
+         <message
+               location="35"
+               prefix="ABCD0070"
+               resource="resources/test.properties"
+               text="ABCD0070W: ABCD0000E may need to be unique. Conventionally, a message prefix applies to only one error condition.">
+         </message>
+         <message
+               location="23"
+               prefix="ABCD0070"
+               resource="resources/test.properties"
+               text="ABCD0070W: AAAA0000W may need to be unique. Conventionally, a message prefix applies to only one error condition.">
+         </message>
+         <message
+               location="20"
+               prefix="ABCD0070"
+               resource="resources/test.properties"
+               text="ABCD0070W: AAAA0000W may need to be unique. Conventionally, a message prefix applies to only one error condition.">
+         </message>
+         <message
+               location="21"
+               prefix="ABCD0080"
+               resource="resources/test.properties"
+               text="ABCD0080E: Fix the syntax error; each line must form MESSAGE_ID = MESSAGE.">
+         </message>
+         <message
+               location="17"
+               prefix="ABCD0080"
+               resource="resources/test.properties"
+               text="ABCD0080E: Fix the syntax error; each line must form MESSAGE_ID = MESSAGE.">
+         </message>
+         <message
+               location="1"
+               prefix="ABCD0110"
+               resource="resources/test.properties"
+               text="ABCD0110I: Add a terminating apostrophe at column 36. The { and } characters must be enclosed in apostrophes.">
+         </message>
+      </test>
+   </extension>
+   
+   
+   
+   
+</plugin>
diff --git a/tests/org.eclipse.jst.validation.test/pom.xml b/tests/org.eclipse.jst.validation.test/pom.xml
new file mode 100644
index 0000000..92827c5
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/pom.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Copyright (c) 2012, 2013 Eclipse Foundation and others.
+  All rights reserved. This program and the accompanying materials
+  are made available under the terms of the Eclipse Distribution License v1.0
+  which accompanies this distribution, and is available at
+  http://www.eclipse.org/org/documents/edl-v10.php
+ 
+  Contributors:
+    Thanh Ha (Eclipse Foundation) - initial implementation
+-->
+
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.eclipse.webtools.javaee</groupId>
+    <artifactId>javaee.tests</artifactId>
+    <version>3.6.0-SNAPSHOT</version>
+  </parent>
+
+  <groupId>org.eclipse.webtools.javaee</groupId>
+  <artifactId>org.eclipse.jst.validation.test</artifactId>
+  <version>1.1.100-SNAPSHOT</version>
+  <packaging>eclipse-plugin</packaging>
+</project>
diff --git a/tests/org.eclipse.jst.validation.test/test.xml b/tests/org.eclipse.jst.validation.test/test.xml
new file mode 100644
index 0000000..8c2ba8c
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/test.xml
@@ -0,0 +1,65 @@
+<?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}\.."/> -->
+
+  <!--==============================================================-->
+  <!-- Set the environment properties.                              -->
+  <!--==============================================================-->
+  <property name="plugin-name" value="org.eclipse.jst.validation.test"/>
+  <property name="library-file"
+            value="${eclipse-home}/plugins/org.eclipse.test_3.2.0/library.xml"/>
+  <property name="extraVMargs" value="-Xmx700M"/>
+
+  <!--===============================================================-->
+  <!-- This target initializes all of the tests that will 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.*.xml"/>
+      </delete>
+  </target>
+
+  <!--==============================================================-->
+  <!-- This target defines the tests that need to run.              -->
+  <!--==============================================================-->
+  <target name="suite">
+	<property name="workspace" value="${eclipse-home}/jst_folder"/>
+	<delete dir="${workspace}" quiet="true"/>
+	<ant target="ui-test" antfile="${library-file}" dir="${eclipse-home}">
+      	<property name="data-dir" value="${workspace}"/>
+      	<property name="plugin-name" value="${plugin-name}"/>
+      	<property name="classname" value="org.eclipse.jst.validation.test.junit.AutomatedValidationBVT"/>
+   	  	<property name="plugin-path" value="${eclipse-home}/plugins/${plugin-name}"/>
+   	  	<property name="extraVMargs" value="${extraVMargs}"/>
+	</ant>
+  </target>
+
+  <!--==================================================================-->
+  <!-- This target holds code to cleanup the testing environment 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.*.xml"/>
+      <property name="output-file" value="${plugin-name}.xml"/>
+    </ant>
+  </target>
+
+</project>
+
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/api/test/ApiTestsSuite.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/api/test/ApiTestsSuite.java
new file mode 100644
index 0000000..95067e0
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/api/test/ApiTestsSuite.java
@@ -0,0 +1,17 @@
+package org.eclipse.jst.validation.api.test;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+public class ApiTestsSuite extends TestSuite {
+	
+	 public static Test suite(){
+	        return new ApiTestsSuite();
+	    }
+
+	public ApiTestsSuite() {
+		super();
+		addTest(ValidationRegistryApiTest.suite());
+	}
+
+}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/api/test/ValidationRegistryApiTest.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/api/test/ValidationRegistryApiTest.java
new file mode 100644
index 0000000..ee197f9
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/api/test/ValidationRegistryApiTest.java
@@ -0,0 +1,35 @@
+package org.eclipse.jst.validation.api.test;
+
+import junit.framework.Assert;
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.eclipse.wst.validation.internal.provisional.ValidationFactory;
+import org.eclipse.wst.validation.internal.provisional.core.IValidator;
+
+public class ValidationRegistryApiTest extends TestCase {
+	
+	public static Test suite() {
+		return new TestSuite(ValidationRegistryApiTest.class);
+	} 
+
+	public ValidationRegistryApiTest() {
+		super();
+	}
+
+	public ValidationRegistryApiTest(String name) {
+		super(name);
+	}
+	
+	public void test_getValidator() {
+	try {
+		ValidationFactory valFactory = ValidationFactory.instance;
+		IValidator validator = valFactory.getValidator("org.eclipse.jst.j2ee.internal.ejb.workbench.validation.UIEjbValidator");
+		Assert.assertNotNull(validator);
+	 } catch (Exception e) {
+		e.printStackTrace();
+	  }
+	}
+
+}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/BVTValidationBatch.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/BVTValidationBatch.java
new file mode 100644
index 0000000..56d2207
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/BVTValidationBatch.java
@@ -0,0 +1,107 @@
+package org.eclipse.jst.validation.test;
+
+import java.util.logging.Level;
+
+import org.eclipse.core.resources.IWorkspaceRunnable;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPlatformRunnable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jem.util.logger.proxy.Logger;
+import org.eclipse.jst.validation.test.internal.util.BVTRunner;
+import org.eclipse.jst.validation.test.internal.util.BVTValidationUtility;
+/**
+ */
+public class BVTValidationBatch implements IPlatformRunnable {
+	private String _dir = null; // The test cases (.ear, .jar) are identified through a relative directory, and this is the parent of that relative directory.
+	private boolean _verbose = false;
+	static Boolean _passed = null;
+	
+	boolean isVerbose() {
+		return _verbose;
+	}
+	
+	void setVerbose(boolean v) {
+		_verbose = v;
+	}
+	
+	String getDir() {
+		return _dir;
+	}
+	
+	void setDir(String dir) {
+		_dir = dir;
+	}
+	
+	private void parseUserSettings(Object args) {
+		if(args == null) {
+			// nothing to set
+			return;
+		}
+		
+		if(args instanceof String[]) {
+			String[] userSettings = (String[])args;
+			if(userSettings.length == 0) {
+				return;
+			}
+			
+			for(int i=0; i<userSettings.length; i++) {
+				if(userSettings[i].equals("-dir")) { //$NON-NLS-1$
+					setDir(userSettings[i+1]);
+				}
+				
+				if(userSettings[i].equals("-trace")) { //$NON-NLS-1$
+					setVerbose(true);
+				}
+			}
+
+			// turn on framework validation logging
+			if(isVerbose()) {
+				BVTValidationPlugin.getPlugin().getMsgLogger().setLevel(Level.FINEST);
+			}
+		}
+	}
+
+
+	/**
+	 * Parse the user's settings, import the test cases, and run the test cases.
+	 */
+	public Object run(Object args) throws BVTValidationException {
+		parseUserSettings(args);
+
+		IWorkspaceRunnable runnable = new IWorkspaceRunnable() {
+			public void run(IProgressMonitor monitor) {		
+				try {
+					monitor.subTask("Workspace is located at: " + BVTValidationPlugin.getPlugin().getStateLocation().toOSString()); //$NON-NLS-1$
+			
+					ConsoleBuffer buffer = new ConsoleBuffer();
+					BVTRunner.singleton().setupTests(buffer, isVerbose());
+					
+					int numTests = BVTValidationUtility.numValidatorTests(monitor, ResourcesPlugin.getWorkspace().getRoot().getProjects());
+					int numPassed = BVTRunner.singleton().test(buffer, ResourcesPlugin.getWorkspace().getRoot().getProjects());
+					_passed = ((numPassed == numTests) ? Boolean.TRUE : Boolean.FALSE);
+				}
+				catch(BVTValidationException exc) {
+					Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+					if(logger.isLoggingLevel(Level.SEVERE)) {
+						logger.write(Level.SEVERE, exc.getMessage());
+						logger.write(Level.SEVERE, exc);
+						if(exc.getTargetException() != null) {
+							logger.write(Level.SEVERE, exc.getTargetException());
+						}
+					}
+				}
+			}
+		};
+		
+		try {
+			ConsoleProgressMonitor monitor = new ConsoleProgressMonitor();
+			ResourcesPlugin.getWorkspace().run(runnable, monitor);
+		}
+		catch(CoreException exc) {
+			throw new BVTValidationException(exc);
+		}
+		return _passed;
+	}
+	
+}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/BVTValidationException.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/BVTValidationException.java
new file mode 100644
index 0000000..ed809d9
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/BVTValidationException.java
@@ -0,0 +1,26 @@
+package org.eclipse.jst.validation.test;
+
+public class BVTValidationException extends Exception {
+	private Throwable _target = null;
+	
+	public BVTValidationException(Throwable t) {
+		setTargetException(t);
+	}
+	
+	public BVTValidationException(String s) {
+		super(s);
+	}
+	
+	public BVTValidationException(String s, Throwable target) {
+		super(s);
+		setTargetException(target);
+	}
+	
+	public Throwable getTargetException() {
+		return _target;
+	}
+	
+	public void setTargetException(Throwable target) {
+		_target = target;
+	}
+}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/BVTValidationPlugin.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/BVTValidationPlugin.java
new file mode 100644
index 0000000..57d22e7
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/BVTValidationPlugin.java
@@ -0,0 +1,104 @@
+package org.eclipse.jst.validation.test;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+import java.util.logging.Level;
+
+import org.eclipse.core.runtime.Plugin;
+import org.eclipse.jem.util.logger.proxy.Logger;
+import org.eclipse.jem.util.logger.proxyrender.DefaultPluginTraceRenderer;
+import org.osgi.framework.BundleContext;
+
+
+/**
+ * Plugin for TVT testing.
+ */
+public class BVTValidationPlugin extends Plugin {
+	private static BVTValidationPlugin inst = null;
+	public static final String PLUGIN_ID = "org.eclipse.jst.validation.test"; //$NON-NLS-1$
+	private ResourceBundle resourceBundle;
+	protected static Logger logger = null;
+
+	/**
+	 * ValidationTVTPlugin constructor comment.
+	 * @param descriptor org.eclipse.core.runtime.IPluginDescriptor
+	 */
+	public BVTValidationPlugin() {
+		super();
+		inst = this;
+	}
+	
+	public static BVTValidationPlugin getPlugin() {
+		return inst;
+	}
+	
+	public String getPluginID() {
+	    return PLUGIN_ID;
+	}
+	
+	public Logger getMsgLogger() {
+		if (logger == null) {
+			logger = Logger.getLogger(getPluginID());
+			setRenderer(logger);
+		}
+		return logger;
+	}
+	
+	/**
+	 * @param aLogger
+	 */
+	protected void setRenderer(Logger aLogger) {
+		new DefaultPluginTraceRenderer(aLogger);
+	}
+	
+	/**
+	 * Returns the string from the plugin's resource bundle,
+	 * or 'key' if not found.
+	 */
+	public static String getResourceString(String key) {
+		ResourceBundle bundle= getPlugin().getResourceBundle();
+		try {
+			return (bundle!=null ? bundle.getString(key) : key);
+		} catch (MissingResourceException e) {
+			return key;
+		}
+	}
+	
+	/**
+	 * Returns the plugin's resource bundle,
+	 */
+	public ResourceBundle getResourceBundle() {
+		try {
+			if (resourceBundle == null)
+				resourceBundle = ResourceBundle.getBundle("org.eclipse.jst.validation.test.BVTValidationPluginResource");
+		} catch (MissingResourceException x) {
+			resourceBundle = null;
+		}
+		return resourceBundle;
+	}
+	
+	/**
+	 * This method is called upon plug-in activation
+	 */
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+	}
+
+	/**
+	 * This method is called when the plug-in is stopped
+	 */
+	public void stop(BundleContext context) throws Exception {
+		super.stop(context);
+		inst = null;
+		resourceBundle = null;
+	}
+
+	public void handleException(Throwable e) {
+		getMsgLogger().log(e);		
+	}
+
+	public void log(Level severe, String msg) {
+		// TODO Auto-generated method stub
+		
+	}
+}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/BufferedTaskStatus.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/BufferedTaskStatus.java
new file mode 100644
index 0000000..3254686
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/BufferedTaskStatus.java
@@ -0,0 +1,155 @@
+package org.eclipse.jst.validation.test;
+
+import java.util.Iterator;
+import java.util.Map;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jst.validation.test.internal.registry.TestcaseUtility;
+import org.eclipse.jst.validation.test.setup.IBuffer;
+
+
+public class BufferedTaskStatus extends TaskStatus implements IBuffer {
+	public static final String NEWLINE = System.getProperty("line.separator"); //$NON-NLS-1$
+	private IProgressMonitor _monitor = null;
+	private StringBuffer _buffer = null;
+	private String _logFileName = null;
+	
+	public BufferedTaskStatus() {
+	}
+	
+	public BufferedTaskStatus(String logFileName) {
+		this(logFileName, null);
+	}
+	
+	public BufferedTaskStatus(String logFileName, IProgressMonitor monitor) {
+		_buffer = new StringBuffer();
+		setProgressMonitor(monitor);
+		setLogFileName(logFileName);
+	}
+	
+	public void clear() {
+		super.clear();
+		_buffer = null;
+		_buffer = new StringBuffer();
+		_monitor.done();
+		_monitor = null;
+	}
+
+	public String getLogFileName() {
+		return _logFileName;
+	}
+	
+	public void setLogFileName(String name) {
+		_logFileName = name;
+	}
+	
+	public StringBuffer getBuffer() {
+		return _buffer;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jst.validation.test.setup.IBuffer#getProgressMonitor()
+	 */
+	public IProgressMonitor getProgressMonitor() {
+		if(_monitor == null) {
+			_monitor = new NullProgressMonitor();
+		}
+		return _monitor;
+	}
+	
+	public void setProgressMonitor(IProgressMonitor m) {
+		_monitor = m;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jst.validation.test.setup.IBuffer#report()
+	 */
+	public void report() {
+		_buffer.append(NEWLINE);
+		_buffer.append(">>>>>>>>>>>>>>>>TEST SUITE RESULTS>>>>>>>>>>>>>>>>"); //$NON-NLS-1$
+		_buffer.append(NEWLINE);
+		_buffer.append(NEWLINE);
+
+		if(getElapsedTime().size() > 0) {
+			Iterator iterator = getElapsedTime().keySet().iterator();
+			long total = 0;
+			_buffer.append(">>>>>>>>>>>>>>>>ELAPSED TIME>>>>>>>>>>>>>>>>"); //$NON-NLS-1$
+			_buffer.append(NEWLINE);
+			while(iterator.hasNext()) {
+				String taskName = (String)iterator.next();
+				Long elapsedTime = (Long)getElapsedTime().get(taskName);
+				total += elapsedTime.longValue();
+				_buffer.append("Total elapsed time of task "); //$NON-NLS-1$
+				_buffer.append(taskName);
+				_buffer.append(" is "); //$NON-NLS-1$
+				_buffer.append(elapsedTime);
+				_buffer.append(NEWLINE);
+			}
+			_buffer.append("Total time of all tasks is " + total + ", which is " + (total/1000/60) + " minutes."); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+			_buffer.append(NEWLINE);
+		}
+
+		int totNumPass = 0;
+		Map taskStatus = getTaskStatus();
+		Iterator iterator = taskStatus.keySet().iterator();
+		_buffer.append(NEWLINE);
+		_buffer.append(">>>>>>>>>>>>>>>>PASS/FAIL SUMMARY>>>>>>>>>>>>>>>>"); //$NON-NLS-1$
+		_buffer.append(NEWLINE);
+		while(iterator.hasNext()) {
+			String taskName = (String)iterator.next();
+			TestStatus ts = (TestStatus)taskStatus.get(taskName);
+			_buffer.append(ts);
+			_buffer.append(NEWLINE);
+			if(ts.isSuccessful()) {
+				totNumPass++;
+			}
+		}
+		
+		_buffer.append(NEWLINE);
+		_buffer.append(NEWLINE);
+		_buffer.append("Total Number Of Tests: "); //$NON-NLS-1$
+		_buffer.append(numTests());
+		_buffer.append(NEWLINE);
+		_buffer.append("Number Passed: "); //$NON-NLS-1$
+		_buffer.append(totNumPass);
+		_buffer.append(NEWLINE);
+		
+		if(getLogFileName() != null) {
+			_buffer.append("This report is stored in the following log file: "); //$NON-NLS-1$
+			_buffer.append(getLogFileName());
+	
+			TestcaseUtility.flush(getLogFileName(), _buffer.toString(), true);
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jst.validation.test.setup.IBuffer#delineate()
+	 */
+	public void delineate(String testcaseName) {
+		TaskStatus. TestStatus ts = getTestStatus(testcaseName);
+		if(ts == null) {
+			// nothing to report
+			return;
+		}
+		StringBuffer errorsBuffer = new StringBuffer();
+		errorsBuffer.append(ts.numFailure());
+		errorsBuffer.append(" errors were reported and "); //$NON-NLS-1$
+		errorsBuffer.append(ts.numWarnings());
+		errorsBuffer.append(" warnings were reported. Read "); //$NON-NLS-1$
+		errorsBuffer.append(getLogFileName());
+		errorsBuffer.append(" for details."); //$NON-NLS-1$
+		write(errorsBuffer.toString());
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jst.validation.test.setup.IBuffer#write(java.lang.String)
+	 */
+	public void write(String message) {
+		// Can't write to the JUnit log. Can only write to the log by failing the
+		// test case with a message; instead, write to the buffer, and send this
+		// information to a log in the validation.test plugin's state location.
+		_buffer.append(message);
+		_buffer.append(NEWLINE);
+	}
+}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/BuildInfo.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/BuildInfo.java
new file mode 100644
index 0000000..532c6ef
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/BuildInfo.java
@@ -0,0 +1,7 @@
+package org.eclipse.jst.validation.test;
+public class BuildInfo {
+  public static final String copyright = "Licensed Materials -- Property of IBM\n(c) Copyright International Business Machines Corporation, 2001,2003\nUS Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp.";
+  public static final String fgBuildLevel = "20031112_1915-WB212-AD-V511D-W5";
+  public static String level() { return fgBuildLevel; }
+  public static String getWSABuildLevel() { return fgBuildLevel; }
+}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/ConsoleBuffer.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/ConsoleBuffer.java
new file mode 100644
index 0000000..8b8bdcb
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/ConsoleBuffer.java
@@ -0,0 +1,103 @@
+package org.eclipse.jst.validation.test;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jst.validation.test.setup.IBuffer;
+
+
+/**
+ * Sends the TestCaseGeneratorOperation output to System.out.
+ */
+public class ConsoleBuffer implements IBuffer {
+	private BufferedTaskStatus _status = null;
+	
+	public ConsoleBuffer() {
+		_status = new BufferedTaskStatus(); // no log file
+	}
+
+	/**
+	 * @see org.eclipse.jst.validation.test.setup.IBuffer#report()
+	 */
+	public void report() {
+		_status.report();
+		System.out.println(_status.getBuffer().toString());
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jst.validation.test.setup.ITestStatus#clear()
+	 */
+	public void clear() {
+		_status.clear();
+	}
+	
+	public String getLogFileName() {
+		return _status.getLogFileName();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jst.validation.test.setup.IBuffer#delineate(java.lang.String)
+	 */
+	public void delineate(String taskName) {
+		_status.delineate(taskName);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jst.validation.test.setup.IBuffer#getProgressMonitor()
+	 */
+	public IProgressMonitor getProgressMonitor() {
+		return _status.getProgressMonitor();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jst.validation.test.setup.IBuffer#write(java.lang.String)
+	 */
+	public void write(String message) {
+		_status.write(message);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jst.validation.test.setup.ITestStatus#addElapsedTime(java.lang.String, long)
+	 */
+	public void addElapsedTime(String taskName, long elapsedTime) {
+		_status.addElapsedTime(taskName, elapsedTime);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jst.validation.test.setup.ITestStatus#addExecutionStatus(java.lang.String, int, org.eclipse.jst.validation.test.setup.IBuffer, java.lang.String)
+	 */
+	public void addExecutionStatus(String testcaseName, String subTaskName, int passOrFail, IBuffer buffer, String message) {
+		_status.addExecutionStatus(testcaseName, subTaskName, passOrFail, buffer, message);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jst.validation.test.setup.ITestStatus#addGlobalExecutionStatus(java.lang.String, int)
+	 */
+	public void addExecutionStatus(String testPassName, boolean pass) {
+		_status.addExecutionStatus(testPassName, pass);
+	}
+
+	public void addExecutionStatus(String testPassName, String subTaskName, boolean pass) {
+		_status.addExecutionStatus(testPassName, subTaskName, pass);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jst.validation.test.setup.ITestStatus#isSuccessful()
+	 */
+	public boolean isSuccessful() {
+		return _status.isSuccessful();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jst.validation.test.setup.ITestStatus#isSuccessful()
+	 */
+	public boolean isSuccessful(String testName) {
+		return _status.isSuccessful(testName);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jst.validation.test.setup.IBuffer#setProgressMonitor(org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	public void setProgressMonitor(IProgressMonitor monitor) {
+		_status.setProgressMonitor(monitor);
+	}
+
+}
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/ConsoleProgressMonitor.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/ConsoleProgressMonitor.java
new file mode 100644
index 0000000..a6d9f6f
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/ConsoleProgressMonitor.java
@@ -0,0 +1,74 @@
+package org.eclipse.jst.validation.test;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+
+/**
+ * This progress monitor directs all task information to std.out.
+ */
+public class ConsoleProgressMonitor implements IProgressMonitor {
+	private int _totalWork = 0;
+	private int _workDoneSoFar = 0;
+	private boolean _cancelRequested = false;
+	
+
+	/**
+	 * @see org.eclipse.core.runtime.IProgressMonitor#beginTask(String, int)
+	 */
+	public void beginTask(String name, int totalWork) {
+		_totalWork = totalWork;
+		report(name);
+	}
+
+	/**
+	 * @see org.eclipse.core.runtime.IProgressMonitor#done()
+	 */
+	public void done() {
+		int workRemaining = _totalWork - _workDoneSoFar;
+		worked(workRemaining);
+	}
+
+	/**
+	 * @see org.eclipse.core.runtime.IProgressMonitor#internalWorked(double)
+	 */
+	public void internalWorked(double work) {
+	}
+
+	/**
+	 * @see org.eclipse.core.runtime.IProgressMonitor#isCanceled()
+	 */
+	public boolean isCanceled() {
+		return _cancelRequested;
+	}
+
+	/**
+	 * @see org.eclipse.core.runtime.IProgressMonitor#setCanceled(boolean)
+	 */
+	public void setCanceled(boolean value) {
+		_cancelRequested = value;
+	}
+
+	/**
+	 * @see org.eclipse.core.runtime.IProgressMonitor#setTaskName(String)
+	 */
+	public void setTaskName(String name) {
+		report(name);
+	}
+
+	/**
+	 * @see org.eclipse.core.runtime.IProgressMonitor#subTask(String)
+	 */
+	public void subTask(String name) {
+		report(name);
+	}
+
+	/**
+	 * @see org.eclipse.core.runtime.IProgressMonitor#worked(int)
+	 */
+	public void worked(int work) {
+		_workDoneSoFar += work;
+	}
+
+	private void report(String message) {
+		System.out.println(message);
+	}
+}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/IOperationRunnable.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/IOperationRunnable.java
new file mode 100644
index 0000000..cd7b66d
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/IOperationRunnable.java
@@ -0,0 +1,15 @@
+package org.eclipse.jst.validation.test;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IWorkspaceRunnable;
+import org.eclipse.jst.validation.test.setup.IBuffer;
+
+
+/**
+ * Instances of this interface are run as part of the Test Collector BVT.
+ */
+public interface IOperationRunnable extends IWorkspaceRunnable {
+	public void setBuffer(IBuffer b);
+	public void setProject(IProject p);
+	public void setName(String testName);
+}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/TaskStatus.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/TaskStatus.java
new file mode 100644
index 0000000..e2989d6
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/TaskStatus.java
@@ -0,0 +1,269 @@
+package org.eclipse.jst.validation.test;
+
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.eclipse.jst.validation.test.setup.IBuffer;
+import org.eclipse.jst.validation.test.setup.ITestStatus;
+
+
+/**
+ * All of the IBuffer instances need to be able to track elapsed time
+ * and execution status. Each buffer can create an internal instance of
+ * this class to perform those tasks.
+ */
+public class TaskStatus implements ITestStatus {
+	private Map _elapsedTime = null;
+	private Map _taskStatus = null;
+
+	public TaskStatus() {
+		_elapsedTime = new HashMap();
+		_taskStatus = new HashMap();
+	}
+	
+	/**
+	 * @see org.eclipse.jst.validation.test.setup.IBuffer#addElapsedTime(String, long)
+	 */
+	public void addElapsedTime(String taskName, long elapsedTime) {
+		Long time = (Long)_elapsedTime.get(taskName);
+		if(time == null) {
+			time = new Long(elapsedTime);
+		}
+		else {
+			time = new Long(time.longValue() + elapsedTime);
+		}
+		_elapsedTime.put(taskName, time);
+	}
+	
+	public void addExecutionStatus(String taskName, boolean pass) {
+		addExecutionStatus(taskName, null, pass);
+	}
+	
+	public void addExecutionStatus(String taskName, String subTaskName, boolean pass) {
+		int success = (pass) ? ITestStatus.PASS : ITestStatus.FAIL;
+		addExecutionStatus(taskName, subTaskName, success, null, null);
+	}
+	
+	public int numTests() {
+		return _taskStatus.size();
+	}
+	
+	protected Map getElapsedTime() {
+		return _elapsedTime;
+	}
+	
+	protected Map getTaskStatus() {
+		return _taskStatus;
+	}
+	
+	public void addExecutionStatus(String testcaseName, String subTaskName, int severity, IBuffer buffer, String message) {
+		TestStatus ts = getTestStatus(testcaseName);
+		if(ts == null) {
+			ts = new TestStatus(testcaseName);
+			_taskStatus.put(testcaseName, ts);
+		}
+		if(subTaskName == null) {
+			ts.addExecutionStatus(severity);
+		}
+		else {
+			ts.addExecutionStatus(subTaskName, severity);
+		}
+
+		if(message != null) {
+			buffer.write(message);
+		}
+	}
+	
+	protected TestStatus getTestStatus(String testcaseName) {
+		return (TestStatus)_taskStatus.get(testcaseName);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jst.validation.test.setup.ITestStatus#isSuccessful()
+	 */
+	public boolean isSuccessful() {
+		if(_taskStatus.size() == 0) {
+			return true;
+		}
+		
+		Iterator iterator = _taskStatus.keySet().iterator();
+		while(iterator.hasNext()) {
+			String tsName = (String)iterator.next();
+			TestStatus ts = (TestStatus)_taskStatus.get(tsName);
+			if(ts == null || !ts.isSuccessful()) {
+				return false;
+			}
+		}
+		
+		return true;
+	}
+	
+	public boolean isSuccessful(String testName) {
+		if(_taskStatus.size() == 0) {
+			return true;
+		}
+		
+		TestStatus ts = (TestStatus)_taskStatus.get(testName);
+		if(ts == null || !ts.isSuccessful()) {
+			return false;
+		}
+		
+		return true;
+	}
+
+	public void clear() {
+		_taskStatus.clear();
+		_elapsedTime.clear();
+	}
+	
+	protected class TestCount {
+		public int numRan = 0;
+		public int numWarn = 0; // Number of warning messages reported for a test case.
+		public int numFail = 0; // Number of failure messages reported for a test case.
+		public int numPass = 0; // Number of test cases that passed.
+	}
+
+	/**
+	 * Instances of this class track the number of test runs and the 
+	 * number of test cases that pass.
+	 */
+	protected class TestStatus implements Comparator {
+		private String _testcaseName = null;
+		private Map _testStatus = null;
+		
+		/**
+		 * Name must not be null.
+		 */
+		public TestStatus(String name) {
+			_testcaseName = name;
+			_testStatus = new HashMap();
+		}
+		
+		public void addExecutionStatus(String subTaskName, int severity) {
+			TestCount soFar = (TestCount)_testStatus.get(subTaskName);
+			if(soFar == null) {
+				soFar = new TestCount();
+			}
+			soFar.numRan++;
+			switch(severity) {
+				case(ITestStatus.WARN): {
+					soFar.numWarn++;
+					soFar.numPass++;
+					break;
+				}
+				
+				case(ITestStatus.FAIL): {
+					soFar.numFail++;
+					break;
+				}
+				
+				case(ITestStatus.PASS): {
+					soFar.numPass++;
+				}
+				
+				default: {
+					// change nothing
+					break;
+				}
+			}
+			
+			_testStatus.put(subTaskName, soFar);
+		}
+		
+		public void addExecutionStatus(int severity) {
+			addExecutionStatus(null, severity);
+		}
+		
+		public String getTestcaseName() {
+			return _testcaseName;
+		}
+		
+		public int numWarnings() {
+			int numWarnings = 0;
+			Iterator iterator = _testStatus.values().iterator();
+			while(iterator.hasNext()) {
+				TestCount tc = (TestCount)iterator.next();
+				numWarnings += tc.numWarn;
+			}
+			return numWarnings;
+		}
+		
+		public int numFailure() {
+			int numFail = 0;
+			Iterator iterator = _testStatus.values().iterator();
+			while(iterator.hasNext()) {
+				TestCount tc = (TestCount)iterator.next();
+				numFail += tc.numFail;
+			}
+			return numFail;
+		}
+		
+		public boolean isSuccessful() {
+			Iterator iterator = _testStatus.values().iterator();
+			while(iterator.hasNext()) {
+				TestCount tc = (TestCount)iterator.next();
+				if(tc.numFail != 0) {
+					return false;
+				}
+			}
+			return true;
+		}
+		
+		public String toString() {
+			int total = 0;
+			int pass = 0;
+			int fail = 0;
+			int warn = 0;
+			
+			Iterator iterator = _testStatus.values().iterator();
+			while(iterator.hasNext()) {
+				TestCount tc = (TestCount)iterator.next();
+				total++;
+				fail += tc.numFail;
+				warn += tc.numWarn;
+				pass += tc.numPass;
+			}
+			
+			StringBuffer buffer = new StringBuffer(getTestcaseName());
+			buffer.append(" Total:"); //$NON-NLS-1$
+			buffer.append(total);
+			buffer.append(" [Pass: "); //$NON-NLS-1$
+			buffer.append(pass);
+			buffer.append(" Fail: "); //$NON-NLS-1$
+			buffer.append(fail);
+			buffer.append(" Warn: "); //$NON-NLS-1$
+			buffer.append(warn);
+			buffer.append("]"); //$NON-NLS-1$
+			return buffer.toString();
+		}
+		
+		public boolean equals(Object o) {
+			if(o instanceof TestStatus) {
+				TestStatus s = (TestStatus)o;
+				return(_testcaseName.equals(s.getTestcaseName()));
+			}
+			
+			return false;
+		}
+		
+		public int hashCode() {
+			return getTestcaseName().hashCode();
+		}
+		
+		/* (non-Javadoc)
+		 * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
+		 */
+		public int compare(Object o1, Object o2) {
+			if(!(o1 instanceof TestStatus) && (o2 instanceof TestStatus)) {
+				// Should never happen, but if it does, say that these non-TestStatus objects are equal.
+				return 0;
+			}
+
+			TestStatus a = (TestStatus)o1;
+			TestStatus b = (TestStatus)o2;
+			return a.getTestcaseName().compareTo(b.getTestcaseName());			
+		}
+	}
+}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/ValidationTypeEnum.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/ValidationTypeEnum.java
new file mode 100644
index 0000000..cfe10c3
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/ValidationTypeEnum.java
@@ -0,0 +1,23 @@
+package org.eclipse.jst.validation.test;
+
+import org.eclipse.core.resources.IncrementalProjectBuilder;
+
+/**
+ * Enumeration of the types of validations that can be run.
+ */
+public final class ValidationTypeEnum {
+	private ValidationTypeEnum() {
+		// Do not permit instances of this class to be created.
+	}
+	
+	public static final int RUN_VALIDATION = 0; // Manual full invocation of a validation by a user. All validators must support this type of validation.
+	public static final int FULL_VALIDATION = IncrementalProjectBuilder.FULL_BUILD; // Manual invocation of a full build by a user that triggers a full validation. Validators can, but are not required to, support this type of validation.
+	public static final int INCREMENTAL_VALIDATION = IncrementalProjectBuilder.INCREMENTAL_BUILD; // Manual invocation of an incremental build by a user that triggers an incremental validation. Validators can, but are not required to, support this type of validation.
+	public static final int AUTO_VALIDATION = IncrementalProjectBuilder.AUTO_BUILD; // Automatic invocation of an incremental build that triggers an incremental validation. Validators can, but are not required to, support this type of validation.
+	
+	public static final String RUN_VALIDATION_NAME = "RUN_VALIDATION"; //$NON-NLS-1$
+	public static final String ASYNC_NAME = "ASYNC"; //$NON-NLS-1$
+	public static final String INCREMENTAL_VALIDATION_NAME = "INCREMENTAL_BUILD"; //$NON-NLS-1$
+	public static final String FULL_VALIDATION_NAME = "FULL_BUILD"; //$NON-NLS-1$
+	public static final String AUTO_VALIDATION_NAME = "AUTO_BUILD"; //$NON-NLS-1$
+}
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/BVTValidationRegistryReader.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/BVTValidationRegistryReader.java
new file mode 100644
index 0000000..e1e4de9
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/BVTValidationRegistryReader.java
@@ -0,0 +1,904 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.validation.test.internal.registry;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.logging.Level;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.IPluginRegistry;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jem.util.logger.proxy.Logger;
+import org.eclipse.jst.validation.test.BVTValidationPlugin;
+import org.eclipse.jst.validation.test.IOperationRunnable;
+import org.eclipse.jst.validation.test.setup.IBuffer;
+import org.eclipse.jst.validation.test.setup.IImportOperation;
+import org.eclipse.wst.validation.internal.ValidationRegistryReader;
+import org.eclipse.wst.validation.internal.ValidatorMetaData;
+
+/**
+ * BVTValidationRegistryReader is a singleton who reads the plugin registry
+ * for Validator extensions. The read is done once (in the constructor). 
+ * 
+ * 
+ * <extension
+ *		point = "com.ibm.etools.validation.fvt.test"
+ *		id = "ValidatorFVT"
+ *		name = "Validator FVT Test">
+ *			<test project="projectName" 
+ * 				  validator="com.ibm.etools.validation.ejb.EJBValidator"
+ * 				  version="1.1">
+ *				<message id="CHKJ2816" resource="ejb-jar.xml" location="216"/>
+ *				<message id="CHKJ2816" resource="ejb-jar.xml" location="237"/>
+ *				<message id="CHKJ2816" resource="ejb-jar.xml" location="258"/>
+ *				<message id="CHKJ2816" resource="ejb-jar.xml" location="279"/>
+ *				<message id="CHKJ2816" resource="ejb-jar.xml" location="300"/>
+ *			</test>
+ * 			... as many <test> as needed
+ * </extension>
+ */
+public final class BVTValidationRegistryReader implements RegistryConstants {
+	private static BVTValidationRegistryReader inst = null;
+	private static OperationTestReader _opReader = null;
+	private static TestSetupReader _setupReader = null;
+	private static ValidationTestReader _valReader = null;
+
+	/**
+	 * The registry is read once - when this class is instantiated.
+	 */
+	private BVTValidationRegistryReader() {
+		super();
+	}
+
+	/**
+	 * Return all visible test cases for all projects.
+	 */
+	public ITestcaseMetaData[] getTests(IProgressMonitor monitor) {
+		Set tests = new HashSet();
+		ValidatorTestcase[] vts = getValidatorTests(monitor, (String)null);
+		for(int j=0; j<vts.length; j++) {
+			tests.add(vts[j]);
+		}
+		
+		OperationTestcase[] ots = getOperationTests(monitor, (String)null);
+		for(int k=0; k<ots.length; k++) {
+			tests.add(ots[k]);
+		}
+
+		ITestcaseMetaData[] result = new ITestcaseMetaData[tests.size()];
+		tests.toArray(result);
+		return result;
+	}
+	
+	/**
+	 * Return all visible test cases for a project.
+	 */
+	public ITestcaseMetaData[] getTests(IProgressMonitor monitor, IProject[] projects) {
+		Set tests = new HashSet();
+		for(int i=0; i<projects.length; i++) {
+			IProject project = projects[i];
+			ValidatorTestcase[] vts = getValidatorTests(monitor, project);
+			for(int j=0; j<vts.length; j++) {
+				tests.add(vts[j]);
+			}
+			
+			OperationTestcase[] ots = getOperationTests(monitor, project);
+			for(int k=0; k<ots.length; k++) {
+				tests.add(ots[k]);
+			}
+		}
+		
+		ITestcaseMetaData[] result = new ITestcaseMetaData[tests.size()];
+		tests.toArray(result);
+		return result;
+	}
+	
+
+	/**
+	 * Return all validator tests for a project.
+	 */
+	public ValidatorTestcase[] getAllValidatorTests(IProgressMonitor monitor, IProject project) throws IllegalArgumentException {
+		ValidationTestReader reader = getValidationTestReader();
+		return reader.getValidatorTests(monitor, project.getName());
+	}
+
+	/**
+	 * Return all test cases of the named validators on the given project.
+	 */	
+	public ValidatorTestcase[] getAllValidatorTests(IProgressMonitor monitor, IProject project, String[] validatorNames) {
+		Set testSet = new HashSet();		
+		ValidatorTestcase[] tests = getAllValidatorTests(monitor, project);
+		for(int i=0; i<validatorNames.length; i++) {
+			String validator = validatorNames[i];
+			for(int j=0; j<tests.length; j++) {
+				ValidatorTestcase tmd = tests[j];
+				if(tmd.getValidatorClass().equals(validator)) {
+					testSet.add(tmd);
+					break;
+				}
+			}
+		}
+		
+		ValidatorTestcase[] result = new ValidatorTestcase[testSet.size()];
+		testSet.toArray(result);
+		return result;
+	}
+	
+	/**
+	 * Return all of the visible test cases that register messages against this project.
+	 */
+	public ValidatorTestcase[] getValidatorTests(IProgressMonitor monitor, IProject project) throws IllegalArgumentException {
+		return getValidatorTests(monitor, project.getName());
+	}
+
+	private ValidationTestReader getValidationTestReader() {
+		if(_valReader == null) {
+			_valReader = new ValidationTestReader();
+		}
+		return _valReader;
+	}
+	
+	private OperationTestReader getOperationTestReader() {
+		if(_opReader == null) {
+			_opReader = new OperationTestReader();
+		}
+		return _opReader;
+	}
+	
+	private TestSetupReader getTestSetupReader() {
+		if (_setupReader == null) {
+			_setupReader = new TestSetupReader();
+		}
+		return _setupReader;
+	}
+	
+	/**
+	 * Return the test cases named testName, or if testName is null, return all test cases.
+	 */
+	public ValidatorTestcase[] getValidatorTests(IProgressMonitor monitor, String testName) throws IllegalArgumentException {
+		return getValidationTestReader().getVisibleValidatorTests(monitor, testName);
+	}
+	
+	/**
+	 * Return the test cases that register messages against this project.
+	 */
+	public OperationTestcase[] getOperationTests(IProgressMonitor monitor, IProject project) throws IllegalArgumentException {
+		return getOperationTests(monitor, project.getName());
+	}
+
+	/**
+	 * Return the test cases named testName, or if testName is null, return all test cases.
+	 */
+	public OperationTestcase[] getOperationTests(IProgressMonitor monitor, String testName) throws IllegalArgumentException {
+		return getOperationTestReader().getOperationTests(monitor, testName);
+	}
+
+	/**
+	 * If files need to be imported, import them now (into projects that are named
+	 * the same as the files.)
+	 * 
+	 * If ITestcaseMetaData is not null, return the TestSetupImport for that particular test.
+	 * If ITestcaseMetaData is null, return all TestSetupImport.
+	 */
+	public TestSetupImport[] getTestSetup(IBuffer buffer, String dir, ITestcaseMetaData tmd, boolean verbose) {
+		return getTestSetupReader().getTestSetup(buffer, dir, tmd, verbose);
+	}
+
+	/**
+	 * Returns the singleton ValidationTVTRegistryReader.
+	 */
+	public static BVTValidationRegistryReader getReader() {
+		if (inst == null) {
+			inst = new BVTValidationRegistryReader();
+		}
+		return inst;
+	}
+
+	private class ValidationTestReader {
+		private Map _validatorTests = null;
+		
+		ValidationTestReader() {
+		}
+		
+		public ValidatorTestcase[] getVisibleValidatorTests(IProgressMonitor monitor, String testName) throws IllegalArgumentException {
+			ValidatorTestcase[] vts = getValidatorTests(monitor, testName);
+			ValidatorTestcase[] temp = new ValidatorTestcase[vts.length];
+			int count = 0;
+			for(int i=0; i<vts.length; i++) {
+				ValidatorTestcase vt = vts[i];
+				if(vt.isVisible()) {
+					temp[count++] = vt;
+				}
+			}
+			ValidatorTestcase[] result = new ValidatorTestcase[count];
+			System.arraycopy(temp, 0, result, 0, count);
+			return result;
+		}
+		
+		public ValidatorTestcase[] getValidatorTests(IProgressMonitor monitor, String testName) throws IllegalArgumentException {
+			if (_validatorTests == null) {
+				_validatorTests = new HashMap();
+				readTestcaseRegistry(monitor);
+			}
+	
+			Collection tmds = null;
+			if (testName == null) {
+				tmds = new HashSet();
+				Iterator iterator = _validatorTests.values().iterator();
+				while (iterator.hasNext()) {
+					tmds.addAll((Collection) iterator.next());
+				}
+			}
+			else {
+				tmds = (Collection) _validatorTests.get(testName);
+			}
+			if ((tmds == null) || (tmds.size() == 0)) {
+				return new ValidatorTestcase[0];
+			}
+			ValidatorTestcase[] result = new ValidatorTestcase[tmds.size()];
+			tmds.toArray(result);
+			return result;
+		}
+
+		/**
+		 * Return the name of the test case if it exists. Otherwise, return null.
+		 */
+		private String getProject(IConfigurationElement element) {
+			if (element == null) {
+				return null;
+			}
+
+			return element.getAttribute(ATT_PROJECT);
+		}
+
+		private MessageMetaData[] getMessages(ValidatorTestcase tmd, IConfigurationElement testElement) {
+			IConfigurationElement[] messages = testElement.getChildren(TAG_MESSAGE);
+			if ((messages == null) || (messages.length == 0)) {
+				// No messages are expected.
+				return null;
+			}
+
+			MessageMetaData[] mmdList = new MessageMetaData[messages.length];
+			int count = 0;
+			for (int i = 0; i < messages.length; i++) {
+				IConfigurationElement message = messages[i];
+				String prefix = message.getAttribute(ATT_PREFIX);
+				if (prefix == null) {
+					Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+					if (logger.isLoggingLevel(Level.SEVERE)) {
+						logger.write(Level.SEVERE, "Every <message> must have a prefix."); //$NON-NLS-1$
+					}
+					continue;
+				}
+
+				// The following attributes are optional.			
+				String resourceName = message.getAttribute(ATT_RESOURCE);
+				String location = message.getAttribute(ATT_LOCATION);
+				String text = message.getAttribute(ATT_TEXT);
+				int lineNumber = -1;
+				MessageMetaData mmd = null;
+				if ((location != null)) {
+					try {
+						lineNumber = Integer.parseInt(location);
+						mmd = new MessageMetaData(tmd, prefix, resourceName, lineNumber, text);
+					}
+					catch (NumberFormatException exc) {
+						// Don't need to log - the location just isn't a number.
+					}
+				}
+
+				if (mmd == null) {
+					mmd = new MessageMetaData(tmd, prefix, resourceName, location, text);
+				}
+
+				mmdList[count++] = mmd;
+			}
+
+			if (count == mmdList.length) {
+				return mmdList;
+			}
+			else {
+				MessageMetaData[] result = new MessageMetaData[count];
+				System.arraycopy(mmdList, 0, result, 0, count);
+				return result;
+			}
+		}
+
+		private void addTest(IProgressMonitor monitor, IExtension extension, IConfigurationElement[] testElements) {
+			monitor.subTask("Reading test cases; please wait..."); //$NON-NLS-1$
+			String pluginId = extension.getNamespace();
+			for (int i = 0; i < testElements.length; i++) {
+				monitor.subTask("Reading test case " + (i + 1) + " of " + testElements.length); //$NON-NLS-1$ //$NON-NLS-2$
+				IConfigurationElement test = testElements[i];
+
+				String projectName = getProject(test);
+				if (projectName == null) {
+					Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+					if (logger.isLoggingLevel(Level.SEVERE)) {
+						logger.write(Level.SEVERE, "Every test must name the project that it verifies. " + test.toString()); //$NON-NLS-1$
+					}
+					continue;
+				}
+
+				ValidatorMetaData vmd = getValidatorMetaData(test);
+				if (vmd == null) {
+					// already logged, so just read the next test case.
+					continue;
+				}
+
+				String inputFileName = getInputFileName(test);
+				if (inputFileName == null) {
+					Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+					if (logger.isLoggingLevel(Level.SEVERE)) {
+						logger.write(Level.SEVERE, "Every test must name the file to be imported and then tested." + test.toString()); //$NON-NLS-1$
+					}
+					continue;
+				}
+
+				boolean visible = getVisible(test);
+
+				ValidatorTestcase tmd = new ValidatorTestcase(pluginId, projectName, vmd, inputFileName, visible);
+				tmd.setMessages(getMessages(tmd, test));
+
+				// Now add the test case to the Map, with the project name as the key into 
+				// the map.
+				Set prjTmd = (Set) _validatorTests.get(projectName);
+				if (prjTmd == null) {
+					prjTmd = new HashSet();
+				}
+				prjTmd.add(tmd);
+				_validatorTests.put(projectName, prjTmd);
+			}
+		}
+
+		/**
+		 * Retrieve an instance of the class with the given fully-qualified name.
+		 * If no such class can be found, return null.
+		 */
+		private ValidatorMetaData getValidatorMetaData(IConfigurationElement element) {
+			if (element == null) {
+				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+				if (logger.isLoggingLevel(Level.SEVERE)) {
+					logger.write(Level.SEVERE, "IConfigurationElement is null"); //$NON-NLS-1$
+				}
+				return null;
+			}
+
+			String validatorClass = element.getAttribute(ATT_VALIDATOR);
+			try {
+				if (validatorClass == null) {
+					Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+					if (logger.isLoggingLevel(Level.SEVERE)) {
+						logger.write(Level.SEVERE, "Cannot locate validator attribute"); //$NON-NLS-1$
+					}
+				}
+				ValidatorMetaData vmd = ValidationRegistryReader.getReader().getValidatorMetaData(validatorClass);
+				if (vmd == null) {
+					Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+					if (logger.isLoggingLevel(Level.SEVERE)) {
+						logger.write(Level.SEVERE, "Could not find validator " + validatorClass); //$NON-NLS-1$
+					}
+				}
+				return vmd;
+			}
+			catch (Throwable exc) {
+				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+				if (logger.isLoggingLevel(Level.SEVERE)) {
+					logger.write(Level.SEVERE, "Throwable caught while retrieving IValidator " + validatorClass); //$NON-NLS-1$
+					logger.write(Level.SEVERE, exc);
+				}
+				return null;
+			}
+		}
+
+		/**
+		 * Reads the registry to find the test cases that have been implemented.
+		 */
+		private void readTestcaseRegistry(IProgressMonitor monitor) {
+			// Get the extensions that have been registered.
+			IExtensionPoint validatorEP = getTestcaseExtensionPoint();
+			if (validatorEP == null) {
+				// error logged in getValidatorTVTExtensionPoint
+				return;
+			}
+			IExtension[] extensions = validatorEP.getExtensions();
+
+			// find all runtime implementations
+			for (int i = 0; i < extensions.length; i++) {
+				readTestcaseExtension(monitor, extensions[i]);
+			}
+		}
+
+		/**
+		 * Reads one extension by looping through its configuration elements.
+		 */
+		private void readTestcaseExtension(IProgressMonitor monitor, IExtension extension) {
+			IConfigurationElement[] elements = extension.getConfigurationElements();
+			if ((elements == null) || (elements.length == 0)) {
+				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+				if (logger.isLoggingLevel(Level.SEVERE)) {
+					logger.write(Level.SEVERE, "No tests found for " + extension.getLabel()); //$NON-NLS-1$
+				}
+				return;
+			}
+			addTest(monitor, extension, elements);
+		}
+
+		/**
+		 * Returns the operation extension point
+		 */
+		private IExtensionPoint getTestcaseExtensionPoint() {
+			IPluginRegistry registry = Platform.getPluginRegistry();
+			IExtensionPoint extensionPoint = registry.getExtensionPoint(PLUGIN_ID, VALIDATOR_TESTCASE_EXT_PT_ID);
+			if (extensionPoint == null) {
+				// If this happens it means that someone removed the "validator" extension point declaration 
+				// from our plugin.xml file.
+				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+				if (logger.isLoggingLevel(Level.SEVERE)) {
+					logger.write(Level.SEVERE, PLUGIN_ID + "." + VALIDATOR_TESTCASE_EXT_PT_ID + " has been removed from the validation TVT plugin.xml file"); //$NON-NLS-1$ //$NON-NLS-2$
+				}
+			}
+			return extensionPoint;
+		}
+
+		/**
+		 * Retrieve the name of the input which must be imported before the test case can be run.
+		 * Return null if no input name is set.
+		 */
+		private boolean getVisible(IConfigurationElement element) {
+			if (element == null) {
+				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+				if (logger.isLoggingLevel(Level.SEVERE)) {
+					logger.write(Level.SEVERE, "getVisible::IConfigurationElement is null"); //$NON-NLS-1$
+				}
+				return false;
+			}
+
+			String attrib = element.getAttribute(ATT_VISIBLE);
+			if (attrib == null) {
+				// default is visible
+				return true;
+			}
+
+			return Boolean.valueOf(attrib).booleanValue();
+		}
+
+		/**
+		 * Retrieve the name of the input which must be imported before the test case can be run.
+		 * Return null if no input name is set.
+		 */
+		private String getInputFileName(IConfigurationElement element) {
+			if (element == null) {
+				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+				if (logger.isLoggingLevel(Level.SEVERE)) {
+					logger.write(Level.SEVERE, "getInputFileName::IConfigurationElement is null"); //$NON-NLS-1$
+				}
+				return null;
+			}
+
+			return element.getAttribute(ATT_INPUT);
+		}
+
+	}
+
+	private class OperationTestReader {
+		private Map _operationTests = null;
+
+		OperationTestReader() {
+		}
+		
+		/**
+		 * Return the test cases named testName, or if testName is null, return all test cases.
+		 */
+		public OperationTestcase[] getOperationTests(IProgressMonitor monitor, String testName) throws IllegalArgumentException {
+			if (_operationTests == null) {
+				_operationTests = new HashMap();
+				readOperationTestcaseRegistry(monitor);
+			}
+
+			Collection tmds = null;
+			if (testName == null) {
+				tmds = new HashSet();
+				Iterator iterator = _operationTests.values().iterator();
+				while (iterator.hasNext()) {
+					tmds.addAll((Collection) iterator.next());
+				}
+			}
+			else {
+				tmds = (Collection) _operationTests.get(testName);
+			}
+			if ((tmds == null) || (tmds.size() == 0)) {
+				return new OperationTestcase[0];
+			}
+			OperationTestcase[] result = new OperationTestcase[tmds.size()];
+			tmds.toArray(result);
+			return result;
+		}
+
+		/**
+		 * Retrieve the name of the input which must be imported before the test case can be run.
+		 * Return null if no input name is set.
+		 */
+		private String getInputFileName(IConfigurationElement element) {
+			if (element == null) {
+				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+				if (logger.isLoggingLevel(Level.SEVERE)) {
+					logger.write(Level.SEVERE, "getInputFileName::IConfigurationElement is null"); //$NON-NLS-1$
+				}
+				return null;
+			}
+
+			return element.getAttribute(ATT_INPUT);
+		}
+
+		private void addOperationTest(IProgressMonitor monitor, IExtension extension, IConfigurationElement[] testElements) {
+			monitor.subTask("Reading test cases; please wait..."); //$NON-NLS-1$
+			String pluginId = extension.getNamespace();
+			for (int i = 0; i < testElements.length; i++) {
+				monitor.subTask("Reading test case " + (i + 1) + " of " + testElements.length); //$NON-NLS-1$ //$NON-NLS-2$
+				IConfigurationElement test = testElements[i];
+
+				String projectName = getProject(test);
+				if (projectName == null) {
+					Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+					if (logger.isLoggingLevel(Level.SEVERE)) {
+						logger.write(Level.SEVERE, "Every test must name the project that it verifies. " + test.toString()); //$NON-NLS-1$
+					}
+					continue;
+				}
+
+				IOperationRunnable op = getOperation(test);
+				if (op == null) {
+					// already logged, so just read the next test case.
+					continue;
+				}
+
+				String inputFileName = getInputFileName(test);
+				if (inputFileName == null) {
+					Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+					if (logger.isLoggingLevel(Level.SEVERE)) {
+						logger.write(Level.SEVERE, "Every test must name the file to be imported and then tested." + test.toString()); //$NON-NLS-1$
+					}
+					continue;
+				}
+
+				String id = extension.getLabel();
+
+				OperationTestcase tmd = new OperationTestcase(pluginId, projectName, id, inputFileName, op);
+
+				// Now add the test case to the Map, with the project name as the key into 
+				// the map.
+				Set prjTmd = (Set) _operationTests.get(projectName);
+				if (prjTmd == null) {
+					prjTmd = new HashSet();
+				}
+				prjTmd.add(tmd);
+				_operationTests.put(projectName, prjTmd);
+			}
+		}
+
+		/**
+		 * Reads one extension by looping through its configuration elements.
+		 */
+		private void readOperationTestcaseExtension(IProgressMonitor monitor, IExtension extension) {
+			IConfigurationElement[] elements = extension.getConfigurationElements();
+			if ((elements == null) || (elements.length == 0)) {
+				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+				if (logger.isLoggingLevel(Level.SEVERE)) {
+					logger.write(Level.SEVERE, "No tests found for " + extension.getLabel()); //$NON-NLS-1$
+				}
+				return;
+			}
+			addOperationTest(monitor, extension, elements);
+		}
+
+		/**
+		 * Reads the registry to find the test cases that have been implemented.
+		 */
+		private void readOperationTestcaseRegistry(IProgressMonitor monitor) {
+			// Get the extensions that have been registered.
+			IExtensionPoint opEP = getOperationTestcaseExtensionPoint();
+			if (opEP == null) {
+				// error logged in getValidatorTVTExtensionPoint
+				return;
+			}
+			IExtension[] extensions = opEP.getExtensions();
+
+			// find all runtime implementations
+			for (int i = 0; i < extensions.length; i++) {
+				readOperationTestcaseExtension(monitor, extensions[i]);
+			}
+		}
+
+		/**
+		 * Return the name of the test case if it exists. Otherwise, return null.
+		 */
+		private String getProject(IConfigurationElement element) {
+			if (element == null) {
+				return null;
+			}
+
+			return element.getAttribute(ATT_PROJECT);
+		}
+
+		/**
+		 * Returns the TestCase extension point
+		 */
+		private IExtensionPoint getOperationTestcaseExtensionPoint() {
+			IPluginRegistry registry = Platform.getPluginRegistry();
+			IExtensionPoint extensionPoint = registry.getExtensionPoint(PLUGIN_ID, VALIDATOR_OPERATION_TESTCASE_EXT_PT_ID);
+			if (extensionPoint == null) {
+				// If this happens it means that someone removed the "optest" extension point declaration 
+				// from our plugin.xml file.
+				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+				if (logger.isLoggingLevel(Level.SEVERE)) {
+					logger.write(Level.SEVERE, PLUGIN_ID + "." + VALIDATOR_OPERATION_TESTCASE_EXT_PT_ID + " has been removed from the validation TVT plugin.xml file"); //$NON-NLS-1$ //$NON-NLS-2$
+				}
+			}
+			return extensionPoint;
+		}
+
+		/**
+		 * Retrieve an instance of the class with the given fully-qualified name.
+		 * If no such class can be found, return null.
+		 */
+		private IOperationRunnable getOperation(IConfigurationElement element) {
+			if (element == null) {
+				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+				if (logger.isLoggingLevel(Level.SEVERE)) {
+					logger.write(Level.SEVERE, "IConfigurationElement is null"); //$NON-NLS-1$
+				}
+				return null;
+			}
+
+			String opClass = element.getAttribute(ATT_OPERATION);
+			try {
+				if (opClass == null) {
+					Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+					if (logger.isLoggingLevel(Level.SEVERE)) {
+						logger.write(Level.SEVERE, "Cannot locate operation attribute"); //$NON-NLS-1$
+					}
+				}
+
+				IOperationRunnable op = (IOperationRunnable) element.createExecutableExtension(ATT_OPERATION);
+				if (op == null) {
+					Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+					if (logger.isLoggingLevel(Level.SEVERE)) {
+						logger.write(Level.SEVERE, "Could not find operation " + opClass); //$NON-NLS-1$
+					}
+				}
+				return op;
+			}
+			catch (Throwable exc) {
+				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+				if (logger.isLoggingLevel(Level.SEVERE)) {
+					logger.write(Level.SEVERE, "Throwable caught while retrieving IValidator " + opClass); //$NON-NLS-1$
+					logger.write(Level.SEVERE, exc);
+				}
+				return null;
+			}
+		}
+
+	}
+
+	private class TestSetupReader {
+		private TestSetupImport[] _testSetup = null;
+
+		TestSetupReader() {
+		}
+		
+		/**
+		 * Retrieve the name of the input which must be imported before the test case can be run.
+		 * Return null if no input name is set.
+		 */
+		private String getInputFileName(IConfigurationElement element) {
+			if (element == null) {
+				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+				if (logger.isLoggingLevel(Level.SEVERE)) {
+					logger.write(Level.SEVERE, "getInputFileName::IConfigurationElement is null"); //$NON-NLS-1$
+				}
+				return null;
+			}
+
+			return element.getAttribute(ATT_INPUT);
+		}
+
+		/**
+		 * If files need to be imported, import them now (into projects that are named
+		 * the same as the files.)
+		 * 
+		 * If ITestcaseMetaData is not null, return the TestSetupImport for that particular test.
+		 * If ITestcaseMetaData is null, return all TestSetupImport.
+		 */
+		public TestSetupImport[] getTestSetup(IBuffer buffer, String dir, ITestcaseMetaData tmd, boolean verbose) {
+			if (_testSetup == null) {
+				readSetupRegistry(buffer, verbose);
+			}
+			if (tmd != null) {
+				for (int j = 0; j < _testSetup.length; j++) {
+					TestSetupImport tsi = _testSetup[j];
+					if (tsi.getFileName().endsWith(tmd.getInputFileName())) {
+						return new TestSetupImport[] { tsi };
+					}
+				}
+				return new TestSetupImport[0];
+			}
+			return _testSetup;
+		}
+	
+		private void addSetup(IBuffer buffer, IConfigurationElement[] importElements, boolean verbose) {
+			if ((importElements == null) || (importElements.length == 0)) {
+				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+				if (logger.isLoggingLevel(Level.SEVERE)) {
+					String message = "No test setup found"; //$NON-NLS-1$
+					logger.write(Level.SEVERE, message);
+					buffer.write(message);
+				}
+				return;
+			}
+
+			TestSetupImport[] temp = new TestSetupImport[importElements.length];
+			int count = 0;
+			for (int i = 0; i < importElements.length; i++) {
+				IConfigurationElement importElement = importElements[i];
+				String inputFileName = getInputFileName(importElement);
+				if (inputFileName == null) {
+					// Already logged in getInputFileName
+					continue;
+				}
+
+				IImportOperation op = getImportOperation(buffer, importElement);
+				if (op == null) {
+					buffer.write("Import operation cannot be found. Ignoring import."); //$NON-NLS-1$
+					continue;
+				}
+				TestSetupImport ts = new TestSetupImport(op, inputFileName);
+				temp[count++] = ts;
+			}
+
+			if (_testSetup == null) {
+				if (count == temp.length) {
+					_testSetup = temp;
+				}
+				else {
+					_testSetup = new TestSetupImport[count];
+					System.arraycopy(temp, 0, _testSetup, 0, count);
+				}
+			}
+			else {
+				TestSetupImport[] newTestSetup = new TestSetupImport[_testSetup.length + count];
+				System.arraycopy(_testSetup, 0, newTestSetup, 0, _testSetup.length);
+				System.arraycopy(temp, 0, newTestSetup, _testSetup.length, count);
+				_testSetup = newTestSetup;
+			}
+		}
+
+		/**
+		 * Reads one extension by looping through its configuration elements.
+		 */
+		private void readSetupExtension(IBuffer buffer, IExtension extension, boolean verbose) {
+			IConfigurationElement[] elements = extension.getConfigurationElements();
+			addSetup(buffer, elements, verbose);
+		}
+
+		/**
+		 * Returns the TestCaseSetup extension point
+		 */
+		private IExtensionPoint getSetupExtensionPoint() {
+			IPluginRegistry registry = Platform.getPluginRegistry();
+			IExtensionPoint extensionPoint = registry.getExtensionPoint(PLUGIN_ID, VALIDATOR_SETUP_EXT_PT_ID);
+			if (extensionPoint == null) {
+				// If this happens it means that someone removed the "validator" extension point declaration 
+				// from our plugin.xml file.
+				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+				if (logger.isLoggingLevel(Level.SEVERE)) {
+					logger.write(Level.SEVERE, PLUGIN_ID + "." + VALIDATOR_SETUP_EXT_PT_ID + " has been removed from the validation TVT plugin.xml file"); //$NON-NLS-1$ //$NON-NLS-2$
+				}
+			}
+			return extensionPoint;
+		}
+
+		/**
+		 * Reads the registry to find the test setup that must be performed.
+		 */
+		private void readSetupRegistry(IBuffer buffer, boolean verbose) {
+			// Get the extensions that have been registered.
+			IExtensionPoint validatorEP = getSetupExtensionPoint();
+			if (validatorEP == null) {
+				// error logged in getValidatorTVTExtensionPoint
+				buffer.write("Extension point is missing. Cannot import test cases."); //$NON-NLS-1$
+				return;
+			}
+			IExtension[] extensions = validatorEP.getExtensions();
+			if (extensions.length == 0) {
+				buffer.write("No extensions found. Cannot import test cases."); //$NON-NLS-1$
+				return;
+			}
+
+			// find all runtime implementations
+			buffer.getProgressMonitor().subTask("Reading setup <import> extensions; please wait..."); //$NON-NLS-1$
+			for (int i = 0; i < extensions.length; i++) {
+				buffer.getProgressMonitor().subTask("Reading setup <import> " + (i + 1) + " of " + extensions.length); //$NON-NLS-1$ //$NON-NLS-2$
+				readSetupExtension(buffer, extensions[i], verbose);
+			}
+		}
+
+		/**
+		 * Return an instance of the operation which is used to import the input.
+		 */
+		private IImportOperation getImportOperation(IBuffer buffer, IConfigurationElement element) {
+			if (element == null) {
+				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+				if (logger.isLoggingLevel(Level.SEVERE)) {
+					String message = "IConfigurationElement is null"; //$NON-NLS-1$
+					logger.write(Level.SEVERE, message);
+					buffer.write(message);
+				}
+			}
+
+			String opClass = element.getAttribute(ATT_OPERATION);
+			try {
+				if (opClass == null) {
+					Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+					if (logger.isLoggingLevel(Level.SEVERE)) {
+						String message = "Because there is no operation attribute, assuming that the input is a workspace."; //$NON-NLS-1$
+						logger.write(Level.SEVERE, message);
+						buffer.write(message);
+					}
+					return null;
+				}
+
+				Object temp = element.createExecutableExtension(ATT_OPERATION);
+				if (temp == null) {
+					Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+					if (logger.isLoggingLevel(Level.SEVERE)) {
+						String message = "operation " + opClass + " cannot be created. Ignoring the test case."; //$NON-NLS-1$ //$NON-NLS-2$
+						logger.write(Level.SEVERE, message);
+						buffer.write(message);
+					}
+					return null;
+				}
+				else if (temp instanceof IImportOperation) {
+					return (IImportOperation) temp;
+				}
+				else {
+					Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+					if (logger.isLoggingLevel(Level.SEVERE)) {
+						String message = "operation must be an instance of IImportOperation. Ignoring the test case."; //$NON-NLS-1$
+						logger.write(Level.SEVERE, message);
+						buffer.write(message);
+					}
+					return null;
+				}
+			}
+			catch (Throwable exc) {
+				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+				if (logger.isLoggingLevel(Level.SEVERE)) {
+					String message = "Throwable caught while retrieving IImportOperation " + opClass + " Ignoring the test case."; //$NON-NLS-1$ //$NON-NLS-2$
+					logger.write(Level.SEVERE, message);
+					logger.write(Level.SEVERE, exc);
+					buffer.write(message);
+				}
+				return null;
+			}
+		}
+
+	}
+}
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/BuildInfo.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/BuildInfo.java
new file mode 100644
index 0000000..d14a7a6
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/BuildInfo.java
@@ -0,0 +1,7 @@
+package org.eclipse.jst.validation.test.internal.registry;
+public class BuildInfo {
+  public static final String copyright = "Licensed Materials -- Property of IBM\n(c) Copyright International Business Machines Corporation, 2001,2003\nUS Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp.";
+  public static final String fgBuildLevel = "20031112_1915-WB212-AD-V511D-W5";
+  public static String level() { return fgBuildLevel; }
+  public static String getWSABuildLevel() { return fgBuildLevel; }
+}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/ITestcaseMetaData.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/ITestcaseMetaData.java
new file mode 100644
index 0000000..9458462
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/ITestcaseMetaData.java
@@ -0,0 +1,51 @@
+package org.eclipse.jst.validation.test.internal.registry;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jst.validation.test.setup.IBuffer;
+
+
+/**
+ * This interface represents a test case that either should be run
+ * as part of the Validation BVT Suite, or that is part of a test
+ * case that is run by the Validation BVT Suite.
+ */
+public interface ITestcaseMetaData {
+	/**
+	 * Return true if this test case should be shown as a test on 
+	 * the test collector menu.
+	 */
+	public boolean isVisible();
+	
+	/**
+	 * Return the project that this test case is designed to run on.
+	 */
+	public IProject getProject();
+	
+	/**
+	 * Return the name of the project that this test case is designed 
+	 * to run on.
+	 */
+	public String getProjectName();
+	
+	/**
+	 * Return the id of the plugin that declared this test case.
+	 */
+	public String getDeclaringPluginId();
+	
+	/**
+	 * Return the name of this test case.
+	 */
+	public String getName();
+	
+	/**
+	 * Return the name of the file that must be imported for this test case
+	 * to run on.
+	 */
+	public String getInputFileName();
+	
+	/**
+	 * Import the file, if necessary, and run this test. The test case
+	 * reports whether or not the test passes to the ITestBuffer.
+	 */
+	public void run(IBuffer buffer, IProject project);
+}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/MessageMetaData.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/MessageMetaData.java
new file mode 100644
index 0000000..663bbae
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/MessageMetaData.java
@@ -0,0 +1,88 @@
+package org.eclipse.jst.validation.test.internal.registry;
+
+import org.eclipse.wst.validation.internal.ValidatorMetaData;
+
+
+
+public class MessageMetaData {
+	public static final int LINENO_UNSET = -1;
+	private String _messagePrefix = null;
+	private String _resource = null;
+	private int _lineNumber = LINENO_UNSET;
+	private String _location = null;
+	private String _text = null; // When this test case was generated, what was the text of the marker? This information is needed when message prefixes change; the test case will fail because the prefix doesn't match, but it's easy to see that the old prefix tested the same thing as the new prefix.
+	private ValidatorTestcase _tmd = null; // pointer back to the testcase parent
+	
+	public MessageMetaData(ValidatorTestcase tmd, String prefix, String resource, int lineNumber, String text) {
+		this(tmd, prefix, resource, text);
+		_lineNumber = lineNumber;
+	}
+	
+	public MessageMetaData(ValidatorTestcase tmd, String prefix, String resource, String location, String text) {
+		this(tmd, prefix, resource, text);
+		_location = location;
+	}
+	
+	public MessageMetaData(ValidatorTestcase tmd, String prefix, String resource, String text) {
+		_tmd = tmd;
+		_messagePrefix = prefix;
+		_resource = resource;
+		_text = (text == null) ? "" : text; //$NON-NLS-1$
+	}
+	
+	public ValidatorTestcase getValidatorTestcase() {
+		return _tmd;
+	}
+	
+	public String getMessagePrefix() {
+		return _messagePrefix;
+	}
+	
+	public String getResource() {
+		return _resource;
+	}
+	
+	public int getLineNumber() {
+		return _lineNumber;
+	}
+	
+	public String getLocation() {
+		return _location;
+	}
+	
+	public ValidatorMetaData getValidator() {
+		return getValidatorTestcase().getValidatorMetaData();
+	}
+	
+	public String getText() {
+		return _text;
+	}
+	
+	public boolean isSetLineNumber() {
+		return (_lineNumber != LINENO_UNSET);
+	}
+	
+	public boolean isSetLocation() {
+		return isSet(_location);
+	}
+	
+	public boolean isSetResource() {
+		return isSet(_resource);
+	}
+	
+	private boolean isSet(String value) {
+		if(value == null) {
+			return false;
+		}
+		
+		if(value.trim().equals("")) { //$NON-NLS-1$
+			return false;
+		}
+		
+		return true;
+	}
+
+	public String toString() {
+		return MessageUtility.toString(this);
+	}
+}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/MessageUtility.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/MessageUtility.java
new file mode 100644
index 0000000..82eaeea
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/MessageUtility.java
@@ -0,0 +1,713 @@
+package org.eclipse.jst.validation.test.internal.registry;
+
+import java.text.MessageFormat;
+import java.util.Comparator;
+import java.util.StringTokenizer;
+import java.util.logging.Level;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jem.util.logger.proxy.Logger;
+import org.eclipse.jst.validation.sample.parser.PropertyLine;
+import org.eclipse.jst.validation.test.BVTValidationPlugin;
+import org.eclipse.jst.validation.test.setup.IBuffer;
+import org.eclipse.wst.validation.internal.ConfigurationConstants;
+import org.eclipse.wst.validation.internal.ConfigurationManager;
+import org.eclipse.wst.validation.internal.ValidationRegistryReader;
+import org.eclipse.wst.validation.internal.ValidatorMetaData;
+
+public class MessageUtility {
+	private final static String _TESTCASE_MESSAGE_TEMPLATE_ = "<message prefix=\"{0}\" resource=\"{1}\" location=\"{2}\" text=\"{3}\"/>"; //$NON-NLS-1$
+	private final static String _TESTCASE_MARKER_TEMPLATE_ =  "<marker prefix=\"{0}\" resource=\"{1}\" location=\"{2}\" text=\"{3}\"/>"; //$NON-NLS-1$
+	private static MessageComparator _messageComparator = null;
+	private static MessageIdComparator _messageIdComparator = null;
+	private static MessagePrefixComparator _messagePrefixComparator = null;
+	
+	private MessageUtility() {
+	}
+	
+	public static String toString(MessageMetaData mmd) {
+		String location = (mmd.isSetLineNumber()) ? String.valueOf(mmd.getLineNumber()) : mmd.getLocation();
+		return toString(mmd.getMessagePrefix(), mmd.getResource(), location, mmd.getText(), _TESTCASE_MESSAGE_TEMPLATE_);
+	}
+	
+	public static String toString(IMarker marker) {
+		Integer lineNumber = MessageUtility.getLineNumber(marker);
+		String location = (lineNumber == null) ? (location = MessageUtility.getLocation(marker)) : (location = lineNumber.toString());
+		return toString(getMessagePrefix(marker), getResource(marker), location, getMessage(marker), _TESTCASE_MARKER_TEMPLATE_);
+	}
+	
+	private static String toString(String fmssgPrefix, String fresource, String flocation, String ftext, String template) {
+		String mssgPrefix = (fmssgPrefix == null) ? "" : fmssgPrefix; //$NON-NLS-1$
+		String resource = (fresource == null) ? "" : fresource; //$NON-NLS-1$
+		String location = (flocation == null) ? "" : flocation; //$NON-NLS-1$
+		String text = (ftext == null) ? "" : ftext; //$NON-NLS-1$
+		return MessageFormat.format(template, new String[]{mssgPrefix, resource, location, text});
+	}
+	
+	public static String getProject(IMarker marker) {
+		return marker.getResource().getProject().getName();
+	}
+	
+
+	public static String getResource(IMarker marker) {
+		return marker.getResource().getProjectRelativePath().toString();
+	}
+	
+
+	// Based on the last letter of the message prefix, what severity
+	// should this marker be?
+	public static Integer getSeverity(IMarker marker) throws CoreException {
+		String message = (String)marker.getAttribute(IMarker.MESSAGE);
+		if(message == null) {
+			return null;
+		}
+		
+		String[] tokens = parse(message);
+		String severity = tokens[1];
+		Integer result;
+		if(severity.equals("E")) { //$NON-NLS-1$
+			result = new Integer(IMarker.SEVERITY_ERROR);
+		}
+		else if(severity.equals("W")) { //$NON-NLS-1$
+			result = new Integer(IMarker.SEVERITY_WARNING);
+		}
+		else if(severity.equals("I")) { //$NON-NLS-1$
+			result = new Integer(IMarker.SEVERITY_INFO);
+		}
+		else {
+			result = null;
+		}
+		return result;
+	}
+	
+	public static String getMessage(IMarker marker) {
+		try {
+			return (String)marker.getAttribute(IMarker.MESSAGE);
+		}
+		catch(CoreException e) {
+			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+			if(logger.isLoggingLevel(Level.SEVERE)) {
+				logger.write(Level.SEVERE, e);
+			}
+			return null;
+		}
+	}
+	
+	public static String getMessagePrefix(IMarker marker) {
+		String message = getMessage(marker);
+		if(message == null) {
+			return null;
+		}
+		
+		String[] tokens = parse(message);
+		return tokens[0];
+	}
+	
+	// This method is needed for the fuzzy compare. Need to 
+	// strip the ".java" or ".class" extension off of the resource
+	// name so that the class name can be searched for in the marker's
+	// location text.
+	public static String getResource(MessageMetaData mmd) {
+		String resource = mmd.getResource();
+		int index = resource.indexOf(".java"); //$NON-NLS-1$
+		if(index > -1) {
+			return resource.substring(0, index);
+		}
+		
+		index = resource.indexOf(".class"); //$NON-NLS-1$
+		if(index > -1) {
+			return resource.substring(0, index);
+		}
+		
+		return resource;
+	}
+	
+	public static ValidatorMetaData getValidator(IMarker marker) {
+		String validatorClass = ConfigurationManager.getManager().getValidator(marker);
+		ValidatorMetaData vmd = ValidationRegistryReader.getReader().getValidatorMetaData(validatorClass);
+		return vmd;
+	}
+	
+	/**
+	 * Parse the message value, to extract the unique error id, if any.
+	 * String[0] is the message prefix, String [1] is the error char, String[2] is the rest of the string after the ':'
+	 */
+	public static String[] parse(String message) {
+		if (message == null) {
+			return new String[]{"", "", ""}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		}
+
+		StringTokenizer tokenizer = new StringTokenizer(message);
+		int numTokens = tokenizer.countTokens();
+		if (numTokens == 0) {
+			return new String[]{"", "", message}; //$NON-NLS-1$ //$NON-NLS-2$
+		}
+		else {
+			String errorId = tokenizer.nextToken();
+			boolean isErrorIndex = false;
+
+			int errorIdIndex = errorId.indexOf(':');
+			if (errorIdIndex > 0) {
+				String tempString = errorId.substring(0, errorIdIndex);
+				char[] temp = tempString.toCharArray();
+				if (temp.length == 9) { // Must be of the form ABCD1234E, which is 9 char long
+
+					isErrorIndex = Character.isLetter(temp[0]);
+					isErrorIndex = isErrorIndex && Character.isLetter(temp[1]);
+					isErrorIndex = isErrorIndex && Character.isLetter(temp[2]);
+					isErrorIndex = isErrorIndex && Character.isLetter(temp[3]);
+					isErrorIndex = isErrorIndex && Character.isDigit(temp[4]);
+					isErrorIndex = isErrorIndex && Character.isDigit(temp[5]);
+					isErrorIndex = isErrorIndex && Character.isDigit(temp[6]);
+					isErrorIndex = isErrorIndex && Character.isDigit(temp[7]);
+					isErrorIndex = isErrorIndex && Character.isLetter(temp[8]);
+
+					if (isErrorIndex) {
+						String shortMessage;
+						if (numTokens > 1) {
+							shortMessage = message.substring(errorIdIndex + 1, message.length()).intern();
+						}
+						else {
+							shortMessage = ""; //$NON-NLS-1$
+						}
+						return new String[]{tempString.substring(0, 8), new String(new char[]{temp[8]}), shortMessage};
+					}
+				}
+			}
+
+			if (!isErrorIndex) {
+				return new String[]{"", "", message}; //$NON-NLS-1$ //$NON-NLS-2$
+			}
+		}
+		
+		return new String[]{"", "", message}; //$NON-NLS-1$ //$NON-NLS-2$
+	}
+
+	public static Integer getLineNumber(IMarker marker) {
+		try {
+			return (Integer)marker.getAttribute(IMarker.LINE_NUMBER);
+		}
+		catch(CoreException e) {
+			return null;
+		}
+	}
+	
+	public static String getTargetObject(IMarker marker) {
+		try {
+			String targetObject = (String)marker.getAttribute(ConfigurationConstants.VALIDATION_MARKER_TARGETOBJECT);
+			if((targetObject != null) && (targetObject.equals(""))) { //$NON-NLS-1$
+				// Empty string means that there was no target object.
+				return null;
+			}
+			return targetObject;
+		}
+		catch(CoreException e) {
+			return null;
+		}
+	}
+	
+	/**
+	 * Sort first on validator, 
+	 * then project, 
+	 * then message prefix,
+	 * then location,
+	 * then resource. (The resource may be different in batch and UI, so compare location & resource at the same time.)
+	 * 
+	 * @param verbose If true, verbose output while comparing lists.
+	 */	
+	public static Comparator getMessageComparator(final IBuffer buffer, final boolean verbose) {
+		if(_messageComparator == null) {
+			_messageComparator = new MessageUtility(). new MessageComparator();
+		}
+		_messageComparator.setVerbose(verbose);
+		_messageComparator.setBuffer(buffer);
+		return _messageComparator;
+	}
+	
+	/**
+	 * Sort first on the version, then on the message prefix.
+	 */	
+	public static Comparator getMessageIdComparator(final IBuffer buffer, final boolean verbose) {
+		if(_messageIdComparator == null) {
+			_messageIdComparator = new MessageUtility(). new MessageIdComparator();
+		}
+		_messageIdComparator.setVerbose(verbose);
+		_messageIdComparator.setBuffer(buffer);
+		return _messageIdComparator;
+	}
+
+	public static String getLocation(IMarker marker) {
+		try {
+			return (String)marker.getAttribute(IMarker.LOCATION);
+		}
+		catch(CoreException e) {
+			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+			if(logger.isLoggingLevel(Level.SEVERE)) {
+				logger.write(Level.SEVERE, e);
+			}
+			return null;
+		}
+	}
+
+	private class MessageComparator implements Comparator {
+		private boolean _verbose = false;
+		private IBuffer _buffer = null;
+		
+		public boolean isVerbose() {
+			return _verbose;
+		}
+		
+		public void setVerbose(boolean v) {
+			_verbose = v;
+		}
+		
+		public IBuffer getBuffer() {
+			return _buffer;
+		}
+		
+		public void setBuffer(IBuffer b) {
+			_buffer = b;
+		}
+		
+		public int compare(Object a, Object b) {
+			if((a == null) && (b == null)) {
+				return 0;
+			}
+			else if(a == null) {
+				return 1;
+			}
+			else if(b == null) {
+				return -1;
+			}
+			
+			
+			// Sort first on the message prefix, then on the location, then project, then resource
+			if((a instanceof String) && (b instanceof String)) {
+				return compare((String)a, (String)b);
+			}
+			else if ((a instanceof IMarker) && (b instanceof IMarker)) {
+				IMarker aM = (IMarker)a;
+				IMarker bM = (IMarker)b;
+				int result = compare(aM, bM);
+				if(isVerbose()) {
+					getBuffer().write("compare(" + MessageUtility.toString(aM) + ", " + MessageUtility.toString(bM) + " = " + result); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+				}
+				return result;
+			}
+			else if ((a instanceof IMarker) && (b instanceof MessageMetaData)) {
+				IMarker aM = (IMarker)a;
+				MessageMetaData mmd = (MessageMetaData)b;
+				int result = compare(aM, mmd);
+				if(isVerbose()) {
+					getBuffer().write("compare(" + MessageUtility.toString(aM) + ", " + MessageUtility.toString(mmd) + " = " + result); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+				}
+				return result;
+			}
+			else if((a instanceof MessageMetaData) && (b instanceof IMarker)) {
+				MessageMetaData mmd = (MessageMetaData)a;
+				IMarker bM = (IMarker)b;
+				int result = compare(mmd, bM);
+				if(isVerbose()) {
+					getBuffer().write("compare(" + MessageUtility.toString(mmd) + ", " + MessageUtility.toString(bM) + " = " + result); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+				}						
+				return result;
+			}
+			else if((a instanceof MessageMetaData) && (b instanceof MessageMetaData)) {
+				MessageMetaData aMMD = (MessageMetaData)a;
+				MessageMetaData bMMD = (MessageMetaData)b;
+				int result = compare(aMMD, bMMD);
+				if(isVerbose()) {
+					getBuffer().write("compare(" + MessageUtility.toString(aMMD) + ", " + MessageUtility.toString(bMMD) + " = " + result); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+				}
+				return result;
+			}
+			
+			// else put it at the end of the list
+			return 1;
+		}
+		
+		public int compare(String aStr, String bStr) {
+			if((aStr == null) && (bStr == null)) {
+				return 0;
+			}
+			else if(aStr == null) {
+				return 1;
+			}
+			else if(bStr == null) {
+				return -1;
+			}
+			return aStr.compareTo(bStr);
+		}
+		
+		public int compare(int aInt, int bInt) {
+			return aInt - bInt;
+		}
+		
+		public int compare(ValidatorMetaData aVMD, ValidatorMetaData bVMD) {
+			if((aVMD == null) && (bVMD == null)) {
+				return 0;
+			}
+			else if(aVMD == null) {
+				return 1;
+			}
+			else if(bVMD == null) {
+				return -1;
+			}
+			return compare(aVMD.getValidatorUniqueName(), bVMD.getValidatorUniqueName());
+		}
+
+		public int compare(IMarker aMarker, IMarker bMarker) {
+			if((aMarker == null) && (bMarker == null)) {
+				return 0;
+			}
+			else if(aMarker == null) {
+				return 1;
+			}
+			else if(bMarker == null) {
+				return -1;
+			}
+			
+			int valCmp = compare(getValidator(aMarker), getValidator(bMarker));
+			if(valCmp != 0) {
+				return valCmp;
+			}
+
+			int prjCmp = compare(getProject(aMarker), getProject(bMarker));
+			if(prjCmp != 0) {
+				return prjCmp;
+			}
+			
+			int idCmp = compare(getMessagePrefix(aMarker), getMessagePrefix(bMarker));
+			if(idCmp != 0) {
+				return idCmp;
+			}
+
+			int cmp = compareResourceAndLocation(aMarker, bMarker);
+			return cmp;
+		}
+		
+		public int compare(IMarker marker, MessageMetaData mmd) {
+			if((marker == null) && (mmd == null)) {
+				return 0;
+			}
+			else if(marker == null) {
+				return 1;
+			}
+			else if(mmd == null) {
+				return -1;
+			}
+
+			int valCmp = compare(getValidator(marker), mmd.getValidator());
+			if(valCmp != 0) {
+				return valCmp;
+			}
+
+			int prjCmp = compare(getProject(marker), mmd.getValidatorTestcase().getProjectName());
+			if(prjCmp != 0) {
+				return prjCmp;
+			}
+			
+			int idCmp = compare(getMessagePrefix(marker), mmd.getMessagePrefix());
+			if(idCmp != 0) {
+				return idCmp;
+			}
+
+			int cmp = compareResourceAndLocation(marker, mmd);
+			return cmp;
+		}
+		
+		public int compare(MessageMetaData mmd, IMarker marker) {
+			if((mmd == null) && (marker == null)) {
+				return 0;
+			}
+			else if(mmd == null) {
+				return 1;
+			}
+			else if(marker == null) {
+				return -1;
+			}
+
+			int valCmp = compare(mmd.getValidator(), getValidator(marker));
+			if(valCmp != 0) {
+				return valCmp;
+			}
+
+			int prjCmp = compare(mmd.getValidatorTestcase().getProjectName(), getProject(marker));
+			if(prjCmp != 0) {
+				return prjCmp;
+			}
+
+			int idCmp = compare(mmd.getMessagePrefix(), getMessagePrefix(marker));
+			if(idCmp != 0) {
+				return idCmp;
+			}
+
+			int cmp = compareResourceAndLocation(mmd, marker);
+			return cmp;
+		}
+		
+		public int compare(MessageMetaData aMMD, MessageMetaData bMMD) {
+			if((aMMD == null) && (bMMD == null)) {
+				return 0;
+			}
+			else if(aMMD == null) {
+				return 1;
+			}
+			else if(bMMD == null) {
+				return -1;
+			}
+			
+			int valCmp = compare(aMMD.getValidator(), bMMD.getValidator());
+			if(valCmp != 0) {
+				return valCmp;
+			}
+
+			int prjCmp = compare(aMMD.getValidatorTestcase().getProjectName(), bMMD.getValidatorTestcase().getProjectName());
+			if(prjCmp != 0) {
+				return prjCmp;
+			}
+			
+			int idCmp = compare(aMMD.getMessagePrefix(), bMMD.getMessagePrefix());
+			if(idCmp != 0) {
+				return idCmp;
+			}
+
+			int cmp = compareResourceAndLocation(aMMD, bMMD);
+			return cmp;
+		}
+		
+		public int compareResourceAndLocation(IMarker aMarker, IMarker bMarker) {
+			int resCmp = compare(getResource(aMarker), getResource(bMarker));
+			if(resCmp != 0) {
+				return resCmp;
+			}
+			
+			Integer aLineNo = getLineNumber(aMarker);
+			Integer bLineNo = getLineNumber(bMarker);
+			if((aLineNo != null) && (bLineNo!= null)) {
+				return compare(aLineNo, bLineNo);
+			}
+			
+			String aLocation = getLocation(aMarker);
+			String bLocation = getLocation(bMarker);
+			if((aLocation != null) && (bLocation != null)) {
+				return compare(aLocation, bLocation);
+			}
+			
+			// If one has a line number and the other has a text location, can't compare
+			// the location, so just assume that they're equal.
+			return resCmp;
+		}
+		
+		public int compareResourceAndLocation(IMarker marker, MessageMetaData mmd) {
+			int resCmp = compare(getResource(marker), mmd.getResource());
+			if(resCmp != 0) {
+				return resCmp;
+			}
+			
+			if(mmd.isSetLineNumber()) {
+				Integer aLineNo = getLineNumber(marker);
+				int bLineNo = mmd.getLineNumber();
+				if(aLineNo != null) {
+					return compare(aLineNo.intValue(), bLineNo);
+				}
+			}
+
+			if(mmd.isSetLocation()) {
+				String aLocation = getLocation(marker);
+				String bLocation = mmd.getLocation();
+				if((aLocation != null) && (bLocation != null)) {
+					return compare(aLocation, bLocation);
+				}
+			}
+			
+			// If one has a line number and the other has a text location, can't compare
+			// the location, so just assume that they're equal.
+			return resCmp;
+		}
+		
+		public int compareResourceAndLocation(MessageMetaData mmd, IMarker marker) {
+			int resCmp = compare(mmd.getResource(), getResource(marker));
+			if(resCmp != 0) {
+				return resCmp;
+			}
+
+			if(mmd.isSetLineNumber()) {
+				int aLineNo = mmd.getLineNumber();
+				Integer bLineNo = getLineNumber(marker);
+				if(bLineNo!= null) {
+					return compare(aLineNo, bLineNo.intValue());
+				}
+			}
+
+			if(mmd.isSetLocation()) {
+				String aLocation = mmd.getLocation();
+				String bLocation = getLocation(marker);
+				if((aLocation != null) && (bLocation != null)) {
+					return compare(aLocation, bLocation);
+				}
+			}
+			
+			// If one has a line number and the other has a text location, can't compare
+			// the location, so just assume that they're equal.
+			return resCmp;
+		}
+		
+		public int compareResourceAndLocation(MessageMetaData aMMD, MessageMetaData bMMD) {
+			int resCmp = compare(aMMD.getResource(), bMMD.getResource());
+			if(resCmp != 0) {
+				return resCmp;
+			}
+
+			if(aMMD.isSetLineNumber() && bMMD.isSetLineNumber()) {
+				int aLineNo = aMMD.getLineNumber();
+				int bLineNo = bMMD.getLineNumber();
+				return compare(aLineNo, bLineNo);
+			}
+
+			if(aMMD.isSetLocation() && bMMD.isSetLocation()) {
+				String aLocation = aMMD.getLocation();
+				String bLocation = bMMD.getLocation();
+				if((aLocation != null) && (bLocation != null)) {
+					return compare(aLocation, bLocation);
+				}
+			}
+			
+			// If one has a line number and the other has a text location, can't compare
+			// the location, so just assume that they're equal.
+			return resCmp;
+		}
+	}
+	
+	public static MessagePrefixComparator getMessagePrefixComparator() {
+		if(_messagePrefixComparator == null) {
+			_messagePrefixComparator = new MessagePrefixComparator();
+		}
+		return _messagePrefixComparator;
+	}
+	
+	static class MessagePrefixComparator implements Comparator {
+		public int compare(Object a, Object b) {
+			String aPrefix = null;
+			String bPrefix = null;
+			if(a instanceof PropertyLine) {
+				aPrefix = ((PropertyLine)a).getMessagePrefix();
+			}
+			else if(a instanceof MessageMetaData) {
+				aPrefix = ((MessageMetaData)a).getMessagePrefix();
+			}
+			
+			if(b instanceof PropertyLine) {
+				bPrefix = ((PropertyLine)b).getMessagePrefix();
+			}
+			else if(b instanceof MessageMetaData) {
+				bPrefix = ((MessageMetaData)b).getMessagePrefix();
+			}
+
+			if(aPrefix.length() == 9) {
+				aPrefix = aPrefix.substring(0, 9);
+			}
+			
+			if(bPrefix.length() == 9) {
+				bPrefix = bPrefix.substring(0, 9);
+			}
+			
+			return aPrefix.compareTo(bPrefix);
+		}
+	}
+		
+	class MessageIdComparator implements Comparator {
+		private boolean _verbose = false;
+		private IBuffer _buffer = null;
+		
+		public boolean isVerbose() {
+			return _verbose;
+		}
+		
+		public void setVerbose(boolean v) {
+			_verbose = v;
+		}
+		
+		public IBuffer getBuffer() {
+			return _buffer;
+		}
+		
+		public void setBuffer(IBuffer b) {
+			_buffer = b;
+		}
+		
+		public String getMessageId(IMarker marker) {
+			try {
+				return (String)marker.getAttribute(ConfigurationConstants.VALIDATION_MARKER_MESSAGEID);
+			}
+			catch(CoreException exc) {
+				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+				if(logger.isLoggingLevel(Level.SEVERE)) {
+					logger.write(Level.SEVERE, exc);
+				}
+				return ""; //$NON-NLS-1$
+			}
+		}
+		
+		public int compare(String aStr, String bStr) {
+			if((aStr == null) && (bStr == null)) {
+				return 0;
+			}
+			else if(aStr == null) {
+				return 1;
+			}
+			else if(bStr == null) {
+				return -1;
+			}
+			return aStr.compareTo(bStr);
+		}
+		
+		public int compare(Object a, Object b) {
+			if((a == null) && (b == null)) {
+				return 0;
+			}
+			else if(a == null) {
+				return 1;
+			}
+			else if(b == null) {
+				return -1;
+			}
+			
+			
+			// Sort first on the version, then on the message prefix
+			if((a instanceof String) && (b instanceof String)) {
+				String aStr = (String)a;
+				String bStr = (String)b;
+				return compare(aStr, bStr);
+			}
+			else if ((a instanceof PropertyLine) && (b instanceof PropertyLine)) {
+				PropertyLine aM = (PropertyLine)a;
+				PropertyLine bM = (PropertyLine)b;
+				
+				return compare(aM.getMessageId(), bM.getMessageId());
+			}
+			else if ((a instanceof PropertyLine) && (b instanceof IMarker)) {
+				PropertyLine aM = (PropertyLine)a;
+				IMarker bM = (IMarker)b;
+				
+				return compare(aM.getMessageId(), getMessageId(bM));
+			}
+			else if((a instanceof IMarker) && (b instanceof PropertyLine)) {
+				IMarker aM = (IMarker)a;
+				PropertyLine bM = (PropertyLine)b;
+				
+				return compare(getMessageId(aM), bM.getMessageId());
+			}
+			else if((a instanceof IMarker) && (b instanceof IMarker)) {
+				IMarker aM = (IMarker)a;
+				IMarker bM = (IMarker)b;
+
+				return compare(getMessageId(aM), getMessageId(bM));
+			}
+			
+			// else put it at the end of the list
+			return 1;
+		}
+	};
+}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/OperationTestcase.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/OperationTestcase.java
new file mode 100644
index 0000000..1ecc44a
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/OperationTestcase.java
@@ -0,0 +1,81 @@
+package org.eclipse.jst.validation.test.internal.registry;
+
+import java.util.logging.Level;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jem.util.logger.proxy.Logger;
+import org.eclipse.jst.validation.test.BVTValidationPlugin;
+import org.eclipse.jst.validation.test.IOperationRunnable;
+import org.eclipse.jst.validation.test.setup.IBuffer;
+
+/**
+ * Instead of testing a validator, an operation test case tests the 
+ * validation framework.
+ */
+public class OperationTestcase implements ITestcaseMetaData {
+	private String _pluginId = null; // The plugin id that has contributed this test case.
+	private String _projectName = null; // the name of the project that this test case tests
+	private String _inputFileName = null;
+	private String _opName = null; // the name of the test case
+	private IOperationRunnable _runnable = null;
+
+	public OperationTestcase(String pluginId, String projectName, String opName, String inputFileName, IOperationRunnable runnable) {
+		_pluginId = pluginId;
+		_projectName = projectName;
+		_inputFileName = inputFileName;
+		_opName = opName;
+		_runnable = runnable;
+	}
+	
+	public String getName() {
+		return _opName;
+	}
+	
+	public boolean isVisible() {
+		return true; // framework test cases are always visible on the test collector menu
+	}
+	
+	public String getDeclaringPluginId() {
+		return _pluginId;
+	}
+	
+	public String getProjectName() {
+		return _projectName;
+	}
+	
+	public IProject getProject() {
+		return TestcaseUtility.findProject(this);
+	}
+	
+	public String getInputFileName() {
+		return _inputFileName;
+	}
+	
+	public IOperationRunnable getRunnable() {
+		return _runnable;
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jst.validation.test.internal.registry.ITestcaseMetaData#run(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.jst.validation.test.setup.IBuffer, org.eclipse.core.resources.IProject)
+	 */
+	public void run(IBuffer buffer, IProject project) {
+		try {
+			getRunnable().setBuffer(buffer);
+			getRunnable().setProject(project);
+			getRunnable().setName(getName());
+			ResourcesPlugin.getWorkspace().run(getRunnable(), buffer.getProgressMonitor());
+		}
+		catch(CoreException exc) {
+			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+			if(logger.isLoggingLevel(Level.SEVERE)) {
+				logger.write(Level.SEVERE, exc); //$NON-NLS-1$
+			}
+		}
+	}
+
+	public String toString() {
+		return getName();
+	}
+}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/RegistryConstants.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/RegistryConstants.java
new file mode 100644
index 0000000..134032e
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/RegistryConstants.java
@@ -0,0 +1,37 @@
+package org.eclipse.jst.validation.test.internal.registry;
+
+/**
+ * Validation constants needed to declare an extension point, and
+ * to implement an extension.
+ */
+public interface RegistryConstants {
+	public static final String PLUGIN_ID = org.eclipse.jst.validation.test.BVTValidationPlugin.PLUGIN_ID;
+	
+	public static final String VALIDATOR_TESTCASE_EXT_PT_ID = "test"; // extension point declaration of the validator test case //$NON-NLS-1$
+	public static final String VALIDATOR_SETUP_EXT_PT_ID = "testSetup"; // extension point declaration of the test case setup mechanism (i.e., import the EAR or JAR) //$NON-NLS-1$
+	public static final String VALIDATOR_OPERATION_TESTCASE_EXT_PT_ID = "opTest"; // extension point declaration of the operation test case //$NON-NLS-1$
+	
+	public static final Double EJB20 = new Double(2.0); // EJB 2.0 input or 1.3 EAR
+	public static final Double EJB11 = new Double(1.1); // EJB 1.1 input or 1.2 EAR
+	public static final Double EJB = null; // common EJB level, such as reflection errors
+	public static final String EJB20_MSSG = "ejb20"; // in a .properties line, if the message id contains this string, it's an EJB 2.0 rule //$NON-NLS-1$
+	public static final String EJB11_MSSG = "ejb11"; // in a .properties line, if the message id contains this string, it's an EJB 1.1 rule //$NON-NLS-1$
+	public static final String EJB_MSSG = null; // in a .properties file, if the message is neither EJB20 nor EJB11, the rule is cross-specs. (e.g. reflection errors) //$NON-NLS-1$
+	
+
+	/*package*/ static final String ATT_VALIDATOR = "validator"; // the validator  //$NON-NLS-1$
+	/*package*/ static final String ATT_PLUGIN = "plugin"; // identifies the plugin which has the class //$NON-NLS-1$
+	/*package*/ static final String TAG_TEST = "test"; //$NON-NLS-1$
+	/*package*/ static final String TAG_IMPORT = "import"; //$NON-NLS-1$
+	/*package*/ static final String ATT_OPERATION = "operation"; // the fully-qualified name of the IImportOperation which is used to import the input //$NON-NLS-1$
+	/*package*/ static final String ATT_INPUT = "input"; //$NON-NLS-1$
+	/*package*/ static final String ATT_VERSION = "version"; // the version of the input, e.g. EJB 1.1 vs. EJB 2.0 //$NON-NLS-1$
+	/*package*/ static final String TAG_MESSAGE = "message"; //$NON-NLS-1$
+	/*package*/ static final String ATT_PREFIX = "prefix"; //$NON-NLS-1$
+	/*package*/ static final String ATT_SEVERITY = "severity"; //$NON-NLS-1$
+	/*package*/ static final String ATT_PROJECT = "project"; //$NON-NLS-1$
+	/*package*/ static final String ATT_RESOURCE = "resource"; //$NON-NLS-1$
+	/*package*/ static final String ATT_LOCATION = "location"; //$NON-NLS-1$
+	/*package*/ static final String ATT_TEXT = "text"; //$NON-NLS-1$
+	/*package*/ static final String ATT_VISIBLE = "visible"; // Is this test visible on the Test Collector menu? //$NON-NLS-1$
+}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/TestSetupImport.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/TestSetupImport.java
new file mode 100644
index 0000000..c57765a
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/TestSetupImport.java
@@ -0,0 +1,89 @@
+package org.eclipse.jst.validation.test.internal.registry;
+
+import java.io.File;
+import java.lang.reflect.InvocationTargetException;
+import java.util.logging.Level;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jem.util.logger.proxy.Logger;
+import org.eclipse.jst.validation.test.BVTValidationPlugin;
+import org.eclipse.jst.validation.test.setup.IImportOperation;
+import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
+
+/**
+ * This class holds the metadata needed to import an .ear or
+ * a .jar file to set up a test case in batch mode.
+ */
+public class TestSetupImport {
+	private String _fileName = null;
+	private IImportOperation _importOperation = null;
+
+	public TestSetupImport(IImportOperation op, String fileName) {
+		_importOperation = op;
+		_fileName = fileName;
+	}
+
+	public File getInputFile(String dir) {
+		File file = new File(dir, getFileName());
+		if(!file.exists()) {
+			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+			if(logger.isLoggingLevel(Level.SEVERE)) {
+				logger.write(Level.SEVERE, "File " + file.getAbsolutePath() + " must exist and have read access."); //$NON-NLS-1$ //$NON-NLS-2$
+			}
+			return null;
+		}
+		
+		return file;
+	}
+	
+	public String getFileName() {
+		return _fileName;
+	}
+	
+	public IImportOperation getOperation() {
+		return _importOperation;
+	}
+	
+	/**
+	 * Return true if the file was found and imported successfully.
+	 */
+	public boolean importFile(IProgressMonitor monitor, String dir) {
+		//int executionMap = 0x0;
+		boolean imported = true;
+		try {
+			File file = getInputFile(dir);
+			//executionMap |= 0x1;
+			try {
+				IImportOperation op = getOperation();
+				//executionMap |= 0x2;
+				imported = op.run(monitor, file);
+				//executionMap |= 0x4;
+			}
+			catch (InterruptedException exc) {
+				//executionMap |= 0x8;
+				imported = false;
+				ValidationPlugin.getPlugin().handleException(exc);
+			}
+			catch (InvocationTargetException exc) {
+				//executionMap |= 0x10;
+				imported = false;
+				ValidationPlugin.getPlugin().handleException(exc);
+				ValidationPlugin.getPlugin().handleException(exc.getTargetException());
+			}
+			catch (Throwable exc) {
+				//executionMap |= 0x20;
+				imported = false;
+				ValidationPlugin.getPlugin().handleException(exc);
+			}
+		}
+		finally {
+			if(!imported) {
+				ValidationPlugin.getPlugin().logMessage(IStatus.ERROR, 
+						"TestSetup for " + dir + " was unsuccessful."); //$NON-NLS-1$ //$NON-NLS-2$
+			}
+			
+		}
+		return imported;
+	}
+}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/TestcaseMetaData.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/TestcaseMetaData.java
new file mode 100644
index 0000000..b4f2c56
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/TestcaseMetaData.java
@@ -0,0 +1,160 @@
+package org.eclipse.jst.validation.test.internal.registry;
+
+import java.io.File;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.logging.Level;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPluginDescriptor;
+import org.eclipse.core.runtime.IPluginRegistry;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jem.util.logger.proxy.Logger;
+import org.eclipse.jst.validation.test.BVTValidationPlugin;
+import org.eclipse.wst.validation.internal.ValidatorMetaData;
+
+public class TestcaseMetaData {
+	private String _pluginId = null; // The plugin id that has contributed this test case.
+	private ValidatorMetaData _vmd = null;
+	private MessageMetaData[] _messages = null;
+	private String _project = null; // the name of the project that this test case tests
+	private String[] _resourceNames = null; // the resources listed in the MessageMetaData of this test case.
+	private String _inputFileName = null;
+	private String _name = null; // the name of the test case
+	
+	public TestcaseMetaData(String pluginName, String project, ValidatorMetaData vmd, String inputFileName) {
+		_pluginId = pluginName;
+		_project = project;
+		_vmd = vmd;
+		_inputFileName = inputFileName;
+	}
+	
+	public String getDeclaringPluginId() {
+		return _pluginId;
+	}
+	
+	public String getProject() {
+		return _project;
+	}
+	
+	public IProject findProject() {
+		return ResourcesPlugin.getWorkspace().getRoot().getProject(_project);
+	}
+	
+	public String getInputFileName() {
+		return _inputFileName;
+	}
+	
+	public int getNumMessages() {
+		return getMessages().size();
+	}
+	
+	// The messages need to be stored in a list instead of an array because
+	// the list is sorted before searching & displaying.
+	public List getMessages() {
+		List copy = new ArrayList();
+		for(int i=0; i<_messages.length; i++) {
+			copy.add(_messages[i]);
+		}
+		
+		return copy;
+	}
+	
+	// Return the resources in this project for which there is a message in this test case.
+	// No resource instance will be in the resource more than once.
+	public IResource[] getResources(IProject project) {
+		Set temp = new HashSet(); // use a set in case there is more than one message registered against a resource (don't want duplicates in the list).
+		String[] resourceNames = getResourceNames();
+		for(int i=0; i<resourceNames.length; i++) {
+			String resourceName = resourceNames[i];
+			IResource resource = project.findMember(resourceName);
+			if(resource != null) {
+				// resource exists
+				temp.add(resource);
+			}
+		}
+		
+		IResource[] result = new IResource[temp.size()];
+		temp.toArray(result);
+		return result;
+	}
+	
+	public String[] getResourceNames() {
+		if(_resourceNames == null) {
+			_resourceNames = new String[_messages.length];
+			for(int i=0; i<_messages.length; i++) {
+				_resourceNames[i] = _messages[i].getResource();
+			}
+		}
+		return _resourceNames;
+	}
+	
+	/**
+	 * When an empty TMD is used to test an operation, and the operation needs the IResource[]
+	 * affected by the TMD to know whether or not the operation passes (i.e., one of the ValidatorSubsetOperation
+	 * constructors takes an IResource[], and the IResource[] must not be empty or null), then
+	 * this method is used to set the "resources" affected by the test case.
+	 */
+	public void setResourceNames(String[] resourceNames) {
+		_resourceNames = resourceNames;
+	}
+	
+	public void setMessages(MessageMetaData[] messages) {
+		// If messages are null, that means that the test case expects no validation errors.
+		_messages = ((messages == null) ? new MessageMetaData[0] : messages);
+	}
+	
+	public ValidatorMetaData getValidatorMetaData() {
+		return _vmd;
+	}
+	
+	public String getValidatorClass() {
+		return getValidatorMetaData().getValidatorUniqueName();
+	}
+
+	public String getName() {
+		if(_name == null) {
+			_name = _vmd.getValidatorDisplayName() + "::" + getProject(); //$NON-NLS-1$
+		}
+		return _name;
+	}	
+	
+	public String getInputDir() {
+		// If the directory where the testcase input isn't specified, 
+		// assume that the input is in a subdirectory, named "testInput",
+		// of the testcase's plugin.
+		IPluginRegistry registry = Platform.getPluginRegistry();
+		IPluginDescriptor descriptor = registry.getPluginDescriptor(getDeclaringPluginId());
+		if(descriptor != null) {
+			// Because Platform.asLocalURL throws an IOException if the URL resolves
+			// to a directory, find the plugin.xml file and then strip off the file name 
+			// to find the testInput directory.
+			try {
+				String pluginXmlPath = Platform.asLocalURL(new URL(descriptor.getInstallURL(), "plugin.xml")).getPath(); //$NON-NLS-1$
+				File pluginXml = new File(pluginXmlPath);
+				if(pluginXml.exists()) {
+					File inputDir = new File(pluginXml.getParent(), "testInput"); //$NON-NLS-1$
+					if (inputDir.exists() && inputDir.isDirectory()) {
+						return inputDir.getPath();
+					}
+				}
+			}
+			catch(java.io.IOException exc) {
+			    Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+				if(logger.getLevel() == Level.SEVERE) {
+					logger.write(Level.SEVERE, exc);
+				}
+			}
+		}
+		
+		// Should never get here, but if we do, assume that the input 
+		// directory is the current directory.
+		return System.getProperty("user.dir"); //$NON-NLS-1$
+	}
+}
+
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/TestcaseUtility.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/TestcaseUtility.java
new file mode 100644
index 0000000..32d58e3
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/TestcaseUtility.java
@@ -0,0 +1,84 @@
+package org.eclipse.jst.validation.test.internal.registry;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.net.URL;
+import java.util.logging.Level;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPluginDescriptor;
+import org.eclipse.core.runtime.IPluginRegistry;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jem.util.logger.proxy.Logger;
+import org.eclipse.jst.validation.test.BVTValidationPlugin;
+
+/**
+ * Utility class that contains convenience methods for test cases.
+ */
+public final class TestcaseUtility {
+	/**
+	 * Load the project that this test case is supposed to run on.
+	 */
+	public static IProject findProject(ITestcaseMetaData tmd) {
+		if(tmd == null) {
+			return null;
+		}
+		
+		return ResourcesPlugin.getWorkspace().getRoot().getProject(tmd.getProjectName());
+	}
+
+	/**
+	 * Return the directory where the input for this test case can be located.
+	 */
+	public static String getInputDir(ITestcaseMetaData tmd) {
+		// If the directory where the testcase input isn't specified, 
+		// assume that the input is in a subdirectory, named "testInput",
+		// of the testcase's plugin.
+		IPluginRegistry registry = Platform.getPluginRegistry();
+		IPluginDescriptor descriptor = registry.getPluginDescriptor(tmd.getDeclaringPluginId());
+		if(descriptor != null) {
+			// Because Platform.asLocalURL throws an IOException if the URL resolves
+			// to a directory, find the plugin.xml file and then strip off the file name 
+			// to find the testInput directory.
+			try {
+				String pluginXmlPath = Platform.asLocalURL(new URL(descriptor.getInstallURL(), "plugin.xml")).getPath(); //$NON-NLS-1$
+				File pluginXml = new File(pluginXmlPath);
+				if(pluginXml.exists()) {
+					File inputDir = new File(pluginXml.getParent(), "testInput"); //$NON-NLS-1$
+					if (inputDir.exists() && inputDir.isDirectory()) {
+						return inputDir.getPath();
+					}
+				}
+			}
+			catch(java.io.IOException exc) {
+				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+				if(logger.isLoggingLevel(Level.SEVERE)) {
+					logger.write(Level.SEVERE, exc);
+				}
+			}
+		}
+		
+		// Should never get here, but if we do, assume that the input 
+		// directory is the current directory.
+		return System.getProperty("user.dir"); //$NON-NLS-1$
+	}
+
+	/**
+	 * logFileName must point to a fully-qualified file.
+	 */
+	public static void flush(String logFileName, String buffer, boolean append) {
+		try {
+			FileWriter writer = new FileWriter(logFileName, append);
+			writer.write(buffer); // Write the entire report to the state log.
+			writer.close();
+		}
+		catch(IOException exc) {
+			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+			if(logger.isLoggingLevel(Level.SEVERE)) {
+				logger.write(Level.SEVERE, exc);
+			}
+		}
+	}
+}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/ValidatorTestcase.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/ValidatorTestcase.java
new file mode 100644
index 0000000..5e30d53
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/registry/ValidatorTestcase.java
@@ -0,0 +1,492 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.validation.test.internal.registry;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.logging.Level;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jem.util.logger.proxy.Logger;
+import org.eclipse.jst.validation.test.BVTValidationException;
+import org.eclipse.jst.validation.test.BVTValidationPlugin;
+import org.eclipse.jst.validation.test.ValidationTypeEnum;
+import org.eclipse.jst.validation.test.internal.util.BVTRunner;
+import org.eclipse.jst.validation.test.setup.IBuffer;
+import org.eclipse.wst.validation.internal.ConfigurationManager;
+import org.eclipse.wst.validation.internal.GlobalConfiguration;
+import org.eclipse.wst.validation.internal.TaskListUtility;
+import org.eclipse.wst.validation.internal.VThreadManager;
+import org.eclipse.wst.validation.internal.ValidatorMetaData;
+import org.eclipse.wst.validation.internal.core.IFileDelta;
+import org.eclipse.wst.validation.internal.operations.ValidatorSubsetOperation;
+
+public class ValidatorTestcase implements ITestcaseMetaData {
+	private String _pluginId = null; // The plugin id that has contributed this test case.
+	private ValidatorMetaData _vmd = null;
+	private MessageMetaData[] _messages = null;
+	private String _projectName = null; // the name of the project that this test case tests
+	private String[] _resourceNames = null; // the resources listed in the MessageMetaData of this test case.
+	private String _inputFileName = null;
+	private String _name = null; // the name of the test case
+	private boolean _visible = true; // Is this test case visible on the Test Collector menu
+	
+	public ValidatorTestcase(String pluginName, String project, ValidatorMetaData vmd, String inputFileName, boolean visible) {
+		_pluginId = pluginName;
+		_projectName = project;
+		_vmd = vmd;
+		_inputFileName = inputFileName;
+		_visible = visible;
+	}
+	
+	public boolean isVisible() {
+		return _visible;
+	}
+	
+	public String getDeclaringPluginId() {
+		return _pluginId;
+	}
+	
+	public String getProjectName() {
+		return _projectName;
+	}
+	
+	public IProject getProject() {
+		return TestcaseUtility.findProject(this);
+	}
+	
+	public String getInputFileName() {
+		return _inputFileName;
+	}
+	
+	/**
+	 * Return the number of messages
+	 */
+	public int getNumMessages() {
+		return getMessages(ValidationTypeEnum.RUN_VALIDATION).size();
+	}
+	
+	/**
+	 * Return the list of messages that should be reported for the given build
+	 * type. (e.g. if the validator does not support incremental validation,
+	 * then instead of returning the list of expected messages, return an empty 
+	 * list.)
+	 */
+	public List getMessages(int buildType) {
+		// The messages need to be stored in a list instead of an array because
+		// the list is sorted before searching & displaying.
+		switch(buildType) {
+			case(ValidationTypeEnum.AUTO_VALIDATION):
+			case(ValidationTypeEnum.INCREMENTAL_VALIDATION): {
+				if(!getValidatorMetaData().isIncremental()) {
+					return Collections.EMPTY_LIST;
+				}
+				// Otherwise, return the default copy below.
+				break;
+			}
+
+			case(ValidationTypeEnum.FULL_VALIDATION): {
+				if(!getValidatorMetaData().isFullBuild()) {
+					return Collections.EMPTY_LIST;
+				}
+				// Otherwise, return the default copy below.
+				break;
+			}
+
+			case(ValidationTypeEnum.RUN_VALIDATION):
+			default: {
+				// Return the default copy below.
+			}
+			
+		}
+		
+		List copy = new ArrayList();
+		for(int i=0; i<_messages.length; i++) {
+			copy.add(_messages[i]);
+		}
+		
+		return copy;
+	}
+	
+	// Return the resources in this project for which there is a message in this test case.
+	// No resource instance will be in the resource more than once.
+	public IResource[] getResources(IProject project) {
+		Set temp = new HashSet(); // use a set in case there is more than one message registered against a resource (don't want duplicates in the list).
+		String[] resourceNames = getResourceNames();
+		for(int i=0; i<resourceNames.length; i++) {
+			String resourceName = resourceNames[i];
+			IResource resource = project.findMember(resourceName);
+			if(resource != null) {
+				// resource exists
+				temp.add(resource);
+			}
+		}
+		
+		IResource[] result = new IResource[temp.size()];
+		temp.toArray(result);
+		return result;
+	}
+	
+	public String[] getResourceNames() {
+		if(_resourceNames == null) {
+			_resourceNames = new String[_messages.length];
+			for(int i=0; i<_messages.length; i++) {
+				_resourceNames[i] = _messages[i].getResource();
+			}
+		}
+		return _resourceNames;
+	}
+	
+	/**
+	 * When an empty TMD is used to test an operation, and the operation needs the IResource[]
+	 * affected by the TMD to know whether or not the operation passes (i.e., one of the ValidatorSubsetOperation
+	 * constructors takes an IResource[], and the IResource[] must not be empty or null), then
+	 * this method is used to set the "resources" affected by the test case.
+	 */
+	public void setResourceNames(String[] resourceNames) {
+		_resourceNames = resourceNames;
+	}
+	
+	public void setMessages(MessageMetaData[] messages) {
+		// If messages are null, that means that the test case expects no validation errors.
+		_messages = ((messages == null) ? new MessageMetaData[0] : messages);
+	}
+	
+	public ValidatorMetaData getValidatorMetaData() {
+		return _vmd;
+	}
+	
+	public String getValidatorClass() {
+		return getValidatorMetaData().getValidatorUniqueName();
+	}
+
+	public String getName() {
+		if(_name == null) {
+			_name = _vmd.getValidatorDisplayName() + "::" + getProjectName(); //$NON-NLS-1$
+		}
+		return _name;
+	}	
+	
+	public void run(IBuffer buffer, IProject project) {
+		String status = ">>>>>RUN VALIDATION TEST PASS [" + project.getName() + "]>>>>>";	//$NON-NLS-1$ //$NON-NLS-2$			
+		buffer.getProgressMonitor().subTask(status);
+		buffer.write(status);
+		buffer.addExecutionStatus(getName(), ValidationTypeEnum.RUN_VALIDATION_NAME, validate(buffer, project, ValidationTypeEnum.RUN_VALIDATION, ValidationTypeEnum.RUN_VALIDATION_NAME));
+		status = ">>>>>END RUN VALIDATION TEST PASS [" + project.getName() + "]>>>>>";	//$NON-NLS-1$ //$NON-NLS-2$
+		buffer.getProgressMonitor().subTask(status);
+		buffer.write(status);
+		
+		status = ">>>>>FULL BUILD TEST PASS [" + project.getName() + "]>>>>>";			//$NON-NLS-1$ //$NON-NLS-2$		
+		buffer.getProgressMonitor().subTask(status);
+		buffer.write(status);
+		buffer.addExecutionStatus(getName(), ValidationTypeEnum.FULL_VALIDATION_NAME, validate(buffer, project, ValidationTypeEnum.FULL_VALIDATION, ValidationTypeEnum.FULL_VALIDATION_NAME));
+		status = ">>>>>END FULL BUILD TEST PASS [" + project.getName() + "]>>>>>";	//$NON-NLS-1$ //$NON-NLS-2$
+		buffer.getProgressMonitor().subTask(status);
+		buffer.write(status);
+		
+		status = ">>>>>INCREMENTAL BUILD TEST PASS [" + project.getName() + "]>>>>>";	//$NON-NLS-1$ //$NON-NLS-2$
+		buffer.getProgressMonitor().subTask(status);
+		buffer.write(status);
+		buffer.addExecutionStatus(getName(), ValidationTypeEnum.INCREMENTAL_VALIDATION_NAME, validate(buffer, project, ValidationTypeEnum.INCREMENTAL_VALIDATION, ValidationTypeEnum.INCREMENTAL_VALIDATION_NAME));
+		status = ">>>>>END INCREMENTAL BUILD TEST PASS [" + project.getName() + "]>>>>>";	//$NON-NLS-1$ //$NON-NLS-2$
+		buffer.getProgressMonitor().subTask(status);
+		buffer.write(status);
+		
+		status = ">>>>>AUTO BUILD TEST PASS [" + project.getName() + "]>>>>>";	//$NON-NLS-1$ //$NON-NLS-2$
+		buffer.getProgressMonitor().subTask(status);
+		buffer.write(status);
+		buffer.addExecutionStatus(getName(), ValidationTypeEnum.AUTO_VALIDATION_NAME, validate(buffer, project, ValidationTypeEnum.AUTO_VALIDATION, ValidationTypeEnum.AUTO_VALIDATION_NAME));
+		status = ">>>>>END AUTO BUILD TEST PASS [" + project.getName() + "]>>>>>";	//$NON-NLS-1$ //$NON-NLS-2$
+		buffer.getProgressMonitor().subTask(status);
+		buffer.write(status);
+		
+		if(getValidatorMetaData().isAsync()) {
+			status = ">>>>>ASYNCHRONOUS VALIDATION TEST PASS [" + project.getName() + "]>>>>>";	//$NON-NLS-1$ //$NON-NLS-2$
+			buffer.getProgressMonitor().subTask(status);
+			buffer.write(status);
+			buffer.addExecutionStatus(getName(), ValidationTypeEnum.ASYNC_NAME, asyncValidate(buffer, project, ValidationTypeEnum.ASYNC_NAME));
+			status = ">>>>>END ASYNCHRONOUS VALIDATION TEST PASS [" + project.getName() + "]>>>>>";	//$NON-NLS-1$ //$NON-NLS-2$
+			buffer.getProgressMonitor().subTask(status);
+			buffer.write(status);
+		}
+		else {
+			// By default, "pass" the asynchrous tests of any validator that cannot run asynchronous tests.
+			buffer.addExecutionStatus(getName(), ValidationTypeEnum.ASYNC_NAME, true);
+		}
+	}
+	
+	private boolean validate(IBuffer buffer, IProject project, int validationTypeEnum, String taskName) {
+		long start = System.currentTimeMillis();
+		boolean passed = true;
+		try {
+			passed = BVTRunner.singleton().test(buffer, project, this, validationTypeEnum);
+		}
+		catch(BVTValidationException exc) {
+			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+			if(logger.isLoggingLevel(Level.SEVERE)) {
+				logger.write(Level.SEVERE, exc);
+				if(exc.getTargetException() != null) {
+					logger.write(Level.SEVERE, exc.getTargetException());
+				}
+			}
+		}
+		finally {
+			long end = System.currentTimeMillis();
+			buffer.addElapsedTime(taskName, (end - start));
+			buffer.write("Total time for validator " + getValidatorMetaData().getValidatorDisplayName() + " of project " + project.getName() + " in " + taskName + " mode was " + (end - start) + " milliseconds."); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
+		}
+		return passed;
+	}
+	
+	private boolean asyncValidate(IBuffer buffer, IProject project, String subTaskName) {
+		boolean passed = true;
+		long start = System.currentTimeMillis();
+		long end = 0;
+		try {
+			GlobalConfiguration gconf = ConfigurationManager.getManager().getGlobalConfiguration();
+			//boolean disableValidation = gconf.numberOfEnabledValidators()==0;
+			//boolean autoValidate = gconf.isAutoValidate();
+			//boolean buildValidate = gconf.isBuildValidate();
+			try {
+				//gconf.setAutoValidate(false);
+				// Turn off auto-validate so that the project isn't validated automatically.
+				//gconf.setAutoValidate(false);
+				//gconf.setBuildValidate(false);
+				gconf.passivate();
+				
+				// Two tests: 
+				//   1. Run validation on copies of the original project: "projectName.fork" and "projectName.noFork"
+				//      Compare the markers of the copies to the FVT TestcaseMetaData, and the validator passes if the 
+				//		results of each copy matches the TestcaseMetaData.
+				//   2. Run validation on copies, but this time introduce changes during the validation.
+				//		Extract the names of resources from the testcase metadata, find those resources, and
+				//		add/delete/rename/move/close/change them.
+				
+				boolean pass1 = validateAndCompare(buffer, project, subTaskName);
+				boolean pass2 = validateChangeAndCompare(buffer, project, IFileDelta.CHANGED, subTaskName);
+				boolean pass3 = validateChangeAndCompare(buffer, project, IFileDelta.DELETED, subTaskName);
+				passed = (pass1 && pass2 && pass3);
+			}
+			catch(CoreException exc) {
+				// Couldn't create copy.Just continue with the next test.
+				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+				if(logger.isLoggingLevel(Level.SEVERE)) {
+					logger.write(Level.SEVERE, exc);
+				}
+			}
+			catch(BVTValidationException exc) {
+				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+				if(logger.isLoggingLevel(Level.SEVERE)) {
+					logger.write(Level.SEVERE, exc);
+					if(exc.getTargetException() != null) {
+						logger.write(Level.SEVERE, exc.getTargetException());
+					}
+				}
+			}
+			catch(Throwable exc) {
+				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+				if(logger.isLoggingLevel(Level.SEVERE)) {
+					logger.write(Level.SEVERE, exc);
+				}
+			}
+			finally {
+				//gconf.setAutoValidate(autoValidate);
+				//gconf.setBuildValidate(buildValidate);
+				gconf.passivate();
+			}
+		}
+		catch(InvocationTargetException exc) {
+			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+			if(logger.isLoggingLevel(Level.SEVERE)) {
+				logger.write(Level.SEVERE, exc);
+				if(exc.getTargetException() != null) {
+					logger.write(Level.SEVERE, exc.getTargetException());
+				}
+			}
+		}
+		finally {
+			end = System.currentTimeMillis();
+			buffer.addElapsedTime(ValidationTypeEnum.ASYNC_NAME, (end - start));
+			buffer.write("Total time for validator " + getValidatorMetaData().getValidatorDisplayName() + " of project " + project.getName() + " in asynchronous mode was " + (end - start) + " milliseconds."); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+			
+		}
+		return passed;
+	}
+
+	/**
+	 * Run validation, using several operations (both forked and not forked), on the IProject.
+	 * Return true if the result, after the last operation is complete, is the expected result.
+	 */
+	private boolean validateAndCompare(IBuffer buffer, IProject project, String subTaskName) throws CoreException, BVTValidationException {
+		// Now compare the IProject's result to the expected TestcaseMetaData result.
+		// Validate
+		ValidatorSubsetOperation noForkOp = new ValidatorSubsetOperation(project, true, false);
+		noForkOp.setValidators(getValidatorMetaData().getValidatorNames());
+		noForkOp.run(buffer.getProgressMonitor());
+		
+		if(buffer.getProgressMonitor().isCanceled()) {
+			return false;
+		}
+
+		ValidatorSubsetOperation forkOp = new ValidatorSubsetOperation(project, true, true);
+		forkOp.setValidators(getValidatorMetaData().getValidatorNames());
+		forkOp.run(buffer.getProgressMonitor());
+		
+		if(buffer.getProgressMonitor().isCanceled()) {
+			return false;
+		}
+
+		ValidatorSubsetOperation noForkOp2 = new ValidatorSubsetOperation(project, true, false);
+		noForkOp2.setValidators(getValidatorMetaData().getValidatorNames());
+		noForkOp2.run(buffer.getProgressMonitor());
+
+		if(buffer.getProgressMonitor().isCanceled()) {
+			return false;
+		}
+
+		ValidatorSubsetOperation forkOp2 = new ValidatorSubsetOperation(project, true, true);
+		forkOp2.setValidators(getValidatorMetaData().getValidatorNames());
+		forkOp2.run(buffer.getProgressMonitor());
+		
+		if(buffer.getProgressMonitor().isCanceled()) {
+			return false;
+		}
+
+		ValidatorSubsetOperation forkOp3 = new ValidatorSubsetOperation(project, true, true);
+		forkOp3.setValidators(getValidatorMetaData().getValidatorNames());
+		forkOp3.run(buffer.getProgressMonitor());
+		
+		// Wait until all of the threads have complete.
+		buffer.getProgressMonitor().subTask("Waiting for all forked threads to finish..."); //$NON-NLS-1$
+		while(!VThreadManager.getManager().isDone() && !buffer.getProgressMonitor().isCanceled()) {}
+		buffer.getProgressMonitor().subTask("All threads are complete. Beginning the comparison."); //$NON-NLS-1$
+		
+		if(buffer.getProgressMonitor().isCanceled()) {
+			return false;
+		}
+
+		// Compare
+		IMarker[] markers = TaskListUtility.getValidationTasks(project, getValidatorMetaData().getValidatorNames());
+
+		if(buffer.getProgressMonitor().isCanceled()) {
+			return false;
+		}
+
+		return BVTRunner.singleton().verify(buffer, getName(), subTaskName, project, getMessages(ValidationTypeEnum.RUN_VALIDATION), markers); 
+	}
+
+	private boolean validateChangeAndCompare(IBuffer buffer, IProject project, int ifileDeltaType, String subTaskName) throws BVTValidationException, CoreException {
+		boolean passed = true;
+		
+		ValidatorMetaData[] vmds = new ValidatorMetaData[]{getValidatorMetaData()};
+		
+		ValidatorSubsetOperation noForkOpOrig = new ValidatorSubsetOperation(project, true, false);
+		noForkOpOrig.setValidators(getValidatorMetaData().getValidatorNames());
+		noForkOpOrig.run(buffer.getProgressMonitor());
+
+		if(buffer.getProgressMonitor().isCanceled()) {
+			return false;
+		}
+
+		ValidatorSubsetOperation noForkOpChanged = new ValidatorSubsetOperation(project, vmds, getResources(project), ifileDeltaType, false, false); // false = do not force if there's no deltas to validate
+		noForkOpChanged.run(buffer.getProgressMonitor());
+
+		if(buffer.getProgressMonitor().isCanceled()) {
+			return false;
+		}
+
+		ValidatorSubsetOperation forkOpOrig = new ValidatorSubsetOperation(project, true, true);
+		forkOpOrig.setValidators(getValidatorMetaData().getValidatorNames());
+		forkOpOrig.run(buffer.getProgressMonitor());
+
+		if(buffer.getProgressMonitor().isCanceled()) {
+			return false;
+		}
+
+		ValidatorSubsetOperation forkOpChanged = new ValidatorSubsetOperation(project, vmds,  getResources(project), ifileDeltaType, false, true); // false = do not force if there's no deltas to validate
+		forkOpChanged.run(buffer.getProgressMonitor());
+		
+		if(buffer.getProgressMonitor().isCanceled()) {
+			return false;
+		}
+
+		ValidatorSubsetOperation noForkOp2Orig = new ValidatorSubsetOperation(project, true, false);
+		noForkOp2Orig.setValidators(getValidatorMetaData().getValidatorNames());
+		noForkOp2Orig.run(buffer.getProgressMonitor());
+
+		if(buffer.getProgressMonitor().isCanceled()) {
+			return false;
+		}
+
+		ValidatorSubsetOperation noForkOp2Changed = new ValidatorSubsetOperation(project, vmds,  getResources(project), ifileDeltaType, false, false); // false = do not force if there's no deltas to validate
+		noForkOp2Changed.run(buffer.getProgressMonitor());
+
+		if(buffer.getProgressMonitor().isCanceled()) {
+			return false;
+		}
+
+		ValidatorSubsetOperation forkOp2Orig = new ValidatorSubsetOperation(project, true, true);
+		forkOp2Orig.setValidators(getValidatorMetaData().getValidatorNames());
+		forkOp2Orig.run(buffer.getProgressMonitor());
+		
+		if(buffer.getProgressMonitor().isCanceled()) {
+			return false;
+		}
+
+		ValidatorSubsetOperation forkOp2Changed = new ValidatorSubsetOperation(project, vmds,  getResources(project), ifileDeltaType, false, true); // false = do not force if there's no deltas to validate
+		forkOp2Changed.run(buffer.getProgressMonitor());
+
+		if(buffer.getProgressMonitor().isCanceled()) {
+			return false;
+		}
+
+		ValidatorSubsetOperation forkOp3Orig = new ValidatorSubsetOperation(project, true, true);
+		forkOp3Orig.setValidators(getValidatorMetaData().getValidatorNames());
+		forkOp3Orig.run(buffer.getProgressMonitor());
+		
+		if(buffer.getProgressMonitor().isCanceled()) {
+			return false;
+		}
+
+		ValidatorSubsetOperation forkOp3Changed = new ValidatorSubsetOperation(project, vmds, getResources(project), ifileDeltaType, false, true); // false = do not force if there's no deltas to validate
+		forkOp3Changed.run(buffer.getProgressMonitor());
+		
+		// Wait until all of the threads have complete.
+		buffer.getProgressMonitor().subTask("Waiting for all forked threads to finish..."); //$NON-NLS-1$
+		while(!VThreadManager.getManager().isDone() && !buffer.getProgressMonitor().isCanceled()) {}
+		if(buffer.getProgressMonitor().isCanceled()) {
+			buffer.getProgressMonitor().subTask("Comparison cancelled. Performing cleanup."); //$NON-NLS-1$
+			return false;
+		}
+		buffer.getProgressMonitor().subTask("All threads are complete. Beginning the comparison."); //$NON-NLS-1$
+		
+		// Compare
+		IMarker[] markers = TaskListUtility.getValidationTasks(project, getValidatorMetaData().getValidatorNames());
+
+		// Now compare the IProject's result to the expected TestcaseMetaData result.
+		// Don't write _passed = _passed && get...
+		// When the _passed == false, then java didn't bother running the test.
+		passed = BVTRunner.singleton().verify(buffer, getName(), subTaskName, project, getMessages(ValidationTypeEnum.RUN_VALIDATION), markers);
+		
+		ResourcesPlugin.getWorkspace().deleteMarkers(markers);
+	
+		return passed;
+		
+	}
+}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/util/BVTRunner.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/util/BVTRunner.java
new file mode 100644
index 0000000..61a0580
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/util/BVTRunner.java
@@ -0,0 +1,684 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.validation.test.internal.util;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.logging.Level;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspaceRunnable;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jem.util.logger.proxy.Logger;
+import org.eclipse.jst.validation.test.BVTValidationException;
+import org.eclipse.jst.validation.test.BVTValidationPlugin;
+import org.eclipse.jst.validation.test.ValidationTypeEnum;
+import org.eclipse.jst.validation.test.internal.registry.BVTValidationRegistryReader;
+import org.eclipse.jst.validation.test.internal.registry.ITestcaseMetaData;
+import org.eclipse.jst.validation.test.internal.registry.MessageMetaData;
+import org.eclipse.jst.validation.test.internal.registry.MessageUtility;
+import org.eclipse.jst.validation.test.internal.registry.OperationTestcase;
+import org.eclipse.jst.validation.test.internal.registry.TestSetupImport;
+import org.eclipse.jst.validation.test.internal.registry.TestcaseUtility;
+import org.eclipse.jst.validation.test.internal.registry.ValidatorTestcase;
+import org.eclipse.jst.validation.test.setup.IBuffer;
+import org.eclipse.jst.validation.test.setup.ITestStatus;
+import org.eclipse.wst.validation.internal.InternalValidatorManager;
+import org.eclipse.wst.validation.internal.TaskListUtility;
+import org.eclipse.wst.validation.internal.VThreadManager;
+import org.eclipse.wst.validation.internal.ValidatorMetaData;
+import org.eclipse.wst.validation.internal.operations.OneValidatorOperation;
+import org.eclipse.wst.validation.internal.operations.ValidationOperation;
+import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
+
+/**
+ */
+public final class BVTRunner {
+	private static BVTRunner _inst = null;
+	private List _extra = null; // The extra markers reported (stored in a list to make reading easier).
+	private List _missing = null; // The missing MMD that were supposed to be reported (stored in a list to make reading easier).
+
+	public static BVTRunner singleton() {
+		if(_inst == null) {
+			_inst = new BVTRunner();
+		}
+		return _inst;
+	}
+	
+	private BVTRunner() {
+		super();
+		_extra = new ArrayList();
+		_missing = new ArrayList();
+	}
+	
+	private boolean isVerbose() {
+		Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+		if(logger.isLoggingLevel(Level.FINEST)) {
+			return true;
+		}
+		return false;
+	}
+
+	private char getSeverityChar(Integer severity) {
+		if(severity == null) {
+			return '?';
+		}
+		
+		switch(severity.intValue()) {
+			case(IMarker.SEVERITY_ERROR): {
+				return 'E';
+			}
+			
+			case(IMarker.SEVERITY_WARNING): {
+				return 'W';
+			}
+			
+			case(IMarker.SEVERITY_INFO): {
+				return 'I';
+			}
+			
+			default: {
+				return '?';
+			}
+		}
+	}
+	
+	private String[] getNames(IProject[] projects) {
+		if(projects == null) {
+			return new String[0];
+		}
+		String[] names = new String[projects.length];
+		for(int i=0; i<projects.length; i++) {
+			IProject project = projects[i];
+			names[i] = project.getName();
+		}
+		return names;
+	}
+
+	private void debug(IBuffer buffer, IMarker[] messages) {
+		if(messages == null) {
+			buffer.write("Nothing to debug because nothing was reported"); //$NON-NLS-1$
+		}
+		
+		for(int i=0; i<messages.length; i++) {
+			IMarker marker = messages[i];
+			buffer.write(MessageUtility.toString(marker));
+		}
+	}
+
+	protected IProgressMonitor getDebugMonitor(IProgressMonitor monitor) {
+		if(isVerbose()) {
+			return monitor;
+		}
+		else {
+			return new NullProgressMonitor(); // if verbose is true, show progress messages for the creation & validation of the project. Otherwise show only the BVT status.
+		}
+	}
+	
+	/**
+	 * When invoking the test from the UI, the input has already been imported, so just test it.
+	 * The name of the test is derived from the name of the project.
+	 * Return the number of tests that passed.
+	 */	
+	public int test(IBuffer buffer, IProject[] projects) throws BVTValidationException {	
+		String[] testNames = getNames(projects);
+		BVTValidationRegistryReader reader = BVTValidationRegistryReader.getReader();
+		
+		buffer.getProgressMonitor().beginTask("Running BVT tests", projects.length); //$NON-NLS-1$
+		int totalTests = 0;
+		int totalPassed = 0;
+		for(int i=0; i<projects.length; i++) {
+			buffer.getProgressMonitor().subTask("Testing project " + (i+1) + " of " + projects.length); //$NON-NLS-1$ //$NON-NLS-2$
+			IProject project = projects[i];
+			ValidatorTestcase[] tests = reader.getValidatorTests(buffer.getProgressMonitor(), testNames[i]);
+			if((tests == null) || (tests.length == 0)) {
+				buffer.getProgressMonitor().subTask("There are no tests to run."); //$NON-NLS-1$
+				continue;
+			}
+			
+			int numTestsPassed = 0;
+			for(int j=0; j<tests.length; j++) {
+				ValidatorTestcase tmd = tests[j];
+				if(test(buffer, project, tmd, ValidationTypeEnum.RUN_VALIDATION)) {
+					numTestsPassed++;
+					buffer.getProgressMonitor().subTask("Test " + (j+1) + " of " + tests.length + " passed."); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+				}
+				else {
+					buffer.getProgressMonitor().subTask("Test " + (j+1) + " of " + tests.length + " failed."); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+				}
+				buffer.getProgressMonitor().worked(1);
+			}
+			
+			totalTests += tests.length;
+			totalPassed += numTestsPassed;
+			
+			buffer.write(numTestsPassed + " of " + tests.length + " tests passed."); //$NON-NLS-1$ //$NON-NLS-2$
+		}
+		buffer.write("\n>>>>>>>>>>TEST RESULTS>>>>>>>>>>"); //$NON-NLS-1$
+		buffer.write(totalPassed + " of " + totalTests + " tests passed."); //$NON-NLS-1$ //$NON-NLS-2$
+		buffer.getProgressMonitor().done();
+		
+		return totalPassed;
+	}
+	
+	/**
+	 * Construct a ValidationOperation on the IProject, invoke the operation, and verify that the
+	 * resulting IMarkers match the expected messages in the tmd.
+	 */	
+	public boolean test(IBuffer buffer, IProject project, ValidatorTestcase tmd, int validationEnumType) throws BVTValidationException {
+		switch(validationEnumType) {
+			case(ValidationTypeEnum.RUN_VALIDATION): {
+				return test(buffer, tmd.getName(), ValidationTypeEnum.RUN_VALIDATION_NAME, tmd.getMessages(validationEnumType), new OneValidatorOperation(project, tmd.getValidatorClass(), true, false), InternalValidatorManager.getManager().getValidatorNames(new ValidatorMetaData[]{tmd.getValidatorMetaData()})); // true=force, false=no for
+			}
+			
+			case(ValidationTypeEnum.FULL_VALIDATION): {
+				return build(buffer, project, tmd, validationEnumType, ValidationTypeEnum.FULL_VALIDATION_NAME);
+			}
+			
+			case(ValidationTypeEnum.INCREMENTAL_VALIDATION): {
+				return build(buffer, project, tmd, validationEnumType, ValidationTypeEnum.INCREMENTAL_VALIDATION_NAME);
+			}
+			
+			case(ValidationTypeEnum.AUTO_VALIDATION): {
+				return build(buffer, project, tmd, validationEnumType, ValidationTypeEnum.AUTO_VALIDATION_NAME);
+			}
+			
+			default: {
+				buffer.addExecutionStatus(tmd.getName(), null, ITestStatus.FAIL, buffer, "Unrecognized validation option:" + validationEnumType); //$NON-NLS-1$
+				return false;
+			}
+		}
+	}
+	
+	private boolean build(IBuffer buffer, final IProject project, final ValidatorTestcase tmd, final int validationEnumType, String subTaskName) throws BVTValidationException {
+		try {
+			IProgressMonitor nullMonitor = new NullProgressMonitor();
+			ResourcesPlugin.getWorkspace().run(
+			new IWorkspaceRunnable(){
+				public void run(IProgressMonitor monitor) {
+					try {
+						IResource[] resources = tmd.getResources(project);
+						for(int i=0; i<resources.length; i++) {
+							IResource res = resources[i];
+							res.touch(monitor);
+						}
+					}
+					catch(CoreException exc) {
+						Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+						if(logger.isLoggingLevel(Level.SEVERE)) {
+							logger.write(exc);
+						}
+					}
+				}
+			}, nullMonitor);
+		}
+		catch(CoreException exc) {
+			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+			if(logger.isLoggingLevel(Level.SEVERE)) {
+				logger.write(exc);
+			}
+			buffer.addExecutionStatus(tmd.getName(), subTaskName, ITestStatus.FAIL, buffer, "CoreException caught; stack trace in LoggingUtil.log"); //$NON-NLS-1$
+			return false;
+		}
+
+		try {
+			// Do not build using only the validation builder because some validators
+			// (i.e., the EJB Validator) depend on the output of other builders 
+			// (i.e., the Java Builder).
+			project.build(validationEnumType, new NullProgressMonitor());
+		}
+		catch(CoreException exc) {
+			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+			if(logger.isLoggingLevel(Level.SEVERE)) {
+				logger.write(exc);
+			}
+			buffer.write("CoreException caught; stack trace in LoggingUtil.log"); //$NON-NLS-1$
+			return false;
+		}
+
+		IMarker[] messages = TaskListUtility.getValidationTasks(project, InternalValidatorManager.getManager().getValidatorNames(new ValidatorMetaData[]{tmd.getValidatorMetaData()}));
+		return verify(buffer, tmd.getName(), subTaskName, project, tmd.getMessages(validationEnumType), messages);
+	}
+	
+	/**
+	 * Run the given ValidationOperation and ensure that the results match the results of the given test case.
+	 * Return true if the results match and false if they don't.
+	 * 
+	 * This method is public because it's needed for the TestOpConstr operation.
+	 */
+	public boolean test(IBuffer buffer, String testName, String subTaskName, List expectedMessages, ValidationOperation op, String[] validatorNames) throws BVTValidationException {
+		IProgressMonitor debugMonitor = getDebugMonitor(buffer.getProgressMonitor());
+		boolean passed = true;
+		try {
+			
+			if(op == null) {
+				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+				if(logger.isLoggingLevel(Level.WARNING)) {
+					logger.write(Level.WARNING, "Cannot run tests because the Operation is null."); //$NON-NLS-1$
+				}
+				passed = false;
+			}
+			else {
+				try {
+						//ValidatorManager.getManager().setNoMessageLimit(op.getProject());
+					
+						ResourcesPlugin.getWorkspace().run(op, debugMonitor); 
+						
+						if(op.isFork()) {
+							// Wait until all forked threads are complete
+							while(!VThreadManager.getManager().isDone()){};
+						}
+			
+						// Load the enabled validators from the test, not the operation,
+						// because the test has the messages for a single validator, and
+						// if the messages from all enabled validators are retrieved,
+						// then "extra" messages, reported by validators whose messages
+						// aren't expected by the test, fail the test case. 
+						IMarker[] messages = TaskListUtility.getValidationTasks(op.getProject(), validatorNames);
+						passed = verify(buffer, testName, subTaskName, op.getProject(), expectedMessages, messages);
+				}
+				catch(Throwable exc) {
+					Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+					if(logger.isLoggingLevel(Level.SEVERE)) {
+						logger.write(Level.SEVERE, exc);
+					}
+					passed = false;
+				}
+			}
+		}
+		catch(Throwable exc) {
+			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+			if(logger.isLoggingLevel(Level.SEVERE)) {
+				logger.write(Level.SEVERE, exc);
+			}
+			passed = false;
+		}
+		return passed;
+	}
+
+	public boolean setupTests(IBuffer buffer, boolean verbose) {
+		ValidatorTestcase[] vts = BVTValidationRegistryReader.getReader().getValidatorTests(buffer.getProgressMonitor(), (String)null);
+		OperationTestcase[] ots = BVTValidationRegistryReader.getReader().getOperationTests(buffer.getProgressMonitor(), (String)null);
+		boolean successful = true;
+		for(int i=0; i<vts.length; i++) {
+			ValidatorTestcase vtest = vts[i];
+			successful = setupTests(buffer, vtest, false) && successful;
+		}
+		
+		for(int j=0; j<ots.length; j++) {
+			OperationTestcase otest = ots[j];
+			successful = setupTests(buffer, otest, false) && successful;
+		}
+		
+		return successful;
+	}
+	
+	/**
+	 * Return true if all of the test cases' input were found and imported.
+	 */
+	public boolean setupTests(IBuffer buffer, ITestcaseMetaData tmd, boolean verbose) {
+		int executionMap = 0x0;
+		boolean imported = true;
+		try {
+			BVTValidationRegistryReader reader = BVTValidationRegistryReader.getReader();
+	
+			// Each import operation deletes any project before it re-imports it.
+			String dir = TestcaseUtility.getInputDir(tmd);
+			TestSetupImport[] setup = reader.getTestSetup(buffer, dir, tmd, verbose);
+			if((setup == null) || (setup.length == 0)) {
+				String message = "Cannot import input that does not exist. Check that directory " + dir + " exists."; //$NON-NLS-1$ //$NON-NLS-2$ 
+				buffer.write(message);
+				executionMap |= 0x1;
+				imported = false;
+				ValidationPlugin.getPlugin().logMessage(IStatus.ERROR, message);
+			}
+			else {
+				buffer.getProgressMonitor().beginTask("Importing files; please wait...", setup.length); //$NON-NLS-1$
+				for(int i=0; i<setup.length; i++) {
+					buffer.getProgressMonitor().subTask("Importing file " + (i+1) + " of " + setup.length); //$NON-NLS-1$ //$NON-NLS-2$
+					if(!setup[i].importFile(buffer.getProgressMonitor(), dir)) {
+						// One of the input files couldn't be imported.
+						executionMap |= 0x2;
+						imported = false;
+						ValidationPlugin.getPlugin().logMessage(IStatus.ERROR, "Import failed for dir " + dir); //$NON-NLS-1$
+						continue;
+					}
+					buffer.getProgressMonitor().worked(1);
+				}
+				buffer.getProgressMonitor().done();
+			}
+		}
+		finally {
+			if(!imported) {
+				String tmdName = (tmd == null) ? "?" : tmd.getName(); //$NON-NLS-1$
+				ValidationPlugin.getPlugin().logMessage(IStatus.ERROR, 
+					"Test setup for " + tmdName + " was unsuccessful."); //$NON-NLS-1$ //$NON-NLS-2$
+			}
+		}
+		return imported;
+	}
+
+	/**
+	 * Return true if the expected messages (tmdMmdList) matches the reported messages (ml2).
+	 */
+	public boolean compare(IBuffer buffer, String testName, String subTaskName, List tmdMmdList, IMarker[] ml2) {
+		// Convert one of the arrays into a list so that it can be sorted.
+		int numMatched = 0;
+		List mmdList = new ArrayList(tmdMmdList); // create a copy of the tmd's expected output so that the tmd's output remains intact
+		int numExpected = mmdList.size();
+		int numReported = ml2.length;
+		boolean passed = true;
+	
+
+		try {		
+			Collections.sort(mmdList, MessageUtility.getMessageComparator(buffer, isVerbose()));
+	
+			try {
+				for(int i=0; i<ml2.length; i++) {
+					IMarker marker = ml2[i];
+					MessageMetaData matching = getMatchingMetaData(buffer, mmdList, marker);
+					if(matching == null) {
+						_extra.add(marker);
+						continue;
+					}
+					else {
+						// Every time a mmd is matched to a marker, remove the mmd
+						// from the list so that mmds without a marker can be flagged.
+						mmdList.remove(matching);
+						numMatched++;
+					}
+				}
+	
+				if(mmdList.size() != 0) {
+					_missing.addAll(mmdList);
+				}
+			}
+			catch(Throwable exc) {
+				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+				if(logger.isLoggingLevel(Level.SEVERE)) {
+					logger.write(Level.SEVERE, exc);
+				}
+				passed = false;
+			}
+			finally {
+				passed = passed && ((_missing.size() == 0) && (_extra.size() == 0));
+				
+				// Report the missing markers after the MMD list is sorted
+				Collections.sort(_missing, MessageUtility.getMessageComparator(buffer, isVerbose()));
+				Iterator iterator = _missing.iterator();
+				while(iterator.hasNext()) {
+					MessageMetaData mmd = (MessageMetaData)iterator.next();
+					buffer.addExecutionStatus(testName, subTaskName, ITestStatus.FAIL, buffer, "ERROR[missing message]: " + MessageUtility.toString(mmd)); //$NON-NLS-1$
+				}
+				
+				// Report the extra markers after they're sorted.
+				Collections.sort(_extra, MessageUtility.getMessageComparator(buffer, isVerbose()));
+				iterator = _extra.iterator();
+				while(iterator.hasNext()) {
+					IMarker marker = (IMarker)iterator.next();
+					buffer.addExecutionStatus(testName, subTaskName, ITestStatus.FAIL, buffer, "ERROR[extra message]: " + MessageUtility.toString(marker) + ", Text is: \"" + MessageUtility.getMessage(marker) + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+				}
+		
+				if(numExpected != numReported) {
+					buffer.write("Wrong number of messages reported. Expected " + numExpected + " and got " + numReported); //$NON-NLS-1$ //$NON-NLS-2$
+				}
+	
+				buffer.write("Number of extra messages: " + _extra.size()); //$NON-NLS-1$
+				buffer.write("Number of missing messages: " + _missing.size()); //$NON-NLS-1$
+				buffer.write("Number of matched messages: " + numMatched); //$NON-NLS-1$
+			}
+		}
+		finally {
+			mmdList.clear();
+			_extra.clear(); // Clear the list of extra markers (stored in a list to make reading easier).
+			_missing.clear(); // Clear the list of missing markers (stored in a list to make reading easier).
+		}
+		return passed;
+	}
+	
+	public boolean verify(IBuffer buffer, String testName, String subTaskName, IProject project, List mmdListOrig, IMarker[] messages) {
+		buffer.write("Test case: " + testName); //$NON-NLS-1$
+
+		int numMatched = 0;
+		int numExpected = 0;
+		int numReported = 0;
+		boolean passed = true;
+		List mmdList = new ArrayList(mmdListOrig); // Need to modify the list, but do not want to modify the original, so create a copy.
+		try {
+			// First, check that the number of messages match.
+			if(messages == null) {
+				passed = false;
+				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+				if(logger.isLoggingLevel(Level.INFO)) {
+					logger.write(Level.INFO, "No messages were reported."); //$NON-NLS-1$
+				}
+				return passed;
+			}
+			
+			numExpected = mmdList.size();
+			numReported = messages.length;
+			
+			Collections.sort(mmdList, MessageUtility.getMessageComparator(buffer, isVerbose()));
+
+			for(int i=0; i<messages.length; i++) {
+				IMarker marker = messages[i];
+				MessageMetaData mmd = getMatchingMetaData(buffer, mmdList, marker);
+	
+				if(mmd == null) {
+					_extra.add(marker);
+					continue;
+				}
+				else {
+					// Every time a mmd is matched to a marker, remove the mmd
+					// from the list so that mmds without a marker can be flagged.
+					mmdList.remove(mmd);
+					if(isVerbose()) {
+						buffer.write("matched " + MessageUtility.toString(marker) + " to " + MessageUtility.toString(mmd)); //$NON-NLS-1$ //$NON-NLS-2$
+					}
+					numMatched++;
+				}
+				
+				// Check severity
+				try {
+					// Fail a test case based on severity mismatch because EJB deploy
+					// relies on the severity to determine whether or not deployment
+					// can continue?
+					verifySeverity(buffer, testName, subTaskName, mmd, marker);
+				}
+				catch(CoreException e) {
+					passed = false;
+					Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+					if(logger.isLoggingLevel(Level.SEVERE)) {
+						logger.write(Level.SEVERE, e);
+					}
+					buffer.write("ERROR[Testcase::" + testName + "]. CoreException caught while verifying severity"); //$NON-NLS-1$ //$NON-NLS-2$
+					continue;
+				}
+				
+				// Check resource
+				try {
+					// Don't fail a test case based on resource, because the "location" column will
+					// uniquely identify the location of the message, anyway. Should still let the 
+					// user know, though.
+					verifyResource(buffer, testName, subTaskName, mmd, marker);
+				}
+				catch(CoreException e) {
+					passed = false;
+					buffer.write("ERROR[Testcase::" + testName + "]. CoreException caught while verifying resource"); //$NON-NLS-1$ //$NON-NLS-2$
+					Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+					if(logger.isLoggingLevel(Level.SEVERE)) {
+						logger.write(Level.SEVERE, e);
+					}
+					continue;
+				}
+				
+				// Check location
+				try {
+					// Don't fail a test case based on location, because the line number calculation
+					// is different in UI & batch, and the test cases are based on UI test results.
+					// Should still alert the user, though.
+					verifyLocation(buffer, testName, subTaskName,  mmd, marker);
+				}
+				catch(CoreException e) {
+					passed = false;
+					Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+					if(logger.isLoggingLevel(Level.SEVERE)) {
+						logger.write(Level.SEVERE, e);
+					}
+					buffer.write("ERROR[Testcase::" + testName + "]. CoreException caught while verifying line number"); //$NON-NLS-1$ //$NON-NLS-2$
+					continue;
+				}
+			}
+			
+			if(mmdList.size() != 0) {
+				_missing.addAll(mmdList);
+			}
+		}
+		catch(Throwable exc) {
+			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+			if(logger.isLoggingLevel(Level.SEVERE)) {
+				logger.write(Level.SEVERE, exc);
+			}
+			passed = false;
+		}
+		finally {
+			if(!((_missing.size() == 0) && (_extra.size() == 0))) {
+				passed = false;
+			}
+			
+			if(passed) {
+				buffer.write("PASS[Testcase::" + testName + "]"); //$NON-NLS-1$ //$NON-NLS-2$
+				buffer.addExecutionStatus(testName, subTaskName, true); // If fail, will be reported in the extra & missing below.
+			}
+			else {
+				buffer.write("FAIL[Testcase::" + testName + "]"); //$NON-NLS-1$ //$NON-NLS-2$
+
+				// No point in listing the mmdList because it's empty by the time the finally block is reached
+				if(isVerbose()) {
+					buffer.write("List of markers reported:"); //$NON-NLS-1$
+					debug(buffer, messages);
+				}
+			}
+			
+			// Report the missing markers after the MMD list is sorted
+			Collections.sort(_missing, MessageUtility.getMessageComparator(buffer, isVerbose()));
+			Iterator iterator = _missing.iterator();
+			while(iterator.hasNext()) {
+				MessageMetaData mmd = (MessageMetaData)iterator.next();
+				buffer.addExecutionStatus(testName, subTaskName, ITestStatus.FAIL, buffer, "ERROR[missing message]: " + MessageUtility.toString(mmd)); //$NON-NLS-1$
+			}
+			
+			// Report the extra markers after they're sorted.
+			Collections.sort(_extra, MessageUtility.getMessageComparator(buffer, isVerbose()));
+			iterator = _extra.iterator();
+			while(iterator.hasNext()) {
+				IMarker marker = (IMarker)iterator.next();
+				buffer.addExecutionStatus(testName, subTaskName, ITestStatus.FAIL, buffer, "ERROR[extra message]: " + MessageUtility.toString(marker) + ", Text is: \"" + MessageUtility.getMessage(marker) + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+			}
+	
+			if(numExpected != numReported) {
+				buffer.write("Wrong number of messages reported. Expected " + numExpected + " and got " + numReported); //$NON-NLS-1$ //$NON-NLS-2$
+			}
+
+			buffer.write("Number of extra messages: " + _extra.size()); //$NON-NLS-1$
+			buffer.write("Number of missing messages: " + _missing.size()); //$NON-NLS-1$
+			buffer.write("Number of matched messages: " + numMatched); //$NON-NLS-1$
+			buffer.write("End of test case: " + testName); //$NON-NLS-1$
+			_extra.clear(); // Clear the list of extra markers (stored in a list to make reading easier).
+			_missing.clear(); // Clear the list of missing markers (stored in a list to make reading easier).
+		}
+		return passed;
+	}
+	
+	private int verifySeverity(IBuffer buffer, String testName, String subTaskName, MessageMetaData mmd, IMarker marker) throws CoreException {
+		// If prefixSeverity is null, marker has no prefix, therefore it has no severity
+		Integer prefixSeverity = MessageUtility.getSeverity(marker);
+		if(prefixSeverity != null) {
+			Integer severity = (Integer)marker.getAttribute(IMarker.SEVERITY); // IMarker.SEVERITY_ERROR, IMarker.SEVERITY_WARNING, IMarker.SEVERITY_INFO
+			boolean severityEqual = true;
+			if((severity == null) && (prefixSeverity == null)) {
+				severityEqual = true;
+			}
+			else if(severity == null) {
+				severityEqual = false;
+			}
+			else if(prefixSeverity == null) {
+				severityEqual = false;
+			}
+			else {
+				severityEqual = severity.equals(prefixSeverity);
+			}
+			
+			if(!severityEqual) {
+				buffer.addExecutionStatus(testName, subTaskName, ITestStatus.WARN, buffer, "WARNING[mismatching severity]: expected " + getSeverityChar(prefixSeverity) + ", got " + getSeverityChar(severity) + " on marker " + MessageUtility.toString(marker)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+				return ITestStatus.WARN;
+			}
+		}
+			
+		return ITestStatus.PASS;
+	}
+	
+	private int verifyResource(IBuffer buffer, String testName, String subTaskName, MessageMetaData mmd, IMarker marker) throws CoreException {
+		String resource = MessageUtility.getResource(marker);
+		if(!resource.equals(mmd.getResource())) {
+			buffer.addExecutionStatus(testName, subTaskName, ITestStatus.WARN, buffer, "INFO[wrong resource]: expected " + mmd.getResource() + ", got " + resource + " on marker " + MessageUtility.toString(marker)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+			return ITestStatus.WARN;
+		}
+		return ITestStatus.PASS;
+	}
+	
+	private int verifyLocation(IBuffer buffer, String testName, String subTaskName, MessageMetaData mmd, IMarker marker) throws CoreException {
+		// Either compare two line numbers or two text locations, but not a line number to a text location.
+		if(mmd.isSetLineNumber()) {
+			Integer lineNumber = MessageUtility.getLineNumber(marker);
+			if(lineNumber == null) {
+				// Marker has a text location, not a line number.
+				return ITestStatus.PASS;
+			}
+			
+			if(lineNumber.intValue() != mmd.getLineNumber()) {
+				buffer.addExecutionStatus(testName, subTaskName, ITestStatus.WARN, buffer, "INFO[wrong location]: expected " + mmd.getLineNumber() + ", got " + lineNumber + " on marker " + MessageUtility.toString(marker)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+				return ITestStatus.WARN;
+			}
+		}
+		else if(mmd.isSetLocation()) {
+			String location = MessageUtility.getLocation(marker);
+			if(location == null) {
+				// marker has a line number, not a text location
+				return ITestStatus.PASS;
+			}
+			
+			if(!(mmd.getLocation().equals(location))) {
+				buffer.addExecutionStatus(testName, subTaskName, ITestStatus.WARN, buffer, "INFO[wrong location]: expected " + mmd.getLocation() + ", got " + location + " on marker " + MessageUtility.toString(marker)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+				return ITestStatus.WARN;
+			}
+		}
+		
+		return ITestStatus.PASS;
+	}
+	
+	
+	private MessageMetaData getMatchingMetaData(IBuffer buffer, List mmdList, IMarker marker) {
+		int result = Collections.binarySearch(mmdList, marker, MessageUtility.getMessageComparator(buffer, isVerbose()));
+		if(result < 0) {
+			return null;
+		}
+		return (MessageMetaData)mmdList.get(result);
+	}
+}
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/util/BVTValidationUtility.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/util/BVTValidationUtility.java
new file mode 100644
index 0000000..beff0ed
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/util/BVTValidationUtility.java
@@ -0,0 +1,253 @@
+/*
+ * (c) Copyright 2001 MyCorporation.
+ * All Rights Reserved.
+ */
+package org.eclipse.jst.validation.test.internal.util;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jst.validation.test.BVTValidationException;
+import org.eclipse.jst.validation.test.BVTValidationPlugin;
+import org.eclipse.jst.validation.test.internal.registry.BVTValidationRegistryReader;
+import org.eclipse.jst.validation.test.internal.registry.ITestcaseMetaData;
+import org.eclipse.jst.validation.test.internal.registry.OperationTestcase;
+import org.eclipse.jst.validation.test.internal.registry.TestcaseUtility;
+import org.eclipse.jst.validation.test.internal.registry.ValidatorTestcase;
+import org.eclipse.wst.validation.internal.ConfigurationConstants;
+import org.eclipse.wst.validation.internal.ValidationRegistryReader;
+import org.eclipse.wst.validation.internal.ValidatorMetaData;
+
+/**
+ * @version 	1.0
+ * @author
+ */
+public final class BVTValidationUtility {
+	private BVTValidationUtility() {
+	}
+	
+	public static ValidatorMetaData getValidatorMetaData(IMarker marker) {
+		String validatorClassName = null;
+		try {
+			validatorClassName = marker.getAttribute(ConfigurationConstants.VALIDATION_MARKER_OWNER).toString();
+			ValidatorMetaData vmd = ValidationRegistryReader.getReader().getValidatorMetaData(validatorClassName);
+			return vmd;
+		}
+		catch (CoreException exc) {
+		}
+		return null;		
+	}
+	
+	private static IMarker[] getValidationTasks(IResource resource) {
+		try {
+			IMarker[] allMarkers = resource.findMarkers(ConfigurationConstants.VALIDATION_MARKER, false, IResource.DEPTH_INFINITE); // false means only consider PROBLEM_MARKER, not variants of PROBLEM_MARKER. Since addTask only adds PROBLEM_MARKER, we don't need to consider its subtypes.
+			return allMarkers;
+		}
+		catch (CoreException exc) {
+			return null;
+		}
+	}
+	
+	public static void removeAllValidationMarkers() {
+		IWorkspace workspace = ResourcesPlugin.getWorkspace();
+		IWorkspaceRoot root = workspace.getRoot();
+		IMarker[] markers = getValidationTasks(root);
+		if(markers != null) {
+			try {
+				workspace.deleteMarkers(markers);
+			}
+			catch(CoreException e) {
+			}
+		}
+	}
+
+	public static String getProjectName(File file) {
+		String fileName = file.getName();
+		int extIndex = fileName.indexOf('.');
+		if(extIndex > 0) {
+			return fileName.substring(0, extIndex);
+		}
+		else {
+			return fileName;
+		}
+	}
+
+	public static String getQualifiedLogName(String logFileName) {
+		String dir = BVTValidationPlugin.getPlugin().getStateLocation().toOSString();
+		File dirWithFile = new File(dir, logFileName);
+		return dirWithFile.toString();
+	}
+	
+	public static IProject[] getProjects(ITestcaseMetaData[] tmds) {
+		List sortedList = new ArrayList();
+		for(int i=0; i<tmds.length; i++) {
+			IProject p = TestcaseUtility.findProject(tmds[i]);
+			if((p != null) && (p.exists()) && (p.isOpen()) && !sortedList.contains(p)) {
+				sortedList.add(p);
+			}
+		}
+		Collections.sort(sortedList, new Comparator() {
+			public int compare(Object a, Object b){
+				if((a == null) && (b == null)) {
+					return 0;
+				}
+				else if(a == null) {
+					return 1;
+				}
+				else if(b == null) {
+					return -1;
+				}
+			
+				if((a instanceof IProject) && (b instanceof IProject)) {
+					return ((IProject)a).getName().compareTo(((IProject)b).getName());
+				}
+				
+				return -1; // should never reach here...both Objects should always be IProjects
+			}
+		});
+		IProject[] result = new IProject[sortedList.size()];
+		sortedList.toArray(result);
+		return result;
+	}
+
+	public static ITestcaseMetaData[] getTests(ITestcaseMetaData[] tmds, IProject p) {
+		ITestcaseMetaData[] temp = new ITestcaseMetaData[tmds.length];
+		int count = 0;
+		for(int i=0; i<tmds.length; i++) {
+			ITestcaseMetaData tmd = tmds[i];
+			if(tmd.getProjectName().equals(p.getName())) {
+				temp[count++] = tmd;
+			}
+		}
+		
+		ITestcaseMetaData[] result = new ITestcaseMetaData[count];
+		System.arraycopy(temp, 0, result, 0, count);
+		return result;
+	}
+
+	/**
+	 * Return the total number of validator tests.
+	 */	
+	public static int numValidatorTests(IProgressMonitor monitor, IProject[] projects) throws BVTValidationException {	
+		BVTValidationRegistryReader reader = BVTValidationRegistryReader.getReader();
+		
+		int totalTests = 0;
+		for(int i=0; i<projects.length; i++) {
+			IProject project = projects[i];
+			ValidatorTestcase[] tests = reader.getValidatorTests(monitor, project);
+			if((tests == null) || (tests.length == 0)) {
+				continue;
+			}
+			
+			totalTests += tests.length;
+		}
+		
+		return totalTests;
+	}
+	
+	/**
+	 * Return all public (visible) test cases for a particular project.
+	 */
+	public static ValidatorTestcase[] getValidatorTests(IProgressMonitor monitor, IProject[] projects) {
+		Set testSet = new HashSet();		
+		for(int i=0; i<projects.length; i++) {
+			IProject project = projects[i];
+			ValidatorTestcase[] tests = getValidatorTests(monitor, project);
+			if(tests.length == 0) {
+				continue;
+			}
+			
+			for(int j=0; j<tests.length; j++) {
+				ValidatorTestcase vt = tests[j];
+				testSet.add(vt);
+			}
+		}
+		
+		ValidatorTestcase[] result = new ValidatorTestcase[testSet.size()];
+		testSet.toArray(result);
+		return result;
+	}
+
+	/**
+	 * Return all visible validator test cases for a project.
+	 */
+	public static ValidatorTestcase[] getValidatorTests(IProgressMonitor monitor, IProject project) {
+		BVTValidationRegistryReader reader = BVTValidationRegistryReader.getReader();
+
+		ValidatorTestcase[] tests = reader.getValidatorTests(monitor, project);
+		if(tests == null) {
+			return new ValidatorTestcase[0];
+		}
+		
+		return tests;
+	}
+
+	/**
+	 * Return all of the tests.
+	 */
+	public static OperationTestcase[] getOperationTests(IProgressMonitor monitor) {
+		return BVTValidationRegistryReader.getReader().getOperationTests(monitor, (String)null);
+	}
+	
+	public static OperationTestcase[] getOperationTests(IProgressMonitor monitor, IProject project) {
+		BVTValidationRegistryReader reader = BVTValidationRegistryReader.getReader();
+
+		OperationTestcase[] tests = reader.getOperationTests(monitor, project);
+		if(tests == null) {
+			return new OperationTestcase[0];
+		}
+		
+		return tests;
+	}
+
+	/**
+	 * Return all of the tests.
+	 */
+	public static ValidatorTestcase[] getValidatorTests(IProgressMonitor monitor) {
+		return BVTValidationRegistryReader.getReader().getValidatorTests(monitor, (String)null);
+	}
+	
+	/**
+	 * Return all of the tests, visible and invisible, owned by the validator metadata.
+	 */
+	public static ValidatorTestcase[] getValidatorTests(IProgressMonitor monitor, ValidatorMetaData vmd) {
+		ValidatorTestcase[] allTests = BVTValidationRegistryReader.getReader().getValidatorTests(monitor, (String)null);
+		ValidatorTestcase[] temp = new ValidatorTestcase[allTests.length];
+		int count = 0;
+		for(int i=0; i<allTests.length; i++) {
+			ValidatorTestcase testvmd = allTests[i];
+			if(vmd.equals(testvmd.getValidatorMetaData())) {
+				temp[count++] = testvmd;
+			}
+		}
+		ValidatorTestcase[] result = new ValidatorTestcase[count];
+		System.arraycopy(temp, 0, result, 0, count);
+		return result;
+	}
+	
+	public static ValidatorMetaData[] getValidatorsThatHaveTests(IProgressMonitor monitor) {
+		ValidatorTestcase[] tests = getValidatorTests(monitor);
+		Set temp = new HashSet();
+		for(int i=0; i<tests.length; i++) {
+			ValidatorTestcase vt = tests[i];
+			temp.add(vt.getValidatorMetaData());
+		}
+		
+		ValidatorMetaData[] vmds = new ValidatorMetaData[temp.size()];
+		temp.toArray(vmds);
+		return vmds;
+	}
+}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/util/BuildInfo.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/util/BuildInfo.java
new file mode 100644
index 0000000..1b612aa
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/util/BuildInfo.java
@@ -0,0 +1,7 @@
+package org.eclipse.jst.validation.test.internal.util;
+public class BuildInfo {
+  public static final String copyright = "Licensed Materials -- Property of IBM\n(c) Copyright International Business Machines Corporation, 2001,2003\nUS Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp.";
+  public static final String fgBuildLevel = "20031112_1915-WB212-AD-V511D-W5";
+  public static String level() { return fgBuildLevel; }
+  public static String getWSABuildLevel() { return fgBuildLevel; }
+}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/util/RunTestsOperation.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/util/RunTestsOperation.java
new file mode 100644
index 0000000..8b2b032
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/internal/util/RunTestsOperation.java
@@ -0,0 +1,46 @@
+package org.eclipse.jst.validation.test.internal.util;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jst.validation.test.internal.registry.ITestcaseMetaData;
+import org.eclipse.jst.validation.test.setup.IBuffer;
+
+
+/**
+ * Run the BVT of the validator: a full test, an incremental test,
+ * and an asynchronous test, if applicable.
+ * 
+ * This class must NOT be wrapped in an IWorkspaceRunnable or 
+ * there will be deadlock during the asynchronous validation test!
+ * (Read the comment above VThreadManager::isDone() for details.)
+ */
+public class RunTestsOperation {
+	private static RunTestsOperation _inst = null;
+	
+	private RunTestsOperation() {
+	}
+	
+	public static RunTestsOperation singleton() {
+		if(_inst == null) {
+			_inst = new RunTestsOperation();
+		}
+		return _inst;
+	}
+	
+	/**
+	 * @see org.eclipse.core.resources.IWorkspaceRunnable#run(IProgressMonitor)
+	 */
+	public void run(IBuffer buffer, ITestcaseMetaData[] allTmds) {
+		IProject[] projects = BVTValidationUtility.getProjects(allTmds);
+		for(int i=0; i<projects.length; i++) {
+			IProject project = projects[i];
+			ITestcaseMetaData[] tmds = BVTValidationUtility.getTests(allTmds, project);
+			
+			for(int j=0; j<tmds.length; j++) {
+				ITestcaseMetaData tmd = tmds[j];
+				tmd.run(buffer, project);
+			}
+		}
+	}
+	
+
+}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/setup/AImportOperation.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/setup/AImportOperation.java
new file mode 100644
index 0000000..14128b4
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/setup/AImportOperation.java
@@ -0,0 +1,95 @@
+package org.eclipse.jst.validation.test.setup;
+
+import java.io.File;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jst.validation.test.BVTValidationPlugin;
+import org.eclipse.jst.validation.test.internal.util.BVTValidationUtility;
+import org.eclipse.wst.validation.ValidationFramework;
+import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
+
+/**
+ * Abstract class that provides some of the functionality required to create
+ * a project and populate it with the contents of a file.
+ */
+public abstract class AImportOperation implements IImportOperation {
+	private void preRun(IProgressMonitor monitor) {
+		ValidationFramework.getDefault().suspendAllValidation(true);
+	}
+	
+	private void postRun(IProgressMonitor monitor) {
+		ValidationFramework.getDefault().suspendAllValidation(false);
+	}
+	
+	protected void deleteOldProject(IProgressMonitor monitor, String projectName) {
+		// delete any existing project of this name
+		IProject existingProject = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
+		if (existingProject.exists()) {
+			try {
+				existingProject.delete(true, null); // null=no progress mon (don't scare users)
+			}
+			catch (CoreException exc) {
+				BVTValidationPlugin.getPlugin().handleException(exc);
+			}
+		}
+	}
+	
+	public boolean run(IProgressMonitor monitor, File file) {
+		boolean imported = true;
+		int executionMap = 0x0;
+		IProject project = null;
+		try {
+			if(monitor == null) {
+				monitor = new NullProgressMonitor();
+			}
+			
+			preRun(monitor);
+			
+			try {
+				String projectName = BVTValidationUtility.getProjectName(file);
+				deleteOldProject(monitor, projectName);
+				project = createNewProject(monitor, projectName, file);
+				
+				if((project == null) || (!project.isAccessible())) {
+					executionMap |= 0x1;
+					imported = false;
+					String message = "Cannot import file because IProject is null or not accessible."; //$NON-NLS-1$
+					monitor.subTask(message);
+					ValidationPlugin.getPlugin().logMessage(IStatus.ERROR, message);
+				}
+				else {				
+					imported = importFile(monitor, project, file);
+					executionMap |= 0x2;
+				}
+			}
+			catch (Throwable exc) {
+				executionMap |= 0x4;
+				imported = false;
+				ValidationPlugin.getPlugin().handleException(exc);
+			}
+			finally {
+				postRun(monitor);
+			}
+		}
+		finally {
+			if(!imported) {
+				String projectName = (project == null) ? file.getName() : project.getName();
+				ValidationPlugin.getPlugin().logMessage(IStatus.ERROR, 
+					"AImportOperation for " + projectName + " was unsuccessful."); //$NON-NLS-1$ //$NON-NLS-2$
+			}
+		}
+		return imported;
+	}
+	
+	protected abstract IProject createNewProject(IProgressMonitor monitor, String projectName, File inputFile);
+	
+	/**
+	 * Return true if the file was imported successfully.
+	 */
+	protected abstract boolean importFile(IProgressMonitor monitor, IProject project, File file);
+}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/setup/BuildInfo.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/setup/BuildInfo.java
new file mode 100644
index 0000000..745dcbe
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/setup/BuildInfo.java
@@ -0,0 +1,7 @@
+package org.eclipse.jst.validation.test.setup;
+public class BuildInfo {
+  public static final String copyright = "Licensed Materials -- Property of IBM\n(c) Copyright International Business Machines Corporation, 2001,2003\nUS Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp.";
+  public static final String fgBuildLevel = "20031112_1915-WB212-AD-V511D-W5";
+  public static String level() { return fgBuildLevel; }
+  public static String getWSABuildLevel() { return fgBuildLevel; }
+}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/setup/CheckForUntestedPropertiesOperation.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/setup/CheckForUntestedPropertiesOperation.java
new file mode 100644
index 0000000..99c7239
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/setup/CheckForUntestedPropertiesOperation.java
@@ -0,0 +1,142 @@
+package org.eclipse.jst.validation.test.setup;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.List;
+import java.util.logging.Level;
+
+import org.eclipse.core.resources.IWorkspaceRunnable;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPluginDescriptor;
+import org.eclipse.core.runtime.IPluginRegistry;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jst.validation.sample.parser.PropertyLine;
+import org.eclipse.jst.validation.sample.workbenchimpl.PluginPropertyFile;
+import org.eclipse.jst.validation.test.BVTValidationPlugin;
+import org.eclipse.jst.validation.test.ValidationTypeEnum;
+import org.eclipse.jst.validation.test.internal.registry.MessageUtility;
+import org.eclipse.jst.validation.test.internal.registry.ValidatorTestcase;
+import org.eclipse.jst.validation.test.internal.util.BVTValidationUtility;
+import org.eclipse.wst.validation.internal.ValidatorMetaData;
+/**
+ * Generate a FVT test case for every EJB Validator validation marker on each
+ * selected project.
+ */
+public final class CheckForUntestedPropertiesOperation implements IWorkspaceRunnable {
+	private ValidatorMetaData _vmd = null;
+	private IBuffer _buffer = null;
+	private String _resourceBundleName = null;
+	public CheckForUntestedPropertiesOperation(IBuffer buffer, ValidatorMetaData vmd, String resourceBundleName) {
+		setValidatorMetaData(vmd);
+		setBuffer(buffer);
+		setResourceBundleName(resourceBundleName);
+	}
+	public IBuffer getBuffer() {
+		return _buffer;
+	}
+	void setBuffer(IBuffer b) {
+		_buffer = b;
+	}
+	public ValidatorMetaData getValidatorMetaData() {
+		return _vmd;
+	}
+	private String getPluginId(ValidatorMetaData vmd) {
+		try {
+			// TODO Remove this hack once a getter has been added to ValidatorMetaData for its pluginId.
+			if (vmd != null) {
+				ClassLoader cl = vmd.getValidator().getClass().getClassLoader();
+				IPluginRegistry registry = Platform.getPluginRegistry();
+				IPluginDescriptor[] descriptors = registry.getPluginDescriptors();
+				for (int i = 0; i < descriptors.length; i++) {
+					IPluginDescriptor desc = descriptors[i];
+					if (desc.getPluginClassLoader().equals(cl)) {
+						return desc.getUniqueIdentifier();
+					}
+				}
+			}
+		} catch (InstantiationException exc) {
+			BVTValidationPlugin.getPlugin().handleException(exc);
+		}
+		return null;
+	}
+	void setValidatorMetaData(ValidatorMetaData vmd) {
+		_vmd = vmd;
+	}
+	public String getResourceBundleName() {
+		return _resourceBundleName;
+	}
+	void setResourceBundleName(String name) {
+		_resourceBundleName = name;
+	}
+	/**
+	 * @see org.eclipse.core.resources.IWorkspaceRunnable#run(IProgressMonitor)
+	 */
+	public void run(IProgressMonitor monitor) throws CoreException {
+		List pLines = null;
+		List untestedLines = new ArrayList();
+		List testedLines = new ArrayList();
+		Comparator comparator = MessageUtility.getMessagePrefixComparator();
+		// Assume that the BVT tests were run on the projects before this menu
+		// action was clicked.
+		// Load and parse the .properties file to know what message ids to look
+		// for.
+		String propFileName = getResourceBundleName();
+		ValidatorMetaData vmd = getValidatorMetaData();
+		monitor.subTask("Attempting to load file: " + propFileName); //$NON-NLS-1$
+		String pluginId = getPluginId(vmd);
+		if (pluginId == null) {
+			String msg = "Cannot load plugin id for validator " + vmd.getValidatorDisplayName();//$NON-NLS-1$	
+			monitor.subTask(msg); 		
+			BVTValidationPlugin.getPlugin().log(Level.SEVERE, msg); 
+			return;
+		}
+		PluginPropertyFile pFile = new PluginPropertyFile(pluginId, propFileName);
+		monitor.worked(1);
+		monitor.subTask("Parsing."); //$NON-NLS-1$
+		pLines = pFile.getPropertyLines();
+		Collections.sort(pLines, comparator); // false = no verbose output
+		monitor.worked(1);
+		monitor.subTask("Loading test messages."); //$NON-NLS-1$
+		ValidatorTestcase[] tmds = BVTValidationUtility.getValidatorTests(monitor, vmd);
+		for (int k = 0; k < tmds.length; k++) {
+			ValidatorTestcase tmd = tmds[k];
+			List mssg = tmd.getMessages(ValidationTypeEnum.RUN_VALIDATION);
+			testedLines.addAll(mssg);
+		}
+		Collections.sort(testedLines, comparator);
+		monitor.subTask("Comparing."); //$NON-NLS-1$
+		Iterator iterator = pLines.iterator();
+		while (iterator.hasNext()) {
+			if (monitor.isCanceled()) {
+				return;
+			}
+			PropertyLine line = (PropertyLine)iterator.next();
+			int index = Collections.binarySearch(testedLines, line, comparator);
+			if (index < 0) {
+				// not found.
+				untestedLines.add(line);
+			}
+		}
+		monitor.worked(1);
+		// now see if the list of untested lines has entries.
+		Collections.sort(untestedLines, comparator);
+		Iterator untestediterator = untestedLines.iterator();
+		if (untestediterator.hasNext()) {
+			getBuffer().write("List of messages which are not tested (" + untestedLines.size() + " of " + pLines.size() + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		} else {
+			getBuffer().write("All messages are tested."); //$NON-NLS-1$
+		}
+		while (untestediterator.hasNext()) {
+			if (monitor.isCanceled()) {
+				return;
+			}
+			PropertyLine line = (PropertyLine)untestediterator.next();
+			getBuffer().write(line.toString());
+		}
+		untestedLines.clear(); // clear the list for the next project
+		testedLines.clear();
+		monitor.worked(1);
+	}
+}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/setup/IBuffer.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/setup/IBuffer.java
new file mode 100644
index 0000000..2d0bc81
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/setup/IBuffer.java
@@ -0,0 +1,53 @@
+package org.eclipse.jst.validation.test.setup;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+
+/**
+ * If information needs to be reported to the user, but that information is long,
+ * and the user needs to see it all at the same time (e.g., test case results),
+ * then the information is reported to implementations of this class. 
+ * Implementations can choose to report the information immediately 
+ * (e.g., to System.out), or can append each message, and report the message
+ * only once everything is complete. 
+ */
+public interface IBuffer extends ITestStatus {
+	/**
+	 * Return the progress monitor that is used for reporting progress
+	 * status as the long-running process executes.
+	 */
+	public IProgressMonitor getProgressMonitor();
+	
+	/**
+	 * Display the message to the user; the buffer implementation may 
+	 * display the message immediately, or may display the message only
+	 * when report() is called.
+	 */
+	public void write(String message);
+	
+	/**
+	 * Between one task and the next, usually between test cases, add a delineating
+	 * mark to show the beginning and end of each task clearly. The parameter 
+	 * passed in, taskName, is the name of the task that is ending.
+	 */
+	public void delineate(String taskName);
+		
+	/**
+	 * If information was not reported immediately, calling this method
+	 * forces the buffer to be reported to the user. The contents of the
+	 * buffer are not cleared; a subseqent call to this method will 
+	 * repeat what has been reported before. Any calls to elapsedTime
+	 * will be reported.
+	 */
+	public void report();
+	
+	/**
+	 * Clear any stored messages from the buffer, but not any elapsedTime 
+	 * numbers from the store.
+	 */
+	public void clear();
+	
+	/**
+	 * Return the fully-qualified name of the log file, or null if none.
+	 */
+	public String getLogFileName();
+}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/setup/IImportOperation.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/setup/IImportOperation.java
new file mode 100644
index 0000000..31d0d05
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/setup/IImportOperation.java
@@ -0,0 +1,30 @@
+package org.eclipse.jst.validation.test.setup;
+
+import java.io.File;
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+
+/**
+ * All validation FVT tests must provide an IImportOperation implementation
+ * to import the input file.
+ */
+public interface IImportOperation {
+	/**
+	 * Runs this operation without forcing a UI dependency. Return true if the file
+	 * was found and imported successfully.
+	 *
+	 * @param monitor the progress monitor to use to display progress and receive
+	 *   requests for cancelation
+	 * @param inputFile the file which needs to be imported into the workbench
+	 * @exception InvocationTargetException if the run method must propagate a checked exception,
+	 * 	it should wrap it inside an <code>InvocationTargetException</code>; runtime exceptions are automatically
+	 *  wrapped in an <code>InvocationTargetException</code> by the calling context
+	 * @exception InterruptedException if the operation detects a request to cancel, 
+	 *  using <code>IProgressMonitor.isCanceled()</code>, it should exit by throwing 
+	 *  <code>InterruptedException</code>
+	 *
+	 * @see IRunnableWithProgress
+	 */
+	public boolean run(IProgressMonitor monitor, File inputFile) throws InvocationTargetException, InterruptedException;
+}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/setup/ITestStatus.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/setup/ITestStatus.java
new file mode 100644
index 0000000..ba2b936
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/setup/ITestStatus.java
@@ -0,0 +1,56 @@
+package org.eclipse.jst.validation.test.setup;
+
+/**
+ * Instances of this interface track the execution of a test case,
+ * and are used to report a summary of the execution of all of the
+ * test cases at the end of a set of test runs.
+ */
+public interface ITestStatus {
+	public final int PASS = 0;
+	public final int WARN = 1;
+	public final int FAIL = 2;
+	
+	/**
+	 * To track how long a task takes, call this method with a unique name
+	 * of the task. If the task already exists, the elapsedTime is added
+	 * to the existing time.
+	 */
+	public void addElapsedTime(String taskName, long elapsedTime);
+	
+	/**
+	 * If pass is true, PASS is used; if pass is false, FAIL is used.
+	 */
+	public void addExecutionStatus(String testPassName, boolean pass);
+	
+	/**
+	 * If pass is true, PASS is used; if pass is false, FAIL is used.
+	 * While still considered part of test case "testPassName", this 
+	 * splits this part of the test case into a section named "subTaskName".
+	 */
+	public void addExecutionStatus(String testPassName, String subTaskName, boolean pass);
+	
+	/**
+	 * As each test is executed, this method is used to track how many of that
+	 * type of test pass or fail. passOrFail can be one of three values: PASS, WARN, or FAIL.
+	 * If value is PASS, then the test case passes, and no message needs to be displayed to the user.
+	 * If value is WARN, then the test case passes, and a warning message must be displayed to the user.
+	 * If value is FAIL, then the test case fails, and a failure message must be displayed to the user.
+	 */
+	public void addExecutionStatus(String testcaseName, String subTaskName, int passOrFail, IBuffer buffer, String message);
+	
+	/**
+	 * Return true if all of the test cases run so far have passed; otherwise
+	 * return false. If no test cases have run, return true.
+	 */
+	public boolean isSuccessful();
+	
+	/**
+	 * Return true if a particular test case passed.
+	 */
+	public boolean isSuccessful(String testName);
+	
+	/**
+	 * Reset all variables to the default value to prepare this test status for reuse.
+	 */
+	public void clear();
+}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/setup/JARImportOperation.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/setup/JARImportOperation.java
new file mode 100644
index 0000000..4f86875
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/setup/JARImportOperation.java
@@ -0,0 +1,169 @@
+package org.eclipse.jst.validation.test.setup;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Enumeration;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jst.validation.test.BVTValidationPlugin;
+import org.eclipse.wst.validation.internal.operations.ValidatorManager;
+
+/**
+ * Create a Java project by importing a JAR file.
+ */
+public class JARImportOperation extends AImportOperation {
+	// Most of the code in this class was stolen from the JDT. See org.eclipse.jdt.internal.ui.wizards.buildpaths.BuildPathsBlock.
+	public static void createProject(IProject project, IPath locationPath, IProgressMonitor monitor) throws CoreException {
+		if (monitor == null) {
+			monitor= new NullProgressMonitor();
+		}				
+
+		// create the project
+		try {
+			if (!project.exists()) {
+				IProjectDescription desc= project.getWorkspace().newProjectDescription(project.getName());
+				if (Platform.getLocation().equals(locationPath)) {
+					locationPath= null;
+				}
+				desc.setLocation(locationPath);
+				project.create(desc, monitor);
+				monitor= null;
+			}
+			if (!project.isOpen()) {
+				project.open(monitor);
+				monitor= null;
+			}
+		} finally {
+			if (monitor != null) {
+				monitor.done();
+			}
+		}
+	}
+
+	public static void addJavaNature(IProject project, IProgressMonitor monitor) throws CoreException {
+		if (!project.hasNature(JavaCore.NATURE_ID)) {
+			IProjectDescription description = project.getDescription();
+			String[] prevNatures= description.getNatureIds();
+			String[] newNatures= new String[prevNatures.length + 1];
+			System.arraycopy(prevNatures, 0, newNatures, 0, prevNatures.length);
+			newNatures[prevNatures.length]= JavaCore.NATURE_ID;
+			description.setNatureIds(newNatures);
+			project.setDescription(description, monitor);
+		} else {
+			monitor.worked(1);
+		}
+	}
+	
+	private void configureProject(IProgressMonitor monitor, IProject project) {
+		try {
+			// Set the classpath to the default.
+			IJavaProject jp = JavaCore.create(project);
+			jp.setRawClasspath(null, new SubProgressMonitor(monitor, 7));		
+
+			// Now add rt.jar to it
+			IClasspathEntry[] existingClasspath = jp.getRawClasspath();
+			IClasspathEntry[] classpath= new IClasspathEntry[existingClasspath.length + 1];
+			System.arraycopy(existingClasspath, 0, classpath, 0, existingClasspath.length);
+			IClasspathEntry rtJar = JavaCore.newVariableEntry(new Path("JRE_LIB"), new Path("JRE_SRC"), null); //$NON-NLS-1$ //$NON-NLS-2$
+			classpath[existingClasspath.length] = rtJar;
+			jp.setRawClasspath(classpath, new SubProgressMonitor(monitor, 7));
+			
+			// Enable this java project with the Validation Builder so that automatic validation 
+			// can run on it.
+			ValidatorManager.addProjectBuildValidationSupport(project);
+		}
+		catch(JavaModelException exc) {
+			BVTValidationPlugin.getPlugin().handleException(exc);
+		}
+	}
+	
+	/**
+	 * @see org.eclipse.jst.validation.test.setup.AImportOperation#createNewProject(IProgressMonitor, String, File)
+	 */
+	protected IProject createNewProject(IProgressMonitor monitor, String projectName, File inputFile) {
+		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
+		try {
+			createProject(project, null, monitor);
+			addJavaNature(project, monitor);
+			configureProject(monitor, project);
+		}
+		catch(CoreException exc) {
+			BVTValidationPlugin.getPlugin().handleException(exc);
+		}
+		return project;
+	}
+	
+	protected void createFolder(IProgressMonitor monitor, IProject project, IPath pathname) throws CoreException {
+		IFolder folder = project.getFolder(pathname);
+		IContainer container = folder.getParent();
+		if(!container.exists()) {
+			createFolder(monitor, project, container.getProjectRelativePath());
+		}
+		if(!folder.exists()) {
+			// Don't overwrite existing files.
+			folder.create(true, true, monitor); // true=force, true=local
+		}
+	}
+	
+	protected void createFile(IProgressMonitor monitor, IProject project, IPath pathname, InputStream stream) throws CoreException {
+		IFile nfile = project.getFile(pathname);
+		IContainer container = nfile.getParent();
+		if(!container.exists()) {
+			createFolder(monitor, project, container.getProjectRelativePath());
+		}
+		if(!nfile.exists()) {
+			// Don't overwrite existing files.
+			nfile.create(stream, true, monitor);
+		}
+	}
+	
+	/**
+	 * @see org.eclipse.jst.validation.test.setup.AImportOperation#importFile(IProgressMonitor, IProject, File)
+	 */
+	protected boolean importFile(IProgressMonitor monitor, IProject project, File file) {
+		// Import the file 
+		try {
+			ZipFile zipFile = new ZipFile(file);
+			Enumeration zipEntries = zipFile.entries();
+			while(zipEntries.hasMoreElements()) {
+				ZipEntry zipEntry = (ZipEntry)zipEntries.nextElement();
+				IPath pathname = new Path(zipEntry.getName());
+				if(zipEntry.isDirectory()) {
+					createFolder(monitor, project, pathname);
+				}
+				else {
+					createFile(monitor, project, pathname, zipFile.getInputStream(zipEntry));
+				}
+			}
+			return true;
+		}
+		catch(IOException exc) {
+			BVTValidationPlugin.getPlugin().handleException(exc);
+			return false;
+		}
+		catch(CoreException exc) {
+			BVTValidationPlugin.getPlugin().handleException(exc);
+			return false;
+		}
+	}
+
+}
diff --git a/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/setup/TestCaseGeneratorOperation.java b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/setup/TestCaseGeneratorOperation.java
new file mode 100644
index 0000000..301a2e3
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/test/org/eclipse/jst/validation/test/setup/TestCaseGeneratorOperation.java
@@ -0,0 +1,134 @@
+package org.eclipse.jst.validation.test.setup;
+
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IWorkspaceRunnable;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jst.validation.test.BVTValidationPlugin;
+import org.eclipse.jst.validation.test.internal.registry.MessageUtility;
+import org.eclipse.wst.validation.internal.TaskListUtility;
+import org.eclipse.wst.validation.internal.ValidatorMetaData;
+import org.eclipse.wst.validation.internal.provisional.core.IMessage;
+
+/**
+ * Generate an FVT test case, for a selected IProject or IProjects, to
+ * be pasted into plugin.xml.
+ */
+public final class TestCaseGeneratorOperation implements IWorkspaceRunnable {
+	private final static String _TESTCASE_TEMPLATE_ = "\t\t\t<test \n\t\t\t\tproject=\"{0}\"\n\t\t\t\tinput=\"\"\n\t\t\t\tvalidator=\"{1}\">\n{2}\t\t\t</test>\n"; //$NON-NLS-1$
+	private final static String _TESTCASE_MESSAGE_TEMPLATE_ = "\t\t\t\t<message prefix=\"{0}\" resource=\"{1}\" location=\"{2}\" text=\"{3}\"/>\n"; //$NON-NLS-1$
+	private Map _vmdBuffer = null; // map where the ValidatorMetaData is the key and the value is a StringBuffer
+	private IProject[] _projects = null;
+	private IBuffer _buffer = null;
+	
+	public TestCaseGeneratorOperation(IProject[] projects, IBuffer buffer) {
+		setProjects(projects);
+		setBuffer(buffer);
+		_vmdBuffer = new HashMap();
+	}
+	
+	/**
+	 * Get the buffer where the test case generated output will be sent.
+	 */
+	public IBuffer getBuffer() {
+		return _buffer;
+	}
+	
+	public void setBuffer(IBuffer b) {
+		_buffer = b;
+	}
+	
+	public IProject[] getProjects() {
+		return _projects;
+	}
+	
+	public void setProjects(IProject[] projects) {
+		_projects = projects;
+	}
+
+	/**
+	 * @see org.eclipse.core.resources.IWorkspaceRunnable#run(IProgressMonitor)
+	 */
+	public void run(IProgressMonitor arg0) throws CoreException {
+		try {
+			generate(getProjects());
+		}
+		catch(Throwable exc) {
+			BVTValidationPlugin.getPlugin().handleException(exc);
+			getBuffer().write("A Throwable was caught; could not generate the test case. Check the LoggingUtil.log file for details."); //$NON-NLS-1$
+		}
+		finally {
+			_vmdBuffer.clear();
+		}
+	}
+	
+	protected void generate(IProject[] projects) {
+		// First, load all of the validation markers from the selected projects, 
+		// and group them by the validator.
+		for(int i=0; i<projects.length; i++) {
+			IProject project = projects[i];
+			IMarker[] markers = TaskListUtility.getValidationTasks(project, IMessage.ALL_MESSAGES);
+			if((markers == null) || (markers.length == 0)){
+				getBuffer().write("Cannot generate a test case for project " + project.getName() + " until \"Run Validation\" has been run. Enable only the validator whose test case is to be generated, right-click, and \"Run Validation\". Once the validation messages have been reported, a test case can be generated from those messages."); //$NON-NLS-1$ //$NON-NLS-2$
+				continue;
+			}
+			
+			// A test case = one validator on one project => what markers
+			List markerList = new ArrayList();
+			for(int j=0; j<markers.length; j++) {
+				markerList.add(markers[j]);
+			}
+			
+			// Sort the markers by validator, project, prefix, location & resource
+			Collections.sort(markerList, MessageUtility.getMessageComparator(getBuffer(), false));
+
+			Iterator iterator = markerList.iterator();
+			while(iterator.hasNext()) {
+				IMarker marker = (IMarker)iterator.next();			
+				ValidatorMetaData vmd = MessageUtility.getValidator(marker);
+				if(vmd != null) {
+					StringBuffer messageBuffer = getBuffer(vmd);
+					String messageId = MessageUtility.getMessagePrefix(marker);
+					String resource = MessageUtility.getResource(marker);
+					Integer lineNumber = MessageUtility.getLineNumber(marker);
+					String location = (lineNumber == null) ? (location = MessageUtility.getLocation(marker)) : (location = lineNumber.toString());
+					String text = MessageUtility.getMessage(marker); // Emit the text of the message so that, if the message prefixes are changed in the future, it's easy to see that the same test is run with a different prefix, and that the test didn't really fail.
+					text = text.replace('<', '['); // remove the XML reserved characters.
+					text = text.replace('>', ']');
+					text = text.replace('"', '\'');
+					messageBuffer.append(MessageFormat.format(_TESTCASE_MESSAGE_TEMPLATE_, new String[]{messageId, resource, location, text}));
+				}
+			}
+			
+			iterator = _vmdBuffer.keySet().iterator(); // iterate over the vmds
+			while(iterator.hasNext()) {
+				ValidatorMetaData vmd = (ValidatorMetaData)iterator.next();
+				StringBuffer buffer = (StringBuffer)_vmdBuffer.get(vmd);
+				String testcaseTemplate = MessageFormat.format(_TESTCASE_TEMPLATE_, new String[]{project.getName(), vmd.getValidatorUniqueName(), buffer.toString()});
+				
+				getBuffer().write(testcaseTemplate);
+				
+				buffer.delete(0, buffer.length()); // clear the buffer for the next project
+			}
+		}
+	}
+	
+	private StringBuffer getBuffer(ValidatorMetaData vmd) {
+		StringBuffer buffer = (StringBuffer)_vmdBuffer.get(vmd);
+		if(buffer == null) {
+			buffer = new StringBuffer();
+			_vmdBuffer.put(vmd, buffer);
+		}
+		return buffer;
+	}
+
+}
diff --git a/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/BuildInfo.java b/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/BuildInfo.java
new file mode 100644
index 0000000..f56d29a
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/BuildInfo.java
@@ -0,0 +1,7 @@
+package org.eclipse.jst.validation.test.fwk;
+public class BuildInfo {
+  public static final String copyright = "Licensed Materials -- Property of IBM\n(c) Copyright International Business Machines Corporation, 2001,2003\nUS Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp.";
+  public static final String fgBuildLevel = "20031112_1915-WB212-AD-V511D-W5";
+  public static String level() { return fgBuildLevel; }
+  public static String getWSABuildLevel() { return fgBuildLevel; }
+}
diff --git a/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/TestOpConstrBuilder.java b/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/TestOpConstrBuilder.java
new file mode 100644
index 0000000..88250a2
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/TestOpConstrBuilder.java
@@ -0,0 +1,38 @@
+package org.eclipse.jst.validation.test.fwk;
+
+import java.util.Map;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResourceDelta;
+import org.eclipse.core.resources.IncrementalProjectBuilder;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+
+/**
+ */
+public class TestOpConstrBuilder extends IncrementalProjectBuilder {
+	public static final String BUILDER_ID = "org.eclipse.jst.validation.test.fwk.bvtbuilder"; //$NON-NLS-1$
+	private IResourceDelta _delta = null;
+	private static TestOpConstrBuilder _inst = null;
+	
+	public TestOpConstrBuilder() {
+		_inst = this;
+	}
+
+	/**
+	 * @see org.eclipse.core.internal.events.InternalBuilder#build(int, java.util.Map, org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	protected IProject[] build(int kind, Map args, IProgressMonitor monitor) throws CoreException {
+		// Nothing to do; this class exists only so that an IResourceDelta can be constructed.
+		_delta = getDelta(getProject());
+		return null;
+	}
+
+	public IResourceDelta getDelta() {
+		return _delta;
+	}
+	
+	public static TestOpConstrBuilder singleton() {
+		return _inst;
+	}
+}
diff --git a/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/TestOpConstrInputOperation.java b/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/TestOpConstrInputOperation.java
new file mode 100644
index 0000000..2c767b9
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/TestOpConstrInputOperation.java
@@ -0,0 +1,260 @@
+package org.eclipse.jst.validation.test.fwk;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.logging.Level;
+
+import org.eclipse.core.resources.ICommand;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceDelta;
+import org.eclipse.core.resources.IResourceDeltaVisitor;
+import org.eclipse.core.resources.IWorkspaceRunnable;
+import org.eclipse.core.resources.IncrementalProjectBuilder;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jem.java.JavaHelpers;
+import org.eclipse.jem.util.logger.proxy.Logger;
+import org.eclipse.jst.validation.test.BVTValidationPlugin;
+import org.eclipse.jst.validation.test.fwk.validator.JDTUtility;
+import org.eclipse.jst.validation.test.internal.registry.ValidatorTestcase;
+import org.eclipse.jst.validation.test.setup.IBuffer;
+
+/**
+ * This class constructs the input for the TestOpConstrOperation. Because
+ * TestOpConstrOperation is not invoked as part of a build, when its IResources
+ * are touched, a build is invoked after each touch, and that means that the
+ * IResourceDelta that's constructed has only one IResource in it instead
+ * of the group of changed IResource instances.
+ */
+public class TestOpConstrInputOperation implements IWorkspaceRunnable {
+	public static final String FWK_NOBUILD_TEST_VALIDATOR_CLASS = "org.eclipse.jst.validation.test.fwk.validator.FwkNoBuildTestValidator"; //$NON-NLS-1$
+	public static final String FWK_TEST_VALIDATOR_CLASS = "org.eclipse.jst.validation.test.fwk.validator.FwkTestValidator"; //$NON-NLS-1$
+	public static final String PROPERTIES_VALIDATOR_CLASS = "org.eclipse.wst.validation.sample.PropertiesValidator"; //$NON-NLS-1$
+	
+	private IProject _project = null;
+	private IBuffer _buffer = null;
+	private static ICommand _builderCommand = null;
+	
+	private IResourceDelta _changedDelta = null;
+	private IResourceDelta _emptyDelta = null;
+	private JavaHelpers[] _changedClasses = null;
+	
+	/**
+	 * IProject must exist and be open.
+	 */
+	public TestOpConstrInputOperation(IBuffer buffer, IProject project) {
+		setProject(project);
+		setBuffer(buffer);
+	}
+
+	public IBuffer getBuffer() {
+		return _buffer;
+	}
+	
+	public void setBuffer(IBuffer b) {
+		_buffer = b;
+	}
+		
+	public IProject getProject() {
+		return _project;
+	}
+	
+	public void setProject(IProject p) {
+		_project = p;
+	}
+
+	/*package*/ static void debug(final IBuffer buffer, String title, IResourceDelta delta) {
+		try {
+			buffer.write(title);
+			delta.accept(new IResourceDeltaVisitor() {
+				public boolean visit(IResourceDelta subdelta) throws CoreException {
+					if (subdelta == null)
+						return true;
+
+					IResource resource = subdelta.getResource();
+					buffer.write("resource is: " + resource.getFullPath()); //$NON-NLS-1$
+					return true; // visit the subdelta's children
+				}
+			});
+		}
+		catch(CoreException exc) {
+			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+			if(logger.isLoggingLevel(Level.SEVERE)) {
+				logger.write(Level.SEVERE, exc);
+			}
+		}
+	}
+	
+	/**
+	 * Return an IResource that is not validated by the Fwk Test Validator (this
+	 * resource is used for the case where a resource is changed, and a build
+	 * is invoked, but the Fwk Test validator does not validate that resource and
+	 * should not be launched.)
+	 */	
+	public static IResource[] getEmptyResources(IProject project) {
+		IResource[] changedResources = new IResource[]{
+			project.getFile(".classpath"), //$NON-NLS-1$
+		};
+		return changedResources;
+	}
+	
+	public static void touch(IProject project, IResource[] changedResources) {
+		for(int i=0; i<changedResources.length; i++) {
+			IResource res = changedResources[i];
+			try {
+				res.touch(null); // null IProgressMonitor
+			}
+			catch(CoreException exc) {
+				// Oh well...dirty the next file.
+				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+				if(logger.isLoggingLevel(Level.SEVERE)) {
+					logger.write(Level.SEVERE, exc);
+				}
+			}
+		}
+	}
+
+	private static IResourceDelta getDelta(IProject project, IResource[] changedResources) {
+		try {
+			touch(project, changedResources);
+			project.build(IncrementalProjectBuilder.INCREMENTAL_BUILD, TestOpConstrBuilder.BUILDER_ID, _builderCommand.getArguments(), null); // null IProgressMonitor
+			return TestOpConstrBuilder.singleton().getDelta();
+		}
+		catch(CoreException exc) {
+			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+			if(logger.isLoggingLevel(Level.SEVERE)) {
+				logger.write(Level.SEVERE, exc);
+			}
+			return null;
+		}
+	}
+	
+	private static void addBuilder(IProject project, boolean doAdd) {
+		if(doAdd) {
+			// Add the builder to the project
+			try {
+				IProjectDescription description = project.getDescription();
+				ICommand[] oldCommands = description.getBuildSpec();
+				ICommand[] newCommands = new ICommand[oldCommands.length + 1];
+				System.arraycopy(oldCommands, 0, newCommands, 0, oldCommands.length);
+				_builderCommand = description.newCommand();
+				_builderCommand.setBuilderName(TestOpConstrBuilder.BUILDER_ID);
+				newCommands[oldCommands.length] = _builderCommand;
+				description.setBuildSpec(newCommands);
+
+				project.setDescription(description, null);
+			}
+			catch(CoreException exc) {
+				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+				if(logger.isLoggingLevel(Level.SEVERE)) {
+					logger.write(Level.SEVERE, exc);
+				}
+			}
+		}
+		else {
+			// Remove the builder
+			try {
+				IProjectDescription description = project.getDescription();
+				ICommand[] oldCommands = description.getBuildSpec();
+				ICommand[] newCommands = new ICommand[oldCommands.length - 1];
+				System.arraycopy(oldCommands, 0, newCommands, 0, newCommands.length);
+				description.setBuildSpec(newCommands);
+				project.setDescription(description, null);
+			}
+			catch(CoreException exc) {
+				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+				if(logger.isLoggingLevel(Level.SEVERE)) {
+					logger.write(Level.SEVERE, exc);
+				}
+			}
+		}
+	}
+
+	public void run(IProgressMonitor monitor) {
+		try {
+			addBuilder(getProject(), true);
+			
+			// First, build the project so that the subsequent builds aren't started with a null delta.
+			getProject().build(IncrementalProjectBuilder.INCREMENTAL_BUILD, TestOpConstrBuilder.BUILDER_ID, _builderCommand.getArguments(), null); // null IProgressMonitor
+			
+			ValidatorTestcase[] tmds = JDTUtility.getVFTests(monitor, getProject());
+			if((tmds == null) || (tmds.length == 0)) {
+				return;
+			}
+
+			// Then calculate the deltas
+			IResource[] changedResources = getChangedResources(getProject(), tmds);
+			_emptyDelta = getDelta(getProject(), getEmptyResources(getProject()));
+			_changedDelta = getDelta(getProject(), changedResources);
+			
+			// Then restore the project's build commands back to what they were.
+			addBuilder(getProject(), false);
+
+			_changedClasses = getChangedClasses(changedResources);
+		}
+		catch(Throwable exc) {
+			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+			if(logger.isLoggingLevel(Level.SEVERE)) {
+				logger.write(Level.SEVERE, exc);
+			}
+		}
+		finally {
+		}
+	}
+	
+	public IResourceDelta getChangedDelta() {
+		return _changedDelta;
+	}
+	
+	public IResourceDelta getEmptyDelta() {
+		return _emptyDelta;
+	}
+	
+	public static IResource[] getChangedResources(IProject project, ValidatorTestcase[] tmds) {
+		Set temp = new HashSet();
+		for(int i=0; i<tmds.length; i++) {
+			ValidatorTestcase tmd = tmds[i];
+			IResource[] res = tmd.getResources(project);
+			for(int j=0; j<res.length; j++) {
+				temp.add(res[j]);
+			}
+		}
+		IResource[] result = new IResource[temp.size()];
+		temp.toArray(result);
+		return result;
+	}
+	
+	public JavaHelpers[] getChangedClasses(IResource[] resources) {
+		if(_changedClasses == null) {
+			if(resources == null) {
+				return new JavaHelpers[0];
+			}
+			
+			JavaHelpers[] result = new JavaHelpers[resources.length];
+			int count = 0;
+			for(int i=0; i<resources.length; i++) {
+				IResource resource = resources[i];
+				if((resource instanceof IFile) && (resource.getFileExtension().equals("java") || resource.getFileExtension().equals("class"))) { //$NON-NLS-1$  //$NON-NLS-2$
+					JavaHelpers h = JDTUtility.getJavaHelpers((IFile)resource);
+					if(h != null) {
+						result[count++] = h;
+					}
+				}
+			}
+			
+			if(count != resources.length) {
+				JavaHelpers[] temp = new JavaHelpers[count];
+				System.arraycopy(result, 0, temp, 0, count);
+				return temp;
+			}
+			else {
+				return result;
+			}
+		}
+		return _changedClasses;
+	}
+}
+
diff --git a/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/TestOpConstrOperation.java b/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/TestOpConstrOperation.java
new file mode 100644
index 0000000..77818c4
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/TestOpConstrOperation.java
@@ -0,0 +1,629 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.validation.test.fwk;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.logging.Level;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceDelta;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jem.java.JavaHelpers;
+import org.eclipse.jem.util.logger.proxy.Logger;
+import org.eclipse.jst.validation.test.BVTValidationException;
+import org.eclipse.jst.validation.test.BVTValidationPlugin;
+import org.eclipse.jst.validation.test.IOperationRunnable;
+import org.eclipse.jst.validation.test.ValidationTypeEnum;
+import org.eclipse.jst.validation.test.fwk.validator.JDTUtility;
+import org.eclipse.jst.validation.test.internal.registry.ValidatorTestcase;
+import org.eclipse.jst.validation.test.internal.util.BVTRunner;
+import org.eclipse.jst.validation.test.setup.IBuffer;
+import org.eclipse.wst.validation.internal.ConfigurationManager;
+import org.eclipse.wst.validation.internal.GlobalConfiguration;
+import org.eclipse.wst.validation.internal.InternalValidatorManager;
+import org.eclipse.wst.validation.internal.TaskListUtility;
+import org.eclipse.wst.validation.internal.ValidationConfiguration;
+import org.eclipse.wst.validation.internal.ValidatorMetaData;
+import org.eclipse.wst.validation.internal.operations.AllValidatorsOperation;
+import org.eclipse.wst.validation.internal.operations.EnabledIncrementalValidatorsOperation;
+import org.eclipse.wst.validation.internal.operations.EnabledValidatorsOperation;
+import org.eclipse.wst.validation.internal.operations.IRuleGroup;
+import org.eclipse.wst.validation.internal.operations.OneValidatorOperation;
+import org.eclipse.wst.validation.internal.operations.ValidationOperation;
+import org.eclipse.wst.validation.internal.operations.ValidatorSubsetOperation;
+
+/**
+ * This class tests every constructor available in the ValidationOperation
+ * hierarchy and ensures that an operation, created with that constructor, 
+ * results in the expected validation IMarkers.
+ */
+public class TestOpConstrOperation implements IOperationRunnable {
+	private IProject _project = null;
+	private IBuffer _buffer = null;
+	private String _testCaseName = null;
+	
+	/**
+	 * Must have a public default constructor in order to createExecutableExtension.
+	 * MUST call setBuffer, setProject, and setName before using the operation.
+	 */
+	public TestOpConstrOperation() {
+	}
+	
+	/**
+	 * IProject must exist and be open.
+	 */
+	public TestOpConstrOperation(IBuffer buffer, IProject project, String testCaseName) {
+		setBuffer(buffer);
+		setProject(project);
+		setName(testCaseName);
+	}
+	
+	public IBuffer getBuffer() {
+		return _buffer;
+	}
+	
+	public void setBuffer(IBuffer b) {
+		_buffer = b;
+	}
+	
+	public IProject getProject() {
+		return _project;
+	}
+	
+	public void setProject(IProject p) {
+		_project = p;
+	}
+	
+	public String getName() {
+		return _testCaseName;
+	}
+	
+	public void setName(String name) {
+		_testCaseName = name;
+	}	
+
+	public void run(IProgressMonitor monitor) {
+		try {
+			GlobalConfiguration gconf = ConfigurationManager.getManager().getGlobalConfiguration();
+			GlobalConfiguration origGconf = new GlobalConfiguration(gconf);
+			boolean autoBuildEnabled = ResourcesPlugin.getWorkspace().isAutoBuilding();
+			try {
+				// In order for the operations to work correctly, set the enabled validators to
+				// the validators for which tests exist, and turn off auto-build so that a
+				// validation is forced.
+				gconf.setCanProjectsOverride(false);
+				//gconf.setAutoValidate(false);
+				//gconf.setAutoValidate(true);
+				//gconf.setBuildValidate(true);
+				//gconf.setMaximumNumberOfMessages(WorkbenchReporter.NO_MESSAGE_LIMIT);
+				gconf.passivate();
+				
+				JDTUtility.setAutoBuild(false);
+				
+				monitor.subTask("Loading operations; please wait..."); //$NON-NLS-1$
+				TestWrapper[] testCaseAndOperations = getOperations(monitor, gconf);
+				if(testCaseAndOperations == null) {
+					String message = "Test case failed; cannot test null operations."; //$NON-NLS-1$
+					getBuffer().write(message);
+					monitor.subTask(message);
+					return;
+				}
+	
+				int numPassed = 0;
+				for(int i=0; i<testCaseAndOperations.length; i++) {
+					TestWrapper testWrapper = testCaseAndOperations[i];
+					ValidationOperation operation = testWrapper.getOperation();
+					boolean tpassed = false;
+					try {
+						if(monitor.isCanceled()) {
+							break;
+						}
+						monitor.subTask("Testing " + (i+1) + " of " + testCaseAndOperations.length + " constructors."); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+						preTest(testWrapper);
+						if(test(monitor, testWrapper)) {
+							numPassed++;
+							tpassed = true;
+						}
+					}
+					catch(Throwable exc) {
+						getBuffer().write("Throwable caught while testing #" + (i+1) + " " + operation.getClass().getName()); //$NON-NLS-1$ //$NON-NLS-2$
+						Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+						if(logger.isLoggingLevel(Level.SEVERE)) {
+							logger.write(Level.SEVERE, exc);
+						}
+					}
+					finally {
+						String message = "Test #" + (i+1) + " of " + testCaseAndOperations.length + ((tpassed) ? " passed." : " failed."); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+						monitor.subTask(message);
+						getBuffer().write(message);
+						getBuffer().addExecutionStatus(getName(), testWrapper.getName(), tpassed); //$NON-NLS-1$
+					}
+				}
+				
+				String status = numPassed + " of " + testCaseAndOperations.length + " tests passed."; //$NON-NLS-1$ //$NON-NLS-2$
+				monitor.subTask(status);
+				getBuffer().write(status);
+			}
+			finally {
+				// Set the project's settings back to what they were.
+				gconf = origGconf;
+				gconf.passivate();
+				
+				JDTUtility.setAutoBuild(autoBuildEnabled);
+			}
+		}
+		catch(InvocationTargetException exc) {
+			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+			if(logger.isLoggingLevel(Level.SEVERE)) {
+				logger.write(Level.SEVERE, exc);
+				if(exc.getTargetException() != null) {
+					logger.write(Level.SEVERE, exc.getTargetException());
+				}
+			}
+		}
+	}
+	
+	private void preTest(TestWrapper wrapper) throws CoreException {
+		// First, remove all of the markers. Can't rely on the operation to remove the markers between
+		// one invocation and the next because sometimes the validation is not supposed to run.
+		TaskListUtility.removeAllTasks(getProject(), wrapper.getValidatorNames()); // null=delete markers on all objects
+	}
+	
+	/**
+	 * Return true if the test passes, and false if it failed.
+	 */
+	private boolean test(IProgressMonitor monitor, TestWrapper testWrapper) throws InvocationTargetException {
+		boolean result = true;
+		try {
+			result = BVTRunner.singleton().test(getBuffer(), getName(), testWrapper.getName(), testWrapper.getExpectedMessages(), testWrapper.getOperation(), testWrapper.getValidatorNames()) && result;
+		}
+		catch(BVTValidationException exc) {
+			result = false;
+			if(exc.getTargetException() != null) {
+				throw new InvocationTargetException(exc.getTargetException(), exc.getMessage());
+			}
+		}
+		return result;
+	}
+	
+	/**
+	 * Return an array, with the first entry in the array the ValidatorTestcase that 
+	 * holds the expected results, and the second entry of the array a ValidationOperation[]
+	 * containing the operations to be tested.
+	 */
+	private TestWrapper[] getOperations(IProgressMonitor monitor, ValidationConfiguration vconf) throws InvocationTargetException {
+		ValidatorTestcase[] allTmds = JDTUtility.getVFTests(monitor, getProject());
+		if((allTmds == null) || (allTmds.length == 0)) {
+			return null;
+		}
+
+		// Some of the operation constructors require file extensions. 
+		String fileExtension = ".java"; //$NON-NLS-1$
+		String defaultExtension = null;
+		IFile javaFile = getProject().getFile("foo.java"); //$NON-NLS-1$
+
+		// Some of the operations below pass if they don't produce any results.
+		// Create a test case that passes the operation if the operation does nothing.
+		List tmdEmpty = new ArrayList(); // expected messages == none
+		List tmdInc = new ArrayList(); // expected messages when incremental validators ran
+		List tmdEnabled = new ArrayList(); // expected messages when enabled validators ran
+		List tmdJava = new ArrayList(); // expected messages when validators that validate .java files are run
+		List tmdFull = new ArrayList(); // expected messages when validators that support only "Run Validation" are run
+		Set enabledValidators = new HashSet(); // enabled validators == FWK Val, FWK NoBuild Val, Properties Val
+		Set enabledIncrementalValidators = new HashSet(); // enabled incremental == FWK Val, Properties Val (support incremental validation)
+		Set javaValidators = new HashSet(); // java val == FWK Val, FWK NoBuild Val (validate .java files)
+		Set fullValidators = new HashSet(); // full val == FWK NoBuild Val (runs only when "Run Validation" clicked)
+		ValidatorMetaData[] enabledVmd = new ValidatorMetaData[allTmds.length];
+		for(int i=0; i<allTmds.length; i++) {
+			ValidatorTestcase vt = allTmds[i];
+			
+			ValidatorMetaData vmd = vt.getValidatorMetaData();
+			enabledValidators.add(vmd);
+			enabledVmd[i] = vmd;
+			if(vmd.isIncremental()) {
+				enabledIncrementalValidators.add(vmd);
+			}
+			else {
+				fullValidators.add(vmd);
+				tmdFull.addAll(vt.getMessages(ValidationTypeEnum.RUN_VALIDATION));
+			}
+			
+			// It is the responsibility of the code that instantiates the ValidatorSubsetOperation
+			// to ensure that when an array of changed resources or objects is passed to the operation,
+			// that only incremental validators are invoked by the operation. The framework does not
+			// check if the validators are incremental or not; instead, the named validators will run,
+			// even if they perform a full validation instead of validating just the arrays.
+			if(vmd.isApplicableTo(javaFile) && vmd.isIncremental()) {
+				javaValidators.add(vmd);
+				tmdJava.addAll(vt.getMessages(ValidationTypeEnum.INCREMENTAL_VALIDATION));
+			}
+			
+			tmdEnabled.addAll(vt.getMessages(ValidationTypeEnum.RUN_VALIDATION));
+			tmdInc.addAll(vt.getMessages(ValidationTypeEnum.INCREMENTAL_VALIDATION));			
+		}
+		String[] allValidatorNames = InternalValidatorManager.getManager().getValidatorNames(enabledValidators);
+		String[] incValidatorNames = InternalValidatorManager.getManager().getValidatorNames(enabledIncrementalValidators);
+		String[] javaValidatorNames = InternalValidatorManager.getManager().getValidatorNames(javaValidators);
+		String[] fullValidatorNames = InternalValidatorManager.getManager().getValidatorNames(fullValidators);
+		
+		vconf.setEnabledValidators(enabledVmd);
+		vconf.passivate();
+		
+		// Start constructing the tests
+		// For the tests that depend on the value of the autoBuild setting, it is assumed that
+		// autoBuild is on. The tests will fail if autoBuild is disabled.
+		//
+		// Unlike the subsequent operations, these first two cannot use the allTmds TMD because
+		// more than one validator runs. The allTmdFull TMD contains all tmd of validators that
+		// will run. 
+		AllValidatorsOperation op1 = new AllValidatorsOperation(getProject());
+		TestWrapper test1 = new TestWrapper(op1, tmdEnabled, "op1", allValidatorNames); //$NON-NLS-1$
+		
+		AllValidatorsOperation op2 = new AllValidatorsOperation(getProject(), false); // don't fork
+		TestWrapper test2 = new TestWrapper(op2, tmdEnabled, "op2", allValidatorNames); //$NON-NLS-1$
+
+		// Construct the input for the rest of the operations using the VF Test validators.
+		TestOpConstrInputOperation inputOp = new TestOpConstrInputOperation(getBuffer(), getProject());
+		try {
+			ResourcesPlugin.getWorkspace().run(inputOp, monitor);
+		}
+		catch(Throwable exc) {
+			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+			if(logger.isLoggingLevel(Level.SEVERE)) {
+				logger.write(Level.SEVERE, exc);
+			}
+			return new TestWrapper[0];
+		}
+		
+		IResource[] changedResources = TestOpConstrInputOperation.getChangedResources(getProject(), allTmds);
+		IResource[] emptyResources = TestOpConstrInputOperation.getEmptyResources(getProject());
+		JavaHelpers[] changedClasses = inputOp.getChangedClasses(changedResources);
+		IResourceDelta emptyDelta = inputOp.getEmptyDelta();
+		IResourceDelta changedDelta = inputOp.getChangedDelta();
+		// end construct input
+
+		EnabledIncrementalValidatorsOperation op3 = new EnabledIncrementalValidatorsOperation(getProject(), null,true);
+		TestWrapper test3 = new TestWrapper(op3, tmdInc, "op3", incValidatorNames); //$NON-NLS-1$
+		
+		EnabledIncrementalValidatorsOperation op4 = new EnabledIncrementalValidatorsOperation(getProject(), changedDelta,false);
+		TestWrapper test4 = new TestWrapper(op4, tmdInc, "op4", incValidatorNames); //$NON-NLS-1$
+		
+		EnabledIncrementalValidatorsOperation op5 = new EnabledIncrementalValidatorsOperation(getProject(), emptyDelta,false);
+		TestWrapper test5 = new TestWrapper(op5, tmdEmpty, "op5", incValidatorNames); //$NON-NLS-1$
+		
+		EnabledIncrementalValidatorsOperation op6 = new EnabledIncrementalValidatorsOperation(getProject(), null, IRuleGroup.PASS_FAST,false);
+		TestWrapper test6 = new TestWrapper(op6, tmdInc, "op6", incValidatorNames); //$NON-NLS-1$
+		
+		EnabledIncrementalValidatorsOperation op7 = new EnabledIncrementalValidatorsOperation(getProject(), changedDelta, IRuleGroup.PASS_FAST,false);
+		TestWrapper test7 = new TestWrapper(op7, tmdInc, "op7", incValidatorNames); //$NON-NLS-1$
+		
+		EnabledIncrementalValidatorsOperation op8 = new EnabledIncrementalValidatorsOperation(getProject(), emptyDelta, IRuleGroup.PASS_FAST,false);
+		TestWrapper test8 = new TestWrapper(op8, tmdEmpty, "op8", incValidatorNames); //$NON-NLS-1$
+		
+		EnabledIncrementalValidatorsOperation op9 = new EnabledIncrementalValidatorsOperation(getProject(), enabledIncrementalValidators, null, IRuleGroup.PASS_FAST);
+		TestWrapper test9 = new TestWrapper(op9, tmdInc, "op9", incValidatorNames); //$NON-NLS-1$
+		
+		EnabledIncrementalValidatorsOperation op10 = new EnabledIncrementalValidatorsOperation(getProject(), enabledIncrementalValidators, changedDelta, IRuleGroup.PASS_FAST);
+		TestWrapper test10 = new TestWrapper(op10, tmdInc, "op10", incValidatorNames); //$NON-NLS-1$
+		
+		EnabledIncrementalValidatorsOperation op11 = new EnabledIncrementalValidatorsOperation(getProject(), enabledIncrementalValidators, emptyDelta, IRuleGroup.PASS_FAST);
+		TestWrapper test11 = new TestWrapper(op11, tmdEmpty, "op11", incValidatorNames); //$NON-NLS-1$
+		
+		EnabledIncrementalValidatorsOperation op12 = new EnabledIncrementalValidatorsOperation(getProject(), null, false); // full validate, don't fork
+		TestWrapper test12 = new TestWrapper(op12, tmdInc, "op12", incValidatorNames); //$NON-NLS-1$
+		
+		EnabledIncrementalValidatorsOperation op13 = new EnabledIncrementalValidatorsOperation(getProject(), changedDelta, false); // delta validate, don't fork
+		TestWrapper test13 = new TestWrapper(op13, tmdInc, "op13", incValidatorNames); //$NON-NLS-1$
+		
+		EnabledIncrementalValidatorsOperation op14 = new EnabledIncrementalValidatorsOperation(getProject(), emptyDelta, false); // empty delta validate, don't fork
+		TestWrapper test14 = new TestWrapper(op14, tmdEmpty, "op14", incValidatorNames); //$NON-NLS-1$
+		
+		EnabledIncrementalValidatorsOperation op15 = new EnabledIncrementalValidatorsOperation(getProject(), null, IRuleGroup.PASS_FAST, false); // full validate, don't fork
+		TestWrapper test15 = new TestWrapper(op15, tmdInc, "op15", incValidatorNames); //$NON-NLS-1$
+		
+		EnabledIncrementalValidatorsOperation op16 = new EnabledIncrementalValidatorsOperation(getProject(), changedDelta, IRuleGroup.PASS_FAST, false); // delta validate, don't fork
+		TestWrapper test16 = new TestWrapper(op16, tmdInc, "op16", incValidatorNames); //$NON-NLS-1$
+		
+		EnabledIncrementalValidatorsOperation op17 = new EnabledIncrementalValidatorsOperation(getProject(), emptyDelta, IRuleGroup.PASS_FAST, false); // empty delta validate, don't fork
+		TestWrapper test17 = new TestWrapper(op17, tmdEmpty, "op17", incValidatorNames); //$NON-NLS-1$
+		
+		EnabledValidatorsOperation op18 = new EnabledValidatorsOperation(getProject());
+		TestWrapper test18= new TestWrapper(op18, tmdEnabled, "op18", allValidatorNames); //$NON-NLS-1$
+		
+		EnabledValidatorsOperation op19 = new EnabledValidatorsOperation(getProject(), false); // don't fork
+		TestWrapper test19 = new TestWrapper(op19, tmdEnabled, "op19", allValidatorNames); //$NON-NLS-1$
+		
+		EnabledValidatorsOperation op20 = new EnabledValidatorsOperation(getProject(), IRuleGroup.PASS_FAST);
+		TestWrapper test20 = new TestWrapper(op20, tmdEnabled, "op20", allValidatorNames); //$NON-NLS-1$
+		
+		EnabledValidatorsOperation op21 = new EnabledValidatorsOperation(getProject(), IRuleGroup.PASS_FAST, true,false); // force validation if it doesn't need to run
+		TestWrapper test21 = new TestWrapper(op21, tmdEnabled, "op21", allValidatorNames); //$NON-NLS-1$
+		
+		EnabledValidatorsOperation op22 = new EnabledValidatorsOperation(getProject(), IRuleGroup.PASS_FAST, false,false); // no force validation if it doesn't need to run
+		TestWrapper test22 = new TestWrapper(op22, tmdEnabled, "op22", allValidatorNames); //$NON-NLS-1$
+		
+		EnabledValidatorsOperation op23 = new EnabledValidatorsOperation(getProject(), IRuleGroup.PASS_FAST, true, false); // force, don't fork
+		TestWrapper test23 = new TestWrapper(op23, tmdEnabled, "op23", allValidatorNames); //$NON-NLS-1$
+		
+		EnabledValidatorsOperation op24 = new EnabledValidatorsOperation(getProject(), IRuleGroup.PASS_FAST, false, false); // no force, don't fork
+		TestWrapper test24 = new TestWrapper(op24, tmdEnabled, "op24", allValidatorNames); //$NON-NLS-1$
+		
+		EnabledValidatorsOperation op25 = new EnabledIncrementalValidatorsOperation(getProject(), null,true); 
+		TestWrapper test25 = new TestWrapper(op25, tmdEnabled, "op25", allValidatorNames); //$NON-NLS-1$
+		
+		EnabledValidatorsOperation op26 = new EnabledIncrementalValidatorsOperation(getProject(), changedDelta,true);
+		TestWrapper test26 = new TestWrapper(op26, tmdInc, "op26", incValidatorNames); //$NON-NLS-1$
+		
+		EnabledValidatorsOperation op27 = new EnabledIncrementalValidatorsOperation(getProject(), emptyDelta,true);
+		TestWrapper test27 = new TestWrapper(op27, tmdEmpty, "op27", incValidatorNames); //$NON-NLS-1$
+		
+		EnabledValidatorsOperation op28 = new EnabledIncrementalValidatorsOperation(getProject(), null, IRuleGroup.PASS_FAST,true);
+		TestWrapper test28 = new TestWrapper(op28, tmdEnabled, "op28", allValidatorNames); //$NON-NLS-1$
+		
+		EnabledValidatorsOperation op29 = new EnabledIncrementalValidatorsOperation(getProject(), changedDelta, IRuleGroup.PASS_FAST,true);
+		TestWrapper test29 = new TestWrapper(op29, tmdInc, "op29", incValidatorNames); //$NON-NLS-1$
+		
+		EnabledValidatorsOperation op30 = new EnabledIncrementalValidatorsOperation(getProject(), emptyDelta, IRuleGroup.PASS_FAST,true); 
+		TestWrapper test30 = new TestWrapper(op30, tmdEmpty, "op30", incValidatorNames); //$NON-NLS-1$
+
+		ValidatorMetaData vmd = allTmds[0].getValidatorMetaData();
+		String validatorName = vmd.getValidatorUniqueName();
+		String[] vmdNames = InternalValidatorManager.getManager().getValidatorNames(new ValidatorMetaData[]{vmd});
+		List expectedMessages = allTmds[0].getMessages(ValidationTypeEnum.RUN_VALIDATION);
+		OneValidatorOperation op31 = new OneValidatorOperation(getProject(), validatorName);
+		TestWrapper test31 = new TestWrapper(op31, expectedMessages, "op31", vmdNames); //$NON-NLS-1$
+		
+		OneValidatorOperation op32 = new OneValidatorOperation(getProject(), validatorName, true); // force if necessary
+		TestWrapper test32 = new TestWrapper(op32, expectedMessages, "op32", vmdNames); //$NON-NLS-1$
+		
+		OneValidatorOperation op33 = new OneValidatorOperation(getProject(), validatorName, false); // no force
+		TestWrapper test33 = new TestWrapper(op33, expectedMessages, "op33", vmdNames); //$NON-NLS-1$
+		
+		OneValidatorOperation op34 = new OneValidatorOperation(getProject(), validatorName, true, false); // force, no fork
+		TestWrapper test34 = new TestWrapper(op34, expectedMessages, "op34", vmdNames); //$NON-NLS-1$
+		
+		OneValidatorOperation op35 = new OneValidatorOperation(getProject(), validatorName, false, false); // no force, no fork
+		TestWrapper test35 = new TestWrapper(op35, expectedMessages, "op35", vmdNames); //$NON-NLS-1$
+		
+		OneValidatorOperation op36 = new OneValidatorOperation(getProject(), validatorName, true, IRuleGroup.PASS_FAST); // force
+		TestWrapper test36 = new TestWrapper(op36, expectedMessages, "op36", vmdNames); //$NON-NLS-1$
+		
+		OneValidatorOperation op37 = new OneValidatorOperation(getProject(), validatorName, false, IRuleGroup.PASS_FAST); // no force
+		TestWrapper test37 = new TestWrapper(op37, expectedMessages, "op37", vmdNames); //$NON-NLS-1$
+		
+		OneValidatorOperation op38 = new OneValidatorOperation(getProject(), validatorName, true, IRuleGroup.PASS_FAST, false); // force, no fork
+		TestWrapper test38 = new TestWrapper(op38, expectedMessages, "op38", vmdNames); //$NON-NLS-1$
+		
+		OneValidatorOperation op39 = new OneValidatorOperation(getProject(), validatorName, false, IRuleGroup.PASS_FAST, false); // no force, no fork
+		TestWrapper test39 = new TestWrapper(op39, expectedMessages, "op39", vmdNames); //$NON-NLS-1$
+
+		ValidatorSubsetOperation op40 = new ValidatorSubsetOperation(getProject(),true,false);
+		op40.setValidators(allValidatorNames);
+		TestWrapper test40 = new TestWrapper(op40, tmdEnabled, "op40", allValidatorNames); //$NON-NLS-1$
+		
+		ValidatorSubsetOperation op41 = new ValidatorSubsetOperation(getProject(), true,false); // force
+		op41.setValidators(allValidatorNames);
+		TestWrapper test41 = new TestWrapper(op41, tmdEnabled, "op41", allValidatorNames); //$NON-NLS-1$
+		
+		ValidatorSubsetOperation op42 = new ValidatorSubsetOperation(getProject(), false,false); // no force
+		op42.setValidators(allValidatorNames);
+		TestWrapper test42 = new TestWrapper(op42, tmdEnabled, "op42", allValidatorNames); //$NON-NLS-1$
+		
+		ValidatorSubsetOperation op43 = new ValidatorSubsetOperation(getProject(), true, false); // force, no fork
+		op43.setValidators(allValidatorNames);
+		TestWrapper test43 = new TestWrapper(op43, tmdEnabled, "op43", allValidatorNames); //$NON-NLS-1$
+		
+		ValidatorSubsetOperation op44 = new ValidatorSubsetOperation(getProject(), false, false); // no force, no fork
+		op44.setValidators(allValidatorNames);
+		TestWrapper test44 = new TestWrapper(op44, tmdEnabled, "op44", allValidatorNames); //$NON-NLS-1$
+		
+		ValidatorSubsetOperation op45 = new ValidatorSubsetOperation(getProject(), true, IRuleGroup.PASS_FAST,false); // force
+		op45.setValidators(allValidatorNames);
+		TestWrapper test45 = new TestWrapper(op45, tmdEnabled, "op45", allValidatorNames); //$NON-NLS-1$
+		
+		ValidatorSubsetOperation op46 = new ValidatorSubsetOperation(getProject(), false, IRuleGroup.PASS_FAST,false); // no force
+		op46.setValidators(allValidatorNames);
+		TestWrapper test46 = new TestWrapper(op46, tmdEnabled, "op46", allValidatorNames); //$NON-NLS-1$
+		
+		ValidatorSubsetOperation op47 = new ValidatorSubsetOperation(getProject(), true, IRuleGroup.PASS_FAST, false); // force, no fork
+		op47.setValidators(allValidatorNames);
+		TestWrapper test47 = new TestWrapper(op47, tmdEnabled, "op47", allValidatorNames); //$NON-NLS-1$
+		
+		ValidatorSubsetOperation op48 = new ValidatorSubsetOperation(getProject(), false, IRuleGroup.PASS_FAST, false); // no force, no fork
+		op48.setValidators(allValidatorNames);
+		TestWrapper test48 = new TestWrapper(op48, tmdEnabled, "op48", allValidatorNames); //$NON-NLS-1$
+		
+		ValidatorSubsetOperation op49 = new EnabledIncrementalValidatorsOperation(getProject(), null,false);
+		op49.setValidators(allValidatorNames);
+		TestWrapper test49 = new TestWrapper(op49, tmdEnabled, "op49", allValidatorNames); //$NON-NLS-1$
+		
+		ValidatorSubsetOperation op50 = new EnabledIncrementalValidatorsOperation(getProject(), changedDelta,false);
+		op50.setValidators(incValidatorNames);
+		TestWrapper test50 = new TestWrapper(op50, tmdInc, "op50", incValidatorNames); //$NON-NLS-1$
+		
+		ValidatorSubsetOperation op51 = new EnabledIncrementalValidatorsOperation(getProject(), emptyDelta,false);
+		op51.setValidators(incValidatorNames);
+		TestWrapper test51 = new TestWrapper(op51, tmdEmpty, "op51", incValidatorNames); //$NON-NLS-1$
+		
+		ValidatorSubsetOperation op52 = new EnabledIncrementalValidatorsOperation(getProject(), null, false); // false=autoBuild disabled
+		op52.setValidators(allValidatorNames);
+		TestWrapper test52 = new TestWrapper(op52, tmdEnabled, "op52", allValidatorNames); //$NON-NLS-1$
+		
+		ValidatorSubsetOperation op53 = new EnabledIncrementalValidatorsOperation(getProject(), null, true); // true=autoBuild enabled
+		op53.setValidators(fullValidatorNames);
+		TestWrapper test53 = new TestWrapper(op53, tmdFull, "op53", fullValidatorNames); //$NON-NLS-1$
+		
+		ValidatorSubsetOperation op54 = new EnabledIncrementalValidatorsOperation(getProject(), changedDelta, false); // false=autoBuild disabled
+		op54.setValidators(incValidatorNames);
+		TestWrapper test54 = new TestWrapper(op54, tmdInc, "op54", incValidatorNames); //$NON-NLS-1$
+		
+		ValidatorSubsetOperation op55 = new EnabledIncrementalValidatorsOperation(getProject(), changedDelta, true); // true=autoBuild enabled
+		op55.setValidators(incValidatorNames);
+		TestWrapper test55 = new TestWrapper(op55, tmdEmpty, "op55", incValidatorNames); //$NON-NLS-1$
+		
+		ValidatorSubsetOperation op56 = new EnabledIncrementalValidatorsOperation(getProject(), emptyDelta, false); // false=autoBuild disabled
+		op56.setValidators(incValidatorNames);
+		TestWrapper test56 = new TestWrapper(op56, tmdEmpty, "op56", incValidatorNames); //$NON-NLS-1$
+		
+		ValidatorSubsetOperation op57 = new EnabledIncrementalValidatorsOperation(getProject(), emptyDelta, true); // true=autoBuild enabled
+		op57.setValidators(incValidatorNames);
+		TestWrapper test57 = new TestWrapper(op57, tmdEmpty, "op57", incValidatorNames); //$NON-NLS-1$
+		
+		ValidatorSubsetOperation op58 = new EnabledIncrementalValidatorsOperation(getProject(),null, IRuleGroup.PASS_FAST,false); // false=autoBuild disabled
+		op58.setValidators(allValidatorNames);
+		TestWrapper test58 = new TestWrapper(op58, tmdEnabled, "op58", allValidatorNames); //$NON-NLS-1$
+		
+		ValidatorSubsetOperation op59 = new EnabledIncrementalValidatorsOperation(getProject(), null, IRuleGroup.PASS_FAST,false); // true=autoBuild enabled
+		op59.setValidators(allValidatorNames);
+		TestWrapper test59 = new TestWrapper(op59, tmdFull, "op59", allValidatorNames); //$NON-NLS-1$
+		
+		ValidatorSubsetOperation op60 = new EnabledIncrementalValidatorsOperation(getProject(), changedDelta, IRuleGroup.PASS_FAST,false); // false=autoBuild disabled
+		op60.setValidators(incValidatorNames);
+		TestWrapper test60 = new TestWrapper(op60, tmdInc, "op60", incValidatorNames); //$NON-NLS-1$
+		
+		ValidatorSubsetOperation op61 = new EnabledIncrementalValidatorsOperation(getProject(), changedDelta, IRuleGroup.PASS_FAST,false); // true=autoBuild enabled
+		op61.setValidators(incValidatorNames);
+		TestWrapper test61 = new TestWrapper(op61, tmdEmpty, "op61", incValidatorNames); //$NON-NLS-1$
+		
+		ValidatorSubsetOperation op62 = new EnabledIncrementalValidatorsOperation(getProject(), emptyDelta,IRuleGroup.PASS_FAST,false); // false=autoBuild disabled
+		op62.setValidators(incValidatorNames);
+		TestWrapper test62 = new TestWrapper(op62, tmdEmpty, "op62", incValidatorNames); //$NON-NLS-1$
+		
+		ValidatorSubsetOperation op63 = new EnabledIncrementalValidatorsOperation(getProject(), emptyDelta,IRuleGroup.PASS_FAST,true); // true=autoBuild enabled
+		op63.setValidators(incValidatorNames);
+		TestWrapper test63 = new TestWrapper(op63, tmdEmpty, "op63", incValidatorNames); //$NON-NLS-1$
+		
+		ValidatorSubsetOperation op64 = new EnabledIncrementalValidatorsOperation(getProject(),null,IRuleGroup.PASS_FAST,true);
+		op64.setValidators(allValidatorNames);
+		TestWrapper test64 = new TestWrapper(op64, tmdEnabled, "op64", allValidatorNames); //$NON-NLS-1$
+		
+		ValidatorSubsetOperation op65 = new EnabledIncrementalValidatorsOperation(getProject(), changedDelta, IRuleGroup.PASS_FAST,true);
+		op65.setValidators(incValidatorNames);
+		TestWrapper test65 = new TestWrapper(op65, tmdInc, "op65", incValidatorNames); //$NON-NLS-1$
+		
+		ValidatorSubsetOperation op66 = new EnabledIncrementalValidatorsOperation(getProject(), emptyDelta, IRuleGroup.PASS_FAST,true);
+		op66.setValidators(incValidatorNames);
+		TestWrapper test66 = new TestWrapper(op66, tmdEmpty, "op66", incValidatorNames); //$NON-NLS-1$
+
+		if(changedClasses != null) {
+			ValidatorSubsetOperation op67 = new ValidatorSubsetOperation(getProject(), fileExtension, changedResources,false);
+			op67.setValidators(javaValidatorNames);
+			TestWrapper test67 = new TestWrapper(op67, tmdJava, "op67", javaValidatorNames); //$NON-NLS-1$
+			
+			ValidatorSubsetOperation op68 = new ValidatorSubsetOperation(getProject(), fileExtension, changedResources, false); // no fork
+			op68.setValidators(javaValidatorNames);
+			TestWrapper test68 = new TestWrapper(op68, tmdJava, "op68", javaValidatorNames); //$NON-NLS-1$
+			
+			ValidatorSubsetOperation op69 = new ValidatorSubsetOperation(getProject(), fileExtension, defaultExtension, changedResources,false);
+			op69.setValidators(javaValidatorNames);
+			TestWrapper test69 = new TestWrapper(op69, tmdJava, "op69", javaValidatorNames); //$NON-NLS-1$
+			
+			ValidatorSubsetOperation op70 = new ValidatorSubsetOperation(getProject(), fileExtension, defaultExtension, changedResources, false); // no fork
+			op70.setValidators(javaValidatorNames);
+			TestWrapper test70 = new TestWrapper(op70, tmdJava, "op70", javaValidatorNames); //$NON-NLS-1$
+			
+			ValidatorSubsetOperation op71 = new ValidatorSubsetOperation(getProject(), fileExtension, emptyResources,false);
+			op71.setValidators(javaValidatorNames);
+			TestWrapper test71 = new TestWrapper(op71, tmdEmpty, "op71", javaValidatorNames); //$NON-NLS-1$
+			
+			ValidatorSubsetOperation op72 = new ValidatorSubsetOperation(getProject(), fileExtension, emptyResources, false); // no fork
+			op72.setValidators(javaValidatorNames);
+			TestWrapper test72 = new TestWrapper(op72, tmdEmpty, "op72", javaValidatorNames); //$NON-NLS-1$
+			
+			ValidatorSubsetOperation op73 = new ValidatorSubsetOperation(getProject(), fileExtension, defaultExtension, emptyResources,false);
+			op73.setValidators(javaValidatorNames);
+			TestWrapper test73 = new TestWrapper(op73, tmdEmpty, "op73", javaValidatorNames); //$NON-NLS-1$
+			
+			ValidatorSubsetOperation op74 = new ValidatorSubsetOperation(getProject(), fileExtension, defaultExtension, emptyResources, false); // no fork
+			op74.setValidators(javaValidatorNames);
+			TestWrapper test74 = new TestWrapper(op74, tmdEmpty, "op74", javaValidatorNames); //$NON-NLS-1$
+			
+			ValidatorSubsetOperation op75 = new ValidatorSubsetOperation(getProject(), fileExtension, changedClasses,false);
+			op75.setValidators(javaValidatorNames);
+			TestWrapper test75 = new TestWrapper(op75, tmdJava, "op75", javaValidatorNames); //$NON-NLS-1$
+			
+			ValidatorSubsetOperation op76 = new ValidatorSubsetOperation(getProject(), fileExtension, changedClasses, false); // no fork
+			op76.setValidators(javaValidatorNames);
+			TestWrapper test76 = new TestWrapper(op76, tmdJava, "op76", javaValidatorNames); //$NON-NLS-1$
+			
+			ValidatorSubsetOperation op77 = new ValidatorSubsetOperation(getProject(), fileExtension, defaultExtension, changedClasses,false);
+			op77.setValidators(javaValidatorNames);
+			TestWrapper test77 = new TestWrapper(op77, tmdJava, "op77", javaValidatorNames); //$NON-NLS-1$
+			
+			ValidatorSubsetOperation op78 = new ValidatorSubsetOperation(getProject(), fileExtension, defaultExtension, changedClasses, false); // no fork
+			op78.setValidators(javaValidatorNames);
+			TestWrapper test78 = new TestWrapper(op78, tmdJava, "op78", javaValidatorNames); //$NON-NLS-1$
+			
+			TestWrapper[] result = new TestWrapper[] {
+				test1, test2, test3, test4, test5, test6, test7, test8, test9,
+				test10, test11, test12, test13, test14, test15, test16, test17, test18, test19,
+				test20, test21, test22, test23, test24, test25, test26, test27, test28, test29,
+				test30, test31, test32, test33, test34, test35, test36, test37, test38, test39,
+				test40, test41, test42, test43, test44, test45, test46, test47, test48, test49,
+				test50, test51, test52, test53, test54, test55, test56, test57, test58, test59,
+				test60, test61, test62, test63, test64, test65, test66, test67, test68, test69,
+				test70, test71, test72, test73, test74, test75, test76, test77, test78
+			};
+			return result;
+		}
+		else {
+			TestWrapper[] result = new TestWrapper[] {
+				test1, test2, test3, test4, test5, test6, test7, test8, test9,
+				test10, test11, test12, test13, test14, test15, test16, test17, test18, test19,
+				test20, test21, test22, test23, test24, test25, test26, test27, test28, test29,
+				test30, test31, test32, test33, test34, test35, test36, test37, test38, test39,
+				test40, test41, test42, test43, test44, test45, test46, test47, test48, test49,
+				test50, test51, test52, test53, test54, test55, test56, test57, test58, test59,
+				test60, test61, test62, test63, test64, test65, test66
+			};
+			return result;
+		}		
+	}
+
+	private class TestWrapper {
+		private List _messages = null;
+		private ValidationOperation _operation = null;
+		private String _testName = null;
+		private String[] _validatorNames = null;
+		
+		TestWrapper(ValidationOperation op, List expectedMessages, String testName, String[] validatorNames) {
+			_messages = expectedMessages;
+			_operation = op;
+			_testName = testName;
+			_validatorNames = validatorNames;
+		}
+		
+		public List getExpectedMessages() {
+			return _messages;
+		}
+		
+		public ValidationOperation getOperation() {
+			return _operation;
+		}
+		
+		public String getName() {
+			return _testName;
+		}
+		
+		public String[] getValidatorNames() {
+			return _validatorNames;
+		}
+	}
+}
+
diff --git a/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/VALFWK02Operation.java b/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/VALFWK02Operation.java
new file mode 100644
index 0000000..c7f9cf2
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/VALFWK02Operation.java
@@ -0,0 +1,711 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.validation.test.fwk;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.Collections;
+import java.util.Set;
+import java.util.logging.Level;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IncrementalProjectBuilder;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jem.util.logger.proxy.Logger;
+import org.eclipse.jst.validation.test.BVTValidationPlugin;
+import org.eclipse.jst.validation.test.IOperationRunnable;
+import org.eclipse.jst.validation.test.ValidationTypeEnum;
+import org.eclipse.jst.validation.test.fwk.validator.JDTUtility;
+import org.eclipse.jst.validation.test.internal.registry.ValidatorTestcase;
+import org.eclipse.jst.validation.test.internal.util.BVTRunner;
+import org.eclipse.jst.validation.test.setup.IBuffer;
+import org.eclipse.wst.validation.internal.ConfigurationManager;
+import org.eclipse.wst.validation.internal.GlobalConfiguration;
+import org.eclipse.wst.validation.internal.ProjectConfiguration;
+import org.eclipse.wst.validation.internal.TaskListUtility;
+import org.eclipse.wst.validation.internal.Tracing;
+import org.eclipse.wst.validation.internal.ValidationConfiguration;
+import org.eclipse.wst.validation.internal.ValidationRegistryReader;
+import org.eclipse.wst.validation.internal.ValidatorMetaData;
+import org.eclipse.wst.validation.internal.operations.EnabledValidatorsOperation;
+import org.eclipse.wst.validation.internal.operations.ValidatorManager;
+import org.eclipse.wst.validation.internal.provisional.core.IMessage;
+
+/**
+ * This class runs the VALFWK02 test.
+ */
+public final class VALFWK02Operation implements IOperationRunnable {
+	private IProject _project = null;
+	private IBuffer _buffer = null;
+	private String _testCaseName = null;
+	public static String NEWLINE = System.getProperty("line.separator"); //$NON-NLS-1$
+	
+	/**
+	 * Must have a public default constructor in order to createExecutableExtension.
+	 * MUST call setBuffer, setProject, and setName before using the operation.
+	 */
+	public VALFWK02Operation() {
+	}
+	
+	/**
+	 * IProject must exist and be open.
+	 */
+	public VALFWK02Operation(IBuffer buffer, IProject project, String testCaseName) {
+		setProject(project);
+		setBuffer(buffer);
+		setName(testCaseName);
+	}
+
+	public IBuffer getBuffer() { 
+		return _buffer;
+	}
+	
+	public void setBuffer(IBuffer b) {
+		_buffer = b;
+	}
+	
+	public IProject getProject() {
+		return _project;
+	}
+	
+	public void setProject(IProject p) {
+		_project = p;
+	}
+
+	public String getName() {
+		return _testCaseName;
+	}
+	
+	public void setName(String name) {
+		_testCaseName = name;
+	}	
+
+	public void run(IProgressMonitor monitor) {
+		IProject project = getProject();
+		if(project == null) {
+			throw new IllegalArgumentException("Run VALFWK02 on an existing open IProject."); //$NON-NLS-1$
+		}
+		
+		// First, add the ValidationBuilder to the Java Project
+		ValidatorManager.addProjectBuildValidationSupport(project);
+
+		// Save the old user configuration and restore it in the finally block.
+		try {
+			GlobalConfiguration gconf = ConfigurationManager.getManager().getGlobalConfiguration();
+			ProjectConfiguration pconf = ConfigurationManager.getManager().getProjectConfiguration(project);
+			GlobalConfiguration origGconf = new GlobalConfiguration(gconf); // copy the original values so that they can be restored in the finally block
+			ProjectConfiguration origPconf = new ProjectConfiguration(pconf); // copy the original values so that they can be restored in the finally block
+			boolean autoBuildEnabled = ResourcesPlugin.getWorkspace().isAutoBuilding();
+				
+			ValidatorMetaData[] configuredValidators = pconf.getValidators();
+			if(configuredValidators.length < 2) {
+				monitor.subTask("Run VALFWK02 on an existing open project that has at least two validators configured: one to enable, and one to disable."); //$NON-NLS-1$
+				return;
+			}
+
+			// Disable at least one validator for this test.
+			// Remove the first enabled validator from the Properties, and the second enabled validator from the
+			// Preferences. (It doesn't matter which validator is removed; it only matters that the Properties and
+			// the Preferences have different validators.)
+			ValidatorMetaData vfTestValidator = ValidationRegistryReader.getReader().getValidatorMetaData(TestOpConstrInputOperation.FWK_NOBUILD_TEST_VALIDATOR_CLASS); //$NON-NLS-1$
+			ValidatorMetaData vfNoBuildTestValidator = ValidationRegistryReader.getReader().getValidatorMetaData(TestOpConstrInputOperation.FWK_TEST_VALIDATOR_CLASS); //$NON-NLS-1$
+			ValidatorMetaData propertiesValidator = ValidationRegistryReader.getReader().getValidatorMetaData(TestOpConstrInputOperation.PROPERTIES_VALIDATOR_CLASS); //$NON-NLS-1$
+			ValidatorMetaData[] enabledPropValidators = new ValidatorMetaData[2];
+			enabledPropValidators[0] = vfTestValidator;
+			enabledPropValidators[1] = vfNoBuildTestValidator;
+			pconf.setEnabledValidators(enabledPropValidators);
+			//pconf.setMaximumNumberOfMessages(1);
+			pconf.passivate();
+
+			ValidatorMetaData[] enabledPrefValidators = new ValidatorMetaData[1];
+			enabledPrefValidators[0] = propertiesValidator;
+			gconf.setEnabledValidators(enabledPrefValidators);
+			//gconf.setMaximumNumberOfMessages(10);
+			gconf.passivate();
+			
+			
+			ValidatorTestcase[] tmds = JDTUtility.getVFTests(monitor, getProject());
+			if((tmds == null) || (tmds.length == 0)) {
+				monitor.subTask("Cannot run VALFWK02 because there are no test cases registered for JavaProject."); //$NON-NLS-1$
+				return;
+			}
+			
+			ValidatorTestcase fwkNobuildTestTMD = null;
+			ValidatorTestcase fwkTestTMD = null;
+			ValidatorTestcase propTMD = null;
+			for(int i=0; i<tmds.length; i++) {
+				ValidatorTestcase tmd = tmds[i];
+				if(tmd.getValidatorClass().equals(TestOpConstrInputOperation.FWK_TEST_VALIDATOR_CLASS)) {
+					fwkTestTMD = tmd;
+				}
+				else if(tmd.getValidatorClass().equals(TestOpConstrInputOperation.PROPERTIES_VALIDATOR_CLASS)) {
+					propTMD = tmd;
+				}
+				else if(tmd.getValidatorClass().equals(TestOpConstrInputOperation.FWK_NOBUILD_TEST_VALIDATOR_CLASS)) {
+					fwkNobuildTestTMD = tmd;
+				}
+				
+				if((fwkTestTMD != null) && (propTMD != null) && (fwkNobuildTestTMD != null)) {
+					break;
+				}
+			}
+			
+			if((fwkTestTMD == null) || (propTMD == null) || (fwkNobuildTestTMD == null)) {
+				// Can't run the tests
+				monitor.subTask("Cannot run VALFWK02 because the test case is missing for either the VF Test Validator, Properties Validator, or both."); //$NON-NLS-1$
+				return;
+			}
+			
+			try {
+				// Set level to FINEST so that the launch validators are accumulated in ValidationOperation.
+				// (See ValidationOperation::getLaunchedValidators())
+				Tracing.setForceLogging(true);
+				
+				getBuffer().write("testPropNotOverride"); //$NON-NLS-1$
+				int allowPass = testPropNotOverride(monitor, project, gconf, pconf, propTMD);
+				getBuffer().write(NEWLINE); //$NON-NLS-1$
+				getBuffer().write("testPropOverride"); //$NON-NLS-1$
+				int propPass = testPropOverride(monitor, project, gconf, pconf, fwkTestTMD);
+				getBuffer().write(NEWLINE); //$NON-NLS-1$
+				getBuffer().write("testPrefNotAllowOverride"); //$NON-NLS-1$
+				int notAllowPass = testPrefNotAllowOverride(monitor, project, gconf, pconf, propTMD);
+				StringBuffer result = new StringBuffer(NEWLINE);
+				result.append("Properties Doesn't Override: "); //$NON-NLS-1$
+				result.append(allowPass);
+				result.append(" of 7 pass."); //$NON-NLS-1$
+				result.append(NEWLINE);
+				result.append("Properites Overrides: "); //$NON-NLS-1$
+				result.append(propPass);
+				result.append(" of 7 pass."); //$NON-NLS-1$
+				result.append(NEWLINE);
+				result.append("Preference Doesn't Allow Override: "); //$NON-NLS-1$
+				result.append(notAllowPass);
+				result.append(" of 7 pass."); //$NON-NLS-1$
+				result.append(NEWLINE);
+				monitor.subTask(result.toString());
+				getBuffer().write(NEWLINE); //$NON-NLS-1$
+				getBuffer().write(result.toString());
+			}
+			finally {
+				gconf = origGconf;
+				gconf.passivate();
+				
+				pconf = origPconf;
+				pconf.passivate();
+				
+				JDTUtility.setAutoBuild(autoBuildEnabled);
+	
+			}
+		}
+		catch(InvocationTargetException exc) {
+			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+			if(logger.isLoggingLevel(Level.SEVERE)) {
+				logger.write(Level.SEVERE, exc);
+				if(exc.getTargetException() != null) {
+					logger.write(Level.SEVERE, exc.getTargetException());
+				}
+			}
+		}
+		catch(Throwable exc) {
+			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+			if(logger.isLoggingLevel(Level.SEVERE)) {
+				logger.write(Level.SEVERE, exc);
+			}
+		}
+	}
+	
+	private static void debug(IBuffer buffer, String title, ValidatorMetaData[] enabledValidators) {
+		buffer.write("Contents of " + title); //$NON-NLS-1$
+		for(int i=0; i<enabledValidators.length; i++) {
+			ValidatorMetaData vmd = enabledValidators[i];
+			buffer.write("\t" + vmd.getValidatorDisplayName()); //$NON-NLS-1$
+		}
+		buffer.write("End contents of " + title); //$NON-NLS-1$
+		buffer.write(NEWLINE); //$NON-NLS-1$
+	}
+	
+	
+	private int testPropNotOverride(final IProgressMonitor monitor, final IProject project, GlobalConfiguration gconf, ProjectConfiguration pconf, ValidatorTestcase tmd) {
+		int numPass = 0;
+		try {
+			// Set up the user configuration for the test. The run(IProgressMonitor) method
+			// will set the values back to what they were before the test.		
+			gconf.setCanProjectsOverride(true);
+			gconf.passivate();
+			pconf.setDoesProjectOverride(false);
+			pconf.passivate();
+			
+			ValidatorManager.getManager().updateTaskList(project); // Update the task list because the preference and properties page do, so the configuration classes don't.
+			
+			debug(getBuffer(), "Enabled Properties Validators", pconf.getEnabledValidators()); //$NON-NLS-1$
+			debug(getBuffer(), "Enabled Preference Validators", gconf.getEnabledValidators()); //$NON-NLS-1$
+	
+			numPass = validate(monitor, project, gconf, tmd, "testPropNotOverride"); //$NON-NLS-1$
+		}
+		catch(InvocationTargetException exc) {
+			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+			if(logger.isLoggingLevel(Level.SEVERE)) {
+				logger.write(Level.SEVERE, exc);
+				if(exc.getTargetException() != null) {
+					logger.write(Level.SEVERE, exc.getTargetException());
+				}
+			}
+			numPass = 0;
+		}
+		catch(Throwable exc) {
+			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+			if(logger.isLoggingLevel(Level.SEVERE)) {
+				logger.write(Level.SEVERE, exc);
+			}
+			numPass = 0;
+		}
+		
+			return numPass;
+	}
+	
+	
+	private int testPropOverride(final IProgressMonitor monitor, final IProject project, GlobalConfiguration gconf, ProjectConfiguration pconf, ValidatorTestcase tmd) {
+		int numPass = 0;
+		try {
+			// Set up the user configuration for the test. The run(IProgressMonitor) method
+			// will set the values back to what they were before the test.		
+			gconf.setCanProjectsOverride(true);
+			gconf.passivate();
+			pconf.setDoesProjectOverride(true);
+			pconf.passivate();
+
+			ValidatorManager.getManager().updateTaskList(project); // Update the task list because the preference and properties page do, so the configuration classes don't.
+			
+			debug(getBuffer(), "Enabled Properties Validators", pconf.getEnabledValidators()); //$NON-NLS-1$
+			debug(getBuffer(), "Enabled Preference Validators", gconf.getEnabledValidators()); //$NON-NLS-1$
+	
+			numPass = validate(monitor, project, pconf, tmd, "testPropOverride"); //$NON-NLS-1$
+		}
+		catch(InvocationTargetException exc) {
+			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+			if(logger.isLoggingLevel(Level.SEVERE)) {
+				logger.write(Level.SEVERE, exc);
+				if(exc.getTargetException() != null) {
+					logger.write(Level.SEVERE, exc.getTargetException());
+				}
+			}
+		}
+		catch(Throwable exc) {
+			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+			if(logger.isLoggingLevel(Level.SEVERE)) {
+				logger.write(Level.SEVERE, exc);
+			}
+		}
+		return numPass;
+	}
+	
+	private int testPrefNotAllowOverride(final IProgressMonitor monitor, final IProject project, GlobalConfiguration gconf, ProjectConfiguration pconf, ValidatorTestcase tmd) {
+		int numPass = 0;
+		try {
+			// Set up the user configuration for the test. The run(IProgressMonitor) method
+			// will set the values back to what they were before the test.		
+			gconf.setCanProjectsOverride(false);
+			gconf.passivate();
+			pconf.setDoesProjectOverride(true);
+			pconf.passivate();
+
+			ValidatorManager.getManager().updateTaskList(project); // Update the task list because the preference and properties page do, so the configuration classes don't.
+			
+			debug(getBuffer(), "Enabled Properties Validators", pconf.getEnabledValidators()); //$NON-NLS-1$
+			debug(getBuffer(), "Enabled Preference Validators", gconf.getEnabledValidators()); //$NON-NLS-1$
+	
+			numPass = validate(monitor, project, gconf, tmd, "testPrefNotAllowOverride"); //$NON-NLS-1$
+		}
+		catch(InvocationTargetException exc) {
+			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+			if(logger.isLoggingLevel(Level.SEVERE)) {
+				logger.write(Level.SEVERE, exc);
+				if(exc.getTargetException() != null) {
+					logger.write(Level.SEVERE, exc.getTargetException());
+				}
+			}
+		}
+		catch(Throwable exc) {
+			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+			if(logger.isLoggingLevel(Level.SEVERE)) {
+				logger.write(Level.SEVERE, exc);
+			}
+		}
+		return numPass;
+	}
+	
+	private int validate(IProgressMonitor monitor, IProject project, ValidationConfiguration vconf, ValidatorTestcase tmd, String testName) {
+		int numPass = 0;
+		boolean successful = true; // Assume that all of the test cases will pass.
+		try {
+			// For the first four tests, need all of the messages to be reported
+			//int originalLimit = vconf.getMaximumNumberOfMessages();
+			//vconf.setMaximumNumberOfMessages(WorkbenchReporter.NO_MESSAGE_LIMIT);
+			vconf.passivate();
+			
+			boolean pass = runValidation(monitor, project, vconf);
+			if(!pass) {
+//				getBuffer().write(testName + "::runValidation failed"); //$NON-NLS-1$
+				successful = false;
+			}
+			else {
+				numPass++;
+//				getBuffer().write(testName + "::runValidation passed"); //$NON-NLS-1$
+			}
+			getBuffer().addExecutionStatus(getName(), "::" + testName + "runValidation", pass); //$NON-NLS-1$ //$NON-NLS-2$
+			
+			pass = fullBuildValidate(monitor, project, vconf, tmd);
+			if(!pass) {
+//				getBuffer().write(testName + "::fullBuildValidation failed"); //$NON-NLS-1$
+				successful = false;
+			}
+			else {
+				numPass++;
+//				getBuffer().write(testName + "::fullBuildValidation passed"); //$NON-NLS-1$
+			}
+			getBuffer().addExecutionStatus(getName(), "::" + testName + "fullBuildValidation", pass); //$NON-NLS-1$ //$NON-NLS-2$
+			
+			pass = autoValidateEnabled(monitor, project, vconf, tmd);
+			if(!pass) {
+				successful = false;
+//				getBuffer().write(testName + "::autoValidateEnabled failed"); //$NON-NLS-1$
+			}
+			else {
+				numPass++;
+//				getBuffer().write(testName + "::autoValidateEnabled passed"); //$NON-NLS-1$
+			}
+			getBuffer().addExecutionStatus(getName(), "::" + testName + "autoValidateEnabled", pass); //$NON-NLS-1$ //$NON-NLS-2$
+			
+			pass = autoValidateDisabled(monitor, project, vconf, tmd);
+			if(!pass) {
+//				getBuffer().write(testName + "::autoValidateDisabled failed"); //$NON-NLS-1$
+				successful = false;
+			}
+			else {
+				numPass++;
+//				getBuffer().write(testName + "::autoValidateDisabled passed"); //$NON-NLS-1$
+			}
+			getBuffer().addExecutionStatus(getName(), "::" + testName + "autoValidateDisabled", pass); //$NON-NLS-1$ //$NON-NLS-2$
+			
+			pass = buildValidateEnabled(monitor, project, vconf, tmd);
+			if(!pass) {
+//				getBuffer().write(testName + "::buildValidateEnabled failed"); //$NON-NLS-1$
+				successful = false;
+			}
+			else {
+				numPass++;
+//				getBuffer().write(testName + "::buildValidateEnabled passed"); //$NON-NLS-1$
+			}
+			getBuffer().addExecutionStatus(getName(), "::" + testName + "buildValidateEnabled", pass); //$NON-NLS-1$ //$NON-NLS-2$
+
+			pass = buildValidateDisabled(monitor, project, vconf, tmd);
+			if(!pass) {
+//				getBuffer().write(testName + "::buildValidateDisabled failed"); //$NON-NLS-1$
+				successful = false;
+			}
+			else {
+				numPass++;
+//				getBuffer().write(testName + "::buildValidateDisabled passed"); //$NON-NLS-1$
+			}
+			getBuffer().addExecutionStatus(getName(), "::" + testName + "buildValidateDisabled", pass); //$NON-NLS-1$ //$NON-NLS-2$
+
+			// And for this test, the original limit needs to be enforced
+			//vconf.setMaximumNumberOfMessages(originalLimit);
+			vconf.passivate();
+
+			pass = maxMessagesReported(monitor, project, vconf);
+			if(!pass) {
+				successful = false;
+//				getBuffer().write(testName + "::maxMessagesReported failed"); //$NON-NLS-1$
+			}
+			else {
+				numPass++;
+//				getBuffer().write(testName + "::maxMessagesReported passed"); //$NON-NLS-1$
+			}
+			getBuffer().addExecutionStatus(getName(), "::" + testName + "maxMessagesReported", pass); //$NON-NLS-1$ //$NON-NLS-2$
+		}
+		catch(InvocationTargetException exc) {
+			successful = false;
+			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+			if(logger.isLoggingLevel(Level.SEVERE)) {
+				logger.write(Level.SEVERE, exc);
+				if(exc.getTargetException() != null) {
+					logger.write(Level.SEVERE, exc.getTargetException());
+				}
+			}
+		}
+		finally {
+			getBuffer().addExecutionStatus(getName(), testName, successful); //$NON-NLS-1$
+		}
+		return numPass;
+	}
+	
+	private boolean runValidation(IProgressMonitor monitor, IProject project, ValidationConfiguration vconf) {
+		boolean passed = true;
+		try {
+			// Unlike the other validations, which rely on a build, this method has access to the
+			// operation and can query it for the list of validators that were launched. This technique
+			// is better because it doesn't rely on the validator producing the correct output (markers).
+			// VALFWK02 just wants to check that the correct validators were launched; the TestOpConstr
+			// test wants to check the result given different output and constructor of the Operation.
+			
+			EnabledValidatorsOperation validOp = new EnabledValidatorsOperation(project,false);
+			ResourcesPlugin.getWorkspace().run(validOp, monitor);
+			// Launched validators should be configured, enabled, and had files to validate on the project.
+			Set<ValidatorMetaData> launchedValidators = validOp.getLaunchedValidators();
+			
+			// Since a full validation was run, the launched validators should be equivalent
+			// to the configured enabled valdiators.
+			ValidatorMetaData[] enabledValidators = vconf.getEnabledValidators();
+			for(int i=0; i<enabledValidators.length; i++) {
+				ValidatorMetaData vmd = enabledValidators[i];
+				
+				// If it's configured on the project, ensure that the enabled validator was launched.
+				// (May not be configured if the enabled validators is the list of Preference enabled
+				// validators.)
+				if(!launchedValidators.contains(vmd)) {
+					getBuffer().write("ERROR: Expected validator " + vmd.getValidatorDisplayName() + " was not run on project " + project.getName() + ". Failing test."); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+					passed = false;
+				}
+				else {
+					getBuffer().write("INFO: Expected validator " + vmd.getValidatorDisplayName() + " ran as expected on project " + project.getName() + "."); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+				}
+			}
+			
+			if(passed == false) {
+				getBuffer().write("launched validators are the following:"); //$NON-NLS-1$
+				for(ValidatorMetaData vmd : launchedValidators) {
+					getBuffer().write("\t" + vmd.getValidatorDisplayName()); //$NON-NLS-1$
+				}
+				getBuffer().write("end of launched validators"); //$NON-NLS-1$
+			}
+		}
+		catch(CoreException exc) {
+			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+			if(logger.isLoggingLevel(Level.SEVERE)) {
+				logger.write(Level.SEVERE, exc);
+			}
+			passed = false;
+		}
+		catch(InvocationTargetException exc) {
+			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+			if(logger.isLoggingLevel(Level.SEVERE)) {
+				logger.write(Level.SEVERE, exc);
+				if(exc.getTargetException() != null) {
+					logger.write(Level.SEVERE, exc.getTargetException());
+				}
+			}
+		}
+		
+		
+		return passed;
+	}
+	
+	private boolean fullBuildValidate(IProgressMonitor monitor, IProject project, ValidationConfiguration vconf, ValidatorTestcase tmd) {
+		try {
+			//vconf.setBuildValidate(true);
+			vconf.passivate();
+
+			TaskListUtility.removeAllTasks(project);
+			IResource[] changedResources = tmd.getResources(project);;
+			TestOpConstrInputOperation.touch(project, changedResources);
+			
+			project.build(IncrementalProjectBuilder.FULL_BUILD, monitor);
+			IMarker[] messagesAfterBuild = TaskListUtility.getValidationTasks(project, IMessage.ALL_MESSAGES);
+			
+			return BVTRunner.singleton().compare(getBuffer(), getName(), tmd.getName(), tmd.getMessages(ValidationTypeEnum.FULL_VALIDATION), messagesAfterBuild);
+		}
+		catch(CoreException exc) {
+			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+			if(logger.isLoggingLevel(Level.SEVERE)) {
+				logger.write(Level.SEVERE, exc);
+			}
+			return false;
+		}
+		catch(InvocationTargetException exc) {
+			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+			if(logger.isLoggingLevel(Level.SEVERE)) {
+				logger.write(Level.SEVERE, exc);
+				if(exc.getTargetException() != null) {
+					logger.write(Level.SEVERE, exc.getTargetException());
+				}
+			}
+			return false;
+		}
+	}
+	
+	private boolean autoValidateEnabled(IProgressMonitor monitor, IProject project, ValidationConfiguration vconf, ValidatorTestcase tmd) {
+		JDTUtility.setAutoBuild(true);
+		
+		try {
+			//vconf.setAutoValidate(true);
+			vconf.passivate();
+			
+			TaskListUtility.removeAllTasks(project);
+			IResource[] changedResources = tmd.getResources(project);;
+			TestOpConstrInputOperation.touch(project, changedResources);
+			
+			project.build(IncrementalProjectBuilder.AUTO_BUILD, monitor);
+			IMarker[] messagesAfterBuild = TaskListUtility.getValidationTasks(project, IMessage.ALL_MESSAGES);
+			
+			return BVTRunner.singleton().compare(getBuffer(), getName(), tmd.getName(), tmd.getMessages(ValidationTypeEnum.AUTO_VALIDATION), messagesAfterBuild);
+		}
+		catch(CoreException exc) {
+			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+			if(logger.isLoggingLevel(Level.SEVERE)) {
+				logger.write(Level.SEVERE, exc);
+			}
+			return false;
+		}
+		catch(InvocationTargetException exc) {
+			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+			if(logger.isLoggingLevel(Level.SEVERE)) {
+				logger.write(Level.SEVERE, exc);
+				if(exc.getTargetException() != null) {
+					logger.write(Level.SEVERE, exc.getTargetException());
+				}
+			}
+			return false;
+		}
+	}
+	
+	private boolean autoValidateDisabled(IProgressMonitor monitor, IProject project, ValidationConfiguration vconf, ValidatorTestcase tmd) {
+		JDTUtility.setAutoBuild(true);
+
+		try {		
+			//vconf.setAutoValidate(false);
+			vconf.passivate();
+
+			TaskListUtility.removeAllTasks(project);
+			IResource[] changedResources = tmd.getResources(project);
+			TestOpConstrInputOperation.touch(project, changedResources);
+		
+			project.build(IncrementalProjectBuilder.AUTO_BUILD, monitor);
+			IMarker[] messagesAfterBuild = TaskListUtility.getValidationTasks(project, IMessage.ALL_MESSAGES);
+			
+			// Pass in an empty list because the validation isn't supposed to run.
+			return BVTRunner.singleton().compare(getBuffer(), getName(), tmd.getName(), Collections.EMPTY_LIST, messagesAfterBuild);
+		}
+		catch(CoreException exc) {
+			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+			if(logger.isLoggingLevel(Level.SEVERE)) {
+				logger.write(Level.SEVERE, exc);
+			}
+			return false;
+		}
+		catch(InvocationTargetException exc) {
+			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+			if(logger.isLoggingLevel(Level.SEVERE)) {
+				logger.write(Level.SEVERE, exc);
+				if(exc.getTargetException() != null) {
+					logger.write(Level.SEVERE, exc.getTargetException());
+				}
+			}
+			return false;
+		}
+	}
+	
+	private boolean buildValidateEnabled(IProgressMonitor monitor, IProject project, ValidationConfiguration vconf, ValidatorTestcase tmd) {
+		try {
+			//vconf.setBuildValidate(true);
+			vconf.passivate();
+			JDTUtility.setAutoBuild(false);
+	
+			// Construct the input
+			TaskListUtility.removeAllTasks(project);
+			IResource[] changedResources = tmd.getResources(project);
+			TestOpConstrInputOperation.touch(project, changedResources);
+			try {		
+				project.build(IncrementalProjectBuilder.INCREMENTAL_BUILD, monitor);
+			}
+			catch(CoreException exc) {
+				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+				if(logger.isLoggingLevel(Level.SEVERE)) {
+					logger.write(Level.SEVERE, exc);
+				}
+				return false;
+			}
+			IMarker[] messagesAfterBuild = TaskListUtility.getValidationTasks(project, IMessage.ALL_MESSAGES);
+			
+			return BVTRunner.singleton().compare(getBuffer(), getName(), tmd.getName(), tmd.getMessages(ValidationTypeEnum.INCREMENTAL_VALIDATION), messagesAfterBuild);
+		}
+		catch(InvocationTargetException exc) {
+			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+			if(logger.isLoggingLevel(Level.SEVERE)) {
+				logger.write(Level.SEVERE, exc);
+				if(exc.getTargetException() != null) {
+					logger.write(Level.SEVERE, exc.getTargetException());
+				}
+			}
+			return false;
+		}
+	}
+	
+	private boolean buildValidateDisabled(IProgressMonitor monitor, IProject project, ValidationConfiguration vconf, ValidatorTestcase tmd) {
+		try {
+			//vconf.setBuildValidate(false);
+			vconf.passivate();
+			JDTUtility.setAutoBuild(false);
+			
+			// Construct the input
+			TaskListUtility.removeAllTasks(project);
+			IResource[] changedResources = tmd.getResources(project);
+			TestOpConstrInputOperation.touch(project, changedResources);
+			try {		
+				project.build(IncrementalProjectBuilder.INCREMENTAL_BUILD, monitor);
+				IMarker[] messagesAfterBuild = TaskListUtility.getValidationTasks(project, IMessage.ALL_MESSAGES);
+
+				// Pass in an empty list because validation isn't supposed to run.				
+				return BVTRunner.singleton().compare(getBuffer(), getName(), tmd.getName(), Collections.EMPTY_LIST, messagesAfterBuild);
+			}
+			catch(CoreException exc) {
+				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+				if(logger.isLoggingLevel(Level.SEVERE)) {
+					logger.write(Level.SEVERE, exc);
+				}
+				return false;
+			}
+		}
+		catch(InvocationTargetException exc) {
+			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+			if(logger.isLoggingLevel(Level.SEVERE)) {
+				logger.write(Level.SEVERE, exc);
+				if(exc.getTargetException() != null) {
+					logger.write(Level.SEVERE, exc.getTargetException());
+				}
+			}
+			return false;
+		}
+	}
+	
+	private boolean maxMessagesReported(IProgressMonitor monitor, IProject project, ValidationConfiguration vconf) {
+			EnabledValidatorsOperation validOp = null;
+			try {
+				validOp = new EnabledValidatorsOperation(project,false);
+				ResourcesPlugin.getWorkspace().run(validOp, monitor);
+			}
+			catch(CoreException exc) {
+				Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+				if(logger.isLoggingLevel(Level.SEVERE)) {
+					logger.write(Level.SEVERE, exc);
+				}
+				return false;
+			}
+			
+			return false;
+		}
+		
+}
+
+
diff --git a/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/validator/FwkNoBuildTestHelper.java b/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/validator/FwkNoBuildTestHelper.java
new file mode 100644
index 0000000..9ad3df8
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/validator/FwkNoBuildTestHelper.java
@@ -0,0 +1,131 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.validation.test.fwk.validator;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceVisitor;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jem.java.JavaHelpers;
+import org.eclipse.jst.j2ee.internal.validation.AWorkbenchMOFHelper;
+import org.eclipse.wst.validation.internal.core.IFileDelta;
+import org.eclipse.wst.validation.internal.operations.WorkbenchFileDelta;
+import org.eclipse.wst.validation.internal.provisional.core.IMessage;
+
+public class FwkNoBuildTestHelper extends AWorkbenchMOFHelper {
+	
+	public FwkNoBuildTestHelper() {
+		super();
+		
+		registerModel(FwkTestValidator.ALL_FILES, "loadAllFiles"); //$NON-NLS-1$
+		registerModel(FwkTestValidator.JAVAHELPERS, "loadJavaHelpers", new Class[]{IFileDelta.class}); //$NON-NLS-1$
+	}
+
+	/* (non-Javadoc)
+	 * @see com.ibm.etools.validate.IWorkbenchHelper#getTargetObjectName(java.lang.Object)
+	 */
+	public String getTargetObjectName(Object arg0) {
+		// No target objects outside of an IResource are used, therefore no target object names are needed.
+		return null;
+	}
+
+	public IFileDelta[] loadAllFiles() {
+		IProject project = getProject();
+		
+		final Set files = new HashSet();
+		IResourceVisitor visitor = new IResourceVisitor() {
+			public boolean visit(IResource res) throws CoreException {
+				if(!res.isAccessible()) {
+					return false; // if the resource isn't accessible then neither are its children
+				}
+				
+				if((res instanceof IFile) && ("java".equals(res.getFileExtension()))) { //$NON-NLS-1$
+					WorkbenchFileDelta newFileDelta = new WorkbenchFileDelta(res.getFullPath().toString(), IFileDelta.CHANGED, res);
+					files.add(newFileDelta);
+				}
+
+				return true; // visit the resource's children as well
+			}
+		};
+
+		try {
+			project.accept(visitor, IResource.DEPTH_INFINITE, true); // true means include phantom resources
+		}
+		catch(CoreException exc) {
+			exc.printStackTrace();
+		}
+		
+		IFileDelta[] result = new IFileDelta[files.size()];
+		files.toArray(result);
+		return result;
+	}
+	
+	public JavaHelpers loadJavaHelpers(IFileDelta delta) {
+		WorkbenchFileDelta fd = (WorkbenchFileDelta)delta;
+		IResource result = fd.getResource();
+		if(result != null){
+			if(result instanceof IFile) {
+				return JDTUtility.getJavaHelpers((IFile)result);
+			}
+			else {
+				return null;
+			}
+		}
+		else {
+			// This validator validates only .java files, so this
+			// must be an instanceof JavaClass.
+			return (JavaHelpers)fd.getObject();
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see com.ibm.etools.validate.IWorkbenchHelper#getResource(java.lang.Object)
+	 */
+	public IResource getResource(Object object) {
+		IResource result = super.getResource(object);
+		if((result != null) && (result.exists())) {
+			return result;
+		}
+		
+		if (object == null) {
+			return null;
+		}
+
+		if(object instanceof JavaHelpers) {
+			// If the message was added to a JavaHelpers, this method will be called.
+			return JDTUtility.getResource(getProject(), (JavaHelpers) object);
+		}
+		else if(object instanceof WorkbenchFileDelta) {
+			// If the workbench is removing messages from files, and the object is set
+			// instead of the IResource, need to process the delta's object instead of
+			// its resource.
+			return JDTUtility.getResource(getProject(), (JavaHelpers)((WorkbenchFileDelta)object).getObject());
+		}
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.ibm.etools.validate.AWorkbenchHelper#getLineNo(java.lang.Object)
+	 */
+	public int getLineNo(Object object) {
+		int lineNo = super.getLineNo(object);
+		if(lineNo == IMessage.LINENO_UNSET) {
+			// No adapters, so fudge the line number by adding the message to the first line in the file.
+			return 1;
+		}
+		return lineNo;
+	}
+
+}
diff --git a/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/validator/FwkNoBuildTestValidator.java b/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/validator/FwkNoBuildTestValidator.java
new file mode 100644
index 0000000..18242f0
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/validator/FwkNoBuildTestValidator.java
@@ -0,0 +1,45 @@
+package org.eclipse.jst.validation.test.fwk.validator;
+
+import org.eclipse.jem.java.JavaHelpers;
+import org.eclipse.wst.validation.internal.core.IFileDelta;
+import org.eclipse.wst.validation.internal.core.ValidationException;
+import org.eclipse.wst.validation.internal.operations.LocalizedMessage;
+import org.eclipse.wst.validation.internal.provisional.core.IMessage;
+import org.eclipse.wst.validation.internal.provisional.core.IReporter;
+import org.eclipse.wst.validation.internal.provisional.core.IValidationContext;
+import org.eclipse.wst.validation.internal.provisional.core.IValidator;
+
+public class FwkNoBuildTestValidator implements IValidator {
+	public static final String ALL_FILES = "ALL_FILES"; // Load all IFileDeltas for the entire contents of the current project. //$NON-NLS-1$
+	public static final String JAVAHELPERS = "JAVAHELPERS"; // The JavaClass that the IFileDelta maps to. //$NON-NLS-1$
+
+	/* (non-Javadoc)
+	 * @see com.ibm.etools.validation.IValidator#cleanup(com.ibm.etools.validation.IReporter)
+	 */
+	public void cleanup(IReporter reporter) {
+		// Nothing is cached, so nothing to do.
+	}
+
+	/* (non-Javadoc)
+	 * @see com.ibm.etools.validation.IValidator#validate(com.ibm.etools.validation.IHelper, com.ibm.etools.validation.IReporter, com.ibm.etools.validation.IFileDelta[])
+	 */
+	public void validate(IValidationContext helper, IReporter reporter) throws ValidationException {
+		IFileDelta[] delta = null ;
+		if((delta == null) || (delta.length ==0)) {
+			// Full Validate
+			delta = (IFileDelta[])helper.loadModel(ALL_FILES);
+		}
+		
+		if(delta == null) {
+			// Problem loading the files
+			return;
+		}
+		
+		for(int i=0; i<delta.length; i++) {
+			JavaHelpers target = (JavaHelpers)helper.loadModel(JAVAHELPERS, new Object[]{delta[i]});
+			LocalizedMessage message = new LocalizedMessage(IMessage.LOW_SEVERITY, "This is a test message for the validation framework, reported by VF NoBuild Test Validator. Please ignore.", target); //$NON-NLS-1$
+			reporter.addMessage(this, message);
+		}
+	}
+
+}
diff --git a/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/validator/FwkTestHelper.java b/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/validator/FwkTestHelper.java
new file mode 100644
index 0000000..4274e55
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/validator/FwkTestHelper.java
@@ -0,0 +1,121 @@
+package org.eclipse.jst.validation.test.fwk.validator;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceVisitor;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jem.java.JavaHelpers;
+import org.eclipse.jst.j2ee.internal.validation.AWorkbenchMOFHelper;
+import org.eclipse.wst.validation.internal.core.IFileDelta;
+import org.eclipse.wst.validation.internal.operations.WorkbenchFileDelta;
+import org.eclipse.wst.validation.internal.provisional.core.IMessage;
+
+public class FwkTestHelper extends AWorkbenchMOFHelper {
+	
+	public FwkTestHelper() {
+		super();
+		
+		registerModel(FwkTestValidator.ALL_FILES, "loadAllFiles"); //$NON-NLS-1$
+		registerModel(FwkTestValidator.JAVAHELPERS, "loadJavaHelpers", new Class[]{IFileDelta.class}); //$NON-NLS-1$
+	}
+
+	/* (non-Javadoc)
+	 * @see com.ibm.etools.validate.IWorkbenchHelper#getTargetObjectName(java.lang.Object)
+	 */
+	public String getTargetObjectName(Object arg0) {
+		// No target objects outside of an IResource are used, therefore no target object names are needed.
+		return null;
+	}
+
+	public IFileDelta[] loadAllFiles() {
+		IProject project = getProject();
+		
+		final Set files = new HashSet();
+		IResourceVisitor visitor = new IResourceVisitor() {
+			public boolean visit(IResource res) throws CoreException {
+				if(!res.isAccessible()) {
+					return false; // if the resource isn't accessible then neither are its children
+				}
+				
+				if((res instanceof IFile) && ( (res.getFileExtension() != null) && res.getFileExtension().equals("java"))) { //$NON-NLS-1$
+					WorkbenchFileDelta newFileDelta = new WorkbenchFileDelta(res.getFullPath().toString(), IFileDelta.CHANGED, res);
+					files.add(newFileDelta);
+				}
+
+				return true; // visit the resource's children as well
+			}
+		};
+
+		try {
+			project.accept(visitor, IResource.DEPTH_INFINITE, true); // true means include phantom resources
+		}
+		catch(CoreException exc) {
+			exc.printStackTrace();
+		}
+		
+		IFileDelta[] result = new IFileDelta[files.size()];
+		files.toArray(result);
+		return result;
+	}
+	
+	public JavaHelpers loadJavaHelpers(IFileDelta delta) {
+		WorkbenchFileDelta fd = (WorkbenchFileDelta)delta;
+		IResource result = fd.getResource();
+		if(result != null){
+			if(result instanceof IFile) {
+				return JDTUtility.getJavaHelpers((IFile)result);
+			}
+			else {
+				return null;
+			}
+		}
+		else {
+			// This validator validates only .java files, so this
+			// must be an instanceof JavaClass.
+			return (JavaHelpers)fd.getObject();
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see com.ibm.etools.validate.IWorkbenchHelper#getResource(java.lang.Object)
+	 */
+	public IResource getResource(Object object) {
+		IResource result = super.getResource(object);
+		if((result != null) && (result.exists())) {
+			return result;
+		}
+		
+		if (object == null) {
+			return null;
+		}
+
+		if(object instanceof JavaHelpers) {
+			// If the message was added to a JavaHelpers, this method will be called.
+			return JDTUtility.getResource(getProject(), (JavaHelpers) object);
+		}
+		else if(object instanceof WorkbenchFileDelta) {
+			// If the workbench is removing messages from files, and the object is set
+			// instead of the IResource, need to process the delta's object instead of
+			// its resource.
+			return JDTUtility.getResource(getProject(), (JavaHelpers)((WorkbenchFileDelta)object).getObject());
+		}
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.ibm.etools.validate.AWorkbenchHelper#getLineNo(java.lang.Object)
+	 */
+	public int getLineNo(Object object) {
+		int lineNo = super.getLineNo(object);
+		if(lineNo == IMessage.LINENO_UNSET) {
+			// No adapters, so fudge the line number by adding the message to the first line in the file.
+			return 1;
+		}
+		return lineNo;
+	}
+
+}
diff --git a/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/validator/FwkTestValidator.java b/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/validator/FwkTestValidator.java
new file mode 100644
index 0000000..6d1fabd
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/validator/FwkTestValidator.java
@@ -0,0 +1,45 @@
+package org.eclipse.jst.validation.test.fwk.validator;
+
+import org.eclipse.jem.java.JavaHelpers;
+import org.eclipse.wst.validation.internal.core.IFileDelta;
+import org.eclipse.wst.validation.internal.core.ValidationException;
+import org.eclipse.wst.validation.internal.operations.LocalizedMessage;
+import org.eclipse.wst.validation.internal.provisional.core.IMessage;
+import org.eclipse.wst.validation.internal.provisional.core.IReporter;
+import org.eclipse.wst.validation.internal.provisional.core.IValidationContext;
+import org.eclipse.wst.validation.internal.provisional.core.IValidator;
+
+public class FwkTestValidator implements IValidator {
+	public static final String ALL_FILES = "ALL_FILES"; // Load all IFileDeltas for the entire contents of the current project. //$NON-NLS-1$
+	public static final String JAVAHELPERS = "JAVAHELPERS"; // The JavaClass that the IFileDelta maps to. //$NON-NLS-1$
+
+	/* (non-Javadoc)
+	 * @see com.ibm.etools.validation.IValidator#cleanup(com.ibm.etools.validation.IReporter)
+	 */
+	public void cleanup(IReporter reporter) {
+		// Nothing is cached, so nothing to do.
+	}
+
+	/* (non-Javadoc)
+	 * @see com.ibm.etools.validation.IValidator#validate(com.ibm.etools.validation.IHelper, com.ibm.etools.validation.IReporter, com.ibm.etools.validation.IFileDelta[])
+	 */
+	public void validate(IValidationContext helper, IReporter reporter) throws ValidationException {
+		IFileDelta[] delta = null;
+		if((delta == null) || (delta.length ==0)) {
+			// Full Validate
+			delta = (IFileDelta[])helper.loadModel(ALL_FILES);
+		}
+		
+		if(delta == null) {
+			// Problem loading the files
+			return;
+		}
+		
+		for(int i=0; i<delta.length; i++) {
+			JavaHelpers target = (JavaHelpers)helper.loadModel(JAVAHELPERS, new Object[]{delta[i]});
+			LocalizedMessage message = new LocalizedMessage(IMessage.LOW_SEVERITY, "This is a test message for the validation framework, reported by VF Test Validator. Please ignore.", target); //$NON-NLS-1$
+			reporter.addMessage(this, message);
+		}
+	}
+
+}
diff --git a/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/validator/JDTUtility.java b/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/validator/JDTUtility.java
new file mode 100644
index 0000000..7396f1c
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/testFwk/org/eclipse/jst/validation/test/fwk/validator/JDTUtility.java
@@ -0,0 +1,318 @@
+package org.eclipse.jst.validation.test.fwk.validator;
+
+import java.util.logging.Level;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspaceDescription;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jem.internal.plugin.JavaEMFNature;
+import org.eclipse.jem.java.JavaHelpers;
+import org.eclipse.jem.java.JavaRefFactory;
+import org.eclipse.jem.util.logger.proxy.Logger;
+import org.eclipse.jst.validation.test.BVTValidationPlugin;
+import org.eclipse.jst.validation.test.fwk.TestOpConstrInputOperation;
+import org.eclipse.jst.validation.test.internal.registry.BVTValidationRegistryReader;
+import org.eclipse.jst.validation.test.internal.registry.ValidatorTestcase;
+
+
+/**
+ * This class contains some utility methods used to 
+ * access, manipulate, etc. jdt types.
+ */
+public final class JDTUtility {
+	private JDTUtility() {
+		// Do not need any instances of this class.
+	}
+	
+	/**
+	 * Return the containers in the given project that contain either
+	 * .java source files or .class binary files.
+	 */
+	public static IContainer[] getJavaContainers(IJavaProject jp) {
+		if (jp == null) {
+			return null;
+		}
+
+		IProject project = jp.getProject();
+		IClasspathEntry[] classpath = null;
+		try {
+			classpath = jp.getResolvedClasspath(true); // true means ignore unresolved (missing) variables, instead of throwing an exception
+		}
+		catch (JavaModelException exc) {
+			exc.printStackTrace();
+			return null;
+		}
+
+		if (classpath == null) {
+			return null;
+		}
+
+		// Traverse the classpath, and calculate a list of just the 
+		// IFolders and IProjects (i.e., IContainers) that contain source
+		IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+		IContainer[] icontainers = new IContainer[classpath.length];
+		int validCount = 0;
+		for (int i = 0; i < classpath.length; i++) {
+			IClasspathEntry entry = classpath[i];
+			if (entry.getEntryKind() == IClasspathEntry.CPE_SOURCE) {
+				IResource res = root.findMember(entry.getPath());
+				if(res == null) {
+					// not in the workspace
+					continue;
+				}
+
+				if(!res.getProject().equals(project)) {
+					// in a different project
+					continue;
+				}				
+
+				if (res instanceof IContainer) {
+					icontainers[validCount++] = (IContainer) res;
+				}
+			}
+		}
+
+		try {
+			IContainer outputContainer = (IContainer)root.findMember(jp.getOutputLocation());
+			IContainer[] containers = null;
+			if(outputContainer == null) {
+				containers = new IContainer[validCount];
+			}
+			else if(outputContainer.getProject().equals(project)) {
+				containers = new IContainer[validCount+1];
+				containers[validCount] = outputContainer;
+			}
+			else {
+				containers = new IContainer[validCount];
+			}
+			System.arraycopy(icontainers, 0, containers, 0, validCount);
+			return containers;
+		}
+		catch(JavaModelException exc) {
+			exc.printStackTrace();
+			return null;
+		}
+	}
+	
+	/**
+	 * Return the IType that represents this file, or null if none exists.
+	 */
+	public static IType getType(IContainer[] javaContainers, IFile file) {
+		if(file == null) {
+			return null;
+		}
+		
+		String fileExtension = file.getFileExtension();
+		if(fileExtension == null) {
+			// not a .java or a .class file
+			return null;
+		}
+		
+		if(!(fileExtension.equals("java") || fileExtension.equals("class"))) { //$NON-NLS-1$ //$NON-NLS-2$
+			return null;
+		}
+		
+		IProject project = file.getProject();
+		IJavaProject jp = JavaCore.create(project);
+		if(jp == null) {
+			return null;
+		}
+		
+		try {
+			IPath relativePath = getRelativePath(javaContainers, file);
+			if(relativePath == null) {
+				// Not a member of a source or output container
+				return null;
+			}
+
+			IPath packagePath = relativePath.removeLastSegments(1);
+			String packageName = packagePath.toString().replace(IPath.SEPARATOR, '.');
+			String typeName = relativePath.lastSegment();
+			typeName = typeName.substring(0, typeName.length() - fileExtension.length() - 1);
+			String qualifiedName = null;
+			if (packageName.length() > 0) {
+				qualifiedName = packageName + "." + typeName; //$NON-NLS-1$
+			} else {
+				qualifiedName = typeName;
+			}
+			return jp.findType(qualifiedName);
+		}
+		catch(JavaModelException exc) {
+			exc.printStackTrace();
+			return null;
+		}
+	}
+	
+	/**
+	 * Return the IPath of the resource relative to the first container that the
+	 * resource is found in. If the resource is contained in more than one container
+	 * in the array, return the first IPath found. If the resource is not a member
+	 * of any of the containers, return null.
+	 */
+	public static IPath getRelativePath(IContainer[] containers, IResource resource) {
+		for(int i=0; i<containers.length; i++) {
+			IPath path = getRelativePath(containers[i], resource);
+			if(path != null) {
+				return path;
+			}
+		}
+		return null;
+	}
+	
+	/**
+	 * Returns the IPath of a resource relative to the container.
+	 * If the IResource is not a member of the container, return null. 
+	 */
+	public static IPath getRelativePath(IContainer container, IResource resource) {
+		if ((resource == null) || (container == null)) {
+			return null;
+		}
+
+		// Is the path part of the IContainer?
+		int matchingFirstSegments = container.getFullPath().matchingFirstSegments(resource.getFullPath());
+		if(matchingFirstSegments == 0) {
+			return null;
+		}
+		return resource.getFullPath().removeFirstSegments(matchingFirstSegments);
+	}
+	
+	public static JavaHelpers getJavaHelpers(IFile file) {
+		IType type = getType(file);
+		if(type == null) {
+			return null;
+		}
+		
+		return getJavaHelpers(type);
+	}
+	
+	public static IType getType(IFile file) {
+		IJavaProject jp = JavaCore.create(file.getProject());
+		IContainer[] javaContainers = (jp == null) ? null : JDTUtility.getJavaContainers(jp);
+		if(javaContainers != null) {
+			return JDTUtility.getType(javaContainers, file);
+		}
+		return null;
+	}
+
+	public static JavaHelpers getJavaHelpers(IType type) {
+		ResourceSet resourceSet = getResourceSet(type);
+		if(resourceSet == null) {
+			return null;
+		}
+		return JavaRefFactory.eINSTANCE.reflectType(type.getFullyQualifiedName(), resourceSet);
+	}
+	
+	public static ResourceSet getResourceSet(IType type) {
+		JavaEMFNature nature = getNature(type);
+		if(nature == null) {
+			return null;
+		}
+		return nature.getResourceSet();
+	}
+
+	public static JavaEMFNature getNature(IType type) {
+		IJavaProject jp = type.getJavaProject();
+		IProject project = jp.getProject();
+		
+		try {
+			JavaEMFNature nature = JavaEMFNature.createRuntime(project);
+			return nature;
+		}
+		catch(CoreException exc) {
+			exc.printStackTrace();
+			return null;
+		}
+	}
+
+	public static IResource getResource(IProject project, JavaHelpers clazz) {
+		IType type = getType(project, clazz);
+		return type.getResource();
+	}
+
+	public static IType getType(IProject project, JavaHelpers clazz) {
+		if(clazz == null) {
+			return null;
+		}
+		
+		String fullyQualifiedName = clazz.getJavaName();
+		IJavaProject jp = JavaCore.create(project);
+		try {
+			return jp.findType(fullyQualifiedName);
+		}
+		catch(JavaModelException exc) {
+			exc.printStackTrace();
+			return null;
+		}
+	}
+
+	/**
+	 * Return the three validator test cases used to test the validation framework.
+	 */
+	public static ValidatorTestcase[] getVFTests(IProgressMonitor monitor, IProject project) {
+		ValidatorTestcase[] tmds = BVTValidationRegistryReader.getReader().getAllValidatorTests(monitor, project);
+		if((tmds == null) || (tmds.length == 0)) {
+			return new ValidatorTestcase[0];
+		}
+		
+		ValidatorTestcase fwkNobuildTestTMD = null;
+		ValidatorTestcase fwkTestTMD = null;
+		ValidatorTestcase propTMD = null;
+		ValidatorTestcase[] result = new ValidatorTestcase[3];
+		int count = 0;
+		for(int i=0; i<tmds.length; i++) {
+			ValidatorTestcase tmd = tmds[i];
+			if(tmd.getValidatorClass().equals(TestOpConstrInputOperation.FWK_TEST_VALIDATOR_CLASS)) {
+				fwkTestTMD = tmd;
+				result[count++] = tmd;
+			}
+			else if(tmd.getValidatorClass().equals(TestOpConstrInputOperation.PROPERTIES_VALIDATOR_CLASS)) {
+				propTMD = tmd;
+				result[count++] = tmd;
+			}
+			else if(tmd.getValidatorClass().equals(TestOpConstrInputOperation.FWK_NOBUILD_TEST_VALIDATOR_CLASS)) {
+				fwkNobuildTestTMD = tmd;
+				result[count++] = tmd;
+			}
+			
+			if((fwkTestTMD != null) && (propTMD != null) && (fwkNobuildTestTMD != null)) {
+				break;
+			}
+		}
+		
+		if(count != result.length) {
+			// On this project, not all of the test validators are used.
+			ValidatorTestcase[] r = new ValidatorTestcase[count];
+			System.arraycopy(result, 0, r, 0, count);
+			return r;
+		}
+
+		return result;
+	}
+
+	public static void setAutoBuild(boolean autoBuildEnabled) {
+		try {
+			IWorkspaceDescription desc = ResourcesPlugin.getWorkspace().getDescription();
+			desc.setAutoBuilding(autoBuildEnabled);
+			ResourcesPlugin.getWorkspace().setDescription(desc);
+		}
+		catch(CoreException exc) {
+			Logger logger = BVTValidationPlugin.getPlugin().getMsgLogger();
+			if(logger.isLoggingLevel(Level.SEVERE)) {
+				logger.write(Level.SEVERE, exc);
+			}
+		}
+	}
+}
diff --git a/tests/org.eclipse.jst.validation.test/testInput/FWK/BVT/opConstr.jar b/tests/org.eclipse.jst.validation.test/testInput/FWK/BVT/opConstr.jar
new file mode 100644
index 0000000..de4b037
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/testInput/FWK/BVT/opConstr.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.validation.test/testInput/Properties/aProperties.jar b/tests/org.eclipse.jst.validation.test/testInput/Properties/aProperties.jar
new file mode 100644
index 0000000..096f4ce
--- /dev/null
+++ b/tests/org.eclipse.jst.validation.test/testInput/Properties/aProperties.jar
Binary files differ
diff --git a/tests/org.eclipse.jst.web_tests.feature.patch/.project b/tests/org.eclipse.jst.web_tests.feature.patch/.project
new file mode 100644
index 0000000..bbec345
--- /dev/null
+++ b/tests/org.eclipse.jst.web_tests.feature.patch/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.jst.web_tests.feature.patch</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.pde.FeatureBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.FeatureNature</nature>
+	</natures>
+</projectDescription>
diff --git a/tests/org.eclipse.jst.web_tests.feature.patch/build.properties b/tests/org.eclipse.jst.web_tests.feature.patch/build.properties
new file mode 100644
index 0000000..64f93a9
--- /dev/null
+++ b/tests/org.eclipse.jst.web_tests.feature.patch/build.properties
@@ -0,0 +1 @@
+bin.includes = feature.xml
diff --git a/tests/org.eclipse.jst.web_tests.feature.patch/feature.xml b/tests/org.eclipse.jst.web_tests.feature.patch/feature.xml
new file mode 100644
index 0000000..a0a9cc6
--- /dev/null
+++ b/tests/org.eclipse.jst.web_tests.feature.patch/feature.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+      id="org.eclipse.jst.web_tests.feature.patch"
+      label="Patch feature for tests"
+      version="3.1.2.qualifier"
+      provider-name="Eclipse Web Tools Platform">
+
+   <requires>
+      <import feature="org.eclipse.jst.web_tests.feature" version="3.1.1.v200908121609-794FZ-EVVFIwFhRtLnWW" patch="true"/>
+   </requires>
+   
+   <plugin
+         id="org.eclipse.jst.j2ee.tests"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"/>
+         
+</feature>
diff --git a/tests/org.eclipse.jst.web_tests.feature.patch/pom.xml b/tests/org.eclipse.jst.web_tests.feature.patch/pom.xml
new file mode 100644
index 0000000..5aeb3eb
--- /dev/null
+++ b/tests/org.eclipse.jst.web_tests.feature.patch/pom.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Copyright (c) 2012, 2013 Eclipse Foundation and others.
+  All rights reserved. This program and the accompanying materials
+  are made available under the terms of the Eclipse Distribution License v1.0
+  which accompanies this distribution, and is available at
+  http://www.eclipse.org/org/documents/edl-v10.php
+ 
+  Contributors:
+    Thanh Ha (Eclipse Foundation) - initial implementation
+-->
+
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.eclipse.webtools.javaee</groupId>
+    <artifactId>javaee.tests</artifactId>
+    <version>3.6.0-SNAPSHOT</version>
+  </parent>
+
+  <groupId>org.eclipse.webtools.javaee</groupId>
+  <artifactId>org.eclipse.jst.web_tests.feature.patch</artifactId>
+  <version>3.1.2-SNAPSHOT</version>
+  <packaging>eclipse-feature</packaging>
+</project>
diff --git a/tests/pom.xml b/tests/pom.xml
new file mode 100644
index 0000000..d7ece20
--- /dev/null
+++ b/tests/pom.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Copyright (c) 2017 Eclipse Foundation and others.
+  All rights reserved. This program and the accompanying materials
+  are made available under the terms of the Eclipse Distribution License v1.0
+  which accompanies this distribution, and is available at
+  http://www.eclipse.org/org/documents/edl-v10.php
+ 
+  Contributors:
+    Nick Boldt (Red Hat) - initial implementation
+    Rob Stryker (Red Hat) - initial implementation
+-->
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.eclipse.webtools.javaee</groupId>
+    <artifactId>org.eclipse.webtools.javaee</artifactId>
+    <version>3.6.0-SNAPSHOT</version>
+  </parent>
+
+  <groupId>org.eclipse.webtools.javaee</groupId>
+  <artifactId>javaee.tests</artifactId>
+  <version>3.6.0-SNAPSHOT</version>
+  <packaging>pom</packaging>
+
+  <modules>
+    <module>org.eclipse.jem.tests</module>
+    <module>org.eclipse.jst.ejb.ui.tests</module>
+    <module>org.eclipse.jst.j2ee.core.tests</module>
+    <module>org.eclipse.jst.j2ee.tests</module>
+    <module>org.eclipse.jst.jee.tests</module>
+    <module>org.eclipse.jst.servlet.tests</module>
+    <module>org.eclipse.jst.validation.sample</module>
+    <module>org.eclipse.jst.validation.test</module>
+  </modules>
+
+  <profiles>
+    <profile>
+      <id>performance</id>
+      <properties>
+        <skipITests>false</skipITests>
+      </properties>
+      <modules>
+        <module>org.eclipse.jst.j2ee.core.tests.performance</module>
+        <module>org.eclipse.jst.j2ee.ejb.generation.tests</module>
+        <module>org.eclipse.jst.j2ee.tests.performance</module>
+      </modules>
+    </profile>
+  </profiles>
+
+</project>