diff --git a/features/org.eclipse.jem.tests-feature/.cvsignore b/features/org.eclipse.jem.tests-feature/.cvsignore
deleted file mode 100644
index c14487c..0000000
--- a/features/org.eclipse.jem.tests-feature/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-build.xml
diff --git a/features/org.eclipse.jem.tests-feature/.project b/features/org.eclipse.jem.tests-feature/.project
deleted file mode 100644
index c4699c4..0000000
--- a/features/org.eclipse.jem.tests-feature/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jem.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.jem.tests-feature/build.properties b/features/org.eclipse.jem.tests-feature/build.properties
deleted file mode 100644
index 1c5e2ec..0000000
--- a/features/org.eclipse.jem.tests-feature/build.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-bin.includes = feature.xml,\
-               feature.properties,\
-               epl-v10.html,\
-               eclipse_update_120.jpg,\
-               license.html
-generate.plugin@org.eclipse.jem.tests.source=org.eclipse.jem.tests
\ No newline at end of file
diff --git a/features/org.eclipse.jem.tests-feature/eclipse_update_120.jpg b/features/org.eclipse.jem.tests-feature/eclipse_update_120.jpg
deleted file mode 100644
index 68e3e02..0000000
--- a/features/org.eclipse.jem.tests-feature/eclipse_update_120.jpg
+++ /dev/null
Binary files differ
diff --git a/features/org.eclipse.jem.tests-feature/epl-v10.html b/features/org.eclipse.jem.tests-feature/epl-v10.html
deleted file mode 100644
index ed4b196..0000000
--- a/features/org.eclipse.jem.tests-feature/epl-v10.html
+++ /dev/null
@@ -1,328 +0,0 @@
-<html xmlns:o="urn:schemas-microsoft-com:office:office"
-xmlns:w="urn:schemas-microsoft-com:office:word"
-xmlns="http://www.w3.org/TR/REC-html40">
-
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
-<meta name=ProgId content=Word.Document>
-<meta name=Generator content="Microsoft Word 9">
-<meta name=Originator content="Microsoft Word 9">
-<link rel=File-List
-href="./Eclipse%20EPL%202003_11_10%20Final_files/filelist.xml">
-<title>Eclipse Public License - Version 1.0</title>
-<!--[if gte mso 9]><xml>
- <o:DocumentProperties>
-  <o:Revision>2</o:Revision>
-  <o:TotalTime>3</o:TotalTime>
-  <o:Created>2004-03-05T23:03:00Z</o:Created>
-  <o:LastSaved>2004-03-05T23:03:00Z</o:LastSaved>
-  <o:Pages>4</o:Pages>
-  <o:Words>1626</o:Words>
-  <o:Characters>9270</o:Characters>
-   <o:Lines>77</o:Lines>
-  <o:Paragraphs>18</o:Paragraphs>
-  <o:CharactersWithSpaces>11384</o:CharactersWithSpaces>
-  <o:Version>9.4402</o:Version>
- </o:DocumentProperties>
-</xml><![endif]--><!--[if gte mso 9]><xml>
- <w:WordDocument>
-  <w:TrackRevisions/>
- </w:WordDocument>
-</xml><![endif]-->
-<style>
-<!--
- /* Font Definitions */
-@font-face
-	{font-family:Tahoma;
-	panose-1:2 11 6 4 3 5 4 4 2 4;
-	mso-font-charset:0;
-	mso-generic-font-family:swiss;
-	mso-font-pitch:variable;
-	mso-font-signature:553679495 -2147483648 8 0 66047 0;}
- /* Style Definitions */
-p.MsoNormal, li.MsoNormal, div.MsoNormal
-	{mso-style-parent:"";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p
-	{margin-right:0in;
-	mso-margin-top-alt:auto;
-	mso-margin-bottom-alt:auto;
-	margin-left:0in;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p.BalloonText, li.BalloonText, div.BalloonText
-	{mso-style-name:"Balloon Text";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:8.0pt;
-	font-family:Tahoma;
-	mso-fareast-font-family:"Times New Roman";}
-@page Section1
-	{size:8.5in 11.0in;
-	margin:1.0in 1.25in 1.0in 1.25in;
-	mso-header-margin:.5in;
-	mso-footer-margin:.5in;
-	mso-paper-source:0;}
-div.Section1
-	{page:Section1;}
--->
-</style>
-</head>
-
-<body lang=EN-US style='tab-interval:.5in'>
-
-<div class=Section1>
-
-<p align=center style='text-align:center'><b>Eclipse Public License - v 1.0</b>
-</p>
-
-<p><span style='font-size:10.0pt'>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER
-THE TERMS OF THIS ECLIPSE PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE,
-REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE
-OF THIS AGREEMENT.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>1. DEFINITIONS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Contribution&quot; means:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-in the case of the initial Contributor, the initial code and documentation
-distributed under this Agreement, and<br clear=left>
-b) in the case of each subsequent Contributor:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-changes to the Program, and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-additions to the Program;</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>where
-such changes and/or additions to the Program originate from and are distributed
-by that particular Contributor. A Contribution 'originates' from a Contributor
-if it was added to the Program by such Contributor itself or anyone acting on
-such Contributor's behalf. Contributions do not include additions to the
-Program which: (i) are separate modules of software distributed in conjunction
-with the Program under their own license agreement, and (ii) are not derivative
-works of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Contributor&quot; means any person or
-entity that distributes the Program.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Licensed Patents &quot; mean patent
-claims licensable by a Contributor which are necessarily infringed by the use
-or sale of its Contribution alone or when combined with the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Program&quot; means the Contributions
-distributed in accordance with this Agreement.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Recipient&quot; means anyone who
-receives the Program under this Agreement, including all Contributors.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>2. GRANT OF RIGHTS</span></b> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-Subject to the terms of this Agreement, each Contributor hereby grants Recipient
-a non-exclusive, worldwide, royalty-free copyright license to<span
-style='color:red'> </span>reproduce, prepare derivative works of, publicly
-display, publicly perform, distribute and sublicense the Contribution of such
-Contributor, if any, and such derivative works, in source code and object code
-form.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-Subject to the terms of this Agreement, each Contributor hereby grants
-Recipient a non-exclusive, worldwide,<span style='color:green'> </span>royalty-free
-patent license under Licensed Patents to make, use, sell, offer to sell, import
-and otherwise transfer the Contribution of such Contributor, if any, in source
-code and object code form. This patent license shall apply to the combination
-of the Contribution and the Program if, at the time the Contribution is added
-by the Contributor, such addition of the Contribution causes such combination
-to be covered by the Licensed Patents. The patent license shall not apply to
-any other combinations which include the Contribution. No hardware per se is
-licensed hereunder. </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>c)
-Recipient understands that although each Contributor grants the licenses to its
-Contributions set forth herein, no assurances are provided by any Contributor
-that the Program does not infringe the patent or other intellectual property
-rights of any other entity. Each Contributor disclaims any liability to Recipient
-for claims brought by any other entity based on infringement of intellectual
-property rights or otherwise. As a condition to exercising the rights and
-licenses granted hereunder, each Recipient hereby assumes sole responsibility
-to secure any other intellectual property rights needed, if any. For example,
-if a third party patent license is required to allow Recipient to distribute
-the Program, it is Recipient's responsibility to acquire that license before
-distributing the Program.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>d)
-Each Contributor represents that to its knowledge it has sufficient copyright
-rights in its Contribution, if any, to grant the copyright license set forth in
-this Agreement. </span></p>
-
-<p><b><span style='font-size:10.0pt'>3. REQUIREMENTS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>A Contributor may choose to distribute the
-Program in object code form under its own license agreement, provided that:</span>
-</p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it complies with the terms and conditions of this Agreement; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-its license agreement:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-effectively disclaims on behalf of all Contributors all warranties and
-conditions, express and implied, including warranties or conditions of title
-and non-infringement, and implied warranties or conditions of merchantability
-and fitness for a particular purpose; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-effectively excludes on behalf of all Contributors all liability for damages,
-including direct, indirect, special, incidental and consequential damages, such
-as lost profits; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iii)
-states that any provisions which differ from this Agreement are offered by that
-Contributor alone and not by any other party; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iv)
-states that source code for the Program is available from such Contributor, and
-informs licensees how to obtain it in a reasonable manner on or through a
-medium customarily used for software exchange.<span style='color:blue'> </span></span></p>
-
-<p><span style='font-size:10.0pt'>When the Program is made available in source
-code form:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it must be made available under this Agreement; and </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b) a
-copy of this Agreement must be included with each copy of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Contributors may not remove or alter any
-copyright notices contained within the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Each Contributor must identify itself as the
-originator of its Contribution, if any, in a manner that reasonably allows
-subsequent Recipients to identify the originator of the Contribution. </span></p>
-
-<p><b><span style='font-size:10.0pt'>4. COMMERCIAL DISTRIBUTION</span></b> </p>
-
-<p><span style='font-size:10.0pt'>Commercial distributors of software may
-accept certain responsibilities with respect to end users, business partners
-and the like. While this license is intended to facilitate the commercial use
-of the Program, the Contributor who includes the Program in a commercial
-product offering should do so in a manner which does not create potential
-liability for other Contributors. Therefore, if a Contributor includes the
-Program in a commercial product offering, such Contributor (&quot;Commercial
-Contributor&quot;) hereby agrees to defend and indemnify every other
-Contributor (&quot;Indemnified Contributor&quot;) against any losses, damages and
-costs (collectively &quot;Losses&quot;) arising from claims, lawsuits and other
-legal actions brought by a third party against the Indemnified Contributor to
-the extent caused by the acts or omissions of such Commercial Contributor in
-connection with its distribution of the Program in a commercial product
-offering. The obligations in this section do not apply to any claims or Losses
-relating to any actual or alleged intellectual property infringement. In order
-to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
-Contributor in writing of such claim, and b) allow the Commercial Contributor
-to control, and cooperate with the Commercial Contributor in, the defense and
-any related settlement negotiations. The Indemnified Contributor may participate
-in any such claim at its own expense.</span> </p>
-
-<p><span style='font-size:10.0pt'>For example, a Contributor might include the
-Program in a commercial product offering, Product X. That Contributor is then a
-Commercial Contributor. If that Commercial Contributor then makes performance
-claims, or offers warranties related to Product X, those performance claims and
-warranties are such Commercial Contributor's responsibility alone. Under this
-section, the Commercial Contributor would have to defend claims against the
-other Contributors related to those performance claims and warranties, and if a
-court requires any other Contributor to pay any damages as a result, the
-Commercial Contributor must pay those damages.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>5. NO WARRANTY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, THE PROGRAM IS PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT
-WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING,
-WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
-MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
-responsible for determining the appropriateness of using and distributing the
-Program and assumes all risks associated with its exercise of rights under this
-Agreement , including but not limited to the risks and costs of program errors,
-compliance with applicable laws, damage to or loss of data, programs or
-equipment, and unavailability or interruption of operations. </span></p>
-
-<p><b><span style='font-size:10.0pt'>6. DISCLAIMER OF LIABILITY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING WITHOUT LIMITATION LOST PROFITS), 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 OR DISTRIBUTION OF
-THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF
-THE POSSIBILITY OF SUCH DAMAGES.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>7. GENERAL</span></b> </p>
-
-<p><span style='font-size:10.0pt'>If any provision of this Agreement is invalid
-or unenforceable under applicable law, it shall not affect the validity or
-enforceability of the remainder of the terms of this Agreement, and without
-further action by the parties hereto, such provision shall be reformed to the
-minimum extent necessary to make such provision valid and enforceable.</span> </p>
-
-<p><span style='font-size:10.0pt'>If Recipient institutes patent litigation
-against any entity (including a cross-claim or counterclaim in a lawsuit)
-alleging that the Program itself (excluding combinations of the Program with
-other software or hardware) infringes such Recipient's patent(s), then such
-Recipient's rights granted under Section 2(b) shall terminate as of the date
-such litigation is filed. </span></p>
-
-<p><span style='font-size:10.0pt'>All Recipient's rights under this Agreement
-shall terminate if it fails to comply with any of the material terms or
-conditions of this Agreement and does not cure such failure in a reasonable
-period of time after becoming aware of such noncompliance. If all Recipient's
-rights under this Agreement terminate, Recipient agrees to cease use and
-distribution of the Program as soon as reasonably practicable. However,
-Recipient's obligations under this Agreement and any licenses granted by
-Recipient relating to the Program shall continue and survive. </span></p>
-
-<p><span style='font-size:10.0pt'>Everyone is permitted to copy and distribute
-copies of this Agreement, but in order to avoid inconsistency the Agreement is
-copyrighted and may only be modified in the following manner. The Agreement
-Steward reserves the right to publish new versions (including revisions) of
-this Agreement from time to time. No one other than the Agreement Steward has
-the right to modify this Agreement. The Eclipse Foundation is the initial
-Agreement Steward. The Eclipse Foundation may assign the responsibility to
-serve as the Agreement Steward to a suitable separate entity. Each new version
-of the Agreement will be given a distinguishing version number. The Program
-(including Contributions) may always be distributed subject to the version of
-the Agreement under which it was received. In addition, after a new version of
-the Agreement is published, Contributor may elect to distribute the Program
-(including its Contributions) under the new version. Except as expressly stated
-in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to
-the intellectual property of any Contributor under this Agreement, whether
-expressly, by implication, estoppel or otherwise. All rights in the Program not
-expressly granted under this Agreement are reserved.</span> </p>
-
-<p><span style='font-size:10.0pt'>This Agreement is governed by the laws of the
-State of New York and the intellectual property laws of the United States of
-America. No party to this Agreement will bring a legal action under this
-Agreement more than one year after the cause of action arose. Each party waives
-its rights to a jury trial in any resulting litigation.</span> </p>
-
-<p class=MsoNormal><![if !supportEmptyParas]>&nbsp;<![endif]><o:p></o:p></p>
-
-</div>
-
-</body>
-
-</html>
\ No newline at end of file
diff --git a/features/org.eclipse.jem.tests-feature/feature.properties b/features/org.eclipse.jem.tests-feature/feature.properties
deleted file mode 100644
index 0c90782..0000000
--- a/features/org.eclipse.jem.tests-feature/feature.properties
+++ /dev/null
@@ -1,131 +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
-###############################################################################
-#
-# $Source: /cvsroot/webtools/jeetools.move/webtools.javaee.tests.git/features/org.eclipse.jem.tests-feature/Attic/feature.properties,v $
-# $Revision: 1.6 $  $Date: 2005/02/28 19:02:01 $
-#
-
-
-# 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=Java EMF Model Tests
-
-# "providerName" property - name of the company that provides the feature
-providerName=Eclipse.org
-
-# "updateSiteName" property - label for the update site
-updateSiteName=Visual Editor update site
-
-# "description" property - description of the feature
-description=Java EMF Model Tests.
-
-# "licenseURL" property - URL of the "Feature License"
-# do not translate value - just change to point to a locale-specific HTML page
-licenseURL=license.html
-
-# "license" property - text of the "Feature Update License"
-# should be plain text version of license agreement pointed to be "licenseURL"
-license=\
-ECLIPSE FOUNDATION SOFTWARE USER AGREEMENT\n\
-January 28, 2004\n\
-\n\
-Usage Of Content\n\
-\n\
-THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
-OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
-USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
-AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
-NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU\n\
-AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
-AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
-OR NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE\n\
-TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
-OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
-BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
-\n\
-Applicable Licenses\n\
-\n\
-Unless otherwise indicated, all Content made available by the Eclipse Foundation\n\
-is provided to you under the terms and conditions of the Eclipse Public\n\
-License Version 1.0 ("EPL"). A copy of the EPL is provided with this\n\
-Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
-For purposes of the EPL, "Program" will mean the Content.\n\
-\n\
-Content includes, but is not limited to, source code, object code,\n\
-documentation and other files maintained in the Eclipse.org CVS\n\
-repository ("Repository") in CVS modules ("Modules") and made available\n\
-as downloadable archives ("Downloads").\n\
-\n\
-Content may be apportioned into plug-ins ("Plug-ins"), plug-in fragments\n\
-("Fragments"), and features ("Features"). A Feature is a bundle of one or\n\
-more Plug-ins and/or Fragments and associated material. Files named\n\
-"feature.xml" may contain a list of the names and version numbers of the\n\
-Plug-ins and/or Fragments associated with a Feature. Plug-ins and Fragments\n\
-are located in directories named "plugins" and Features are located in\n\
-directories named "features".\n\
-\n\
-Features may also include other Features ("Included Features"). Files named\n\
-"feature.xml" may contain a list of the names and version numbers of\n\
-Included Features.\n\
-\n\
-The terms and conditions governing Plug-ins and Fragments should be\n\
-contained in files named "about.html" ("Abouts"). The terms and\n\
-conditions governing Features and Included Features should be contained\n\
-in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
-Licenses may be located in any directory of a Download or Module\n\
-including, but not limited to the following locations:\n\
-\n\
-   - The top-level (root) directory\n\
-   - Plug-in and Fragment directories\n\
-   - Subdirectories of the directory named "src" of certain Plug-ins\n\
-   - Feature directories\n\
-\n\
-Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
-Eclipse Update Manager, you must agree to a license ("Feature Update\n\
-License") during the installation process. If the Feature contains\n\
-Included Features, the Feature Update License should either provide you\n\
-with the terms and conditions governing the Included Features or inform\n\
-you where you can locate them. Feature Update Licenses may be found in\n\
-the "license" property of files named "feature.properties". Such Abouts,\n\
-Feature Licenses and Feature Update Licenses contain the terms and\n\
-conditions (or references to such terms and conditions) that govern your\n\
-use of the associated Content in that directory.\n\
-\n\
-THE ABOUTS, FEATURE LICENSES AND FEATURE UPDATE LICENSES MAY REFER\n\
-TO THE CPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
-SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
-\n\
-    - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
-    - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
-    - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
-    - IBM Public License 1.0 (available at http://oss.software.ibm.com/developerworks/opensource/license10.html)\n\
-    - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
-    - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
-\n\
-IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
-TO USE OF THE CONTENT. If no About, Feature License or Feature Update License\n\
-is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
-govern that particular Content.\n\
-\n\
-Cryptography\n\
-\n\
-Content may contain encryption software. The country in which you are\n\
-currently may have restrictions on the import, possession, and use,\n\
-and/or re-export to another country, of encryption software. BEFORE\n\
-using any encryption software, please check the country's laws,\n\
-regulations and policies concerning the import, possession, or use,\n\
-and re-export of encryption software, to see if this is permitted.\n
-########### end of license property ##########################################
diff --git a/features/org.eclipse.jem.tests-feature/feature.xml b/features/org.eclipse.jem.tests-feature/feature.xml
deleted file mode 100644
index 1027e83..0000000
--- a/features/org.eclipse.jem.tests-feature/feature.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-      id="org.eclipse.jem.tests"
-      label="%featureName"
-      version="1.1.0"
-      provider-name="%providerName"
-      image="eclipse_update_120.jpg">
-
-   <license url="%licenseURL">
-      %license
-   </license>
-
-   <url>
-      <update label="%updateSiteName" url="http://update.eclipse.org/tools/ve/updates/1.0"/>
-      <discovery label="%updateSiteName" url="http://update.eclipse.org/tools/ve/updates/1.0"/>
-   </url>
-
-   <requires>
-      <import feature="org.eclipse.jem"/>
-   </requires>
-
-   <plugin
-         id="org.eclipse.jem.tests"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"/>
-
-   <plugin
-         id="org.eclipse.test"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"/>
-   <plugin
-         id="org.eclipse.perfmsr.core"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"/>
-   <plugin
-         id="org.eclipse.ant.optional.junit"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         fragment="true"/>
-
-   <plugin
-         id="org.eclipse.jem.tests.source"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"/>
-
-</feature>
diff --git a/features/org.eclipse.jem.tests-feature/license.html b/features/org.eclipse.jem.tests-feature/license.html
deleted file mode 100644
index 3259fb9..0000000
--- a/features/org.eclipse.jem.tests-feature/license.html
+++ /dev/null
@@ -1,73 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=iso-8859-1">
-<title>Eclipse.org Software User Agreement</title>
-</head>
-
-<body lang="EN-US" link=blue vlink=purple>
-<h2>Eclipse Foundation Software User Agreement</h2>
-<p>January 28, 2005</p>
-
-<h3>Usage Of Content</h3>
-
-<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
-   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
-   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
-   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
-   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
-   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
-   
-<h3>Applicable Licenses</h3>   
-   
-<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation 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 provided with this Content and is also 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>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository (&quot;Repository&quot;) in CVS
-   modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
-
-<p>Content may be apportioned into plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;). A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material. Files named &quot;feature.xml&quot; may contain a list of the names and version numbers of  the Plug-ins and/or Fragments associated with a Feature.   Plug-ins and Fragments are located in directories
-   named &quot;plugins&quot; and Features are located in directories named &quot;features&quot;.</p>
-  
-<p>Features may also include other Features (&quot;Included Features&quot;). Files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</p>
-  
-<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
-Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;). Abouts and Feature Licenses may be located in any directory of a Download or Module
-including, but not limited to the following locations:</p>
-
-<ul>
-	<li>The top-level (root) directory</li>
-	<li>Plug-in and Fragment directories</li>
-	<li>Subdirectories of the directory named &quot;src&quot; of certain Plug-ins</li>
-	<li>Feature directories</li>
-</ul>
-		
-<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must agree to a license (&quot;Feature Update License&quot;) during the
-installation process. If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
-inform you where you can locate them. Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot;.
-Such Abouts, Feature Licenses and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
-that directory.</p>
-
-<p>THE ABOUTS, FEATURE LICENSES AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
-OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
-
-<ul>
-	<li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
-	<li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
-	<li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
-	<li>IBM Public License 1.0 (available at <a href="http://oss.software.ibm.com/developerworks/opensource/license10.html">http://oss.software.ibm.com/developerworks/opensource/license10.html</a>)</li>	
-	<li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
-	<li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
-</ul>
-
-<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License or Feature Update License is provided, please
-contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
-
-<h3>Cryptography</h3>
-
-<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
-   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
-   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
-</body>
-</html>
diff --git a/features/org.eclipse.jem.tests-feature/sourceTemplatePlugin/about.html b/features/org.eclipse.jem.tests-feature/sourceTemplatePlugin/about.html
deleted file mode 100644
index dae413b..0000000
--- a/features/org.eclipse.jem.tests-feature/sourceTemplatePlugin/about.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!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>February 24, 2005</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content.</p>
-
-<h3>Source Code</h3>
-<p>This plug-in contains source code zip files (&quot;Source Zips&quot;) that correspond to binary content in other plug-ins. These Source Zips may be distributed under different license
-agreements and/or notices. Details about these license agreements and notices are contained in &quot;about.html&quot; files (&quot;Abouts&quot;) located in sub-directories in the
-src/ directory of this plug-in. Such Abouts govern your use of the Source Zips in that directory, not the EPL.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/features/org.eclipse.jem.tests-feature/sourceTemplatePlugin/about.ini b/features/org.eclipse.jem.tests-feature/sourceTemplatePlugin/about.ini
deleted file mode 100644
index a21a3ec..0000000
--- a/features/org.eclipse.jem.tests-feature/sourceTemplatePlugin/about.ini
+++ /dev/null
@@ -1,29 +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 "windowImage" contains path to window icon (16x16)
-# needed for primary features only
-
-# Property "featureImage" contains path to feature image (32x32)
-featureImage=eclipse32.gif
-
-# 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/features/org.eclipse.jem.tests-feature/sourceTemplatePlugin/about.mappings b/features/org.eclipse.jem.tests-feature/sourceTemplatePlugin/about.mappings
deleted file mode 100644
index 720ca87..0000000
--- a/features/org.eclipse.jem.tests-feature/sourceTemplatePlugin/about.mappings
+++ /dev/null
@@ -1,6 +0,0 @@
-# about.mappings
-# contains fill-ins for about.properties
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# This file does not need to be translated.
-
-0=@build@
\ No newline at end of file
diff --git a/features/org.eclipse.jem.tests-feature/sourceTemplatePlugin/about.properties b/features/org.eclipse.jem.tests-feature/sourceTemplatePlugin/about.properties
deleted file mode 100644
index cb06e1d..0000000
--- a/features/org.eclipse.jem.tests-feature/sourceTemplatePlugin/about.properties
+++ /dev/null
@@ -1,28 +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
-###############################################################################
-#
-# $Source: /cvsroot/webtools/jeetools.move/webtools.javaee.tests.git/features/org.eclipse.jem.tests-feature/sourceTemplatePlugin/Attic/about.properties,v $
-# $Revision: 1.5 $  $Date: 2005/02/15 23:01:44 $
-#
-
-# 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 Source\n\
-\n\
-Version: {featureVersion}\n\
-Build id: {0}\n\
-\n\
-(c) Copyright Eclipse contributors and others. 2000, 2004.  All rights reserved.\n\
-Visit http://www.eclipse.org/vep
diff --git a/features/org.eclipse.jem.tests-feature/sourceTemplatePlugin/build.properties b/features/org.eclipse.jem.tests-feature/sourceTemplatePlugin/build.properties
deleted file mode 100644
index e09db2a..0000000
--- a/features/org.eclipse.jem.tests-feature/sourceTemplatePlugin/build.properties
+++ /dev/null
@@ -1,10 +0,0 @@
-bin.includes = plugin.xml,\
-               plugin.properties,\
-               about.html,\
-               about.ini,\
-               about.mappings,\
-               about.properties,\
-               eclipse32.gif,\
-               src/,\
-               META-INF/
-sourcePlugin = true
diff --git a/features/org.eclipse.jem.tests-feature/sourceTemplatePlugin/eclipse32.gif b/features/org.eclipse.jem.tests-feature/sourceTemplatePlugin/eclipse32.gif
deleted file mode 100644
index f71a8f6..0000000
--- a/features/org.eclipse.jem.tests-feature/sourceTemplatePlugin/eclipse32.gif
+++ /dev/null
Binary files differ
diff --git a/features/org.eclipse.jem.tests-feature/sourceTemplatePlugin/plugin.properties b/features/org.eclipse.jem.tests-feature/sourceTemplatePlugin/plugin.properties
deleted file mode 100644
index 49e2d64..0000000
--- a/features/org.eclipse.jem.tests-feature/sourceTemplatePlugin/plugin.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-###############################################################################
-# Copyright (c) 2003 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.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/features/org.eclipse.jem.tests-feature/sourceTemplatePlugin/Attic/plugin.properties,v $
-# $Revision: 1.3 $  $Date: 2005/02/15 23:01:44 $
-#
-
-
-pluginName = Java EMF Model Tests Source
-providerName = Eclipse.org
\ No newline at end of file
diff --git a/tests/org.eclipse.jem.tests/.classpath b/tests/org.eclipse.jem.tests/.classpath
deleted file mode 100644
index 12f04e1..0000000
--- a/tests/org.eclipse.jem.tests/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?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.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.jem.tests/.cvsignore b/tests/org.eclipse.jem.tests/.cvsignore
deleted file mode 100644
index 60463af..0000000
--- a/tests/org.eclipse.jem.tests/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-bin
-build.xml
diff --git a/tests/org.eclipse.jem.tests/.project b/tests/org.eclipse.jem.tests/.project
deleted file mode 100644
index 3589223..0000000
--- a/tests/org.eclipse.jem.tests/.project
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jem.tests</name>
-	<comment></comment>
-	<projects>
-		<project>org.eclipse.ant.core</project>
-		<project>org.eclipse.core.boot</project>
-		<project>org.eclipse.core.resources</project>
-		<project>org.eclipse.core.runtime.compatibility</project>
-		<project>org.eclipse.emf.ecore</project>
-		<project>org.eclipse.jdt.core</project>
-		<project>org.eclipse.jdt.launching</project>
-		<project>org.eclipse.jem</project>
-		<project>org.eclipse.jem.beaninfo</project>
-		<project>org.eclipse.jem.proxy</project>
-		<project>org.eclipse.jem.workbench</project>
-		<project>org.junit</project>
-	</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.jdt.core.prefs b/tests/org.eclipse.jem.tests/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 04bfdc7..0000000
--- a/tests/org.eclipse.jem.tests/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,282 +0,0 @@
-#Thu Jun 16 15:16:49 EDT 2005
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=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.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.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_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_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.clear_blank_lines=false
-org.eclipse.jdt.core.formatter.comment.format_comments=true
-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_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_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_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_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
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
deleted file mode 100644
index 4cff627..0000000
--- a/tests/org.eclipse.jem.tests/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,6 +0,0 @@
-#Wed May 11 16:20:15 EDT 2005
-eclipse.preferences.version=1
-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
deleted file mode 100644
index 92e5c81..0000000
--- a/tests/org.eclipse.jem.tests/BeanInfo AllSuites with Remote Debug.launch
+++ /dev/null
@@ -1,222 +0,0 @@
-<?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
deleted file mode 100644
index f487a8c..0000000
--- a/tests/org.eclipse.jem.tests/BeanInfo AllSuites.launch
+++ /dev/null
@@ -1,222 +0,0 @@
-<?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.launch b/tests/org.eclipse.jem.tests/Java AllSuites.launch
deleted file mode 100644
index ac13fcb..0000000
--- a/tests/org.eclipse.jem.tests/Java AllSuites.launch
+++ /dev/null
@@ -1,247 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<launchConfiguration type="org.eclipse.pde.ui.JunitLaunchConfig">
-<stringAttribute key="product" value="org.eclipse.platform.ide"/>
-<booleanAttribute key="clearws" value="true"/>
-<stringAttribute key="bootstrap" value=""/>
-<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.eclipse.jem.tests.AllSuites"/>
-<booleanAttribute key="useProduct" value="false"/>
-<booleanAttribute key="tracing" value="true"/>
-<stringAttribute key="location1" value="D:\runtime-junit-test-workspace"/>
-<booleanAttribute key="default" value="true"/>
-<stringAttribute key="vmargs" value=""/>
-<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value=""/>
-<booleanAttribute key="clearConfig" value="false"/>
-<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.core.resources/perf/listeners" value="500"/>
-<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.osgi/defaultprofile/logsynchronously" value="false"/>
-<mapEntry key="org.eclipse.osgi/resolver/debug" value="false"/>
-<mapEntry key="org.eclipse.core.resources/perf/snapshot" value="500"/>
-<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.osgi/profile/debug" 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/preferences/set" value="false"/>
-<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/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.core.runtime/loader/debug/activateplugin" value="false"/>
-<mapEntry key="org.eclipse.ui/trace/include.timings" value="true"/>
-<mapEntry key="org.eclipse.core.runtime/preferences/get" value="false"/>
-<mapEntry key="org.eclipse.core.runtime/perf" 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.ui/debug/swtdebug" value="false"/>
-<mapEntry key="org.eclipse.team.core/debug" 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.ui/trace/page.listeners" value="false"/>
-<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.osgi/resolver/wiring" value="false"/>
-<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.osgi/defaultprofile/logfilename" value=""/>
-<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.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.runtime/perf/success" value="true"/>
-<mapEntry key="org.eclipse.jdt.core/debug/resolution" value="false"/>
-<mapEntry key="org.eclipse.core.resources/build/delta" value="false"/>
-<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.ui/debug/declaredImages" 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.jdt.ui/debug/TypeConstraints" 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.jem.proxy/debug/traceexpressions" value="false"/>
-<mapEntry key="org.eclipse.core.resources/strings" 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.team.core/threading" value="false"/>
-<mapEntry key="org.eclipse.osgi/resolver/requires" value="false"/>
-<mapEntry key="org.eclipse.osgi/profile/impl" value="org.eclipse.osgi.profile.DefaultProfileLogger"/>
-<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.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.osgi/resolver/cycles" 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.ui/debug/showSystemJobs" 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.ui/trace/perspective.listeners" 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.osgi/resolver/imports" 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.jdt.core/debug/postaction" value="false"/>
-<mapEntry key="org.eclipse.team.cvs.core/threading" value="false"/>
-<mapEntry key="org.eclipse.jem.proxy/debug/traceexpressionstimethreshold" value="100"/>
-<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.osgi/defaultprofile/buffersize" value="256"/>
-<mapEntry key="org.eclipse.core.runtime/perf/failure" value="true"/>
-<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.runtime/preferences/general" 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/profile/startup" value="false"/>
-<mapEntry key="org.eclipse.osgi/trace/filters" value="trace.properties"/>
-<mapEntry key="org.eclipse.jdt.ui/debug/checkCoreBindingGetJavaElement" value="false"/>
-<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.jdt.ui/debug/checkCoreBindingIsEqualTo" 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.osgi/resolver/grouping" 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.osgi/profile/benchmark" value="false"/>
-<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.core.resources/perf/builders" value="10000"/>
-<mapEntry key="org.eclipse.ui/trace/contexts.verbose" value="false"/>
-<mapEntry key="org.eclipse.core.resources/restore/mastertable" 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>
-<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
-<stringAttribute key="selectedPlugin" value="org.eclipse.jem.proxy"/>
-<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
-<booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/>
-<booleanAttribute key="useDefaultConfig" value="true"/>
-<stringAttribute key="progargs" value="-os win32 -ws win32 -arch x86 -nl en_US"/>
-<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"/>
-<stringAttribute key="application" value="org.eclipse.pde.junit.runtime.coretestapplication"/>
-</launchConfiguration>
diff --git a/tests/org.eclipse.jem.tests/about.html b/tests/org.eclipse.jem.tests/about.html
deleted file mode 100644
index 6f6b96c..0000000
--- a/tests/org.eclipse.jem.tests/about.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!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>February 24, 2005</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/tests/org.eclipse.jem.tests/about.ini b/tests/org.eclipse.jem.tests/about.ini
deleted file mode 100644
index a21a3ec..0000000
--- a/tests/org.eclipse.jem.tests/about.ini
+++ /dev/null
@@ -1,29 +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 "windowImage" contains path to window icon (16x16)
-# needed for primary features only
-
-# Property "featureImage" contains path to feature image (32x32)
-featureImage=eclipse32.gif
-
-# 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/tests/org.eclipse.jem.tests/about.mappings b/tests/org.eclipse.jem.tests/about.mappings
deleted file mode 100644
index bddaab4..0000000
--- a/tests/org.eclipse.jem.tests/about.mappings
+++ /dev/null
@@ -1,6 +0,0 @@
-# about.mappings
-# contains fill-ins for about.properties
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# This file does not need to be translated.
-
-0=@build@
\ No newline at end of file
diff --git a/tests/org.eclipse.jem.tests/about.properties b/tests/org.eclipse.jem.tests/about.properties
deleted file mode 100644
index 835f1b5..0000000
--- a/tests/org.eclipse.jem.tests/about.properties
+++ /dev/null
@@ -1,28 +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
-###############################################################################
-#
-# $Source: /cvsroot/webtools/jeetools.move/webtools.javaee.tests.git/tests/org.eclipse.jem.tests/about.properties,v $
-# $Revision: 1.6 $  $Date: 2005/02/15 23:01:05 $
-#
-
-# 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, 2004.  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
deleted file mode 100644
index 32ac133..0000000
--- a/tests/org.eclipse.jem.tests/build.properties
+++ /dev/null
@@ -1,26 +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
-###############################################################################
-bin.includes = plugin.xml,\
-               plugin.properties,\
-               javatests.jar,\
-               vm/tests.jar,\
-               about.html,\
-               testdata/,\
-               test.xml,\
-               about.ini,\
-               about.mappings,\
-               about.properties,\
-               eclipse32.gif
-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.gif b/tests/org.eclipse.jem.tests/eclipse32.gif
deleted file mode 100644
index f71a8f6..0000000
--- a/tests/org.eclipse.jem.tests/eclipse32.gif
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.jem.tests/javatests/InitParserTest46376.java b/tests/org.eclipse.jem.tests/javatests/InitParserTest46376.java
deleted file mode 100644
index 8a51e0c..0000000
--- a/tests/org.eclipse.jem.tests/javatests/InitParserTest46376.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c)  2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.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.2 $  $Date: 2005/02/15 23:00:16 $ 
- */
- 
-/**
- * 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
deleted file mode 100644
index 223ab56..0000000
--- a/tests/org.eclipse.jem.tests/javatests/initParserTest46376/SameNameTestClass.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package initParserTest46376;
-/*******************************************************************************
- * Copyright (c)  2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.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: SameNameTestClass.java,v $
- *  $Revision: 1.2 $  $Date: 2005/02/15 23:00:16 $ 
- */
-/**
- * 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
deleted file mode 100644
index fb50116..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/.classpath
+++ /dev/null
@@ -1,6 +0,0 @@
-<?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
deleted file mode 100644
index 0092c67..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/AllSuites.java
+++ /dev/null
@@ -1,79 +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.jem.tests;
-/*
- *  $RCSfile: AllSuites.java,v $
- *  $Revision: 1.6 $  $Date: 2005/02/15 23:00:16 $ 
- */
-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[] = {
-		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/JavaProjectUtil.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/JavaProjectUtil.java
deleted file mode 100644
index 693fe1b..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/JavaProjectUtil.java
+++ /dev/null
@@ -1,258 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 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.jem.tests;
-/*
- *  $RCSfile: JavaProjectUtil.java,v $
- *  $Revision: 1.12 $  $Date: 2005/05/16 19:11:16 $ 
- */
-
-
-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.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 = Platform.asLocalURL(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 = Platform.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
deleted file mode 100644
index f1d5083..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/JavaTestsPlugin.java
+++ /dev/null
@@ -1,38 +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.jem.tests;
-/*
- *  $RCSfile: JavaTestsPlugin.java,v $
- *  $Revision: 1.5 $  $Date: 2005/02/15 23:00:16 $ 
- */
-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/beaninfo/AbstractBeanInfoTestCase.java b/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/beaninfo/AbstractBeanInfoTestCase.java
deleted file mode 100644
index 8a3676b..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/beaninfo/AbstractBeanInfoTestCase.java
+++ /dev/null
@@ -1,99 +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.jem.tests.beaninfo;
-/*
- *  $RCSfile: AbstractBeanInfoTestCase.java,v $
- *  $Revision: 1.9 $  $Date: 2005/02/15 23:00:16 $ 
- */
-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
deleted file mode 100644
index 2fcc94a..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/beaninfo/BeanInfoSuite.java
+++ /dev/null
@@ -1,101 +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.jem.tests.beaninfo;
-/*
- *  $RCSfile: BeanInfoSuite.java,v $
- *  $Revision: 1.9 $  $Date: 2005/02/15 23:00:16 $ 
- */
-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] = Platform.asLocalURL(new URL(installURL, "testdata/testbeaninfo.zip")).getFile();
-		zipPaths[1] = Platform.asLocalURL(new URL(installURL, "testdata/testbeaninfobeaninfos.zip")).getFile();
-		zipPaths[2] = Platform.asLocalURL(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
deleted file mode 100644
index 741b96a..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/beaninfo/TestAWTSwingUI.java
+++ /dev/null
@@ -1,536 +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.jem.tests.beaninfo;
-/*
- *  $RCSfile: TestAWTSwingUI.java,v $
- *  $Revision: 1.7 $  $Date: 2005/02/15 23:00:16 $ 
- */
-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
deleted file mode 100644
index a5684de..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/beaninfo/TestReflection.java
+++ /dev/null
@@ -1,184 +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.jem.tests.beaninfo;
-/*
- *  $RCSfile: TestReflection.java,v $
- *  $Revision: 1.7 $  $Date: 2005/02/15 23:00:16 $ 
- */
-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()));
-		}
-	}
-	
-	
-}
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
deleted file mode 100644
index 2f6c694..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/beaninfo/TestStandard.java
+++ /dev/null
@@ -1,630 +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.jem.tests.beaninfo;
-/*
- *  $RCSfile: TestStandard.java,v $
- *  $Revision: 1.9 $  $Date: 2005/02/15 23:00:16 $ 
- */
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.*;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.*;
-import org.eclipse.emf.ecore.EOperation;
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-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.
-			final IProject project = nature.getProject();
-			IWorkspace workspace = ResourcesPlugin.getWorkspace();
-			workspace.run(new IWorkspaceRunnable () {
-				public void run(IProgressMonitor monitor) throws CoreException {
-					project.close(monitor);
-					project.open(monitor);
-				}
-			}, project, 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();
-			workspace.run(new IWorkspaceRunnable () {
-				public void run(IProgressMonitor monitor) throws CoreException {
-					project.close(monitor);
-					project.open(monitor);
-				}
-			}, project, 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
deleted file mode 100644
index 78d375c..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/instantiation/InstantiationSuite.java
+++ /dev/null
@@ -1,98 +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.jem.tests.instantiation;
-/*
- *  $RCSfile: InstantiationSuite.java,v $
- *  $Revision: 1.9 $  $Date: 2005/02/15 23:00:16 $ 
- */
-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] = Platform.asLocalURL(new URL(installURL, "testdata/testbeaninfo.zip")).getFile();
-		zipPaths[1] = Platform.asLocalURL(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
deleted file mode 100644
index 798654f..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/instantiation/TestStandard.java
+++ /dev/null
@@ -1,200 +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
- *******************************************************************************/
-/*
- * 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
deleted file mode 100644
index 4599341..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/modelListeners/IListenerTester.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * 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
- *******************************************************************************/
-/*
- *  $RCSfile: IListenerTester.java,v $
- *  $Revision: 1.2 $  $Date: 2005/02/15 23:00:16 $ 
- */
-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
deleted file mode 100644
index ea6cd77..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/modelListeners/ListenersSuite.java
+++ /dev/null
@@ -1,93 +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.jem.tests.modelListeners;
-/*
- *  $RCSfile: ListenersSuite.java,v $
- *  $Revision: 1.4 $  $Date: 2005/02/15 23:00:16 $ 
- */
-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] = Platform.asLocalURL(new URL(installURL, "testdata/testbeaninfo.zip")).getFile();
-		zipPaths[1] = Platform.asLocalURL(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
deleted file mode 100644
index 83b21d8..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/modelListeners/TestBeanInfo.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*******************************************************************************
- * 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
- *******************************************************************************/
-/*
- *  $RCSfile: TestBeanInfo.java,v $
- *  $Revision: 1.3 $  $Date: 2005/02/15 23:00:16 $ 
- */
-package org.eclipse.jem.tests.modelListeners;
-
-import org.eclipse.core.resources.IProject;
-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;
- 
-
-/**
- * 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();
-			}
-		});	// 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[0], new Object[0]);		
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.jem.tests.modelListeners.TestListeners#setUpDeletePackage()
-	 */
-	protected void setUpDeletePackage() throws JavaModelException {
-		super.setUpDeletePackage();
-		factory.setTestCases(new int[] {TestBeaninfoAdapterFactory.MARK_ALL_STALE}, new Object[] {null});
-	}
-	/* (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
deleted file mode 100644
index 419339c..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/modelListeners/TestBeaninfoAdapterFactory.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*******************************************************************************
- * 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
- *******************************************************************************/
-/*
- *  $RCSfile: TestBeaninfoAdapterFactory.java,v $
- *  $Revision: 1.2 $  $Date: 2005/02/15 23:00:16 $ 
- */
-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;
-
-	private static final String[] callTypeNames = new String[] { "MARK_ALL_STALE", "MARK_STALE_INTROSPECTION", "MARK_STALE_INTROSPECTION_PLUS_INNER",
-			"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;
-			}			
-		}		
-	}
-}
\ No newline at end of file
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
deleted file mode 100644
index 47d5e58..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/modelListeners/TestJEM.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*******************************************************************************
- * 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
- *******************************************************************************/
-/*
- *  $RCSfile: TestJEM.java,v $
- *  $Revision: 1.4 $  $Date: 2005/05/16 19:11:16 $ 
- */
-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.TRUE}});		
-	}
-	/* (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
deleted file mode 100644
index e78fdbf..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/modelListeners/TestJavaJDOMAdapterFactory.java
+++ /dev/null
@@ -1,234 +0,0 @@
-/*******************************************************************************
- * 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
- *******************************************************************************/
-/*
- *  $RCSfile: TestJavaJDOMAdapterFactory.java,v $
- *  $Revision: 1.2 $  $Date: 2005/02/15 23:00:16 $ 
- */
-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
deleted file mode 100644
index 64630e1..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/modelListeners/TestListeners.java
+++ /dev/null
@@ -1,350 +0,0 @@
-/*******************************************************************************
- * 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
- *******************************************************************************/
-/*
- *  $RCSfile: TestListeners.java,v $
- *  $Revision: 1.2 $  $Date: 2005/02/15 23:00:16 $ 
- */
-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", "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();				
-	}
-	
-	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
deleted file mode 100644
index d1330df..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/AbstractTestProxy.java
+++ /dev/null
@@ -1,131 +0,0 @@
-package org.eclipse.jem.tests.proxy;
-/*******************************************************************************
- * Copyright (c)  2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.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: AbstractTestProxy.java,v $
- *  $Revision: 1.4 $  $Date: 2005/05/11 19:01:32 $ 
- */
-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
deleted file mode 100644
index 4f6de8e..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/ExpressionTest.java
+++ /dev/null
@@ -1,3250 +0,0 @@
-/*******************************************************************************
- * 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
- *******************************************************************************/
-/*
- *  $RCSfile: ExpressionTest.java,v $
- *  $Revision: 1.10 $  $Date: 2005/06/16 20:18:51 $ 
- */
-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) {
-			System.out.println("Test successful: "+e.getProxyLocalizedMessage());
-		}
-	}
-	
-	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 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 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();
-	}
-}
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
deleted file mode 100644
index 63d9892..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/ExpressionThreadTransferCallBack.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 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.jem.tests.proxy;
-/*
- *  $RCSfile: ExpressionThreadTransferCallBack.java,v $
- *  $Revision: 1.1 $  $Date: 2005/05/16 19:11:16 $ 
- */
-
-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
deleted file mode 100644
index 0be0f93..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/ProxySuite.java
+++ /dev/null
@@ -1,86 +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.jem.tests.proxy;
-/*
- *  $RCSfile: ProxySuite.java,v $
- *  $Revision: 1.8 $  $Date: 2005/02/15 23:00:16 $ 
- */
-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
deleted file mode 100644
index 000ceba..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/TestAWTProxy.java
+++ /dev/null
@@ -1,116 +0,0 @@
-package org.eclipse.jem.tests.proxy;
-/*******************************************************************************
- * Copyright (c)  2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.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: TestAWTProxy.java,v $
- *  $Revision: 1.4 $  $Date: 2005/05/11 19:01:32 $ 
- */
-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
deleted file mode 100644
index 17b1fae..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/TestCallback.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 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.jem.tests.proxy;
-/*
- *  $RCSfile: TestCallback.java,v $
- *  $Revision: 1.4 $  $Date: 2005/02/15 23:00:16 $ 
- */
-
-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
deleted file mode 100644
index cce6181..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/TestCallbackStream.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 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.jem.tests.proxy;
-/*
- *  $RCSfile: TestCallbackStream.java,v $
- *  $Revision: 1.4 $  $Date: 2005/02/15 23:00:16 $ 
- */
-
-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
deleted file mode 100644
index 99bae82..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/TestStandard.java
+++ /dev/null
@@ -1,639 +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.jem.tests.proxy;
-/*
- *  $RCSfile: TestStandard.java,v $
- *  $Revision: 1.9 $  $Date: 2005/05/11 19:01:32 $ 
- */
-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);
-		assertEquals(11, 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 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 {
-		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
deleted file mode 100644
index 71fbd64..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/ide/IDEProxySuite.java
+++ /dev/null
@@ -1,93 +0,0 @@
-package org.eclipse.jem.tests.proxy.ide;
-/*******************************************************************************
- * Copyright (c)  2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.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: IDEProxySuite.java,v $
- *  $Revision: 1.3 $  $Date: 2005/02/15 23:00:16 $ 
- */
-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
deleted file mode 100644
index 0748443..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/AbstractInitParserTestCase.java
+++ /dev/null
@@ -1,70 +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.jem.tests.proxy.initParser;
-/*
- *  $RCSfile: AbstractInitParserTestCase.java,v $
- *  $Revision: 1.5 $  $Date: 2005/02/15 23:00:16 $ 
- */
-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
deleted file mode 100644
index 0a79dc7..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/AbstractInitStringParserTestHelper.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * 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
- *******************************************************************************/
-/*
- *  $RCSfile: AbstractInitStringParserTestHelper.java,v $
- *  $Revision: 1.2 $  $Date: 2005/02/15 23:00:16 $ 
- */
-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);
-	}
-}
\ No newline at end of file
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
deleted file mode 100644
index b36255b..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/ArrayConstructorTest.java
+++ /dev/null
@@ -1,130 +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.jem.tests.proxy.initParser;
-/*
- *  $RCSfile: ArrayConstructorTest.java,v $
- *  $Revision: 1.3 $  $Date: 2005/02/15 23:00:16 $ 
- */
-
-/**
- * @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
deleted file mode 100644
index 5719cfa..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/BlockTest.java
+++ /dev/null
@@ -1,108 +0,0 @@
-package org.eclipse.jem.tests.proxy.initParser;
-/*******************************************************************************
- * Copyright (c)  2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.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: BlockTest.java,v $
- *  $Revision: 1.4 $  $Date: 2005/02/15 23:00:16 $ 
- */
-
-/**
- * @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
deleted file mode 100644
index 0a7b79a..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/BorderTest.java
+++ /dev/null
@@ -1,114 +0,0 @@
-package org.eclipse.jem.tests.proxy.initParser;
-/*******************************************************************************
- * Copyright (c)  2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.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: BorderTest.java,v $
- *  $Revision: 1.4 $  $Date: 2005/02/15 23:00:16 $ 
- */
-
-/**
- * @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
deleted file mode 100644
index b16f8d3..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/CastTest.java
+++ /dev/null
@@ -1,79 +0,0 @@
-package org.eclipse.jem.tests.proxy.initParser;
-/*******************************************************************************
- * Copyright (c)  2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.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: CastTest.java,v $
- *  $Revision: 1.4 $  $Date: 2005/05/11 22:41:39 $ 
- */
-
-/**
- * @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
deleted file mode 100644
index 29fe80a..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/CharTest.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package org.eclipse.jem.tests.proxy.initParser;
-/*******************************************************************************
- * Copyright (c)  2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.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: CharTest.java,v $
- *  $Revision: 1.3 $  $Date: 2005/02/15 23:00:16 $ 
- */
-
-/**
- * @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
deleted file mode 100644
index 12bcf0b..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/ExceptionTest.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package org.eclipse.jem.tests.proxy.initParser;
-/*******************************************************************************
- * Copyright (c)  2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.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: ExceptionTest.java,v $
- *  $Revision: 1.3 $  $Date: 2005/02/15 23:00:16 $ 
- */
-
-/**
- * @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
deleted file mode 100644
index 0bc20d3..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/InitParserSuite.java
+++ /dev/null
@@ -1,85 +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.jem.tests.proxy.initParser;
-/*
- *  $RCSfile: InitParserSuite.java,v $
- *  $Revision: 1.6 $  $Date: 2005/02/15 23:00:16 $ 
- */
-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
deleted file mode 100644
index 685cb87..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/InitStringParserTestHelper.java
+++ /dev/null
@@ -1,134 +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.jem.tests.proxy.initParser;
-/*
- *  $RCSfile: InitStringParserTestHelper.java,v $
- *  $Revision: 1.5 $  $Date: 2005/02/15 23:00:16 $ 
- */
-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
deleted file mode 100644
index d89efec..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/JFCTest.java
+++ /dev/null
@@ -1,136 +0,0 @@
-package org.eclipse.jem.tests.proxy.initParser;
-/*******************************************************************************
- * Copyright (c)  2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.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: JFCTest.java,v $
- *  $Revision: 1.3 $  $Date: 2005/02/15 23:00:16 $ 
- */
-
-/**
- * @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
deleted file mode 100644
index 5c7e932..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/LiteralTest.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.eclipse.jem.tests.proxy.initParser;
-/*******************************************************************************
- * Copyright (c)  2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.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: LiteralTest.java,v $
- *  $Revision: 1.3 $  $Date: 2005/02/15 23:00:16 $ 
- */
-
-/**
- * @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
deleted file mode 100644
index d510543..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/MultiArgConstructorTest.java
+++ /dev/null
@@ -1,62 +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.jem.tests.proxy.initParser;
-/*
- *  $RCSfile: MultiArgConstructorTest.java,v $
- *  $Revision: 1.6 $  $Date: 2005/05/11 22:41:39 $ 
- */
-
-/**
- * @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
deleted file mode 100644
index 7103089..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/MultiArgInstanceTest.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package org.eclipse.jem.tests.proxy.initParser;
-/*******************************************************************************
- * Copyright (c)  2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.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: MultiArgInstanceTest.java,v $
- *  $Revision: 1.4 $  $Date: 2005/05/11 22:41:39 $ 
- */
-
-/**
- * @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
deleted file mode 100644
index bc458a2..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/MultiArgStaticMethodTest.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package org.eclipse.jem.tests.proxy.initParser;
-/*******************************************************************************
- * Copyright (c)  2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.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: MultiArgStaticMethodTest.java,v $
- *  $Revision: 1.4 $  $Date: 2005/05/11 22:41:39 $ 
- */
-
-/**
- * @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
deleted file mode 100644
index ef96a1c..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/NavigationParameters.java
+++ /dev/null
@@ -1,244 +0,0 @@
-package org.eclipse.jem.tests.proxy.initParser;
-/*******************************************************************************
- * Copyright (c)  2001, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.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: NavigationParameters.java,v $
- *  $Revision: 1.3 $  $Date: 2005/06/16 19:27:19 $ 
- */
-
-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
deleted file mode 100644
index 6bf1a8a..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/NeedsCodingTest.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package org.eclipse.jem.tests.proxy.initParser;
-/*******************************************************************************
- * Copyright (c)  2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.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: NeedsCodingTest.java,v $
- *  $Revision: 1.5 $  $Date: 2005/06/16 19:27:19 $ 
- */
-
-/**
- * @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
deleted file mode 100644
index 1b7703e..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/NumberTest.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package org.eclipse.jem.tests.proxy.initParser;
-/*******************************************************************************
- * Copyright (c)  2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.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: NumberTest.java,v $
- *  $Revision: 1.3 $  $Date: 2005/02/15 23:00:16 $ 
- */
-
-/**
- * @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
deleted file mode 100644
index 23e0497..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/OverloadingTest.java
+++ /dev/null
@@ -1,40 +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.jem.tests.proxy.initParser;
-/*
- *  $RCSfile: OverloadingTest.java,v $
- *  $Revision: 1.6 $  $Date: 2005/02/15 23:00:16 $ 
- */
-
-/**
- * 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
deleted file mode 100644
index 9d3795a..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/SameName46376Test.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package org.eclipse.jem.tests.proxy.initParser;
-/*******************************************************************************
- * Copyright (c)  2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.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: SameName46376Test.java,v $
- *  $Revision: 1.2 $  $Date: 2005/02/15 23:00:16 $ 
- */
- 
-/**
- * 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
deleted file mode 100644
index 4ee0185..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/StringTest.java
+++ /dev/null
@@ -1,54 +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.jem.tests.proxy.initParser;
-/*
- *  $RCSfile: StringTest.java,v $
- *  $Revision: 1.5 $  $Date: 2005/02/15 23:00:16 $ 
- */
-
-/**
- * @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
deleted file mode 100644
index cf162f7..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/tree/ASTArraysTest.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * 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
- *******************************************************************************/
-/*
- *  $RCSfile: ASTArraysTest.java,v $
- *  $Revision: 1.4 $  $Date: 2005/05/11 19:01:32 $ 
- */
-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
deleted file mode 100644
index e119c42..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/tree/ASTFieldAccessTest.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * 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
- *******************************************************************************/
-/*
- *  $RCSfile: ASTFieldAccessTest.java,v $
- *  $Revision: 1.4 $  $Date: 2005/05/11 19:01:32 $ 
- */
-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
deleted file mode 100644
index 74602a1..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/tree/ASTInnerClassAccessTest.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * 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
- *******************************************************************************/
-/*
- *  $RCSfile: ASTInnerClassAccessTest.java,v $
- *  $Revision: 1.4 $  $Date: 2005/05/11 19:01:32 $ 
- */
-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
deleted file mode 100644
index 30647b3..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/tree/ASTMiscTest.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*******************************************************************************
- * 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
- *******************************************************************************/
-/*
- *  $RCSfile: ASTMiscTest.java,v $
- *  $Revision: 1.2 $  $Date: 2005/02/15 23:00:16 $ 
- */
-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');
-		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");
-		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
deleted file mode 100644
index 9bede08..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/tree/ASTNestFieldAccessTestData.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package org.eclipse.jem.tests.proxy.initParser.tree;
-/*******************************************************************************
- * 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
- *******************************************************************************/
-/*
- *  $RCSfile: ASTNestFieldAccessTestData.java,v $
- *  $Revision: 1.2 $  $Date: 2005/02/15 23:00:16 $ 
- */
-
-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
deleted file mode 100644
index 9aaa10d..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/tree/ASTOperationsTest.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*******************************************************************************
- * 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
- *******************************************************************************/
-/*
- *  $RCSfile: ASTOperationsTest.java,v $
- *  $Revision: 1.4 $  $Date: 2005/05/11 22:41:39 $ 
- */
-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
deleted file mode 100644
index 4c47aaa..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/tree/ASTParserSuite.java
+++ /dev/null
@@ -1,131 +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.jem.tests.proxy.initParser.tree;
-/*
- *  $RCSfile: ASTParserSuite.java,v $
- *  $Revision: 1.8 $  $Date: 2005/02/15 23:00:16 $ 
- */
-import junit.extensions.TestSetup;
-import junit.framework.*;
-
-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
-		                               } ;
-	
-	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
deleted file mode 100644
index 30637c5..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/tree/ASTTreeInitStringParserTestHelper.java
+++ /dev/null
@@ -1,238 +0,0 @@
-/*******************************************************************************
- * 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
- *******************************************************************************/
-/*
- *  $RCSfile: ASTTreeInitStringParserTestHelper.java,v $
- *  $Revision: 1.11 $  $Date: 2005/05/11 19:01:32 $ 
- */
-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
deleted file mode 100644
index 08035d9..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/initParser/tree/InnerClassTestData.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * 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
- *******************************************************************************/
-/*
- *  $RCSfile: InnerClassTestData.java,v $
- *  $Revision: 1.3 $  $Date: 2005/02/15 23:00:16 $ 
- */
-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;
-	}
-	
-}
\ No newline at end of file
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
deleted file mode 100644
index 5a40946..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/remote/RemoteProxySuite.java
+++ /dev/null
@@ -1,123 +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.jem.tests.proxy.remote;
-/*
- *  $RCSfile: RemoteProxySuite.java,v $
- *  $Revision: 1.7 $  $Date: 2005/02/15 23:00:16 $ 
- */
-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 =
-			Platform
-				.asLocalURL(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) {
-			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
deleted file mode 100644
index 871badb..0000000
--- a/tests/org.eclipse.jem.tests/javatests/org/eclipse/jem/tests/proxy/remote/TestProjectAccess.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package org.eclipse.jem.tests.proxy.remote;
-/*******************************************************************************
- * Copyright (c)  2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.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: TestProjectAccess.java,v $
- *  $Revision: 1.3 $  $Date: 2005/02/15 23:00:16 $ 
- */
-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
deleted file mode 100644
index 64ee729..0000000
--- a/tests/org.eclipse.jem.tests/plugin.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-###############################################################################
-# Copyright (c) 2003 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.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.2 $  $Date: 2005/02/15 23:01:05 $
-#
-
-
-pluginName=Java EMF Model JUnit Test Cases
-providerName = Eclipse.org
\ No newline at end of file
diff --git a/tests/org.eclipse.jem.tests/plugin.xml b/tests/org.eclipse.jem.tests/plugin.xml
deleted file mode 100644
index ba10481..0000000
--- a/tests/org.eclipse.jem.tests/plugin.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin
-   id="org.eclipse.jem.tests"
-   name="%pluginName"
-   version="1.1.0"
-   provider-name="%providerName"
-   class="org.eclipse.jem.tests.JavaTestsPlugin">
-
-   <runtime>
-      <library name="javatests.jar">
-         <export name="*"/>
-      </library>
-   </runtime>
-   <requires>
-      <import plugin="org.eclipse.jem.proxy"/>
-      <import plugin="org.junit"/>
-      <import plugin="org.eclipse.core.boot"/>
-      <import plugin="org.eclipse.ant.core"/>
-      <import plugin="org.eclipse.jem.beaninfo"/>
-      <import plugin="org.eclipse.jdt.core"/>
-      <import plugin="org.eclipse.jem.workbench"/>
-      <import plugin="org.eclipse.core.resources"/>
-      <import plugin="org.eclipse.jdt.launching"/>
-      <import plugin="org.eclipse.emf.ecore"/>
-      <import plugin="org.eclipse.jem"/>
-      <import plugin="org.eclipse.core.runtime"/>
-      <import plugin="org.eclipse.debug.core"/>
-   </requires>
-
-   <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>
-
-</plugin>
diff --git a/tests/org.eclipse.jem.tests/proxy.jars b/tests/org.eclipse.jem.tests/proxy.jars
deleted file mode 100644
index 7a7029a..0000000
--- a/tests/org.eclipse.jem.tests/proxy.jars
+++ /dev/null
@@ -1,2 +0,0 @@
-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 b/tests/org.eclipse.jem.tests/test.xml
deleted file mode 100644
index 57dc7f9..0000000
--- a/tests/org.eclipse.jem.tests/test.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?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"/>
-    <ant target="core-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>
\ No newline at end of file
diff --git a/tests/org.eclipse.jem.tests/testdata/extjarops.txt b/tests/org.eclipse.jem.tests/testdata/extjarops.txt
deleted file mode 100644
index a5cfb7d..0000000
--- a/tests/org.eclipse.jem.tests/testdata/extjarops.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-getActionCommand
-getLabel
-setActionCommand
-setLabel
diff --git a/tests/org.eclipse.jem.tests/testdata/extjarprops.txt b/tests/org.eclipse.jem.tests/testdata/extjarprops.txt
deleted file mode 100644
index 737ed62..0000000
--- a/tests/org.eclipse.jem.tests/testdata/extjarprops.txt
+++ /dev/null
@@ -1,28 +0,0 @@
-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
deleted file mode 100644
index 0dad8d6..0000000
--- a/tests/org.eclipse.jem.tests/testdata/jlabelops.txt
+++ /dev/null
@@ -1,173 +0,0 @@
-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
deleted file mode 100644
index 24bc707..0000000
--- a/tests/org.eclipse.jem.tests/testdata/jlabelprops.txt
+++ /dev/null
@@ -1,61 +0,0 @@
-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
deleted file mode 100644
index 17639ad..0000000
--- a/tests/org.eclipse.jem.tests/testdata/overrides/beaninfo/TestOverrides.override
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
-    xmlns:event="event.xmi">
-  <event:AddMany  featureName="eStructuralFeatures">
-    <addedEObjects xsi:type="ecore:EReference" name="xyz">
-      <eAnnotations source="Override Annotation"/>
-    </addedEObjects>
-    <addedEObjects xsi:type="ecore:EReference" name="test79083"/>    
-  </event:AddMany>
-  
-</xmi:XMI>
diff --git a/tests/org.eclipse.jem.tests/testdata/testbeaninfo.zip b/tests/org.eclipse.jem.tests/testdata/testbeaninfo.zip
deleted file mode 100644
index bf70abf..0000000
--- a/tests/org.eclipse.jem.tests/testdata/testbeaninfo.zip
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.jem.tests/testdata/testbeaninfobeaninfos.zip b/tests/org.eclipse.jem.tests/testdata/testbeaninfobeaninfos.zip
deleted file mode 100644
index aa69c1a..0000000
--- a/tests/org.eclipse.jem.tests/testdata/testbeaninfobeaninfos.zip
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.jem.tests/testdata/testbeaninfopreq.zip b/tests/org.eclipse.jem.tests/testdata/testbeaninfopreq.zip
deleted file mode 100644
index 913e8af..0000000
--- a/tests/org.eclipse.jem.tests/testdata/testbeaninfopreq.zip
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.jem.tests/testdata/testbuttonbeaninfoui1projectjar.zip b/tests/org.eclipse.jem.tests/testdata/testbuttonbeaninfoui1projectjar.zip
deleted file mode 100644
index ac2b587..0000000
--- a/tests/org.eclipse.jem.tests/testdata/testbuttonbeaninfoui1projectjar.zip
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.jem.tests/testdata/testremoteproject.zip b/tests/org.eclipse.jem.tests/testdata/testremoteproject.zip
deleted file mode 100644
index 4a23022..0000000
--- a/tests/org.eclipse.jem.tests/testdata/testremoteproject.zip
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.jem.tests/testdata/unzip.xml b/tests/org.eclipse.jem.tests/testdata/unzip.xml
deleted file mode 100644
index 0097a75..0000000
--- a/tests/org.eclipse.jem.tests/testdata/unzip.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<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
deleted file mode 100644
index 5cf3d6c..0000000
--- a/tests/org.eclipse.jem.tests/vm_tests/org/eclipse/jem/tests/proxy/vm/TestCallback.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 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.jem.tests.proxy.vm;
-/*
- *  $RCSfile: TestCallback.java,v $
- *  $Revision: 1.4 $  $Date: 2005/02/15 23:00:32 $ 
- */
-
-import org.eclipse.jem.internal.proxy.common.*;
-/**
- * This is a test for testing callbacks.
- */
-public class TestCallback implements ICallback {
-	
-	IVMServer 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(IVMServer 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
deleted file mode 100644
index 94f6410..0000000
--- a/tests/org.eclipse.jem.tests/vm_tests/org/eclipse/jem/tests/proxy/vm/TestCallbackStream.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package org.eclipse.jem.tests.proxy.vm;
-/*******************************************************************************
- * Copyright (c)  2001, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.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: TestCallbackStream.java,v $
- *  $Revision: 1.2 $  $Date: 2005/02/15 23:00:32 $ 
- */
-
-import java.io.IOException;
-import java.io.OutputStream;
-
-import org.eclipse.jem.internal.proxy.common.ICallback;
-import org.eclipse.jem.internal.proxy.common.IVMServer;
-/**
- * This is a test for testing callback streams.
- */
-public class TestCallbackStream implements ICallback {
-	
-	IVMServer 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(IVMServer server, int id) {
-		vmServer = server;
-		callbackID = id;
-	}
-
-}
\ No newline at end of file
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
deleted file mode 100644
index eccee3f..0000000
--- a/tests/org.eclipse.jem.tests/vm_tests/org/eclipse/jem/tests/proxy/vm/TestExpressionThreadTransfer.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 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.jem.tests.proxy.vm;
-/*
- *  $RCSfile: TestExpressionThreadTransfer.java,v $
- *  $Revision: 1.1 $  $Date: 2005/05/16 19:11:16 $ 
- */
-
-import org.eclipse.jem.internal.proxy.common.*;
-/**
- * This is a test for testing callbacks.
- */
-public class TestExpressionThreadTransfer implements ICallback {
-	
-	IVMServer 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(IVMServer 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
deleted file mode 100644
index cf0bd61..0000000
--- a/tests/org.eclipse.jem.tests/vm_tests/testPackage/TestAccess.java
+++ /dev/null
@@ -1,74 +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
- *******************************************************************************/
-/*
- *  $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
deleted file mode 100644
index 56d4985..0000000
--- a/tests/org.eclipse.jem.tests/vm_tests/testPackage/TestCtorWithNull.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package testPackage;
-/*******************************************************************************
- * 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
- *******************************************************************************/
-/*
- *  $RCSfile: TestCtorWithNull.java,v $
- *  $Revision: 1.2 $  $Date: 2005/02/15 23:00:32 $ 
- */
-
-/**
- * 
- * @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.j2ee.core.tests.performance/.classpath b/tests/org.eclipse.jst.j2ee.core.tests.performance/.classpath
deleted file mode 100644
index 065ac06..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests.performance/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?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.core.tests.performance/.cvsignore b/tests/org.eclipse.jst.j2ee.core.tests.performance/.cvsignore
deleted file mode 100644
index d586ee1..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests.performance/.cvsignore
+++ /dev/null
@@ -1,4 +0,0 @@
-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
deleted file mode 100644
index a3e12fb..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests.performance/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?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/tests/org.eclipse.jst.j2ee.core.tests.performance/build.properties b/tests/org.eclipse.jst.j2ee.core.tests.performance/build.properties
deleted file mode 100644
index 1b9d7f8..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests.performance/build.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-source.core-performance.jar = src/
-output.core-performance.jar = bin/
-bin.includes = plugin.xml,\
-               core-performance.jar,\
-               test.xml,\
-               testcase.xml
diff --git a/tests/org.eclipse.jst.j2ee.core.tests.performance/plugin.xml b/tests/org.eclipse.jst.j2ee.core.tests.performance/plugin.xml
deleted file mode 100644
index 6fdee2c..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests.performance/plugin.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?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="0.7.0"
-   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/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
deleted file mode 100644
index a27f179..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests.performance/src/org/eclipse/jst/j2ee/core/tests/performance/AllCorePerformanceTests.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * 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.EJBProjectCreationOperationTest;
-import org.eclipse.wtp.j2ee.headless.tests.jca.operations.ConnectorProjectCreationOperationTest;
-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("testDefaults"), PerformanceTestCaseWrapper.NONE, "EJB Component creation test" );
-		addPerformanceTest(suite, new AppClientProjectCreationOperationTest("testDefaults"), PerformanceTestCaseWrapper.LOCAL, "App Client Component creation test" );
-		addPerformanceTest(suite, new ConnectorProjectCreationOperationTest("testDefaults"), PerformanceTestCaseWrapper.GLOBAL, "Connector Component creation test" );
-		addPerformanceTest(suite, new WebProjectCreationOperationTest("testDefaults"), PerformanceTestCaseWrapper.GLOBAL, "Web Component creation 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
deleted file mode 100644
index 08769eb..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests.performance/src/org/eclipse/jst/j2ee/core/tests/performance/CorePerformanceTestPlugin.java
+++ /dev/null
@@ -1,72 +0,0 @@
-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
deleted file mode 100644
index f21544b..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests.performance/test.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?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"/>
-
-  <!-- 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"/>
-  </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
deleted file mode 100644
index 4171864..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests.performance/testcase.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-<?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
deleted file mode 100644
index a9ea685..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="commonArchiveTests"/>
-	<classpathentry kind="src" path="mofj2eeTests"/>
-	<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.core.tests/.cvsignore b/tests/org.eclipse.jst.j2ee.core.tests/.cvsignore
deleted file mode 100644
index fb81ada..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/.cvsignore
+++ /dev/null
@@ -1,3 +0,0 @@
-bin
-testOutput
-build.xml
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/.project b/tests/org.eclipse.jst.j2ee.core.tests/.project
deleted file mode 100644
index ecd7aaa..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/.project
+++ /dev/null
@@ -1,27 +0,0 @@
-<?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/build.properties b/tests/org.eclipse.jst.j2ee.core.tests/build.properties
deleted file mode 100644
index fc32bd7..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/build.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-bin.includes = tests.jar,\
-               plugin.xml,\
-               my/,\
-               my.bar,\
-               test.xml,\
-               commonArchiveResources/,\
-               testData/
-output.tests.jar = bin/
-jars.compile.order = tests.jar
-source.tests.jar = commonArchiveTests/,\
-                   mofj2eeTests/
-bin.excludes = commonArchiveResources/.cvsignore
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/build/buildcontrol.properties b/tests/org.eclipse.jst.j2ee.core.tests/build/buildcontrol.properties
deleted file mode 100644
index 082a993..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/build/buildcontrol.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-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
deleted file mode 100644
index 191f326..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/build/package.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<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
deleted file mode 100644
index bb53885..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/build/wsBuild.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?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
deleted file mode 100644
index 09178ee..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-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
deleted file mode 100644
index 8796e23..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/EMFTestNoID/application-client.xml
+++ /dev/null
@@ -1,142 +0,0 @@
-<?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
deleted file mode 100644
index dbe7745..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/EMFTestNoID/application.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-<?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
deleted file mode 100644
index 739d68d..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/EMFTestNoID/ejb-jar.xml
+++ /dev/null
@@ -1,2869 +0,0 @@
-<?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
deleted file mode 100644
index 2e2a262..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/EMFTestNoID/ra.xml
+++ /dev/null
@@ -1,102 +0,0 @@
-<?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
deleted file mode 100644
index f34ec57..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/EMFTestNoID/web.xml
+++ /dev/null
@@ -1,1284 +0,0 @@
-<?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>GET</http-method>
-            <http-method>POST</http-method>
-            <http-method>PUT</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>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>
-            <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>
-            <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>
-            <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>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>
-            <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>
-            <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>
-            <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>
-            <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>
-            <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>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>
-            <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>
-            <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>
-            <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>
-            <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>
-            <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>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>
-            <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>
-            <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>
-            <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>
-            <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>
-            <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>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>
-            <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>
-            <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>
-            <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>
-            <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>
-            <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
deleted file mode 100644
index 325960c..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/EMFTests/application-client.xml
+++ /dev/null
@@ -1,142 +0,0 @@
-<?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
deleted file mode 100644
index faf46bd..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/EMFTests/application.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-<?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
deleted file mode 100644
index e875eae..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/EMFTests/ejb-jar.xml
+++ /dev/null
@@ -1,1864 +0,0 @@
-<?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
deleted file mode 100644
index d70d2d4..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/EMFTests/ejb-jar1-1.xml
+++ /dev/null
@@ -1,2831 +0,0 @@
-<?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
deleted file mode 100644
index 28b4822..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/EMFTests/ejb-jar2-0.xml
+++ /dev/null
@@ -1,2818 +0,0 @@
-<?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>
-                <role-name>name_0</role-name>
-                <role-link>link_0</role-link>
-            </security-role-ref>
-            <security-role-ref>
-                <role-name>name_1</role-name>
-                <role-link>link_1</role-link>
-            </security-role-ref>
-            <security-role-ref>
-                <role-name>name_2</role-name>
-                <role-link>link_2</role-link>
-            </security-role-ref>
-            <security-role-ref>
-                <role-name>name_3</role-name>
-                <role-link>link_3</role-link>
-            </security-role-ref>
-            <security-role-ref>
-                <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>
-                <role-name>name_5</role-name>
-                <role-link>link_5</role-link>
-            </security-role-ref>
-            <security-role-ref>
-                <role-name>name_6</role-name>
-                <role-link>link_6</role-link>
-            </security-role-ref>
-            <security-role-ref>
-                <role-name>name_7</role-name>
-                <role-link>link_7</role-link>
-            </security-role-ref>
-            <security-role-ref>
-                <role-name>name_8</role-name>
-                <role-link>link_8</role-link>
-            </security-role-ref>
-            <security-role-ref>
-                <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>
-                <role-name>name_10</role-name>
-                <role-link>link_10</role-link>
-            </security-role-ref>
-            <security-role-ref>
-                <role-name>name_11</role-name>
-                <role-link>link_11</role-link>
-            </security-role-ref>
-            <security-role-ref>
-                <role-name>name_12</role-name>
-                <role-link>link_12</role-link>
-            </security-role-ref>
-            <security-role-ref>
-                <role-name>name_13</role-name>
-                <role-link>link_13</role-link>
-            </security-role-ref>
-            <security-role-ref>
-                <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>
-                <role-name>name_15</role-name>
-                <role-link>link_15</role-link>
-            </security-role-ref>
-            <security-role-ref>
-                <role-name>name_16</role-name>
-                <role-link>link_16</role-link>
-            </security-role-ref>
-            <security-role-ref>
-                <role-name>name_17</role-name>
-                <role-link>link_17</role-link>
-            </security-role-ref>
-            <security-role-ref>
-                <role-name>name_18</role-name>
-                <role-link>link_18</role-link>
-            </security-role-ref>
-            <security-role-ref>
-                <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>
-                <role-name>name_20</role-name>
-                <role-link>link_20</role-link>
-            </security-role-ref>
-            <security-role-ref>
-                <role-name>name_21</role-name>
-                <role-link>link_21</role-link>
-            </security-role-ref>
-            <security-role-ref>
-                <role-name>name_22</role-name>
-                <role-link>link_22</role-link>
-            </security-role-ref>
-            <security-role-ref>
-                <role-name>name_23</role-name>
-                <role-link>link_23</role-link>
-            </security-role-ref>
-            <security-role-ref>
-                <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>
-                <role-name>name_25</role-name>
-                <role-link>link_25</role-link>
-            </security-role-ref>
-            <security-role-ref>
-                <role-name>name_26</role-name>
-                <role-link>link_26</role-link>
-            </security-role-ref>
-            <security-role-ref>
-                <role-name>name_27</role-name>
-                <role-link>link_27</role-link>
-            </security-role-ref>
-            <security-role-ref>
-                <role-name>name_28</role-name>
-                <role-link>link_28</role-link>
-            </security-role-ref>
-            <security-role-ref>
-                <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>
-                <role-name>name_35</role-name>
-                <role-link>link_35</role-link>
-            </security-role-ref>
-            <security-role-ref>
-                <role-name>name_36</role-name>
-                <role-link>link_36</role-link>
-            </security-role-ref>
-            <security-role-ref>
-                <role-name>name_37</role-name>
-                <role-link>link_37</role-link>
-            </security-role-ref>
-            <security-role-ref>
-                <role-name>name_38</role-name>
-                <role-link>link_38</role-link>
-            </security-role-ref>
-            <security-role-ref>
-                <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>
-                <role-name>name_40</role-name>
-                <role-link>link_40</role-link>
-            </security-role-ref>
-            <security-role-ref>
-                <role-name>name_41</role-name>
-                <role-link>link_41</role-link>
-            </security-role-ref>
-            <security-role-ref>
-                <role-name>name_42</role-name>
-                <role-link>link_42</role-link>
-            </security-role-ref>
-            <security-role-ref>
-                <role-name>name_43</role-name>
-                <role-link>link_43</role-link>
-            </security-role-ref>
-            <security-role-ref>
-                <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>
-                <role-name>name_45</role-name>
-                <role-link>link_45</role-link>
-            </security-role-ref>
-            <security-role-ref>
-                <role-name>name_46</role-name>
-                <role-link>link_46</role-link>
-            </security-role-ref>
-            <security-role-ref>
-                <role-name>name_47</role-name>
-                <role-link>link_47</role-link>
-            </security-role-ref>
-            <security-role-ref>
-                <role-name>name_48</role-name>
-                <role-link>link_48</role-link>
-            </security-role-ref>
-            <security-role-ref>
-                <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
deleted file mode 100644
index f597242..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/EMFTests/ejb-jar2-0sax.xml
+++ /dev/null
@@ -1,2859 +0,0 @@
-<?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
deleted file mode 100644
index e0816ae..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/EMFTests/ra.xml
+++ /dev/null
@@ -1,103 +0,0 @@
-<?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
deleted file mode 100644
index 27831b0..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/EMFTests/web.xml
+++ /dev/null
@@ -1,1285 +0,0 @@
-<?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
deleted file mode 100644
index 1e3ae0b..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/.metadata/.plugins/com.ibm.etools.j2ee/looseApp.xmi
+++ /dev/null
@@ -1,8 +0,0 @@
-<?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
deleted file mode 100644
index 64ffaf7..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/.metadata/.plugins/com.ibm.etools.j2ee/looseConfig.xmi
+++ /dev/null
@@ -1,10 +0,0 @@
-<?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
deleted file mode 100644
index 59499bc..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseConnector/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,2 +0,0 @@
-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
deleted file mode 100644
index 6a1cd6f..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseConnector/META-INF/application.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?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
deleted file mode 100644
index 59499bc..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseConnector/fooRAR/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,2 +0,0 @@
-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
deleted file mode 100644
index b341c53..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseConnector/fooRAR/META-INF/ra.xml
+++ /dev/null
@@ -1,103 +0,0 @@
-<?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/.modulemaps b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAR/META-INF/.modulemaps
deleted file mode 100644
index aa20a97..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAR/META-INF/.modulemaps
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<modulemap:EARProjectMap xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:modulemap="modulemap.xmi" xmlns:application="application.xmi" xmi:id="EARProjectMap_1">
-  <mappings xmi:id="ModuleMapping_1" projectName="LooseEAREjb">
-    <module xmi:type="application:EjbModule" href="META-INF/application.xml#EjbModule_1"/>
-  </mappings>
-  <mappings xmi:id="ModuleMapping_2" projectName="LooseEARWeb">
-    <module xmi:type="application:WebModule" href="META-INF/application.xml#WebModule_1"/>
-  </mappings>
-</modulemap:EARProjectMap>
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
deleted file mode 100644
index 56067f6..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAR/META-INF/application.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?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
deleted file mode 100644
index f3fbd0d..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAR/META-INF/ibm-application-ext.xmi
+++ /dev/null
@@ -1,10 +0,0 @@
-<?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
deleted file mode 100644
index 59499bc..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEARApp/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,2 +0,0 @@
-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
deleted file mode 100644
index b44d91e..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEARApp/META-INF/application.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?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
deleted file mode 100644
index 59499bc..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEARApp/fooAPP/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,2 +0,0 @@
-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
deleted file mode 100644
index c8bed76..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEARApp/fooAPP/META-INF/application-client.xml
+++ /dev/null
@@ -1,272 +0,0 @@
-<?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
deleted file mode 100644
index b25cae2..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?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
deleted file mode 100644
index 659969d..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/.j2ee
+++ /dev/null
@@ -1,4 +0,0 @@
-<?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
deleted file mode 100644
index a84f751..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/.project
+++ /dev/null
@@ -1,41 +0,0 @@
-<?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
deleted file mode 100644
index ddc5d41..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/.runtime
+++ /dev/null
@@ -1,2 +0,0 @@
-<?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
deleted file mode 100644
index 7ebad27..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/bin/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,3 +0,0 @@
-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
deleted file mode 100644
index bdce1e4..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/bin/META-INF/ejb-jar.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?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
deleted file mode 100644
index 573af4e..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/bin/META-INF/ibm-ejb-jar-bnd.xmi
+++ /dev/null
@@ -1,7 +0,0 @@
-<?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
deleted file mode 100644
index 46e70a8..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/bin/META-INF/ibm-ejb-jar-ext.xmi
+++ /dev/null
@@ -1,4 +0,0 @@
-<?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
deleted file mode 100644
index 51f7277..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/bin/com/ibm/test/ejb/MyCMP.class
+++ /dev/null
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
deleted file mode 100644
index 78ced2f..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/bin/com/ibm/test/ejb/MyCMPBean.class
+++ /dev/null
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
deleted file mode 100644
index 0492590..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/bin/com/ibm/test/ejb/MyCMPHome.class
+++ /dev/null
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
deleted file mode 100644
index 91b6702..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/bin/com/ibm/test/ejb/MyCMPKey.class
+++ /dev/null
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
deleted file mode 100644
index 59499bc..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,2 +0,0 @@
-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
deleted file mode 100644
index 46bae90..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/META-INF/ejb-jar.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?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
deleted file mode 100644
index a08df99..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/META-INF/ibm-ejb-jar-bnd.xmi
+++ /dev/null
@@ -1,11 +0,0 @@
-<?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
deleted file mode 100644
index 46e70a8..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/META-INF/ibm-ejb-jar-ext.xmi
+++ /dev/null
@@ -1,4 +0,0 @@
-<?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
deleted file mode 100644
index 12b8b7c..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/com/ibm/test/ejb/MyCMP.java
+++ /dev/null
@@ -1,6 +0,0 @@
-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
deleted file mode 100644
index bcdb044..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/com/ibm/test/ejb/MyCMPBean.java
+++ /dev/null
@@ -1,97 +0,0 @@
-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
deleted file mode 100644
index 7c09f21..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/com/ibm/test/ejb/MyCMPHome.java
+++ /dev/null
@@ -1,14 +0,0 @@
-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
deleted file mode 100644
index 7aa6f79..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/com/ibm/test/ejb/MyCMPKey.java
+++ /dev/null
@@ -1,39 +0,0 @@
-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
deleted file mode 100644
index 7972747..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/ejbs/CMP1Bean.java
+++ /dev/null
@@ -1,72 +0,0 @@
-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
deleted file mode 100644
index 6924016..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/ejbs/CMP1Key.java
+++ /dev/null
@@ -1,38 +0,0 @@
-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
deleted file mode 100644
index bdfdb59..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/ejbs/CMP1Local.java
+++ /dev/null
@@ -1,6 +0,0 @@
-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
deleted file mode 100644
index d856a30..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/ejbs/CMP1LocalHome.java
+++ /dev/null
@@ -1,16 +0,0 @@
-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
deleted file mode 100644
index b69abe1..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/ejbs/CMP2Bean.java
+++ /dev/null
@@ -1,72 +0,0 @@
-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
deleted file mode 100644
index 38e9bc7..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/ejbs/CMP2Key.java
+++ /dev/null
@@ -1,38 +0,0 @@
-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
deleted file mode 100644
index f6ac730..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/ejbs/CMP2Local.java
+++ /dev/null
@@ -1,6 +0,0 @@
-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
deleted file mode 100644
index 8a1bdf9..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEAREjb/ejbModule/ejbs/CMP2LocalHome.java
+++ /dev/null
@@ -1,16 +0,0 @@
-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
deleted file mode 100644
index 71bb38b..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEARWeb/.classpath
+++ /dev/null
@@ -1,11 +0,0 @@
-<?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
deleted file mode 100644
index 0e5b9a8..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEARWeb/.websettings
+++ /dev/null
@@ -1,4 +0,0 @@
-<?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
deleted file mode 100644
index b71b394..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEARWeb/source/com/ibm/test/web/C.java
+++ /dev/null
@@ -1,14 +0,0 @@
-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
deleted file mode 100644
index 735160a..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEARWeb/webApplication/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,3 +0,0 @@
-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
deleted file mode 100644
index 4051131..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEARWeb/webApplication/WEB-INF/classes/com/ibm/test/web/C.class
+++ /dev/null
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
deleted file mode 100644
index d74844b..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEARWeb/webApplication/WEB-INF/ibm-web-bnd.xmi
+++ /dev/null
@@ -1,3 +0,0 @@
-<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
deleted file mode 100644
index 82ec262..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEARWeb/webApplication/WEB-INF/ibm-web-ext.xmi
+++ /dev/null
@@ -1,10 +0,0 @@
-<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
deleted file mode 100644
index 1412efd..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseEARWeb/webApplication/WEB-INF/web.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?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
deleted file mode 100644
index d8b3fa0..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseJavaUtil/.classpath
+++ /dev/null
@@ -1,6 +0,0 @@
-<?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
deleted file mode 100644
index bfcfff0..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseJavaUtil/bin/com/ibm/test/A.class
+++ /dev/null
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
deleted file mode 100644
index 07f09c1..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseJavaUtil/src/com/ibm/test/A.java
+++ /dev/null
@@ -1,14 +0,0 @@
-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
deleted file mode 100644
index d8b3fa0..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseJavaWebLib/.classpath
+++ /dev/null
@@ -1,6 +0,0 @@
-<?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
deleted file mode 100644
index e3ee564..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseJavaWebLib/bin/com/ibm/web/test/B.class
+++ /dev/null
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
deleted file mode 100644
index ab18533..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/LooseJavaWebLib/src/com/ibm/web/test/B.java
+++ /dev/null
@@ -1,14 +0,0 @@
-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
deleted file mode 100644
index 1743e3d..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/boo.jar/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,4 +0,0 @@
-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
deleted file mode 100644
index e69de29..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/foobar.jar
+++ /dev/null
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
deleted file mode 100644
index 7b195b4..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveResources/loose_module_workspace/readme.txt
+++ /dev/null
@@ -1 +0,0 @@
-This is not a full WSAD 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
deleted file mode 100644
index 3049b94..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/AllDOMTests.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Created on Sep 5, 2003
- *
- */
-package org.eclipse.jst.j2ee.archive.emftests;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.wst.common.internal.emf.resource.EMF2DOMRendererFactory;
-import org.eclipse.wst.common.internal.emf.resource.RendererFactory;
-
-/**
- * @author Administrator
- */
-public class AllDOMTests extends TestCase{
-	
-	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("Test for com.ibm.etools.archive.emftest");
-		//$JUnit-BEGIN$
-		suite.addTest(new AllDOMTests("testSwitchRenderer", RendererFactory.getDefaultRendererFactory()));
-		suite.addTest(AppClientEMFEditTest.suite());
-		suite.addTest(AppClientEMFTest.suite());
-		suite.addTest(EarEMFEditTest.suite());
-		suite.addTest(EarEMFTest.suite()); //
-		suite.addTest(EjbEMFEditTest.suite());
-		suite.addTest(EjbEMFTest.suite());
-		suite.addTest(RarEMFEditTest.suite());
-		suite.addTest(RarEMFTest.suite());
-		suite.addTest(WarEMFEditTest.suite());
-		suite.addTest(WarEMFTest.suite());
-		suite.addTest(WebServicesEMFTest.suite());
-		suite.addTest(new AllDOMTests("testSwitchRendererBack", RendererFactory.getDefaultRendererFactory()));
- 
-		//$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
deleted file mode 100644
index 74c326f..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/AllSAXTests.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Created on Sep 5, 2003
- *
- */
-package org.eclipse.jst.j2ee.archive.emftests;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.wst.common.internal.emf.resource.EMF2SAXRendererFactory;
-import org.eclipse.wst.common.internal.emf.resource.RendererFactory;
-
-/**
- * @author Administrator
- */
-public class AllSAXTests extends TestCase{
-
-	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("Test for com.ibm.etools.archive.emftest");
-		//$JUnit-BEGIN$
-		suite.addTest(new AllSAXTests("testSwitchRenderer", RendererFactory.getDefaultRendererFactory()));
-		suite.addTest(AppClientEMFEditTest.suite());
-		suite.addTest(AppClientEMFTest.suite());
-		suite.addTest(EarEMFEditTest.suite());
-		suite.addTest(EarEMFTest.suite()); //
-		suite.addTest(EjbEMFEditTest.suite());
-		suite.addTest(EjbEMFTest.suite());
-		suite.addTest(RarEMFEditTest.suite());
-		suite.addTest(RarEMFTest.suite());
-		suite.addTest(WarEMFEditTest.suite());
-		suite.addTest(WarEMFTest.suite());
-		suite.addTest(WebServicesEMFTest.suite());
-		suite.addTest(new AllSAXTests("testSwitchRendererBack", RendererFactory.getDefaultRendererFactory()));
-
-		//$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
deleted file mode 100644
index 7e3008b..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/AllTests.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * 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
deleted file mode 100644
index b3d5d24..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/AppClientEMFEditTest.java
+++ /dev/null
@@ -1,90 +0,0 @@
-package org.eclipse.jst.j2ee.archive.emftests;
-
-import java.util.HashSet;
-
-import junit.framework.TestSuite;
-import junit.swingui.TestRunner;
-
-import org.eclipse.jst.j2ee.application.ApplicationFactory;
-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.CommonarchiveFactory;
-import org.eclipse.jst.j2ee.commonarchivecore.internal.CommonarchivePackage;
-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.ejb.EjbFactory;
-import org.eclipse.jst.j2ee.internal.application.ApplicationPackage;
-import org.eclipse.jst.j2ee.internal.ejb.EjbPackage;
-import org.eclipse.jst.j2ee.internal.webapplication.WebapplicationPackage;
-import org.eclipse.jst.j2ee.webapplication.WebapplicationFactory;
-
-
-public class AppClientEMFEditTest extends GeneralEMFEditingTest {
-    EARFile earFile;
-    ApplicationClientFile appClientFile;
-
-    public AppClientEMFEditTest(String name) {
-        super(name);
-    }
-
-    public CommonarchiveFactory getArchiveFactory() {
-        return CommonarchivePackage.eINSTANCE.getCommonarchiveFactory();
-    }
-
-    public EjbFactory getEjbFactory() {
-        return EjbPackage.eINSTANCE.getEjbFactory();
-    }
-
-    public ApplicationFactory getApplicationFactory() {
-        return ApplicationPackage.eINSTANCE.getApplicationFactory();
-    }
-
-    public WebapplicationFactory getWebAppFactory() {
-        return WebapplicationPackage.eINSTANCE.getWebapplicationFactory();
-    }
-
-    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() {
-        TestSuite suite = new TestSuite();
-        suite.addTest(new AppClientEMFEditTest("testApplicationClientEdit"));
-        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);
-    }
-    
-	public HashSet ignorableAttributes(){
-		HashSet set = new HashSet();
-		set.add("id");
-		return set;
-	}
-}
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
deleted file mode 100644
index 4a1fa57..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/AppClientEMFTest.java
+++ /dev/null
@@ -1,141 +0,0 @@
-package org.eclipse.jst.j2ee.archive.emftests;
-
-import java.util.HashSet;
-
-import junit.framework.TestSuite;
-import junit.swingui.TestRunner;
-
-import org.eclipse.jst.j2ee.application.ApplicationFactory;
-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.CommonarchiveFactory;
-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.commonarchivecore.internal.impl.CommonarchiveFactoryImpl;
-import org.eclipse.jst.j2ee.core.tests.bvt.AutomatedBVT;
-import org.eclipse.jst.j2ee.ejb.EjbFactory;
-import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
-import org.eclipse.jst.j2ee.internal.application.ApplicationPackage;
-import org.eclipse.jst.j2ee.internal.ejb.EjbPackage;
-import org.eclipse.jst.j2ee.internal.webapplication.WebapplicationPackage;
-import org.eclipse.jst.j2ee.webapplication.WebapplicationFactory;
-
-
-public class AppClientEMFTest extends GeneralEMFPopulationTest {
-    EARFile earFile;
-    protected ApplicationClientFile appClientFile;
-	EARFile earFile14;
-	ApplicationClientFile appClientFile14;
-
-    public AppClientEMFTest(String name) {
-        super(name);
-    }
-
-    public CommonarchiveFactory getArchiveFactory() {
-        return CommonarchiveFactoryImpl.getActiveFactory();
-    }
-
-    public EjbFactory getEjbFactory() {
-        return EjbPackage.eINSTANCE.getEjbFactory();
-    }
-
-    public ApplicationFactory getApplicationFactory() {
-        return ApplicationPackage.eINSTANCE.getApplicationFactory();
-    }
-
-    public WebapplicationFactory getWebAppFactory() {
-        return WebapplicationPackage.eINSTANCE.getWebapplicationFactory();
-    }
-
-    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() {
-        TestSuite suite = new TestSuite();
-        suite.addTest(new AppClientEMFTest("testApplicationClientPopulation"));
-        suite.addTest(new AppClientEMFTest("test14ApplicationClientPopulation"));
-        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);
-	}
-    
-    public HashSet ignorableAttributes(){
-    	HashSet set = new HashSet();
-    	set.add("id");
-    	return set;
-    }
-    
-}
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
deleted file mode 100644
index b7d43c4..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/EarEMFEditTest.java
+++ /dev/null
@@ -1,142 +0,0 @@
-package org.eclipse.jst.j2ee.archive.emftests;
-
-import java.util.HashSet;
-
-import junit.framework.TestSuite;
-import junit.swingui.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.CommonarchiveFactory;
-import org.eclipse.jst.j2ee.commonarchivecore.internal.CommonarchivePackage;
-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.ejb.EjbFactory;
-import org.eclipse.jst.j2ee.internal.application.ApplicationPackage;
-import org.eclipse.jst.j2ee.internal.ejb.EjbPackage;
-import org.eclipse.jst.j2ee.internal.webapplication.WebapplicationPackage;
-import org.eclipse.jst.j2ee.webapplication.WebapplicationFactory;
-
-
-public class EarEMFEditTest extends GeneralEMFEditingTest {
-    EARFile earFile;
-    int createdModules = 0;
-
-    private int NUM_MODULES = 4;
-
-    public EarEMFEditTest(String name) {
-        super(name);
-    }
-
-    public CommonarchiveFactory getArchiveFactory() {
-        return CommonarchivePackage.eINSTANCE.getCommonarchiveFactory();
-    }
-
-    public EjbFactory getEjbFactory() {
-        return EjbPackage.eINSTANCE.getEjbFactory();
-    }
-
-    public ApplicationFactory getApplicationFactory() {
-        return ApplicationPackage.eINSTANCE.getApplicationFactory();
-    }
-
-    public WebapplicationFactory getWebAppFactory() {
-        return WebapplicationPackage.eINSTANCE.getWebapplicationFactory();
-    }
-
-    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() {
-        TestSuite suite = new TestSuite();
-        suite.addTest(new EarEMFEditTest("testEAREdit"));
-        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 HashSet ignorableAttributes(){
-		HashSet set = new HashSet();
-		set.add("id");
-		return set;
-	}
-
-	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
deleted file mode 100644
index 02641ac..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/EarEMFTest.java
+++ /dev/null
@@ -1,186 +0,0 @@
-package org.eclipse.jst.j2ee.archive.emftests;
-
-import java.util.HashSet;
-
-import junit.framework.TestSuite;
-import junit.swingui.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.CommonarchiveFactory;
-import org.eclipse.jst.j2ee.commonarchivecore.internal.CommonarchivePackage;
-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.ejb.EjbFactory;
-import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
-import org.eclipse.jst.j2ee.internal.application.ApplicationPackage;
-import org.eclipse.jst.j2ee.internal.ejb.EjbPackage;
-import org.eclipse.jst.j2ee.internal.webapplication.WebapplicationPackage;
-import org.eclipse.jst.j2ee.webapplication.WebapplicationFactory;
-
-
-public class EarEMFTest extends GeneralEMFPopulationTest {
-    protected EARFile earFile;
-    int createdModules = 0;
-
-    private int NUM_MODULES = 5;
-
-    public EarEMFTest(String name) {
-        super(name);
-    }
-
-    public CommonarchiveFactory getArchiveFactory() {
-        return CommonarchivePackage.eINSTANCE.getCommonarchiveFactory();
-    }
-
-    public EjbFactory getEjbFactory() {
-        return EjbPackage.eINSTANCE.getEjbFactory();
-    }
-
-    public ApplicationFactory getApplicationFactory() {
-        return ApplicationPackage.eINSTANCE.getApplicationFactory();
-    }
-
-    public WebapplicationFactory getWebAppFactory() {
-        return WebapplicationPackage.eINSTANCE.getWebapplicationFactory();
-    }
-
-    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() {
-        TestSuite suite = new TestSuite();
-        suite.addTest(new EarEMFTest("testEARPopulation"));
-		suite.addTest(new EarEMFTest("test14EARPopulation"));
-        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(APPICATION);
-        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(APPICATION);
-		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 HashSet ignorableAttributes(){
-		HashSet set = new HashSet();
-		set.add("id");
-		return set;
-	}
-
-    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
deleted file mode 100644
index a7b6a24..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/EjbEMFEditTest.java
+++ /dev/null
@@ -1,341 +0,0 @@
-package org.eclipse.jst.j2ee.archive.emftests;
-
-import java.util.HashSet;
-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.application.ApplicationFactory;
-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.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.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.RoleSource;
-import org.eclipse.jst.j2ee.internal.application.ApplicationPackage;
-import org.eclipse.jst.j2ee.internal.ejb.EjbPackage;
-import org.eclipse.jst.j2ee.internal.ejb.impl.MethodPermissionImpl;
-import org.eclipse.jst.j2ee.internal.ejb.impl.QueryMethodImpl;
-import org.eclipse.jst.j2ee.internal.webapplication.WebapplicationPackage;
-import org.eclipse.jst.j2ee.webapplication.WebapplicationFactory;
-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 CommonarchiveFactory getArchiveFactory() {
-        return CommonarchivePackage.eINSTANCE.getCommonarchiveFactory();
-    }
-
-    public EjbFactory getEjbFactory() {
-        return EjbPackage.eINSTANCE.getEjbFactory();
-    }
-
-    public ApplicationFactory getApplicationFactory() {
-        return ApplicationPackage.eINSTANCE.getApplicationFactory();
-    }
-
-    public WebapplicationFactory getWebAppFactory() {
-        return WebapplicationPackage.eINSTANCE.getWebapplicationFactory();
-    }
-
-    public static void main(java.lang.String[] args) {
-		junit.textui.TestRunner.main(new String[] { EjbEMFEditTest.class.getName() }); 
-    }
-    public static junit.framework.Test suite() {
-        TestSuite suite = new TestSuite();
-        
-        /*System.out.println("Switching to SAX Renderer in " + EjbEMFEditTest.class.getName());
-		suite.addTest(new AllSAXTests("testSwitchRenderer"));*/
-		
-        suite.addTest(new EjbEMFEditTest("testEJBJarEdit"));
-        suite.addTest(new EjbEMFEditTest("testWCCMJar"));
-        /*suite.addTest(new EjbEMFEditTest("testWCCMProvidedCase"));*/
-        
-        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";
-        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);
-	}
-
-	public HashSet ignorableAttributes(){
-		HashSet set = new HashSet();
-		set.add("id");
-		return set;
-	}
-
-	/* (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
deleted file mode 100644
index b92c0bc..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/EjbEMFTest.java
+++ /dev/null
@@ -1,364 +0,0 @@
-package org.eclipse.jst.j2ee.archive.emftests;
-
-import java.util.HashMap;
-import java.util.HashSet;
-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.impl.JavaClassImpl;
-import org.eclipse.jst.j2ee.application.ApplicationFactory;
-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.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.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.MethodPermission;
-import org.eclipse.jst.j2ee.ejb.RoleSource;
-import org.eclipse.jst.j2ee.internal.J2EEInit;
-import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
-import org.eclipse.jst.j2ee.internal.application.ApplicationPackage;
-import org.eclipse.jst.j2ee.internal.ejb.EjbPackage;
-import org.eclipse.jst.j2ee.internal.ejb.impl.EJBRelationshipRoleImpl;
-import org.eclipse.jst.j2ee.internal.ejb.impl.MethodPermissionImpl;
-import org.eclipse.jst.j2ee.internal.ejb.impl.QueryMethodImpl;
-import org.eclipse.jst.j2ee.internal.webapplication.WebapplicationPackage;
-import org.eclipse.jst.j2ee.webapplication.WebapplicationFactory;
-
-
-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 CommonarchiveFactory getArchiveFactory() {
-		return CommonarchivePackage.eINSTANCE.getCommonarchiveFactory();
-	}
-
-	public EjbFactory getEjbFactory() {
-		return EJB_PKG.getEjbFactory();
-	}
-
-	public ApplicationFactory getApplicationFactory() {
-		return ApplicationPackage.eINSTANCE.getApplicationFactory();
-	}
-
-	public WebapplicationFactory getWebAppFactory() {
-		return WebapplicationPackage.eINSTANCE.getWebapplicationFactory();
-	}
-
-	public static void main(java.lang.String[] args) {
-		junit.textui.TestRunner.main(new String[] { EjbEMFTest.class.getName()});
-	}
-	public static junit.framework.Test suite() {
-		TestSuite suite = new TestSuite();
-
-		/*System.out.println("Switching to SAX Renderer in " + EjbEMFTest.class.getName());
-		suite.addTest(new AllSAXTests("testSwitchRenderer"));*/
-		suite.addTest(new EjbEMFTest("testEJBJarPopulation"));
-		suite.addTest(new EjbEMFTest("test14EJBJarPopulation"));
-		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);
-	}
-
-	public HashSet ignorableAttributes(){
-		HashSet set = new HashSet();
-		set.add("id");
-		return set;
-	}
-
-	/* (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
deleted file mode 100644
index db695b8..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/GeneralEMFEditingTest.java
+++ /dev/null
@@ -1,459 +0,0 @@
-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.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.core.tests.bvt.AutomatedBVT;
-import org.eclipse.jst.j2ee.internal.common.CommonPackage;
-import org.eclipse.wst.common.tests.BaseTestCase;
-
-
-public class GeneralEMFEditingTest extends BaseTestCase {
-	//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 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();
-		   }  
-		}
-	}
-}
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
deleted file mode 100644
index 2bbdc86..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/GeneralEMFPopulationTest.java
+++ /dev/null
@@ -1,457 +0,0 @@
-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.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.jem.java.JavaRefPackage;
-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.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.MessageDriven;
-import org.eclipse.jst.j2ee.ejb.MethodElementKind;
-import org.eclipse.jst.j2ee.internal.common.CommonPackage;
-import org.eclipse.jst.j2ee.internal.ejb.EjbPackage;
-import org.eclipse.wst.common.tests.BaseTestCase;
-
-
-public class GeneralEMFPopulationTest extends BaseTestCase {
-    //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 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 GeneralEMFPopulationTest(String name) {
-        super(name);
-    }
-
-    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 (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;
-            primPopulateAttrbute(eObject, att);
-        }
-    }
-
-	private 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
-	 */
-	private 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/RarEMFEditTest.java b/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/RarEMFEditTest.java
deleted file mode 100644
index 0b3ffc5..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/RarEMFEditTest.java
+++ /dev/null
@@ -1,88 +0,0 @@
-package org.eclipse.jst.j2ee.archive.emftests;
-
-import java.util.HashSet;
-
-import junit.framework.TestSuite;
-import junit.swingui.TestRunner;
-
-import org.eclipse.jst.j2ee.application.ApplicationFactory;
-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.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.ejb.EjbFactory;
-import org.eclipse.jst.j2ee.internal.application.ApplicationPackage;
-import org.eclipse.jst.j2ee.internal.ejb.EjbPackage;
-import org.eclipse.jst.j2ee.internal.webapplication.WebapplicationPackage;
-import org.eclipse.jst.j2ee.jca.ConnectorResource;
-import org.eclipse.jst.j2ee.webapplication.WebapplicationFactory;
-
-
-public class RarEMFEditTest extends GeneralEMFEditingTest {
-    RARFile rarFile;
-
-    public RarEMFEditTest(String name) {
-        super(name);
-    }
-
-    public CommonarchiveFactory getArchiveFactory() {
-        return CommonarchivePackage.eINSTANCE.getCommonarchiveFactory();
-    }
-
-    public EjbFactory getEjbFactory() {
-        return EjbPackage.eINSTANCE.getEjbFactory();
-    }
-
-    public ApplicationFactory getApplicationFactory() {
-        return ApplicationPackage.eINSTANCE.getApplicationFactory();
-    }
-
-    public WebapplicationFactory getWebAppFactory() {
-        return WebapplicationPackage.eINSTANCE.getWebapplicationFactory();
-    }
-
-    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() {
-        TestSuite suite = new TestSuite();
-        suite.addTest(new RarEMFEditTest("testRAREdit"));
-        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);
-    }
-	public HashSet ignorableAttributes(){
-		HashSet set = new HashSet();
-		set.add("id");
-		return set;
-	}
-}
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
deleted file mode 100644
index 08b0937..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/RarEMFTest.java
+++ /dev/null
@@ -1,158 +0,0 @@
-package org.eclipse.jst.j2ee.archive.emftests;
-
-import java.util.HashSet;
-
-import junit.framework.TestSuite;
-import junit.swingui.TestRunner;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.j2ee.application.ApplicationFactory;
-import org.eclipse.jst.j2ee.archive.testutilities.EMFAttributeFeatureGenerator;
-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.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.EjbFactory;
-import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
-import org.eclipse.jst.j2ee.internal.application.ApplicationPackage;
-import org.eclipse.jst.j2ee.internal.ejb.EjbPackage;
-import org.eclipse.jst.j2ee.internal.jca.JcaPackage;
-import org.eclipse.jst.j2ee.internal.webapplication.WebapplicationPackage;
-import org.eclipse.jst.j2ee.jca.ConnectorResource;
-import org.eclipse.jst.j2ee.webapplication.WebapplicationFactory;
-
-
-public class RarEMFTest extends GeneralEMFPopulationTest {
-	EARFile earFile;
-	protected RARFile rarFile;
-
-	public RarEMFTest(String name) {
-		super(name);
-	}
-
-	public CommonarchiveFactory getArchiveFactory() {
-		return CommonarchivePackage.eINSTANCE.getCommonarchiveFactory();
-	}
-
-	public EjbFactory getEjbFactory() {
-		return EjbPackage.eINSTANCE.getEjbFactory();
-	}
-
-	public ApplicationFactory getApplicationFactory() {
-		return ApplicationPackage.eINSTANCE.getApplicationFactory();
-	}
-
-	public WebapplicationFactory getWebAppFactory() {
-		return WebapplicationPackage.eINSTANCE.getWebapplicationFactory();
-	}
-
-	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() {
-		TestSuite suite = new TestSuite();
-		suite.addTest(new RarEMFTest("testRARPopulation"));
-		suite.addTest(new RarEMFTest("test14RARPopulation"));
-		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);
-	}
-
-	public HashSet ignorableAttributes() {
-		HashSet set = new HashSet();
-		set.add("id");
-		return set;
-	}
-
-	/* (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
deleted file mode 100644
index 04dc220..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/ResolverTest.java
+++ /dev/null
@@ -1,290 +0,0 @@
-package org.eclipse.jst.j2ee.archive.emftests;
-
-import java.util.HashSet;
-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.application.ApplicationFactory;
-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.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.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.RoleSource;
-import org.eclipse.jst.j2ee.internal.application.ApplicationPackage;
-import org.eclipse.jst.j2ee.internal.ejb.EjbPackage;
-import org.eclipse.jst.j2ee.internal.ejb.impl.MethodPermissionImpl;
-import org.eclipse.jst.j2ee.internal.ejb.impl.QueryMethodImpl;
-import org.eclipse.jst.j2ee.internal.webapplication.WebapplicationPackage;
-import org.eclipse.jst.j2ee.webapplication.WebapplicationFactory;
-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 CommonarchiveFactory getArchiveFactory() {
-        return CommonarchivePackage.eINSTANCE.getCommonarchiveFactory();
-    }
-
-    public EjbFactory getEjbFactory() {
-        return EjbPackage.eINSTANCE.getEjbFactory();
-    }
-
-    public ApplicationFactory getApplicationFactory() {
-        return ApplicationPackage.eINSTANCE.getApplicationFactory();
-    }
-
-    public WebapplicationFactory getWebAppFactory() {
-        return WebapplicationPackage.eINSTANCE.getWebapplicationFactory();
-    }
-
-    public static void main(java.lang.String[] args) {
-        junit.textui.TestRunner.main(new String[] { ResolverTest.class.getName()});
-    }
-
-    public static junit.framework.Test suite() {
-        TestSuite suite = new TestSuite();
-        /*suite.addTest(new AllSAXTests("testSwitchRenderer"));*/
-        suite.addTest(new ResolverTest("testResolver"));
-        suite.addTest(new ResolverTest("testResolverNoSchemaLocation"));
-        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);
-    }
-
-    public HashSet ignorableAttributes() {
-        HashSet set = new HashSet();
-        set.add("id");
-        return set;
-    }
-
-    /*
-     * (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
deleted file mode 100644
index bb98287..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/WarEMFEditTest.java
+++ /dev/null
@@ -1,163 +0,0 @@
-package org.eclipse.jst.j2ee.archive.emftests;
-
-import java.util.HashSet;
-import java.util.List;
-
-import junit.framework.TestSuite;
-import junit.swingui.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.application.ApplicationFactory;
-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.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.ejb.EjbFactory;
-import org.eclipse.jst.j2ee.internal.application.ApplicationPackage;
-import org.eclipse.jst.j2ee.internal.ejb.EjbPackage;
-import org.eclipse.jst.j2ee.internal.webapplication.WebapplicationPackage;
-import org.eclipse.jst.j2ee.internal.webapplication.impl.FilterMappingImpl;
-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;
-
-
-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 CommonarchiveFactory getArchiveFactory() {
-        return CommonarchivePackage.eINSTANCE.getCommonarchiveFactory();
-    }
-
-    public EjbFactory getEjbFactory() {
-        return EjbPackage.eINSTANCE.getEjbFactory();
-    }
-
-    public ApplicationFactory getApplicationFactory() {
-        return ApplicationPackage.eINSTANCE.getApplicationFactory();
-    }
-
-    public WebapplicationFactory getWebAppFactory() {
-        return WebapplicationPackage.eINSTANCE.getWebapplicationFactory();
-    }
-
-    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() {
-        TestSuite suite = new TestSuite();
-        suite.addTest(new WarEMFEditTest("testWAREdit"));
-        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);
-	}
-	
-	public HashSet ignorableAttributes(){
-		HashSet set = new HashSet();
-		set.add("id");
-		return set;
-	}
-}
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
deleted file mode 100644
index 37ce2c3..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/WarEMFTest.java
+++ /dev/null
@@ -1,234 +0,0 @@
-package org.eclipse.jst.j2ee.archive.emftests;
-
-import java.util.HashMap;
-import java.util.HashSet;
-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.application.ApplicationFactory;
-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.CommonarchiveFactory;
-import org.eclipse.jst.j2ee.commonarchivecore.internal.CommonarchivePackage;
-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.ejb.EjbFactory;
-import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
-import org.eclipse.jst.j2ee.internal.application.ApplicationPackage;
-import org.eclipse.jst.j2ee.internal.ejb.EjbPackage;
-import org.eclipse.jst.j2ee.internal.webapplication.WebapplicationPackage;
-import org.eclipse.jst.j2ee.internal.webapplication.impl.FilterMappingImpl;
-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;
-
-
-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 CommonarchiveFactory getArchiveFactory() {
-        return CommonarchivePackage.eINSTANCE.getCommonarchiveFactory();
-    }
-
-    public EjbFactory getEjbFactory() {
-        return EjbPackage.eINSTANCE.getEjbFactory();
-    }
-
-    public ApplicationFactory getApplicationFactory() {
-        return ApplicationPackage.eINSTANCE.getApplicationFactory();
-    }
-
-    public WebapplicationFactory getWebAppFactory() {
-        return WebapplicationPackage.eINSTANCE.getWebapplicationFactory();
-    }
-
-    public static void main(java.lang.String[] args) {
-        
-        junit.textui.TestRunner.main(new String[]{ WarEMFTest.class.getName() });
-    }
-    public static junit.framework.Test suite() {
-        TestSuite suite = new TestSuite();
-        suite.addTest(new WarEMFTest("testWARPopulation"));
-		suite.addTest(new WarEMFTest("test14WARPopulation"));
-        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";
-		warFile = getArchiveFactory().openWARFile(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);
-	}
-	
-	public HashSet ignorableAttributes(){
-		HashSet set = new HashSet();
-		set.add("id");
-		return set;
-	}
-
-
-	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
deleted file mode 100644
index 41a264e..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/emftests/WebServicesEMFTest.java
+++ /dev/null
@@ -1,222 +0,0 @@
-/*
- * 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 java.util.HashSet;
-
-import junit.framework.TestSuite;
-import junit.swingui.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.application.ApplicationFactory;
-import org.eclipse.jst.j2ee.archive.testutilities.EMFAttributeFeatureGenerator;
-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.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.EjbFactory;
-import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
-import org.eclipse.jst.j2ee.internal.application.ApplicationPackage;
-import org.eclipse.jst.j2ee.internal.common.impl.J2EEResourceFactoryRegistry;
-import org.eclipse.jst.j2ee.internal.ejb.EjbPackage;
-import org.eclipse.jst.j2ee.internal.webapplication.WebapplicationPackage;
-import org.eclipse.jst.j2ee.webapplication.WebapplicationFactory;
-import org.eclipse.jst.j2ee.webservice.internal.jaxrpcmap.JaxrpcmapPackage;
-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.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 {
-	EARFile earFile;
-	EJBJarFile ejbFile;
-	int currentVersion = J2EEVersionConstants.J2EE_1_3_ID;
-	private int createdInterfaceMaps = 0;
-
-	public WebServicesEMFTest(String name) {
-		super(name);
-	}
-
-	public CommonarchiveFactory getArchiveFactory() {
-		return CommonarchivePackage.eINSTANCE.getCommonarchiveFactory();
-	}
-
-	public EjbFactory getEjbFactory() {
-		return EjbPackage.eINSTANCE.getEjbFactory();
-	}
-
-	public ApplicationFactory getApplicationFactory() {
-		return ApplicationPackage.eINSTANCE.getApplicationFactory();
-	}
-
-	public WebapplicationFactory getWebAppFactory() {
-		return WebapplicationPackage.eINSTANCE.getWebapplicationFactory();
-	}
-	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 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() {
-		TestSuite suite = new TestSuite();
-		suite.addTest(new WebServicesEMFTest("test13WebServicesClientPopulation"));
-		suite.addTest(new WebServicesEMFTest("test13WebServicesDDPopulation"));
-		suite.addTest(new WebServicesEMFTest("test14WebServicesDDPopulation"));
-		suite.addTest(new WebServicesEMFTest("testJaxRPCMapPopulation"));
-		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 String getProjectLocation() {
-		if (currentVersion == J2EEVersionConstants.J2EE_1_3_ID)
-			return "testOutput/TestWebServices";
-		else
-			return "testOutput/TestWebServices14";
-	}
-	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);
-	}
-    
-	public HashSet ignorableAttributes(){
-		HashSet set = new HashSet();
-		set.add("id");
-		return set;
-	}
-}
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
deleted file mode 100644
index 491a319..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/AbstractArchiveTest.java
+++ /dev/null
@@ -1,84 +0,0 @@
-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
deleted file mode 100644
index 449fc6e..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/AllArchiveTestsEclipse.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * 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
deleted file mode 100644
index 1a6c8eb..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/AllArchiveTestsJava.java
+++ /dev/null
@@ -1,58 +0,0 @@
-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.swingui.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
deleted file mode 100644
index 5ed8198..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/ClientContainerResourceLoadTest.java
+++ /dev/null
@@ -1,106 +0,0 @@
-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.swingui.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.commonarchivecore.internal.impl.CommonarchiveFactoryImpl;
-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 {
-		// TODO Auto-generated method stub
-		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 = CommonarchiveFactoryImpl.getActiveFactory();
-			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
deleted file mode 100644
index f26cae9..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/CopyTests.java
+++ /dev/null
@@ -1,234 +0,0 @@
-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.swingui.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.internal.J2EEVersionConstants;
-import org.eclipse.jst.j2ee.internal.ejb.EjbPackage;
-import org.eclipse.jst.j2ee.internal.webapplication.WebapplicationPackage;
-import org.eclipse.jst.j2ee.webapplication.WebapplicationFactory;
-
-
-/**
- * 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 getEJBFactory().getEjbPackage();
-	}
-	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
deleted file mode 100644
index 08393f7..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/DefectVerificationTests.java
+++ /dev/null
@@ -1,389 +0,0 @@
-/*
- * Created on May 20, 2004
- *
- * TODO 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;
-
-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
- * 
- * TODO To change the template for this generated type comment go to Window -
- * Preferences - Java - Code Generation - Code and Comments
- */
-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
deleted file mode 100644
index 734786d..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/DiscriminatorTest.java
+++ /dev/null
@@ -1,107 +0,0 @@
-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
deleted file mode 100644
index 454c1e3..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/DomComparitor.java
+++ /dev/null
@@ -1,285 +0,0 @@
-/*
- * 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
deleted file mode 100644
index 354c4f8..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/InitializationTests.java
+++ /dev/null
@@ -1,90 +0,0 @@
-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.swingui.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
deleted file mode 100644
index 7133bd8..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/JavaTests.java
+++ /dev/null
@@ -1,61 +0,0 @@
-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.swingui.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
deleted file mode 100644
index fff1cd2..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/LooseArchiveTests.java
+++ /dev/null
@@ -1,282 +0,0 @@
-package org.eclipse.jst.j2ee.archive.test;
-
-
-import java.util.List;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-import junit.swingui.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.looseconfig.LooseApplication;
-import org.eclipse.jst.j2ee.commonarchivecore.internal.looseconfig.LooseConfigRegister;
-import org.eclipse.jst.j2ee.commonarchivecore.internal.looseconfig.LooseConfiguration;
-import org.eclipse.jst.j2ee.commonarchivecore.internal.looseconfig.LooseLibrary;
-import org.eclipse.jst.j2ee.commonarchivecore.internal.looseconfig.LooseModule;
-import org.eclipse.jst.j2ee.commonarchivecore.internal.looseconfig.LooseWARFile;
-import org.eclipse.jst.j2ee.commonarchivecore.internal.looseconfig.LooseconfigFactory;
-import org.eclipse.jst.j2ee.commonarchivecore.internal.looseconfig.LooseconfigPackage;
-import org.eclipse.jst.j2ee.commonarchivecore.internal.util.ArchiveUtil;
-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
deleted file mode 100644
index d5358d2..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/RarFileTests.java
+++ /dev/null
@@ -1,207 +0,0 @@
-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.swingui.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
deleted file mode 100644
index b7857e8..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/ResourceTests.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * 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.swingui.TestRunner;
-
-import org.eclipse.emf.ecore.resource.Resource;
-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;
-import org.eclipse.jst.j2ee.internal.common.CommonPackage;
-
-
-/**
- * @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
deleted file mode 100644
index 046c116..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/SaveTests.java
+++ /dev/null
@@ -1,106 +0,0 @@
-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.swingui.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
deleted file mode 100644
index fcddc0d..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/SecurityRoleTests.java
+++ /dev/null
@@ -1,119 +0,0 @@
-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.swingui.TestRunner;
-
-import org.eclipse.jst.j2ee.common.CommonFactory;
-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;
-import org.eclipse.jst.j2ee.internal.common.CommonPackage;
-
-/**
- * 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
deleted file mode 100644
index 2a8cdd8..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/SimpleTests.java
+++ /dev/null
@@ -1,433 +0,0 @@
-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.swingui.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.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.Entity;
-import org.eclipse.jst.j2ee.ejb.Session;
-import org.eclipse.jst.j2ee.internal.common.CommonPackage;
-import org.eclipse.jst.j2ee.internal.ejb.EjbPackage;
-import org.eclipse.jst.j2ee.internal.webapplication.WebapplicationPackage;
-import org.eclipse.jst.j2ee.webapplication.WebApp;
-
-
-/**
- * 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
deleted file mode 100644
index 5c8dced..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/TestInvalidXmlMultiplicity.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Created on Dec 2, 2003
- *
- */
-package org.eclipse.jst.j2ee.archive.test;
-
-import junit.framework.TestSuite;
-import junit.swingui.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
deleted file mode 100644
index 3dcbf77..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/TestModuleClassLoading.java
+++ /dev/null
@@ -1,98 +0,0 @@
-package org.eclipse.jst.j2ee.archive.test;
-
-import java.util.List;
-
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-import junit.swingui.TestRunner;
-
-import org.eclipse.jem.java.JavaClass;
-import org.eclipse.jem.java.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.commonarchivecore.internal.impl.CommonarchiveFactoryImpl;
-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 = CommonarchiveFactoryImpl.getActiveFactory();
-
-			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
deleted file mode 100644
index b7c126e..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/test/WARFileTests.java
+++ /dev/null
@@ -1,108 +0,0 @@
-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.swingui.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
deleted file mode 100644
index d850078..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/testutilities/EAttributeDescriptor.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * 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
deleted file mode 100644
index 60ba299..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/testutilities/EMFAttributeFeatureGenerator.java
+++ /dev/null
@@ -1,413 +0,0 @@
-package org.eclipse.jst.j2ee.archive.testutilities;
-
-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.jem.java.impl.JavaClassImpl;
-import org.eclipse.jst.j2ee.internal.common.CommonPackage;
-import org.eclipse.jst.j2ee.internal.ejb.EjbPackage;
-import org.eclipse.jst.j2ee.internal.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);
-		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.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:
-				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 {
-				versionHolder = "1.4";
-				break;
-			}
-		case APP_CLIENT :
-			if(version == VERSION_1_2) {
-				versionHolder = "1.2";
-				break;
-			}
-			else if(version == VERSION_1_3) {
-				versionHolder = "1.3";
-				break;
-			}
-			else {
-				versionHolder = "1.4";
-				break;
-			}
-		case EJB :
-			if(version == VERSION_1_2) {
-				versionHolder = "1.1";
-				break;
-			}
-			else if(version == VERSION_1_3) {
-				versionHolder = "2.0";
-				break;
-			}
-			else {
-				versionHolder = "2.1";
-				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 { 
-				versionHolder = "2.4";
-				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(generateRandomAttributeString(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 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
deleted file mode 100644
index d4f39c9..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/testutilities/J2EEVersionCheck.java
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * 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.internal.application.ApplicationPackage;
-import org.eclipse.jst.j2ee.internal.client.ClientPackage;
-import org.eclipse.jst.j2ee.internal.common.CommonPackage;
-import org.eclipse.jst.j2ee.internal.ejb.EjbPackage;
-import org.eclipse.jst.j2ee.internal.jca.JcaPackage;
-import org.eclipse.jst.j2ee.internal.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;
-	
-	//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){
-			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){
-			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
deleted file mode 100644
index 5f778ec..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/archive/testutilities/TestUtilities.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * 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
deleted file mode 100644
index 740689a..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/core/tests/bvt/AutomatedBVT.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * 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
deleted file mode 100644
index 08b007d..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/commonArchiveTests/org/eclipse/jst/j2ee/core/tests/bvt/AutomatedBVTEclipse.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * 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) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		}
-	}
-}
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
deleted file mode 100644
index a34135f..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/application/test/ApplicationFactoryTest.java
+++ /dev/null
@@ -1,82 +0,0 @@
-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.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;
-import org.eclipse.jst.j2ee.internal.application.ApplicationPackage;
-
-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);
-    }
-
-    public void test_getApplicationPackage() {
-
-        ApplicationFactory objApplicationFactory = getInstance();
-        ApplicationPackage retValue = null;
-        retValue = objApplicationFactory.getApplicationPackage();
-        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
deleted file mode 100644
index 1368290..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/application/test/ApplicationTest.java
+++ /dev/null
@@ -1,237 +0,0 @@
-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.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.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;
-import org.eclipse.jst.j2ee.internal.application.ApplicationPackage;
-import org.eclipse.jst.j2ee.internal.common.CommonPackage;
-
-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(APP_CLIENT);
-		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(APP_CLIENT);
- 		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
deleted file mode 100644
index cb62ecb..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/client/test/ApplicationClientTest.java
+++ /dev/null
@@ -1,185 +0,0 @@
-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.commonarchivecore.internal.exception.DuplicateObjectException;
-import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.ResourceLoadException;
-import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
-import org.eclipse.jst.j2ee.internal.client.ClientPackage;
-
-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
deleted file mode 100644
index 29f40c9..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/client/test/ClientFactoryTest.java
+++ /dev/null
@@ -1,43 +0,0 @@
-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.internal.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);
-    }
-
-    public void test_getClientPackage() {
-        ClientFactory objClientFactory = getInstance();
-        ClientPackage retValue = null;
-        retValue = objClientFactory.getClientPackage();
-        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
deleted file mode 100644
index 4f77962..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/test/CommonFactoryTest.java
+++ /dev/null
@@ -1,225 +0,0 @@
-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.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;
-import org.eclipse.jst.j2ee.internal.common.CommonPackage;
-
-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);
-    }
-
-    public void test_getCommonPackage() {
-
-        CommonFactory objCommonFactory =getInstance();
-        CommonPackage retValue = null;
-        retValue = objCommonFactory.getCommonPackage();
-        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
deleted file mode 100644
index 92d76f6..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/test/CompatibilityDescriptionGroupTest.java
+++ /dev/null
@@ -1,99 +0,0 @@
-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
deleted file mode 100644
index 2f48ed7..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/test/EjbRefTest.java
+++ /dev/null
@@ -1,257 +0,0 @@
-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.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.EnterpriseBean;
-import org.eclipse.jst.j2ee.ejb.Session;
-import org.eclipse.jst.j2ee.internal.common.CommonPackage;
-import org.eclipse.jst.j2ee.internal.ejb.EjbPackage;
-
-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
deleted file mode 100644
index 54085ec..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/test/ListenerTest.java
+++ /dev/null
@@ -1,56 +0,0 @@
-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
deleted file mode 100644
index d25bf80..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/common/test/QNameTest.java
+++ /dev/null
@@ -1,96 +0,0 @@
-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/core/api/test/AllCoreAPITests.java b/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/core/api/test/AllCoreAPITests.java
deleted file mode 100644
index 4dd0130..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/core/api/test/AllCoreAPITests.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * 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
deleted file mode 100644
index 6524afe..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/core/api/test/AutomatedAPIBVT.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * 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
deleted file mode 100644
index 71a18c2..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/core/tests/api/AllAPITest.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Created on Mar 18, 2005
- *
- * 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.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;
-
-
-
-/**
- * @author Admin
- *
- * TODO To change the template for this generated type comment go to
- * Window - Preferences - Java - Code Style - Code Templates
- */
-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
deleted file mode 100644
index 0c706ce..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/AssemblyDescriptorTest.java
+++ /dev/null
@@ -1,220 +0,0 @@
-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.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;
-import org.eclipse.jst.j2ee.internal.common.CommonPackage;
-
-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
deleted file mode 100644
index 4747471..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/CMPAttributeTest.java
+++ /dev/null
@@ -1,186 +0,0 @@
-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.internal.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
deleted file mode 100644
index 0c3a586..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/CMRFieldTest.java
+++ /dev/null
@@ -1,87 +0,0 @@
-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.internal.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
deleted file mode 100644
index 412b877..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/ContainerManagedEntityTest.java
+++ /dev/null
@@ -1,388 +0,0 @@
-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.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.internal.J2EEVersionConstants;
-import org.eclipse.jst.j2ee.internal.ejb.EjbPackage;
-
-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
deleted file mode 100644
index 4c845f9..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/EJBJarTest.java
+++ /dev/null
@@ -1,589 +0,0 @@
-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.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;
-import org.eclipse.jst.j2ee.internal.common.CommonPackage;
-
-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
deleted file mode 100644
index 5584686..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/EJBRelationTest.java
+++ /dev/null
@@ -1,154 +0,0 @@
-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.internal.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
deleted file mode 100644
index f141412..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/EJBRelationshipRoleTest.java
+++ /dev/null
@@ -1,307 +0,0 @@
-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.MultiplicityKind;
-import org.eclipse.jst.j2ee.ejb.RoleSource;
-import org.eclipse.jst.j2ee.internal.ejb.EjbPackage;
-
-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
deleted file mode 100644
index 4a4609f..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/EjbEMFTestBase.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Created on Mar 14, 2005
- *
- * TODO To change the template for this generated file go to
- * Window - Preferences - Java - Code Style - Code Templates
- */
-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;
-
-/**
- * @author Admin
- *
- * TODO To change the template for this generated type comment go to
- * Window - Preferences - Java - Code Style - Code Templates
- */
-public class EjbEMFTestBase extends EjbEMFTest {
-
-	/**
-	 * @param name
-	 */
-	public EjbEMFTestBase(String name) {
-		super(name);
-		// TODO Auto-generated constructor stub
-	}
-
-	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
deleted file mode 100644
index 3fd515c..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/EjbFactoryTest.java
+++ /dev/null
@@ -1,282 +0,0 @@
-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.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.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;
-import org.eclipse.jst.j2ee.internal.ejb.EjbPackage;
-
-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);
-    }
-
-    public void test_getEjbPackage() {
-
-        EjbFactory objEjbFactory = getInstance();
-        EjbPackage retValue = null;
-        retValue = objEjbFactory.getEjbPackage();
-        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
deleted file mode 100644
index 9ca548c..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/EntityTest.java
+++ /dev/null
@@ -1,142 +0,0 @@
-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 {
-		// TODO Auto-generated method stub
-		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
deleted file mode 100644
index f33cc02..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/MethodElementTest.java
+++ /dev/null
@@ -1,517 +0,0 @@
-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.impl.JavaRefFactoryImpl;
-import org.eclipse.jst.j2ee.ejb.EJBResource;
-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;
-import org.eclipse.jst.j2ee.internal.ejb.EjbPackage;
-
-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
deleted file mode 100644
index 8d81d90..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/MethodPermissionTest.java
+++ /dev/null
@@ -1,187 +0,0 @@
-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.SecurityRole;
-import org.eclipse.jst.j2ee.ejb.EjbFactory;
-import org.eclipse.jst.j2ee.ejb.MethodPermission;
-import org.eclipse.jst.j2ee.internal.common.CommonPackage;
-import org.eclipse.jst.j2ee.internal.ejb.EjbPackage;
-
-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
deleted file mode 100644
index 17dd98d..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/MethodTransactionTest.java
+++ /dev/null
@@ -1,160 +0,0 @@
-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
deleted file mode 100644
index 23a6ffd..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/QueryMethodTest.java
+++ /dev/null
@@ -1,96 +0,0 @@
-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
deleted file mode 100644
index f62d646..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/QueryTest.java
+++ /dev/null
@@ -1,130 +0,0 @@
-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
deleted file mode 100644
index fb68ba7..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/ejb/test/SessionTest.java
+++ /dev/null
@@ -1,116 +0,0 @@
-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.Session;
-import org.eclipse.jst.j2ee.internal.ejb.EjbPackage;
-
-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
deleted file mode 100644
index f2c1119..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/jca/test/ConnectorTest.java
+++ /dev/null
@@ -1,45 +0,0 @@
-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.internal.jca.JcaPackage;
-import org.eclipse.jst.j2ee.jca.Connector;
-import org.eclipse.jst.j2ee.jca.ConnectorResource;
-
-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
deleted file mode 100644
index 0ebabf4..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/jca/test/JcaFactoryTest.java
+++ /dev/null
@@ -1,159 +0,0 @@
-package org.eclipse.jst.j2ee.jca.test;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.jst.j2ee.internal.jca.JcaPackage;
-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.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
deleted file mode 100644
index 563f569..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/jsp/test/JspFactoryTest.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package org.eclipse.jst.j2ee.jsp.test;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.jst.j2ee.internal.jsp.JspPackage;
-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.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
deleted file mode 100644
index 49387ab..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/webapplication/test/WebapplicationFactoryTest.java
+++ /dev/null
@@ -1,281 +0,0 @@
-package org.eclipse.jst.j2ee.webapplication.test;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.jst.j2ee.internal.webapplication.WebapplicationPackage;
-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.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
deleted file mode 100644
index 0bc13ac..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/webservice/wscommon/test/WscommonFactoryTest.java
+++ /dev/null
@@ -1,82 +0,0 @@
-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.internal.wscommon.WscommonPackage;
-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;
-
-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
deleted file mode 100644
index be7fd9e..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/mofj2eeTests/org/eclipse/jst/j2ee/webservice/wsdd/test/WsddFactoryTest.java
+++ /dev/null
@@ -1,109 +0,0 @@
-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.internal.wsdd.WsddPackage;
-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;
-
-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);
-    }
-
-    public void test_getWsddPackage() {
-
-        WsddFactory objWsddFactory = getInstance();
-        WsddPackage retValue = null;
-        retValue = objWsddFactory.getWsddPackage();
-        // TODO getWsddPackage method always return null
-        assertNotNull(retValue);
-    }
-
-}
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/out.xmi b/tests/org.eclipse.jst.j2ee.core.tests/out.xmi
deleted file mode 100644
index 47d30c3..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/out.xmi
+++ /dev/null
@@ -1,110 +0,0 @@
-<?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.xml b/tests/org.eclipse.jst.j2ee.core.tests/plugin.xml
deleted file mode 100644
index 16ac8f5..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/plugin.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin
-   id="org.eclipse.jst.j2ee.core.tests"
-   name="J2EE Core Tests Component"
-   version="0.7.0"
-   provider-name="Eclipse.org" >
-
-
-   <runtime>
-      <library name="tests.jar">
-         <export name="*"/>
-      </library>
-   </runtime>
-   <requires>
-      <import plugin="org.junit"/>
-      <import plugin="org.eclipse.jem.util"/>
-      <import plugin="org.eclipse.jst.j2ee.core"/>
-      <import plugin="org.eclipse.wst.common.emf"/>
-      <import plugin="org.eclipse.emf.ecore.xmi"/>
-      <import plugin="org.eclipse.jem"/>
-      <import plugin="org.eclipse.core.runtime"/>
-      <import plugin="org.eclipse.wst.common.tests"/>
-
-   </requires>
-
-
-</plugin>
diff --git a/tests/org.eclipse.jst.j2ee.core.tests/test.xml b/tests/org.eclipse.jst.j2ee.core.tests/test.xml
deleted file mode 100644
index 75db698..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/test.xml
+++ /dev/null
@@ -1,58 +0,0 @@
-<?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="-DXmx700M"/>
-
-  <!-- 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
deleted file mode 100644
index 1041650..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/testData/ejb/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,5 +0,0 @@
-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
deleted file mode 100644
index 5780861..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/testData/ejb/META-INF/Table.ddl
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
--- 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
deleted file mode 100644
index a19a98e..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/testData/ejb/META-INF/backends/CLOUDSCAPE_V50_1/Map.mapxmi
+++ /dev/null
@@ -1,34 +0,0 @@
-<?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
deleted file mode 100644
index 5780861..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/testData/ejb/META-INF/backends/CLOUDSCAPE_V50_1/Table.ddl
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
--- 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
deleted file mode 100644
index 914bdee..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/testData/ejb/META-INF/backends/CLOUDSCAPE_V50_1/TopDownDB.dbxmi
+++ /dev/null
@@ -1,6 +0,0 @@
-<?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
deleted file mode 100644
index ca20a40..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/testData/ejb/META-INF/backends/CLOUDSCAPE_V50_1/TopDownDB_NULLID.schxmi
+++ /dev/null
@@ -1,5 +0,0 @@
-<?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
deleted file mode 100644
index adf1d75..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/testData/ejb/META-INF/backends/CLOUDSCAPE_V50_1/TopDownDB_NULLID_ACCOUNT.tblxmi
+++ /dev/null
@@ -1,27 +0,0 @@
-<?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
deleted file mode 100644
index d6f62d3..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/testData/ejb/META-INF/backends/CLOUDSCAPE_V50_1/ibm_pmbab.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-#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
deleted file mode 100644
index 9d9860f..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/testData/ejb/META-INF/ejb-jar.xml
+++ /dev/null
@@ -1,77 +0,0 @@
-<?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
deleted file mode 100644
index d690d43..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/testData/ejb/META-INF/ibm-ejb-jar-bnd.xmi
+++ /dev/null
@@ -1,14 +0,0 @@
-<?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
deleted file mode 100644
index 3eeecb1..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/testData/ejb/META-INF/ibm-ejb-jar-ext-pme.xmi
+++ /dev/null
@@ -1,34 +0,0 @@
-<?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
deleted file mode 100644
index 673264f..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/testData/ejb/META-INF/ibm-ejb-jar-ext.xmi
+++ /dev/null
@@ -1,22 +0,0 @@
-<?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
deleted file mode 100644
index 59499bc..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/testData/no-sl/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,2 +0,0 @@
-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
deleted file mode 100644
index 2693c86..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/testData/no-sl/META-INF/ejb-jar.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?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
deleted file mode 100644
index cda4e08..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/testData/no-sl/ejbs/T1.class
+++ /dev/null
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
deleted file mode 100644
index 51cb4f6..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/testData/no-sl/ejbs/T1Bean.class
+++ /dev/null
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
deleted file mode 100644
index a579832..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/testData/no-sl/ejbs/T1Home.class
+++ /dev/null
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
deleted file mode 100644
index 59499bc..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/testData/sl/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,2 +0,0 @@
-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
deleted file mode 100644
index af37a03..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/testData/sl/META-INF/ejb-jar.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?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
deleted file mode 100644
index cda4e08..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/testData/sl/ejbs/T1.class
+++ /dev/null
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
deleted file mode 100644
index 51cb4f6..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/testData/sl/ejbs/T1Bean.class
+++ /dev/null
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
deleted file mode 100644
index a579832..0000000
--- a/tests/org.eclipse.jst.j2ee.core.tests/testData/sl/ejbs/T1Home.class
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests.performance/.classpath b/tests/org.eclipse.jst.j2ee.tests.performance/.classpath
deleted file mode 100644
index 34ca0e9..0000000
--- a/tests/org.eclipse.jst.j2ee.tests.performance/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="common/"/>
-	<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.tests.performance/.cvsignore b/tests/org.eclipse.jst.j2ee.tests.performance/.cvsignore
deleted file mode 100644
index 43ac606..0000000
--- a/tests/org.eclipse.jst.j2ee.tests.performance/.cvsignore
+++ /dev/null
@@ -1,4 +0,0 @@
-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
deleted file mode 100644
index 2aed33e..0000000
--- a/tests/org.eclipse.jst.j2ee.tests.performance/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?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/tests/org.eclipse.jst.j2ee.tests.performance/build.properties b/tests/org.eclipse.jst.j2ee.tests.performance/build.properties
deleted file mode 100644
index 3effe21..0000000
--- a/tests/org.eclipse.jst.j2ee.tests.performance/build.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-source.performance.jar = common/
-output.performance.jar = bin/
-bin.includes = plugin.xml,\
-               performance.jar,\
-               test.xml,\
-               testcase.xml
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
deleted file mode 100644
index ce756af..0000000
--- a/tests/org.eclipse.jst.j2ee.tests.performance/common/org/eclipse/jst/j2ee/tests/performance/BasePerformanceTestCase.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * 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/PerformancePlugin.java b/tests/org.eclipse.jst.j2ee.tests.performance/common/org/eclipse/jst/j2ee/tests/performance/PerformancePlugin.java
deleted file mode 100644
index c9e28ac..0000000
--- a/tests/org.eclipse.jst.j2ee.tests.performance/common/org/eclipse/jst/j2ee/tests/performance/PerformancePlugin.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package org.eclipse.jst.j2ee.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 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
deleted file mode 100644
index 7747014..0000000
--- a/tests/org.eclipse.jst.j2ee.tests.performance/common/org/eclipse/jst/j2ee/tests/performance/PerformanceTestCaseWrapper.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * 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();
-			}
-		}
-		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
deleted file mode 100644
index 803934e..0000000
--- a/tests/org.eclipse.jst.j2ee.tests.performance/common/org/eclipse/jst/j2ee/tests/performance/PerformanceTestObject.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * 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/TestCaseSAXParser.java b/tests/org.eclipse.jst.j2ee.tests.performance/common/org/eclipse/jst/j2ee/tests/performance/TestCaseSAXParser.java
deleted file mode 100644
index 3189ea0..0000000
--- a/tests/org.eclipse.jst.j2ee.tests.performance/common/org/eclipse/jst/j2ee/tests/performance/TestCaseSAXParser.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * 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/plugin.xml b/tests/org.eclipse.jst.j2ee.tests.performance/plugin.xml
deleted file mode 100644
index 290d877..0000000
--- a/tests/org.eclipse.jst.j2ee.tests.performance/plugin.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin
-   id="org.eclipse.jst.j2ee.tests.performance"
-   name="Performance Plug-in"
-   version="0.7.0"
-   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"/>
-   </requires>
-
-</plugin>
diff --git a/tests/org.eclipse.jst.j2ee.tests/.classpath b/tests/org.eclipse.jst.j2ee.tests/.classpath
deleted file mode 100644
index d5e359a..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/.classpath
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="j2ee-tests/"/>
-	<classpathentry kind="src" path="webmodule-tests/"/>
-	<classpathentry kind="src" path="ejbmodule-tests/"/>
-	<classpathentry kind="src" path="jcamodule-tests/"/>
-	<classpathentry kind="src" path="savestrategy-tests/"/>
-	<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.tests/.cvsignore b/tests/org.eclipse.jst.j2ee.tests/.cvsignore
deleted file mode 100644
index 60463af..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-bin
-build.xml
diff --git a/tests/org.eclipse.jst.j2ee.tests/.project b/tests/org.eclipse.jst.j2ee.tests/.project
deleted file mode 100644
index ffec9c0..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?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/TestData/.cvsignore b/tests/org.eclipse.jst.j2ee.tests/TestData/.cvsignore
deleted file mode 100644
index d30e719..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/TestData/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-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
deleted file mode 100644
index 8cce112..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/TestData/AppClientTests/12AppClientTest.jar
+++ /dev/null
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
deleted file mode 100644
index 79957c4..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/TestData/AppClientTests/13AppClient.jar
+++ /dev/null
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
deleted file mode 100644
index f00cf8b..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/TestData/AppClientTests/13AppClientTest.jar
+++ /dev/null
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
deleted file mode 100644
index b3c7ede..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/TestData/AppClientTests/AppClientExpTest.jar
+++ /dev/null
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
deleted file mode 100644
index dbe7dfb..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/TestData/AppClientTests/AppClientNoSource.jar
+++ /dev/null
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
deleted file mode 100644
index def98f6..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/TestData/AppClientTests/AppClientSomeSource.jar
+++ /dev/null
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
deleted file mode 100644
index eaac33a..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/TestData/AppClientTests/AppClientSource.jar
+++ /dev/null
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
deleted file mode 100644
index 3bf23c1..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/TestData/EARImportTests/SimpleEAR.ear
+++ /dev/null
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
deleted file mode 100644
index e7c8dc9..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/TestData/EARImportTests/Test12EJBEAR.ear
+++ /dev/null
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
deleted file mode 100644
index c16da2a..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/TestData/EARImportTests/Test12WEBEJBEAR.ear
+++ /dev/null
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
deleted file mode 100644
index edc7beb..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/TestData/EARImportTests/Test13EJBEAR.ear
+++ /dev/null
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
deleted file mode 100644
index e932509..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/TestData/EARImportTests/Test13WEBEJBEAR.ear
+++ /dev/null
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
deleted file mode 100644
index fd22028..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/TestData/EARImportTests/Test14EJBEAR.ear
+++ /dev/null
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
deleted file mode 100644
index 86cb493..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/TestData/EARImportTests/Test14WEBEJBEAR.ear
+++ /dev/null
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
deleted file mode 100644
index 17b981a..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/TestData/EARImportTests/Test14WEBEJBEARWithMetaData.ear
+++ /dev/null
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
deleted file mode 100644
index cb83101..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/TestData/EARImportTests/UtilityJarTestEAR.ear
+++ /dev/null
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
deleted file mode 100644
index 5debb3b..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/TestData/EARImportTests/UtilityJarWebLibWithMetaDataFilesEAR.ear
+++ /dev/null
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
deleted file mode 100644
index be00332..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/TestData/EJBImportTests/Test13EJB.jar
+++ /dev/null
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
deleted file mode 100644
index f06f754..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/TestData/EJBImportTests/Test14EJB.jar
+++ /dev/null
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
deleted file mode 100644
index b0a4cf3..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/TestData/GenralArtifactTest/J2EEArtifactEditTestProjects.zip
+++ /dev/null
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
deleted file mode 100644
index f1fb89d..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/TestData/RARImportTests/JDEConnector.rar
+++ /dev/null
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
deleted file mode 100644
index 3817287..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/TestData/SaveStrategyTests/AppClient.zip
+++ /dev/null
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
deleted file mode 100644
index eb51480..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/TestData/SaveStrategyTests/WarImportFlexProject.zip
+++ /dev/null
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
deleted file mode 100644
index 9c30a38..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/TestData/WARImportTests/Example1.war
+++ /dev/null
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
deleted file mode 100644
index ba220b1..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/TestData/WARImportTests/Test12Web.war
+++ /dev/null
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
deleted file mode 100644
index 22aa926..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/TestData/WARImportTests/Test13Web.war
+++ /dev/null
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
deleted file mode 100644
index 1eb2a3f..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/TestData/WARImportTests/Test14Web.war
+++ /dev/null
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
deleted file mode 100644
index a4a7597..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/TestData/WARImportTests/WebNoSource.war
+++ /dev/null
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
deleted file mode 100644
index 533b000..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/TestData/WARImportTests/WebSomeSource.war
+++ /dev/null
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
deleted file mode 100644
index 6b71a0e..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/TestData/WARImportTests/WebSource.war
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/testOutput/testOutput.txt b/tests/org.eclipse.jst.j2ee.tests/TestData/testOutput/testOutput.txt
deleted file mode 100644
index e69de29..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/TestData/testOutput/testOutput.txt
+++ /dev/null
diff --git a/tests/org.eclipse.jst.j2ee.tests/build.properties b/tests/org.eclipse.jst.j2ee.tests/build.properties
deleted file mode 100644
index f4f6f6e..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/build.properties
+++ /dev/null
@@ -1,14 +0,0 @@
-source.j2ee-tests.jar = j2ee-tests/,\
-                        webmodule-tests/,\
-                        ejbmodule-tests/,\
-                        jcamodule-tests/,\
-                        savestrategy-tests/
-output.j2ee-tests.jar = bin/
-bin.includes = plugin.xml,\
-               j2ee-tests.jar,\
-               TestData/,\
-               test.xml
-src.includes = build.properties,\
-               test.xml,\
-               plugin.xml,\
-               TestData/
diff --git a/tests/org.eclipse.jst.j2ee.tests/ejbmodule-tests/org/eclipse/wtp/j2ee/headless/tests/ejb/operations/AllTests.java b/tests/org.eclipse.jst.j2ee.tests/ejbmodule-tests/org/eclipse/wtp/j2ee/headless/tests/ejb/operations/AllTests.java
deleted file mode 100644
index d78f0bf..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/ejbmodule-tests/org/eclipse/wtp/j2ee/headless/tests/ejb/operations/AllTests.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * 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;
-
-/**
- * @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 Tests");
-      //  addTest(EJBExportOperationTest.suite());
-     //   addTest(EJBImportOperationTest.suite());
-        //addTest(EJBProjectCreationOperationTest.suite());
-        //addTest(EJBComponentCreationTest.suite());
-    }
-    
-}
diff --git a/tests/org.eclipse.jst.j2ee.tests/ejbmodule-tests/org/eclipse/wtp/j2ee/headless/tests/ejb/operations/EJBComponentCreationTest.java b/tests/org.eclipse.jst.j2ee.tests/ejbmodule-tests/org/eclipse/wtp/j2ee/headless/tests/ejb/operations/EJBComponentCreationTest.java
deleted file mode 100644
index 0785b03..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/ejbmodule-tests/org/eclipse/wtp/j2ee/headless/tests/ejb/operations/EJBComponentCreationTest.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * 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.internal.J2EEVersionConstants;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.tests.LogUtility;
-import org.eclipse.wst.common.tests.ProjectUtility;
-import org.eclipse.wst.common.tests.SimpleTestSuite;
-import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.AbstractJ2EEComponentCreationTest;
-import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.RandomObjectGenerator;
-
-/**
- * @author blancett
- *
- * To change the template for this generated type comment go to
- * Window - Preferences - Java - Code Generation - Code and Comments
- */
-public class EJBComponentCreationTest extends AbstractJ2EEComponentCreationTest {
-	
-	
-	public void testVaild11EJBProjectNameCreationWithAlphabeticChars() throws Exception {
-		ProjectUtility.deleteAllProjects();
-		for (int i = 0; i < RandomObjectGenerator.createRandomProjectNumber(); i++)
-			createValidComponentNameCreationWithAlphabetChars(EJB_MODULE, J2EEVersionConstants.EJB_1_1_ID, false);
-	}
-	
-	public void testVaildEJB11ProjectNameCreationWithMixedChars() throws Exception {
-		ProjectUtility.deleteAllProjects();
-		for (int i = 0; i < RandomObjectGenerator.createRandomProjectNumber(); i++)
-			createValidComponentNameCreationWithAlphabetChars(EJB_MODULE, J2EEVersionConstants.EJB_1_1_ID, true);
-	}
-	
-	public void testVaild20EJBProjectNameCreationAllChars() throws Exception {
-		ProjectUtility.deleteAllProjects();
-		for (int i = 0; i < RandomObjectGenerator.createRandomProjectNumber(); i++)
-			createValidComponentNameCreationWithAlphabetChars(EJB_MODULE, J2EEVersionConstants.EJB_2_0_ID, true);
-	}
-	
-	public void testVaild20EJBProjectNameCreationWithAlphabetic() throws Exception {
-		ProjectUtility.deleteAllProjects();
-		for (int i = 0; i < RandomObjectGenerator.createRandomProjectNumber(); i++)
-			createValidComponentNameCreationWithAlphabetChars(EJB_MODULE, J2EEVersionConstants.EJB_2_0_ID, false);
-	}
-	
-	public void testVaildRandomVersionsEJBProjectNameCreationAllChars() throws Exception {
-		ProjectUtility.deleteAllProjects();
-		for (int i = 0; i < RandomObjectGenerator.createRandomProjectNumber(); i++) {
-			if (RandomObjectGenerator.createRandomProjectNumber() % 2 == 0)
-				createValidComponentNameCreationWithAlphabetChars(EJB_MODULE, J2EEVersionConstants.EJB_1_1_ID, true);
-			else
-				createValidComponentNameCreationWithAlphabetChars(EJB_MODULE, J2EEVersionConstants.EJB_2_0_ID, true);
-		}
-	}
-	
-	public void testVaildRandomVersionsEJBProjectNameCreationAlphabetChars() throws Exception {
-		ProjectUtility.deleteAllProjects();
-		for (int i = 0; i < RandomObjectGenerator.createRandomProjectNumber(); i++) {
-			if (RandomObjectGenerator.createRandomProjectNumber() % 2 == 0)
-				createValidComponentNameCreationWithAlphabetChars(EJB_MODULE, J2EEVersionConstants.EJB_1_1_ID, false);
-			else
-				createValidComponentNameCreationWithAlphabetChars(EJB_MODULE, J2EEVersionConstants.EJB_2_0_ID, false);
-		}
-	}
-	
-	public void testInvaild11EJBProjectNameCreation() throws Exception {
-		ProjectUtility.deleteAllProjects();
-		LogUtility.getInstance().resetLogging();
-		for (int i = 0; i < RandomObjectGenerator.createRandomProjectNumber(); i++) {
-			try {
-				IDataModel model = setupEJBComponent(RandomObjectGenerator.createInvalidRandomProjectName(), J2EEVersionConstants.EJB_1_1_ID);
-				checkValidDataModel(model);
-			} catch (Exception e) {
-				if (e instanceof IllegalArgumentException) {
-					System.out.println(ILLEGAL_PROJECT_NAME_MESSAGE + projectName);
-				} else
-					new Exception(UNEXPECTED_ERROR_MESSAGE);
-			} finally {
-				new Exception(TEST_FAILED_MESSAGE);
-			}
-		}
-		LogUtility.getInstance().verifyNoWarnings();
-	}
-
-    public static Test suite() {
-        return new SimpleTestSuite(EJBComponentCreationTest.class);
-    }
-
-}
diff --git a/tests/org.eclipse.jst.j2ee.tests/ejbmodule-tests/org/eclipse/wtp/j2ee/headless/tests/ejb/operations/EJBExportOperationTest.java b/tests/org.eclipse.jst.j2ee.tests/ejbmodule-tests/org/eclipse/wtp/j2ee/headless/tests/ejb/operations/EJBExportOperationTest.java
deleted file mode 100644
index dd90934..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/ejbmodule-tests/org/eclipse/wtp/j2ee/headless/tests/ejb/operations/EJBExportOperationTest.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * 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 junit.framework.TestSuite;
-
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleExportOperationTestCase;
-import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleImportOperationTestCase;
-
-/**
- * @author Administrator
- *
- * To change the template for this generated type comment go to
- * Window - Preferences - Java - Code Generation - Code and Comments
- */
-public class EJBExportOperationTest extends ModuleExportOperationTestCase {  
-	
-	public EJBExportOperationTest(String name) {
-		super(name);
-	}
-	 
-	public static Test suite() {
-		return new TestSuite(EJBExportOperationTest.class);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleExportOperationTestCase#getExportModel()
-	 */
-	protected IDataModel getModelInstance() {
-		return null;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleExportOperationTestCase#getImportTestCase()
-	 */
-	protected ModuleImportOperationTestCase getImportTestCase() {
-		return new EJBImportOperationTest("");
-	}
-	
-	
-
-}
diff --git a/tests/org.eclipse.jst.j2ee.tests/ejbmodule-tests/org/eclipse/wtp/j2ee/headless/tests/ejb/operations/EJBImportOperationTest.java b/tests/org.eclipse.jst.j2ee.tests/ejbmodule-tests/org/eclipse/wtp/j2ee/headless/tests/ejb/operations/EJBImportOperationTest.java
deleted file mode 100644
index e926487..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/ejbmodule-tests/org/eclipse/wtp/j2ee/headless/tests/ejb/operations/EJBImportOperationTest.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * 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 junit.framework.TestSuite;
-
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.tests.ProjectUtility;
-import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleImportOperationTestCase;
-import org.eclipse.wtp.j2ee.headless.tests.plugin.HeadlessTestsPlugin;
-
-//TODO DELETE
-/**
- * @deprecated
- */
-public class EJBImportOperationTest extends ModuleImportOperationTestCase { 
-	
-	public static Test suite() {
-		return new TestSuite(EJBImportOperationTest.class);
-	} 
-
-	public EJBImportOperationTest(String name) {
-		super(name);
-	}  	 
-
-	public void testEJB20Import() throws Exception { 
-		testImport("Test13EJB", getFullPathForEJBJar("Test13EJB.jar")); 
-		
-	} 
-	
-	public String getFullPathForEJBJar(String jarName) {
-	try{
-		return ProjectUtility.getFullFileName(HeadlessTestsPlugin.getDefault(),TESTS_PATH + "\\" + jarName);
-	} catch (Exception e) {
-		e.printStackTrace();
-	  }
-	return jarName;
-	}
-	
-	public void testEJB21Import() throws Exception { 
-		testImport("Test14EJB", getFullPathForEJBJar("Test14EJB.jar")); 
-	} 
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleImportOperationTestCase#getDirectory()
-	 */
-	protected String getDirectory() {
-		return "EJBImportTests";
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleImportOperationTestCase#getModelInstance()
-	 */
-	protected IDataModel getModelInstance() {
-		return null;//new EJBModuleImportDataModel();
-	}
-	
- 
-	
-}
diff --git a/tests/org.eclipse.jst.j2ee.tests/ejbmodule-tests/org/eclipse/wtp/j2ee/headless/tests/ejb/operations/EJBProjectCreationOperationTest.java b/tests/org.eclipse.jst.j2ee.tests/ejbmodule-tests/org/eclipse/wtp/j2ee/headless/tests/ejb/operations/EJBProjectCreationOperationTest.java
deleted file mode 100644
index 120b5df..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/ejbmodule-tests/org/eclipse/wtp/j2ee/headless/tests/ejb/operations/EJBProjectCreationOperationTest.java
+++ /dev/null
@@ -1,33 +0,0 @@
-
-package org.eclipse.wtp.j2ee.headless.tests.ejb.operations;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.jst.j2ee.internal.ejb.archiveoperations.EjbComponentCreationDataModelProvider;
-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.ModuleProjectCreationOperationTest;
-
-public class EJBProjectCreationOperationTest extends ModuleProjectCreationOperationTest {
-
-    /**
-	 * @param name
-	 */
-	public EJBProjectCreationOperationTest(String name) {
-		super(name);
-		// TODO Auto-generated constructor stub
-	}
-
-	public static Test suite() {
-        return new TestSuite(EJBProjectCreationOperationTest.class);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleProjectCreationOperationTest#getProjectCreationDataModel()
-     */
-    public IDataModel getComponentCreationDataModel() {
-        return DataModelFactory.createDataModel(new EjbComponentCreationDataModelProvider());
-    }
-  
-}
diff --git a/tests/org.eclipse.jst.j2ee.tests/ejbmodule-tests/org/eclipse/wtp/j2ee/headless/tests/ejb/verifiers/EJBExportDataModelVerifier.java b/tests/org.eclipse.jst.j2ee.tests/ejbmodule-tests/org/eclipse/wtp/j2ee/headless/tests/ejb/verifiers/EJBExportDataModelVerifier.java
deleted file mode 100644
index 0552fba..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/ejbmodule-tests/org/eclipse/wtp/j2ee/headless/tests/ejb/verifiers/EJBExportDataModelVerifier.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * 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.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 {
- 
-}
diff --git a/tests/org.eclipse.jst.j2ee.tests/ejbmodule-tests/org/eclipse/wtp/j2ee/headless/tests/ejb/verifiers/EJBImportDataModelVerifier.java b/tests/org.eclipse.jst.j2ee.tests/ejbmodule-tests/org/eclipse/wtp/j2ee/headless/tests/ejb/verifiers/EJBImportDataModelVerifier.java
deleted file mode 100644
index 6315719..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/ejbmodule-tests/org/eclipse/wtp/j2ee/headless/tests/ejb/verifiers/EJBImportDataModelVerifier.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * 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.wtp.j2ee.headless.tests.j2ee.verifiers.ModuleImportDataModelVerifier;
-
-/**
- * @author Administrator
- *
- * To change the template for this generated type comment go to
- * Window - Preferences - Java - Code Generation - Code and Comments
- */
-public class EJBImportDataModelVerifier extends ModuleImportDataModelVerifier {
-	
-
-}
diff --git a/tests/org.eclipse.jst.j2ee.tests/ejbmodule-tests/org/eclipse/wtp/j2ee/headless/tests/ejb/verifiers/EJBProjectCreationDataModelVerifier.java b/tests/org.eclipse.jst.j2ee.tests/ejbmodule-tests/org/eclipse/wtp/j2ee/headless/tests/ejb/verifiers/EJBProjectCreationDataModelVerifier.java
deleted file mode 100644
index ae8b219..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/ejbmodule-tests/org/eclipse/wtp/j2ee/headless/tests/ejb/verifiers/EJBProjectCreationDataModelVerifier.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * 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.jem.util.emf.workbench.ProjectUtilities;
-import org.eclipse.jst.j2ee.ejb.EJBJar;
-import org.eclipse.jst.j2ee.ejb.componentcore.util.EJBArtifactEdit;
-import org.eclipse.jst.j2ee.ejb.datamodel.properties.IEjbComponentCreationDataModelProperties;
-import org.eclipse.wst.common.componentcore.resources.ComponentHandle;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wtp.j2ee.headless.tests.j2ee.verifiers.ModuleProjectCreationDataModelVerifier;
-
-/**
- * @author Administrator
- * 
- * To change the template for this generated type comment go to Window -
- * Preferences - Java - Code Generation - Code and Comments
- */
-public class EJBProjectCreationDataModelVerifier extends ModuleProjectCreationDataModelVerifier {
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.wtp.j2ee.headless.tests.j2ee.verifiers.ModuleProjectCreationDataModelVerifier#verifyProjectCreationDataModel(com.ibm.etools.application.operations.J2EEProjectCreationDataModel)
-     */
-    public void verifyProjectCreationDataModel(IDataModel model) {
-        Object key = new Object();
-        EJBArtifactEdit ejbEdit = null;
-
-        try {
-            ComponentHandle handle = ComponentHandle.create(ProjectUtilities.getProject(model.getStringProperty(IEjbComponentCreationDataModelProperties.PROJECT_NAME)), model.getStringProperty(IEjbComponentCreationDataModelProperties.COMPONENT_NAME));
-            Object dd = null;
-            ejbEdit = EJBArtifactEdit.getEJBArtifactEditForRead(handle);
-            if (ejbEdit != null)
-                dd = (EJBJar) ejbEdit.getDeploymentDescriptorRoot();
-            Assert.assertNotNull("Deployment Descriptor Null", dd);
-        } finally {
-            if (ejbEdit != null)
-                ejbEdit.dispose();
-        }
-        // if
-        // (dataModel.getBooleanProperty(WebComponentCreationDataModel.ADD_TO_EAR))
-        // {
-        // IProject earProject =
-        // dataModel.getEarComponentCreationDataModel().getTargetProject();
-        // EAREditModel ear = null;
-        // try {
-        // Assert.assertTrue("EAR doesn't exist:", earProject.exists());
-        // EARNatureRuntime runtime = EARNatureRuntime.getRuntime(earProject);
-        // //EMFWorkbenchContext emfWorkbenchContext =
-        // WorkbenchResourceHelper.createEMFContext(earProject, null);
-        // ear = (EAREditModel)
-        // runtime.getEditModelForRead(IEARNatureConstants.EDIT_MODEL_ID, key);
-        // ear.getModuleMapping(dataModel.getTargetProject());
-        // //TODO
-        // } finally {
-        // ear.releaseAccess(key);
-        // }
-        //
-        // }
-    }
-}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/core/tests/bvt/AutomatedBVT.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/core/tests/bvt/AutomatedBVT.java
deleted file mode 100644
index 7430531..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/core/tests/bvt/AutomatedBVT.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * 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.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/core/tests/bvt/AutomatedBVTEclipse.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/core/tests/bvt/AutomatedBVTEclipse.java
deleted file mode 100644
index ca1ca8d..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/core/tests/bvt/AutomatedBVTEclipse.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * 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.tests");
-        URL url = pluginDescriptor.getInstallURL();
-        try {
-        	AutomatedBVT.baseDirectory = Platform.asLocalURL(url).getFile() + "TestData"+ java.io.File.separatorChar;
-		} catch (IOException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		}
-	}
-}
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
deleted file mode 100644
index 5ae6bc3..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/AppClientArtifactEditFVTest.java
+++ /dev/null
@@ -1,114 +0,0 @@
-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.componentcore.resources.ComponentHandle;
-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 {
-			ComponentHandle handle = ComponentHandle.create(appClientProject,appClientModuleName);
-			edit = AppClientArtifactEdit.getAppClientArtifactEditForWrite(handle);
-			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 {
-			ComponentHandle handle = ComponentHandle.create(appClientProject,appClientModuleName);
-			edit = AppClientArtifactEdit.getAppClientArtifactEditForWrite(handle);
-			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 {
-			ComponentHandle handle = ComponentHandle.create(appClientProject,appClientModuleName);
-			edit = AppClientArtifactEdit.getAppClientArtifactEditForWrite(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");
-		}
-		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
deleted file mode 100644
index 293581f..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/AppClientArtifactEditTest.java
+++ /dev/null
@@ -1,622 +0,0 @@
-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.ModuleCoreNature;
-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.ComponentHandle;
-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 {
-			ComponentHandle handle = ComponentHandle.create(appClientProject,appClientModuleName);
-			edit = AppClientArtifactEdit.getAppClientArtifactEditForRead(handle);
-			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 {
-			ComponentHandle handle = ComponentHandle.create(appClientProject,appClientModuleName);
-			edit = AppClientArtifactEdit.getAppClientArtifactEditForRead(handle);
-			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 {
-			ComponentHandle handle = ComponentHandle.create(appClientProject,appClientModuleName);
-			edit = AppClientArtifactEdit.getAppClientArtifactEditForRead(handle);
-			EObject object = edit.getDeploymentDescriptorRoot();
-			assertNotNull(object);
-		} finally {
-			if (edit != null) {
-				edit.dispose();
-			}
-		}
-	}
-
-
-	public void testCreateModelRoot() {
-		AppClientArtifactEdit edit = null;
-		try {
-			ComponentHandle handle = ComponentHandle.create(appClientProject,appClientModuleName);
-			edit = AppClientArtifactEdit.getAppClientArtifactEditForRead(handle);
-			EObject object = edit.createModelRoot();
-			assertNotNull(object);
-		} finally {
-			if (edit != null) {
-				edit.dispose();
-			}
-		}
-	}
-
-	public void testCreateModelRootint() {
-		AppClientArtifactEdit edit = null;
-		try {
-			ComponentHandle handle = ComponentHandle.create(appClientProject,appClientModuleName);
-			edit = AppClientArtifactEdit.getAppClientArtifactEditForRead(handle);
-			EObject object = edit.createModelRoot(14);
-			assertNotNull(object);
-		} finally {
-			if (edit != null) {
-				edit.dispose();
-			}
-		}
-	}
-
-	public void testAppClientArtifactEditComponentHandleboolean() {
-		AppClientArtifactEdit edit = null;
-		try {
-			ComponentHandle handle = ComponentHandle.create(appClientProject,appClientModuleName);
-			edit = new AppClientArtifactEdit(handle, 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();
-	}
-
-	/*
-	 * Class under test for void AppClientArtifactEdit(ModuleCoreNature, WorkbenchComponent,
-	 * boolean)
-	 */
-	public void testAppClientArtifactEditModuleCoreNatureWorkbenchComponentboolean() {
-		AppClientArtifactEdit edit = null;
-		try {
-			ModuleCoreNature nature = null;
-			nature = StructureEdit.getModuleCoreNature(TestWorkspace.APP_CLIENT_MODULE_URI);
-			IVirtualComponent component = ComponentCore.createComponent(appClientProject,appClientModuleName);
-			edit = new AppClientArtifactEdit(nature, component, true);
-			assertNotNull(edit);
-		} catch (UnresolveableURIException e) {
-			fail();
-		} finally {
-			if (edit != null) {
-				edit.dispose();
-			}
-		}
-	}
-
-	// /////////////////BUG//////////////
-
-	public void testGetApplicationClientXmiResource() {
-		AppClientArtifactEdit edit = null;
-		try {
-			ComponentHandle handle = ComponentHandle.create(appClientProject,appClientModuleName);
-			edit = AppClientArtifactEdit.getAppClientArtifactEditForRead(handle);
-			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 {
-			ComponentHandle handle = ComponentHandle.create(appClientProject,appClientModuleName);
-			edit = AppClientArtifactEdit.getAppClientArtifactEditForRead(handle);
-			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 {
-			ComponentHandle handle = ComponentHandle.create(appClientProject,appClientModuleName);
-			edit = AppClientArtifactEdit.getAppClientArtifactEditForRead(handle);
-			Module module = edit.createNewModule();
-			assertNotNull(module);
-
-		} finally {
-			if (edit != null) {
-				edit.dispose();
-			}
-		}
-	}
-
-	public void testGetApplicationClient() {
-		AppClientArtifactEdit edit = null;
-		try {
-			ComponentHandle handle = ComponentHandle.create(appClientProject,appClientModuleName);
-			edit = AppClientArtifactEdit.getAppClientArtifactEditForRead(handle);
-			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.findComponentByName(appClientModuleName);
-			ComponentHandle handle = ComponentHandle.create(appClientProject, wbComponent.getName());
-			edit = AppClientArtifactEdit.getAppClientArtifactEditForRead(handle);
-			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.findComponentByName(appClientModuleName);
-			ComponentHandle handle = ComponentHandle.create(appClientProject, wbComponent.getName());
-			edit = AppClientArtifactEdit.getAppClientArtifactEditForWrite(handle);
-
-		} finally {
-			if (moduleCore != null) {
-				moduleCore.dispose();
-				edit.dispose();
-			}
-			assertTrue(edit != null);
-		}
-	}
-
-
-	public void testGetAppClientArtifactEditForReadWorkbenchComponent() {
-		AppClientArtifactEdit edit = null;
-		try {
-			ComponentHandle handle = ComponentHandle.create(appClientProject,appClientModuleName);
-			edit = AppClientArtifactEdit.getAppClientArtifactEditForRead(handle);
-			assertTrue(edit != null);
-		} finally {
-			if (edit != null) {
-				edit.dispose();
-			}
-		}
-	}
-
-	public void testGetAppClientArtifactEditForWriteWorkbenchComponent() {
-		AppClientArtifactEdit edit = null;
-		try {
-			ComponentHandle handle = ComponentHandle.create(appClientProject,appClientModuleName);
-			edit = AppClientArtifactEdit.getAppClientArtifactEditForWrite(handle);
-			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 {
-			ComponentHandle handle = ComponentHandle.create(appClientProject,appClientModuleName);
-			edit = AppClientArtifactEdit.getAppClientArtifactEditForWrite(handle);
-			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 {
-			ComponentHandle handle = ComponentHandle.create(appClientProject,appClientModuleName);
-			edit = AppClientArtifactEdit.getAppClientArtifactEditForWrite(handle);
-			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 {
-			ComponentHandle handle = ComponentHandle.create(appClientProject,appClientModuleName);
-			edit = AppClientArtifactEdit.getAppClientArtifactEditForWrite(handle);
-			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 {
-			ComponentHandle handle = ComponentHandle.create(appClientProject,appClientModuleName);
-			edit = AppClientArtifactEdit.getAppClientArtifactEditForRead(handle);
-			// 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
deleted file mode 100644
index 2baffbd..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/ConnectorArtifactEditFVTest.java
+++ /dev/null
@@ -1,117 +0,0 @@
-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.componentcore.resources.ComponentHandle;
-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 {
-			ComponentHandle handle = ComponentHandle.create(jcaProject,jcaModuleName);
-			edit = ConnectorArtifactEdit.getConnectorArtifactEditForWrite(handle);
-			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 {
-			ComponentHandle handle = ComponentHandle.create(jcaProject,jcaModuleName);
-			edit = ConnectorArtifactEdit.getConnectorArtifactEditForWrite(handle);
-			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 {
-			ComponentHandle handle = ComponentHandle.create(jcaProject,jcaModuleName);
-			edit = ConnectorArtifactEdit.getConnectorArtifactEditForWrite(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");
-		}
-		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
deleted file mode 100644
index 9847ba4..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/ConnectorArtifactEditTest.java
+++ /dev/null
@@ -1,285 +0,0 @@
-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.jca.modulecore.util.ConnectorArtifactEdit;
-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.StructureEdit;
-import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent;
-import org.eclipse.wst.common.componentcore.resources.ComponentHandle;
-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() {
-		StructureEdit moduleCore = null;
-		try {
-			moduleCore = StructureEdit.getStructureEditForRead(jcaProject);
-			WorkbenchComponent wbComponent = moduleCore.findComponentByName(jcaModuleName);
-			String version = wbComponent.getComponentType().getVersion();
-			assertTrue(version.equals(TestWorkspace.JCA_PROJECT_VERSION));
-		} finally {
-			if (moduleCore != null) {
-				moduleCore.dispose();
-			}
-		}
-	}
-
-	public void testGetDeploymentDescriptorResource() {
-		ConnectorArtifactEdit edit = null;
-		try {
-			ComponentHandle handle = ComponentHandle.create(jcaProject,jcaModuleName);
-			edit = ConnectorArtifactEdit.getConnectorArtifactEditForRead(handle);
-			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 {
-			ComponentHandle handle = ComponentHandle.create(jcaProject,jcaModuleName);
-			edit = ConnectorArtifactEdit.getConnectorArtifactEditForWrite(handle);
-			EObject object = edit.createModelRoot();
-			assertNotNull(object);
-		} finally {
-			if (edit != null) {
-				edit.dispose();
-			}
-		}
-	}
-
-
-	public void testCreateModelRootint() {
-		ConnectorArtifactEdit edit = null;
-		try {
-			ComponentHandle handle = ComponentHandle.create(jcaProject,jcaModuleName);
-			edit = ConnectorArtifactEdit.getConnectorArtifactEditForRead(handle);
-			EObject object = edit.createModelRoot(14);
-			assertNotNull(object);
-		} finally {
-			if (edit != null) {
-				edit.dispose();
-			}
-		}
-	}
-
-
-	public void testConnectorArtifactEditComponentHandleboolean() {
-		StructureEdit moduleCore = null;
-		WorkbenchComponent wbComponent = null;
-		ComponentHandle handle = null;
-		ConnectorArtifactEdit edit = null;
-		try {
-			moduleCore = StructureEdit.getStructureEditForWrite(jcaProject);
-			wbComponent = moduleCore.findComponentByName(jcaModuleName);
-			handle = ComponentHandle.create(jcaProject, wbComponent.getName());
-			edit = new ConnectorArtifactEdit(handle, 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 testConnectorArtifactEditModuleCoreNatureWorkbenchComponentboolean() {
-		ConnectorArtifactEdit edit = null;
-		try {
-			ModuleCoreNature nature = null;
-			nature = StructureEdit.getModuleCoreNature(TestWorkspace.JCA_MODULE_URI);
-			IVirtualComponent component = ComponentCore.createComponent(jcaProject,jcaModuleName);
-			edit = new ConnectorArtifactEdit(nature, component, true);
-			assertNotNull(edit);
-		} catch (UnresolveableURIException e) {
-			fail();
-		} finally {
-			if (edit != null) {
-				edit.dispose();
-			}
-		}
-
-	}
-
-
-	public void testGetConnectorArtifactEditForReadComponentHandle() {
-		StructureEdit moduleCore = null;
-		ConnectorArtifactEdit edit = null;
-		try {
-			moduleCore = StructureEdit.getStructureEditForRead(jcaProject);
-			WorkbenchComponent wbComponent = moduleCore.findComponentByName(jcaModuleName);
-			ComponentHandle handle = ComponentHandle.create(jcaProject, wbComponent.getName());
-			edit = ConnectorArtifactEdit.getConnectorArtifactEditForRead(handle);
-			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.findComponentByName(jcaModuleName);
-			ComponentHandle handle = ComponentHandle.create(jcaProject, wbComponent.getName());
-			edit = ConnectorArtifactEdit.getConnectorArtifactEditForWrite(handle);
-
-		} finally {
-			if (moduleCore != null) {
-				moduleCore.dispose();
-				edit.dispose();
-			}
-			assertTrue(edit != null);
-		}
-	}
-
-
-	public void testGetConnectorArtifactEditForReadWorkbenchComponent() {
-		ConnectorArtifactEdit edit = null;
-		try {
-			ComponentHandle handle = ComponentHandle.create(jcaProject,jcaModuleName);
-			edit = ConnectorArtifactEdit.getConnectorArtifactEditForRead(handle);
-			assertTrue(edit != null);
-		} finally {
-			if (edit != null) {
-				edit.dispose();
-			}
-		}
-	}
-
-	public void testGetConnectorArtifactEditForWriteWorkbenchComponent() {
-		ConnectorArtifactEdit edit = null;
-		try {
-			ComponentHandle handle = ComponentHandle.create(jcaProject,jcaModuleName);
-			edit = ConnectorArtifactEdit.getConnectorArtifactEditForWrite(handle);
-			assertTrue(edit != null);
-		} finally {
-			if (edit != null) {
-				edit.dispose();
-			}
-		}
-	}
-
-	public void testIsValidConnectorModule() {
-		IVirtualComponent component = ComponentCore.createComponent(jcaProject, jcaModuleName);
-		assertTrue(ArtifactEdit.isValidEditableModule(component));
-	}
-
-	public void testGetConnectorXmiResource() {
-		ConnectorArtifactEdit edit = null;
-		try {
-			ComponentHandle handle = ComponentHandle.create(jcaProject,jcaModuleName);
-			edit = ConnectorArtifactEdit.getConnectorArtifactEditForRead(handle);
-			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 {
-			ComponentHandle handle = ComponentHandle.create(jcaProject,jcaModuleName);
-			edit = ConnectorArtifactEdit.getConnectorArtifactEditForRead(handle);
-			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 {
-			ComponentHandle handle = ComponentHandle.create(jcaProject,jcaModuleName);
-			edit = ConnectorArtifactEdit.getConnectorArtifactEditForRead(handle);
-			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
deleted file mode 100644
index a75aba5..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/EARArtifactEditTest.java
+++ /dev/null
@@ -1,360 +0,0 @@
-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.util.EARArtifactEdit;
-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.StructureEdit;
-import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent;
-import org.eclipse.wst.common.componentcore.resources.ComponentHandle;
-import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-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() {
-		EARArtifactEdit edit = null;
-		try {
-			ComponentHandle handle = ComponentHandle.create(earProject,earModuleName);
-			edit = EARArtifactEdit.getEARArtifactEditForRead(handle);
-			int version = edit.getJ2EEVersion();
-			Integer integer = new Integer(version);
-			assertTrue(integer.equals(TestWorkspace.EAR_PROJECT_VERSION));
-		} finally {
-			if (edit != null) {
-				edit.dispose();
-			}
-		}
-	}
-
-	public void testGetDeploymentDescriptorResource() {
-		EARArtifactEdit edit = null;
-		try {
-			ComponentHandle handle = ComponentHandle.create(earProject,earModuleName);
-			edit = EARArtifactEdit.getEARArtifactEditForRead(handle);
-			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() {
-		EARArtifactEdit edit = null;
-		try {
-			ComponentHandle handle = ComponentHandle.create(earProject,earModuleName);
-			edit = EARArtifactEdit.getEARArtifactEditForWrite(handle);
-			EObject object = edit.createModelRoot();
-			assertNotNull(object);
-		} finally {
-			if (edit != null) {
-				edit.dispose();
-			}
-			assertTrue(edit != null);
-		}
-	}
-
-
-	public void testCreateModelRootint() {
-		EARArtifactEdit edit = null;
-		try {
-			ComponentHandle handle = ComponentHandle.create(earProject,earModuleName);
-			edit = EARArtifactEdit.getEARArtifactEditForRead(handle);
-			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;
-		ComponentHandle handle = null;
-		EARArtifactEdit edit = null;
-		try {
-			moduleCore = StructureEdit.getStructureEditForWrite(earProject);
-			wbComponent = moduleCore.findComponentByName(earModuleName);
-			handle = ComponentHandle.create(earProject, wbComponent.getName());
-			edit = new EARArtifactEdit(handle, true);
-			assertNotNull(edit);
-		} finally {
-			if (moduleCore != null) {
-				moduleCore.dispose();
-				edit.dispose();
-			}
-		}
-
-	}
-
-	public void testEARArtifactEditArtifactEditModel() {
-		EARArtifactEdit edit = new EARArtifactEdit(getArtifactEditModelforRead());
-		assertNotNull(edit);
-		edit.dispose();
-	}
-
-
-	public void testEARArtifactEditModuleCoreNatureWorkbenchComponentboolean() {
-		EARArtifactEdit edit = null;
-		try {
-			IVirtualComponent component = ComponentCore.createComponent(earProject,earModuleName);
-			ModuleCoreNature nature = null;
-			nature = StructureEdit.getModuleCoreNature(TestWorkspace.EAR_MODULE_URI);
-			edit = new EARArtifactEdit(nature, component, true);
-			assertNotNull(edit);
-		} catch (UnresolveableURIException e) {
-			fail();
-		} finally {
-			if (edit != null) {
-				edit.dispose();
-			}
-		}
-	}
-
-
-	public void testGetEARArtifactEditForReadComponentHandle() {
-		StructureEdit moduleCore = null;
-		EARArtifactEdit edit = null;
-		try {
-			moduleCore = StructureEdit.getStructureEditForRead(earProject);
-			WorkbenchComponent wbComponent = moduleCore.findComponentByName(earModuleName);
-			ComponentHandle handle = ComponentHandle.create(earProject, wbComponent.getName());
-			edit = EARArtifactEdit.getEARArtifactEditForRead(handle);
-			assertTrue(edit != null);
-
-		} finally {
-			if (moduleCore != null) {
-				moduleCore.dispose();
-				edit.dispose();
-			}
-
-		}
-	}
-
-
-	public void testGetEARArtifactEditForWriteComponentHandle() {
-		EARArtifactEdit edit = null;
-		try {
-			ComponentHandle handle = ComponentHandle.create(earProject, earModuleName);
-			edit = EARArtifactEdit.getEARArtifactEditForWrite(handle);
-		} finally {
-			if (edit != null) {
-				edit.dispose();
-			}
-			assertTrue(edit != null);
-		}
-	}
-
-
-	public void testGetEARArtifactEditForReadWorkbenchComponent() {
-		EARArtifactEdit edit = null;
-		try {
-			ComponentHandle handle = ComponentHandle.create(earProject,earModuleName);
-			edit = EARArtifactEdit.getEARArtifactEditForRead(handle);
-			assertTrue(edit != null);
-		} finally {
-			if (edit != null) {
-				edit.dispose();
-			}
-		}
-	}
-
-
-	public void testGetEARArtifactEditForWriteWorkbenchComponent() {
-		EARArtifactEdit edit = null;
-		try {
-			ComponentHandle handle = ComponentHandle.create(earProject,earModuleName);
-			edit = EARArtifactEdit.getEARArtifactEditForWrite(handle);
-		} 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) {
-			// TODO Auto-generated catch block
-			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) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		}
-		boolean isValid = ArtifactEdit.isValidEditableModule(component);
-		assertTrue(isValid);
-	}
-
-	public void testGetApplicationXmiResource() {
-		EARArtifactEdit edit = null;
-		try {
-			ComponentHandle handle = ComponentHandle.create(earProject, earModuleName);
-			edit = EARArtifactEdit.getEARArtifactEditForRead(handle);
-			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 {
-			ComponentHandle handle = ComponentHandle.create(earProject, earModuleName);
-			edit = EARArtifactEdit.getEARArtifactEditForRead(handle);
-			edit.createModelRoot();
-			EObject obj = edit.getApplication();
-			assertNotNull(obj);
-
-		} finally {
-			if (edit != null) {
-				edit.dispose();
-			}
-			assertTrue(edit != null);
-
-		}
-	}
-
-	public void testAddApplicationIfNecessary() {
-		EARArtifactEdit edit = null;
-		try {
-			ComponentHandle handle = ComponentHandle.create(earProject, earModuleName);
-			edit = EARArtifactEdit.getEARArtifactEditForRead(handle);
-			
-			// /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 {
-			ComponentHandle handle = ComponentHandle.create(earProject, earModuleName);
-			edit = EARArtifactEdit.getEARArtifactEditForRead(handle);
-			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 {
-			ComponentHandle handle = ComponentHandle.create(earProject, earModuleName);
-			edit = EARArtifactEdit.getEARArtifactEditForRead(handle);
-			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 {
-			ComponentHandle handle = ComponentHandle.create(earProject, earModuleName);
-			edit = EARArtifactEdit.getEARArtifactEditForRead(handle);
-			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 EARArtifactEdit 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
deleted file mode 100644
index 650c597..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/EJBArtifactEditFVTest.java
+++ /dev/null
@@ -1,111 +0,0 @@
-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.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.componentcore.resources.ComponentHandle;
-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 {
-			ComponentHandle handle = ComponentHandle.create(ejbProject,ejbModuleName);
-			edit = EJBArtifactEdit.getEJBArtifactEditForWrite(handle);
-			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 {
-			ComponentHandle handle = ComponentHandle.create(ejbProject,ejbModuleName);
-			edit = EJBArtifactEdit.getEJBArtifactEditForWrite(handle);
-			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() {
-		EJBArtifactEdit edit = null;
-		try {
-			ComponentHandle handle = ComponentHandle.create(ejbProject,ejbModuleName);
-			edit = EJBArtifactEdit.getEJBArtifactEditForWrite(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");
-		}
-		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
deleted file mode 100644
index 68b1271..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/EJBArtifactEditTest.java
+++ /dev/null
@@ -1,373 +0,0 @@
-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.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.ModuleCoreNature;
-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.resources.ComponentHandle;
-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() {
-		EJBArtifactEdit edit = null;
-		try {
-			ComponentHandle handle = ComponentHandle.create(ejbProject,ejbModuleName);
-			edit = EJBArtifactEdit.getEJBArtifactEditForRead(handle);
-			String version = new Integer(edit.getJ2EEVersion()).toString();
-			assertTrue(version.equals(TestWorkspace.EJB_PROJECT_VERSION));
-		} finally {
-			if (edit != null) {
-				edit.dispose();
-			}
-		}
-	}
-
-	public void testGetDeploymentDescriptorResource() {
-		EJBArtifactEdit edit = null;
-		try {
-			ComponentHandle handle = ComponentHandle.create(ejbProject,ejbModuleName);
-			edit = EJBArtifactEdit.getEJBArtifactEditForRead(handle);
-			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() {
-		EJBArtifactEdit edit = null;
-		try {
-			ComponentHandle handle = ComponentHandle.create(ejbProject,ejbModuleName);
-			edit = EJBArtifactEdit.getEJBArtifactEditForRead(handle);
-			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() {
-		EJBArtifactEdit edit = null;
-		try {
-			ComponentHandle handle = ComponentHandle.create(ejbProject,ejbModuleName);
-			edit = EJBArtifactEdit.getEJBArtifactEditForWrite(handle);
-			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() {
-		EJBArtifactEdit edit = null;
-		try {
-			ComponentHandle handle = ComponentHandle.create(ejbProject,ejbModuleName);
-			// ///////BUG in PlatformURLModuleConnection
-			edit = EJBArtifactEdit.getEJBArtifactEditForRead(handle);
-			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() {
-		EJBArtifactEdit edit = null;
-		try {
-			ComponentHandle handle = ComponentHandle.create(ejbProject,ejbModuleName);
-			edit = new EJBArtifactEdit(handle, true);
-			assertNotNull(edit);
-		} finally {
-			if (edit != null) {
-				edit.dispose();
-			}
-		}
-	}
-
-	/*
-	 * Class under test for void EJBArtifactEdit(ArtifactEditModel)
-	 */
-	public void testEJBArtifactEditArtifactEditModel() {
-		EJBArtifactEdit edit = new EJBArtifactEdit(getArtifactEditModelforRead());
-		assertNotNull(edit);
-		edit.dispose();
-	}
-
-	/*
-	 * Class under test for void EJBArtifactEdit(ModuleCoreNature, WorkbenchComponent, boolean)
-	 */
-	public void testEJBArtifactEditModuleCoreNatureWorkbenchComponentboolean() {
-		EJBArtifactEdit edit = null;
-		try {
-			ModuleCoreNature nature = StructureEdit.getModuleCoreNature(TestWorkspace.EJB_MODULE_URI);
-			IVirtualComponent component = ComponentCore.createComponent(ejbProject, ejbModuleName);
-			edit = new EJBArtifactEdit(nature, component, true);
-			assertNotNull(edit);
-		} catch (UnresolveableURIException e) {
-			fail();
-		} finally {
-			if (edit != null) {
-				edit.dispose();
-			}
-		}
-	}
-
-	public void testGetEJBJarXmiResource() {
-		EJBArtifactEdit edit = null;
-		try {
-			ComponentHandle handle = ComponentHandle.create(ejbProject,ejbModuleName);
-			edit = EJBArtifactEdit.getEJBArtifactEditForRead(handle);
-			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 {
-			ComponentHandle handle = ComponentHandle.create(ejbProject,ejbModuleName);
-			edit = EJBArtifactEdit.getEJBArtifactEditForRead(handle);
-			edit.hasEJBClientJARProject();
-			// /////BUG\\\\\\\\\\\
-			// boolean bool = edit.hasEJBClientJARProject(ejbProject);
-			// assertEquals(bool, true);
-		} finally {
-			if (edit != null) {
-				edit.dispose();
-			}
-		}
-	}
-
-	public void testCreateNewModule() {
-		EJBArtifactEdit edit = null;
-		try {
-			ComponentHandle handle = ComponentHandle.create(ejbProject,ejbModuleName);
-			edit = EJBArtifactEdit.getEJBArtifactEditForRead(handle);
-			Module module = edit.createNewModule();
-			assertNotNull(module);
-		} finally {
-			if (edit != null) {
-				edit.dispose();
-			}
-		}
-	}
-
-	// /////////////////bug\\\\\\\\\\\\\
-
-	public void testGetEJBClientJarModule() {
-		EJBArtifactEdit edit = null;
-		try {
-			ComponentHandle handle = ComponentHandle.create(ejbProject,ejbModuleName);
-			edit = EJBArtifactEdit.getEJBArtifactEditForRead(handle);
-			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 {
-			ComponentHandle handle = ComponentHandle.create(ejbProject,ejbModuleName);
-			edit = EJBArtifactEdit.getEJBArtifactEditForRead(handle);
-			EJBJar jar = edit.getEJBJar();
-			assertNotNull(jar);
-		} finally {
-			if (edit != null) {
-				edit.dispose();
-			}
-		}
-	}
-
-	public void testGetDeploymenyDescriptorType() {
-		EJBArtifactEdit edit = null;
-		try {
-			ComponentHandle handle = ComponentHandle.create(ejbProject,ejbModuleName);
-			edit = EJBArtifactEdit.getEJBArtifactEditForRead(handle);
-			int type = edit.getDeploymentDescriptorType();
-			assertTrue(type >= 0);
-		} finally {
-			if (edit != null) {
-				edit.dispose();
-			}
-		}
-	}
-
-	public void testAddEJBJarIfNecessary() {
-		EJBArtifactEdit 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() {
-		EJBArtifactEdit edit = null;
-		try {
-			ComponentHandle handle = ComponentHandle.create(ejbProject, ejbModuleName);
-			edit = EJBArtifactEdit.getEJBArtifactEditForRead(handle);
-			assertTrue(edit != null);
-		} finally {
-			if (edit != null) {
-				edit.dispose();
-			}
-		}
-	}
-
-	/*
-	 * Class under test for EJBArtifactEdit getEJBArtifactEditForWrite(ComponentHandle)
-	 */
-	public void testGetEJBArtifactEditForWriteComponentHandle() {
-		EJBArtifactEdit edit = null;
-		try {
-			ComponentHandle handle = ComponentHandle.create(ejbProject,ejbModuleName);
-			edit = EJBArtifactEdit.getEJBArtifactEditForWrite(handle);
-		} finally {
-			if (edit != null) {
-				edit.dispose();
-			}
-			assertTrue(edit != null);
-		}
-	}
-
-	/*
-	 * Class under test for EJBArtifactEdit getEJBArtifactEditForRead(WorkbenchComponent)
-	 */
-	public void testGetEJBArtifactEditForReadWorkbenchComponent() {
-		EJBArtifactEdit edit = null;
-		try {
-			ComponentHandle handle = ComponentHandle.create(ejbProject,ejbModuleName);
-			edit = EJBArtifactEdit.getEJBArtifactEditForRead(handle);
-			assertTrue(edit != null);
-		} finally {
-			if (edit != null) {
-				edit.dispose();
-			}
-		}
-	}
-
-	/*
-	 * Class under test for EJBArtifactEdit getEJBArtifactEditForWrite(WorkbenchComponent)
-	 */
-	public void testGetEJBArtifactEditForWriteWorkbenchComponent() {
-		EJBArtifactEdit edit = null;
-		try {
-			ComponentHandle handle = ComponentHandle.create(ejbProject,ejbModuleName);
-			edit = EJBArtifactEdit.getEJBArtifactEditForWrite(handle);
-		} 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 EJBArtifactEdit 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
deleted file mode 100644
index ddf9559..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/EarArtiFactEditFVTest.java
+++ /dev/null
@@ -1,119 +0,0 @@
-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.util.EARArtifactEdit;
-import org.eclipse.wst.common.componentcore.internal.ComponentResource;
-import org.eclipse.wst.common.componentcore.internal.ComponentcoreFactory;
-import org.eclipse.wst.common.componentcore.resources.ComponentHandle;
-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 {
-			ComponentHandle handle = ComponentHandle.create(earProject,earModuleName);
-			edit = EARArtifactEdit.getEARArtifactEditForWrite(handle);
-			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 {
-			ComponentHandle handle = ComponentHandle.create(earProject,earModuleName);
-			edit = EARArtifactEdit.getEARArtifactEditForWrite(handle);
-			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() {
-		EARArtifactEdit edit = null;
-		try {
-			ComponentHandle handle = ComponentHandle.create(earProject,earModuleName);
-			edit = EARArtifactEdit.getEARArtifactEditForWrite(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");
-		}
-		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
deleted file mode 100644
index 95af83e..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/EnterpriseArtifactEditTest.java
+++ /dev/null
@@ -1,105 +0,0 @@
-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.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.StructureEdit;
-import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent;
-import org.eclipse.wst.common.componentcore.resources.ComponentHandle;
-import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-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;
-		ComponentHandle handle = null;
-		EnterpriseArtifactEdit edit = null;
-		try {
-			moduleCore = StructureEdit.getStructureEditForWrite(earProject);
-			wbComponent = moduleCore.findComponentByName(earModuleName);
-			handle = ComponentHandle.create(earProject, wbComponent.getName());
-			edit = new EARArtifactEdit(handle, true);
-			assertNotNull(edit);
-		} finally {
-			if (moduleCore != null) {
-				moduleCore.dispose();
-				edit.dispose();
-			}
-		}
-	}
-
-	public void testEnterpriseArtifactEditArtifactEditModel() {
-		EnterpriseArtifactEdit edit = new EARArtifactEdit(getArtifactEditModelforRead());
-		assertNotNull(edit);
-		edit.dispose();
-	}
-
-	public void testEnterpriseArtifactEditModuleCoreNatureWorkbenchComponentboolean() {
-		EnterpriseArtifactEdit edit = null;
-		try {
-			IVirtualComponent component = ComponentCore.createComponent(earProject,earModuleName);
-			ModuleCoreNature nature = StructureEdit.getModuleCoreNature(TestWorkspace.EAR_MODULE_URI);
-			edit = new EARArtifactEdit(nature, component, true);
-			assertNotNull(edit);
-		} catch (UnresolveableURIException e) {
-			fail();
-		} finally {
-			if (edit != null) {
-				edit.dispose();
-			}
-		}
-	}
-	
-	//////////BUG
-
-	public void testGetDeploymentDescriptorRoot() {
-		EnterpriseArtifactEdit edit = null;
-		try {
-			ComponentHandle handle = ComponentHandle.create(earProject,earModuleName);
-			edit = new EARArtifactEdit(handle,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 EARArtifactEdit 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
deleted file mode 100644
index 588c614..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/J2EEArtifactEditAPIAllTest.java
+++ /dev/null
@@ -1,34 +0,0 @@
-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
deleted file mode 100644
index ac789fc..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/JaxRPCMapArtifactEditFVTest.java
+++ /dev/null
@@ -1,80 +0,0 @@
-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.ComponentHandle;
-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 {
-			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();
-			}
-
-		}
-	}
-
-}
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
deleted file mode 100644
index f90520b..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/TestWorkspace.java
+++ /dev/null
@@ -1,115 +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.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
deleted file mode 100644
index 7893371..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/WSDDArtifactEditFVTest.java
+++ /dev/null
@@ -1,99 +0,0 @@
-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.componentcore.resources.ComponentHandle;
-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 {
-			ComponentHandle handle = ComponentHandle.create(webProject,webModuleName);
-			edit = WSDDArtifactEdit.getWSDDArtifactEditForWrite(handle);
-			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 {
-			ComponentHandle handle = ComponentHandle.create(webProject,webModuleName);
-			edit = WSDDArtifactEdit.getWSDDArtifactEditForWrite(handle);
-			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 {
-			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();
-			}
-
-		}
-	}
-
-}
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
deleted file mode 100644
index 5602a6f..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/WebArtifactEditFVTest.java
+++ /dev/null
@@ -1,110 +0,0 @@
-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.web.componentcore.util.WebArtifactEdit;
-import org.eclipse.jst.j2ee.webapplication.WebApp;
-import org.eclipse.wst.common.componentcore.internal.ComponentResource;
-import org.eclipse.wst.common.componentcore.internal.ComponentcoreFactory;
-import org.eclipse.wst.common.componentcore.resources.ComponentHandle;
-import org.eclipse.wst.common.internal.emfworkbench.integration.EditModelEvent;
-import org.eclipse.wst.common.internal.emfworkbench.integration.EditModelListener;
-
-public class WebArtifactEditFVTest extends TestCase {
-
-	private IProject webProject;
-	private String webModuleName;
-	private String serverContextData = TestWorkspace.WEB_SERVER_CONTEXT_ROOT + "Test";
-
-	public WebArtifactEditFVTest() {
-		super();
-		if (TestWorkspace.init()) {
-			webProject = TestWorkspace.getTargetProject(TestWorkspace.WEB_PROJECT_NAME);
-			webModuleName = TestWorkspace.WEB_MODULE_NAME;
-		} else {
-			fail();
-
-		}
-	}
-	
-	public void testCreationDisposeFunction() {
-		WebArtifactEdit edit = null;
-		try {
-			ComponentHandle handle = ComponentHandle.create(webProject,webModuleName);
-			edit = WebArtifactEdit.getWebArtifactEditForWrite(handle);
-			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();
-			}
-		}
-	}
-
-	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 {
-			ComponentHandle handle = ComponentHandle.create(webProject,webModuleName);
-			edit = WebArtifactEdit.getWebArtifactEditForWrite(handle);
-			WebApp web = edit.getWebApp();
-			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");
-		}
-		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
deleted file mode 100644
index be53f94..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/apitests/artifactedit/WebArtifactEditTest.java
+++ /dev/null
@@ -1,433 +0,0 @@
-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.internal.webapplication.impl.WebapplicationFactoryImpl;
-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.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.ComponentHandle;
-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 {
-			ComponentHandle handle = ComponentHandle.create(webProject,webModuleName);
-			edit = WebArtifactEdit.getWebArtifactEditForRead(handle);
-			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 {
-			ComponentHandle handle = ComponentHandle.create(webProject,webModuleName);
-			edit = WebArtifactEdit.getWebArtifactEditForRead(handle);
-			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 {
-			ComponentHandle handle = ComponentHandle.create(webProject,webModuleName);
-			edit = WebArtifactEdit.getWebArtifactEditForRead(handle);
-			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 {
-			ComponentHandle handle = ComponentHandle.create(webProject,webModuleName);
-			edit = WebArtifactEdit.getWebArtifactEditForWrite(handle);
-			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 {
-			ComponentHandle handle = ComponentHandle.create(webProject,webModuleName);
-			// ///////BUG in PlatformURLModuleConnection
-			edit = WebArtifactEdit.getWebArtifactEditForRead(handle);
-			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 {
-			ComponentHandle handle = ComponentHandle.create(webProject,webModuleName);
-			edit = new WebArtifactEdit(handle, true);
-			assertNotNull(edit);
-		} finally {
-			if (edit != null) {
-				edit.dispose();
-			}
-		}
-
-	}
-
-	/*
-	 * Class under test for WebArtifactEdit getWebArtifactEditForRead(ComponentHandle)
-	 */
-	public void testGetWebArtifactEditForReadComponentHandle() {
-		WebArtifactEdit edit = null;
-		try {
-			ComponentHandle handle = ComponentHandle.create(webProject,webModuleName);
-			edit = WebArtifactEdit.getWebArtifactEditForRead(handle);
-			assertTrue(edit != null);
-		} finally {
-			if (edit != null) {
-				edit.dispose();
-			}
-		}
-	}
-
-	/*
-	 * Class under test for ArtifactEdit getWebArtifactEditForWrite(ComponentHandle)
-	 */
-	public void testGetWebArtifactEditForWriteComponentHandle() {
-		WebArtifactEdit edit = null;
-		try {
-			ComponentHandle handle = ComponentHandle.create(webProject,webModuleName);
-			edit = WebArtifactEdit.getWebArtifactEditForWrite(handle);
-		} 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 {
-			ComponentHandle handle = ComponentHandle.create(webProject,webModuleName);
-			edit = WebArtifactEdit.getWebArtifactEditForRead(handle);
-			assertTrue(edit != null);
-		} finally {
-			if (edit != null) {
-				edit.dispose();
-			}
-		}
-	}
-
-	public void testIsValidWebModule() {
-		IVirtualComponent component = null;
-		try {
-			component = ComponentCore.createComponent(webProject, webModuleName);
-			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, webModuleName);
-			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 {
-			ComponentHandle handle = ComponentHandle.create(webProject,webModuleName);
-			edit = new WebArtifactEdit(handle, true);
-			assertNotNull(edit);
-		} catch (Exception e) {
-			fail();
-		} finally {
-			if (edit != null) {
-				edit.dispose();
-			}
-		}
-	}
-
-	public void testGetServletVersion() {
-		WebArtifactEdit edit = null;
-		try {
-			ComponentHandle handle = ComponentHandle.create(webProject,webModuleName);
-			edit = WebArtifactEdit.getWebArtifactEditForRead(handle);
-			assertTrue(edit.getServletVersion() == 24);
-		} finally {
-			if (edit != null) {
-				edit.dispose();
-			}
-		}
-	}
-
-	public void testAddWebAppIfNecessary() {
-	}
-
-	public void testGetJSPVersion() {
-		WebArtifactEdit edit = null;
-		try {
-			ComponentHandle handle = ComponentHandle.create(webProject,webModuleName);
-			edit = WebArtifactEdit.getWebArtifactEditForRead(handle);
-			assertTrue(edit.getJSPVersion() == 20);
-		} finally {
-			if (edit != null) {
-				edit.dispose();
-			}
-		}
-	}
-
-	public void testGetDeploymentDescriptorPath() {
-		WebArtifactEdit edit = null;
-		try {
-			ComponentHandle handle = ComponentHandle.create(webProject,webModuleName);
-			edit = WebArtifactEdit.getWebArtifactEditForRead(handle);
-			edit.getDeploymentDescriptorPath();
-			assertNotNull(edit.getDeploymentDescriptorPath());
-		} finally {
-			if (edit != null) {
-				edit.dispose();
-			}
-		}
-	}
-
-	public void testGetLibModules() {
-		WebArtifactEdit edit = null;
-		try {
-			ComponentHandle handle = ComponentHandle.create(webProject,webModuleName);
-			edit = WebArtifactEdit.getWebArtifactEditForRead(handle);
-			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 {
-			ComponentHandle handle = ComponentHandle.create(webProject,webModuleName);
-			edit = WebArtifactEdit.getWebArtifactEditForRead(handle);
-			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 {
-			ComponentHandle handle = ComponentHandle.create(webProject,webModuleName);
-			edit = WebArtifactEdit.getWebArtifactEditForRead(handle);
-			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 {
-			ComponentHandle handle = ComponentHandle.create(webProject,webModuleName);
-			edit = WebArtifactEdit.getWebArtifactEditForRead(handle);
-			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();
-			ComponentHandle handle = ComponentHandle.create(webProject,webModuleName);
-			edit = WebArtifactEdit.getWebArtifactEditForWrite(handle);
-			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/AbstractModuleCreationTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/fvtests/AbstractModuleCreationTest.java
deleted file mode 100644
index 352fd6c..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/fvtests/AbstractModuleCreationTest.java
+++ /dev/null
@@ -1,215 +0,0 @@
-package org.eclipse.jst.j2ee.flexible.project.fvtests;
-import junit.framework.TestCase;
-
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jst.j2ee.application.internal.operations.EARComponentCreationOperation;
-import org.eclipse.jst.j2ee.application.internal.operations.FlexibleJavaProjectCreationDataModelProvider;
-import org.eclipse.jst.j2ee.application.internal.operations.JavaUtilityComponentCreationOperation;
-import org.eclipse.jst.j2ee.applicationclient.internal.creation.AppClientComponentCreationDataModelProvider;
-import org.eclipse.jst.j2ee.applicationclient.internal.creation.AppClientComponentCreationOperation;
-import org.eclipse.jst.j2ee.datamodel.properties.IAppClientComponentCreationDataModelProperties;
-import org.eclipse.jst.j2ee.datamodel.properties.IEarComponentCreationDataModelProperties;
-import org.eclipse.jst.j2ee.datamodel.properties.IJavaComponentCreationDataModelProperties;
-import org.eclipse.jst.j2ee.ejb.datamodel.properties.IEjbComponentCreationDataModelProperties;
-import org.eclipse.jst.j2ee.internal.archive.operations.JavaComponentCreationDataModelProvider;
-import org.eclipse.jst.j2ee.internal.earcreation.EarComponentCreationDataModelProvider;
-import org.eclipse.jst.j2ee.internal.ejb.archiveoperations.EjbComponentCreationDataModelProvider;
-import org.eclipse.jst.j2ee.internal.ejb.archiveoperations.EjbComponentCreationOperation;
-import org.eclipse.jst.j2ee.internal.jca.operations.ConnectorComponentCreationDataModelProvider;
-import org.eclipse.jst.j2ee.internal.jca.operations.ConnectorComponentCreationOperation;
-import org.eclipse.jst.j2ee.internal.jca.operations.IConnectorComponentCreationDataModelProperties;
-import org.eclipse.jst.j2ee.internal.web.archive.operations.WebComponentCreationDataModelProvider;
-import org.eclipse.jst.j2ee.internal.web.archive.operations.WebComponentCreationOperation;
-import org.eclipse.jst.j2ee.project.datamodel.properties.IFlexibleJavaProjectCreationDataModelProperties;
-import org.eclipse.jst.j2ee.tests.modulecore.AllTests;
-import org.eclipse.jst.j2ee.web.datamodel.properties.IWebComponentCreationDataModelProperties;
-import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-
-public abstract class AbstractModuleCreationTest extends TestCase {
-	
-	public static String DEFAULT_PROJECT_NAME = "Flexible";	
-	
-	public AbstractModuleCreationTest(String name) {
-		super(name);
-	}
-	
-	public AbstractModuleCreationTest() {
-		super();
-	}	
-
-   public void createSimpleProject(String projectName) throws Exception {
-		IDataModel dataModel = DataModelFactory.createDataModel(new FlexibleJavaProjectCreationDataModelProvider());
-	    dataModel.setProperty(IFlexibleJavaProjectCreationDataModelProperties.PROJECT_NAME, projectName);
-		setServerTargetProperty(dataModel);
-		dataModel.getDefaultOperation().execute(new NullProgressMonitor(), null);
-   }
-	/**
-	 * @param dataModel
-	 */
-	public void setServerTargetProperty(IDataModel dataModel) {
-		dataModel.setProperty(IFlexibleJavaProjectCreationDataModelProperties.SERVER_TARGET_ID, AllTests.JONAS_TOMCAT_RUNTIME.getId());
-	}
-    
-	public void runAll(){
-		try {
-			createSimpleProject(DEFAULT_PROJECT_NAME);
-			setupEARModule();
-			setupjavaUtilComponent();
-			setupWebModule();
-			setupEJBModule();
-			setupAppClientModule();
-			setupConnectorModule();
-		}
-		catch (Exception e) {
-			e.printStackTrace();
-		}
-
-	}
-	
-
-	
-	public void setupjavaUtilComponent() throws Exception {
-		createjavautilComponent("javaUtil", DEFAULT_PROJECT_NAME);
-	}
-
-	private void createjavautilComponent(String aModuleName, String projectName){	
-		IDataModel model = DataModelFactory.createDataModel(new JavaComponentCreationDataModelProvider());
-		model.setProperty( IJavaComponentCreationDataModelProperties.PROJECT_NAME, projectName);
-		model.setProperty(IJavaComponentCreationDataModelProperties.COMPONENT_NAME, aModuleName);
-		try {
-			runJavaUtilComponentCreationOperation(model);
-		}
-		catch (Exception e) {
-			e.printStackTrace();
-		}		
-	}
-	
-	private  void runJavaUtilComponentCreationOperation(IDataModel model) throws Exception {	
-        JavaUtilityComponentCreationOperation webOp = new JavaUtilityComponentCreationOperation(model);
-		webOp.execute(new NullProgressMonitor(), null);
-	}		
-	
-	
-	
-	public void setupEARModule() throws Exception {
-		createEARModule(12, "FirstEARModule", DEFAULT_PROJECT_NAME);
-	}
-	
-	private void createEARModule(int j2eeVersion, String aModuleName, String projectName){	
-		IDataModel model = DataModelFactory.createDataModel(new EarComponentCreationDataModelProvider());
-		model.setProperty( IEarComponentCreationDataModelProperties.PROJECT_NAME, projectName);
-		model.setIntProperty(IEarComponentCreationDataModelProperties.COMPONENT_VERSION, j2eeVersion);
-		model.setProperty(IEarComponentCreationDataModelProperties.COMPONENT_NAME, aModuleName);
-		try {
-			runEARComponenteCreationOperation(model);
-		}
-		catch (Exception e) {
-			e.printStackTrace();
-		}		
-	}
-	
-	private  void runEARComponenteCreationOperation(IDataModel model) throws Exception {		
-        EARComponentCreationOperation webOp = new EARComponentCreationOperation(model);
-		webOp.execute(new NullProgressMonitor(), null);
-	}
-	
-	
-	public void setupEJBModule() throws Exception {
-		createEJBModule(11, "FirstEJBModule", DEFAULT_PROJECT_NAME);
-		createEJBModule(20, "SecondEJBModule", DEFAULT_PROJECT_NAME);
-		createEJBModule(21, "ThirdEJBModule", DEFAULT_PROJECT_NAME);
-	}
-	
-	private void createEJBModule(int j2eeVersion, String aModuleName, String projectName){	
-		IDataModel model = DataModelFactory.createDataModel(new EjbComponentCreationDataModelProvider());
-		model.setProperty( IEjbComponentCreationDataModelProperties.PROJECT_NAME, projectName);
-		model.setIntProperty(IEjbComponentCreationDataModelProperties.COMPONENT_VERSION, j2eeVersion);
-		model.setProperty(IEjbComponentCreationDataModelProperties.COMPONENT_NAME, aModuleName);
-		
-		model.setBooleanProperty(IEjbComponentCreationDataModelProperties.ADD_TO_EAR, false);
-		
-		try {
-			runEJBComponenteCreationOperation(model);
-		}
-		catch (Exception e) {
-			e.printStackTrace();
-		}		
-	}
-	
-	private  void runEJBComponenteCreationOperation(IDataModel model) throws Exception {	
-		EjbComponentCreationOperation ejbOp = new EjbComponentCreationOperation(model);
-        ejbOp.execute(new NullProgressMonitor(), null);
-	}
-	
-	
-	public void setupWebModule() throws Exception {
-		createWebModule(22, "FirstWebModule", DEFAULT_PROJECT_NAME);
-		createWebModule(23, "SecondWebModule", DEFAULT_PROJECT_NAME);
-		createWebModule(24, "ThirdWebModule", DEFAULT_PROJECT_NAME);
-	}
-
-	private void createWebModule(int j2eeVersion, String aModuleName, String projectName){		
-		IDataModel model = DataModelFactory.createDataModel(new WebComponentCreationDataModelProvider());
-		model.setProperty( IWebComponentCreationDataModelProperties.PROJECT_NAME, projectName);
-		model.setIntProperty(IWebComponentCreationDataModelProperties.COMPONENT_VERSION, j2eeVersion);
-		model.setProperty(IWebComponentCreationDataModelProperties.COMPONENT_NAME, aModuleName);
-		try {
-			runWebModuleCreationOperation(model);
-		}
-		catch (Exception e) {
-			e.printStackTrace();
-		}		
-	}
-	
-	private  void runWebModuleCreationOperation(IDataModel model) throws Exception {		
-		WebComponentCreationOperation webOp = new WebComponentCreationOperation(model);
-		webOp.execute(new NullProgressMonitor(), null);
-	}
-	
-	
-	public void setupAppClientModule() throws Exception {
-		createAppClientModule(12, "FirstAppClient", DEFAULT_PROJECT_NAME);
-	}
-
-	private void createAppClientModule(int j2eeVersion, String aModuleName, String projectName){	
-		IDataModel model = DataModelFactory.createDataModel(new AppClientComponentCreationDataModelProvider());
-		model.setProperty(IAppClientComponentCreationDataModelProperties.PROJECT_NAME, projectName);
-		model.setIntProperty(IAppClientComponentCreationDataModelProperties.COMPONENT_VERSION, j2eeVersion);
-		model.setProperty(IAppClientComponentCreationDataModelProperties.COMPONENT_NAME, aModuleName);
-		try {
-			runAppClientModuleCreationOperation(model);
-		}
-		catch (Exception e) {
-			e.printStackTrace();
-		}		
-	}
-	
-	private  void runAppClientModuleCreationOperation(IDataModel model) throws Exception {	
-		AppClientComponentCreationOperation appOp = new AppClientComponentCreationOperation(model);
-        appOp.execute(new NullProgressMonitor(),null);
-	}	
-	
-	public void setupConnectorModule() throws Exception {
-		createConnectorModule(15, "FirstConnector", DEFAULT_PROJECT_NAME);
-	}
-
-	private void createConnectorModule(int j2eeVersion, String aModuleName, String projectName){		
-		IDataModel model = DataModelFactory.createDataModel(new ConnectorComponentCreationDataModelProvider());
-		model.setProperty(IConnectorComponentCreationDataModelProperties.PROJECT_NAME, projectName);
-		model.setIntProperty(IConnectorComponentCreationDataModelProperties.COMPONENT_VERSION, j2eeVersion);
-		model.setProperty(IConnectorComponentCreationDataModelProperties.COMPONENT_NAME, aModuleName);
-		try {
-			runConnectorModuleCreationOperation(model);
-		}
-		catch (Exception e) {
-			e.printStackTrace();
-		}		
-	}
-	
-	private  void runConnectorModuleCreationOperation(IDataModel model) throws Exception {
-		ConnectorComponentCreationOperation webOp = new ConnectorComponentCreationOperation(model);
-		webOp.execute(new NullProgressMonitor(),null);
-	}		
-
-}
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
deleted file mode 100644
index 5c54d2d..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/fvtests/EJBArtifactEditFvTest.java
+++ /dev/null
@@ -1,6 +0,0 @@
-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/PortedComponentCreationTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/fvtests/PortedComponentCreationTest.java
deleted file mode 100644
index 50362b9..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/fvtests/PortedComponentCreationTest.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*******************************************************************************
- * 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
- *******************************************************************************/
-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.AppClientComponentCreationDataModelProvider;
-import org.eclipse.jst.j2ee.datamodel.properties.IAppClientComponentCreationDataModelProperties;
-import org.eclipse.jst.j2ee.datamodel.properties.IEarComponentCreationDataModelProperties;
-import org.eclipse.jst.j2ee.datamodel.properties.IJavaComponentCreationDataModelProperties;
-import org.eclipse.jst.j2ee.ejb.datamodel.properties.IEjbComponentCreationDataModelProperties;
-import org.eclipse.jst.j2ee.internal.archive.operations.JavaComponentCreationDataModelProvider;
-import org.eclipse.jst.j2ee.internal.earcreation.EarComponentCreationDataModelProvider;
-import org.eclipse.jst.j2ee.internal.ejb.archiveoperations.EjbComponentCreationDataModelProvider;
-import org.eclipse.jst.j2ee.internal.jca.operations.ConnectorComponentCreationDataModelProvider;
-import org.eclipse.jst.j2ee.internal.jca.operations.IConnectorComponentCreationDataModelProperties;
-import org.eclipse.jst.j2ee.internal.web.archive.operations.WebComponentCreationDataModelProvider;
-import org.eclipse.jst.j2ee.web.datamodel.properties.IWebComponentCreationDataModelProperties;
-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 testCreateFlexibleJavaProject() throws Exception {
-        createFlexibleJavaProject(DEFAULT_PROJECT_NAME + "_Java");
-    }
-*/
-    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 createFlexibleJavaProject(String projectName) throws Exception {
-//        IDataModel dataModel = DataModelFactory.createDataModel(new FlexibleJavaProjectCreationDataModelProvider());
-//        dataModel.setProperty(IFlexibleJavaProjectCreationDataModelProperties.PROJECT_NAME, projectName);
-//        dataModel.setProperty(IFlexibleJavaProjectCreationDataModelProperties.SERVER_TARGET_ID, AllTests.JONAS_TOMCAT_RUNTIME.getId());
-//        dataModel.getDefaultOperation().execute(new NullProgressMonitor(), null);
-//    }
-
-    private void createJavaUtilComponent(String aModuleName, String projectName) throws Exception {
-        IDataModel model = DataModelFactory.createDataModel(new JavaComponentCreationDataModelProvider());
-        model.setProperty(IJavaComponentCreationDataModelProperties.PROJECT_NAME, projectName);
-        model.setProperty(IJavaComponentCreationDataModelProperties.COMPONENT_NAME, aModuleName);
-        model.getDefaultOperation().execute(new NullProgressMonitor(), null);
-    }
-    
-    private void createConnectorComponent(int j2eeVersion, String aModuleName, String projectName) throws Exception{
-        IDataModel model = DataModelFactory.createDataModel(new ConnectorComponentCreationDataModelProvider());
-        model.setProperty(IConnectorComponentCreationDataModelProperties.PROJECT_NAME, projectName);
-        model.setIntProperty(IConnectorComponentCreationDataModelProperties.COMPONENT_VERSION, j2eeVersion);
-        model.setProperty(IConnectorComponentCreationDataModelProperties.COMPONENT_NAME, aModuleName);
-        model.setBooleanProperty(IConnectorComponentCreationDataModelProperties.ADD_TO_EAR, true);
-        model.getDefaultOperation().execute(new NullProgressMonitor(), null);
-    }
-    
-    private void createWebComponent(int j2eeVersion, String aModuleName, String projectName) throws Exception{
-        IDataModel model = DataModelFactory.createDataModel(new WebComponentCreationDataModelProvider());
-        model.setProperty(IWebComponentCreationDataModelProperties.PROJECT_NAME, projectName);
-        model.setIntProperty(IWebComponentCreationDataModelProperties.COMPONENT_VERSION, j2eeVersion);
-        model.setProperty(IWebComponentCreationDataModelProperties.COMPONENT_NAME, aModuleName);
-        model.setBooleanProperty(IWebComponentCreationDataModelProperties.ADD_TO_EAR, true);
-        model.getDefaultOperation().execute(new NullProgressMonitor(), null);
-    }
-
-    private void createAppClientComponent(int j2eeVersion, String aModuleName, String projectName) throws Exception{
-        IDataModel model = DataModelFactory.createDataModel(new AppClientComponentCreationDataModelProvider());
-        model.setProperty(IAppClientComponentCreationDataModelProperties.PROJECT_NAME, projectName);
-        model.setIntProperty(IAppClientComponentCreationDataModelProperties.COMPONENT_VERSION, j2eeVersion);
-        model.setProperty(IAppClientComponentCreationDataModelProperties.COMPONENT_NAME, aModuleName);
-        model.setBooleanProperty(IAppClientComponentCreationDataModelProperties.ADD_TO_EAR, true);
-        model.getDefaultOperation().execute(new NullProgressMonitor(), null);
-    }
-    
-    private void createEjbComponent(int j2eeVersion, String aModuleName, String projectName) throws Exception{
-        IDataModel model = DataModelFactory.createDataModel(new EjbComponentCreationDataModelProvider());
-        model.setProperty(IEjbComponentCreationDataModelProperties.PROJECT_NAME, projectName);
-        model.setIntProperty(IEjbComponentCreationDataModelProperties.COMPONENT_VERSION, j2eeVersion);
-        model.setProperty(IEjbComponentCreationDataModelProperties.COMPONENT_NAME, aModuleName);
-        model.setBooleanProperty(IEjbComponentCreationDataModelProperties.ADD_TO_EAR, true);
-        model.getDefaultOperation().execute(new NullProgressMonitor(), null);
-    }
-    
-    private void createEARComponent(int j2eeVersion, String aModuleName, String projectName) throws Exception{
-        IDataModel model = DataModelFactory.createDataModel(new EarComponentCreationDataModelProvider());
-        model.setProperty(IEarComponentCreationDataModelProperties.PROJECT_NAME, projectName);
-        model.setIntProperty(IEarComponentCreationDataModelProperties.COMPONENT_VERSION, j2eeVersion);
-        model.setProperty(IEarComponentCreationDataModelProperties.COMPONENT_NAME, aModuleName);
-        model.getDefaultOperation().execute(new NullProgressMonitor(), null);
-    }
-}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/fvtests/ProjectMigrationTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/fvtests/ProjectMigrationTest.java
deleted file mode 100644
index 6823e42..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/fvtests/ProjectMigrationTest.java
+++ /dev/null
@@ -1,95 +0,0 @@
-package org.eclipse.jst.j2ee.flexible.project.fvtests;
-import junit.framework.Test;
-import junit.framework.TestCase;
-
-import org.eclipse.core.commands.ExecutionException;
-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.NullProgressMonitor;
-import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
-import org.eclipse.jst.common.jdt.internal.integration.IJavaProjectCreationProperties;
-import org.eclipse.jst.common.jdt.internal.integration.IJavaProjectMigrationDataModelProperties;
-import org.eclipse.jst.common.jdt.internal.integration.JavaProjectCreationDataModelProvider;
-import org.eclipse.jst.common.jdt.internal.integration.JavaProjectMigrationDataModelProvider;
-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 ProjectMigrationTest extends TestCase {
-	
-	public static String DEFAULT_PROJECT_NAME = "TestJavaProj";	
-	
-	public ProjectMigrationTest(String name) {
-		super(name);
-	}
-	
-	public ProjectMigrationTest() {
-		super();
-	}	
-
-    public static Test suite() {
-        return new SimpleTestSuite(ProjectMigrationTest.class);
-    }
-	
-    
-	public void testProjectMigration() throws Exception {
-		runAll();
-	}
-	
-	private void createJavaProject(IProgressMonitor monitor) throws CoreException {
-		
-		IProject project = ProjectUtilities.getProject(DEFAULT_PROJECT_NAME);
-		
-		if( project.exists()){
-			project.delete( true, true, null );
-		}
-		
-		IDataModel model = DataModelFactory.createDataModel(new JavaProjectCreationDataModelProvider());	
-		model.setProperty(IJavaProjectCreationProperties.PROJECT_NAME, DEFAULT_PROJECT_NAME);
-		
-		String[] srcFolder = new String[2];
-		srcFolder[0] = new String("Src1");
-		srcFolder[1] = new String("Src2");
-		
-		model.setProperty(IJavaProjectCreationProperties.SOURCE_FOLDERS, srcFolder);
-		try {
-			model.getDefaultOperation().execute(monitor, null);
-		} catch (ExecutionException e) {
-			e.printStackTrace();
-		}
-
-	}
-	
-	private IPath getOutputPath(IProject project) {
-		String outputLocation = "bin";
-		return project.getFullPath().append(outputLocation);
-	}	
-	
-	
-	public void runAll(){
-		try {
-			IProgressMonitor monitor = new NullProgressMonitor();
-			createJavaProject(monitor);
-			migrateProject(DEFAULT_PROJECT_NAME);
-
-		}
-		catch (Exception e) {
-			e.printStackTrace();
-		}
-	}
-
-	private void migrateProject(String projectName){	
-		IDataModel model = DataModelFactory.createDataModel(new JavaProjectMigrationDataModelProvider());
-		model.setProperty( IJavaProjectMigrationDataModelProperties.PROJECT_NAME, projectName);
-
-		try {
-			model.getDefaultOperation().execute( null, null );
-		}
-		catch (Exception e) {
-			e.printStackTrace();
-		}		
-	}
-	
-}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/fvtests/WebModuleCreationTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/fvtests/WebModuleCreationTest.java
deleted file mode 100644
index 524f35b..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/fvtests/WebModuleCreationTest.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * 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.j2ee.flexible.project.fvtests;
-
-import junit.framework.Test;
-
-import org.eclipse.wst.common.tests.SimpleTestSuite;
-
-/**
- * @author blancett
- *
- * To change the template for this generated type comment go to
- * Window - Preferences - Java - Code Generation - Code and Comments
- */
-public class WebModuleCreationTest extends AbstractModuleCreationTest {
-	
-    public static Test suite() {
-        return new SimpleTestSuite(WebModuleCreationTest.class);
-    }
-    	
-	
-	public void testWebModuleCreation() throws Exception {
-		runAll();
-
-	}
-
-}
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
deleted file mode 100644
index 985d28d..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/flexible/project/tests/FlexibleProjectEditTest.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Created on Feb 14, 2005
- *
- * TODO To change the template for this generated file go to
- * Window - Preferences - Java - Code Style - Code Templates
- */
-package org.eclipse.jst.j2ee.flexible.project.tests;
-
-import junit.framework.TestCase;
-
-/**
- * @author vijayb
- *
- * TODO To change the template for this generated type comment go to
- * Window - Preferences - Java - Code Style - Code Templates
- */
-public class FlexibleProjectEditTest extends TestCase {
-
-}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/project/creation/operations/J2EEProjectCreationOperationTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/project/creation/operations/J2EEProjectCreationOperationTest.java
deleted file mode 100644
index def44fb..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/project/creation/operations/J2EEProjectCreationOperationTest.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * 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
- *******************************************************************************/
-package org.eclipse.jst.j2ee.project.creation.operations;
-
-import junit.framework.Test;
-
-import org.eclipse.jst.j2ee.application.internal.operations.FlexibleJavaProjectCreationDataModelProvider;
-import org.eclipse.jst.j2ee.application.internal.operations.FlexibleProjectCreationDataModelProvider;
-import org.eclipse.jst.j2ee.project.datamodel.properties.IFlexibleJavaProjectCreationDataModelProperties;
-import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.frameworks.datamodel.properties.IFlexibleProjectCreationDataModelProperties;
-import org.eclipse.wst.common.tests.OperationTestCase;
-import org.eclipse.wst.common.tests.SimpleTestSuite;
-
-public class J2EEProjectCreationOperationTest extends OperationTestCase {
-    public static Test suite() {
-        return new SimpleTestSuite(J2EEProjectCreationOperationTest.class);
-    }
-    public void testDefaults() throws Exception {
-        createSimpleProject("SimpleJavaWTPProjectCreation2");
-        createSimpleJavaProject("SimpleJavaProjects");
-    }
-    /**
-     * @param string
-     */
-    private void createSimpleJavaProject(String projectName) throws Exception{
-    	IDataModel dataModel = DataModelFactory.createDataModel(new FlexibleJavaProjectCreationDataModelProvider());
-        dataModel.setProperty(IFlexibleJavaProjectCreationDataModelProperties.PROJECT_NAME, projectName);
-        runAndVerify(dataModel);
-    }
-    public static void createSimpleProject(String projectName) throws Exception {
-        IDataModel dataModel = DataModelFactory.createDataModel(new FlexibleProjectCreationDataModelProvider());
-        dataModel.setProperty(IFlexibleProjectCreationDataModelProperties.PROJECT_NAME, projectName);
-        runAndVerify(dataModel);
-    }
-}
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
deleted file mode 100644
index 88db513..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/tests/modulecore/AllTests.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Created on Feb 18, 2005
- *
- * TODO To change the template for this generated file go to
- * Window - Preferences - Java - Code Style - Code Templates
- */
-package org.eclipse.jst.j2ee.tests.modulecore;
-
-
-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;
-import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.J2EEFlexibleProjectCreationOperationTest;
-
-/**
- * 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 JONAS_TOMCAT_RUNTIME = createJONASRuntime();
-
-    public static Test suite(){
-        return new AllTests();
-    }
-    
-    public AllTests(){
-        super("ModuleCore Tests");
-        addTest(J2EEFlexibleProjectCreationOperationTest.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
deleted file mode 100644
index 7a92e2e..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/tests/modulecore/FlexibleProjectBuilderTest.java
+++ /dev/null
@@ -1,341 +0,0 @@
-/*******************************************************************************
- * 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
- *******************************************************************************/
-package org.eclipse.jst.j2ee.tests.modulecore;
-
-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.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.common.jdt.internal.integration.IJavaProjectCreationProperties;
-import org.eclipse.jst.common.jdt.internal.integration.JavaProjectCreationDataModelProvider;
-import org.eclipse.jst.j2ee.internal.web.archive.operations.WebComponentCreationDataModelProvider;
-import org.eclipse.jst.j2ee.web.datamodel.properties.IWebComponentCreationDataModelProperties;
-import org.eclipse.wst.common.componentcore.ModuleCoreNature;
-import org.eclipse.wst.common.componentcore.internal.ComponentResource;
-import org.eclipse.wst.common.componentcore.internal.ComponentType;
-import org.eclipse.wst.common.componentcore.internal.ComponentcoreFactory;
-import org.eclipse.wst.common.componentcore.internal.ModuleStructuralModel;
-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.util.IModuleConstants;
-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 interface IModuleTypesConstants {
-		String MODULE_TYPE_WEB = IModuleConstants.WST_WEB_MODULE;
-	}
-
-    public FlexibleProjectBuilderTest(String name) {
-        super(name);
-        // TODO Auto-generated constructor stub
-    }
-    
-	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();
-	    checkForEmptyDeployables();
-	    buildProjects();
-	    checkForDeployablesOutput();
-	}
-
-	/**
-     * 
-     */
-    private void checkForDeployablesOutput() {
-        try {
-            //check web project
-            IProject remoteWeb = getProjectForRemoteWebLib();
-            IFolder[] remoteOutputFolders = StructureEdit.getOutputContainersForProject(remoteWeb);
-            IFolder tempFolder = remoteWeb.getFolder(remoteOutputFolders[0].getName());
-            if(!tempFolder.exists())
-                assertFalse(".deployables should exist, a build has been run", true);
-            
-            if(!tempFolder.getFolder(getRemoteWebLibraryDeployedName()).exists())
-                assertFalse(".deployables/RemoteWebLibProject.jar should exist, a build has been run", true);
-            //check the remote java util project
-            IProject localWeb = getProjectForWebModuleAndLocalWebLib();
-            IFolder[] localOutputFolders = StructureEdit.getOutputContainersForProject(localWeb);
-            tempFolder = localWeb.getFolder(localOutputFolders[0].getName());
-            if(!tempFolder.exists())
-                assertFalse(".deployables should exist, a build has been run", true);
-            tempFolder = tempFolder.getFolder(getWebModuleDeployedName());
-            if(!tempFolder.exists())
-                assertFalse(getWebModuleDeployedName() + " should exist, a build has been run", true);
-            IFolder metaFolder = tempFolder.getFolder("META-INF");
-            if(!metaFolder.exists())
-                assertFalse(getWebModuleDeployedName() + "/META-INF should exist, a build has been run", true);
-            IFile manifest = metaFolder.getFile("MANIFEST.MF");
-            if(!manifest.exists())
-                assertFalse(getWebModuleDeployedName() + "/META-INF/MANIFEST.MF should exist, a build has been run", true);
-            IFolder webInf = tempFolder.getFolder("WEB-INF");
-            if(!webInf.exists())
-                assertFalse(getWebModuleDeployedName() + "/WEB-INF should exist, a build has been run", true);
-            if(!webInf.getFolder("classes").exists())
-                assertFalse(getWebModuleDeployedName() + "/WEB-INF/classes should exist, a build has been run", true);
-            if(!webInf.getFile("web.xml").exists())
-                assertFalse(getWebModuleDeployedName() + "/WEB-INF/web.xml should exist, a build has been run", true);
-            IFolder lib = webInf.getFolder("lib");
-            if(!lib.getFile(getLocalWebLibraryDeployedName()).exists())
-                assertFalse(getWebModuleDeployedName() + "/WEB-INF/lib/LocalWebLibrary.jar should exist, a build has been run", true);  
-            if(!lib.getFile(getRemoteWebLibraryDeployedName()).exists())
-                assertFalse(getWebModuleDeployedName() + "/WEB-INF/lib/RemoteWebLibProject.jar should exist, a build has been run", true);
-          
-        } catch (Exception e) {
-            // TODO Auto-generated catch block
-            e.printStackTrace();
-        }   
-    }
-
-    /**
-     * 
-     */
-    private void buildProjects() {
-        try {
-    	    ResourcesPlugin.getWorkspace().build(IncrementalProjectBuilder.FULL_BUILD, null);           
-        } catch (Exception e) {
-            // TODO: handle exception
-        }
-    }
-
-    /**
-     * 
-     */
-    private void checkForEmptyDeployables() {
-        try {
-            IProject remoteWeb = getProjectForRemoteWebLib();
-            IFolder[] remoteOutputFolders = StructureEdit.getOutputContainersForProject(remoteWeb);
-            IFolder folder = remoteWeb.getFolder(remoteOutputFolders[0].getName());
-            if(folder.exists())
-                assertFalse(".deployables should only exist if a build has been run", true);
-            IProject localWeb = getProjectForWebModuleAndLocalWebLib();
-            IFolder[] localOutputFolders = StructureEdit.getOutputContainersForProject(localWeb);
-            folder = remoteWeb.getFolder(localOutputFolders[0].getName());
-            if(folder.exists())
-                assertFalse(".deployables should only exist if a build has been run", true);
-        } catch (Exception e) {
-            // TODO Auto-generated catch block
-            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.findComponentByName(getWebModuleDeployedName());
-
-			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 WebComponentCreationDataModelProvider());
-			dataModel.setProperty(IWebComponentCreationDataModelProperties.PROJECT_NAME, aProjectName);
-			// dataModel.setProperty(WebComponentCreationDataModel.IS_FLEXIBLE_PROJECT, Boolean.TRUE);
-			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 JavaProjectCreationDataModelProvider());
-			dataModel.setProperty(IJavaProjectCreationProperties.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$
-
-				ComponentType utilityModuleType = ComponentcoreFactory.eINSTANCE.createComponentType();
-				utilityModuleType.setComponentTypeId(IModuleConstants.JST_UTILITY_MODULE);
-				utilityModule.setComponentType(utilityModuleType);
-
-				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, "/");
-
-		ComponentType webModuleType = ComponentcoreFactory.eINSTANCE.createComponentType();
-		webModuleType.setComponentTypeId(IModuleConstants.JST_UTILITY_MODULE);
-		webLibraryModule.setComponentType(webModuleType);
-	}
-
-	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
deleted file mode 100644
index d3df44b..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/jst/j2ee/tests/modulecore/ModuleStructuralModelTest.java
+++ /dev/null
@@ -1,413 +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.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.common.jdt.internal.integration.IJavaProjectCreationProperties;
-import org.eclipse.jst.common.jdt.internal.integration.JavaProjectCreationDataModelProvider;
-import org.eclipse.jst.j2ee.internal.web.archive.operations.WebComponentCreationDataModelProvider;
-import org.eclipse.jst.j2ee.web.componentcore.util.WebArtifactEdit;
-import org.eclipse.jst.j2ee.web.datamodel.properties.IWebComponentCreationDataModelProperties;
-import org.eclipse.jst.j2ee.webapplication.WebApp;
-import org.eclipse.wst.common.componentcore.ModuleCoreNature;
-import org.eclipse.wst.common.componentcore.internal.ArtifactEditModel;
-import org.eclipse.wst.common.componentcore.internal.ComponentResource;
-import org.eclipse.wst.common.componentcore.internal.ComponentType;
-import org.eclipse.wst.common.componentcore.internal.ComponentcoreFactory;
-import org.eclipse.wst.common.componentcore.internal.ModuleStructuralModel;
-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.IModuleConstants;
-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.findComponentByName(getWebModuleDeployedName());
-
-			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, "/");
-
-		ComponentType webModuleType = ComponentcoreFactory.eINSTANCE.createComponentType();
-		webModuleType.setComponentTypeId(IModuleConstants.JST_UTILITY_MODULE);
-		webLibraryModule.setComponentType(webModuleType);
-	}
-
-	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 WebComponentCreationDataModelProvider());
-			dataModel.setProperty(IWebComponentCreationDataModelProperties.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 JavaProjectCreationDataModelProvider());
-            dataModel.setProperty(IJavaProjectCreationProperties.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$
-
-				ComponentType utilityModuleType = ComponentcoreFactory.eINSTANCE.createComponentType();
-				utilityModuleType.setComponentTypeId(IModuleConstants.JST_UTILITY_MODULE);
-				utilityModule.setComponentType(utilityModuleType);
-
-				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/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
deleted file mode 100644
index 70eb8e2..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/appclient/operations/AllTests.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * 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("App Client Tests");
-     //   addTest(AppClientExportOperationTest.suite());
-     //   addTest(AppClientImportOperationTest.suite());
-        addTest(AppClientProjectCreationOperationTest.suite());
-        //addTest(AppClientComponentTest.suite());
-    }
-}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/appclient/operations/AppClientComponentTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/appclient/operations/AppClientComponentTest.java
deleted file mode 100644
index ecf31d4..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/appclient/operations/AppClientComponentTest.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * 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.core.resources.IProject;
-import org.eclipse.jst.j2ee.applicationclient.internal.creation.AppClientComponentCreationDataModelProvider;
-import org.eclipse.jst.j2ee.datamodel.properties.IAppClientComponentCreationDataModelProperties;
-import org.eclipse.jst.j2ee.datamodel.properties.IJ2EEComponentCreationDataModelProperties;
-import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
-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.AbstractJ2EEComponentCreationTest;
-import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.RandomObjectGenerator;
-
-/**
- * @author blancett
- * 
- * To change the template for this generated type comment go to Window -
- * Preferences - Java - Code Generation - Code and Comments
- */
-public class AppClientComponentTest extends AbstractJ2EEComponentCreationTest {
-
-	public void testVaild12ApplicationClientProjectNameCreationWithAlphabetChars() throws Exception {
-		org.eclipse.wst.common.tests.ProjectUtility.deleteAllProjects();
-		for (int i = 0; i < RandomObjectGenerator.createRandomProjectNumber(); i++) {
-			createValidComponentNameCreationWithAlphabetChars(APPLICATION_CLIENT_MODULE, J2EEVersionConstants.J2EE_1_2_ID, false);
-			addJavaMainClassToApplicationModel(ProjectUtility.getProject(projectName));
-		}
-	}
-
-	public void testVaild12ApplicationClientCreationWithMixedChars() throws Exception {
-		ProjectUtility.deleteAllProjects();
-		for (int i = 0; i < RandomObjectGenerator.createRandomProjectNumber(); i++)
-			createValidComponentNameCreationWithAlphabetChars(APPLICATION_CLIENT_MODULE, J2EEVersionConstants.J2EE_1_2_ID, true);
-	}
-
-	public void testVaild13ApplicationClientNameCreationWithAlphabetChars() throws Exception {
-		ProjectUtility.deleteAllProjects();
-		for (int i = 0; i < RandomObjectGenerator.createRandomProjectNumber(); i++)
-			createValidComponentNameCreationWithAlphabetChars(APPLICATION_CLIENT_MODULE, J2EEVersionConstants.J2EE_1_3_ID, false);
-	}
-
-	public void testVaild13ApplicationClientNameCreationAllChars() throws Exception {
-		ProjectUtility.deleteAllProjects();
-		setupEARComponent("test", J2EEVersionConstants.J2EE_1_3_ID);
-		for (int i = 0; i < RandomObjectGenerator.createRandomProjectNumber(); i++) {
-			IProject javaProject = ProjectUtility.getProject("testapp");
-			IDataModel model = DataModelFactory.createDataModel(new AppClientComponentCreationDataModelProvider());
-			model.setProperty(IAppClientComponentCreationDataModelProperties.PROJECT_NAME, javaProject.getName());
-			//model.setProperty(AppClientProjectCreationDataModel.PROJECT_LOCATION, javaProject.getLocation().toOSString());
-			model.setIntProperty(IAppClientComponentCreationDataModelProperties.COMPONENT_VERSION, J2EEVersionConstants.J2EE_1_3_ID);
-			createAppClientComponent(model, ProjectUtility.getProject("test"));
-		}
-	}
-
-	public void testVaildRandomVersionsApplicationProjectNameCreationAllChars() throws Exception {
-		ProjectUtility.deleteAllProjects();
-		for (int i = 0; i < RandomObjectGenerator.createRandomProjectNumber(); i++) {
-			if (RandomObjectGenerator.createRandomProjectNumber() % 2 == 0)
-				createValidComponentNameCreationWithAlphabetChars(APPLICATION_CLIENT_MODULE, J2EEVersionConstants.J2EE_1_3_ID, true);
-			else
-				createValidComponentNameCreationWithAlphabetChars(APPLICATION_CLIENT_MODULE, J2EEVersionConstants.J2EE_1_2_ID, true);
-		}
-	}
-
-	public void testInVaild12ApplicationClientNameCreation() throws Exception {
-		ProjectUtility.deleteAllProjects();
-		for (int i = 0; i < RandomObjectGenerator.createRandomProjectNumber(); i++) {
-			try {
-				IDataModel model = setupApplicationClientComponent(RandomObjectGenerator.createInvalidRandomProjectName(), J2EEVersionConstants.J2EE_1_2_ID);
-				ProjectUtility.verifyProject(model.getStringProperty(IJ2EEComponentCreationDataModelProperties.PROJECT_NAME), true);
-			} catch (Exception e) {
-				if (e instanceof IllegalArgumentException) {
-					System.out.println(ILLEGAL_PROJECT_NAME_MESSAGE + projectName);
-				} else
-					new Exception(UNEXPECTED_ERROR_MESSAGE);
-			} finally {
-				new Exception(TEST_FAILED_MESSAGE);
-			}
-		}
-	}
-
-    public static Test suite() {
-        return new SimpleTestSuite(AppClientComponentTest.class);
-    }
-
-}
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
deleted file mode 100644
index 0ae668e..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/appclient/operations/AppClientExportOperationTest.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * 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.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.tests.SimpleTestSuite;
-import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleExportOperationTestCase;
-import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleImportOperationTestCase;
-
-/**
- * @author Administrator
- * 
- * To change the template for this generated type comment go to Window - Preferences - Java - Code
- * Generation - Code and Comments
- */
-public class AppClientExportOperationTest extends ModuleExportOperationTestCase {
-
-	public AppClientExportOperationTest(String name) {
-		super(name);
-	}
-	public static Test suite() {
-		return new SimpleTestSuite(AppClientExportOperationTest.class);
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleExportOperationTestCase#getModelInstance()
-	 */
-	protected IDataModel getModelInstance() {
-		return null;
-	}
-	
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleExportOperationTestCase#getImportTestCase()
-	 */
-	protected ModuleImportOperationTestCase getImportTestCase() {
-		return new AppClientImportOperationTest("");
-	}
-
-}
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
deleted file mode 100644
index 27f39ce..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/appclient/operations/AppClientImportOperationTest.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * 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.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.tests.SimpleTestSuite;
-import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleImportOperationTestCase;
-
-/**
- * @author Administrator
- *
- * To change the template for this generated type comment go to
- * Window - Preferences - Java - Code Generation - Code and Comments
- */
-public class AppClientImportOperationTest extends ModuleImportOperationTestCase {
-	
-	public AppClientImportOperationTest(String name) {
-		super(name);
-	}
-	
-	public static Test suite() {
-		return new SimpleTestSuite(AppClientImportOperationTest.class);
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleImportOperationTestCase#getDirectory()
-	 */
-	protected String getDirectory() {
-		return "AppClientTests";
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleImportOperationTestCase#getModelInstance()
-	 */
-	protected IDataModel getModelInstance() {
-		return null;//new AppClientModuleImportDataModel();
-	}
- 
-
-	
-}
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
deleted file mode 100644
index e84f348..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/appclient/operations/AppClientProjectCreationOperationTest.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * 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.AppClientComponentCreationDataModelProvider;
-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.ModuleProjectCreationOperationTest;
-
-/**
- * @author jsholl
- *
- * 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 AppClientProjectCreationOperationTest extends ModuleProjectCreationOperationTest {
-
-    public static String DEFAULT_PROJECT_NAME = "SimpleAppClient";
-    
-    /**
-	 * @param name
-	 */
-	public AppClientProjectCreationOperationTest(String name) {
-		super(name);
-		// TODO Auto-generated constructor stub
-	}
-
-	public static Test suite() {
-        return new SimpleTestSuite(AppClientProjectCreationOperationTest.class);
-    }
-
-    public IDataModel getComponentCreationDataModel() {
-        return DataModelFactory.createDataModel(new AppClientComponentCreationDataModelProvider());
-    }
-
-}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/appclient/operations/FlexibleAppClientModuleCreationTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/appclient/operations/FlexibleAppClientModuleCreationTest.java
deleted file mode 100644
index e5bb8ee..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/appclient/operations/FlexibleAppClientModuleCreationTest.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * 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
- *******************************************************************************/
-package org.eclipse.wtp.j2ee.headless.tests.appclient.operations;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jst.j2ee.application.internal.operations.FlexibleJavaProjectCreationDataModelProvider;
-import org.eclipse.jst.j2ee.applicationclient.internal.creation.AppClientComponentCreationDataModelProvider;
-import org.eclipse.jst.j2ee.datamodel.properties.IAppClientComponentCreationDataModelProperties;
-import org.eclipse.jst.j2ee.project.datamodel.properties.IFlexibleJavaProjectCreationDataModelProperties;
-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.OperationTestCase;
-
-
-public class FlexibleAppClientModuleCreationTest extends OperationTestCase {
-
-    public static String DEFAULT_PROJECT_NAME = "SimpleAppClientProject";
-    public static String DEFAULT_MODULE_NAME= "SimpleAppClientModule";
-    
-    public static Test suite() {
-        TestSuite suite = new TestSuite();
-        suite.addTestSuite(FlexibleAppClientModuleCreationTest.class);
-        return suite;
-    }
-    
-    public void testDefaults() throws Exception {
-       createProject(DEFAULT_PROJECT_NAME);
-        createAppClientModule(DEFAULT_MODULE_NAME);
-    }
-
-    public void createProject(String projectName) throws Exception {
-        IDataModel dataModel = getProjectCreationDataModel();
-        dataModel.setProperty(IFlexibleJavaProjectCreationDataModelProperties.PROJECT_NAME, projectName);
-        IDataModelOperation op = dataModel.getDefaultOperation();
-        op.execute(new NullProgressMonitor(), null);
-    }
-    public void createAppClientModule(String moduleName) throws Exception {
-        IDataModel dataModel = getFlexibleAppClientModuleCreation();
-        dataModel.setProperty(IAppClientComponentCreationDataModelProperties.PROJECT_NAME, DEFAULT_PROJECT_NAME);
-        dataModel.setProperty(IAppClientComponentCreationDataModelProperties.COMPONENT_NAME, DEFAULT_MODULE_NAME);
-        runAndVerify(dataModel);
-    }
-    
-    public IDataModel getProjectCreationDataModel(){
-		return DataModelFactory.createDataModel(new FlexibleJavaProjectCreationDataModelProvider());
-    }
-    public IDataModel getFlexibleAppClientModuleCreation(){
-		return DataModelFactory.createDataModel(new AppClientComponentCreationDataModelProvider());
-    }
-}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/connector/operations/FlexibleConnectorModuleCreationTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/connector/operations/FlexibleConnectorModuleCreationTest.java
deleted file mode 100644
index 46c2dad..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/connector/operations/FlexibleConnectorModuleCreationTest.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * 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
- *******************************************************************************/
-package org.eclipse.wtp.j2ee.headless.tests.connector.operations;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jst.j2ee.application.internal.operations.FlexibleJavaProjectCreationDataModelProvider;
-import org.eclipse.jst.j2ee.internal.jca.operations.ConnectorComponentCreationDataModelProvider;
-import org.eclipse.jst.j2ee.internal.jca.operations.IConnectorComponentCreationDataModelProperties;
-import org.eclipse.jst.j2ee.project.datamodel.properties.IFlexibleJavaProjectCreationDataModelProperties;
-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.OperationTestCase;
-
-
-public class FlexibleConnectorModuleCreationTest extends OperationTestCase {
-
-    public static String DEFAULT_PROJECT_NAME = "SimpleAppClientProject";
-    public static String DEFAULT_MODULE_NAME= "SimpleAppClientModule";
-    
-    public static Test suite() {
-        TestSuite suite = new TestSuite();
-        suite.addTestSuite(FlexibleConnectorModuleCreationTest.class);
-        return suite;
-    }
-    
-    public void testDefaults() throws Exception {
-       createProject(DEFAULT_PROJECT_NAME);
-        createAppClientModule(DEFAULT_MODULE_NAME);
-    }
-
-    public void createProject(String projectName) throws Exception {
-        IDataModel dataModel = getProjectCreationDataModel();
-        dataModel.setProperty(IFlexibleJavaProjectCreationDataModelProperties.PROJECT_NAME, projectName);
-        IDataModelOperation op = dataModel.getDefaultOperation();
-        op.execute(new NullProgressMonitor(), null);
-    }
-
-    
-    public IDataModel getProjectCreationDataModel(){
-        return DataModelFactory.createDataModel(new FlexibleJavaProjectCreationDataModelProvider());
-    }
-    
-    public void createAppClientModule(String moduleName) throws Exception {
-        IDataModel dataModel = getFlexibleConnectorModuleCreation();
-        dataModel.setProperty(IConnectorComponentCreationDataModelProperties.PROJECT_NAME, DEFAULT_PROJECT_NAME);
-        dataModel.setProperty(IConnectorComponentCreationDataModelProperties.COMPONENT_NAME, DEFAULT_MODULE_NAME);
-        runAndVerify(dataModel);
-    }
-    public IDataModel getFlexibleConnectorModuleCreation(){
-		return DataModelFactory.createDataModel(new ConnectorComponentCreationDataModelProvider());
-    }
-
-}
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
deleted file mode 100644
index 8f899b3..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/ear/operations/AllTests.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * 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 Tests");
-     //   addTest(EARExportOperationTest.suite());
-     //   addTest(EARImportOperationTest.suite());
-     //   addTest(EARProjectCreationOperationTest.suite());
-       // addTest(EARComponentCreationTest.suite());
-    }
-    
-}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/ear/operations/EARComponentCreationTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/ear/operations/EARComponentCreationTest.java
deleted file mode 100644
index 06af4e6..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/ear/operations/EARComponentCreationTest.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * 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 junit.framework.Test;
-
-import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
-import org.eclipse.wst.common.tests.ProjectUtility;
-import org.eclipse.wst.common.tests.SimpleTestSuite;
-import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.AbstractJ2EEComponentCreationTest;
-import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.RandomObjectGenerator;
-
-/**
- * @author blancett
- *
- * To change the template for this generated type comment go to
- * Window - Preferences - Java - Code Generation - Code and Comments
- */
-public class EARComponentCreationTest extends AbstractJ2EEComponentCreationTest{
-	
-	public void testVaild12EARProjectNameCreationWithAlphabetChars() throws Exception {
-		ProjectUtility.deleteAllProjects();
-		for (int i = 0; i < RandomObjectGenerator.createRandomProjectNumber(); i++)
-			createValidComponentNameCreationWithAlphabetChars(EAR_MODULE, J2EEVersionConstants.J2EE_1_2_ID, false);
-	}
-	
-	public void testVaild12EARProjectNameCreationWithMixedChars() throws Exception {
-		ProjectUtility.deleteAllProjects();
-		for (int i = 0; i < RandomObjectGenerator.createRandomProjectNumber(); i++)
-			createValidComponentNameCreationWithAlphabetChars(EAR_MODULE, J2EEVersionConstants.J2EE_1_3_ID, true);
-	}
-	
-	public void testVaild13EARProjectNameCreationWithAlphabetChars() throws Exception {
-		ProjectUtility.deleteAllProjects();
-		for (int i = 0; i < RandomObjectGenerator.createRandomProjectNumber(); i++)
-			createValidComponentNameCreationWithAlphabetChars(EAR_MODULE, J2EEVersionConstants.J2EE_1_3_ID, false);
-	}
-	
-	public void testVaild13EARProjectNameCreationAllChars() throws Exception {
-		ProjectUtility.deleteAllProjects();
-		for (int i = 0; i < RandomObjectGenerator.createRandomProjectNumber(); i++)
-			createValidComponentNameCreationWithAlphabetChars(EAR_MODULE, J2EEVersionConstants.J2EE_1_3_ID, true);
-	}
-	
-	public void testVaildRandomVersionsEARProjectNameCreationAllChars() throws Exception {
-		ProjectUtility.deleteAllProjects();
-		for (int i = 0; i < RandomObjectGenerator.createRandomProjectNumber(); i++) {
-			if (RandomObjectGenerator.createRandomProjectNumber() % 2 == 0)
-				createValidComponentNameCreationWithAlphabetChars(EAR_MODULE, J2EEVersionConstants.J2EE_1_3_ID, true);
-			else
-				createValidComponentNameCreationWithAlphabetChars(EAR_MODULE, J2EEVersionConstants.J2EE_1_2_ID, true);
-		}
-	}
-	
-	public void testVaildRandomVersionsEARProjectNameCreationAlphabet() throws Exception {
-		ProjectUtility.deleteAllProjects();
-		for (int i = 0; i < RandomObjectGenerator.createRandomProjectNumber(); i++) {
-			if (RandomObjectGenerator.createRandomProjectNumber() % 2 == 0)
-				createValidComponentNameCreationWithAlphabetChars(EAR_MODULE, J2EEVersionConstants.J2EE_1_3_ID, false);
-			else
-				createValidComponentNameCreationWithAlphabetChars(EAR_MODULE, J2EEVersionConstants.J2EE_1_2_ID, false);
-		}
-	}
-	
-	public void testInVaild12EARProjectNameCreation() throws Exception {
-		ProjectUtility.deleteAllProjects();
-		for (int i = 0; i < RandomObjectGenerator.createRandomProjectNumber(); i++) {
-			try {
-//				projectName = setupWebProject(RandomObjectGenerator.createInvalidRandomProjectName(), J2EEVersionConstants.EJB_1_1_ID);
-//				checkVaildProjectName(projectName);
-			} catch (Exception e) {
-				if (e instanceof IllegalArgumentException) {
-					System.out.println(ILLEGAL_PROJECT_NAME_MESSAGE + projectName);
-				} else
-					new Exception(UNEXPECTED_ERROR_MESSAGE);
-			} finally {
-				new Exception(TEST_FAILED_MESSAGE);
-			}
-		}
-	}
-
-    public static Test suite() {
-        return new SimpleTestSuite(EARComponentCreationTest.class);
-    }
-	
-	
-
-}
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
deleted file mode 100644
index 1e3b8bf..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/ear/operations/EARExportOperationTest.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * 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 junit.framework.Test;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
-import org.eclipse.wst.common.tests.OperationTestCase;
-import org.eclipse.wst.common.tests.SimpleTestSuite;
-
-/**
- * @author Changeme
- * 
- * To change the template for this generated type comment go to Window - Preferences - Java - Code Generation - Code
- * and Comments
- */
-public class EARExportOperationTest extends OperationTestCase {
-
-    public static String fileSep = System.getProperty("file.separator");
-
-    public EARExportOperationTest() {
-        super();
-    }
-    public EARExportOperationTest(String name) {
-        super(name);
-    }
-    public static Test suite() {
-        return new SimpleTestSuite(EARExportOperationTest.class);
-    }
-
-    public static void exportEARProject(String projectName, IPath exportPath, boolean exportSource) throws Exception {
-//    	EnterpriseApplicationExportDataModel model = new EnterpriseApplicationExportDataModel();
-//        model.setProperty(EnterpriseApplicationExportDataModel.PROJECT_NAME, projectName);
-//        model.setProperty(EnterpriseApplicationExportDataModel.ARCHIVE_DESTINATION, exportPath.toOSString());
-//        model.setBooleanProperty(EnterpriseApplicationExportDataModel.EXPORT_SOURCE_FILES, exportSource);
-//        runAndVerify(model);
-    }
-
-    public static void exportEARProjectWithMetaData(String projectName, IPath exportPath, boolean exportSource) throws Exception {
-//    	EnterpriseApplicationExportDataModel model = new EnterpriseApplicationExportDataModel();
-//        model.setProperty(EnterpriseApplicationExportDataModel.PROJECT_NAME, projectName);
-//        model.setProperty(EnterpriseApplicationExportDataModel.ARCHIVE_DESTINATION, exportPath.toOSString());
-//        model.setBooleanProperty(EnterpriseApplicationExportDataModel.EXPORT_SOURCE_FILES, exportSource);
-//        model.setBooleanProperty(EnterpriseApplicationExportDataModel.OVERWRITE_EXISTING, true);
-//        model.setBooleanProperty(EnterpriseApplicationExportDataModel.INCLUDE_BUILD_PATH_AND_META_FILES, true);
-//        runAndVerify(model);
-    }
-
-    public void testEAR12Export() throws Exception {
-        String projectName = "Test12WEBEJBEAR";
-        String earName = "TestData" + fileSep + "EARImportTests" + fileSep + "Test12WEBEJBEAR.ear";
-        EARImportOperationTest.load(projectName, earName);
-        exportEARProject("Test12WEBEJBEAR", J2EEPlugin.getWorkspace().getRoot().getLocation().append("Test12WEBEJBEAR.ear"), false);
-    }
-    public void testEARExportWithMetaData() throws Exception {
-        String projectName = "Test14WEBEJBEARWithMetaData";
-        String earName = "TestData" + fileSep + "EARImportTests" + fileSep + "Test14WEBEJBEARWithMetaData.ear";
-        EARImportOperationTest.load(projectName, earName);
-        exportEARProjectWithMetaData("Test14WEBEJBEARWithMetaData", J2EEPlugin.getWorkspace().getRoot().getLocation().append("Test14WEBEJBEARWithMetaData.ear"), true);
-    }
-    public void testEARExportWithSource() throws Exception {
-        String projectName = "Test14WEBEJBEAR";
-        String earName = "TestData" + fileSep + "EARImportTests" + fileSep + "Test14WEBEJBEAR.ear";
-        EARImportOperationTest.load(projectName, earName);
-        exportEARProject("Test14WEBEJBEAR", J2EEPlugin.getWorkspace().getRoot().getLocation().append("Test14WEBEJBEAR.ear"), true);
-    }
-
-}
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
deleted file mode 100644
index b5a8452..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/ear/operations/EARImportOperationTest.java
+++ /dev/null
@@ -1,292 +0,0 @@
-package org.eclipse.wtp.j2ee.headless.tests.ear.operations;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import junit.framework.Test;
-
-import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive;
-import org.eclipse.jst.j2ee.commonarchivecore.internal.CommonarchiveFactory;
-import org.eclipse.jst.j2ee.commonarchivecore.internal.EARFile;
-import org.eclipse.jst.j2ee.commonarchivecore.internal.File;
-import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.OpenFailureException;
-import org.eclipse.jst.j2ee.commonarchivecore.internal.impl.FileImpl;
-import org.eclipse.jst.j2ee.commonarchivecore.internal.impl.WARFileImpl;
-import org.eclipse.wst.common.tests.LogUtility;
-import org.eclipse.wst.common.tests.OperationTestCase;
-import org.eclipse.wst.common.tests.ProjectUtility;
-import org.eclipse.wst.common.tests.SimpleTestSuite;
-import org.eclipse.wtp.j2ee.headless.tests.plugin.HeadlessTestsPlugin;
-
-/**
- * @author vijayb
- * 
- * To change the template for this generated type comment go to Window - Preferences - Java - Code Generation - Code
- * and Comments
- */
-public class EARImportOperationTest extends OperationTestCase {
-
-    public static String fileSep = System.getProperty("file.separator");
-
-    /**
-     *  
-     */
-    public EARImportOperationTest() {
-        super();
-    }
-
-    public List getUtilityJarsInEAR(EARFile earFile) {
-        List utilJars = new ArrayList();
-        try {
-            List files = earFile.getArchiveFiles();
-            for (int i = 0; i < files.size(); i++) {
-                FileImpl file = (FileImpl) files.get(i);
-                if (file.isArchive() && !file.isModuleFile() && file.getURI().endsWith(".jar")) //$NON-NLS-1$
-                    utilJars.add(file);
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        return utilJars;
-    }
-
-    public void testEARImportRootLocation() throws Exception {
-//    	EnterpriseApplicationImportDataModel importModel = null;
-//        String projectName = "Test13WEBEJBEAR";
-//        String earName = getFullTestDataPath("TestData" + fileSep + "EARImportTests" + fileSep + "Test13WEBEJBEAR.ear");
-//        try {
-//            importModel = new EnterpriseApplicationImportDataModel();
-//            importModel.setProperty(EARComponentCreationDataModel.PROJECT_NAME, projectName);
-//            importModel.setProperty(EnterpriseApplicationImportDataModel.FILE_NAME, earName);
-//            importModel.setIntProperty(EARComponentCreationDataModel.COMPONENT_VERSION, J2EEVersionConstants.J2EE_1_3_ID);
-//            //importModel.setProperty(EARComponentCreationDataModel.PROJECT_LOCATION, "c:" + fileSep + "EARTestTemp");
-//            importModel.setProperty(EnterpriseApplicationImportDataModel.NESTED_MODULE_ROOT, "c:" + fileSep + "EARTestModulesTemp");
-//            runAndVerify(importModel);
-//        } finally {
-//            importModel.dispose();
-//        }
-    }
-    
-    //TODO M4 Action Item - enable the util jar tests after the fixes for util jar import are available in M4
-
-    /*public void testImportSomeUtilityJarsExploded() throws Exception {
-        String projectName = "UtilityJarTestEAR";
-        String earName = getFullTestDataPath("TestData" + fileSep + "EARImportTests" + fileSep + "UtilityJarTestEAR.ear");
-        EnterpriseApplicationImportDataModel importModel = null;
-        try {
-            importModel = new EnterpriseApplicationImportDataModel();
-            importModel.setProperty(EnterpriseApplicationCreationDataModel.PROJECT_NAME, projectName);
-            importModel.setProperty(EnterpriseApplicationImportDataModel.FILE_NAME, earName);
-            importModel.setIntProperty(EnterpriseApplicationCreationDataModel.APPLICATION_VERSION, J2EEVersionConstants.J2EE_1_3_ID);
-            EARFile file = importModel.getEARFile();
-            List utilJars = getUtilityJarsInEAR(file);
-            if (!utilJars.isEmpty()) {
-                utilJars.remove(0);
-                utilJars.remove(2);
-                importModel.setProperty(EnterpriseApplicationImportDataModel.UTILITY_LIST, utilJars);
-            }
-            //TODO to be changed when the new property is available, EARImportDataModel.CREATE_BINARY_PROJECT is
-            // removed
-            //importModel.setBooleanProperty(EARImportDataModel.CREATE_BINARY_PROJECT, false);
-            runAndVerify(importModel);
-        } finally {
-            importModel.dispose();
-        }
-    }
-
-    public void testImportUtilityJarsExploded() throws Exception {
-        String projectName = "UtilityJarTestEAR";
-        String earName = getFullTestDataPath("TestData" + fileSep + "EARImportTests" + fileSep + "UtilityJarTestEAR.ear");
-        EnterpriseApplicationImportDataModel importModel = null;
-        try {
-            importModel = new EnterpriseApplicationImportDataModel();
-            importModel.setProperty(EnterpriseApplicationCreationDataModel.PROJECT_NAME, projectName);
-            importModel.setProperty(EnterpriseApplicationImportDataModel.FILE_NAME, earName);
-            importModel.setIntProperty(EnterpriseApplicationCreationDataModel.APPLICATION_VERSION, J2EEVersionConstants.J2EE_1_3_ID);
-            EARFile file = importModel.getEARFile();
-            List utilJars = getUtilityJarsInEAR(file);
-            if (!utilJars.isEmpty())
-                importModel.setProperty(EnterpriseApplicationImportDataModel.UTILITY_LIST, utilJars);
-            //TODO to be changed when the new property is available, EARImportDataModel.CREATE_BINARY_PROJECT is
-            // removed
-            //importModel.setBooleanProperty(EARImportDataModel.CREATE_BINARY_PROJECT, false);
-            runAndVerify(importModel);
-        } finally {
-            importModel.dispose();
-        }
-    }
-    
-    public void testImportWebLibWithMetaData() throws Exception {
-        String projectName = "YourCompanyExampleEAR";
-        String earName = getFullTestDataPath("TestData" + fileSep + "EARImportTests" + fileSep + "YourCompanyExampleEAR.ear");
-        EnterpriseApplicationImportDataModel importModel = null;
-        try {
-            importModel = new EnterpriseApplicationImportDataModel();
-            importModel.setProperty(EnterpriseApplicationCreationDataModel.PROJECT_NAME, projectName);
-            importModel.setProperty(EnterpriseApplicationImportDataModel.FILE_NAME, earName);
-            importModel.setIntProperty(EnterpriseApplicationCreationDataModel.APPLICATION_VERSION, J2EEVersionConstants.J2EE_1_3_ID);
-            EARFile file = importModel.getEARFile();
-            List webLibs = getWebLibs(file);
-            //TODO to be changed when the new property is available, EARImportDataModel.CREATE_BINARY_PROJECT is
-            // removed
-            //importModel.setBooleanProperty(EARImportDataModel.CREATE_BINARY_PROJECT, false);
-            List projectModels = importModel.getProjectModels();
-            for (int i = 0; i < projectModels.size(); i++) {
-                if (projectModels.get(i) instanceof J2EEModuleCreationDataModel) {
-                    J2EEModuleCreationDataModel projectDataModel = (J2EEModuleCreationDataModel) projectModels.get(i);
-                    if (projectDataModel.getJ2EENatureID().equals(J2EEWebNatureRuntime.J2EE_NATURE_ID)) {
-                        projectDataModel.setProperty(WebModuleCreationDataModel.JAR_LIST_TEXT_UI, webLibs);
-                    }
-                }
-            }
-            importModel.setBooleanProperty(EnterpriseApplicationImportDataModel.PRESERVE_PROJECT_METADATA, true);
-            runAndVerify(importModel);
-        } finally {
-            importModel.dispose();
-        }
-    }*/
-    //TODO M4 Action Item - enable the util jar tests after the fixes for util jar import are available in M4
-    /*public void testImportUtilityJarsAndWebLibWithMetaData() throws Exception {
-        String projectName = "UtilityJarWebLibWithMetaDataFilesEAR";
-        String earName = getFullTestDataPath("TestData" + fileSep + "EARImportTests" + fileSep + "UtilityJarWebLibWithMetaDataFilesEAR.ear");
-        EnterpriseApplicationImportDataModel importModel = null;
-        try {
-            importModel = new EnterpriseApplicationImportDataModel();
-            importModel.setProperty(EnterpriseApplicationCreationDataModel.PROJECT_NAME, projectName);
-            importModel.setProperty(EnterpriseApplicationImportDataModel.FILE_NAME, earName);
-            importModel.setIntProperty(EnterpriseApplicationCreationDataModel.APPLICATION_VERSION, J2EEVersionConstants.J2EE_1_3_ID);
-            EARFile file = importModel.getEARFile();
-            List utilJars = getUtilityJarsInEAR(file);
-            if (!utilJars.isEmpty())
-                importModel.setProperty(EnterpriseApplicationImportDataModel.UTILITY_LIST, utilJars);
-            List webLibs = getWebLibs(file);
-            //TODO to be changed when the new property is available, EARImportDataModel.CREATE_BINARY_PROJECT is
-            // removed
-            //importModel.setBooleanProperty(EARImportDataModel.CREATE_BINARY_PROJECT, false);
-            List projectModels = importModel.getProjectModels();
-            for (int i = 0; i < projectModels.size(); i++) {
-                if (projectModels.get(i) instanceof J2EEModuleCreationDataModel) {
-                    J2EEModuleCreationDataModel projectDataModel = (J2EEModuleCreationDataModel) projectModels.get(i);
-                    if (projectDataModel.getJ2EENatureID().equals(J2EEWebNatureRuntime.J2EE_NATURE_ID)) {
-                        projectDataModel.setProperty(WebModuleCreationDataModel.JAR_LIST_TEXT_UI, webLibs);
-                    }
-                }
-            }
-            importModel.setBooleanProperty(EnterpriseApplicationImportDataModel.PRESERVE_PROJECT_METADATA, false);
-            runAndVerify(importModel);
-        } finally {
-            importModel.dispose();
-        }
-    }*/
-
-    /**
-     * @param file
-     * @return
-     */
-    private List getWebLibs(EARFile earFile) {
-        List files = earFile.getArchiveFiles();
-        List webLibs = new ArrayList();
-        for (int i = 0; i < files.size(); i++) {
-            FileImpl file = (FileImpl) files.get(i);
-            if (file.isWARFile()) {
-                List webLib = ((WARFileImpl) file).getLibArchives();
-                if (!webLib.isEmpty())
-                    webLibs.addAll(webLib);
-            }
-        }
-        return webLibs;
-    }
-
-    public static String getFullTestDataPath(String dataPath) {
-    	try {
-    	  return ProjectUtility.getFullFileName(HeadlessTestsPlugin.getDefault(),dataPath);
-    	} catch(Exception e) {
-    		e.printStackTrace();
-    	}
-    	return "";
-    }
-
-    public void testImportEAR14() throws Exception {
-//        String projectName = "Test14WEBEJBEAR";
-//        String earName = getFullTestDataPath("TestData" + fileSep + "EARImportTests" + fileSep + "Test14WEBEJBEAR.ear");
-//        EnterpriseApplicationImportDataModel importModel = null;
-//        try {
-//            importModel = new EnterpriseApplicationImportDataModel();
-//            importModel.setProperty(EnterpriseApplicationImportDataModel.PROJECT_NAME, projectName);
-//            importModel.setProperty(EnterpriseApplicationImportDataModel.FILE_NAME, earName);
-//            runAndVerify(importModel);
-//        } finally {
-//            importModel.dispose();
-//        }
-    }
-
-    public static Test suite() {
-        return new SimpleTestSuite(EARImportOperationTest.class);
-    }
-
-    public void testImportProjectNameCollisionForEARImport() {
-        try {
-            String earName = "TestData" + fileSep + "EARImportTests" + fileSep + "Test13WEBEJBEAR.ear";
-            load(null, earName);
-            load(null, earName);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    public void testImportEAR12() throws Exception {
-        String projectName = "Test12WEBEJBEAR";
-        String earName = "TestData" + fileSep + "EARImportTests" + fileSep + "Test12WEBEJBEAR.ear";
-        load(projectName, earName);
-    }
-    public void testImportEAR13() throws Exception {
-        String projectName = "Test13WEBEJBEAR";
-        String earName = "TestData" + fileSep + "EARImportTests" + fileSep + "Test13WEBEJBEAR.ear";
-        load(projectName, earName);
-    }
-    public static void testAllEARImportProjects() throws Exception {
-        String projectName = "EARTest";
-        String earName = "TestData" + fileSep + "EARImportTests" + fileSep;
-        List projects = ProjectUtility.getEarsInDirectory(HeadlessTestsPlugin.getDefault(),getFullTestDataPath(earName));
-        for (int i = 0; i < projects.size(); i++) {
-            ProjectUtility.deleteAllProjects();
-            LogUtility.getInstance().resetLogging();
-            load(projectName, earName + projects.get(i));
-        }
-    }
-
-    public static void load(String projectName, String earName) throws Exception {
-		// EnterpriseApplicationImportDataModel importModel = null;
-		// try {
-		// importModel = new EnterpriseApplicationImportDataModel();
-		// importModel.setProperty(EnterpriseApplicationImportDataModel.PROJECT_NAME, projectName);
-		// importModel.setProperty(EnterpriseApplicationImportDataModel.FILE_NAME,
-		// getFullTestDataPath(earName));
-		// runAndVerify(importModel);
-		// } finally {
-		// importModel.dispose();
-		//        }
-    }
-
-    public List getArchiveInEAR(String earFileURI) {
-        CommonarchiveFactory factory = CommonarchiveFactory.eINSTANCE;
-        List moduleArchives = new ArrayList();
-        try {
-            Archive archive = factory.openArchive(earFileURI);
-            List files = archive.getFiles();
-            if (!files.isEmpty()) {
-                for (int i = 0; i < files.size(); i++) {
-                    moduleArchives = new ArrayList();
-                    File file = (File) files.get(i);
-                    if (file.isArchive()) {
-                        moduleArchives.add(file);
-                    }
-                }
-            }
-        } catch (OpenFailureException oe) {
-            oe.printStackTrace();
-        }
-        return moduleArchives;
-    }
-
-}
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
deleted file mode 100644
index 5ee4078..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/ear/operations/EARProjectCreationOperationTest.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * 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 junit.framework.Test;
-
-import org.eclipse.wst.common.tests.SimpleTestSuite;
-
-/**
- * @author jsholl
- * 
- * 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 org.eclipse.wst.common.tests.OperationTestCase {
-    public EARProjectCreationOperationTest(String string) {
-		super(string);
-	}
-
-	public static Test suite() {
-        return new SimpleTestSuite(EARProjectCreationOperationTest.class);
-    }
-
-//    public void testDefaults() throws Exception {
-//        createSimpleEAR("SimpleEAR");
-//    }
-//    public void testLocation() throws Exception {
-//        EARComponentCreationDataModel dataModel = new EARComponentCreationDataModel();
-//        dataModel.setProperty(EARComponentCreationDataModel.PROJECT_NAME, "SimpleEAR");
-//       // dataModel.setProperty(EARComponentCreationDataModel.PROJECT_LOCATION, "c:/temp/");
-//        runAndVerify(dataModel);
-//    }
-//
-//    public void testVersion12() throws Exception {
-//    	EARComponentCreationDataModel dataModel = new EARComponentCreationDataModel();
-//        dataModel.setProperty(EARComponentCreationDataModel.PROJECT_NAME, "SimpleEAR");
-//        dataModel.setIntProperty(EARComponentCreationDataModel.COMPONENT_VERSION, J2EEVersionConstants.J2EE_1_2_ID);
-//        runAndVerify(dataModel);
-//    }
-//
-//    public void testVersion13() throws Exception {
-//    	EARComponentCreationDataModel dataModel = new EARComponentCreationDataModel();
-//        dataModel.setProperty(EARComponentCreationDataModel.PROJECT_NAME, "SimpleEAR");
-//        dataModel.setIntProperty(EARComponentCreationDataModel.COMPONENT_VERSION, J2EEVersionConstants.J2EE_1_3_ID);
-//        runAndVerify(dataModel);
-//    }
-//
-//    public void testVersion14() throws Exception {
-//    	EARComponentCreationDataModel dataModel = new EARComponentCreationDataModel();
-//        dataModel.setProperty(EARComponentCreationDataModel.PROJECT_NAME, "SimpleEAR");
-//        dataModel.setIntProperty(EARComponentCreationDataModel.COMPONENT_VERSION, J2EEVersionConstants.J2EE_1_4_ID);
-//        runAndVerify(dataModel);
-//    }
-//
-//    public static void createSimpleEAR(String earName) throws Exception {
-//    	EARComponentCreationDataModel dataModel = new EARComponentCreationDataModel();
-//        dataModel.setProperty(EARComponentCreationDataModel.PROJECT_NAME, earName);
-//        runAndVerify(dataModel);
-//    }
-
-}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/AbstractJ2EEComponentCreationTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/AbstractJ2EEComponentCreationTest.java
deleted file mode 100644
index c0f873e..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/AbstractJ2EEComponentCreationTest.java
+++ /dev/null
@@ -1,377 +0,0 @@
-package org.eclipse.wtp.j2ee.headless.tests.j2ee.operations;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
-import org.eclipse.jst.j2ee.application.internal.operations.AddArchiveProjectsToEARDataModel;
-import org.eclipse.jst.j2ee.application.internal.operations.EARComponentCreationOperation;
-import org.eclipse.jst.j2ee.applicationclient.internal.creation.AppClientComponentCreationDataModelProvider;
-import org.eclipse.jst.j2ee.applicationclient.internal.creation.AppClientComponentCreationOperation;
-import org.eclipse.jst.j2ee.applicationclient.internal.creation.ApplicationClientNatureRuntime;
-import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveConstants;
-import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveManifestImpl;
-import org.eclipse.jst.j2ee.datamodel.properties.IAppClientComponentCreationDataModelProperties;
-import org.eclipse.jst.j2ee.datamodel.properties.IEarComponentCreationDataModelProperties;
-import org.eclipse.jst.j2ee.datamodel.properties.IJ2EEComponentCreationDataModelProperties;
-import org.eclipse.jst.j2ee.ejb.datamodel.properties.IEjbComponentCreationDataModelProperties;
-import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
-import org.eclipse.jst.j2ee.internal.earcreation.EarComponentCreationDataModelProvider;
-import org.eclipse.jst.j2ee.internal.ejb.archiveoperations.EjbComponentCreationDataModelProvider;
-import org.eclipse.jst.j2ee.internal.ejb.archiveoperations.EjbComponentCreationOperation;
-import org.eclipse.jst.j2ee.internal.jca.operations.ConnectorComponentCreationOperation;
-import org.eclipse.jst.j2ee.internal.jca.operations.IConnectorComponentCreationDataModelProperties;
-import org.eclipse.jst.j2ee.internal.web.archive.operations.WebComponentCreationDataModelProvider;
-import org.eclipse.jst.j2ee.internal.web.archive.operations.WebComponentCreationOperation;
-import org.eclipse.jst.j2ee.web.datamodel.properties.IWebComponentCreationDataModelProperties;
-import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.tests.LogUtility;
-import org.eclipse.wst.common.tests.OperationTestCase;
-import org.eclipse.wst.common.tests.ProjectUtility;
-import org.eclipse.wst.common.tests.TaskViewUtility;
-
-public abstract class AbstractJ2EEComponentCreationTest extends TestCase {
-	protected static final String ILLEGAL_PROJECT_NAME_MESSAGE = "Illegal project name: ";
-	protected static final String UNEXPECTED_ERROR_MESSAGE = "Unexpected exception";
-	protected static final String TEST_FAILED_MESSAGE = "Test fails Exception should of been trown";
-	protected static final String MANIFEST_CLASS_NAME = "Junit_Test_Dummy_Class";
-	protected static final String MANIFEST_WRITE_ERROR = "Could not write to manifest test failed";
-	protected static final String MANIFEST_LOCK_ERROR = "Manifest IO error - File could be locked";
-	protected static final String MANIFEST_CORE_ERROR = "Java core error";
-	protected String projectName = null;
-	public static final int APPLICATION_CLIENT_MODULE = 0;
-	public static final int WEB_MODULE = 1;
-	public static final int EJB_MODULE = 2;
-	public static final int EAR_MODULE = 3;
-	public IProject ejbproject;
-	public IProject earproject;
-
-	public AbstractJ2EEComponentCreationTest(String name) {
-		super(name);
-	}
-
-	public void createValidComponentNameCreationWithAlphabetChars(
-		int MODULE_TYPE,
-		int j2eeVersion,
-		boolean isMixedChars)
-		throws Exception {
-
-		LogUtility.getInstance().resetLogging();
-		IDataModel model = null;
-		switch (MODULE_TYPE) {
-			case WEB_MODULE :
-				{
-					if (!isMixedChars)
-						model = setupWebComponent(RandomObjectGenerator.createCorrectRandomProjectNames(), j2eeVersion);
-					else
-						model =
-							setupWebComponent(
-								RandomObjectGenerator.createCorrectRandomProjectNamesAllChars(),
-								j2eeVersion);
-					break;
-				}
-			case EJB_MODULE :
-				{
-					if (!isMixedChars)
-						model = setupEJBComponent(RandomObjectGenerator.createCorrectRandomProjectNames(), j2eeVersion);
-					else
-						model =
-							setupEJBComponent(
-								RandomObjectGenerator.createCorrectRandomProjectNamesAllChars(),
-								j2eeVersion);
-					break;
-				}
-			case APPLICATION_CLIENT_MODULE :
-				{
-					if (!isMixedChars)
-						model =
-							setupApplicationClientComponent(
-								RandomObjectGenerator.createCorrectRandomProjectNames(),
-								j2eeVersion);
-					else
-						model =
-							setupApplicationClientComponent(
-								RandomObjectGenerator.createCorrectRandomProjectNamesAllChars(),
-								j2eeVersion);
-					break;
-				}
-			case EAR_MODULE :
-				{
-					if (!isMixedChars)
-						model = setupEARComponent(RandomObjectGenerator.createCorrectRandomProjectNames(), j2eeVersion);
-					else
-						model =
-							setupEARComponent(
-								RandomObjectGenerator.createCorrectRandomProjectNamesAllChars(),
-								j2eeVersion);
-					break;
-				}
-		}
-
-		LogUtility.getInstance().verifyNoWarnings();
-		checkValidDataModel(model);
-	}
-
-	/**
-	 * @param model
-	 */
-	protected void checkValidDataModel(IDataModel model) {
-        //TODO need a verifier for new IDataModel
-	/*	DataModelVerifier verifier = DataModelVerifierFactory.getInstance().createVerifier(model);
-		try {
-			verifier.verify(model);
-		} catch (Exception e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		}*/
-
-	}
-
-	protected static void checkVaildProjectName(String projectName) {
-		ProjectUtility.verifyProject(projectName, true);
-		//To do verify
-	}
-
-	public IDataModel setupEJBComponent(String aProjectName, int j2eeVersion) throws Exception {
-		projectName = aProjectName;
-		IProject javaProject = ProjectUtility.getProject(projectName);
-		IDataModel model = DataModelFactory.createDataModel(new EjbComponentCreationDataModelProvider());
-		model.setProperty(IEjbComponentCreationDataModelProperties.PROJECT_NAME, javaProject.getName());
-		//model.setProperty(EjbComponentCreationDataModel.PROJECT_LOCATION, javaProject.getLocation());
-		model.setIntProperty(IEjbComponentCreationDataModelProperties.COMPONENT_VERSION, j2eeVersion);
-		createEJBComponent(model, null);
-		return model;
-	}
-
-	public IDataModel setupEARComponent(String aProjectName, int j2eeVersion) throws Exception {
-		projectName = aProjectName;
-		IProject earProject = ProjectUtility.getProject(aProjectName);
-		IDataModel earDataModel = DataModelFactory.createDataModel(new EarComponentCreationDataModelProvider());
-		earDataModel.setProperty(IEarComponentCreationDataModelProperties.PROJECT_NAME, aProjectName);
-		//earDataModel.setProperty(EARComponentCreationDataModel.PROJECT_LOCATION, earProject.getLocation());
-		earDataModel.setIntProperty(IEarComponentCreationDataModelProperties.COMPONENT_VERSION, j2eeVersion);
-		OperationTestCase.runAndVerify(earDataModel);
-		return earDataModel;
-	}
-
-	public IDataModel setupWebComponent(String aProjectName, int j2eeVersion) throws Exception {
-		projectName = aProjectName;
-		IProject javaProject = ProjectUtility.getProject(projectName);
-        IDataModel model = DataModelFactory.createDataModel(new WebComponentCreationDataModelProvider());
-		model.setProperty(IWebComponentCreationDataModelProperties.PROJECT_NAME, javaProject.getName());
-		//model.setProperty(WebComponentCreationDataModel.PROJECT_LOCATION, javaProject.getLocation());
-		model.setIntProperty(IWebComponentCreationDataModelProperties.COMPONENT_VERSION, j2eeVersion);
-		createWebComponent(model, null);
-		return model;
-	}
-
-	public IDataModel setupApplicationClientComponent(String aProjectName, int j2eeVersion)
-		throws Exception {
-		projectName = aProjectName;
-		IProject javaProject = ProjectUtility.getProject(projectName);
-		IDataModel model = DataModelFactory.createDataModel(new AppClientComponentCreationDataModelProvider());
-		model.setProperty(IAppClientComponentCreationDataModelProperties.PROJECT_NAME, javaProject.getName());
-		//model.setProperty(AppClientComponentCreationDataModel.PROJECT_LOCATION, javaProject.getLocation());
-		model.setIntProperty(IAppClientComponentCreationDataModelProperties.COMPONENT_VERSION, j2eeVersion);
-		createAppClientComponent(model, null);
-		return model;
-	}
-
-	public void testJavaCreation() throws Exception {
-		createEJBComponent("testEAR", "testEJB", J2EEVersionConstants.J2EE_1_2_ID, J2EEVersionConstants.EJB_1_1_ID);
-	}
-
-	/**
-	 * Create a project and its containing EAR with default model settings
-	 * @param projectType
-	 * @param earProject
-	 * @param projectName
-	 * @return
-	 * @throws Exception
-	 */
-	public static IProject createComponent(int projectType, String earProject, boolean createEAR, String projectName) throws Exception {
-		if (createEAR)
-			ProjectUtility.deleteProjectIfExists(earProject);
-		ProjectUtility.deleteProjectIfExists(projectName);
-
-		if (earProject != null && createEAR) {
-			IDataModel earCompCreationDataModel = DataModelFactory.createDataModel(new EarComponentCreationDataModelProvider());
-            earCompCreationDataModel.setProperty(IEarComponentCreationDataModelProperties.PROJECT_NAME, earProject);
-            earCompCreationDataModel.getDefaultOperation().execute(new NullProgressMonitor(), null);
-			ProjectUtility.verifyProject(earProject, true);
-		}
-
-		IDataModel projectCreationDataModel = null;
-		switch (projectType) {
-			case EJB_MODULE :
-				projectCreationDataModel =DataModelFactory.createDataModel(new EjbComponentCreationDataModelProvider());
-				break;
-			case WEB_MODULE :
-				projectCreationDataModel = DataModelFactory.createDataModel(new WebComponentCreationDataModelProvider());
-				break;
-			case APPLICATION_CLIENT_MODULE :
-				projectCreationDataModel =DataModelFactory.createDataModel(new AppClientComponentCreationDataModelProvider());
-				break;
-		}
-		if (earProject != null) {
-			projectCreationDataModel.setBooleanProperty(IJ2EEComponentCreationDataModelProperties.ADD_TO_EAR, true);
-			projectCreationDataModel.setProperty(IJ2EEComponentCreationDataModelProperties.EAR_COMPONENT_NAME, earProject);
-		}
-		projectCreationDataModel.setProperty(IJ2EEComponentCreationDataModelProperties.PROJECT_NAME, projectName);
-		projectCreationDataModel.getDefaultOperation().execute(new NullProgressMonitor(), null);
-		ProjectUtility.verifyProject(projectName, true);
-
-		return ProjectUtility.getProject(projectName);
-	}
-
-
-	public static IProject createEARComponent(String earProject) throws Exception {
-		IDataModel projectCreationModel = DataModelFactory.createDataModel(new EarComponentCreationDataModelProvider());
-		projectCreationModel.setProperty(IEarComponentCreationDataModelProperties.PROJECT_NAME, earProject);
-		return createEARComponent(projectCreationModel);
-	}
-
-	public static IProject createEARComponent(IDataModel model) throws Exception {
-		EARComponentCreationOperation op = new EARComponentCreationOperation(model);
-		op.execute(new NullProgressMonitor(), null);
-		ProjectUtility.verifyProject(model.getStringProperty(IEarComponentCreationDataModelProperties.PROJECT_NAME), true);
-		return ProjectUtilities.getProject(model.getStringProperty(IEarComponentCreationDataModelProperties.PROJECT_NAME));
-	}
-
-	public static IProject createEJBComponent(IDataModel model, IProject earProject) throws Exception {
-		if (earProject != null) {
-			model.setBooleanProperty(IEjbComponentCreationDataModelProperties.ADD_TO_EAR, true);
-			model.setProperty(IEjbComponentCreationDataModelProperties.EAR_COMPONENT_NAME, earProject.getName());
-		}
-		EjbComponentCreationOperation ejbOp = new EjbComponentCreationOperation(model);
-		ejbOp.execute(new NullProgressMonitor(), null);
-		ProjectUtility.verifyProject(model.getStringProperty(IEjbComponentCreationDataModelProperties.PROJECT_NAME), true);
-		return ProjectUtilities.getProject(model.getStringProperty(IEjbComponentCreationDataModelProperties.PROJECT_NAME));
-	}
-
-	public static void createEARComponent(IDataModel  model, boolean notImport) throws Exception {
-		model.setBooleanProperty(IEarComponentCreationDataModelProperties.CREATE_DEFAULT_FILES, notImport);
-		EARComponentCreationOperation op = new EARComponentCreationOperation(model);
-		op.execute(new NullProgressMonitor(), null);
-		ProjectUtility.verifyProject(model.getStringProperty(IEarComponentCreationDataModelProperties.PROJECT_NAME), true);
-	}
-
-	public static void createWebComponent(IDataModel model, IProject earProject) throws Exception {
-        if (earProject != null) {
-            model.setBooleanProperty(IWebComponentCreationDataModelProperties.ADD_TO_EAR, true);
-            model.setProperty(IWebComponentCreationDataModelProperties.EAR_COMPONENT_NAME, earProject.getName());
-        }
-		WebComponentCreationOperation webOp = new WebComponentCreationOperation(model);
-		webOp.execute(new NullProgressMonitor(), null);
-		ProjectUtility.verifyProject(model.getStringProperty(IWebComponentCreationDataModelProperties.PROJECT_NAME), true);
-		TaskViewUtility.verifyNoErrors();
-	}
-
-	public static void createAppClientComponent(IDataModel model, IProject earProject) throws Exception {
-        if (earProject != null) {
-            model.setBooleanProperty(IAppClientComponentCreationDataModelProperties.ADD_TO_EAR, true);
-            model.setProperty(IAppClientComponentCreationDataModelProperties.EAR_COMPONENT_NAME, earProject.getName());
-        }
-		AppClientComponentCreationOperation appOp = new AppClientComponentCreationOperation(model);
-		appOp.execute(new NullProgressMonitor(), null);
-		ProjectUtility.verifyProject(model.getStringProperty(IAppClientComponentCreationDataModelProperties.PROJECT_NAME), true);
-	}
-
-	public static void createRarComponent(IDataModel model, IProject earProject)
-		throws Exception {
-		if (earProject != null) {
-			model.setBooleanProperty(IConnectorComponentCreationDataModelProperties.ADD_TO_EAR, true);
-			model.setProperty(IConnectorComponentCreationDataModelProperties.EAR_COMPONENT_NAME, earProject.getName());
-		}
-		ConnectorComponentCreationOperation rarOp = new ConnectorComponentCreationOperation(model);
-		rarOp.execute(new NullProgressMonitor(), null);
-		ProjectUtility.verifyProject(model.getStringProperty(IConnectorComponentCreationDataModelProperties.PROJECT_NAME), true);
-	}
-
-	public static IProject createEJBComponent(String earName, String ejbName, int j2eeEARVersion, int j2eeEJBVersion)
-		throws Exception {
-		ProjectUtility.deleteAllProjects();
-		IDataModel model = null;
-        IDataModel ejbDataModel = null;
-		if (earName != null) {
-			IProject earProject = ProjectUtility.getProject(earName);
-			model = DataModelFactory.createDataModel(new EarComponentCreationDataModelProvider());
-			model.setProperty(IEarComponentCreationDataModelProperties.PROJECT_NAME, earName);
-			//model.setProperty(EARComponentCreationDataModel.PROJECT_LOCATION, earProject.getLocation());
-			model.setIntProperty(IEarComponentCreationDataModelProperties.COMPONENT_VERSION, j2eeEARVersion);
-			EARComponentCreationOperation op = new EARComponentCreationOperation(model);
-
-			IProject ejbProject = ProjectUtility.getProject(ejbName);
-			ejbDataModel = DataModelFactory.createDataModel(new EjbComponentCreationDataModelProvider());
-			ejbDataModel.setProperty(IEjbComponentCreationDataModelProperties.PROJECT_NAME, ejbName);
-			//ejbDataModel.setProperty(EjbComponentCreationDataModel.PROJECT_LOCATION, ejbProject.getLocation());
-			ejbDataModel.setIntProperty(IEjbComponentCreationDataModelProperties.COMPONENT_VERSION, j2eeEJBVersion);
-			IProject ejbp = createEJBComponent(ejbDataModel, ProjectUtilities.getProject(model.getStringProperty(IEarComponentCreationDataModelProperties.PROJECT_NAME)));
-
-		}
-        return ProjectUtilities.getProject(ejbDataModel.getStringProperty(IEjbComponentCreationDataModelProperties.PROJECT_NAME));
-	}
-
-	public static void addJavaMainClassToApplicationModel(IProject appProject) {
-		ApplicationClientNatureRuntime runtime = ApplicationClientNatureRuntime.getRuntime(appProject);
-		IFile file = runtime.getEMFRoot().getFile(new Path(ArchiveConstants.MANIFEST_URI));
-		ArchiveManifestImpl manifest = null;
-		InputStream inputStream = null;
-		try {
-			inputStream = file.getContents();
-			manifest = new ArchiveManifestImpl(inputStream);
-		} catch (IOException e) {
-			new Exception(MANIFEST_LOCK_ERROR);
-		} catch (CoreException e) {
-			new Exception(MANIFEST_CORE_ERROR);
-		} finally {
-			if (null != inputStream) {
-				try {
-					inputStream.close();
-				} catch (IOException ex) {
-				}
-			}
-		}
-		manifest.setMainClass(MANIFEST_CLASS_NAME);
-		try {
-			//attempt with manifest dataObject -- J2EEProjectUtilities.writeManifest(appProject, manifest);
-		} catch (Exception e) {
-			new Exception(MANIFEST_WRITE_ERROR);
-		}
-	}
-
-	public void testAddingEJBtoEarModule() throws Exception {
-		ProjectUtility.deleteAllProjects();
-		setupEARDataObject(RandomObjectGenerator.createCorrectRandomProjectNames(), J2EEVersionConstants.J2EE_1_3_ID);
-
-	}
-
-	public String setupEARDataObject(String aProjectName, int j2eeVersion) throws Exception {
-		projectName = aProjectName;
-		IProject earProject = ProjectUtility.getProject(aProjectName);
-		IDataModel earDataModel = DataModelFactory.createDataModel(new EarComponentCreationDataModelProvider());
-		earDataModel.setProperty(IEarComponentCreationDataModelProperties.PROJECT_NAME, aProjectName);
-		//earDataModel.setProperty(EARComponentCreationDataModel.PROJECT_LOCATION, earProject.getLocation());
-		//String projectName = setupEJBProject(RandomObjectGenerator.createCorrectRandomProjectNames(), j2eeVersion);
-		IProject ejbProject = ProjectUtility.getProject(projectName);
-		ArrayList list = new ArrayList();
-		list.add(ejbProject);
-		earDataModel.setProperty(AddArchiveProjectsToEARDataModel.MODULE_LIST, list);
-		earDataModel.setIntProperty(IEarComponentCreationDataModelProperties.COMPONENT_VERSION, j2eeVersion);
-		earDataModel.getProperty(AddArchiveProjectsToEARDataModel.MODULE_MODELS);
-		return earDataModel.getStringProperty(IEarComponentCreationDataModelProperties.PROJECT_NAME);
-	}
-
-	public AbstractJ2EEComponentCreationTest() {
-		super();
-	}
-
-}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/J2EEFlexibleProjectCreationOperationTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/J2EEFlexibleProjectCreationOperationTest.java
deleted file mode 100644
index fcdc496..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/J2EEFlexibleProjectCreationOperationTest.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package org.eclipse.wtp.j2ee.headless.tests.j2ee.operations;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.jst.j2ee.application.internal.operations.FlexibleJavaProjectCreationDataModelProvider;
-import org.eclipse.jst.j2ee.project.datamodel.properties.IFlexibleJavaProjectCreationDataModelProperties;
-import org.eclipse.jst.j2ee.tests.modulecore.AllTests;
-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.plugin.AllPluginTests;
-
-public class J2EEFlexibleProjectCreationOperationTest extends OperationTestCase {
-    
-    public static String DEFAULT_PROJECT_NAME = "SimpleFlexibleProject";
-    
-    public static Test suite() {
-        TestSuite suite = new TestSuite();
-        suite.addTestSuite(J2EEFlexibleProjectCreationOperationTest.class);
-        return suite;
-    }
-    
-    public void testDefaults() throws Exception {
-		AllPluginTests.createJONASRuntime();
-        createSimpleProject(DEFAULT_PROJECT_NAME);
-    }
-
-    public void createSimpleProject(String projectName) throws Exception {
-		IDataModel dataModel = getProjectCreationDataModel();
-        dataModel.setProperty(IFlexibleJavaProjectCreationDataModelProperties.PROJECT_NAME, projectName);
-		setServerTargetProperty(dataModel);
-        runAndVerify(dataModel);
-    }
-    
-    public IDataModel getProjectCreationDataModel(){
-		return DataModelFactory.createDataModel(new FlexibleJavaProjectCreationDataModelProvider());
-    }
-	/**
-	 * @param dataModel
-	 */
-	public void setServerTargetProperty(IDataModel dataModel) {
-		dataModel.setProperty(IFlexibleJavaProjectCreationDataModelProperties.SERVER_TARGET_ID, AllTests.JONAS_TOMCAT_RUNTIME.getId());
-	}
-
-}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/ModuleExportOperationTestCase.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/ModuleExportOperationTestCase.java
deleted file mode 100644
index 28dbed7..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/ModuleExportOperationTestCase.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- * 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.io.File;
-import java.io.IOException;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.resources.IProject;
-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.appclient.operations.AppClientExportOperationTest;
-import org.eclipse.wtp.j2ee.headless.tests.ejb.operations.EJBExportOperationTest;
-import org.eclipse.wtp.j2ee.headless.tests.jca.operations.RARExportOperationTest;
-import org.eclipse.wtp.j2ee.headless.tests.plugin.HeadlessTestsPlugin;
-import org.eclipse.wtp.j2ee.headless.tests.web.operations.WebExportOperationTest;
-
-/**
- * @author Administrator
- * 
- * To change the template for this generated type comment go to Window - Preferences - Java - Code
- * Generation - Code and Comments
- */
-public abstract class ModuleExportOperationTestCase extends OperationTestCase {
-
-	protected boolean exportSourceFiles = false;
-	protected boolean overwriteExisting = false;
-	protected boolean dataModelShouldBeValid = true;
-
-	public final String TESTS_OUTPUT_PATH;
-
-	public static Test suite() {
-		TestSuite suite = new TestSuite();
-		suite.addTestSuite(RARExportOperationTest.class);
-		suite.addTestSuite(EJBExportOperationTest.class);
-		suite.addTestSuite(WebExportOperationTest.class);
-		suite.addTestSuite(AppClientExportOperationTest.class);
-		return suite;
-	}
-
-	public ModuleExportOperationTestCase(String name) {
-		super(name);
-
-		String relativeOutputTestsPath = "TestData" + File.separator + getOutputDirectory() + File.separator;
-		TESTS_OUTPUT_PATH = getOutputPath(relativeOutputTestsPath);
-	}
-	
-	public String getOutputPath(String relPath) {
-		try{
-			return ProjectUtility.getFullFileName(HeadlessTestsPlugin.getDefault(),relPath);
-			} catch(IOException e) {
-				e.printStackTrace();
-			}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.OperationTestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		super.setUp();
-		exportSourceFiles = false;
-		overwriteExisting = false;
-	}
-
-	public String getOutputDirectory(){
-	    return "testOutput";
-	}
-	protected abstract ModuleImportOperationTestCase getImportTestCase();
-	protected abstract IDataModel getModelInstance();
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleExportOperationTestCase#getExportableProjects()
-	 */
-	protected IProject[] getExportableProjects() throws Exception {
-		ProjectUtility.deleteAllProjects();
-		ModuleImportOperationTestCase importTestCase = getImportTestCase(); 
-		importTestCase.testAllImportTestCases();
-
-		// if the projects aren't created successfully, the previous
-		// line will fail so there's no need to verify
-		return ProjectUtility.getAllProjects();
-	}
-
-	public void testExport(String projectName, String filename) throws Exception {
-
-		IDataModel dataModel = getModelInstance();
-//		dataModel.setProperty(J2EEModuleExportDataModel.ARCHIVE_DESTINATION, TESTS_OUTPUT_PATH + filename);
-//		dataModel.setProperty(J2EEModuleExportDataModel.PROJECT_NAME, projectName);
-//		dataModel.setBooleanProperty(J2EEModuleExportDataModel.EXPORT_SOURCE_FILES, exportSourceFiles);
-//		dataModel.setBooleanProperty(J2EEModuleExportDataModel.OVERWRITE_EXISTING, overwriteExisting);
-
-		if (dataModelShouldBeValid)
-			runAndVerify(dataModel);
-		else
-			verifyInvalidDataModel(dataModel);
-	}
-
-	public void testAllWithExportSourceFilesWithOverwriteExisting() throws Exception {
-		exportSourceFiles = true;
-		overwriteExisting = true;
-
-		testAllExportTestCases();
-	}
-
-	public void testAllWithExportSourceFilesWithoutOverwriteExisting() throws Exception {
-		exportSourceFiles = true;
-		overwriteExisting = false;
-
-		testAllExportTestCases();
-	}
-
-	public void testAllWithoutExportSourceFilesWithoutOverwriteExisting() throws Exception {
-		exportSourceFiles = false;
-		overwriteExisting = false;
-
-		testAllExportTestCases();
-	}
-
-	public void testAllWithoutExportSourceFilesWithOverwriteExisting() throws Exception {
-		exportSourceFiles = false;
-		overwriteExisting = true;
-
-		testAllExportTestCases();
-	}
-
-//	public void testOverwriteProjectExportFail() throws Exception {
-//
-//		testAllWithoutExportSourceFilesWithoutOverwriteExisting();
-//		dataModelShouldBeValid = false;
-//		testAllWithoutExportSourceFilesWithoutOverwriteExisting();
-//	}
-
-	public void testOverwriteProjectExportSucceed() throws Exception {
-
-		testAllWithoutExportSourceFilesWithOverwriteExisting();
-		testAllWithoutExportSourceFilesWithOverwriteExisting();
-	}
-
-	public void testAllExportTestCases() throws Exception {
-
-		File exportDirectory = new File(TESTS_OUTPUT_PATH);
-		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(projects[i].getName(), getFileName(projects[i].getName()));
-		}
-	}
-
-	public String getFileName(String baseName) {
-		StringBuffer result = new StringBuffer(baseName);
-		result.append((exportSourceFiles) ? "_withSource" : "_withoutSource").append(getModuleExportFileExt());
-		return result.toString();
-	}
-
-	/**
-	 * @return
-	 */
-	public String getModuleExportFileExt() {
-		return ".jar";
-	}
-}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/ModuleImportOperationTestCase.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/ModuleImportOperationTestCase.java
deleted file mode 100644
index 1384490..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/ModuleImportOperationTestCase.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * 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.io.File;
-import java.util.List;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.jst.j2ee.datamodel.properties.IJ2EEModuleImportDataModelProperties;
-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.appclient.operations.AppClientImportOperationTest;
-import org.eclipse.wtp.j2ee.headless.tests.ejb.operations.EJBImportOperationTest;
-import org.eclipse.wtp.j2ee.headless.tests.jca.operations.RARImportOperationTest;
-import org.eclipse.wtp.j2ee.headless.tests.plugin.HeadlessTestsPlugin;
-import org.eclipse.wtp.j2ee.headless.tests.web.operations.WebImportOperationTest;
-
-// TODO delete
-/**
- * @deprecated
- */
-public abstract class ModuleImportOperationTestCase extends OperationTestCase {
-
-	protected boolean isBinary = false;
-	protected boolean overwriteProject = false;
-	protected boolean dataModelShouldBeValid = true;
-	public String TESTS_PATH;
-
-
-	public static Test suite() {
-		TestSuite suite = new TestSuite();
-		suite.addTestSuite(RARImportOperationTest.class);
-		suite.addTestSuite(EJBImportOperationTest.class);
-		suite.addTestSuite(WebImportOperationTest.class);
-		suite.addTestSuite(AppClientImportOperationTest.class);
-		return suite;
-	}
-
-	public ModuleImportOperationTestCase(String name) {
-		super(name);
-		TESTS_PATH = "TestData" + File.separator + getDirectory() + File.separator;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.OperationTestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		super.setUp();
-		isBinary = false;
-		overwriteProject = false;
-		dataModelShouldBeValid = true;
-	}
-
-	protected abstract String getDirectory();
-
-	protected abstract IDataModel getModelInstance();
-
-	public void testImport(String projectName, String filename) throws Exception {
-
-		IDataModel dataModel = getModelInstance();
-		dataModel.setProperty(IJ2EEModuleImportDataModelProperties.FILE_NAME, filename);
-		dataModel.setProperty(IJ2EEModuleImportDataModelProperties.PROJECT_NAME, projectName);
-		setServerTargetProperty(dataModel);
-		// TODO revisit once refactorings are completed
-		// dataModel.setBooleanProperty(J2EEImportDataModel.CREATE_BINARY_PROJECT, isBinary);
-		// dataModel.setBooleanProperty(IJ2EEModuleImportDataModelProperties.OVERWRITE_PROJECT,
-		// overwriteProject);
-
-		if (dataModelShouldBeValid)
-			runAndVerify(dataModel);
-		else
-			verifyInvalidDataModel(dataModel);
-	}
-
-	/**
-	 * @param dataModel
-	 */
-	public void setServerTargetProperty(IDataModel dataModel) {
-		// dataModel.setProperty(J2EEModuleImportDataModel.SERVER_TARGET_ID,
-		// AllPluginTests.JONAS_SERVER.getId());
-	}
-
-	public void testAllBinaryImportTestCases() throws Exception {
-		isBinary = true;
-		testAllImportTestCases();
-	}
-
-	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('\\') + 1, jarName.length() - 4);
-			testImport(projectName, jarName);
-		}
-	}
-
-	/**
-	 * @return
-	 */
-	protected List getImportableArchiveFileNames() {
-		return ProjectUtility.getJarsInDirectory(HeadlessTestsPlugin.getDefault(), TESTS_PATH);
-	}
-
-	public void testBadFileName() throws Exception {
-
-		dataModelShouldBeValid = false;
-		testImport("BobTheProject", "BobTheFile");
-	}
-
-	public void testOverwriteProjectImportFail() throws Exception {
-
-		overwriteProject = false;
-		testAllImportTestCases();
-		dataModelShouldBeValid = false;
-		testAllImportTestCases();
-	}
-
-	public void testOverwriteProjectImportSucceed() throws Exception {
-
-		overwriteProject = true;
-		testAllImportTestCases();
-		testAllImportTestCases();
-	}
-
-}
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
deleted file mode 100644
index 8c37058..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/ModuleProjectCreationOperationTest.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package org.eclipse.wtp.j2ee.headless.tests.j2ee.operations;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.jst.j2ee.datamodel.properties.IJ2EEComponentCreationDataModelProperties;
-import org.eclipse.jst.j2ee.internal.earcreation.EarComponentCreationDataModelProvider;
-import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPOperationDataModel;
-import org.eclipse.wst.common.tests.DataModelVerifier;
-import org.eclipse.wst.common.tests.OperationTestCase;
-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.verifiers.DataModelVerifierFactory;
-import org.eclipse.wtp.j2ee.headless.tests.jca.operations.ConnectorProjectCreationOperationTest;
-import org.eclipse.wtp.j2ee.headless.tests.web.operations.WebProjectCreationOperationTest;
-
-public abstract class ModuleProjectCreationOperationTest extends OperationTestCase {
-    
-    public static String DEFAULT_PROJECT_NAME = "SimpleProject";
-    public static String DEFAULT_EAR_PROJECT_NAME = "SimpleEARProject";
-	public static String DEFAULT_COMPONENT_NAME = "SimpleComponent";
-	public static String DEFAULT_EAR_COMPONENT_NAME = "SimpleEARComponent";
-    
-    /**
-	 * @param name
-	 */
-	public ModuleProjectCreationOperationTest(String name) {
-		super(name);
-		// TODO Auto-generated constructor stub
-	}
-
-	public static Test suite() {
-        TestSuite suite = new TestSuite();
-        suite.addTestSuite(AppClientProjectCreationOperationTest.class);
-        suite.addTestSuite(EJBProjectCreationOperationTest.class);
-        suite.addTestSuite(WebProjectCreationOperationTest.class); 
-        suite.addTestSuite(ConnectorProjectCreationOperationTest.class); 
-        return suite;
-    }
-    
-    public void testDefaults() throws Exception {
-        createSimpleModule(DEFAULT_COMPONENT_NAME);
-    }
-
-    private void createSimpleEARModule(String componentName) throws Exception {
-		IDataModel dataModel = DataModelFactory.createDataModel(new EarComponentCreationDataModelProvider());
-        dataModel.setProperty(IJ2EEComponentCreationDataModelProperties.COMPONENT_NAME, componentName);
-        runAndVerify(dataModel);
-	}
-
-	public void createSimpleModule(String componentName) throws Exception {
-        IDataModel dataModel = getComponentCreationDataModel();
-        dataModel.setProperty(IJ2EEComponentCreationDataModelProperties.COMPONENT_NAME, componentName);
-        dataModel.setBooleanProperty(IJ2EEComponentCreationDataModelProperties.ADD_TO_EAR, true);
-        runAndVerify(dataModel,false,true);
-    }
-
-	public abstract IDataModel getComponentCreationDataModel();
-
-	public static void verifyDataModel(WTPOperationDataModel dataModel) throws Exception{
-	    DataModelVerifier verifier = DataModelVerifierFactory.getInstance().createVerifier(dataModel);
-	    verifier.verify(dataModel);
-	}
-
-}
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
deleted file mode 100644
index f825f35..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/RandomObjectGenerator.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * 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/verifiers/AppClientExportDataModelVerifier.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/AppClientExportDataModelVerifier.java
deleted file mode 100644
index cafda98..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/AppClientExportDataModelVerifier.java
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * 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;
-
-/**
- * @author Administrator
- *
- * To change the template for this generated type comment go to
- * Window - Preferences - Java - Code Generation - Code and Comments
- */
-public class AppClientExportDataModelVerifier extends ModuleExportDataModelVerifier {
- 
-	
-}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/AppClientImportDataModelVerifier.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/AppClientImportDataModelVerifier.java
deleted file mode 100644
index 59845ce..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/AppClientImportDataModelVerifier.java
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * 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;
-
-/**
- * @author Administrator
- *
- * To change the template for this generated type comment go to
- * Window - Preferences - Java - Code Generation - Code and Comments
- */
-public class AppClientImportDataModelVerifier extends ModuleImportDataModelVerifier {
-
-}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/AppClientProjectCreationDataModelVerifier.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/AppClientProjectCreationDataModelVerifier.java
deleted file mode 100644
index 6938b9c..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/AppClientProjectCreationDataModelVerifier.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * 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.jem.util.emf.workbench.ProjectUtilities;
-import org.eclipse.jst.j2ee.applicationclient.componentcore.util.AppClientArtifactEdit;
-import org.eclipse.jst.j2ee.client.ApplicationClient;
-import org.eclipse.jst.j2ee.datamodel.properties.IAppClientComponentCreationDataModelProperties;
-import org.eclipse.wst.common.componentcore.resources.ComponentHandle;
-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 class AppClientProjectCreationDataModelVerifier extends ModuleProjectCreationDataModelVerifier {
- /* (non-Javadoc)
- * @see org.eclipse.wtp.j2ee.headless.tests.j2ee.verifiers.J2EEProjectCreationDataModelVerifier#verifyProjectCreationDataModel(com.ibm.etools.application.operations.J2EEProjectCreationDataModel)
- */
-	public void verifyProjectCreationDataModel(IDataModel model) {
-        Object key = new Object();
-		AppClientArtifactEdit appClientEdit = null;
-		
-        try {
-			ComponentHandle handle = ComponentHandle.create(ProjectUtilities.getProject(model.getStringProperty(IAppClientComponentCreationDataModelProperties.PROJECT_NAME)),model.getStringProperty(IAppClientComponentCreationDataModelProperties.COMPONENT_NAME));
-			Object dd = null;
-			appClientEdit = AppClientArtifactEdit.getAppClientArtifactEditForRead(handle);
-       		if(appClientEdit != null) 
-       			dd = (ApplicationClient) appClientEdit.getDeploymentDescriptorRoot();
-			Assert.assertNotNull("Deployment Descriptor Null", dd);
-        } finally {
-			if( appClientEdit != null )
-				appClientEdit.dispose();
-		}
-//        if (dataModel.getBooleanProperty(WebComponentCreationDataModel.ADD_TO_EAR)) {
-//            IProject earProject = dataModel.getEarComponentCreationDataModel().getTargetProject();
-//            EAREditModel ear = null;
-//            try {
-//                Assert.assertTrue("EAR doesn't exist:", earProject.exists());
-//                EARNatureRuntime runtime = EARNatureRuntime.getRuntime(earProject);
-//                //EMFWorkbenchContext emfWorkbenchContext = WorkbenchResourceHelper.createEMFContext(earProject, null);
-//                ear = (EAREditModel) runtime.getEditModelForRead(IEARNatureConstants.EDIT_MODEL_ID, key);
-//                ear.getModuleMapping(dataModel.getTargetProject());
-//                //TODO
-//            } finally {
-//                ear.releaseAccess(key);
-//            }
-//
-//        }
-    }
-}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/DataModelVerifierFactory.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/DataModelVerifierFactory.java
deleted file mode 100644
index 0e8bc89..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/DataModelVerifierFactory.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * 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.Map;
-
-import org.eclipse.wtp.j2ee.headless.tests.jca.verifiers.JCAExportDataModelVerifier;
-
-/**
- * @author Administrator
- * 
- * To change the template for this generated type comment go to Window - Preferences - Java - Code
- * Generation - Code and Comments
- */
-public class DataModelVerifierFactory extends org.eclipse.wst.common.tests.DataModelVerifierFactory {
-
-	public static org.eclipse.wst.common.tests.DataModelVerifierFactory getInstance() {
-		org.eclipse.wst.common.tests.DataModelVerifierFactory fact = org.eclipse.wst.common.tests.DataModelVerifierFactory.getInstance();
-		initJ2EEDataModelVerifiersMap(fact.getDataModelVerifiersMap());
-		return fact;
-	}
-
-	/**
-	 * @return Returns the dataModelVerifiersMap.
-	 */
-	protected static void initJ2EEDataModelVerifiersMap(Map verifierMap) {
-		
-			//verifierMap.put(EJBModuleImportDataModel.class.getName(), EJBImportDataModelVerifier.class.getName());
-			//verifierMap.put(ConnectorModuleImportDataModel.class.getName(),JCAImportDataModelVerifier.class.getName());
-			//verifierMap.put(WebModuleImportDataModel.class.getName(), WebImportDataModelVerifier.class.getName());
-			//verifierMap.put(AppClientModuleImportDataModel.class.getName(), AppClientImportDataModelVerifier.class.getName());
-			
-//			verifierMap.put(EJBModuleExportDataModel.class.getName(), EJBExportDataModelVerifier.class.getName());
-			verifierMap.put(JCAExportDataModelVerifier.class.getName(), JCAExportDataModelVerifier.class.getName());
-//			verifierMap.put(WebModuleExportDataModel.class.getName(), WebExportDataModelVerifier.class.getName());
-//			verifierMap.put(AppClientModuleExportDataModel.class.getName(), AppClientExportDataModelVerifier.class.getName());
-//TODO: add verifiers for new IDataModels			
-//			verifierMap.put(WebComponentCreationDataModel.class.getName(), WebProjectCreationDataModelVerifier.class.getName());
-//			verifierMap.put(EARComponentCreationDataModel.class.getName(), EARProjectCreationDataModelVerifier.class.getName());
-//			verifierMap.put(EjbComponentCreationDataModel.class.getName(), EJBProjectCreationDataModelVerifier.class.getName());
-//			verifierMap.put(AppClientComponentCreationDataModel.class.getName(),AppClientProjectCreationDataModelVerifier.class.getName());
-			
-//			verifierMap.put(FlexibleProjectCreationDataModel.class.getName(),FlexibleProjectCreationDataModelVerifier.class.getName());
-//			verifierMap.put(FlexibleJavaProjectCreationDataModel.class.getName(),FlexibleProjectCreationDataModelVerifier.class.getName());
-
-	}
-
-}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/EARExportDataModelVerifier.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/EARExportDataModelVerifier.java
deleted file mode 100644
index 4796997..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/EARExportDataModelVerifier.java
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * 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;
-
-/**
- * @author Administrator
- *
- * To change the template for this generated type comment go to
- * Window - Preferences - Java - Code Generation - Code and Comments
- */
-public class EARExportDataModelVerifier extends J2EEExportDataModelVerifier {
-
-}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/EARImportDataModelVerifier.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/EARImportDataModelVerifier.java
deleted file mode 100644
index 0c764a6..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/EARImportDataModelVerifier.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * 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.internal.operations.WTPOperationDataModel;
-
-/**
- * @author Administrator
- *
- * To change the template for this generated type comment go to
- * Window - Preferences - Java - Code Generation - Code and Comments
- */
-public class EARImportDataModelVerifier extends J2EEImportDataModelVerifier {
-
-    public void verify(WTPOperationDataModel model) throws Exception {
-        super.verify(model);
-//        EnterpriseApplicationImportDataModel importModel = (EnterpriseApplicationImportDataModel)model;
-//        List list = importModel.getEARFile().getModuleFiles();
-//        for (Iterator iter = list.iterator(); iter.hasNext();) {
-//            ModuleFile element = (ModuleFile) iter.next();
-//            String uri = element.getURI();
-//            ProjectUtility.verifyProject(uri.substring(0, uri.indexOf(".")), true);
-//        }
-    }
-    
-}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/EARProjectCreationDataModelVerifier.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/EARProjectCreationDataModelVerifier.java
deleted file mode 100644
index bd7782a..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/EARProjectCreationDataModelVerifier.java
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * 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;
-
-/**
- * @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 J2EEProjectCreationDataModelVerifier {
-
-}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/FlexibleProjectCreationDataModelVerifier.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/FlexibleProjectCreationDataModelVerifier.java
deleted file mode 100644
index 1e18ff8..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/FlexibleProjectCreationDataModelVerifier.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package org.eclipse.wtp.j2ee.headless.tests.j2ee.verifiers;
-
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.frameworks.datamodel.properties.IFlexibleProjectCreationDataModelProperties;
-import org.eclipse.wst.common.tests.DataModelVerifier;
-import org.eclipse.wst.common.tests.ProjectUtility;
-
-public class FlexibleProjectCreationDataModelVerifier extends DataModelVerifier {
-
-		
-	public void verify(IDataModel model) throws Exception {
-		super.verify(model);		
-		ProjectUtility.verifyProject(model.getStringProperty(IFlexibleProjectCreationDataModelProperties.PROJECT_NAME), true);
-
-	}
-
-		
-
-}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/J2EEExportDataModelVerifier.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/J2EEExportDataModelVerifier.java
deleted file mode 100644
index ddf3e82..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/J2EEExportDataModelVerifier.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * 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.internal.operations.WTPOperationDataModel;
-import org.eclipse.wst.common.tests.DataModelVerifier;
-
-/**
- * @author Administrator
- *
- * To change the template for this generated type comment go to
- * Window - Preferences - Java - Code Generation - Code and Comments
- */
-public class J2EEExportDataModelVerifier extends DataModelVerifier {
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wtp.j2ee.headless.tests.j2ee.verifiers.DataModelVerifier#verify(org.eclipse.wtp.common.operation.WTPOperationDataModel)
-	 */
-	public void verify(WTPOperationDataModel model) throws Exception {
-		super.verify(model);
-		
-//		String archiveDestination = model.getStringProperty(J2EEModuleExportDataModel.ARCHIVE_DESTINATION);
-//		File archive = new File(archiveDestination);
-//		Assert.assertTrue("The exported archive must exist.", archive.exists());
-	}
-
-}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/J2EEImportDataModelVerifier.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/J2EEImportDataModelVerifier.java
deleted file mode 100644
index 33080e2..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/J2EEImportDataModelVerifier.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * 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.core.resources.IProject;
-import org.eclipse.jst.j2ee.datamodel.properties.IJ2EEModuleImportDataModelProperties;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPOperationDataModel;
-import org.eclipse.wst.common.tests.DataModelVerifier;
-import org.eclipse.wst.common.tests.ProjectUtility;
-
-/**
- * @author Administrator
- * 
- * To change the template for this generated type comment go to Window - Preferences - Java - Code
- * Generation - Code and Comments
- */
-public class J2EEImportDataModelVerifier extends DataModelVerifier {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wtp.j2ee.headless.tests.j2ee.verifiers.DataModelVerifier#verify(org.eclipse.wtp.common.operation.WTPOperationDataModel)
-	 */
-	public void verify(WTPOperationDataModel model) throws Exception {
-
-		super.verify(model);
-
-		IProject project = ProjectUtility.verifyAndReturnProject(model.getStringProperty(IJ2EEModuleImportDataModelProperties.PROJECT_NAME), true);
-
-		// String serverTargetId =
-		// model.getStringProperty(IJ2EEModuleImportDataModelProperties.SERVER_TARGET_ID);
-		// IRuntime stt = ServerCore.getProjectProperties(project).getRuntimeTarget();
-		// /* fail because exactly one of the following is set */
-		// if (serverTargetId != null) {
-		// if (stt == null)
-		// Assert.fail("The server target of the project (Not Set) does not match that of the model
-		// (" + serverTargetId + ")");
-		// /*
-		// * we know that either stt == null && serverTargetId == null OR stt != null &&
-		// * serverTargetId != null
-		// */
-		// else
-		// Assert.assertEquals("The actual server target should match the model's server
-		// target.",serverTargetId,stt.getName());
-		// }
-
-	}
-
-}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/J2EEProjectCreationDataModelVerifier.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/J2EEProjectCreationDataModelVerifier.java
deleted file mode 100644
index 0ae7442..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/J2EEProjectCreationDataModelVerifier.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * 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.jst.j2ee.datamodel.properties.IJ2EEComponentCreationDataModelProperties;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.tests.DataModelVerifier;
-import org.eclipse.wst.common.tests.ProjectUtility;
-
-/**
- * @author Administrator
- *
- * To change the template for this generated type comment go to
- * Window - Preferences - Java - Code Generation - Code and Comments
- */
-public class J2EEProjectCreationDataModelVerifier extends DataModelVerifier {
-
-	public void verify(IDataModel model) throws Exception {
-		super.verify(model);		
-		ProjectUtility.verifyProject(model.getStringProperty(IJ2EEComponentCreationDataModelProperties.PROJECT_NAME), true);
-
-	}
-
-}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/ModuleExportDataModelVerifier.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/ModuleExportDataModelVerifier.java
deleted file mode 100644
index aa05d98..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/ModuleExportDataModelVerifier.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * 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.internal.operations.WTPOperationDataModel;
-
-/**
- * @author mdelder
- */
-public abstract class ModuleExportDataModelVerifier extends J2EEExportDataModelVerifier {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wtp.j2ee.headless.tests.j2ee.verifiers.J2EEExportDataModelVerifier#verify(org.eclipse.wtp.common.operation.WTPOperationDataModel)
-	 */
-	public final void verify(WTPOperationDataModel model) throws Exception {
-		super.verify(model);
-
-		doModuleSpecificVerification(model);
-	}
-
-	public void doModuleSpecificVerification(WTPOperationDataModel model) throws Exception {
-		
-	}
-}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/ModuleImportDataModelVerifier.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/ModuleImportDataModelVerifier.java
deleted file mode 100644
index 1a98ada..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/ModuleImportDataModelVerifier.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * 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.internal.operations.WTPOperationDataModel;
-
-/**
- * @author Administrator
- *
- * To change the template for this generated type comment go to
- * Window - Preferences - Java - Code Generation - Code and Comments
- */
-public abstract class ModuleImportDataModelVerifier extends J2EEImportDataModelVerifier {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wtp.j2ee.headless.tests.j2ee.verifiers.DataModelVerifier#verify(org.eclipse.wtp.common.operation.WTPOperationDataModel)
-	 */
-	public final void verify(WTPOperationDataModel model) throws Exception { 
-		super.verify(model);
-		
-		doModuleSpecificVerification(model);
-	}
-	
-	public void doModuleSpecificVerification(WTPOperationDataModel model) throws Exception {
-		
-	}
-}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/ModuleProjectCreationDataModelVerifier.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/ModuleProjectCreationDataModelVerifier.java
deleted file mode 100644
index b774600..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/ModuleProjectCreationDataModelVerifier.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * 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
- *
- * To change the template for this generated type comment go to
- * Window - Preferences - Java - Code Generation - Code and Comments
- */
-public abstract class ModuleProjectCreationDataModelVerifier extends J2EEProjectCreationDataModelVerifier {
-    /* (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);
-        verifyProjectCreationDataModel(model);
-    }
-
-    public abstract void verifyProjectCreationDataModel(IDataModel 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
deleted file mode 100644
index 0e30b0d..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/plugin/AllPluginTests.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * 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();
-		org.eclipse.wtp.j2ee.headless.tests.j2ee.verifiers.DataModelVerifierFactory.getInstance();
-	      addTest(org.eclipse.wtp.j2ee.headless.tests.ejb.operations.AllTests.suite());
-	      addTest(org.eclipse.wtp.j2ee.headless.tests.web.operations.AllTests.suite());
-	      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.jst.j2ee.tests.modulecore.AllTests.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/HeadlessTestsPlugin.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/plugin/HeadlessTestsPlugin.java
deleted file mode 100644
index 910baad..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/plugin/HeadlessTestsPlugin.java
+++ /dev/null
@@ -1,65 +0,0 @@
-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;
-
-/**
- * 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;
-		}
-	}
-
-	/**
-	 * Returns the plugin's resource bundle,
-	 */
-	public ResourceBundle getResourceBundle() {
-		return resourceBundle;
-	}
-}
diff --git a/tests/org.eclipse.jst.j2ee.tests/jcamodule-tests/org/eclipse/wtp/j2ee/headless/tests/jca/operations/AllTests.java b/tests/org.eclipse.jst.j2ee.tests/jcamodule-tests/org/eclipse/wtp/j2ee/headless/tests/jca/operations/AllTests.java
deleted file mode 100644
index 7347f87..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/jcamodule-tests/org/eclipse/wtp/j2ee/headless/tests/jca/operations/AllTests.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * 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 Tests");
-        addTest(ConnectorProjectCreationOperationTest.suite());
-      //  addTest(RARExportOperationTest.suite());
-      //  addTest(RARImportOperationTest.suite());
-    }
-    
-}
diff --git a/tests/org.eclipse.jst.j2ee.tests/jcamodule-tests/org/eclipse/wtp/j2ee/headless/tests/jca/operations/ConnectorProjectCreationOperationTest.java b/tests/org.eclipse.jst.j2ee.tests/jcamodule-tests/org/eclipse/wtp/j2ee/headless/tests/jca/operations/ConnectorProjectCreationOperationTest.java
deleted file mode 100644
index aa2070a..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/jcamodule-tests/org/eclipse/wtp/j2ee/headless/tests/jca/operations/ConnectorProjectCreationOperationTest.java
+++ /dev/null
@@ -1,34 +0,0 @@
-
-package org.eclipse.wtp.j2ee.headless.tests.jca.operations;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.jst.j2ee.internal.jca.operations.ConnectorComponentCreationDataModelProvider;
-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.ModuleProjectCreationOperationTest;
-
-public class ConnectorProjectCreationOperationTest extends ModuleProjectCreationOperationTest {
-    
-    /**
-	 * @param name
-	 */
-	public ConnectorProjectCreationOperationTest(String name) {
-		super(name);
-		// TODO Auto-generated constructor stub
-	}
-
-	public static Test suite() {
-        return new TestSuite(ConnectorProjectCreationOperationTest.class);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleProjectCreationOperationTest#getProjectCreationDataModel()
-     */
-    public IDataModel getComponentCreationDataModel() {
-        return DataModelFactory.createDataModel(new ConnectorComponentCreationDataModelProvider());
-    }
- 
-    
-}
diff --git a/tests/org.eclipse.jst.j2ee.tests/jcamodule-tests/org/eclipse/wtp/j2ee/headless/tests/jca/operations/RARExportOperationTest.java b/tests/org.eclipse.jst.j2ee.tests/jcamodule-tests/org/eclipse/wtp/j2ee/headless/tests/jca/operations/RARExportOperationTest.java
deleted file mode 100644
index 4478730..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/jcamodule-tests/org/eclipse/wtp/j2ee/headless/tests/jca/operations/RARExportOperationTest.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * 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 junit.framework.TestSuite;
-
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleExportOperationTestCase;
-import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleImportOperationTestCase;
-
-/**
- * @author Administrator
- *
- * To change the template for this generated type comment go to
- * Window - Preferences - Java - Code Generation - Code and Comments
- */
-public class RARExportOperationTest extends ModuleExportOperationTestCase {
-	
-	public RARExportOperationTest(String name) {
-		super(name);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleExportOperationTestCase#suite()
-	 */
-	public static Test suite() {
-		return new TestSuite(RARExportOperationTest.class);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleExportOperationTestCase#getModelInstance()
-	 */
-	protected IDataModel getModelInstance() {
-		return null;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleExportOperationTestCase#getImportTestCase()
-	 */
-	protected ModuleImportOperationTestCase getImportTestCase() { 
-		return new RARImportOperationTest("");
-	}
-	
-	/**
-	 * @return
-	 */
-	public String getModuleExportFileExt() {
-		return ".rar";
-	}
-
-}
diff --git a/tests/org.eclipse.jst.j2ee.tests/jcamodule-tests/org/eclipse/wtp/j2ee/headless/tests/jca/operations/RARImportOperationTest.java b/tests/org.eclipse.jst.j2ee.tests/jcamodule-tests/org/eclipse/wtp/j2ee/headless/tests/jca/operations/RARImportOperationTest.java
deleted file mode 100644
index e8e3be1..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/jcamodule-tests/org/eclipse/wtp/j2ee/headless/tests/jca/operations/RARImportOperationTest.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * 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 java.util.List;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.tests.ProjectUtility;
-import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleImportOperationTestCase;
-import org.eclipse.wtp.j2ee.headless.tests.plugin.HeadlessTestsPlugin;
-
-//TODO DELETE
-/**
- * @deprecated
- *
- */
-public class RARImportOperationTest extends ModuleImportOperationTestCase {
-
-	public static boolean isBinary = false;
-	public static boolean overwriteProject = false;
-
-	public static Test suite() {
-		return new TestSuite(RARImportOperationTest.class);
-	}
- 
-	public RARImportOperationTest(String name) {
-		super(name);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleImportOperationTestCase#getDirectory()
-	 */
-	protected String getDirectory() {
-		return "RARImportTests";
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleImportOperationTestCase#getModelInstance()
-	 */
-	protected IDataModel getModelInstance() {
-		return null;//new ConnectorModuleImportDataModel();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleImportOperationTestCase#getImportableArchiveFileNames()
-	 */
-	protected List getImportableArchiveFileNames() {
-		return ProjectUtility.getRarsInDirectory(HeadlessTestsPlugin.getDefault(),TESTS_PATH);
-	}
- 
-}
diff --git a/tests/org.eclipse.jst.j2ee.tests/jcamodule-tests/org/eclipse/wtp/j2ee/headless/tests/jca/verifiers/JCAExportDataModelVerifier.java b/tests/org.eclipse.jst.j2ee.tests/jcamodule-tests/org/eclipse/wtp/j2ee/headless/tests/jca/verifiers/JCAExportDataModelVerifier.java
deleted file mode 100644
index e0a9c25..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/jcamodule-tests/org/eclipse/wtp/j2ee/headless/tests/jca/verifiers/JCAExportDataModelVerifier.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * 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.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 JCAExportDataModelVerifier extends ModuleExportDataModelVerifier {
-
-}
diff --git a/tests/org.eclipse.jst.j2ee.tests/jcamodule-tests/org/eclipse/wtp/j2ee/headless/tests/jca/verifiers/JCAImportDataModelVerifier.java b/tests/org.eclipse.jst.j2ee.tests/jcamodule-tests/org/eclipse/wtp/j2ee/headless/tests/jca/verifiers/JCAImportDataModelVerifier.java
deleted file mode 100644
index d8815ef..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/jcamodule-tests/org/eclipse/wtp/j2ee/headless/tests/jca/verifiers/JCAImportDataModelVerifier.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * 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.wtp.j2ee.headless.tests.j2ee.verifiers.ModuleImportDataModelVerifier;
-
-/**
- * @author Administrator
- *
- * To change the template for this generated type comment go to
- * Window - Preferences - Java - Code Generation - Code and Comments
- */
-public class JCAImportDataModelVerifier extends ModuleImportDataModelVerifier {
-
-}
diff --git a/tests/org.eclipse.jst.j2ee.tests/jcamodule-tests/org/eclipse/wtp/j2ee/headless/tests/jca/verifiers/JCAProjectCreationDataModelVerifier.java b/tests/org.eclipse.jst.j2ee.tests/jcamodule-tests/org/eclipse/wtp/j2ee/headless/tests/jca/verifiers/JCAProjectCreationDataModelVerifier.java
deleted file mode 100644
index 7be3647..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/jcamodule-tests/org/eclipse/wtp/j2ee/headless/tests/jca/verifiers/JCAProjectCreationDataModelVerifier.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * 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.jem.util.emf.workbench.ProjectUtilities;
-import org.eclipse.jst.j2ee.client.ApplicationClient;
-import org.eclipse.jst.j2ee.internal.jca.operations.IConnectorComponentCreationDataModelProperties;
-import org.eclipse.jst.j2ee.jca.modulecore.util.ConnectorArtifactEdit;
-import org.eclipse.wst.common.componentcore.resources.ComponentHandle;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wtp.j2ee.headless.tests.j2ee.verifiers.ModuleProjectCreationDataModelVerifier;
-
-/**
- * @author Administrator
- *
- * To change the template for this generated type comment go to
- * Window - Preferences - Java - Code Generation - Code and Comments
- */
-public class JCAProjectCreationDataModelVerifier extends ModuleProjectCreationDataModelVerifier {
-    /* (non-Javadoc)
-     * @see org.eclipse.wtp.j2ee.headless.tests.j2ee.verifiers.ModuleProjectCreationDataModelVerifier#verifyProjectCreationDataModel(com.ibm.etools.application.operations.J2EEProjectCreationDataModel)
-     */
-	public void verifyProjectCreationDataModel(IDataModel model) {
-        Object key = new Object();
-		ConnectorArtifactEdit jcaEdit = null;
-		
-        try {
-            ComponentHandle handle = ComponentHandle.create(ProjectUtilities.getProject(model.getStringProperty(IConnectorComponentCreationDataModelProperties.PROJECT_NAME)), model.getStringProperty(IConnectorComponentCreationDataModelProperties.COMPONENT_NAME));
-            Object dd = null;
-			jcaEdit = ConnectorArtifactEdit.getConnectorArtifactEditForRead(handle);
-       		if(jcaEdit != null) 
-       			dd = (ApplicationClient) jcaEdit.getDeploymentDescriptorRoot();
-			Assert.assertNotNull("Deployment Descriptor Null", dd);
-        } finally {
-			if( jcaEdit != null )
-				jcaEdit.dispose();
-		}
-//        if (dataModel.getBooleanProperty(WebComponentCreationDataModel.ADD_TO_EAR)) {
-//            IProject earProject = dataModel.getEarComponentCreationDataModel().getTargetProject();
-//            EAREditModel ear = null;
-//            try {
-//                Assert.assertTrue("EAR doesn't exist:", earProject.exists());
-//                EARNatureRuntime runtime = EARNatureRuntime.getRuntime(earProject);
-//                //EMFWorkbenchContext emfWorkbenchContext = WorkbenchResourceHelper.createEMFContext(earProject, null);
-//                ear = (EAREditModel) runtime.getEditModelForRead(IEARNatureConstants.EDIT_MODEL_ID, key);
-//                ear.getModuleMapping(dataModel.getTargetProject());
-//                //TODO
-//            } finally {
-//                ear.releaseAccess(key);
-//            }
-//
-//        }
-    }
-
-}
diff --git a/tests/org.eclipse.jst.j2ee.tests/plugin.xml b/tests/org.eclipse.jst.j2ee.tests/plugin.xml
deleted file mode 100644
index 11a08c8..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/plugin.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin
-   id="org.eclipse.jst.j2ee.tests"
-   name="J2EE Tests Plug-in"
-   version="0.7.0"
-   class="org.eclipse.wtp.j2ee.headless.tests.plugin.HeadlessTestsPlugin">
-
-   <runtime>
-      <library name="j2ee-tests.jar">
-         <export name="*"/>
-      </library>
-   </runtime>
-   <requires>
-      <import plugin="org.eclipse.core.runtime"/>
-      <import plugin="org.eclipse.core.resources"/>
-      <import plugin="org.eclipse.core.commands"/>
-      <import plugin="org.eclipse.jst.common.frameworks"/>
-      <import plugin="org.eclipse.wst.common.emfworkbench.integration"/>
-      <import plugin="org.eclipse.wst.common.frameworks"/>
-      <import plugin="org.eclipse.jst.j2ee.core"/>
-      <import plugin="org.eclipse.jst.j2ee.web"/>
-      <import plugin="org.junit"/>
-      <import plugin="org.eclipse.emf.common"/>
-      <import plugin="org.eclipse.emf.ecore"/>
-      <import plugin="org.eclipse.jst.j2ee"/>
-      <import plugin="org.eclipse.wst.common.modulecore"/>
-      <import plugin="org.eclipse.jst.j2ee.ejb"/>
-      <import plugin="org.eclipse.jst.j2ee.jca"/>
-      <import plugin="org.eclipse.wst.common.tests"/>
-      <import plugin="org.eclipse.wst.server.core"/>
-      <import plugin="org.eclipse.emf.ecore.xmi"/>
-      <import plugin="org.eclipse.wst.common.emf"/>
-      <import plugin="org.eclipse.jst.j2ee.webservice"/>
-      <import plugin="org.eclipse.jem.util"/>
-   </requires>
-   <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"/>
-   </extension>
-   
-
-</plugin>
diff --git a/tests/org.eclipse.jst.j2ee.tests/savestrategy-tests/org/eclipse/wtp/headless/tests/savestrategy/AllTests.java b/tests/org.eclipse.jst.j2ee.tests/savestrategy-tests/org/eclipse/wtp/headless/tests/savestrategy/AllTests.java
deleted file mode 100644
index a15941a..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/savestrategy-tests/org/eclipse/wtp/headless/tests/savestrategy/AllTests.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * 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.headless.tests.savestrategy;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.wst.common.tests.SimpleTestSuite;
-
-/**
- * @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("WEB Tests");
-		addTest(new SimpleTestSuite(WebSaveStrategyTests.class));
-		addTest(new SimpleTestSuite(AppClientSaveStrategyTests.class));
-		addTest(new SimpleTestSuite(AppClientImportOperationTest.class));
-		addTest(new SimpleTestSuite(EJBImportOperationTest.class));
-	}
-
-}
diff --git a/tests/org.eclipse.jst.j2ee.tests/savestrategy-tests/org/eclipse/wtp/headless/tests/savestrategy/AppClientImportOperationTest.java b/tests/org.eclipse.jst.j2ee.tests/savestrategy-tests/org/eclipse/wtp/headless/tests/savestrategy/AppClientImportOperationTest.java
deleted file mode 100644
index 63abe89..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/savestrategy-tests/org/eclipse/wtp/headless/tests/savestrategy/AppClientImportOperationTest.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * 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 org.eclipse.jst.j2ee.applicationclient.internal.creation.AppClientComponentImportDataModelProvider;
-import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
-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 class AppClientImportOperationTest extends ModuleImportOperationTestCase {
-
-	public AppClientImportOperationTest(String name) {
-		super(name);
-	}
-
-	protected String getDirectory() {
-		return "AppClientTests";
-	}
-
-	protected IDataModel getModelInstance() {
-		return DataModelFactory.createDataModel(new AppClientComponentImportDataModelProvider());
-	}
-
-}
diff --git a/tests/org.eclipse.jst.j2ee.tests/savestrategy-tests/org/eclipse/wtp/headless/tests/savestrategy/AppClientSaveStrategyTests.java b/tests/org.eclipse.jst.j2ee.tests/savestrategy-tests/org/eclipse/wtp/headless/tests/savestrategy/AppClientSaveStrategyTests.java
deleted file mode 100644
index c08b571..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/savestrategy-tests/org/eclipse/wtp/headless/tests/savestrategy/AppClientSaveStrategyTests.java
+++ /dev/null
@@ -1,57 +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.wtp.headless.tests.savestrategy;
-
-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.commonarchivecore.internal.helpers.ArchiveOptions;
-import org.eclipse.jst.j2ee.internal.archive.operations.AppClientComponentSaveStrategyImpl;
-import org.eclipse.jst.j2ee.internal.archive.operations.ComponentSaveStrategyImpl;
-import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-
-public class AppClientSaveStrategyTests extends SaveStrategyTest {
-
-	protected ComponentSaveStrategyImpl createSaveStrategy(IVirtualComponent component) {
-		return new AppClientComponentSaveStrategyImpl(component);
-	}
-
-	protected Archive openModuleFile(ArchiveOptions archiveOptions, String uri) throws OpenFailureException {
-		return CommonarchiveFactory.eINSTANCE.openApplicationClientFile(archiveOptions, uri);
-	}
-
-	public String getFlexProjectSeedName() {
-		return "AppClient.zip";
-	}
-
-	public String getProjectName() {
-		return "AppClient";
-	}
-
-	public String getRootArchiveFolderName() {
-		return "TestData" + fileSep + "AppClientTests";
-	}
-
-
-	public void testSource() throws Exception {
-		importArchive("AppClientSource.jar");
-	}
-
-	public void testSomeSource() throws Exception {
-		importArchive("AppClientSomeSource.jar");
-	}
-
-	public void testNoSource() throws Exception {
-		importArchive("AppClientNoSource.jar");
-	}
-
-
-}
diff --git a/tests/org.eclipse.jst.j2ee.tests/savestrategy-tests/org/eclipse/wtp/headless/tests/savestrategy/EJBImportOperationTest.java b/tests/org.eclipse.jst.j2ee.tests/savestrategy-tests/org/eclipse/wtp/headless/tests/savestrategy/EJBImportOperationTest.java
deleted file mode 100644
index 8630145..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/savestrategy-tests/org/eclipse/wtp/headless/tests/savestrategy/EJBImportOperationTest.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * 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.headless.tests.savestrategy;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.jst.common.componentcore.util.ComponentUtilities;
-import org.eclipse.jst.j2ee.ejb.componentcore.util.EJBArtifactEdit;
-import org.eclipse.jst.j2ee.internal.ejb.project.operations.EJBComponentImportDataModelProvider;
-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;
-
-/**
- * @author Administrator
- * 
- * To change the template for this generated type comment go to Window - Preferences - Java - Code
- * Generation - Code and Comments
- */
-public class EJBImportOperationTest extends ModuleImportOperationTestCase {
-
-	public static Test suite() {
-		return new TestSuite(EJBImportOperationTest.class);
-	}
-
-	public EJBImportOperationTest(String name) {
-		super(name);
-	}
-
-	public void testEJB20Import() throws Exception {
-		String projectName = "Test13EJB";
-		String fileName = getFullPathForEJBJar("Test13EJB.jar");
-		testImport(projectName, fileName);
-		IVirtualComponent[] comps = ComponentUtilities.getComponentsForProject(ResourcesPlugin.getWorkspace().getRoot().getProject(projectName));
-		EJBArtifactEdit ejbEdit = null;
-		try {
-			ejbEdit = EJBArtifactEdit.getEJBArtifactEditForRead(comps[0]);
-			ejbEdit.getJ2EEVersion();
-		} finally {
-			if (ejbEdit != null)
-				ejbEdit.dispose();
-		}
-	}
-
-	public String getFullPathForEJBJar(String jarName) {
-		try {
-			return ProjectUtility.getFullFileName(HeadlessTestsPlugin.getDefault(), TESTS_PATH + "\\" + jarName);
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-		return jarName;
-	}
-
-	public void testEJB21Import() throws Exception {
-		testImport("Test14EJB", getFullPathForEJBJar("Test14EJB.jar"));
-	}
-
-	protected String getDirectory() {
-		return "EJBImportTests";
-	}
-
-	protected IDataModel getModelInstance() {
-		return DataModelFactory.createDataModel(new EJBComponentImportDataModelProvider());
-	}
-
-}
diff --git a/tests/org.eclipse.jst.j2ee.tests/savestrategy-tests/org/eclipse/wtp/headless/tests/savestrategy/ModuleImportOperationTestCase.java b/tests/org.eclipse.jst.j2ee.tests/savestrategy-tests/org/eclipse/wtp/headless/tests/savestrategy/ModuleImportOperationTestCase.java
deleted file mode 100644
index edbed73..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/savestrategy-tests/org/eclipse/wtp/headless/tests/savestrategy/ModuleImportOperationTestCase.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * 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.util.List;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.jst.j2ee.datamodel.properties.IJ2EEComponentImportDataModelProperties;
-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.appclient.operations.AppClientImportOperationTest;
-import org.eclipse.wtp.j2ee.headless.tests.ejb.operations.EJBImportOperationTest;
-import org.eclipse.wtp.j2ee.headless.tests.jca.operations.RARImportOperationTest;
-import org.eclipse.wtp.j2ee.headless.tests.plugin.HeadlessTestsPlugin;
-import org.eclipse.wtp.j2ee.headless.tests.web.operations.WebImportOperationTest;
-
-/**
- * @author Administrator
- * 
- * To change the template for this generated type comment go to Window - Preferences - Java - Code
- * Generation - Code and Comments
- */
-public abstract class ModuleImportOperationTestCase extends OperationTestCase {
-
-	protected boolean dataModelShouldBeValid = true;
-	public String TESTS_PATH;
-
-
-	public static Test suite() {
-		TestSuite suite = new TestSuite();
-		suite.addTestSuite(RARImportOperationTest.class);
-		suite.addTestSuite(EJBImportOperationTest.class);
-		suite.addTestSuite(WebImportOperationTest.class);
-		suite.addTestSuite(AppClientImportOperationTest.class);
-		return suite;
-	}
-
-	public ModuleImportOperationTestCase(String name) {
-		super(name);
-		TESTS_PATH = "TestData" + File.separator + getDirectory() + File.separator;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.OperationTestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		super.setUp();
-		dataModelShouldBeValid = true;
-	}
-
-	protected abstract String getDirectory();
-
-	protected abstract IDataModel getModelInstance();
-
-	public void testImport(String projectName, String filename) throws Exception {
-
-		IDataModel dataModel = getModelInstance();
-		dataModel.setProperty(IJ2EEComponentImportDataModelProperties.FILE_NAME, filename);
-		dataModel.setProperty(IJ2EEComponentImportDataModelProperties.COMPONENT_NAME, projectName);
-		setServerTargetProperty(dataModel);
-
-		if (dataModelShouldBeValid)
-			runAndVerify(dataModel);
-		else
-			verifyInvalidDataModel(dataModel);
-	}
-
-	/**
-	 * @param dataModel
-	 */
-	public void setServerTargetProperty(IDataModel dataModel) {
-		// dataModel.setProperty(IJavaComponentCreationDataModelProperties.SERVER_TARGET_ID,
-		// AllPluginTests.JONAS_SERVER.getId());
-	}
-
-	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('\\') + 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('\\') + 1, jarName.length() - 4);
-			testImport(projectName, jarName);
-		}
-	}
-
-	/**
-	 * @return
-	 */
-	protected List getImportableArchiveFileNames() {
-		return ProjectUtility.getJarsInDirectory(HeadlessTestsPlugin.getDefault(), TESTS_PATH);
-	}
-
-	public void testBadFileName() throws Exception {
-
-		dataModelShouldBeValid = false;
-		testImport("BobTheProject", "BobTheFile");
-	}
-
-}
diff --git a/tests/org.eclipse.jst.j2ee.tests/savestrategy-tests/org/eclipse/wtp/headless/tests/savestrategy/RARImportOperationTest.java b/tests/org.eclipse.jst.j2ee.tests/savestrategy-tests/org/eclipse/wtp/headless/tests/savestrategy/RARImportOperationTest.java
deleted file mode 100644
index ebab40c..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/savestrategy-tests/org/eclipse/wtp/headless/tests/savestrategy/RARImportOperationTest.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * 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.util.List;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-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.ProjectUtility;
-import org.eclipse.wtp.j2ee.headless.tests.plugin.HeadlessTestsPlugin;
-
-public class RARImportOperationTest extends ModuleImportOperationTestCase {
-
-	public static boolean isBinary = false;
-	public static boolean overwriteProject = false;
-
-	public static Test suite() {
-		return new TestSuite(RARImportOperationTest.class);
-	}
-
-	public RARImportOperationTest(String name) {
-		super(name);
-	}
-
-	protected String getDirectory() {
-		return "RARImportTests";
-	}
-
-
-	protected List getImportableArchiveFileNames() {
-		return ProjectUtility.getRarsInDirectory(HeadlessTestsPlugin.getDefault(), TESTS_PATH);
-	}
-
-	protected IDataModel getModelInstance() {
-		return DataModelFactory.createDataModel(new ConnectorComponentImportDataModelProvider());
-	}
-
-}
diff --git a/tests/org.eclipse.jst.j2ee.tests/savestrategy-tests/org/eclipse/wtp/headless/tests/savestrategy/SaveStrategyTest.java b/tests/org.eclipse.jst.j2ee.tests/savestrategy-tests/org/eclipse/wtp/headless/tests/savestrategy/SaveStrategyTest.java
deleted file mode 100644
index de19823..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/savestrategy-tests/org/eclipse/wtp/headless/tests/savestrategy/SaveStrategyTest.java
+++ /dev/null
@@ -1,130 +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.wtp.headless.tests.savestrategy;
-
-import java.io.IOException;
-import java.net.URL;
-
-import junit.framework.TestCase;
-
-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.core.runtime.Platform;
-import org.eclipse.etools.common.test.apitools.ProjectUnzipUtil;
-import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
-import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive;
-import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.OpenFailureException;
-import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveOptions;
-import org.eclipse.jst.j2ee.internal.archive.operations.ComponentSaveStrategyImpl;
-import org.eclipse.wst.common.componentcore.ComponentCore;
-import org.eclipse.wst.common.componentcore.resources.IFlexibleProject;
-import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-import org.eclipse.wst.common.tests.ProjectUtility;
-import org.eclipse.wtp.j2ee.headless.tests.plugin.HeadlessTestsPlugin;
-
-public abstract class SaveStrategyTest extends TestCase {
-	public static String fileSep = System.getProperty("file.separator");
-
-	protected String projectName;
-	protected IProject project;
-
-	protected IVirtualComponent[] vComps;
-
-	public SaveStrategyTest() {
-		super();
-		projectName = getProjectName();
-	}
-
-	public void setUp() {
-		try {
-			ProjectUtility.deleteAllProjects();
-			project = null;
-			if (createProject()) {
-				project = ProjectUtilities.getProject(projectName);
-			}
-			IFlexibleProject flexProject = ComponentCore.createFlexibleProject(project);
-			vComps = flexProject.getComponents();
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-	}
-
-	public boolean createProject() {
-		IPath localZipPath = getFlexProjectSeed();
-		ProjectUnzipUtil util = new ProjectUnzipUtil(localZipPath, new String[]{projectName});
-		return util.createProjects();
-	}
-
-	private IPath getFlexProjectSeed() {
-		String file = "TestData" + fileSep + "SaveStrategyTests" + fileSep + getFlexProjectSeedName();
-		IPath zipFilePath = new Path(file);
-
-		URL url = HeadlessTestsPlugin.getDefault().find(zipFilePath);
-		try {
-			url = Platform.asLocalURL(url);
-		} catch (IOException e) {
-			e.printStackTrace();
-		}
-		return new Path(url.getPath());
-	}
-
-	protected void importArchive(String archiveName) throws Exception {
-
-		String uri = getUri(archiveName);
-		Archive moduleFile = null;
-		for (int i = 0; i < vComps.length; i++) {
-			try {
-				moduleFile = openModuleFile(getArchiveOptions(), uri);
-				ComponentSaveStrategyImpl aStrategy = createSaveStrategy(vComps[i]);
-				aStrategy.setProgressMonitor(new NullProgressMonitor());
-				moduleFile.save(aStrategy);
-			} finally {
-				if (null != moduleFile) {
-					moduleFile.close();
-				}
-			}
-		}
-	}
-
-	protected abstract ComponentSaveStrategyImpl createSaveStrategy(IVirtualComponent component);
-
-	protected abstract Archive openModuleFile(ArchiveOptions archiveOptions, String uri) throws OpenFailureException;
-
-	protected String getUri(String warName) {
-		String file = getRootArchiveFolderName() + fileSep + warName;
-		String uri = getFullTestDataPath(file);
-		return uri;
-	}
-
-	protected static String getFullTestDataPath(String dataPath) {
-		try {
-			return ProjectUtility.getFullFileName(HeadlessTestsPlugin.getDefault(), dataPath);
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-		return "";
-	}
-
-	protected final ArchiveOptions getArchiveOptions() {
-		ArchiveOptions opts = new ArchiveOptions();
-		opts.setIsReadOnly(true);
-		return opts;
-	}
-
-	public abstract String getProjectName();
-
-	public abstract String getFlexProjectSeedName();
-
-	public abstract String getRootArchiveFolderName();
-
-}
diff --git a/tests/org.eclipse.jst.j2ee.tests/savestrategy-tests/org/eclipse/wtp/headless/tests/savestrategy/WebImportOperationTest.java b/tests/org.eclipse.jst.j2ee.tests/savestrategy-tests/org/eclipse/wtp/headless/tests/savestrategy/WebImportOperationTest.java
deleted file mode 100644
index 503e3f3..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/savestrategy-tests/org/eclipse/wtp/headless/tests/savestrategy/WebImportOperationTest.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * 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.runtime.Path;
-import org.eclipse.jst.j2ee.internal.web.archive.operations.WebComponentImportDataModelProvider;
-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 WebImportOperationTest extends ModuleImportOperationTestCase {
-
-	public final String WEB_TESTS_PATH;
-
-	public WebImportOperationTest(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(WebImportOperationTest.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());
-	}
-
-}
diff --git a/tests/org.eclipse.jst.j2ee.tests/savestrategy-tests/org/eclipse/wtp/headless/tests/savestrategy/WebSaveStrategyTests.java b/tests/org.eclipse.jst.j2ee.tests/savestrategy-tests/org/eclipse/wtp/headless/tests/savestrategy/WebSaveStrategyTests.java
deleted file mode 100644
index dc3566e..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/savestrategy-tests/org/eclipse/wtp/headless/tests/savestrategy/WebSaveStrategyTests.java
+++ /dev/null
@@ -1,62 +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.wtp.headless.tests.savestrategy;
-
-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.commonarchivecore.internal.helpers.ArchiveOptions;
-import org.eclipse.jst.j2ee.internal.archive.operations.ComponentSaveStrategyImpl;
-import org.eclipse.jst.j2ee.internal.web.archive.operations.WebComponentSaveStrategyImpl;
-import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-
-
-public class WebSaveStrategyTests extends SaveStrategyTest {
-
-
-	public WebSaveStrategyTests() {
-		super();
-	}
-
-	public void testSource() throws Exception {
-		importArchive("WebSource.war");
-	}
-
-	public void testSomeSource() throws Exception {
-		importArchive("WebSomeSource.war");
-	}
-
-	public void testNoSource() throws Exception {
-		importArchive("WebNoSource.war");
-	}
-
-	public String getRootArchiveFolderName() {
-		return "TestData" + fileSep + "WARImportTests";
-	}
-
-	public String getFlexProjectSeedName() {
-		return "WarImportFlexProject.zip";
-	}
-
-	public String getProjectName() {
-		return "WarImportFlexProject";
-	}
-
-	protected ComponentSaveStrategyImpl createSaveStrategy(IVirtualComponent component) {
-		return new WebComponentSaveStrategyImpl(component);
-	}
-
-	protected Archive openModuleFile(ArchiveOptions archiveOptions, String uri) throws OpenFailureException {
-		return CommonarchiveFactory.eINSTANCE.openWARFile(archiveOptions, uri);
-	}
-
-
-}
diff --git a/tests/org.eclipse.jst.j2ee.tests/test.xml b/tests/org.eclipse.jst.j2ee.tests/test.xml
deleted file mode 100644
index b878946..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/test.xml
+++ /dev/null
@@ -1,56 +0,0 @@
-<?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.1.0/library.xml"/>
-  <property name="extraVMargs" value="-Dorg.eclipse.jst.server.jonas.432=${jonas432Dir}"/> 
-            
-  <property name="workspace" value="${basedir}/${plugin-name}"/>
-
-  <!-- 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">
-    <delete dir="${workspace}" quiet="true"/>
-    
-    <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.core.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">
-	<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/operations/AddServletOperationTest.java b/tests/org.eclipse.jst.j2ee.tests/webmodule-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/AddServletOperationTest.java
deleted file mode 100644
index e6d8000..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/webmodule-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/AddServletOperationTest.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Created on May 13, 2004
- *
- * TODO 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.core.resources.IProject;
-import org.eclipse.jst.j2ee.internal.project.J2EENature;
-import org.eclipse.jst.j2ee.internal.web.archive.operations.WebComponentCreationDataModelProvider;
-import org.eclipse.jst.j2ee.internal.web.operations.J2EEWebNatureRuntime;
-import org.eclipse.jst.j2ee.internal.web.operations.NewServletClassDataModel;
-import org.eclipse.jst.j2ee.web.datamodel.properties.IWebComponentCreationDataModelProperties;
-import org.eclipse.jst.j2ee.webapplication.Servlet;
-import org.eclipse.jst.j2ee.webapplication.WebApp;
-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.wst.common.tests.SimpleTestSuite;
-
-/**
- * @author jialin
- *
- * TODO To change the template for this generated type comment go to
- * Window - Preferences - Java - Code Generation - Code and Comments
- */
-public class AddServletOperationTest extends OperationTestCase {
-    public static String WEB_PROJECT_NAME = "WebProject";
-    public static String SERVLET_NAME = "Servlet1";
-
-    private IDataModel webComponentDataModel;
-	private NewServletClassDataModel servletDataModel;
-    
-    /**
-	 * @param name
-	 */
-	public AddServletOperationTest(String name) {
-		super(name);
-		// TODO Auto-generated constructor stub
-	}
-
-	/**
-	 * 
-	 */
-	public AddServletOperationTest() {
-		
-		// TODO Auto-generated constructor stub
-	}
-
-	public static Test suite() {
-        return new SimpleTestSuite(AddServletOperationTest.class);
-    }
-
-    public void testAddServlet() throws Exception {
-    	createWebProject(WEB_PROJECT_NAME);
-    	WebApp webApp = getWebApp();
-    	addServlet(WEB_PROJECT_NAME, SERVLET_NAME);
-    	if (webApp != null){
-    		Servlet servlet = webApp.getServletNamed(SERVLET_NAME);
-			//TODO need to get the 
-    		//addInitParams(servlet,WEB_PROJECT_NAME);
-    	}
-    }
-    
-    public void createWebProject(String projectName) throws Exception {
-    	webComponentDataModel = DataModelFactory.createDataModel(new WebComponentCreationDataModelProvider());
-    	webComponentDataModel.setProperty(IWebComponentCreationDataModelProperties.PROJECT_NAME, projectName);
-        runAndVerify(webComponentDataModel);
-    }
-    /**
-     * @param projectName
-     * @param servletName
-     */
-    public void addServlet(String projectName, String servletName) throws Exception {
-    	servletDataModel = new NewServletClassDataModel();
-    	servletDataModel.setProperty(NewServletClassDataModel.PROJECT_NAME, projectName);
-    	servletDataModel.setProperty(NewServletClassDataModel.DISPLAY_NAME, servletName);
-		
-        NewServletClassDataModel nestedModel = new NewServletClassDataModel();
-        servletDataModel.addNestedModel("NewServletClassDataModel", nestedModel); //$NON-NLS-1$
-		nestedModel.setProperty(NewServletClassDataModel.PROJECT_NAME, projectName);
-		nestedModel.setProperty(NewServletClassDataModel.CLASS_NAME, servletName);
-		nestedModel.setProperty(NewServletClassDataModel.SUPERCLASS, NewServletClassDataModel.SUPERCLASS);
-		nestedModel.setProperty(NewServletClassDataModel.INTERFACES, 
-				servletDataModel.getServletInterfaces());
-        runAndVerify(servletDataModel);
-    }
-	
-	
-    
-//    protected void addInitParams(Servlet servlet,String projectName) throws Exception {
-//    	initParamDataModel = new AddServletInitParamDataModel();
-//    	initParamDataModel.setProperty(AddServletInitParamDataModel.SERVLET, servlet);
-//    	initParamDataModel.setProperty(AddServletInitParamDataModel.PROJECT_NAME,projectName);
-//    	for (int i = 0; i < 10; i++) {
-//        	String paramName = "param" + String.valueOf(i);
-//        	String paramValue = "value" + String.valueOf(i);
-//        	initParamDataModel.setProperty(AddServletInitParamDataModel.PARAMETER_NAME, paramName);
-//        	initParamDataModel.setProperty(AddServletInitParamDataModel.PARAMETER_VALUE, paramValue);
-//    	}
-//        runAndVerify(initParamDataModel);
-//    }
-    
-    protected WebApp getWebApp() {
-    	IProject webProject = null;
-    	if (servletDataModel != null){
-    		webProject = servletDataModel.getTargetProject();
-    	}
-    	else{
-    		webProject = ProjectUtility.getProject(WEB_PROJECT_NAME);
-    	}
-        J2EEWebNatureRuntime nature = (J2EEWebNatureRuntime)J2EENature.getRegisteredRuntime(webProject);
-
-        if (nature != null)
-        	return nature.getWebApp();
-    	return null;
-    }
-}
diff --git a/tests/org.eclipse.jst.j2ee.tests/webmodule-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/AllTests.java b/tests/org.eclipse.jst.j2ee.tests/webmodule-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/AllTests.java
deleted file mode 100644
index d07c53f..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/webmodule-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/AllTests.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * 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.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 Tests");
-       // addTest(WebExportOperationTest.suite());
-       // addTest(WebImportOperationTest.suite());
-        addTest(WebProjectCreationOperationTest.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/webmodule-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/WebComponentCreationTest.java b/tests/org.eclipse.jst.j2ee.tests/webmodule-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/WebComponentCreationTest.java
deleted file mode 100644
index ca31f19..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/webmodule-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/WebComponentCreationTest.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * 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.internal.J2EEVersionConstants;
-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.AbstractJ2EEComponentCreationTest;
-import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.RandomObjectGenerator;
-
-/**
- * @author blancett
- *
- * To change the template for this generated type comment go to
- * Window - Preferences - Java - Code Generation - Code and Comments
- */
-public class WebComponentCreationTest extends AbstractJ2EEComponentCreationTest {
-	
-	
-	public void testVaild12WebProjectNameCreationWithAlphabetChars() throws Exception {
-		ProjectUtility.deleteAllProjects();
-		for (int i = 0; i < RandomObjectGenerator.createRandomProjectNumber(); i++)
-			createValidComponentNameCreationWithAlphabetChars(WEB_MODULE, J2EEVersionConstants.WEB_2_2_ID, false);
-	}
-	
-	public void testVaild12WebProjectNameCreationWithMixedChars() throws Exception {
-		ProjectUtility.deleteAllProjects();
-		for (int i = 0; i < RandomObjectGenerator.createRandomProjectNumber(); i++)
-			createValidComponentNameCreationWithAlphabetChars(WEB_MODULE, J2EEVersionConstants.WEB_2_2_ID, true);
-	}
-	
-	public void testVaild13WebProjectNameCreationWithAlphabetChars() throws Exception {
-		ProjectUtility.deleteAllProjects();
-		for (int i = 0; i < RandomObjectGenerator.createRandomProjectNumber(); i++)
-			createValidComponentNameCreationWithAlphabetChars(WEB_MODULE, J2EEVersionConstants.WEB_2_3_ID, false);
-	}
-	
-	public void testVaild13WebProjectNameCreationAllChars() throws Exception {
-		ProjectUtility.deleteAllProjects();
-		for (int i = 0; i < RandomObjectGenerator.createRandomProjectNumber(); i++)
-			createValidComponentNameCreationWithAlphabetChars(WEB_MODULE, J2EEVersionConstants.WEB_2_3_ID, true);
-	}
-	
-	public void testVaildRandomVersionsWebProjectNameCreationAllChars() throws Exception {
-		ProjectUtility.deleteAllProjects();
-		for (int i = 0; i < RandomObjectGenerator.createRandomProjectNumber(); i++) {
-			if (RandomObjectGenerator.createRandomProjectNumber() % 2 == 0)
-				createValidComponentNameCreationWithAlphabetChars(WEB_MODULE, J2EEVersionConstants.WEB_2_3_ID, true);
-			else
-				createValidComponentNameCreationWithAlphabetChars(WEB_MODULE, J2EEVersionConstants.WEB_2_2_ID, true);
-		}
-	}
-	
-	public void testVaildRandomVersionsWebProjectNameCreationAlphabet() throws Exception {
-		ProjectUtility.deleteAllProjects();
-		for (int i = 0; i < RandomObjectGenerator.createRandomProjectNumber(); i++) {
-			if (RandomObjectGenerator.createRandomProjectNumber() % 2 == 0)
-				createValidComponentNameCreationWithAlphabetChars(WEB_MODULE, J2EEVersionConstants.WEB_2_3_ID, false);
-			else
-				createValidComponentNameCreationWithAlphabetChars(WEB_MODULE, J2EEVersionConstants.WEB_2_2_ID, false);
-		}
-	}
-	
-	public void testInVaild12WebProjectNameCreation() throws Exception {
-		ProjectUtility.deleteAllProjects();
-		for (int i = 0; i < RandomObjectGenerator.createRandomProjectNumber(); i++) {
-			try {
-				 setupWebComponent(RandomObjectGenerator.createInvalidRandomProjectName(), J2EEVersionConstants.WEB_2_2_ID);
-				 IDataModel model = setupWebComponent(RandomObjectGenerator.createInvalidRandomProjectName(), J2EEVersionConstants.WEB_2_2_ID);
-				 checkValidDataModel(model);
-			} catch (Exception e) {
-				if (e instanceof IllegalArgumentException) {
-					System.out.println(ILLEGAL_PROJECT_NAME_MESSAGE + projectName);
-				} else
-					new Exception(UNEXPECTED_ERROR_MESSAGE);
-			} finally {
-				new Exception(TEST_FAILED_MESSAGE);
-			}
-		}
-	}
-
-    public static Test suite() {
-        return new SimpleTestSuite(WebComponentCreationTest.class);
-    }
-    
-    public void testJavaCreation() throws Exception {
-	}
-	
-
-}
diff --git a/tests/org.eclipse.jst.j2ee.tests/webmodule-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/WebExportOperationTest.java b/tests/org.eclipse.jst.j2ee.tests/webmodule-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/WebExportOperationTest.java
deleted file mode 100644
index 9199442..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/webmodule-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/WebExportOperationTest.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * 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 junit.framework.TestSuite;
-
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleExportOperationTestCase;
-import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleImportOperationTestCase;
-
-/**
- * @author Administrator
- * 
- * To change the template for this generated type comment go to Window - Preferences - Java - Code
- * Generation - Code and Comments
- */
-public class WebExportOperationTest extends ModuleExportOperationTestCase {
-
-	protected boolean excludeCompileJsp = false;
-
-	public WebExportOperationTest(String name) {
-		super(name);
-	}
-
-	public static Test suite() {
-		TestSuite suite = new TestSuite();
-		suite.addTestSuite(WebExportOperationTest.class);
-		return suite;
-	}
-
-	/*
-	 * (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() {
-		// WebModuleExportDataModel dataModel = new WebModuleExportDataModel();
-		// dataModel.setBooleanProperty(WebModuleExportDataModel.EXCLUDE_COMPILE_JSP,
-		// excludeCompileJsp);
-		// return dataModel;
-		return null;
-	}
-
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleExportOperationTestCase#getImportTestCase()
-	 */
-	protected ModuleImportOperationTestCase getImportTestCase() {
-		return new WebImportOperationTest("");
-	}
-
-	/**
-	 * @return
-	 */
-	public String getModuleExportFileExt() {
-		return ".war";
-	}
-
-}
diff --git a/tests/org.eclipse.jst.j2ee.tests/webmodule-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/WebImportOperationTest.java b/tests/org.eclipse.jst.j2ee.tests/webmodule-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/WebImportOperationTest.java
deleted file mode 100644
index 69a1e48..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/webmodule-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/WebImportOperationTest.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * 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 java.io.File;
-import java.net.URL;
-import java.util.List;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.runtime.Path;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.tests.ProjectUtility;
-import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleImportOperationTestCase;
-import org.eclipse.wtp.j2ee.headless.tests.plugin.HeadlessTestsPlugin;
-
-//TODO DELETE
-/**
- * @deprecated
- *
- */
-public class WebImportOperationTest extends ModuleImportOperationTestCase {
-	
-	public final String WEB_TESTS_PATH;
-	
-	public WebImportOperationTest(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(WebImportOperationTest.class);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleImportOperationTestCase#getDirectory()
-	 */
-	protected String getDirectory() {
-		return "WARImportTests";
-	}
- 
-	/* (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(),WEB_TESTS_PATH);
-	}
-
-}
diff --git a/tests/org.eclipse.jst.j2ee.tests/webmodule-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/WebProjectCreationOperationTest.java b/tests/org.eclipse.jst.j2ee.tests/webmodule-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/WebProjectCreationOperationTest.java
deleted file mode 100644
index 4b7b09e..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/webmodule-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/WebProjectCreationOperationTest.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * 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 junit.framework.TestSuite;
-
-import org.eclipse.jst.j2ee.internal.web.archive.operations.WebComponentCreationDataModelProvider;
-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.ModuleProjectCreationOperationTest;
-
-
-public class WebProjectCreationOperationTest extends ModuleProjectCreationOperationTest {
-    
-    /**
-	 * @param name
-	 */
-	public WebProjectCreationOperationTest(String name) {
-		super(name);
-		// TODO Auto-generated constructor stub
-	}
-
-	public static Test suite() {
-        return new TestSuite(WebProjectCreationOperationTest.class);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleProjectCreationOperationTest#getProjectCreationDataModel()
-     */
-    public IDataModel getComponentCreationDataModel() {
-        return DataModelFactory.createDataModel(new WebComponentCreationDataModelProvider());
-    }
-    
-}
diff --git a/tests/org.eclipse.jst.j2ee.tests/webmodule-tests/org/eclipse/wtp/j2ee/headless/tests/web/verifiers/WebExportDataModelVerifier.java b/tests/org.eclipse.jst.j2ee.tests/webmodule-tests/org/eclipse/wtp/j2ee/headless/tests/web/verifiers/WebExportDataModelVerifier.java
deleted file mode 100644
index cb4a34b..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/webmodule-tests/org/eclipse/wtp/j2ee/headless/tests/web/verifiers/WebExportDataModelVerifier.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * 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.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 {
-
-}
diff --git a/tests/org.eclipse.jst.j2ee.tests/webmodule-tests/org/eclipse/wtp/j2ee/headless/tests/web/verifiers/WebImportDataModelVerifier.java b/tests/org.eclipse.jst.j2ee.tests/webmodule-tests/org/eclipse/wtp/j2ee/headless/tests/web/verifiers/WebImportDataModelVerifier.java
deleted file mode 100644
index d897ea1..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/webmodule-tests/org/eclipse/wtp/j2ee/headless/tests/web/verifiers/WebImportDataModelVerifier.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * 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.wtp.j2ee.headless.tests.j2ee.verifiers.ModuleImportDataModelVerifier;
-
-/**
- * @author Administrator
- *
- * To change the template for this generated type comment go to
- * Window - Preferences - Java - Code Generation - Code and Comments
- */
-public class WebImportDataModelVerifier extends ModuleImportDataModelVerifier {
-
-}
diff --git a/tests/org.eclipse.jst.j2ee.tests/webmodule-tests/org/eclipse/wtp/j2ee/headless/tests/web/verifiers/WebProjectCreationDataModelVerifier.java b/tests/org.eclipse.jst.j2ee.tests/webmodule-tests/org/eclipse/wtp/j2ee/headless/tests/web/verifiers/WebProjectCreationDataModelVerifier.java
deleted file mode 100644
index c8d3382..0000000
--- a/tests/org.eclipse.jst.j2ee.tests/webmodule-tests/org/eclipse/wtp/j2ee/headless/tests/web/verifiers/WebProjectCreationDataModelVerifier.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * 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.jem.util.emf.workbench.ProjectUtilities;
-import org.eclipse.jst.j2ee.web.componentcore.util.WebArtifactEdit;
-import org.eclipse.jst.j2ee.web.datamodel.properties.IWebComponentCreationDataModelProperties;
-import org.eclipse.jst.j2ee.webapplication.WebApp;
-import org.eclipse.wst.common.componentcore.resources.ComponentHandle;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wtp.j2ee.headless.tests.j2ee.verifiers.ModuleProjectCreationDataModelVerifier;
-
-/**
- * @author Administrator
- *
- * To change the template for this generated type comment go to
- * Window - Preferences - Java - Code Generation - Code and Comments
- */
-public class WebProjectCreationDataModelVerifier extends ModuleProjectCreationDataModelVerifier {
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.wtp.j2ee.headless.tests.j2ee.verifiers.ModuleProjectCreationDataModelVerifier#verifyProjectCreationDataModel(com.ibm.etools.application.operations.J2EEProjectCreationDataModel)
-     */
-    public void verifyProjectCreationDataModel(IDataModel model) {
-        Object key = new Object();
-		WebArtifactEdit webEdit = null;
-		
-        try {
-            ComponentHandle handle = ComponentHandle.create(ProjectUtilities.getProject(model.getStringProperty(IWebComponentCreationDataModelProperties.PROJECT_NAME)), model.getStringProperty(IWebComponentCreationDataModelProperties.COMPONENT_NAME));
-            Object dd = null;
-			webEdit = WebArtifactEdit.getWebArtifactEditForRead(handle);
-       		if(webEdit != null) 
-       			dd = (WebApp) webEdit.getDeploymentDescriptorRoot();
-			Assert.assertNotNull("Deployment Descriptor Null", dd);
-        } finally {
-			if( webEdit != null )
-				webEdit.dispose();
-		}
-//        if (dataModel.getBooleanProperty(WebComponentCreationDataModel.ADD_TO_EAR)) {
-//            IProject earProject = dataModel.getEarComponentCreationDataModel().getTargetProject();
-//            EAREditModel ear = null;
-//            try {
-//                Assert.assertTrue("EAR doesn't exist:", earProject.exists());
-//                EARNatureRuntime runtime = EARNatureRuntime.getRuntime(earProject);
-//                //EMFWorkbenchContext emfWorkbenchContext = WorkbenchResourceHelper.createEMFContext(earProject, null);
-//                ear = (EAREditModel) runtime.getEditModelForRead(IEARNatureConstants.EDIT_MODEL_ID, key);
-//                ear.getModuleMapping(dataModel.getTargetProject());
-//                //TODO
-//            } finally {
-//                ear.releaseAccess(key);
-//            }
-//
-//        }
-    }
-}
diff --git a/tests/org.eclipse.jst.servlet.tests/.classpath b/tests/org.eclipse.jst.servlet.tests/.classpath
deleted file mode 100644
index 1160020..0000000
--- a/tests/org.eclipse.jst.servlet.tests/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="webmodule-tomcat-tests"/>
-	<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.servlet.tests/.cvsignore b/tests/org.eclipse.jst.servlet.tests/.cvsignore
deleted file mode 100644
index 2521e52..0000000
--- a/tests/org.eclipse.jst.servlet.tests/.cvsignore
+++ /dev/null
@@ -1,4 +0,0 @@
-bin
-temp.folder
-build.xml
-ui.jar
diff --git a/tests/org.eclipse.jst.servlet.tests/.project b/tests/org.eclipse.jst.servlet.tests/.project
deleted file mode 100644
index 732c1cf..0000000
--- a/tests/org.eclipse.jst.servlet.tests/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?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/WARImportTests/Example1.war b/tests/org.eclipse.jst.servlet.tests/WARImportTests/Example1.war
deleted file mode 100644
index 9c30a38..0000000
--- a/tests/org.eclipse.jst.servlet.tests/WARImportTests/Example1.war
+++ /dev/null
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
deleted file mode 100644
index ba220b1..0000000
--- a/tests/org.eclipse.jst.servlet.tests/WARImportTests/Test12Web.war
+++ /dev/null
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
deleted file mode 100644
index 22aa926..0000000
--- a/tests/org.eclipse.jst.servlet.tests/WARImportTests/Test13Web.war
+++ /dev/null
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
deleted file mode 100644
index 1eb2a3f..0000000
--- a/tests/org.eclipse.jst.servlet.tests/WARImportTests/Test14Web.war
+++ /dev/null
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
deleted file mode 100644
index 1c9628c..0000000
--- a/tests/org.eclipse.jst.servlet.tests/WARImportTests/YourCompanyExample.war
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.jst.servlet.tests/build.properties b/tests/org.eclipse.jst.servlet.tests/build.properties
deleted file mode 100644
index 986c81c..0000000
--- a/tests/org.eclipse.jst.servlet.tests/build.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-source.tests.jar = webmodule-tomcat-tests/
-output.tests.jar = bin/
-bin.includes = plugin.xml,\
-               tests.jar,\
-               WARImportTests/,\
-               test.xml
diff --git a/tests/org.eclipse.jst.servlet.tests/plugin.xml b/tests/org.eclipse.jst.servlet.tests/plugin.xml
deleted file mode 100644
index 411fe0c..0000000
--- a/tests/org.eclipse.jst.servlet.tests/plugin.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin
-   id="org.eclipse.jst.servlet.tests"
-   name="org.eclipse.jst.servlet.tests"
-   version="0.7.0"
-   provider-name="IBM"
-   class="org.eclipse.jst.servlet.tests.ServletTestsPlugin">
-
-   <runtime>
-      <library name="tests.jar">
-         <export name="*"/>
-      </library>
-   </runtime>
-
-   <requires>
-      <import plugin="org.eclipse.core.runtime"/>
-      <import plugin="org.eclipse.core.commands"/>
-      <import plugin="org.eclipse.jst.common.frameworks"/>
-      <import plugin="org.eclipse.wst.common.frameworks"/>
-      <import plugin="org.eclipse.jst.j2ee.core"/>
-      <import plugin="org.eclipse.jst.j2ee.web"/>
-      <import plugin="org.eclipse.wst.common.tests"/>
-      <import plugin="org.junit"/>
-      <import plugin="org.eclipse.jst.j2ee.tests"/>
-      <import plugin="org.eclipse.jst.j2ee"/>
-      <import plugin="org.eclipse.wst.server.core"/>
-      
-   </requires>
-
-</plugin>
diff --git a/tests/org.eclipse.jst.servlet.tests/test.xml b/tests/org.eclipse.jst.servlet.tests/test.xml
deleted file mode 100644
index cbbb98f..0000000
--- a/tests/org.eclipse.jst.servlet.tests/test.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-<?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
deleted file mode 100644
index 91aa544..0000000
--- a/tests/org.eclipse.jst.servlet.tests/webmodule-tomcat-tests/org/eclipse/jst/servlet/tests/ServletTestsPlugin.java
+++ /dev/null
@@ -1,74 +0,0 @@
-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");
-		} 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
deleted file mode 100644
index 40022b2..0000000
--- a/tests/org.eclipse.jst.servlet.tests/webmodule-tomcat-tests/org/eclipse/jst/servlet/tests/bvt/AutomatedBVT.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * 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.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 AutomatedBVT extends TestSuite {
-
-    public static String baseDirectory = System.getProperty("user.dir") + java.io.File.separatorChar + "WARImportTests" + java.io.File.separatorChar;
-    
-    static {
-        try {
-            IPluginDescriptor pluginDescriptor = Platform.getPluginRegistry().getPluginDescriptor("org.eclipse.jst.servlet.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.servlet.tests.bvt");
-        //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
deleted file mode 100644
index 18298d2..0000000
--- a/tests/org.eclipse.jst.servlet.tests/webmodule-tomcat-tests/org/eclipse/jst/servlet/tests/bvt/AutomatedBVTEclipse.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * 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.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.servlet.tests");
-        URL url = pluginDescriptor.getInstallURL();
-        try {
-        	AutomatedBVT.baseDirectory = Platform.asLocalURL(url).getFile() + "WARImportTests"+ java.io.File.separatorChar;
-		} catch (IOException e) {
-			// TODO Auto-generated catch block
-			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
deleted file mode 100644
index 4daa079..0000000
--- a/tests/org.eclipse.jst.servlet.tests/webmodule-tomcat-tests/org/eclipse/jst/servlet/tomcat/tests/AllTomcatTests.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * 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");
-        addTest(WebProjectCreationTomcatTest.suite());
-        addTest(WebImportOperationTomcatTest.suite());
-        addTest(WebExportOperationTomcatTest.suite());
-        
-    }
-    
-    public static IRuntime createRuntime()  {
-    	String s = System.getProperty("org.eclipse.jst.server.tomcat.50");
-    	
-    	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.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
deleted file mode 100644
index 2117de8..0000000
--- a/tests/org.eclipse.jst.servlet.tests/webmodule-tomcat-tests/org/eclipse/jst/servlet/tomcat/tests/WebExportOperationTomcatTest.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * 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 org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.tests.SimpleTestSuite;
-import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleExportOperationTestCase;
-import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleImportOperationTestCase;
-
-/**
- * @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 ModuleExportOperationTestCase {
-
-	protected boolean excludeCompileJsp = false;
-
-	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() {
-		// WebModuleExportDataModel dataModel = new WebModuleExportDataModel();
-		// dataModel.setBooleanProperty(WebModuleExportDataModel.EXCLUDE_COMPILE_JSP,
-		// excludeCompileJsp);
-		// return dataModel;
-		return null;
-	}
-
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleExportOperationTestCase#getImportTestCase()
-	 */
-	protected ModuleImportOperationTestCase getImportTestCase() {
-		return new WebImportOperationTomcatTest("");
-	}
-
-	/**
-	 * @return
-	 */
-	public String getModuleExportFileExt() {
-		return ".war";
-	}
-
-}
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
deleted file mode 100644
index 3716dd1..0000000
--- a/tests/org.eclipse.jst.servlet.tests/webmodule-tomcat-tests/org/eclipse/jst/servlet/tomcat/tests/WebImportOperationTomcatTest.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * 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.util.List;
-
-import junit.framework.Test;
-
-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.ModuleImportOperationTestCase;
-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 ModuleImportOperationTestCase {
-
-	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#getDirectory()
-	 */
-	protected String getDirectory() {
-		return "WARImportTests";
-	}
-
-	/*
-	 * (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());
-	}
-
-}
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
deleted file mode 100644
index 0bd27c9..0000000
--- a/tests/org.eclipse.jst.servlet.tests/webmodule-tomcat-tests/org/eclipse/jst/servlet/tomcat/tests/WebProjectCreationTomcatTest.java
+++ /dev/null
@@ -1,220 +0,0 @@
-/*
- * 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.FlexibleProjectCreationDataModelProvider;
-import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
-import org.eclipse.jst.j2ee.internal.web.archive.operations.WebComponentCreationDataModelProvider;
-import org.eclipse.jst.j2ee.internal.web.operations.NewServletClassDataModel;
-import org.eclipse.jst.j2ee.project.datamodel.properties.IFlexibleJavaProjectCreationDataModelProperties;
-import org.eclipse.jst.j2ee.web.datamodel.properties.IWebComponentCreationDataModelProperties;
-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 {
-    protected String projectName = null;
-
-    public void createSimpleProject(String projectName) throws Exception {
-        IDataModel dataModel = DataModelFactory.createDataModel(new FlexibleProjectCreationDataModelProvider());
-        dataModel.setProperty(IFlexibleJavaProjectCreationDataModelProperties.PROJECT_NAME, projectName);
-        setServerTargetProperty(dataModel);
-        dataModel.getDefaultOperation().execute(new NullProgressMonitor(), null);
-    }
-
-    /**
-     * @param dataModel
-     */
-    public void setServerTargetProperty(IDataModel dataModel) {
-        dataModel.setProperty(IFlexibleJavaProjectCreationDataModelProperties.SERVER_TARGET_ID, AllTomcatTests.TOMCAT_RUNTIME.getId());
-    }
-
-    public static void createServlet(NewServletClassDataModel model) throws Exception {
-        // TODO fix up the create servlet operation
-        /*
-         * AddServletOperation op = new AddServletOperation(model);
-         * op.run(null);
-         * ProjectUtility.verifyProject(model.getTargetProject().getName(),
-         * true); TaskViewUtility.verifyNoErrors();
-         */
-
-    }
-
-    public IDataModel setupStandaloneWebProject(String aProjectName, int j2eeVersion) throws Exception {
-        projectName = aProjectName;
-        createSimpleProject(projectName);
-        IDataModel model = getWebComponentCreationDataModel(projectName, j2eeVersion);
-        createStandaloneWebProject(model);
-        createServlet(projectName);
-        return model;
-    }
-
-    public IDataModel setupStandaloneAnnotatedWebProject(String aProjectName, int j2eeVersion) throws Exception {
-        projectName = aProjectName;
-        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 aProjectName, int j2eeVersion) {
-        projectName = aProjectName;
-        IProject javaProject = ProjectUtility.getProject(aProjectName);
-        String moduleName = aProjectName + "WebModule";
-        String moduleDeployName = moduleName + ".war";
-        IDataModel model = DataModelFactory.createDataModel(new WebComponentCreationDataModelProvider());
-        model.setProperty(IWebComponentCreationDataModelProperties.PROJECT_NAME, javaProject.getName());
-        model.setIntProperty(IWebComponentCreationDataModelProperties.COMPONENT_VERSION, j2eeVersion);
-        model.setProperty(IWebComponentCreationDataModelProperties.COMPONENT_NAME, moduleName);
-        model.setProperty(IWebComponentCreationDataModelProperties.COMPONENT_DEPLOY_NAME, moduleDeployName);
-        return model;
-    }
-
-    /**
-     * @throws Exception
-     */
-    private void createServlet(String projectName) throws Exception {
-        NewServletClassDataModel servletModel = setupServletCreationDataModel(projectName);
-        createServlet(servletModel);
-    }
-
-    /**
-     * @throws Exception
-     */
-    private void createAnnotatedServlet(String projectName) throws Exception {
-        NewServletClassDataModel servletModel = setupAnnotatedServletCreationDataModel(projectName);
-        createServlet(servletModel);
-    }
-
-    public NewServletClassDataModel setupAnnotatedServletCreationDataModel(String projectName) {
-        NewServletClassDataModel servletDataModel = new NewServletClassDataModel();
-        servletDataModel.setProperty(NewServletClassDataModel.PROJECT_NAME, projectName);
-        servletDataModel.setProperty(NewServletClassDataModel.CLASS_NAME, "FooServlet");
-        servletDataModel.setProperty(NewServletClassDataModel.DISPLAY_NAME, "FooServlet");
-        servletDataModel.setBooleanProperty(NewServletClassDataModel.USE_ANNOTATIONS, true);
-        return servletDataModel;
-    }
-
-    public NewServletClassDataModel setupServletCreationDataModel(String projectName) {
-        NewServletClassDataModel servletDataModel = new NewServletClassDataModel();
-        servletDataModel.setProperty(NewServletClassDataModel.PROJECT_NAME, projectName);
-        servletDataModel.setProperty(NewServletClassDataModel.CLASS_NAME, "FooServlet");
-        servletDataModel.setProperty(NewServletClassDataModel.DISPLAY_NAME, "FooServlet");
-        servletDataModel.setBooleanProperty(NewServletClassDataModel.USE_ANNOTATIONS, false);
-        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) {
-        // // TODO Auto-generated catch block
-        // e.printStackTrace();
-        // }
-
-    }
-
-    public void testVaild12WebProjectNameCreation() throws Exception {
-        ProjectUtility.deleteAllProjects();
-        createVaildProjectAndServletCreation("FooTomcatWebProject12", J2EEVersionConstants.WEB_2_2_ID);
-    }
-
-    /*
-     * 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);
-    }
-
-    /*
-     * 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);
-    }
-
-    /*
-     * 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() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-}
diff --git a/tests/org.eclipse.jst.validation.sample/.classpath b/tests/org.eclipse.jst.validation.sample/.classpath
deleted file mode 100644
index 202b238..0000000
--- a/tests/org.eclipse.jst.validation.sample/.classpath
+++ /dev/null
@@ -1,10 +0,0 @@
-<?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.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.validation.sample/.cvsignore b/tests/org.eclipse.jst.validation.sample/.cvsignore
deleted file mode 100644
index 60463af..0000000
--- a/tests/org.eclipse.jst.validation.sample/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-bin
-build.xml
diff --git a/tests/org.eclipse.jst.validation.sample/.project b/tests/org.eclipse.jst.validation.sample/.project
deleted file mode 100644
index aff2b8f..0000000
--- a/tests/org.eclipse.jst.validation.sample/.project
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jst.validation.sample</name>
-	<comment></comment>
-	<projects>
-		<project>com.ibm.etools.validation</project>
-		<project>com.ibm.wtp.common</project>
-	</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/build.properties b/tests/org.eclipse.jst.validation.sample/build.properties
deleted file mode 100644
index 3cf80e0..0000000
--- a/tests/org.eclipse.jst.validation.sample/build.properties
+++ /dev/null
@@ -1,10 +0,0 @@
-source.runtime/propertiesValidator.jar = propertiesValidator/,\
-                                         propertiesValFS/,\
-                                         propertiesValWB/,\
-                                         filesystemFWK/
-bin.includes = runtime/propertiesValidator.jar,\
-               plugin.xml,\
-               filesystem.bat,\
-               prop.bat
-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
deleted file mode 100644
index 2dc85a9..0000000
--- a/tests/org.eclipse.jst.validation.sample/filesystem.bat
+++ /dev/null
@@ -1,46 +0,0 @@
-@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
deleted file mode 100644
index a728349..0000000
--- a/tests/org.eclipse.jst.validation.sample/filesystemFWK/filesystem.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-#
-# 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
deleted file mode 100644
index 4100732..0000000
--- a/tests/org.eclipse.jst.validation.sample/filesystemFWK/org/eclipse/jst/validation/sample/filesystem/FilesystemApplication.java
+++ /dev/null
@@ -1,82 +0,0 @@
-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
deleted file mode 100644
index 9b44fc6..0000000
--- a/tests/org.eclipse.jst.validation.sample/filesystemFWK/org/eclipse/jst/validation/sample/filesystem/FilesystemLoader.java
+++ /dev/null
@@ -1,62 +0,0 @@
-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
deleted file mode 100644
index cad383a..0000000
--- a/tests/org.eclipse.jst.validation.sample/filesystemFWK/org/eclipse/jst/validation/sample/filesystem/FilesystemManager.java
+++ /dev/null
@@ -1,220 +0,0 @@
-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
deleted file mode 100644
index 1959b2a..0000000
--- a/tests/org.eclipse.jst.validation.sample/filesystemFWK/org/eclipse/jst/validation/sample/filesystem/FullReporter.java
+++ /dev/null
@@ -1,92 +0,0 @@
-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
deleted file mode 100644
index 9938513..0000000
--- a/tests/org.eclipse.jst.validation.sample/filesystemFWK/org/eclipse/jst/validation/sample/filesystem/IFilesystemHelper.java
+++ /dev/null
@@ -1,34 +0,0 @@
-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
deleted file mode 100644
index e8e3dba..0000000
--- a/tests/org.eclipse.jst.validation.sample/filesystemFWK/org/eclipse/jst/validation/sample/filesystem/IncrementalReporter.java
+++ /dev/null
@@ -1,168 +0,0 @@
-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
deleted file mode 100644
index 2db1c9e..0000000
--- a/tests/org.eclipse.jst.validation.sample/filesystemFWK/org/eclipse/jst/validation/sample/filesystem/MessageManager.java
+++ /dev/null
@@ -1,254 +0,0 @@
-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
deleted file mode 100644
index f316df0..0000000
--- a/tests/org.eclipse.jst.validation.sample/filesystemFWK/org/eclipse/jst/validation/sample/filesystem/ValidatorMessages.java
+++ /dev/null
@@ -1,171 +0,0 @@
-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.xml b/tests/org.eclipse.jst.validation.sample/plugin.xml
deleted file mode 100644
index 9053178..0000000
--- a/tests/org.eclipse.jst.validation.sample/plugin.xml
+++ /dev/null
@@ -1,79 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin
-   id="org.eclipse.jst.validation.sample"
-   name="Properties Validator"
-   version="0.7.0"
-   class="org.eclipse.jst.validation.sample.workbenchimpl.PropertiesValidatorPlugin">
-
-   <runtime>
-      <library name="runtime/propertiesValidator.jar">
-         <export name="*"/>
-      </library>
-   </runtime>
-   <requires>
-      <import plugin="org.eclipse.core.resources"/>
-      <import plugin="org.eclipse.jdt.core"/>
-      <import plugin="org.eclipse.wst.validation"/>
-      <import plugin="org.eclipse.help"/>
-      <import plugin="org.eclipse.jem.util"/>
-      <import plugin="org.eclipse.wst.common.frameworks"/>
-      <import plugin="org.eclipse.core.runtime"/>
-   </requires>
-
-
-<!--=======================================-->
-<!-- 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/prop.bat b/tests/org.eclipse.jst.validation.sample/prop.bat
deleted file mode 100644
index 80bf940..0000000
--- a/tests/org.eclipse.jst.validation.sample/prop.bat
+++ /dev/null
@@ -1,45 +0,0 @@
-@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
deleted file mode 100644
index 32bbfb3..0000000
--- a/tests/org.eclipse.jst.validation.sample/propertiesValFS/org/eclipse/jst/validation/sample/filesystemimpl/FilesystemPropertiesHelper.java
+++ /dev/null
@@ -1,203 +0,0 @@
-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
deleted file mode 100644
index d140f73..0000000
--- a/tests/org.eclipse.jst.validation.sample/propertiesValWB/org/eclipse/jst/validation/sample/workbenchimpl/PluginPropertyFile.java
+++ /dev/null
@@ -1,232 +0,0 @@
-/*
- * (c) Copyright 2001 MyCorporation.
- * All Rights Reserved.
- */
-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.getDescriptor().getInstallURL()); // always try to resolve URLs used in loaders
-		} catch(IOException e) {
-			newcp[0] = p.getDescriptor().getInstallURL();;
-		}
-		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("::");
-		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
deleted file mode 100644
index 2f97072..0000000
--- a/tests/org.eclipse.jst.validation.sample/propertiesValWB/org/eclipse/jst/validation/sample/workbenchimpl/PropertiesHelper.java
+++ /dev/null
@@ -1,234 +0,0 @@
-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(!res.getFileExtension().equals("properties")) { //$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
deleted file mode 100644
index 5f326d2..0000000
--- a/tests/org.eclipse.jst.validation.sample/propertiesValWB/org/eclipse/jst/validation/sample/workbenchimpl/PropertiesValidatorPlugin.java
+++ /dev/null
@@ -1,51 +0,0 @@
-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 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
deleted file mode 100644
index 5616eed..0000000
--- a/tests/org.eclipse.jst.validation.sample/propertiesValidator/org/eclipse/jst/validation/sample/PModelEnum.java
+++ /dev/null
@@ -1,35 +0,0 @@
-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
deleted file mode 100644
index 2ebfb28..0000000
--- a/tests/org.eclipse.jst.validation.sample/propertiesValidator/org/eclipse/jst/validation/sample/PropertiesValidator.java
+++ /dev/null
@@ -1,107 +0,0 @@
-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
deleted file mode 100644
index d1dd36e..0000000
--- a/tests/org.eclipse.jst.validation.sample/propertiesValidator/org/eclipse/jst/validation/sample/ValidatorPropertyFile.java
+++ /dev/null
@@ -1,115 +0,0 @@
-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
deleted file mode 100644
index 2dc8b9e..0000000
--- a/tests/org.eclipse.jst.validation.sample/propertiesValidator/org/eclipse/jst/validation/sample/parser/APropertyFile.java
+++ /dev/null
@@ -1,728 +0,0 @@
-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
deleted file mode 100644
index f3e87d4..0000000
--- a/tests/org.eclipse.jst.validation.sample/propertiesValidator/org/eclipse/jst/validation/sample/parser/CompareProperties.java
+++ /dev/null
@@ -1,377 +0,0 @@
-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
deleted file mode 100644
index c8ae9e4..0000000
--- a/tests/org.eclipse.jst.validation.sample/propertiesValidator/org/eclipse/jst/validation/sample/parser/IValidationConstants.java
+++ /dev/null
@@ -1,46 +0,0 @@
-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
deleted file mode 100644
index a4d6ee1..0000000
--- a/tests/org.eclipse.jst.validation.sample/propertiesValidator/org/eclipse/jst/validation/sample/parser/Main.java
+++ /dev/null
@@ -1,451 +0,0 @@
-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
deleted file mode 100644
index 907e558..0000000
--- a/tests/org.eclipse.jst.validation.sample/propertiesValidator/org/eclipse/jst/validation/sample/parser/MessageMetaData.java
+++ /dev/null
@@ -1,211 +0,0 @@
-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
deleted file mode 100644
index 8b60b14..0000000
--- a/tests/org.eclipse.jst.validation.sample/propertiesValidator/org/eclipse/jst/validation/sample/parser/PropertyFile.java
+++ /dev/null
@@ -1,106 +0,0 @@
-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
deleted file mode 100644
index aae4429..0000000
--- a/tests/org.eclipse.jst.validation.sample/propertiesValidator/org/eclipse/jst/validation/sample/parser/PropertyLine.java
+++ /dev/null
@@ -1,646 +0,0 @@
-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();
-		}
-		else {
-			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();
-			}
-		}
-		else {
-			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
deleted file mode 100644
index 7daad29..0000000
--- a/tests/org.eclipse.jst.validation.sample/propertiesValidator/org/eclipse/jst/validation/sample/parser/PropertyLineComparator.java
+++ /dev/null
@@ -1,254 +0,0 @@
-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
deleted file mode 100644
index 4dd7b55..0000000
--- a/tests/org.eclipse.jst.validation.sample/propertiesValidator/org/eclipse/jst/validation/sample/parser/ResourceHandler.java
+++ /dev/null
@@ -1,90 +0,0 @@
-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
deleted file mode 100644
index 43a5bde..0000000
--- a/tests/org.eclipse.jst.validation.sample/propertiesValidator/propertiesValidator.properties
+++ /dev/null
@@ -1,41 +0,0 @@
-#
-# 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
deleted file mode 100644
index 90bc982..0000000
--- a/tests/org.eclipse.jst.validation.sample/test/test.properties
+++ /dev/null
@@ -1,67 +0,0 @@
-#
-# 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
deleted file mode 100644
index fdc0f32..0000000
--- a/tests/org.eclipse.jst.validation.sample/test/test2.properties
+++ /dev/null
@@ -1,24 +0,0 @@
-#
-# 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
deleted file mode 100644
index a5250a3..0000000
--- a/tests/org.eclipse.jst.validation.sample/tvtplugin.xml
+++ /dev/null
@@ -1,52 +0,0 @@
-<?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>
